OSDN Git Service

Fix bugs of socket connection.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 19 Feb 2012 15:59:37 +0000 (00:59 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sun, 19 Feb 2012 15:59:37 +0000 (00:59 +0900)
Fix bugs of processing replies of EPRT command.

FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
common.h
connect.c
getput.c
main.c
socket.c
socketwrapper.c
socketwrapper.h

index 0a3cf50..6d9534c 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 076e83e..27a3733 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index 7f55fa0..853472d 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1827,6 +1827,11 @@ char *AskLocalFreeSpace(char *Path);
 \r
 int MakeSocketWin(HWND hWnd, HINSTANCE hInst);\r
 void DeleteSocketWin(void);\r
+// ソケットにデータを付与\r
+int SetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks);\r
+int SetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks);\r
+int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks);\r
+int GetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks);\r
 // IPv6対応\r
 //struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork);\r
 struct hostent *do_gethostbynameIPv4(const char *Name, char *Buf, int Len, int *CancelCheckWork);\r
index 8742594..3914924 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -116,11 +116,6 @@ static HOSTDATA CurHost;
 // IPv6対応\r
 //static struct sockaddr_in SocksSockAddr;     /* SOCKSサーバのアドレス情報 */\r
 //static struct sockaddr_in CurSockAddr;               /* 接続先ホストのアドレス情報 */\r
-static struct sockaddr_in SocksSockAddrIPv4;   /* SOCKSサーバのアドレス情報 */\r
-static struct sockaddr_in CurSockAddrIPv4;             /* 接続先ホストのアドレス情報 */\r
-static struct sockaddr_in6 SocksSockAddrIPv6;  /* SOCKSサーバのアドレス情報 */\r
-static struct sockaddr_in6 CurSockAddrIPv6;            /* 接続先ホストのアドレス情報 */\r
-static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};\r
 \r
 static int UseIPadrs;\r
 static char DomainName[HOST_ADRS_LEN+1];\r
@@ -2119,6 +2114,9 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
 //SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
 SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
 {\r
+       // IPv6対応\r
+       struct sockaddr_in SocksSockAddr;       /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in CurSockAddr;         /* 接続先ホストのアドレス情報 */\r
        struct sockaddr_in saSockAddr;\r
        char HostEntry[MAXGETHOSTSTRUCT];\r
        struct hostent *pHostEntry;\r
@@ -2142,15 +2140,10 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        UseIPadrs = YES;\r
        strcpy(DomainName, host);\r
-       // IPv6対応\r
-//     memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
-//     CurSockAddr.sin_port = htons((u_short)port);\r
-//     CurSockAddr.sin_family = AF_INET;\r
-//     if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
-       memset(&CurSockAddrIPv4, 0, sizeof(CurSockAddrIPv4));\r
-       CurSockAddrIPv4.sin_port = htons((u_short)port);\r
-       CurSockAddrIPv4.sin_family = AF_INET;\r
-       if((CurSockAddrIPv4.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
+       memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
+       CurSockAddr.sin_port = htons((u_short)port);\r
+       CurSockAddr.sin_family = AF_INET;\r
+       if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)\r
        {\r
                // ホスト名が指定された\r
                // ホスト名からアドレスを求める\r
@@ -2173,13 +2166,10 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
                if(pHostEntry != NULL)\r
                {\r
+                       memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        // IPv6対応\r
-//                     memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
 //                     SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
-                       memcpy((char *)&CurSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
-                       // IPv6対応\r
-//                     SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port));\r
-                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);\r
+                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);\r
                }\r
                else\r
                {\r
@@ -2188,7 +2178,7 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
                                UseIPadrs = NO;\r
                                // IPv6対応\r
 //                             SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port));\r
-                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);\r
+                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port), MSGJPN333);\r
                        }\r
                        else\r
                        {\r
@@ -2202,7 +2192,7 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
        else\r
                // IPv6対応\r
 //             SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));\r
-               SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);\r
+               SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);\r
 \r
        if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
        {\r
@@ -2212,32 +2202,23 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
                {\r
                        Socks4Cmd.Ver = SOCKS4_VER;\r
                        Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT;\r
-                       // IPv6対応\r
-//                     Socks4Cmd.Port = CurSockAddr.sin_port;\r
-//                     Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
-                       Socks4Cmd.Port = CurSockAddrIPv4.sin_port;\r
-                       Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr;\r
+                       Socks4Cmd.Port = CurSockAddr.sin_port;\r
+                       Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
                        strcpy(Socks4Cmd.UserID, FwallUser);\r
                        Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;\r
                }\r
                else\r
                {\r
-                       // IPv6対応\r
-//                     Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
-                       Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port);\r
+                       Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
                }\r
 \r
