• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

FFFTPのソースコードです。


Commit MetaInfo

Revision29207baed700471a3d39f1b97713a2a110937a0b (tree)
Zeit2012-02-20 00:59:37
Autors_kawamoto <s_kawamoto@user...>
Commiters_kawamoto

Log Message

Fix bugs of socket connection.
Fix bugs of processing replies of EPRT command.

Ändern Zusammenfassung

Diff

Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
--- a/common.h
+++ b/common.h
@@ -1827,6 +1827,11 @@ char *AskLocalFreeSpace(char *Path);
18271827
18281828 int MakeSocketWin(HWND hWnd, HINSTANCE hInst);
18291829 void DeleteSocketWin(void);
1830+// ソケットにデータを付与
1831+int SetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks);
1832+int SetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks);
1833+int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks);
1834+int GetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks);
18301835 // IPv6対応
18311836 //struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork);
18321837 struct hostent *do_gethostbynameIPv4(const char *Name, char *Buf, int Len, int *CancelCheckWork);
--- a/connect.c
+++ b/connect.c
@@ -116,11 +116,6 @@ static HOSTDATA CurHost;
116116 // IPv6対応
117117 //static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */
118118 //static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */
119-static struct sockaddr_in SocksSockAddrIPv4; /* SOCKSサーバのアドレス情報 */
120-static struct sockaddr_in CurSockAddrIPv4; /* 接続先ホストのアドレス情報 */
121-static struct sockaddr_in6 SocksSockAddrIPv6; /* SOCKSサーバのアドレス情報 */
122-static struct sockaddr_in6 CurSockAddrIPv6; /* 接続先ホストのアドレス情報 */
123-static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
124119
125120 static int UseIPadrs;
126121 static char DomainName[HOST_ADRS_LEN+1];
@@ -2119,6 +2114,9 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
21192114 //SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork)
21202115 SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
21212116 {
2117+ // IPv6対応
2118+ struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */
2119+ struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */
21222120 struct sockaddr_in saSockAddr;
21232121 char HostEntry[MAXGETHOSTSTRUCT];
21242122 struct hostent *pHostEntry;
@@ -2142,15 +2140,10 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
21422140
21432141 UseIPadrs = YES;
21442142 strcpy(DomainName, host);
2145- // IPv6対応
2146-// memset(&CurSockAddr, 0, sizeof(CurSockAddr));
2147-// CurSockAddr.sin_port = htons((u_short)port);
2148-// CurSockAddr.sin_family = AF_INET;
2149-// if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
2150- memset(&CurSockAddrIPv4, 0, sizeof(CurSockAddrIPv4));
2151- CurSockAddrIPv4.sin_port = htons((u_short)port);
2152- CurSockAddrIPv4.sin_family = AF_INET;
2153- if((CurSockAddrIPv4.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
2143+ memset(&CurSockAddr, 0, sizeof(CurSockAddr));
2144+ CurSockAddr.sin_port = htons((u_short)port);
2145+ CurSockAddr.sin_family = AF_INET;
2146+ if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
21542147 {
21552148 // ホスト名が指定された
21562149 // ホスト名からアドレスを求める
@@ -2173,13 +2166,10 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
21732166
21742167 if(pHostEntry != NULL)
21752168 {
2169+ memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);
21762170 // IPv6対応
2177-// memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);
21782171 // SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));
2179- memcpy((char *)&CurSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);
2180- // IPv6対応
2181-// SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port));
2182- SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);
2172+ SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);
21832173 }
21842174 else
21852175 {
@@ -2188,7 +2178,7 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
21882178 UseIPadrs = NO;
21892179 // IPv6対応
21902180 // SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port));
2191- SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);
2181+ SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port), MSGJPN333);
21922182 }
21932183 else
21942184 {
@@ -2202,7 +2192,7 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
22022192 else
22032193 // IPv6対応
22042194 // SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port));
2205- SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port), MSGJPN333);
2195+ SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port), MSGJPN333);
22062196
22072197 if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))
22082198 {
@@ -2212,32 +2202,23 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
22122202 {
22132203 Socks4Cmd.Ver = SOCKS4_VER;
22142204 Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT;
2215- // IPv6対応
2216-// Socks4Cmd.Port = CurSockAddr.sin_port;
2217-// Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;
2218- Socks4Cmd.Port = CurSockAddrIPv4.sin_port;
2219- Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr;
2205+ Socks4Cmd.Port = CurSockAddr.sin_port;
2206+ Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;
22202207 strcpy(Socks4Cmd.UserID, FwallUser);
22212208 Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;
22222209 }
22232210 else
22242211 {
2225- // IPv6対応
2226-// Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);
2227- Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port);
2212+ Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);
22282213 }
22292214
2230- // IPv6対応
2231-// memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));
2232-// if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)
2233- memset(&SocksSockAddrIPv4, 0, sizeof(SocksSockAddrIPv4));
2234- if((SocksSockAddrIPv4.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)
2215+ memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));
2216+ if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE)
22352217 {
22362218 // IPv6対応
22372219 // if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)
2238-// memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);
22392220 if((pHostEntry = do_gethostbynameIPv4(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)
2240- memcpy((char *)&SocksSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);
2221+ memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length);
22412222 else
22422223 {
22432224 // IPv6対応
@@ -2246,26 +2227,18 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
22462227 return INVALID_SOCKET;
22472228 }
22482229 }
2230+ SocksSockAddr.sin_port = htons((u_short)FwallPort);
2231+ SocksSockAddr.sin_family = AF_INET;
22492232 // IPv6対応
2250-// SocksSockAddr.sin_port = htons((u_short)FwallPort);
2251-// SocksSockAddr.sin_family = AF_INET;
22522233 // SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port));
2253- SocksSockAddrIPv4.sin_port = htons((u_short)FwallPort);
2254- SocksSockAddrIPv4.sin_family = AF_INET;
2255- // IPv6対応
2256-// SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port));
2257- SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port), MSGJPN333);
2234+ SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port), MSGJPN333);
22582235 // connectで接続する先はSOCKSサーバ
2259- // IPv6対応
2260-// memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));
2261- memcpy(&saSockAddr, &SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4));
2236+ memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));
22622237 }
22632238 else
22642239 {
22652240 // connectで接続するのは接続先のホスト
2266- // IPv6対応
2267-// memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));
2268- memcpy(&saSockAddr, &CurSockAddrIPv4, sizeof(CurSockAddrIPv4));
2241+ memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));
22692242 }
22702243
22712244 /////////////
@@ -2274,6 +2247,8 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
22742247
22752248 if((sSocket = do_socket(AF_INET, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)
22762249 {
2250+ // ソケットにデータを付与
2251+ SetAsyncTableDataIPv4(sSocket, &CurSockAddr, &SocksSockAddr);
22772252 if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)
22782253 {
22792254 if(Fwall == FWALL_SOCKS4)
@@ -2346,6 +2321,8 @@ SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork)
23462321
23472322 SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
23482323 {
2324+ struct sockaddr_in6 SocksSockAddr; /* SOCKSサーバのアドレス情報 */
2325+ struct sockaddr_in6 CurSockAddr; /* 接続先ホストのアドレス情報 */
23492326 struct sockaddr_in6 saSockAddr;
23502327 char HostEntry[MAXGETHOSTSTRUCT];
23512328 struct hostent *pHostEntry;
@@ -2367,11 +2344,11 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
23672344
23682345 UseIPadrs = YES;
23692346 strcpy(DomainName, host);
2370- memset(&CurSockAddrIPv6, 0, sizeof(CurSockAddrIPv6));
2371- CurSockAddrIPv6.sin6_port = htons((u_short)port);
2372- CurSockAddrIPv6.sin6_family = AF_INET6;
2373- CurSockAddrIPv6.sin6_addr = inet6_addr(host);
2374- if(memcmp(&CurSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)
2347+ memset(&CurSockAddr, 0, sizeof(CurSockAddr));
2348+ CurSockAddr.sin6_port = htons((u_short)port);
2349+ CurSockAddr.sin6_family = AF_INET6;
2350+ CurSockAddr.sin6_addr = inet6_addr(host);
2351+ if(memcmp(&CurSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)
23752352 {
23762353 // ホスト名が指定された
23772354 // ホスト名からアドレスを求める
@@ -2390,15 +2367,15 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
23902367
23912368 if(pHostEntry != NULL)
23922369 {
2393- memcpy((char *)&CurSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);
2394- SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);
2370+ memcpy((char *)&CurSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);
2371+ SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);
23952372 }
23962373 else
23972374 {
23982375 if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))
23992376 {
24002377 UseIPadrs = NO;
2401- SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);
2378+ SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin6_port), MSGJPN334);
24022379 }
24032380 else
24042381 {
@@ -2408,47 +2385,48 @@ SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork)
24082385 }
24092386 }
24102387 else
2411- SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port), MSGJPN334);
2388+ SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddr.sin6_addr), ntohs(CurSockAddr.sin6_port), MSGJPN334);
24122389
24132390 if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))
24142391 {
24152392 // SOCKSを使う
24162393 // SOCKSに接続する準備
24172394 {
2418- Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port);
2395+ Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);
24192396 }
24202397
2421- memset(&SocksSockAddrIPv6, 0, sizeof(SocksSockAddrIPv6));
2422- SocksSockAddrIPv6.sin6_addr = inet6_addr(FwallHost);
2423- if(memcmp(&SocksSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)
2398+ memset(&SocksSockAddr, 0, sizeof(SocksSockAddr));
2399+ SocksSockAddr.sin6_addr = inet6_addr(FwallHost);
2400+ if(memcmp(&SocksSockAddr.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0)
24242401 {
24252402 if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL)
2426- memcpy((char *)&SocksSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);
2403+ memcpy((char *)&SocksSockAddr.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length);
24272404 else
24282405 {
24292406 SetTaskMsg(MSGJPN021, FwallHost, MSGJPN334);
24302407 return INVALID_SOCKET;
24312408 }
24322409 }
2433- SocksSockAddrIPv6.sin6_port = htons((u_short)FwallPort);
2434- SocksSockAddrIPv6.sin6_family = AF_INET6;
2435- SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddrIPv6.sin6_addr), ntohs(SocksSockAddrIPv6.sin6_port), MSGJPN334);
2410+ SocksSockAddr.sin6_port = htons((u_short)FwallPort);
2411+ SocksSockAddr.sin6_family = AF_INET6;
2412+ SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddr.sin6_addr), ntohs(SocksSockAddr.sin6_port), MSGJPN334);
24362413 // connectで接続する先はSOCKSサーバ
2437- memcpy(&saSockAddr, &SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6));
2414+ memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr));
24382415 }
24392416 else
24402417 {
24412418 // connectで接続するのは接続先のホスト
2442- memcpy(&saSockAddr, &CurSockAddrIPv6, sizeof(CurSockAddrIPv6));
2419+ memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr));
24432420 }
24442421
24452422 /////////////
24462423 // 接続実行
24472424 /////////////
24482425
2449- inet6_ntoa(saSockAddr.sin6_addr);
24502426 if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET)
24512427 {
2428+ // ソケットにデータを付与
2429+ SetAsyncTableDataIPv6(sSocket, &CurSockAddr, &SocksSockAddr);
24522430 if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR)
24532431 {
24542432 if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER))
@@ -2524,6 +2502,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
25242502 //SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork)
25252503 SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
25262504 {
2505+ // IPv6対応
2506+ struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */
2507+ struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */
25272508 SOCKET listen_skt;
25282509 int iLength;
25292510 char *a,*p;
@@ -2537,6 +2518,9 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
25372518 int Len;
25382519 int Fwall;
25392520
2521+ // ソケットにデータを付与
2522+ GetAsyncTableDataIPv4(ctrl_skt, &CurSockAddr, &SocksSockAddr);
2523+
25402524 Fwall = FWALL_NONE;
25412525 if(AskHostFireWall() == YES)
25422526 Fwall = FwallType;
@@ -2547,17 +2531,12 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
25472531 {
25482532 /*===== SOCKS4を使う =====*/
25492533 DoPrintf("Use SOCKS4 BIND");
2550- // IPv6対応
2551-// if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)
2552- if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR)
2534+ if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)
25532535 {
25542536 Socks4Cmd.Ver = SOCKS4_VER;
25552537 Socks4Cmd.Cmd = SOCKS4_CMD_BIND;
2556- // IPv6対応
2557-// Socks4Cmd.Port = CurSockAddr.sin_port;
2558-// Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;
2559- Socks4Cmd.Port = CurSockAddrIPv4.sin_port;
2560- Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr;
2538+ Socks4Cmd.Port = CurSockAddr.sin_port;
2539+ Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr;
25612540 strcpy(Socks4Cmd.UserID, FwallUser);
25622541 Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1;
25632542
@@ -2578,9 +2557,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
25782557 }
25792558
25802559 if(Socks4Reply.AdrsInt == 0)
2581- // IPv6対応
2582-// Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;
2583- Socks4Reply.AdrsInt = SocksSockAddrIPv4.sin_addr.s_addr;
2560+ Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr;
25842561
25852562 a = (char *)&Socks4Reply.AdrsInt;
25862563 p = (char *)&Socks4Reply.Port;
@@ -2590,9 +2567,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
25902567 {
25912568 /*===== SOCKS5を使う =====*/
25922569 DoPrintf("Use SOCKS5 BIND");
2593- // IPv6対応
2594-// if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)
2595- if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR)
2570+ if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)
25962571 {
25972572 if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)
25982573 {
@@ -2601,9 +2576,7 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
26012576 return(listen_skt);
26022577 }
26032578
2604- // IPv6対応
2605-// Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);
2606- Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port);
2579+ Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port);
26072580
26082581 Socks5Reply.Result = -1;
26092582 // 同時接続対応
@@ -2711,6 +2684,8 @@ SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork)
27112684
27122685 SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
27132686 {
2687+ struct sockaddr_in6 SocksSockAddr; /* SOCKSサーバのアドレス情報 */
2688+ struct sockaddr_in6 CurSockAddr; /* 接続先ホストのアドレス情報 */
27142689 SOCKET listen_skt;
27152690 int iLength;
27162691 char *a,*p;
@@ -2724,6 +2699,9 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
27242699
27252700 char Adrs[40];
27262701
2702+ // ソケットにデータを付与
2703+ GetAsyncTableDataIPv6(ctrl_skt, &CurSockAddr, &SocksSockAddr);
2704+
27272705 Fwall = FWALL_NONE;
27282706 if(AskHostFireWall() == YES)
27292707 Fwall = FwallType;
@@ -2734,7 +2712,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
27342712 {
27352713 /*===== SOCKS5を使う =====*/
27362714 DoPrintf("Use SOCKS5 BIND");
2737- if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6), CancelCheckWork) != SOCKET_ERROR)
2715+ if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR)
27382716 {
27392717 if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL)
27402718 {
@@ -2743,7 +2721,7 @@ SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork)
27432721 return(listen_skt);
27442722 }
27452723
2746- Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port);
2724+ Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddr.sin6_addr, DomainName, CurSockAddr.sin6_port);
27472725
27482726 Socks5Reply.Result = -1;
27492727 // 同時接続対応
--- a/getput.c
+++ b/getput.c
@@ -4051,7 +4051,7 @@ static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int
40514051 char *Pos;
40524052 char *Btm;
40534053 int Sts;
4054- int i;
4054+// int i;
40554055 struct sockaddr_in6 SockAddr;
40564056
40574057 Sts = FFFTP_FAIL;
@@ -4080,8 +4080,9 @@ static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int
40804080 }
40814081 else
40824082 {
4083- i = sizeof(SockAddr);
4084- if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)
4083+// i = sizeof(SockAddr);
4084+// if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR)
4085+ if(GetAsyncTableDataIPv6(Skt, &SockAddr, NULL) == YES)
40854086 AddressToStringIPv6(Adrs, &SockAddr.sin6_addr);
40864087 }
40874088
--- a/main.c
+++ b/main.c
@@ -234,7 +234,7 @@ BYTE SSLRootCAFileHash[20];
234234 // ファイルアイコン表示対応
235235 int DispFileIcon = NO;
236236 // ディレクトリ自動作成
237-int MakeAllDir = NO;
237+int MakeAllDir = YES;
238238
239239
240240
--- a/socket.c
+++ b/socket.c
@@ -66,6 +66,11 @@ typedef struct {
6666 int FdRead;
6767 int FdWrite;
6868 int Error;
69+ // ソケットにデータを付与
70+ struct sockaddr_in HostAddrIPv4;
71+ struct sockaddr_in SocksAddrIPv4;
72+ struct sockaddr_in6 HostAddrIPv6;
73+ struct sockaddr_in6 SocksAddrIPv6;
6974 } ASYNCSIGNAL;
7075
7176
@@ -489,6 +494,11 @@ static int RegisterAsyncTable(SOCKET s)
489494 Signal[Pos].FdAccept = 0;
490495 Signal[Pos].FdRead = 0;
491496 Signal[Pos].FdWrite = 0;
497+ // ソケットにデータを付与
498+ memset(&Signal[Pos].HostAddrIPv4, 0, sizeof(struct sockaddr_in));
499+ memset(&Signal[Pos].SocksAddrIPv4, 0, sizeof(struct sockaddr_in));
500+ memset(&Signal[Pos].HostAddrIPv6, 0, sizeof(struct sockaddr_in6));
501+ memset(&Signal[Pos].SocksAddrIPv6, 0, sizeof(struct sockaddr_in6));
492502 Sts = YES;
493503 break;
494504 }
@@ -639,6 +649,104 @@ static int UnregisterAsyncTableDbase(HANDLE Async)
639649 }
640650
641651
652+// ソケットにデータを付与
653+
654+int SetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks)
655+{
656+ int Sts;
657+ int Pos;
658+
659+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
660+ Sts = NO;
661+ for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
662+ {
663+ if(Signal[Pos].Socket == s)
664+ {
665+ if(Host != NULL)
666+ memcpy(&Signal[Pos].HostAddrIPv4, Host, sizeof(struct sockaddr_in));
667+ if(Socks != NULL)
668+ memcpy(&Signal[Pos].SocksAddrIPv4, Socks, sizeof(struct sockaddr_in));
669+ Sts = YES;
670+ break;
671+ }
672+ }
673+ ReleaseMutex(hAsyncTblAccMutex);
674+
675+ return(Sts);
676+}
677+
678+int SetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks)
679+{
680+ int Sts;
681+ int Pos;
682+
683+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
684+ Sts = NO;
685+ for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
686+ {
687+ if(Signal[Pos].Socket == s)
688+ {
689+ if(Host != NULL)
690+ memcpy(&Signal[Pos].HostAddrIPv6, Host, sizeof(struct sockaddr_in6));
691+ if(Socks != NULL)
692+ memcpy(&Signal[Pos].SocksAddrIPv6, Socks, sizeof(struct sockaddr_in6));
693+ Sts = YES;
694+ break;
695+ }
696+ }
697+ ReleaseMutex(hAsyncTblAccMutex);
698+
699+ return(Sts);
700+}
701+
702+int GetAsyncTableDataIPv4(SOCKET s, struct sockaddr_in* Host, struct sockaddr_in* Socks)
703+{
704+ int Sts;
705+ int Pos;
706+
707+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
708+ Sts = NO;
709+ for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
710+ {
711+ if(Signal[Pos].Socket == s)
712+ {
713+ if(Host != NULL)
714+ memcpy(Host, &Signal[Pos].HostAddrIPv4, sizeof(struct sockaddr_in));
715+ if(Socks != NULL)
716+ memcpy(Socks, &Signal[Pos].SocksAddrIPv4, sizeof(struct sockaddr_in));
717+ Sts = YES;
718+ break;
719+ }
720+ }
721+ ReleaseMutex(hAsyncTblAccMutex);
722+
723+ return(Sts);
724+}
725+
726+int GetAsyncTableDataIPv6(SOCKET s, struct sockaddr_in6* Host, struct sockaddr_in6* Socks)
727+{
728+ int Sts;
729+ int Pos;
730+
731+ WaitForSingleObject(hAsyncTblAccMutex, INFINITE);
732+ Sts = NO;
733+ for(Pos = 0; Pos < MAX_SIGNAL_ENTRY; Pos++)
734+ {
735+ if(Signal[Pos].Socket == s)
736+ {
737+ if(Host != NULL)
738+ memcpy(Host, &Signal[Pos].HostAddrIPv6, sizeof(struct sockaddr_in6));
739+ if(Socks != NULL)
740+ memcpy(Socks, &Signal[Pos].SocksAddrIPv6, sizeof(struct sockaddr_in6));
741+ Sts = YES;
742+ break;
743+ }
744+ }
745+ ReleaseMutex(hAsyncTblAccMutex);
746+
747+ return(Sts);
748+}
749+
642750
643751
644752
@@ -720,7 +828,7 @@ struct hostent *do_gethostbynameIPv6(const char *Name, char *Buf, int Len, int *
720828
721829 if(*CancelCheckWork == YES)
722830 {
723- WSACancelAsyncRequest(hAsync);
831+ WSACancelAsyncRequestIPv6(hAsync);
724832 }
725833 else if(Error == 0)
726834 {
--- a/socketwrapper.c
+++ b/socketwrapper.c
@@ -641,6 +641,8 @@ int FTPS_recv(SOCKET s, char * buf, int len, int flags)
641641
642642 // IPv6対応
643643
644+const struct in6_addr IN6ADDR_NONE = {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};
645+
644646 typedef struct
645647 {
646648 HANDLE h;
@@ -682,7 +684,7 @@ DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)
682684 pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);
683685 pHost->h_addr_list[1] = NULL;
684686 memcpy(pHost->h_addr_list[0], &((struct sockaddr_in*)p->ai_addr)->sin_addr, sizeof(struct in_addr));
685- PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));
687+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in_addr)));
686688 }
687689 else
688690 PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));
@@ -700,7 +702,7 @@ DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)
700702 pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);
701703 pHost->h_addr_list[1] = NULL;
702704 memcpy(pHost->h_addr_list[0], &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(struct in6_addr));
703- PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));
705+ PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in6_addr)));
704706 }
705707 else
706708 PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));
@@ -768,7 +770,10 @@ int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle)
768770 int Result;
769771 Result = SOCKET_ERROR;
770772 if(TerminateThread(hAsyncTaskHandle, 0))
773+ {
774+ CloseHandle(hAsyncTaskHandle);
771775 Result = 0;
776+ }
772777 return Result;
773778 }
774779
@@ -844,7 +849,7 @@ struct in6_addr inet6_addr(const char* cp)
844849 {
845850 if(!cp)
846851 {
847- memset(&Result, 0xff, sizeof(Result));
852+ memcpy(&Result, &IN6ADDR_NONE, sizeof(struct in6_addr));
848853 break;
849854 }
850855 if(i >= AfterZero)
@@ -868,7 +873,7 @@ struct in6_addr inet6_addr(const char* cp)
868873 Result.u.Word[i] = ((Result.u.Word[i] & 0xff00) >> 8) | ((Result.u.Word[i] & 0x00ff) << 8);
869874 if(strncmp(p, ":", 1) != 0 && strlen(p) > 0)
870875 {
871- memset(&Result, 0xff, sizeof(Result));
876+ memcpy(&Result, &IN6ADDR_NONE, sizeof(struct in6_addr));
872877 break;
873878 }
874879 if(cp = strstr(cp, ":"))
--- a/socketwrapper.h
+++ b/socketwrapper.h
@@ -40,6 +40,8 @@ struct in6_addr inet6_addr(const char* cp);
4040 HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen);
4141 HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family);
4242
43+extern const struct in6_addr IN6ADDR_NONE;
44+
4345 BOOL LoadPuTTY();
4446 void FreePuTTY();
4547 BOOL IsPuTTYLoaded();