OSDN Git Service

Fix bugs of automatic detection for Kanji code of filenames.
[ffftp/ffftp.git] / getput.c
index 48f0d63..0fce875 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -43,7 +43,7 @@
 #include <time.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
-#include <winsock2.h>\r
+#include <ws2tcpip.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <process.h>\r
@@ -104,7 +104,11 @@ static int SetUploadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *M
 static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);\r
 static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt);\r
 static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int Info);\r
-static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max);\r
+// IPv6対応\r
+//static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max);\r
+static int GetAdrsAndPort(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max);\r
+static int GetAdrsAndPortIPv4(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max);\r
+static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max);\r
 static int IsSpecialDevice(char *Fname);\r
 static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt);\r
 static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
@@ -1316,7 +1320,10 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
        SOCKET listen_socket = INVALID_SOCKET; // data listen socket\r
        char Buf[1024];\r
        int CreateMode;\r
-       struct sockaddr_in saSockAddr1;\r
+       // IPv6対応\r
+//     struct sockaddr_in saSockAddr1;\r
+       struct sockaddr_in saSockAddrIPv4;\r
+       struct sockaddr_in6 saSockAddrIPv6;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
        if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, CancelCheckWork)) != INVALID_SOCKET)\r
@@ -1331,8 +1338,20 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
 //                             if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL)\r
                                if(SocksGet2ndBindReply(listen_socket, &data_socket, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
-                                       iLength = sizeof(saSockAddr1);\r
-                                       data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength);\r
+                                       // IPv6対応\r
+//                                     iLength = sizeof(saSockAddr1);\r
+//                                     data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength);\r
+                                       switch(AskInetFamily())\r
+                                       {\r
+                                       case AF_INET:\r
+                                               iLength=sizeof(saSockAddrIPv4);\r
+                                               data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv4, (int *)&iLength);\r
+                                               break;\r
+                                       case AF_INET6:\r
+                                               iLength=sizeof(saSockAddrIPv6);\r
+                                               data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv6, (int *)&iLength);\r
+                                               break;\r
+                                       }\r
 \r
                                        if(shutdown(listen_socket, 1) != 0)\r
                                                ReportWSError("shutdown listen", WSAGetLastError());\r
@@ -1345,7 +1364,19 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
                                                iRetCode = 500;\r
                                        }\r
                                        else\r
-                                               DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port));\r
+                                               // IPv6対応\r
+//                                             DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port));\r
+                                       {\r
+                                               switch(AskInetFamily())\r
+                                               {\r
+                                               case AF_INET:\r
+                                                       DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddrIPv4.sin_addr), ntohs(saSockAddrIPv4.sin_port));\r
+                                                       break;\r
+                                               case AF_INET6:\r
+                                                       DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet6_ntoa(saSockAddrIPv6.sin6_addr), ntohs(saSockAddrIPv6.sin6_port));\r
+                                                       break;\r
+                                               }\r
+                                       }\r
                                }\r
 \r
                                if(data_socket != INVALID_SOCKET)\r
@@ -1403,15 +1434,29 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork)
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
        char Buf[1024];\r
        int CreateMode;\r
-       char Adrs[20];\r
+       // IPv6対応\r
+//     char Adrs[20];\r
+       char Adrs[40];\r
        int Port;\r
        int Flg;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
-       iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV");\r
+       // IPv6対応\r
+//     iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV");\r
+       switch(AskInetFamily())\r
+       {\r
+       case AF_INET:\r
+               iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV");\r
+               break;\r
+       case AF_INET6:\r
+               iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "EPSV");\r
+               break;\r
+       }\r
        if(iRetCode/100 == FTP_COMPLETE)\r
        {\r
-               if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS)\r
+               // IPv6対応\r
+//             if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS)\r
+               if(GetAdrsAndPort(Pkt->ctrl_skt, Buf, Adrs, &Port, 39) == FFFTP_SUCCESS)\r
                {\r
                        if((data_socket = connectsock(Adrs, Port, MSGJPN091, CancelCheckWork)) != INVALID_SOCKET)\r
                        {\r
@@ -2475,7 +2520,10 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
        SOCKET listen_socket = INVALID_SOCKET; // data listen socket\r
        char Buf[1024];\r
-       struct sockaddr_in saSockAddr1;\r
+       // IPv6対応\r
+//     struct sockaddr_in saSockAddr1;\r
+       struct sockaddr_in saSockAddrIPv4;\r
+       struct sockaddr_in6 saSockAddrIPv6;\r
        int Resume;\r
        char Reply[ERR_MSG_LEN+7];\r
 \r
@@ -2498,8 +2546,20 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
 //                     if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL)\r
                        if(SocksGet2ndBindReply(listen_socket, &data_socket, &Canceled[Pkt->ThreadCount]) == FFFTP_FAIL)\r
                        {\r
-                               iLength=sizeof(saSockAddr1);\r
-                               data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength);\r
+                               // IPv6対応\r
+//                             iLength=sizeof(saSockAddr1);\r
+//                             data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength);\r
+                               switch(AskInetFamily())\r
+                               {\r
+                               case AF_INET:\r
+                                       iLength=sizeof(saSockAddrIPv4);\r
+                                       data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv4, (int *)&iLength);\r
+                                       break;\r
+                               case AF_INET6:\r
+                                       iLength=sizeof(saSockAddrIPv6);\r
+                                       data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv6, (int *)&iLength);\r
+                                       break;\r
+                               }\r
 \r
                                if(shutdown(listen_socket, 1) != 0)\r
                                        ReportWSError("shutdown listen", WSAGetLastError());\r
@@ -2512,7 +2572,19 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt)
                                        iRetCode = 500;\r
                                }\r
                                else\r