-               // IPv6対応\r
-//             memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
-//             if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
-               memset(&SocksSockAddrIPv4, 0, sizeof(SocksSockAddrIPv4));\r
-               if((SocksSockAddrIPv4.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
+               memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
+               if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)\r
                {\r
                        // IPv6対応\r
 //                     if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
-//                             memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        if((pHostEntry = do_gethostbynameIPv4(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
-                               memcpy((char *)&SocksSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+                               memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        else\r
                        {\r
                                // IPv6対応\r
@@ -2246,26 +2227,18 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
                                return INVALID_SOCKET;\r
                        }\r
                }\r
+               SocksSockAddr.sin_port = htons((u_short)FwallPort);\r
+               SocksSockAddr.sin_family = AF_INET;\r
                // IPv6対応\r
-//             SocksSockAddr.sin_port = htons((u_short)FwallPort);\r
-//             SocksSockAddr.sin_family = AF_INET;\r
 //             SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port));\r
-               SocksSockAddrIPv4.sin_port = htons((u_short)FwallPort);\r
-               SocksSockAddrIPv4.sin_family = AF_INET;\r
-               // IPv6対応\r
-//             SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port));\r
-               SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port), MSGJPN333);\r
+               SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port), MSGJPN333);\r
                // connectで接続する先はSOCKSサーバ\r
-               // IPv6対応\r
-//             memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
-               memcpy(&saSockAddr, &SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4));\r
+               memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
        }\r
        else\r
        {\r
                // connectで接続するのは接続先のホスト\r
-               // IPv6対応\r
-//             memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
-               memcpy(&saSockAddr, &CurSockAddrIPv4, sizeof(CurSockAddrIPv4));\r
+               memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
        }\r
 \r
        /////////////\r
