#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
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
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
// 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
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
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
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
// 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
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
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
\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
* 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
\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