-                                       DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port));\r
+                                       // IPv6対応\r
+//                                     DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port));\r
+                               {\r
+                                       switch(AskInetFamily())\r
+                                       {\r
+                                       case AF_INET:\r
+                                               DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddrIPv4.sin_addr), ntohs(saSockAddrIPv4.sin_port));\r
+                                               break;\r
+                                       case AF_INET6:\r
+                                               DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet6_ntoa(saSockAddrIPv6.sin6_addr), ntohs(saSockAddrIPv6.sin6_port));\r
+                                               break;\r
+                                       }\r
+                               }\r
                        }\r
 \r
                        if(data_socket != INVALID_SOCKET)\r
@@ -2566,7 +2638,9 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
        int iRetCode;\r
        SOCKET data_socket = INVALID_SOCKET;   // data channel socket\r
        char Buf[1024];\r
-       char Adrs[20];\r
+       // IPv6対応\r
+//     char Adrs[20];\r
+       char Adrs[40];\r
        int Port;\r
        int Flg;\r
        int Resume;\r
@@ -2574,10 +2648,22 @@ static int UpLoadPassive(TRANSPACKET *Pkt)
 \r
        // 同時接続対応\r
 //     iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV");\r
-       iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV");\r
+       // IPv6対応\r
+//     iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV");\r
+       switch(AskInetFamily())\r
+       {\r
+       case AF_INET:\r
+               iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV");\r
+               break;\r
+       case AF_INET6:\r
+               iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "EPSV");\r
+               break;\r
+       }\r
        if(iRetCode/100 == FTP_COMPLETE)\r
        {\r
-               if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS)\r
+               // IPv6対応\r
+//             if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS)\r
+               if(GetAdrsAndPort(Pkt->ctrl_skt, Buf, Adrs, &Port, 39) == FFFTP_SUCCESS)\r
                {\r
                        // 同時接続対応\r
 //                     if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET)\r
@@ -3675,7 +3761,26 @@ static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int
 *                      FFFTP_SUCCESS/FFFTP_FAIL\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max)\r
+static int GetAdrsAndPort(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max)\r
+{\r
+       int Result;\r
+       Result = FFFTP_FAIL;\r
+       switch(AskInetFamily())\r
+       {\r
+       case AF_INET:\r
+               Result = GetAdrsAndPortIPv4(Skt, Str, Adrs, Port, Max);\r
+               break;\r
+       case AF_INET6:\r
+               Result = GetAdrsAndPortIPv6(Skt, Str, Adrs, Port, Max);\r
+               break;\r
+       }\r
+       return Result;\r
+}\r
+\r
+\r
+// IPv6対応\r
+//static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max)\r
+static int GetAdrsAndPortIPv4(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max)\r
 {\r
        char *Pos;\r
        char *Btm;\r
@@ -3742,49 +3847,55 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max)
 \r
 \r
 // IPv6対応\r
-static int GetAdrsAndPortIPv6(char *Str, char *Adrs, int *Port, int Max, short *Family)\r
+static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max)\r
 {\r
        char *Pos;\r
        char *Btm;\r
        int Sts;\r
+       int i;\r
+       struct sockaddr_in6 SockAddr;\r
 \r
        Sts = FFFTP_FAIL;\r
 \r
-       Pos = strchr(Str, '|');\r
-       if(Pos != NULL)\r
+       Btm = strchr(Str, '(');\r
+       if(Btm != NULL)\r
        {\r
-               Pos++;\r
-               Btm = strchr(Pos, '|');\r
+               Btm++;\r
+               Btm = strchr(Btm, '|');\r
                if(Btm != NULL)\r
                {\r
-                       switch(atoi(Pos))\r
-                       {\r
-                       case 1:\r
-                               *Family = AF_INET;\r
-                               break;\r
-                       case 2:\r
-                               *Family = AF_INET6;\r
-                               break;\r
-                       }\r
                        Pos = Btm + 1;\r
                        Btm = strchr(Pos, '|');\r
                        if(Btm != NULL)\r
                        {\r
-                               if((Btm - Pos) <= Max)\r
+                               Pos = Btm + 1;\r
+                               Btm = strchr(Pos, '|');\r
+                               if(Btm != NULL)\r
                                {\r
-                                       if((Btm - Pos) > 0)\r
+                                       if((Btm - Pos) <= Max)\r
                                        {\r
-                                               strncpy(Adrs, Pos, Btm - Pos);\r
-                                               *(Adrs + (Btm - Pos)) = NUL;\r
-                                       }\r
+                                               if((Btm - Pos) > 0)\r
+                                               {\r
+                                                       strncpy(Adrs, Pos, Btm - Pos);\r
+                                                       *(Adrs + (Btm - Pos)) = NUL;\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       i = sizeof(SockAddr);\r
+                                                       if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)\r
+                                                               AddressToStringIPv6(Adrs, &SockAddr.sin6_addr);\r
+                                               }\r
 \r
-                                       Pos = Btm + 1;\r
-                                       Btm = strchr(Pos, '|');\r
-                                       if(Btm != NULL)\r
-                                       {\r
-                                               Btm++;\r
-                                               *Port = atoi(Pos);\r
-                                               Sts = FFFTP_SUCCESS;\r
+                                               Pos = Btm + 1;\r
+                                               Btm = strchr(Pos, '|');\r
+                                               if(Btm != NULL)\r
+                                               {\r
+                                                       Btm++;\r
+                                                       *Port = atoi(Pos);\r
+                                                       Btm = strchr(Btm, ')');\r
+                                                       if(Btm != NULL)\r
+                                                               Sts = FFFTP_SUCCESS;\r
+                                               }\r
                                        }\r
                                }\r
                        }\r