@@ -2274,6 +2247,8 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
        {\r
+               // ソケットにデータを付与\r
+               SetAsyncTableDataIPv4(sSocket, &CurSockAddr, &SocksSockAddr);\r
                if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                {\r
                        if(Fwall == FWALL_SOCKS4)\r
@@ -2346,6 +2321,8 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
 SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)\r
 {\r
+       struct sockaddr_in6 SocksSockAddr;      /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in6 CurSockAddr;                /* 接続先ホストのアドレス情報 */\r
        struct sockaddr_in6 saSockAddr;\r
        char HostEntry[MAXGETHOSTSTRUCT];\r
        struct hostent *pHostEntry;\r
@@ -2367,11 +2344,11 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
        UseIPadrs = YES;\r
        strcpy(DomainName, host);\r
-       memset(&CurSockAddrIPv6, 0, sizeof(CurSockAddrIPv6));\r
-       CurSockAddrIPv6.sin6_port = htons((u_short)port);\r
-       CurSockAddrIPv6.sin6_family = AF_INET6;\r
-       CurSockAddrIPv6.sin6_addr = inet6_addr(host);\r
-       if(memcmp(&CurSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+       memset(&CurSockAddr, 0, sizeof(CurSockAddr));\r
+       CurSockAddr.sin6_port = htons((u_short)port);\r
+       CurSockAddr.sin6_family = AF_INET6;\r
+       CurSockAddr.sin6_addr = inet6_addr(host);\r
+       if(memcmp(&CurSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
        {\r
                // ホスト名が指定された\r
                // ホスト名からアドレスを求める\r
@@ -2390,15 +2367,15 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
 \r
                if(pHostEntry != NULL)\r
                {\r
-                       memcpy((char *)&CurSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
-                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);\r
+                       memcpy((char *)&CurSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+                       SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
                }\r
                else\r
                {\r
                        if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
                        {\r
                                UseIPadrs = NO;\r
-                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);\r
+                               SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
                        }\r
                        else\r
                        {\r
@@ -2408,47 +2385,48 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
                }\r
        }\r
        else\r
-               SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);\r
+               SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);\r
 \r
        if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
        {\r
                // SOCKSを使う\r
                // SOCKSに接続する準備\r
                {\r
-                       Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port);\r
+                       Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
                }\r
 \r
-               memset(&SocksSockAddrIPv6, 0, sizeof(SocksSockAddrIPv6));\r
-               SocksSockAddrIPv6.sin6_addr = inet6_addr(FwallHost);\r
-               if(memcmp(&SocksSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
+               memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));\r
+               SocksSockAddr.sin6_addr = inet6_addr(FwallHost);\r
+               if(memcmp(&SocksSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)\r
                {\r
                        if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)\r
-                               memcpy((char *)&SocksSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
+                               memcpy((char *)&SocksSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);\r
                        else\r
                        {\r
                                SetTaskMsg(MSGJPN021, FwallHost, MSGJPN334);\r
                                return INVALID_SOCKET;\r
                        }\r
                }\r
-               SocksSockAddrIPv6.sin6_port = htons((u_short)FwallPort);\r
-               SocksSockAddrIPv6.sin6_family = AF_INET6;\r
-               SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddrIPv6.sin6_addr), ntohs(SocksSockAddrIPv6.sin6_port), MSGJPN334);\r
+               SocksSockAddr.sin6_port = htons((u_short)FwallPort);\r
+               SocksSockAddr.sin6_family = AF_INET6;\r
+               SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddr.sin6_addr), ntohs(SocksSockAddr.sin6_port), MSGJPN334);\r
                // connectで接続する先はSOCKSサーバ\r
-               memcpy(&saSockAddr, &SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6));\r
+               memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));\r
        }\r
        else\r
        {\r
                // connectで接続するのは接続先のホスト\r
-               memcpy(&saSockAddr, &CurSockAddrIPv6, sizeof(CurSockAddrIPv6));\r
+               memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));\r
        }\r
 \r
        /////////////\r
        // 接続実行\r
        /////////////\r
 \r
-       inet6_ntoa(saSockAddr.sin6_addr);\r
        if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)\r
        {\r
+               // ソケットにデータを付与\r
+               SetAsyncTableDataIPv6(sSocket, &CurSockAddr, &SocksSockAddr);\r
                if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                {\r
                        if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))\r
@@ -2524,6 +2502,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
 //SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)\r
 SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)\r
 {\r
+       // IPv6対応\r
+       struct sockaddr_in SocksSockAddr;       /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in CurSockAddr;         /* 接続先ホストのアドレス情報 */\r
     SOCKET listen_skt;\r
     int iLength;\r
     char *a,*p;\r
@@ -2537,6 +2518,9 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
        int Len;\r
        int Fwall;\r
 \r
+       // ソケットにデータを付与\r
+       GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
+\r
        Fwall = FWALL_NONE;\r
        if(AskHostFireWall() == YES)\r
                Fwall = FwallType;\r
@@ -2547,17 +2531,12 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                {\r
                        /*===== SOCKS4を使う =====*/\r
                        DoPrintf("Use SOCKS4 BIND");\r
-                       // IPv6対応\r
-//                     if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
-                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR)\r
+                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
                                Socks4Cmd.Ver = SOCKS4_VER;\r
                                Socks4Cmd.Cmd = SOCKS4_CMD_BIND;\r
-                               // IPv6対応\r
-//                             Socks4Cmd.Port = CurSockAddr.sin_port;\r
-//                             Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
-                               Socks4Cmd.Port = CurSockAddrIPv4.sin_port;\r
-                               Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr;\r
+                               Socks4Cmd.Port = CurSockAddr.sin_port;\r
+                               Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;\r
                                strcpy(Socks4Cmd.UserID, FwallUser);\r
                                Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;\r
 \r
@@ -2578,9 +2557,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                                }\r
 \r
                                if(Socks4Reply.AdrsInt == 0)\r
