Loweynet
修订版 | 79dd2b343ce394098b2f0f9d89e53bd8c28b7401 (tree) |
---|---|
时间 | 2011-11-12 17:41:28 |
作者 | s_kawamoto <s_kawamoto@user...> |
Commiter | s_kawamoto |
Add support for IPv6 (not tested).
@@ -952,6 +952,7 @@ typedef struct { | ||
952 | 952 | // MLSD対応 |
953 | 953 | int UseMLSD; /* "MLSD"コマンドを使用する */ |
954 | 954 | // IPv6対応 |
955 | + int InetFamily; /* IPv6接続かどうか (AF_INET/AF_INET6) */ | |
955 | 956 | int UseIPv6; /* IPv6接続を許可しEPRT/EPSVコマンドを使用する */ |
956 | 957 | } HOSTDATA; |
957 | 958 |
@@ -1181,9 +1182,11 @@ typedef struct { | ||
1181 | 1182 | char Rsv; /* (予約) */ |
1182 | 1183 | char Type; /* アドレスのタイプ */ |
1183 | 1184 | /* 以後(可変長部分) */ |
1184 | - ulong AdrsInt; /* アドレス */ | |
1185 | - ushort Port; /* ポート */ | |
1186 | - char _dummy[2]; /* dummy */ | |
1185 | + // IPv6対応 | |
1186 | +// ulong AdrsInt; /* アドレス */ | |
1187 | +// ushort Port; /* ポート */ | |
1188 | +// char _dummy[2]; /* dummy */ | |
1189 | + char _dummy[255+1+2]; /* dummy */ | |
1187 | 1190 | } SOCKS5REPLY; |
1188 | 1191 | |
1189 | 1192 | #define SOCKS5REPLY_SIZE 4 /* 最初の固定部分のサイズ */ |
@@ -1416,7 +1419,13 @@ void DisconnectProc(void); | ||
1416 | 1419 | void DisconnectSet(void); |
1417 | 1420 | int AskConnecting(void); |
1418 | 1421 | SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork); |
1422 | +// IPv6対応 | |
1423 | +SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork); | |
1424 | +SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork); | |
1419 | 1425 | SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork); |
1426 | +// IPv6対応 | |
1427 | +SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork); | |
1428 | +SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork); | |
1420 | 1429 | int AskTryingConnect(void); |
1421 | 1430 | // 同時接続対応 |
1422 | 1431 | //int SocksGet2ndBindReply(SOCKET Socket, SOCKET *Data); |
@@ -1436,6 +1445,7 @@ int AskHostFeature(void); | ||
1436 | 1445 | // MLSD対応 |
1437 | 1446 | int AskUseMLSD(void); |
1438 | 1447 | // IPv6対応 |
1448 | +int AskInetFamily(void); | |
1439 | 1449 | int AskUseIPv6(void); |
1440 | 1450 | |
1441 | 1451 | /*===== cache.c =====*/ |
@@ -1724,7 +1734,10 @@ char *AskLocalFreeSpace(char *Path); | ||
1724 | 1734 | |
1725 | 1735 | int MakeSocketWin(HWND hWnd, HINSTANCE hInst); |
1726 | 1736 | void DeleteSocketWin(void); |
1727 | -struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork); | |
1737 | +// IPv6対応 | |
1738 | +//struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork); | |
1739 | +struct hostent *do_gethostbynameIPv4(const char *Name, char *Buf, int Len, int *CancelCheckWork); | |
1740 | +struct hostent *do_gethostbynameIPv6(const char *Name, char *Buf, int Len, int *CancelCheckWork); | |
1728 | 1741 | SOCKET do_socket(int af, int type, int protocol); |
1729 | 1742 | int do_connect(SOCKET s, const struct sockaddr *name, int namelen, int *CancelCheckWork); |
1730 | 1743 | int do_closesocket(SOCKET s); |
@@ -1736,6 +1749,10 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int | ||
1736 | 1749 | void RemoveReceivedData(SOCKET s); |
1737 | 1750 | int CheckClosedAndReconnect(void); |
1738 | 1751 | void CheckAllEventClosed(void); |
1752 | +// IPv6対応 | |
1753 | +char* AddressToStringIPv6(char* str, void* in6); | |
1754 | +char* inet6_ntoa(struct in6_addr in6); | |
1755 | +struct in6_addr inet6_addr(const char* cp); | |
1739 | 1756 | |
1740 | 1757 | /*===== updatebell.c =====*/ |
1741 | 1758 |
@@ -35,7 +35,9 @@ | ||
35 | 35 | #include <string.h> |
36 | 36 | #include <mbstring.h> |
37 | 37 | #include <time.h> |
38 | -#include <winsock.h> | |
38 | +// IPv6対応 | |
39 | +//#include <winsock.h> | |
40 | +#include <ws2tcpip.h> | |
39 | 41 | #include <windowsx.h> |
40 | 42 | #include <commctrl.h> |
41 | 43 |
@@ -65,6 +67,8 @@ static SOCKET DoConnect(HOSTDATA* HostData, char *Host, char *User, char *Pass, | ||
65 | 67 | static int CheckOneTimePassword(char *Pass, char *Reply, int Type); |
66 | 68 | static BOOL CALLBACK BlkHookFnc(void); |
67 | 69 | static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulong IP, char *Host, ushort Port); |
70 | +// IPv6対応 | |
71 | +static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port); | |
68 | 72 | static int SocksSendCmd(SOCKET Socket, void *Data, int Size, int *CancelCheckWork); |
69 | 73 | // 同時接続対応 |
70 | 74 | //static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet); |
@@ -107,8 +111,14 @@ static int TmpNameKanjiCode; | ||
107 | 111 | |
108 | 112 | /* 接続中の接続先、SOCKSサーバのアドレス情報を保存しておく */ |
109 | 113 | /* この情報はlistenソケットを取得する際に用いる */ |
110 | -static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */ | |
111 | -static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */ | |
114 | +// IPv6対応 | |
115 | +//static struct sockaddr_in SocksSockAddr; /* SOCKSサーバのアドレス情報 */ | |
116 | +//static struct sockaddr_in CurSockAddr; /* 接続先ホストのアドレス情報 */ | |
117 | +static struct sockaddr_in SocksSockAddrIPv4; /* SOCKSサーバのアドレス情報 */ | |
118 | +static struct sockaddr_in CurSockAddrIPv4; /* 接続先ホストのアドレス情報 */ | |
119 | +static struct sockaddr_in6 SocksSockAddrIPv6; /* SOCKSサーバのアドレス情報 */ | |
120 | +static struct sockaddr_in6 CurSockAddrIPv6; /* 接続先ホストのアドレス情報 */ | |
121 | +static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; | |
112 | 122 | |
113 | 123 | static int UseIPadrs; |
114 | 124 | static char DomainName[HOST_ADRS_LEN+1]; |
@@ -1789,8 +1799,34 @@ static int CheckOneTimePassword(char *Pass, char *Reply, int Type) | ||
1789 | 1799 | * SOCKET ソケット |
1790 | 1800 | *----------------------------------------------------------------------------*/ |
1791 | 1801 | |
1802 | +// IPv6対応 | |
1792 | 1803 | SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) |
1793 | 1804 | { |
1805 | + SOCKET Result; | |
1806 | + Result = INVALID_SOCKET; | |
1807 | + switch(CurHost.InetFamily) | |
1808 | + { | |
1809 | + case AF_UNSPEC: | |
1810 | + if((Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) | |
1811 | + CurHost.InetFamily = AF_INET; | |
1812 | + else if(CurHost.UseIPv6 == YES && (Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork)) != INVALID_SOCKET) | |
1813 | + CurHost.InetFamily = AF_INET6; | |
1814 | + break; | |
1815 | + case AF_INET: | |
1816 | + Result = connectsockIPv4(host, port, PreMsg, CancelCheckWork); | |
1817 | + break; | |
1818 | + case AF_INET6: | |
1819 | + Result = connectsockIPv6(host, port, PreMsg, CancelCheckWork); | |
1820 | + break; | |
1821 | + } | |
1822 | + return Result; | |
1823 | +} | |
1824 | + | |
1825 | + | |
1826 | +// IPv6対応 | |
1827 | +//SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | |
1828 | +SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork) | |
1829 | +{ | |
1794 | 1830 | struct sockaddr_in saSockAddr; |
1795 | 1831 | char HostEntry[MAXGETHOSTSTRUCT]; |
1796 | 1832 | struct hostent *pHostEntry; |
@@ -1814,10 +1850,15 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | ||
1814 | 1850 | |
1815 | 1851 | UseIPadrs = YES; |
1816 | 1852 | strcpy(DomainName, host); |
1817 | - memset(&CurSockAddr, 0, sizeof(CurSockAddr)); | |
1818 | - CurSockAddr.sin_port = htons((u_short)port); | |
1819 | - CurSockAddr.sin_family = AF_INET; | |
1820 | - if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) | |
1853 | + // IPv6対応 | |
1854 | +// memset(&CurSockAddr, 0, sizeof(CurSockAddr)); | |
1855 | +// CurSockAddr.sin_port = htons((u_short)port); | |
1856 | +// CurSockAddr.sin_family = AF_INET; | |
1857 | +// if((CurSockAddr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) | |
1858 | + memset(&CurSockAddrIPv4, 0, sizeof(CurSockAddrIPv4)); | |
1859 | + CurSockAddrIPv4.sin_port = htons((u_short)port); | |
1860 | + CurSockAddrIPv4.sin_family = AF_INET; | |
1861 | + if((CurSockAddrIPv4.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) | |
1821 | 1862 | { |
1822 | 1863 | // ホスト名が指定された |
1823 | 1864 | // ホスト名からアドレスを求める |
@@ -1831,20 +1872,27 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | ||
1831 | 1872 | { |
1832 | 1873 | // アドレスを取得 |
1833 | 1874 | SetTaskMsg(MSGJPN016, DomainName); |
1834 | - pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); | |
1875 | + // IPv6対応 | |
1876 | +// pHostEntry = do_gethostbyname(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); | |
1877 | + pHostEntry = do_gethostbynameIPv4(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); | |
1835 | 1878 | } |
1836 | 1879 | |
1837 | 1880 | if(pHostEntry != NULL) |
1838 | 1881 | { |
1839 | - memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
1840 | - SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); | |
1882 | + // IPv6対応 | |
1883 | +// memcpy((char *)&CurSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
1884 | +// SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); | |
1885 | + memcpy((char *)&CurSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
1886 | + SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port)); | |
1841 | 1887 | } |
1842 | 1888 | else |
1843 | 1889 | { |
1844 | 1890 | if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) |
1845 | 1891 | { |
1846 | 1892 | UseIPadrs = NO; |
1847 | - SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); | |
1893 | + // IPv6対応 | |
1894 | +// SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddr.sin_port)); | |
1895 | + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv4.sin_port)); | |
1848 | 1896 | } |
1849 | 1897 | else |
1850 | 1898 | { |
@@ -1854,7 +1902,9 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | ||
1854 | 1902 | } |
1855 | 1903 | } |
1856 | 1904 | else |
1857 | - SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); | |
1905 | + // IPv6対応 | |
1906 | +// SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddr.sin_addr), ntohs(CurSockAddr.sin_port)); | |
1907 | + SetTaskMsg(MSGJPN020, PreMsg, inet_ntoa(CurSockAddrIPv4.sin_addr), ntohs(CurSockAddrIPv4.sin_port)); | |
1858 | 1908 | |
1859 | 1909 | if((Fwall == FWALL_SOCKS4) || (Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) |
1860 | 1910 | { |
@@ -1864,37 +1914,56 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | ||
1864 | 1914 | { |
1865 | 1915 | Socks4Cmd.Ver = SOCKS4_VER; |
1866 | 1916 | Socks4Cmd.Cmd = SOCKS4_CMD_CONNECT; |
1867 | - Socks4Cmd.Port = CurSockAddr.sin_port; | |
1868 | - Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; | |
1917 | + // IPv6対応 | |
1918 | +// Socks4Cmd.Port = CurSockAddr.sin_port; | |
1919 | +// Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; | |
1920 | + Socks4Cmd.Port = CurSockAddrIPv4.sin_port; | |
1921 | + Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr; | |
1869 | 1922 | strcpy(Socks4Cmd.UserID, FwallUser); |
1870 | 1923 | Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; |
1871 | 1924 | } |
1872 | 1925 | else |
1873 | 1926 | { |
1874 | - Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); | |
1927 | + // IPv6対応 | |
1928 | +// Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); | |
1929 | + Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port); | |
1875 | 1930 | } |
1876 | 1931 | |
1877 | - memset(&SocksSockAddr, 0, sizeof(SocksSockAddr)); | |
1878 | - if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) | |
1932 | + // IPv6対応 | |
1933 | +// memset(&SocksSockAddr, 0, sizeof(SocksSockAddr)); | |
1934 | +// if((SocksSockAddr.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) | |
1935 | + memset(&SocksSockAddrIPv4, 0, sizeof(SocksSockAddrIPv4)); | |
1936 | + if((SocksSockAddrIPv4.sin_addr.s_addr = inet_addr(FwallHost)) == INADDR_NONE) | |
1879 | 1937 | { |
1880 | - if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) | |
1881 | - memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
1938 | + // IPv6対応 | |
1939 | +// if((pHostEntry = do_gethostbyname(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) | |
1940 | +// memcpy((char *)&SocksSockAddr.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
1941 | + if((pHostEntry = do_gethostbynameIPv4(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) | |
1942 | + memcpy((char *)&SocksSockAddrIPv4.sin_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
1882 | 1943 | else |
1883 | 1944 | { |
1884 | 1945 | SetTaskMsg(MSGJPN021, FwallHost); |
1885 | 1946 | return INVALID_SOCKET; |
1886 | 1947 | } |
1887 | 1948 | } |
1888 | - SocksSockAddr.sin_port = htons((u_short)FwallPort); | |
1889 | - SocksSockAddr.sin_family = AF_INET; | |
1890 | - SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port)); | |
1949 | + // IPv6対応 | |
1950 | +// SocksSockAddr.sin_port = htons((u_short)FwallPort); | |
1951 | +// SocksSockAddr.sin_family = AF_INET; | |
1952 | +// SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddr.sin_addr), ntohs(SocksSockAddr.sin_port)); | |
1953 | + SocksSockAddrIPv4.sin_port = htons((u_short)FwallPort); | |
1954 | + SocksSockAddrIPv4.sin_family = AF_INET; | |
1955 | + SetTaskMsg(MSGJPN022, inet_ntoa(SocksSockAddrIPv4.sin_addr), ntohs(SocksSockAddrIPv4.sin_port)); | |
1891 | 1956 | // connectで接続する先はSOCKSサーバ |
1892 | - memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); | |
1957 | + // IPv6対応 | |
1958 | +// memcpy(&saSockAddr, &SocksSockAddr, sizeof(SocksSockAddr)); | |
1959 | + memcpy(&saSockAddr, &SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4)); | |
1893 | 1960 | } |
1894 | 1961 | else |
1895 | 1962 | { |
1896 | 1963 | // connectで接続するのは接続先のホスト |
1897 | - memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); | |
1964 | + // IPv6対応 | |
1965 | +// memcpy(&saSockAddr, &CurSockAddr, sizeof(CurSockAddr)); | |
1966 | + memcpy(&saSockAddr, &CurSockAddrIPv4, sizeof(CurSockAddrIPv4)); | |
1898 | 1967 | } |
1899 | 1968 | |
1900 | 1969 | ///////////// |
@@ -1963,6 +2032,155 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | ||
1963 | 2032 | } |
1964 | 2033 | |
1965 | 2034 | |
2035 | +SOCKET connectsockIPv6(char *host, int port, char *PreMsg, int *CancelCheckWork) | |
2036 | +{ | |
2037 | + struct sockaddr_in6 saSockAddr; | |
2038 | + char HostEntry[MAXGETHOSTSTRUCT]; | |
2039 | + struct hostent *pHostEntry; | |
2040 | + SOCKET sSocket; | |
2041 | + int Len; | |
2042 | + int Fwall; | |
2043 | + SOCKS5REQUEST Socks5Cmd; | |
2044 | + SOCKS5REPLY Socks5Reply; | |
2045 | + | |
2046 | + ////////////////////////////// | |
2047 | + // ホスト名解決と接続の準備 | |
2048 | + ////////////////////////////// | |
2049 | + | |
2050 | + Fwall = FWALL_NONE; | |
2051 | + if(AskHostFireWall() == YES) | |
2052 | + Fwall = FwallType; | |
2053 | + | |
2054 | + sSocket = INVALID_SOCKET; | |
2055 | + | |
2056 | + UseIPadrs = YES; | |
2057 | + strcpy(DomainName, host); | |
2058 | + memset(&CurSockAddrIPv6, 0, sizeof(CurSockAddrIPv6)); | |
2059 | + CurSockAddrIPv6.sin6_port = htons((u_short)port); | |
2060 | + CurSockAddrIPv6.sin6_family = AF_INET6; | |
2061 | + CurSockAddrIPv6.sin6_addr = inet6_addr(host); | |
2062 | + if(memcmp(&CurSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0) | |
2063 | + { | |
2064 | + // ホスト名が指定された | |
2065 | + // ホスト名からアドレスを求める | |
2066 | + if(((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) && | |
2067 | + (FwallResolv == YES)) | |
2068 | + { | |
2069 | + // ホスト名解決はSOCKSサーバに任せる | |
2070 | + pHostEntry = NULL; | |
2071 | + } | |
2072 | + else | |
2073 | + { | |
2074 | + // アドレスを取得 | |
2075 | + SetTaskMsg(MSGJPN016, DomainName); | |
2076 | + pHostEntry = do_gethostbynameIPv6(host, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork); | |
2077 | + } | |
2078 | + | |
2079 | + if(pHostEntry != NULL) | |
2080 | + { | |
2081 | + memcpy((char *)&CurSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
2082 | + SetTaskMsg(MSGJPN017, PreMsg, DomainName, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port)); | |
2083 | + } | |
2084 | + else | |
2085 | + { | |
2086 | + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) | |
2087 | + { | |
2088 | + UseIPadrs = NO; | |
2089 | + SetTaskMsg(MSGJPN018, PreMsg, DomainName, ntohs(CurSockAddrIPv6.sin6_port)); | |
2090 | + } | |
2091 | + else | |
2092 | + { | |
2093 | + SetTaskMsg(MSGJPN019, host); | |
2094 | + return(INVALID_SOCKET); | |
2095 | + } | |
2096 | + } | |
2097 | + } | |
2098 | + else | |
2099 | + SetTaskMsg(MSGJPN020, PreMsg, inet6_ntoa(CurSockAddrIPv6.sin6_addr), ntohs(CurSockAddrIPv6.sin6_port)); | |
2100 | + | |
2101 | + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) | |
2102 | + { | |
2103 | + // SOCKSを使う | |
2104 | + // SOCKSに接続する準備 | |
2105 | + { | |
2106 | + Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_CONNECT, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port); | |
2107 | + } | |
2108 | + | |
2109 | + memset(&SocksSockAddrIPv6, 0, sizeof(SocksSockAddrIPv6)); | |
2110 | + SocksSockAddrIPv6.sin6_addr = inet6_addr(FwallHost); | |
2111 | + if(memcmp(&SocksSockAddrIPv6.sin6_addr, &IN6ADDR_NONE, sizeof(struct in6_addr)) == 0) | |
2112 | + { | |
2113 | + if((pHostEntry = do_gethostbynameIPv6(FwallHost, HostEntry, MAXGETHOSTSTRUCT, CancelCheckWork)) != NULL) | |
2114 | + memcpy((char *)&SocksSockAddrIPv6.sin6_addr, pHostEntry->h_addr, pHostEntry->h_length); | |
2115 | + else | |
2116 | + { | |
2117 | + SetTaskMsg(MSGJPN021, FwallHost); | |
2118 | + return INVALID_SOCKET; | |
2119 | + } | |
2120 | + } | |
2121 | + SocksSockAddrIPv6.sin6_port = htons((u_short)FwallPort); | |
2122 | + SocksSockAddrIPv6.sin6_family = AF_INET6; | |
2123 | + SetTaskMsg(MSGJPN022, inet6_ntoa(SocksSockAddrIPv6.sin6_addr), ntohs(SocksSockAddrIPv6.sin6_port)); | |
2124 | + // connectで接続する先はSOCKSサーバ | |
2125 | + memcpy(&saSockAddr, &SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6)); | |
2126 | + } | |
2127 | + else | |
2128 | + { | |
2129 | + // connectで接続するのは接続先のホスト | |
2130 | + memcpy(&saSockAddr, &CurSockAddrIPv6, sizeof(CurSockAddrIPv6)); | |
2131 | + } | |
2132 | + | |
2133 | + ///////////// | |
2134 | + // 接続実行 | |
2135 | + ///////////// | |
2136 | + | |
2137 | + inet6_ntoa(saSockAddr.sin6_addr); | |
2138 | + if((sSocket = do_socket(AF_INET6, SOCK_STREAM, TCP_PORT)) != INVALID_SOCKET) | |
2139 | + { | |
2140 | + if(do_connect(sSocket, (struct sockaddr *)&saSockAddr, sizeof(saSockAddr), CancelCheckWork) != SOCKET_ERROR) | |
2141 | + { | |
2142 | + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) | |
2143 | + { | |
2144 | + if(Socks5SelMethod(sSocket, CancelCheckWork) == FFFTP_FAIL) | |
2145 | + { | |
2146 | + DoClose(sSocket); | |
2147 | + sSocket = INVALID_SOCKET; | |
2148 | + } | |
2149 | + | |
2150 | + Socks5Reply.Result = -1; | |
2151 | + // 同時接続対応 | |
2152 | +// if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || | |
2153 | +// (Socks5GetCmdReply(sSocket, &Socks5Reply) != FFFTP_SUCCESS) || | |
2154 | +// (Socks5Reply.Result != SOCKS5_RES_OK)) | |
2155 | + if((SocksSendCmd(sSocket, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || | |
2156 | + (Socks5GetCmdReply(sSocket, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || | |
2157 | + (Socks5Reply.Result != SOCKS5_RES_OK)) | |
2158 | + { | |
2159 | + SetTaskMsg(MSGJPN024, Socks5Reply.Result); | |
2160 | + DoClose(sSocket); | |
2161 | + sSocket = INVALID_SOCKET; | |
2162 | + } | |
2163 | + | |
2164 | + } | |
2165 | + | |
2166 | + if(sSocket != INVALID_SOCKET) | |
2167 | + SetTaskMsg(MSGJPN025); | |
2168 | + } | |
2169 | + else | |
2170 | + { | |
2171 | +//#pragma aaa | |
2172 | + SetTaskMsg(MSGJPN026/*"接続できません(2) %x", sSocket*/); | |
2173 | + DoClose(sSocket); | |
2174 | + sSocket = INVALID_SOCKET; | |
2175 | + } | |
2176 | + } | |
2177 | + else | |
2178 | + SetTaskMsg(MSGJPN027); | |
2179 | + | |
2180 | + return(sSocket); | |
2181 | +} | |
2182 | + | |
2183 | + | |
1966 | 2184 | /*----- リッスンソケットを取得 ------------------------------------------------ |
1967 | 2185 | * |
1968 | 2186 | * Parameter |
@@ -1972,8 +2190,30 @@ SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork) | ||
1972 | 2190 | * SOCKET リッスンソケット |
1973 | 2191 | *----------------------------------------------------------------------------*/ |
1974 | 2192 | |
2193 | +// IPv6対応 | |
1975 | 2194 | SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) |
1976 | 2195 | { |
2196 | + SOCKET Result; | |
2197 | + Result = INVALID_SOCKET; | |
2198 | + switch(CurHost.InetFamily) | |
2199 | + { | |
2200 | + case AF_UNSPEC: | |
2201 | + break; | |
2202 | + case AF_INET: | |
2203 | + Result = GetFTPListenSocketIPv4(ctrl_skt, CancelCheckWork); | |
2204 | + break; | |
2205 | + case AF_INET6: | |
2206 | + Result = GetFTPListenSocketIPv6(ctrl_skt, CancelCheckWork); | |
2207 | + break; | |
2208 | + } | |
2209 | + return Result; | |
2210 | +} | |
2211 | + | |
2212 | + | |
2213 | +// IPv6対応 | |
2214 | +//SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | |
2215 | +SOCKET GetFTPListenSocketIPv4(SOCKET ctrl_skt, int *CancelCheckWork) | |
2216 | +{ | |
1977 | 2217 | SOCKET listen_skt; |
1978 | 2218 | int iLength; |
1979 | 2219 | char *a,*p; |
@@ -1997,12 +2237,17 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | ||
1997 | 2237 | { |
1998 | 2238 | /*===== SOCKS4を使う =====*/ |
1999 | 2239 | DoPrintf("Use SOCKS4 BIND"); |
2000 | - if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) | |
2240 | + // IPv6対応 | |
2241 | +// if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) | |
2242 | + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR) | |
2001 | 2243 | { |
2002 | 2244 | Socks4Cmd.Ver = SOCKS4_VER; |
2003 | 2245 | Socks4Cmd.Cmd = SOCKS4_CMD_BIND; |
2004 | - Socks4Cmd.Port = CurSockAddr.sin_port; | |
2005 | - Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; | |
2246 | + // IPv6対応 | |
2247 | +// Socks4Cmd.Port = CurSockAddr.sin_port; | |
2248 | +// Socks4Cmd.AdrsInt = CurSockAddr.sin_addr.s_addr; | |
2249 | + Socks4Cmd.Port = CurSockAddrIPv4.sin_port; | |
2250 | + Socks4Cmd.AdrsInt = CurSockAddrIPv4.sin_addr.s_addr; | |
2006 | 2251 | strcpy(Socks4Cmd.UserID, FwallUser); |
2007 | 2252 | Len = offsetof(SOCKS4CMD, UserID) + strlen(FwallUser) + 1; |
2008 | 2253 |
@@ -2021,7 +2266,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2021 | 2266 | } |
2022 | 2267 | |
2023 | 2268 | if(Socks4Reply.AdrsInt == 0) |
2024 | - Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; | |
2269 | + // IPv6対応 | |
2270 | +// Socks4Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; | |
2271 | + Socks4Reply.AdrsInt = SocksSockAddrIPv4.sin_addr.s_addr; | |
2025 | 2272 | |
2026 | 2273 | a = (char *)&Socks4Reply.AdrsInt; |
2027 | 2274 | p = (char *)&Socks4Reply.Port; |
@@ -2031,7 +2278,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2031 | 2278 | { |
2032 | 2279 | /*===== SOCKS5を使う =====*/ |
2033 | 2280 | DoPrintf("Use SOCKS5 BIND"); |
2034 | - if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) | |
2281 | + // IPv6対応 | |
2282 | +// if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddr, sizeof(SocksSockAddr), CancelCheckWork) != SOCKET_ERROR) | |
2283 | + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv4, sizeof(SocksSockAddrIPv4), CancelCheckWork) != SOCKET_ERROR) | |
2035 | 2284 | { |
2036 | 2285 | if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL) |
2037 | 2286 | { |
@@ -2040,7 +2289,9 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2040 | 2289 | return(listen_skt); |
2041 | 2290 | } |
2042 | 2291 | |
2043 | - Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); | |
2292 | + // IPv6対応 | |
2293 | +// Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddr.sin_addr.s_addr, DomainName, CurSockAddr.sin_port); | |
2294 | + Len = Socks5MakeCmdPacket(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, CurSockAddrIPv4.sin_addr.s_addr, DomainName, CurSockAddrIPv4.sin_port); | |
2044 | 2295 | |
2045 | 2296 | Socks5Reply.Result = -1; |
2046 | 2297 | // 同時接続対応 |
@@ -2056,11 +2307,15 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2056 | 2307 | listen_skt = INVALID_SOCKET; |
2057 | 2308 | } |
2058 | 2309 | |
2059 | - if(Socks5Reply.AdrsInt == 0) | |
2060 | - Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; | |
2310 | + // IPv6対応 | |
2311 | +// if(Socks5Reply.AdrsInt == 0) | |
2312 | +// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; | |
2061 | 2313 | |
2062 | - a = (char *)&Socks5Reply.AdrsInt; | |
2063 | - p = (char *)&Socks5Reply.Port; | |
2314 | + // IPv6対応 | |
2315 | +// a = (char *)&Socks5Reply.AdrsInt; | |
2316 | +// p = (char *)&Socks5Reply.Port; | |
2317 | + a = (char *)&Socks5Reply._dummy[0]; | |
2318 | + p = (char *)&Socks5Reply._dummy[4]; | |
2064 | 2319 | } |
2065 | 2320 | } |
2066 | 2321 | else |
@@ -2136,6 +2391,140 @@ SOCKET GetFTPListenSocket(SOCKET ctrl_skt, int *CancelCheckWork) | ||
2136 | 2391 | } |
2137 | 2392 | |
2138 | 2393 | |
2394 | +SOCKET GetFTPListenSocketIPv6(SOCKET ctrl_skt, int *CancelCheckWork) | |
2395 | +{ | |
2396 | + SOCKET listen_skt; | |
2397 | + int iLength; | |
2398 | + char *a,*p; | |
2399 | + struct sockaddr_in6 saCtrlAddr; | |
2400 | + struct sockaddr_in6 saTmpAddr; | |
2401 | + SOCKS5REQUEST Socks5Cmd; | |
2402 | + SOCKS5REPLY Socks5Reply; | |
2403 | + | |
2404 | + int Len; | |
2405 | + int Fwall; | |
2406 | + | |
2407 | + char Adrs[40]; | |
2408 | + | |
2409 | + Fwall = FWALL_NONE; | |
2410 | + if(AskHostFireWall() == YES) | |
2411 | + Fwall = FwallType; | |
2412 | + | |
2413 | + if((listen_skt = do_socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) != INVALID_SOCKET) | |
2414 | + { | |
2415 | + if((Fwall == FWALL_SOCKS5_NOAUTH) || (Fwall == FWALL_SOCKS5_USER)) | |
2416 | + { | |
2417 | + /*===== SOCKS5を使う =====*/ | |
2418 | + DoPrintf("Use SOCKS5 BIND"); | |
2419 | + if(do_connect(listen_skt, (struct sockaddr *)&SocksSockAddrIPv6, sizeof(SocksSockAddrIPv6), CancelCheckWork) != SOCKET_ERROR) | |
2420 | + { | |
2421 | + if(Socks5SelMethod(listen_skt, CancelCheckWork) == FFFTP_FAIL) | |
2422 | + { | |
2423 | + DoClose(listen_skt); | |
2424 | + listen_skt = INVALID_SOCKET; | |
2425 | + return(listen_skt); | |
2426 | + } | |
2427 | + | |
2428 | + Len = Socks5MakeCmdPacketIPv6(&Socks5Cmd, SOCKS5_CMD_BIND, UseIPadrs, (char*)&CurSockAddrIPv6.sin6_addr, DomainName, CurSockAddrIPv6.sin6_port); | |
2429 | + | |
2430 | + Socks5Reply.Result = -1; | |
2431 | + // 同時接続対応 | |
2432 | +// if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || | |
2433 | +// (Socks5GetCmdReply(listen_skt, &Socks5Reply) != FFFTP_SUCCESS) || | |
2434 | +// (Socks5Reply.Result != SOCKS5_RES_OK)) | |
2435 | + if((SocksSendCmd(listen_skt, &Socks5Cmd, Len, CancelCheckWork) != FFFTP_SUCCESS) || | |
2436 | + (Socks5GetCmdReply(listen_skt, &Socks5Reply, CancelCheckWork) != FFFTP_SUCCESS) || | |
2437 | + (Socks5Reply.Result != SOCKS5_RES_OK)) | |
2438 | + { | |
2439 | + SetTaskMsg(MSGJPN029, Socks5Reply.Result); | |
2440 | + DoClose(listen_skt); | |
2441 | + listen_skt = INVALID_SOCKET; | |
2442 | + } | |
2443 | + | |
2444 | + // IPv6対応 | |
2445 | +// if(Socks5Reply.AdrsInt == 0) | |
2446 | +// Socks5Reply.AdrsInt = SocksSockAddr.sin_addr.s_addr; | |
2447 | + | |
2448 | + // IPv6対応 | |
2449 | +// a = (char *)&Socks5Reply.AdrsInt; | |
2450 | +// p = (char *)&Socks5Reply.Port; | |
2451 | + a = (char *)&Socks5Reply._dummy[0]; | |
2452 | + p = (char *)&Socks5Reply._dummy[16]; | |
2453 | + } | |
2454 | + } | |
2455 | + else | |
2456 | + { | |
2457 | + /*===== SOCKSを使わない =====*/ | |
2458 | + DoPrintf("Use normal BIND"); | |
2459 | + saCtrlAddr.sin6_port = htons(0); | |
2460 | + saCtrlAddr.sin6_family = AF_INET6; | |
2461 | + memset(&saCtrlAddr.sin6_addr, 0, 16); | |
2462 | + | |
2463 | + if(bind(listen_skt, (struct sockaddr *)&saCtrlAddr, sizeof(struct sockaddr_in6)) != SOCKET_ERROR) | |
2464 | + { | |
2465 | + iLength = sizeof(saCtrlAddr); | |
2466 | + if(getsockname(listen_skt, (struct sockaddr *)&saCtrlAddr, &iLength) != SOCKET_ERROR) | |
2467 | + { | |
2468 | + if(do_listen(listen_skt, 1) == 0) | |
2469 | + { | |
2470 | + iLength = sizeof(saTmpAddr); | |
2471 | + if(getsockname(ctrl_skt, (struct sockaddr *)&saTmpAddr, &iLength) == SOCKET_ERROR) | |
2472 | + ReportWSError("getsockname", WSAGetLastError()); | |
2473 | + | |
2474 | + a = (char *)&saTmpAddr.sin6_addr; | |
2475 | + p = (char *)&saCtrlAddr.sin6_port; | |
2476 | + } | |
2477 | + else | |
2478 | + { | |
2479 | + ReportWSError("listen", WSAGetLastError()); | |
2480 | + do_closesocket(listen_skt); | |
2481 | + listen_skt = INVALID_SOCKET; | |
2482 | + } | |
2483 | + } | |
2484 | + else | |
2485 | + { | |
2486 | + ReportWSError("getsockname", WSAGetLastError()); | |
2487 | + do_closesocket(listen_skt); | |
2488 | + listen_skt = INVALID_SOCKET; | |
2489 | + } | |
2490 | + } | |
2491 | + else | |
2492 | + { | |
2493 | + ReportWSError("bind", WSAGetLastError()); | |
2494 | + do_closesocket(listen_skt); | |
2495 | + listen_skt = INVALID_SOCKET; | |
2496 | + } | |
2497 | + | |
2498 | + if(listen_skt == INVALID_SOCKET) | |
2499 | + SetTaskMsg(MSGJPN030); | |
2500 | + } | |
2501 | + } | |
2502 | + else | |
2503 | + ReportWSError("socket create", WSAGetLastError()); | |
2504 | + | |
2505 | + if(listen_skt != INVALID_SOCKET) | |
2506 | + { | |
2507 | +#define US(w) (((int)w)&0xffff) | |
2508 | + // 同時接続対応 | |
2509 | +// if((command(ctrl_skt,NULL, &CancelFlg, "PORT %d,%d,%d,%d,%d,%d", | |
2510 | +// UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]), | |
2511 | +// UC(p[0]), UC(p[1])) / 100) != FTP_COMPLETE) | |
2512 | + if((command(ctrl_skt,NULL, CancelCheckWork, "EPRT |2|%s|%d|", | |
2513 | + AddressToStringIPv6(Adrs, a), | |
2514 | + US(p[0])) / 100) != FTP_COMPLETE) | |
2515 | + { | |
2516 | + SetTaskMsg(MSGJPN031); | |
2517 | + do_closesocket(listen_skt); | |
2518 | + listen_skt = INVALID_SOCKET; | |
2519 | + } | |
2520 | +// else | |
2521 | +// DoPrintf("Skt=%u : listener %s port %u",listen_skt,inet_ntoa(saCtrlAddr.sin_addr),ntohs(saCtrlAddr.sin_port)); | |
2522 | + } | |
2523 | + | |
2524 | + return(listen_skt); | |
2525 | +} | |
2526 | + | |
2527 | + | |
2139 | 2528 | /*----- ホストへ接続処理中かどうかを返す--------------------------------------- |
2140 | 2529 | * |
2141 | 2530 | * Parameter |
@@ -2229,6 +2618,44 @@ static int Socks5MakeCmdPacket(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, ulo | ||
2229 | 2618 | } |
2230 | 2619 | |
2231 | 2620 | |
2621 | +// IPv6対応 | |
2622 | +static int Socks5MakeCmdPacketIPv6(SOCKS5REQUEST *Packet, char Cmd, int ValidIP, char *IP, char *Host, ushort Port) | |
2623 | +{ | |
2624 | + uchar *Pos; | |
2625 | + int Len; | |
2626 | + int TotalLen; | |
2627 | + | |
2628 | + Pos = (uchar *)Packet; | |
2629 | + Pos += SOCKS5REQUEST_SIZE; | |
2630 | + TotalLen = SOCKS5REQUEST_SIZE + 2; /* +2はポートの分 */ | |
2631 | + | |
2632 | + Packet->Ver = SOCKS5_VER; | |
2633 | + Packet->Cmd = Cmd; | |
2634 | + Packet->Rsv = 0; | |
2635 | + if(ValidIP == YES) | |
2636 | + { | |
2637 | + /* IPアドレスを指定 */ | |
2638 | + Packet->Type = SOCKS5_ADRS_IPV6; | |
2639 | + memcpy(Pos, IP, 16); | |
2640 | + Pos += 16; | |
2641 | + TotalLen += 16; | |
2642 | + } | |
2643 | + else | |
2644 | + { | |
2645 | + /* ホスト名を指定 */ | |
2646 | + Packet->Type = SOCKS5_ADRS_NAME; | |
2647 | + Len = strlen(Host); | |
2648 | + *Pos++ = Len; | |
2649 | + strcpy(Pos, Host); | |
2650 | + Pos += Len; | |
2651 | + TotalLen += Len + 1; | |
2652 | + } | |
2653 | + *((ushort *)Pos) = Port; | |
2654 | + | |
2655 | + return(TotalLen); | |
2656 | +} | |
2657 | + | |
2658 | + | |
2232 | 2659 | /*----- SOCKSのコマンドを送る ------------------------------------------------- |
2233 | 2660 | * |
2234 | 2661 | * Parameter |
@@ -2281,7 +2708,7 @@ static int Socks5GetCmdReply(SOCKET Socket, SOCKS5REPLY *Packet, int *CancelChec | ||
2281 | 2708 | if(Packet->Type == SOCKS5_ADRS_IPV4) |
2282 | 2709 | Len = 4 + 2; |
2283 | 2710 | else if(Packet->Type == SOCKS5_ADRS_IPV6) |
2284 | - Len = 6 + 2; | |
2711 | + Len = 16 + 2; | |
2285 | 2712 | else |
2286 | 2713 | { |
2287 | 2714 | // 同時接続対応 |
@@ -2496,6 +2923,11 @@ int AskUseMLSD(void) | ||
2496 | 2923 | } |
2497 | 2924 | |
2498 | 2925 | // IPv6対応 |
2926 | +int AskInetFamily(void) | |
2927 | +{ | |
2928 | + return(CurHost.InetFamily); | |
2929 | +} | |
2930 | + | |
2499 | 2931 | int AskUseIPv6(void) |
2500 | 2932 | { |
2501 | 2933 | return(CurHost.UseIPv6); |
@@ -34,6 +34,19 @@ Changes in Ver.1.99 | ||
34 | 34 | -- MLSD command became used for retrieving filenames on appropriate hosts. |
35 | 35 | That is helpful for hosts that do not return filenames properly. |
36 | 36 | |
37 | +-- Enhanced communication routines to reduce waiting time. | |
38 | + | |
39 | +-- Changed to display responses from hosts after decoding as Kanji code of | |
40 | + filenames. | |
41 | + | |
42 | +-- Fixed bugs of arbitrary code execution in saving registry settings to a | |
43 | + file. | |
44 | + | |
45 | +-- Fixed bugs of launching wrong files if correct ones contain no extensions. | |
46 | + | |
47 | +-- Internet Protocol Version 6 became available. | |
48 | + IPv6 will be used when name resolution for IPv4 is unavailable. | |
49 | + | |
37 | 50 | |
38 | 51 | Outline |
39 | 52 | ------- |
@@ -6,6 +6,19 @@ Changes in Ver.1.99 | ||
6 | 6 | -- MLSD command became used for retrieving filenames on appropriate hosts. |
7 | 7 | That is helpful for hosts that do not return filenames properly. |
8 | 8 | |
9 | +-- Enhanced communication routines to reduce waiting time. | |
10 | + | |
11 | +-- Changed to display responses from hosts after decoding as Kanji code of | |
12 | + filenames. | |
13 | + | |
14 | +-- Fixed bugs of arbitrary code execution in saving registry settings to a | |
15 | + file. | |
16 | + | |
17 | +-- Fixed bugs of launching wrong files if correct ones contain no extensions. | |
18 | + | |
19 | +-- Internet Protocol Version 6 became available. | |
20 | + IPv6 will be used when name resolution for IPv4 is unavailable. | |
21 | + | |
9 | 22 | Changes in Ver.1.98c |
10 | 23 | -------------------- |
11 | 24 |
@@ -34,6 +34,21 @@ Ver 1.99 | ||
34 | 34 | @æ¾·éæ¤ÉµÜµ½BLISTR}hÌÉÁèÌt@Cª |
35 | 35 | @ÜÜêÈ¢êÌzXgÅà³µñÅ«éÂ\«ªÈèÜ·B |
36 | 36 | |
37 | +EÊMÌ[`ðÒ¿Ôª¸éæ¤ÉüPµÜµ½B | |
38 | + | |
39 | +EzXgÌðzXgÌt@C¼Ì¿R[hÅfR[hµÄ©çOÉ | |
40 | +@\¦·éæ¤ÉÏXµÜµ½B | |
41 | + | |
42 | +EWXgÌÝèðt@CÉÛ¶·éÆ«ÉCÓÌR[hªÀs³êé | |
43 | +@Â\«ª éoOðC³µÜµ½B | |
44 | + | |
45 | +Eg£qª³¢t@Cð_uNbNµ½êÉIð³ê½àÌÆÙÈé | |
46 | +@t@Cª\¦³êéoOðC³µÜµ½B | |
47 | + | |
48 | +EzXgÆÌÚ±ÉInternet Protocol Version 6iªÌIPv6jªgpÅ«é | |
49 | +@æ¤ÉÈèܵ½B]ÌIPv4żOðªÅ«È¢êÉIPv6ÅÚ±ð | |
50 | +@Ýéæ¤ÉµÜµ½B | |
51 | + | |
37 | 52 | |
38 | 53 | Ver 1.96dÈOÖß·ê |
39 | 54 | ----------------------- |
@@ -6,6 +6,21 @@ FFFTP | ||
6 | 6 | @æ¾·éæ¤ÉµÜµ½BLISTR}hÌÉÁèÌt@Cª |
7 | 7 | @ÜÜêÈ¢êÌzXgÅà³µñÅ«éÂ\«ªÈèÜ·B |
8 | 8 | |
9 | +EÊMÌ[`ðÒ¿Ôª¸éæ¤ÉüPµÜµ½B | |
10 | + | |
11 | +EzXgÌðzXgÌt@C¼Ì¿R[hÅfR[hµÄ©çOÉ | |
12 | +@\¦·éæ¤ÉÏXµÜµ½B | |
13 | + | |
14 | +EWXgÌÝèðt@CÉÛ¶·éÆ«ÉCÓÌR[hªÀs³êé | |
15 | +@Â\«ª éoOðC³µÜµ½B | |
16 | + | |
17 | +Eg£qª³¢t@Cð_uNbNµ½êÉIð³ê½àÌÆÙÈé | |
18 | +@t@Cª\¦³êéoOðC³µÜµ½B | |
19 | + | |
20 | +EzXgÆÌÚ±ÉInternet Protocol Version 6iªÌIPv6jªgpÅ«é | |
21 | +@æ¤ÉÈèܵ½B]ÌIPv4żOðªÅ«È¢êÉIPv6ÅÚ±ð | |
22 | +@Ýéæ¤ÉµÜµ½B | |
23 | + | |
9 | 24 | ¡Ver 1.98c |
10 | 25 | |
11 | 26 | Eú{êhC¼ÌzXgÖÌÚ±ÉAhXðPunycodeÖÏ·µÄ©ç |
@@ -43,7 +43,7 @@ | ||
43 | 43 | #include <time.h> |
44 | 44 | // IPv6対応 |
45 | 45 | //#include <winsock.h> |
46 | -#include <winsock2.h> | |
46 | +#include <ws2tcpip.h> | |
47 | 47 | #include <windowsx.h> |
48 | 48 | #include <commctrl.h> |
49 | 49 | #include <process.h> |
@@ -104,7 +104,11 @@ static int SetUploadResume(TRANSPACKET *Pkt, int ProcMode, LONGLONG Size, int *M | ||
104 | 104 | static LRESULT CALLBACK TransDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam); |
105 | 105 | static void DispTransferStatus(HWND hWnd, int End, TRANSPACKET *Pkt); |
106 | 106 | static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int Info); |
107 | -static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max); | |
107 | +// IPv6対応 | |
108 | +//static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max); | |
109 | +static int GetAdrsAndPort(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max); | |
110 | +static int GetAdrsAndPortIPv4(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max); | |
111 | +static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max); | |
108 | 112 | static int IsSpecialDevice(char *Fname); |
109 | 113 | static int MirrorDelNotify(int Cur, int Notify, TRANSPACKET *Pkt); |
110 | 114 | static BOOL CALLBACK MirrorDeleteDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); |
@@ -1316,7 +1320,10 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) | ||
1316 | 1320 | SOCKET listen_socket = INVALID_SOCKET; // data listen socket |
1317 | 1321 | char Buf[1024]; |
1318 | 1322 | int CreateMode; |
1319 | - struct sockaddr_in saSockAddr1; | |
1323 | + // IPv6対応 | |
1324 | +// struct sockaddr_in saSockAddr1; | |
1325 | + struct sockaddr_in saSockAddrIPv4; | |
1326 | + struct sockaddr_in6 saSockAddrIPv6; | |
1320 | 1327 | char Reply[ERR_MSG_LEN+7]; |
1321 | 1328 | |
1322 | 1329 | if((listen_socket = GetFTPListenSocket(Pkt->ctrl_skt, CancelCheckWork)) != INVALID_SOCKET) |
@@ -1331,8 +1338,20 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) | ||
1331 | 1338 | // if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL) |
1332 | 1339 | if(SocksGet2ndBindReply(listen_socket, &data_socket, CancelCheckWork) == FFFTP_FAIL) |
1333 | 1340 | { |
1334 | - iLength = sizeof(saSockAddr1); | |
1335 | - data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength); | |
1341 | + // IPv6対応 | |
1342 | +// iLength = sizeof(saSockAddr1); | |
1343 | +// data_socket = do_accept(listen_socket, (struct sockaddr *)&saSockAddr1, (int *)&iLength); | |
1344 | + switch(AskInetFamily()) | |
1345 | + { | |
1346 | + case AF_INET: | |
1347 | + iLength=sizeof(saSockAddrIPv4); | |
1348 | + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv4, (int *)&iLength); | |
1349 | + break; | |
1350 | + case AF_INET6: | |
1351 | + iLength=sizeof(saSockAddrIPv6); | |
1352 | + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv6, (int *)&iLength); | |
1353 | + break; | |
1354 | + } | |
1336 | 1355 | |
1337 | 1356 | if(shutdown(listen_socket, 1) != 0) |
1338 | 1357 | ReportWSError("shutdown listen", WSAGetLastError()); |
@@ -1345,7 +1364,19 @@ static int DownLoadNonPassive(TRANSPACKET *Pkt, int *CancelCheckWork) | ||
1345 | 1364 | iRetCode = 500; |
1346 | 1365 | } |
1347 | 1366 | else |
1348 | - DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); | |
1367 | + // IPv6対応 | |
1368 | +// DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); | |
1369 | + { | |
1370 | + switch(AskInetFamily()) | |
1371 | + { | |
1372 | + case AF_INET: | |
1373 | + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddrIPv4.sin_addr), ntohs(saSockAddrIPv4.sin_port)); | |
1374 | + break; | |
1375 | + case AF_INET6: | |
1376 | + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet6_ntoa(saSockAddrIPv6.sin6_addr), ntohs(saSockAddrIPv6.sin6_port)); | |
1377 | + break; | |
1378 | + } | |
1379 | + } | |
1349 | 1380 | } |
1350 | 1381 | |
1351 | 1382 | if(data_socket != INVALID_SOCKET) |
@@ -1403,15 +1434,29 @@ static int DownLoadPassive(TRANSPACKET *Pkt, int *CancelCheckWork) | ||
1403 | 1434 | SOCKET data_socket = INVALID_SOCKET; // data channel socket |
1404 | 1435 | char Buf[1024]; |
1405 | 1436 | int CreateMode; |
1406 | - char Adrs[20]; | |
1437 | + // IPv6対応 | |
1438 | +// char Adrs[20]; | |
1439 | + char Adrs[40]; | |
1407 | 1440 | int Port; |
1408 | 1441 | int Flg; |
1409 | 1442 | char Reply[ERR_MSG_LEN+7]; |
1410 | 1443 | |
1411 | - iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); | |
1444 | + // IPv6対応 | |
1445 | +// iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); | |
1446 | + switch(AskInetFamily()) | |
1447 | + { | |
1448 | + case AF_INET: | |
1449 | + iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "PASV"); | |
1450 | + break; | |
1451 | + case AF_INET6: | |
1452 | + iRetCode = command(Pkt->ctrl_skt, Buf, CancelCheckWork, "EPSV"); | |
1453 | + break; | |
1454 | + } | |
1412 | 1455 | if(iRetCode/100 == FTP_COMPLETE) |
1413 | 1456 | { |
1414 | - if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) | |
1457 | + // IPv6対応 | |
1458 | +// if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) | |
1459 | + if(GetAdrsAndPort(Pkt->ctrl_skt, Buf, Adrs, &Port, 39) == FFFTP_SUCCESS) | |
1415 | 1460 | { |
1416 | 1461 | if((data_socket = connectsock(Adrs, Port, MSGJPN091, CancelCheckWork)) != INVALID_SOCKET) |
1417 | 1462 | { |
@@ -2475,7 +2520,10 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) | ||
2475 | 2520 | SOCKET data_socket = INVALID_SOCKET; // data channel socket |
2476 | 2521 | SOCKET listen_socket = INVALID_SOCKET; // data listen socket |
2477 | 2522 | char Buf[1024]; |
2478 | - struct sockaddr_in saSockAddr1; | |
2523 | + // IPv6対応 | |
2524 | +// struct sockaddr_in saSockAddr1; | |
2525 | + struct sockaddr_in saSockAddrIPv4; | |
2526 | + struct sockaddr_in6 saSockAddrIPv6; | |
2479 | 2527 | int Resume; |
2480 | 2528 | char Reply[ERR_MSG_LEN+7]; |
2481 | 2529 |
@@ -2498,8 +2546,20 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) | ||
2498 | 2546 | // if(SocksGet2ndBindReply(listen_socket, &data_socket) == FFFTP_FAIL) |
2499 | 2547 | if(SocksGet2ndBindReply(listen_socket, &data_socket, &Canceled[Pkt->ThreadCount]) == FFFTP_FAIL) |
2500 | 2548 | { |
2501 | - iLength=sizeof(saSockAddr1); | |
2502 | - data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength); | |
2549 | + // IPv6対応 | |
2550 | +// iLength=sizeof(saSockAddr1); | |
2551 | +// data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddr1, (int *)&iLength); | |
2552 | + switch(AskInetFamily()) | |
2553 | + { | |
2554 | + case AF_INET: | |
2555 | + iLength=sizeof(saSockAddrIPv4); | |
2556 | + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv4, (int *)&iLength); | |
2557 | + break; | |
2558 | + case AF_INET6: | |
2559 | + iLength=sizeof(saSockAddrIPv6); | |
2560 | + data_socket = do_accept(listen_socket,(struct sockaddr *)&saSockAddrIPv6, (int *)&iLength); | |
2561 | + break; | |
2562 | + } | |
2503 | 2563 | |
2504 | 2564 | if(shutdown(listen_socket, 1) != 0) |
2505 | 2565 | ReportWSError("shutdown listen", WSAGetLastError()); |
@@ -2512,7 +2572,19 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) | ||
2512 | 2572 | iRetCode = 500; |
2513 | 2573 | } |
2514 | 2574 | else |
2515 | - DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); | |
2575 | + // IPv6対応 | |
2576 | +// DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddr1.sin_addr), ntohs(saSockAddr1.sin_port)); | |
2577 | + { | |
2578 | + switch(AskInetFamily()) | |
2579 | + { | |
2580 | + case AF_INET: | |
2581 | + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet_ntoa(saSockAddrIPv4.sin_addr), ntohs(saSockAddrIPv4.sin_port)); | |
2582 | + break; | |
2583 | + case AF_INET6: | |
2584 | + DoPrintf("Skt=%u : accept from %s port %u", data_socket, inet6_ntoa(saSockAddrIPv6.sin6_addr), ntohs(saSockAddrIPv6.sin6_port)); | |
2585 | + break; | |
2586 | + } | |
2587 | + } | |
2516 | 2588 | } |
2517 | 2589 | |
2518 | 2590 | if(data_socket != INVALID_SOCKET) |
@@ -2566,7 +2638,9 @@ static int UpLoadPassive(TRANSPACKET *Pkt) | ||
2566 | 2638 | int iRetCode; |
2567 | 2639 | SOCKET data_socket = INVALID_SOCKET; // data channel socket |
2568 | 2640 | char Buf[1024]; |
2569 | - char Adrs[20]; | |
2641 | + // IPv6対応 | |
2642 | +// char Adrs[20]; | |
2643 | + char Adrs[40]; | |
2570 | 2644 | int Port; |
2571 | 2645 | int Flg; |
2572 | 2646 | int Resume; |
@@ -2574,10 +2648,22 @@ static int UpLoadPassive(TRANSPACKET *Pkt) | ||
2574 | 2648 | |
2575 | 2649 | // 同時接続対応 |
2576 | 2650 | // iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled, "PASV"); |
2577 | - iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); | |
2651 | + // IPv6対応 | |
2652 | +// iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); | |
2653 | + switch(AskInetFamily()) | |
2654 | + { | |
2655 | + case AF_INET: | |
2656 | + iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "PASV"); | |
2657 | + break; | |
2658 | + case AF_INET6: | |
2659 | + iRetCode = command(Pkt->ctrl_skt, Buf, &Canceled[Pkt->ThreadCount], "EPSV"); | |
2660 | + break; | |
2661 | + } | |
2578 | 2662 | if(iRetCode/100 == FTP_COMPLETE) |
2579 | 2663 | { |
2580 | - if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) | |
2664 | + // IPv6対応 | |
2665 | +// if(GetAdrsAndPort(Buf, Adrs, &Port, 19) == FFFTP_SUCCESS) | |
2666 | + if(GetAdrsAndPort(Pkt->ctrl_skt, Buf, Adrs, &Port, 39) == FFFTP_SUCCESS) | |
2581 | 2667 | { |
2582 | 2668 | // 同時接続対応 |
2583 | 2669 | // if((data_socket = connectsock(Adrs, Port, MSGJPN109, &Canceled)) != INVALID_SOCKET) |
@@ -3675,7 +3761,26 @@ static void DispTransFileInfo(TRANSPACKET *Pkt, char *Title, int SkipButton, int | ||
3675 | 3761 | * FFFTP_SUCCESS/FFFTP_FAIL |
3676 | 3762 | *----------------------------------------------------------------------------*/ |
3677 | 3763 | |
3678 | -static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) | |
3764 | +static int GetAdrsAndPort(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max) | |
3765 | +{ | |
3766 | + int Result; | |
3767 | + Result = FFFTP_FAIL; | |
3768 | + switch(AskInetFamily()) | |
3769 | + { | |
3770 | + case AF_INET: | |
3771 | + Result = GetAdrsAndPortIPv4(Skt, Str, Adrs, Port, Max); | |
3772 | + break; | |
3773 | + case AF_INET6: | |
3774 | + Result = GetAdrsAndPortIPv6(Skt, Str, Adrs, Port, Max); | |
3775 | + break; | |
3776 | + } | |
3777 | + return Result; | |
3778 | +} | |
3779 | + | |
3780 | + | |
3781 | +// IPv6対応 | |
3782 | +//static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) | |
3783 | +static int GetAdrsAndPortIPv4(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max) | |
3679 | 3784 | { |
3680 | 3785 | char *Pos; |
3681 | 3786 | char *Btm; |
@@ -3742,49 +3847,55 @@ static int GetAdrsAndPort(char *Str, char *Adrs, int *Port, int Max) | ||
3742 | 3847 | |
3743 | 3848 | |
3744 | 3849 | // IPv6対応 |
3745 | -static int GetAdrsAndPortIPv6(char *Str, char *Adrs, int *Port, int Max, short *Family) | |
3850 | +static int GetAdrsAndPortIPv6(SOCKET Skt, char *Str, char *Adrs, int *Port, int Max) | |
3746 | 3851 | { |
3747 | 3852 | char *Pos; |
3748 | 3853 | char *Btm; |
3749 | 3854 | int Sts; |
3855 | + int i; | |
3856 | + struct sockaddr_in6 SockAddr; | |
3750 | 3857 | |
3751 | 3858 | Sts = FFFTP_FAIL; |
3752 | 3859 | |
3753 | - Pos = strchr(Str, '|'); | |
3754 | - if(Pos != NULL) | |
3860 | + Btm = strchr(Str, '('); | |
3861 | + if(Btm != NULL) | |
3755 | 3862 | { |
3756 | - Pos++; | |
3757 | - Btm = strchr(Pos, '|'); | |
3863 | + Btm++; | |
3864 | + Btm = strchr(Btm, '|'); | |
3758 | 3865 | if(Btm != NULL) |
3759 | 3866 | { |
3760 | - switch(atoi(Pos)) | |
3761 | - { | |
3762 | - case 1: | |
3763 | - *Family = AF_INET; | |
3764 | - break; | |
3765 | - case 2: | |
3766 | - *Family = AF_INET6; | |
3767 | - break; | |
3768 | - } | |
3769 | 3867 | Pos = Btm + 1; |
3770 | 3868 | Btm = strchr(Pos, '|'); |
3771 | 3869 | if(Btm != NULL) |
3772 | 3870 | { |
3773 | - if((Btm - Pos) <= Max) | |
3871 | + Pos = Btm + 1; | |
3872 | + Btm = strchr(Pos, '|'); | |
3873 | + if(Btm != NULL) | |
3774 | 3874 | { |
3775 | - if((Btm - Pos) > 0) | |
3875 | + if((Btm - Pos) <= Max) | |
3776 | 3876 | { |
3777 | - strncpy(Adrs, Pos, Btm - Pos); | |
3778 | - *(Adrs + (Btm - Pos)) = NUL; | |
3779 | - } | |
3877 | + if((Btm - Pos) > 0) | |
3878 | + { | |
3879 | + strncpy(Adrs, Pos, Btm - Pos); | |
3880 | + *(Adrs + (Btm - Pos)) = NUL; | |
3881 | + } | |
3882 | + else | |
3883 | + { | |
3884 | + i = sizeof(SockAddr); | |
3885 | + if(getpeername(Skt, (struct sockaddr*)&SockAddr, &i) != SOCKET_ERROR) | |
3886 | + AddressToStringIPv6(Adrs, &SockAddr.sin6_addr); | |
3887 | + } | |
3780 | 3888 | |
3781 | - Pos = Btm + 1; | |
3782 | - Btm = strchr(Pos, '|'); | |
3783 | - if(Btm != NULL) | |
3784 | - { | |
3785 | - Btm++; | |
3786 | - *Port = atoi(Pos); | |
3787 | - Sts = FFFTP_SUCCESS; | |
3889 | + Pos = Btm + 1; | |
3890 | + Btm = strchr(Pos, '|'); | |
3891 | + if(Btm != NULL) | |
3892 | + { | |
3893 | + Btm++; | |
3894 | + *Port = atoi(Pos); | |
3895 | + Btm = strchr(Btm, ')'); | |
3896 | + if(Btm != NULL) | |
3897 | + Sts = FFFTP_SUCCESS; | |
3898 | + } | |
3788 | 3899 | } |
3789 | 3900 | } |
3790 | 3901 | } |
@@ -1328,6 +1328,7 @@ void CopyDefaultHost(HOSTDATA *Set) | ||
1328 | 1328 | Set->Feature = 0; |
1329 | 1329 | Set->UseMLSD = YES; |
1330 | 1330 | // IPv6対応 |
1331 | + Set->InetFamily = AF_UNSPEC; | |
1331 | 1332 | Set->UseIPv6 = YES; |
1332 | 1333 | return; |
1333 | 1334 | } |
@@ -182,7 +182,8 @@ void DispFileProperty(char *Fname) | ||
182 | 182 | { |
183 | 183 | SHELLEXECUTEINFO sInfo; |
184 | 184 | // 異なるファイルが表示されるバグ修正 |
185 | - // 詳細は不明だが末尾に半角スペースを置くと拡張子の補完がされなくなる | |
185 | + // UNCでない場合に末尾に半角スペースを置くと拡張子の補完がされなくなる | |
186 | + // 現在UNC対応の予定は無い | |
186 | 187 | char Fname2[FMAX_PATH+1]; |
187 | 188 | |
188 | 189 | memset(&sInfo, NUL, sizeof(SHELLEXECUTEINFO)); |
@@ -2351,7 +2351,6 @@ static int ReadStringFromReg(void *Handle, char *Name, char *Str, DWORD Size) | ||
2351 | 2351 | Sts = FFFTP_SUCCESS; |
2352 | 2352 | if(!CheckStringM(Str)) |
2353 | 2353 | break; |
2354 | - Str = Str; | |
2355 | 2354 | // UTF-8ではない可能性がある |
2356 | 2355 | // Shift_JISとみなす |
2357 | 2356 | case KANJI_SJIS: |
@@ -651,7 +651,53 @@ static int UnRegistAsyncTableDbase(HANDLE Async) | ||
651 | 651 | |
652 | 652 | |
653 | 653 | |
654 | -struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork) | |
654 | +// IPv6対応 | |
655 | +//struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *CancelCheckWork) | |
656 | +struct hostent *do_gethostbynameIPv4(const char *Name, char *Buf, int Len, int *CancelCheckWork) | |
657 | +{ | |
658 | +#if USE_THIS | |
659 | + struct hostent *Ret; | |
660 | + HANDLE hAsync; | |
661 | + int Error; | |
662 | + | |
663 | +#if DBG_MSG | |
664 | + DoPrintf("# Start gethostbyname"); | |
665 | +#endif | |
666 | + Ret = NULL; | |
667 | + // 同時接続対応 | |
668 | +// *CancelCheckWork = NO; | |
669 | + | |
670 | + // UTF-8対応 | |
671 | +// hAsync = WSAAsyncGetHostByName(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); | |
672 | + hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); | |
673 | + if(hAsync != NULL) | |
674 | + { | |
675 | + RegistAsyncTableDbase(hAsync); | |
676 | + while((*CancelCheckWork == NO) && (AskAsyncDoneDbase(hAsync, &Error) != YES)) | |
677 | + { | |
678 | + Sleep(1); | |
679 | + if(BackgrndMessageProc() == YES) | |
680 | + *CancelCheckWork = YES; | |
681 | + } | |
682 | + | |
683 | + if(*CancelCheckWork == YES) | |
684 | + { | |
685 | + WSACancelAsyncRequest(hAsync); | |
686 | + } | |
687 | + else if(Error == 0) | |
688 | + { | |
689 | + Ret = (struct hostent *)Buf; | |
690 | + } | |
691 | + UnRegistAsyncTableDbase(hAsync); | |
692 | + } | |
693 | + return(Ret); | |
694 | +#else | |
695 | + return(gethostbyname(Name)); | |
696 | +#endif | |
697 | +} | |
698 | + | |
699 | + | |
700 | +struct hostent *do_gethostbynameIPv6(const char *Name, char *Buf, int Len, int *CancelCheckWork) | |
655 | 701 | { |
656 | 702 | #if USE_THIS |
657 | 703 | struct hostent *Ret; |
@@ -667,9 +713,7 @@ struct hostent *do_gethostbyname(const char *Name, char *Buf, int Len, int *Canc | ||
667 | 713 | |
668 | 714 | // UTF-8対応 |
669 | 715 | // hAsync = WSAAsyncGetHostByName(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); |
670 | - // IPv6対応 | |
671 | -// hAsync = WSAAsyncGetHostByNameM(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len); | |
672 | - hAsync = WSAAsyncGetHostByNameIPv6M(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len, AF_INET); | |
716 | + hAsync = WSAAsyncGetHostByNameIPv6M(hWndSocket, WM_ASYNC_DBASE, Name, Buf, Len, AF_INET6); | |
673 | 717 | if(hAsync != NULL) |
674 | 718 | { |
675 | 719 | RegistAsyncTableDbase(hAsync); |
@@ -1319,6 +1363,113 @@ int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle) | ||
1319 | 1363 | return Result; |
1320 | 1364 | } |
1321 | 1365 | |
1366 | +char* AddressToStringIPv6(char* str, void* in6) | |
1367 | +{ | |
1368 | + char* pResult; | |
1369 | + unsigned char* p; | |
1370 | + int MaxZero; | |
1371 | + int MaxZeroLen; | |
1372 | + int i; | |
1373 | + int j; | |
1374 | + char Tmp[5]; | |
1375 | + pResult = str; | |
1376 | + p = (unsigned char*)in6; | |
1377 | + MaxZero = 8; | |
1378 | + MaxZeroLen = 1; | |
1379 | + for(i = 0; i < 8; i++) | |
1380 | + { | |
1381 | + for(j = i; j < 8; j++) | |
1382 | + { | |
1383 | + if(p[j * 2] != 0 || p[j * 2 + 1] != 0) | |
1384 | + break; | |
1385 | + } | |
1386 | + if(j - i > MaxZeroLen) | |
1387 | + { | |
1388 | + MaxZero = i; | |
1389 | + MaxZeroLen = j - i; | |
1390 | + } | |
1391 | + } | |
1392 | + strcpy(str, ""); | |
1393 | + for(i = 0; i < 8; i++) | |
1394 | + { | |
1395 | + if(i == MaxZero) | |
1396 | + { | |
1397 | + if(i == 0) | |
1398 | + strcat(str, ":"); | |
1399 | + strcat(str, ":"); | |
1400 | + } | |
1401 | + else if(i < MaxZero || i >= MaxZero + MaxZeroLen) | |
1402 | + { | |
1403 | + sprintf(Tmp, "%x", (((int)p[i * 2] & 0xff) << 8) | ((int)p[i * 2 + 1] & 0xff)); | |
1404 | + strcat(str, Tmp); | |
1405 | + if(i < 7) | |
1406 | + strcat(str, ":"); | |
1407 | + } | |
1408 | + } | |
1409 | + return pResult; | |
1410 | +} | |
1411 | + | |
1412 | +// IPv6対応のinet_ntoa相当の関数 | |
1413 | +// ただしANSI用 | |
1414 | +char* inet6_ntoa(struct in6_addr in6) | |
1415 | +{ | |
1416 | + char* pResult; | |
1417 | + static char Adrs[40]; | |
1418 | + pResult = NULL; | |
1419 | + memset(Adrs, 0, sizeof(Adrs)); | |
1420 | + pResult = AddressToStringIPv6(Adrs, &in6); | |
1421 | + return pResult; | |
1422 | +} | |
1423 | + | |
1424 | +// IPv6対応のinet_addr相当の関数 | |
1425 | +// ただしANSI用 | |
1426 | +struct in6_addr inet6_addr(const char* cp) | |
1427 | +{ | |
1428 | + struct in6_addr Result; | |
1429 | + int AfterZero; | |
1430 | + int i; | |
1431 | + char* p; | |
1432 | + memset(&Result, 0, sizeof(Result)); | |
1433 | + AfterZero = 0; | |
1434 | + for(i = 0; i < 8; i++) | |
1435 | + { | |
1436 | + if(!cp) | |
1437 | + { | |
1438 | + memset(&Result, 0xff, sizeof(Result)); | |
1439 | + break; | |
1440 | + } | |
1441 | + if(i >= AfterZero) | |
1442 | + { | |
1443 | + if(strncmp(cp, ":", 1) == 0) | |
1444 | + { | |
1445 | + cp = cp + 1; | |
1446 | + if(i == 0 && strncmp(cp, ":", 1) == 0) | |
1447 | + cp = cp + 1; | |
1448 | + p = (char*)cp; | |
1449 | + AfterZero = 7; | |
1450 | + while(p = strstr(p, ":")) | |
1451 | + { | |
1452 | + p = p + 1; | |
1453 | + AfterZero--; | |
1454 | + } | |
1455 | + } | |
1456 | + else | |
1457 | + { | |
1458 | + Result.u.Word[i] = (USHORT)strtol(cp, &p, 16); | |
1459 | + Result.u.Word[i] = ((Result.u.Word[i] & 0xff00) >> 8) | ((Result.u.Word[i] & 0x00ff) << 8); | |
1460 | + if(strncmp(p, ":", 1) != 0 && strlen(p) > 0) | |
1461 | + { | |
1462 | + memset(&Result, 0xff, sizeof(Result)); | |
1463 | + break; | |
1464 | + } | |
1465 | + if(cp = strstr(cp, ":")) | |
1466 | + cp = cp + 1; | |
1467 | + } | |
1468 | + } | |
1469 | + } | |
1470 | + return Result; | |
1471 | +} | |
1472 | + | |
1322 | 1473 | // UTF-8対応 |
1323 | 1474 | |
1324 | 1475 | static BOOL ConvertStringToPunycode(LPSTR Output, DWORD Count, LPCSTR Input) |