-                                       // IPv6対応\r
-//                                     Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
-                                       Socks4Reply.AdrsInt = SocksSockAddrIPv4.sin_addr.s_addr;\r
+                                       Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;\r
 \r
                                a = (char *)&Socks4Reply.AdrsInt;\r
                                p = (char *)&Socks4Reply.Port;\r
@@ -2590,9 +2567,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                {\r
                        /*===== SOCKS5を使う =====*/\r
                        DoPrintf("Use SOCKS5 BIND");\r
-                       // IPv6対応\r
-//                     if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
-                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR)\r
+                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
                                if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
@@ -2601,9 +2576,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
                                        return(listen_skt);\r
                                }\r
 \r
-                               // IPv6対応\r
-//                             Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
-                               Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port);\r
+                               Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);\r
 \r
                                Socks5Reply.Result = -1;\r
                                // 同時接続対応\r
@@ -2711,6 +2684,8 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
 \r
 SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)\r
 {\r
+       struct sockaddr_in6 SocksSockAddr;      /* SOCKSサーバのアドレス情報 */\r
+       struct sockaddr_in6 CurSockAddr;                /* 接続先ホストのアドレス情報 */\r
     SOCKET listen_skt;\r
     int iLength;\r
     char *a,*p;\r
@@ -2724,6 +2699,9 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
 \r
        char Adrs[40];\r
 \r
+       // ソケットにデータを付与\r
+       GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);\r
+\r
        Fwall = FWALL_NONE;\r
        if(AskHostFireWall() == YES)\r
                Fwall = FwallType;\r
@@ -2734,7 +2712,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                {\r
                        /*===== SOCKS5を使う =====*/\r
                        DoPrintf("Use SOCKS5 BIND");\r
-                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6), CancelCheckWork) != SOCKET_ERROR)\r
+                       if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)\r
                        {\r
                                if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)\r
                                {\r
@@ -2743,7 +2721,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
                                        return(listen_skt);\r
                                }\r
 \r
-                               Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port);\r
+                               Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);\r
 \r
                                Socks5Reply.Result = -1;\r
                                // 同時接続対応\r
index ea83dde..a045511 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -4051,7 +4051,7 @@ static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int
        char *Pos;\r
        char *Btm;\r
        int Sts;\r
-       int i;\r
+//     int i;\r
        struct sockaddr_in6 SockAddr;\r
 \r
        Sts = FFFTP_FAIL;\r
@@ -4080,8 +4080,9 @@ static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int
                                                }\r
                                                else\r
                                                {\r
-                                                       i = sizeof(SockAddr);\r
-                                                       if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)\r
+//                                                     i = sizeof(SockAddr);\r
+//                                                     if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)\r
+                                                       if(GetAsyncTableDataIPv6(Skt, &SockAddr, NULL) == YES)\r
                                                                AddressToStringIPv6(Adrs, &SockAddr.sin6_addr);\r
                                                }\r
 \r
diff --git a/main.c b/main.c
index b890086..89c8089 100644 (file)
--- a/main.c
+++ b/main.c
@@ -234,7 +234,7 @@ BYTE SSLRootCAFileHash[20];
 // ファイルアイコン表示対応\r
 int DispFileIcon = NO;\r
 // ディレクトリ自動作成\r
-int MakeAllDir = NO;\r
+int MakeAllDir = YES;\r
 \r
 \r
 \r
index ec99f84..1da9215 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -66,6 +66,11 @@ typedef struct {
        int FdRead;\r
        int FdWrite;\r
        int Error;\r
+       // ソケットにデータを付与\r
+       struct sockaddr_in HostAddrIPv4;\r
+       struct sockaddr_in SocksAddrIPv4;\r
+       struct sockaddr_in6 HostAddrIPv6;\r
+       struct sockaddr_in6 SocksAddrIPv6;\r
 } ASYNCSIGNAL;\r
 \r
 \r
@@ -489,6 +494,11 @@ static int RegisterAsyncTable(SOCKET s)
                                Signal[Pos].FdAccept = 0;\r
                                Signal[Pos].FdRead = 0;\r
                                Signal[Pos].FdWrite = 0;\r
+                               // ソケットにデータを付与\r
+                               memset(&Signal[Pos].HostAddrIPv4, 0, sizeof(struct sockaddr_in));\r
+                               memset(&Signal[Pos].SocksAddrIPv4, 0, sizeof(struct sockaddr_in));\r
+                               memset(&Signal[Pos].HostAddrIPv6, 0, sizeof(struct sockaddr_in6));\r
+                               memset(&Signal[Pos].SocksAddrIPv6, 0, sizeof(struct sockaddr_in6));\r
                                Sts = YES;\r
                                break;\r
                        }\r
@@ -639,6 +649,104 @@ static int UnregisterAsyncTableDbase(HANDLE Async)
 }\r
 \r
 \r
+// ソケットにデータを付与\r
+\r
+int SetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks)\r
+{\r
+       int Sts;\r
+       int Pos;\r
+\r
+       WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+       Sts = NO;\r
+       for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+       {\r
+               if(Signal[Pos].Socket == s)\r
+               {\r
+                       if(Host != NULL)\r
+                               memcpy(&Signal[Pos].HostAddrIPv4, Host, sizeof(struct sockaddr_in));\r
+                       if(Socks != NULL)\r
+                               memcpy(&Signal[Pos].SocksAddrIPv4, Socks, sizeof(struct sockaddr_in));\r
+                       Sts = YES;\r
+                       break;\r
+               }\r
+       }\r
+       ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+       return(Sts);\r
+}\r
+\r
+int SetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks)\r
+{\r
+       int Sts;\r
+       int Pos;\r
+\r
+       WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+       Sts = NO;\r
+       for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+       {\r
+               if(Signal[Pos].Socket == s)\r
+               {\r
+                       if(Host != NULL)\r
+                               memcpy(&Signal[Pos].HostAddrIPv6, Host, sizeof(struct sockaddr_in6));\r
+                       if(Socks != NULL)\r
+                               memcpy(&Signal[Pos].SocksAddrIPv6, Socks, sizeof(struct sockaddr_in6));\r
+                       Sts = YES;\r
+                       break;\r
+               }\r
+       }\r
+       ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+       return(Sts);\r
+}\r
+\r
+int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks)\r
+{\r
+       int Sts;\r
+       int Pos;\r
+\r
+       WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+       Sts = NO;\r
+       for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+       {\r
+               if(Signal[Pos].Socket == s)\r
+               {\r
+                       if(Host != NULL)\r
+                               memcpy(Host, &Signal[Pos].HostAddrIPv4, sizeof(struct sockaddr_in));\r
+                       if(Socks != NULL)\r
+                               memcpy(Socks, &Signal[Pos].SocksAddrIPv4, sizeof(struct sockaddr_in));\r
+                       Sts = YES;\r
+                       break;\r
+               }\r
+       }\r
+       ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+       return(Sts);\r
+}\r
+\r
+int GetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks)\r
+{\r
+       int Sts;\r
+       int Pos;\r
+\r
+       WaitForSingleObject(hAsyncTblAccMutex, INFINITE);\r
+       Sts = NO;\r
+       for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)\r
+       {\r
+               if(Signal[Pos].Socket == s)\r
+               {\r
+                       if(Host != NULL)\r
+                               memcpy(Host, &Signal[Pos].HostAddrIPv6, sizeof(struct sockaddr_in6));\r
+                       if(Socks != NULL)\r
+                               memcpy(Socks, &Signal[Pos].SocksAddrIPv6, sizeof(struct sockaddr_in6));\r
+                       Sts = YES;\r
+                       break;\r
+               }\r
+       }\r
+       ReleaseMutex(hAsyncTblAccMutex);\r
+\r
+       return(Sts);\r
+}\r
+\r
 \r
 \r
 \r
@@ -720,7 +828,7 @@ struct hostent *do_gethostbynameIPv6(const char *Name, char *Buf, int Len, int *
 \r
                if(*CancelCheckWork == YES)\r
                {\r
-                       WSACancelAsyncRequest(hAsync);\r
+                       WSACancelAsyncRequestIPv6(hAsync);\r
                }\r
                else if(Error == 0)\r
                {\r
index 79fbee4..caae589 100644 (file)
@@ -641,6 +641,8 @@ int FTPS_recv(SOCKET s, char * buf, int len, int flags)
 \r
 // IPv6対応\r
 \r
+const struct in6_addr IN6ADDR_NONE = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};\r
+\r
 typedef struct\r
 {\r
        HANDLE h;\r
@@ -682,7 +684,7 @@ DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)
                                                pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);\r
                                                pHost->h_addr_list[1] = NULL;\r
                                                memcpy(pHost->h_addr_list[0], &((struct sockaddr_in*)p->ai_addr)->sin_addr, sizeof(struct in_addr));\r
-                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));\r
+                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in_addr)));\r
                                        }\r
                                        else\r
                                                PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));\r
@@ -700,7 +702,7 @@ DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)
                                                pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);\r
                                                pHost->h_addr_list[1] = NULL;\r
                                                memcpy(pHost->h_addr_list[0], &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(struct in6_addr));\r
-                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));\r
+                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in6_addr)));\r
                                        }\r
                                        else\r
                                                PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));\r
@@ -768,7 +770,10 @@ int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle)
        int Result;\r
        Result = SOCKET_ERROR;\r
        if(TerminateThread(hAsyncTaskHandle, 0))\r
+       {\r
+               CloseHandle(hAsyncTaskHandle);\r
                Result = 0;\r
+       }\r
        return Result;\r
 }\r
 \r
@@ -844,7 +849,7 @@ struct in6_addr inet6_addr(const char* cp)
        {\r
                if(!cp)\r
                {\r
-                       memset(&Result, 0xff, sizeof(Result));\r
+                       memcpy(&Result, &IN6ADDR_NONE, sizeof(struct in6_addr));\r
                        break;\r
                }\r
                if(i >= AfterZero)\r
@@ -868,7 +873,7 @@ struct in6_addr inet6_addr(const char* cp)
                                Result.u.Word[i] = ((Result.u.Word[i] & 0xff00) >> 8) | ((Result.u.Word[i] & 0x00ff) << 8);\r
                                if(strncmp(p, ":", 1) != 0 && strlen(p) > 0)\r
                                {\r
-                                       memset(&Result, 0xff, sizeof(Result));\r
+                                       memcpy(&Result, &IN6ADDR_NONE, sizeof(struct in6_addr));\r
                                        break;\r
                                }\r
                                if(cp = strstr(cp, ":"))\r
index 98b0fbb..2b3ba63 100644 (file)
@@ -40,6 +40,8 @@ struct in6_addr inet6_addr(const char* cp);
 HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen);\r
 HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family);\r
 \r
+extern const struct in6_addr IN6ADDR_NONE;\r
+\r
 BOOL LoadPuTTY();\r
 void FreePuTTY();\r
 BOOL IsPuTTYLoaded();\r