OSDN Git Service

Fix bugs of routines for IPv6.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Mon, 14 Nov 2011 12:12:33 +0000 (21:12 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Mon, 14 Nov 2011 12:12:33 +0000 (21:12 +0900)
Fix bugs of opening wrong files when they contain no extensions.
Fix bugs of UTF-8 to UTF-16 API bridge.
Fix bugs of treating local filenames.
Modify documents.

39 files changed:
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
bookmark.c
cache.c
clipboard.c
codecnv.c
common.h
connect.c
diskfree.c
dlgsize.c
doc/eng/FFFTP.txt
doc/eng/history.txt
doc/jpn/FFFTP.txt
doc/jpn/history.txt
filelist.c
ftpproc.c
getput.c
history.c
hostman.c
local.c
lvtips.c
main.c
mbswrapper.c
misc.c
option.c
ras.c
regexp.c
registry.c
remote.c
skey.c
socket.c
socketwrapper.c
socketwrapper.h
statuswin.c
taskwin.c
tool.c
toolmenu.c
updatebell.c
wildcard.c

index 819df2f..5a7bf91 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 909b0c0..e7a66aa 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index d674d45..d82fa18 100644 (file)
@@ -31,6 +31,8 @@
 //#define WINVER 0x400\r
 \r
 #define        STRICT\r
 //#define WINVER 0x400\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
diff --git a/cache.c b/cache.c
index b26f1e4..4be6c36 100644 (file)
--- a/cache.c
+++ b/cache.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define        STRICT\r
 /============================================================================*/\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index c12553b..658f178 100644 (file)
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index 2ac55e7..19c4d6b 100644 (file)
--- a/codecnv.c
+++ b/codecnv.c
@@ -31,7 +31,9 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <string.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <mbstring.h>\r
 #include <windowsx.h>\r
 \r
 #include <mbstring.h>\r
 #include <windowsx.h>\r
 \r
index c9a450a..91832f4 100644 (file)
--- a/common.h
+++ b/common.h
@@ -1695,6 +1695,8 @@ int ConvertNum(int x, int Dir, const INTCONVTBL *Tbl, int Num);
 int MoveFileToTrashCan(char *Path);\r
 LONGLONG MakeLongLong(DWORD High, DWORD Low);\r
 char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma);\r
 int MoveFileToTrashCan(char *Path);\r
 LONGLONG MakeLongLong(DWORD High, DWORD Low);\r
 char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma);\r
+// 異なるファイルが表示されるバグ修正\r
+char* MakeDistinguishableFileName(char* Out, char* In);\r
 \r
 /*===== dlgsize.c =====*/\r
 \r
 \r
 /*===== dlgsize.c =====*/\r
 \r
@@ -1751,10 +1753,6 @@ int do_send(SOCKET s, const char *buf, int len, int flags, int *TimeOutErr, int
 void RemoveReceivedData(SOCKET s);\r
 int CheckClosedAndReconnect(void);\r
 void CheckAllEventClosed(void);\r
 void RemoveReceivedData(SOCKET s);\r
 int CheckClosedAndReconnect(void);\r
 void CheckAllEventClosed(void);\r
-// IPv6対応\r
-char* AddressToStringIPv6(char* str, void* in6);\r
-char* inet6_ntoa(struct in6_addr in6);\r
-struct in6_addr inet6_addr(const char* cp);\r
 \r
 /*===== updatebell.c =====*/\r
 \r
 \r
 /*===== updatebell.c =====*/\r
 \r
index 989c026..9e79f94 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -37,7 +37,7 @@
 #include <time.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
 #include <time.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
-#include <ws2tcpip.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
index afc9b2e..1ef974a 100644 (file)
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -35,7 +37,8 @@
 #include <mbstring.h>\r
 #include <malloc.h>\r
 #include <windowsx.h>\r
 #include <mbstring.h>\r
 #include <malloc.h>\r
 #include <windowsx.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
index dcfd65f..691e4e1 100644 (file)
--- a/dlgsize.c
+++ b/dlgsize.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define        STRICT\r
 /============================================================================*/\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index b3ae7da..f031633 100644 (file)
@@ -49,6 +49,10 @@ Changes in Ver.1.99
 \r
 -- Changed to detect encoding of strings in INI file automatically.\r
 \r
 \r
 -- Changed to detect encoding of strings in INI file automatically.\r
 \r
+-- Added settings to reuse connection of the main window for transfer threads.\r
+   This may allow to transfer files successfully as with 1.97b or earlier,\r
+   but sometimes may cause some errors.\r
+\r
 \r
 Outline\r
 -------\r
 \r
 Outline\r
 -------\r
index b683a74..fcbaed7 100644 (file)
@@ -47,6 +47,10 @@ Changes in Ver.1.98c
 \r
 -- Changed size and layout of the window at the first run.\r
 \r
 \r
 -- Changed size and layout of the window at the first run.\r
 \r
+-- Added settings to reuse connection of the main window for transfer threads.\r
+   This may allow to transfer files successfully as with 1.97b or earlier,\r
+   but sometimes may cause some errors.\r
+\r
 Changes in Ver.1.98b\r
 --------------------\r
 \r
 Changes in Ver.1.98b\r
 --------------------\r
 \r
index 29ed96f..a0b5905 100644 (file)
@@ -51,6 +51,10 @@ Ver 1.99
 \r
 \81EINI\83t\83@\83C\83\8b\82Ì\95\8e\9a\97ñ\82Ì\95\8e\9a\83R\81[\83h\82ð\8e©\93®\94»\95Ê\82·\82é\82æ\82¤\82É\95Ï\8dX\82µ\82Ü\82µ\82½\81B\r
 \r
 \r
 \81EINI\83t\83@\83C\83\8b\82Ì\95\8e\9a\97ñ\82Ì\95\8e\9a\83R\81[\83h\82ð\8e©\93®\94»\95Ê\82·\82é\82æ\82¤\82É\95Ï\8dX\82µ\82Ü\82µ\82½\81B\r
 \r
+\81E\83\81\83C\83\93\83E\83B\83\93\83h\83E\82ª\8eg\97p\82µ\82Ä\82¢\82é\90Ú\91±\82ð\93]\91\97\97p\82É\8dÄ\8eg\97p\82·\82é\82½\82ß\82Ì\90Ý\92è\82ð\r
+\81@\92Ç\89Á\82µ\82Ü\82µ\82½\81B\82±\82ê\82É\82æ\82è1.97b\88È\91O\82Å\93]\91\97\89Â\94\\82¾\82Á\82½\82ª1.98\82Å\93]\91\97\95s\94\\82É\r
+\81@\82È\82é\82Æ\82¢\82¤\8fÇ\8fó\82ª\89ü\91P\82³\82ê\82Ü\82·\82ª\81A\95s\8bï\8d\87\82ª\94­\90\82·\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\r
+\r
 \r
 Ver 1.96d\88È\91O\82Ö\96ß\82·\8fê\8d\87\r
 -----------------------\r
 \r
 Ver 1.96d\88È\91O\82Ö\96ß\82·\8fê\8d\87\r
 -----------------------\r
index cc99abd..c61b99a 100644 (file)
@@ -23,6 +23,10 @@ FFFTP
 \r
 \81EINI\83t\83@\83C\83\8b\82Ì\95\8e\9a\97ñ\82Ì\95\8e\9a\83R\81[\83h\82ð\8e©\93®\94»\95Ê\82·\82é\82æ\82¤\82É\95Ï\8dX\82µ\82Ü\82µ\82½\81B\r
 \r
 \r
 \81EINI\83t\83@\83C\83\8b\82Ì\95\8e\9a\97ñ\82Ì\95\8e\9a\83R\81[\83h\82ð\8e©\93®\94»\95Ê\82·\82é\82æ\82¤\82É\95Ï\8dX\82µ\82Ü\82µ\82½\81B\r
 \r
+\81E\83\81\83C\83\93\83E\83B\83\93\83h\83E\82ª\8eg\97p\82µ\82Ä\82¢\82é\90Ú\91±\82ð\93]\91\97\97p\82É\8dÄ\8eg\97p\82·\82é\82½\82ß\82Ì\90Ý\92è\82ð\r
+\81@\92Ç\89Á\82µ\82Ü\82µ\82½\81B\82±\82ê\82É\82æ\82è1.97b\88È\91O\82Å\93]\91\97\89Â\94\\82¾\82Á\82½\82ª1.98\82Å\93]\91\97\95s\94\\82É\r
+\81@\82È\82é\82Æ\82¢\82¤\8fÇ\8fó\82ª\89ü\91P\82³\82ê\82Ü\82·\82ª\81A\95s\8bï\8d\87\82ª\94­\90\82·\82é\89Â\94\\90«\82ª\82 \82è\82Ü\82·\81B\r
+\r
 \81¡Ver 1.98c\r
 \r
 \81E\93ú\96{\8cê\83h\83\81\83C\83\93\96¼\82Ì\83z\83X\83g\82Ö\82Ì\90Ú\91±\8e\9e\82É\83A\83h\83\8c\83X\82ðPunycode\82Ö\95Ï\8a·\82µ\82Ä\82©\82ç\r
 \81¡Ver 1.98c\r
 \r
 \81E\93ú\96{\8cê\83h\83\81\83C\83\93\96¼\82Ì\83z\83X\83g\82Ö\82Ì\90Ú\91±\8e\9e\82É\83A\83h\83\8c\83X\82ðPunycode\82Ö\95Ï\8a·\82µ\82Ä\82©\82ç\r
index 363446d..c3de027 100644 (file)
@@ -31,6 +31,8 @@
 //#define _WIN32_WINNT 0x400\r
 \r
 #define        STRICT\r
 //#define _WIN32_WINNT 0x400\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index e610ad3..648488a 100644 (file)
--- a/ftpproc.c
+++ b/ftpproc.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -2098,7 +2100,9 @@ static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDi
        {\r
                sprintf(TmpString, "%s", Path);\r
 \r
        {\r
                sprintf(TmpString, "%s", Path);\r
 \r
-               if(AskHostType() == HTYPE_VMS)\r
+               // ローカルのファイルのパスの最後の'\\'が消えるバグ修正\r
+//             if(AskHostType() == HTYPE_VMS)\r
+               if(Win == WIN_REMOTE && AskHostType() == HTYPE_VMS)\r
                        ReformToVMSstylePathName(TmpString);\r
 \r
                CurWin = Win;\r
                        ReformToVMSstylePathName(TmpString);\r
 \r
                CurWin = Win;\r
index 0fce875..efb1806 100644 (file)
--- a/getput.c
+++ b/getput.c
@@ -43,7 +43,7 @@
 #include <time.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
 #include <time.h>\r
 // IPv6対応\r
 //#include <winsock.h>\r
-#include <ws2tcpip.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <process.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <process.h>\r
index 0dde682..b17fe89 100644 (file)
--- a/history.c
+++ b/history.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -37,7 +39,8 @@
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
index 1638e70..7e7026e 100644 (file)
--- a/hostman.c
+++ b/hostman.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define        STRICT\r
 /============================================================================*/\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
diff --git a/local.c b/local.c
index 299ed0f..619d6ef 100644 (file)
--- a/local.c
+++ b/local.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define        STRICT\r
 /============================================================================*/\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -182,8 +184,6 @@ void DispFileProperty(char *Fname)
 {\r
        SHELLEXECUTEINFO sInfo;\r
        // 異なるファイルが表示されるバグ修正\r
 {\r
        SHELLEXECUTEINFO sInfo;\r
        // 異なるファイルが表示されるバグ修正\r
-       // UNCでない場合に末尾に半角スペースを置くと拡張子の補完がされなくなる\r
-       // 現在UNC対応の予定は無い\r
        char Fname2[FMAX_PATH+1];\r
 \r
        memset(&sInfo, NUL, sizeof(SHELLEXECUTEINFO));\r
        char Fname2[FMAX_PATH+1];\r
 \r
        memset(&sInfo, NUL, sizeof(SHELLEXECUTEINFO));\r
@@ -193,9 +193,7 @@ void DispFileProperty(char *Fname)
        sInfo.lpVerb = "Properties";\r
        // 異なるファイルが表示されるバグ修正\r
 //     sInfo.lpFile = Fname;\r
        sInfo.lpVerb = "Properties";\r
        // 異なるファイルが表示されるバグ修正\r
 //     sInfo.lpFile = Fname;\r
-       strcpy(Fname2, Fname);\r
-       strcat(Fname2, " ");\r
-       sInfo.lpFile = Fname2;\r
+       sInfo.lpFile = MakeDistinguishableFileName(Fname2, Fname);\r
        sInfo.lpParameters = NULL;\r
        sInfo.lpDirectory = NULL;\r
        sInfo.nShow = SW_NORMAL;\r
        sInfo.lpParameters = NULL;\r
        sInfo.lpDirectory = NULL;\r
        sInfo.nShow = SW_NORMAL;\r
index a833a99..6ea8524 100644 (file)
--- a/lvtips.c
+++ b/lvtips.c
@@ -30,6 +30,8 @@
 /* このソースは MFC Programmer's SourceBook (http://www.codeguru.com/)を参考にしました */\r
 \r
 #define  STRICT\r
 /* このソースは MFC Programmer's SourceBook (http://www.codeguru.com/)を参考にしました */\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
diff --git a/main.c b/main.c
index 79d3709..a182203 100644 (file)
--- a/main.c
+++ b/main.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -37,7 +39,8 @@
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
@@ -2476,7 +2479,7 @@ void ExecViewer(char *Fname, int App)
        // 任意のコードが実行されるバグ修正\r
        // 拡張子が無いと補完されるため\r
 //     if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
        // 任意のコードが実行されるバグ修正\r
        // 拡張子が無いと補完されるため\r
 //     if((App == -1) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
-       if((App == -1) && strrchr(Fname, '.') > strrchr(Fname, '\\') && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
+       if((App == -1) && (strlen(GetFileExt(GetFileName(Fname))) > 0) && (FindExecutable(Fname, NULL, AssocProg) > (HINSTANCE)32))\r
        {\r
                DoPrintf("ShellExecute - %s", Fname);\r
                ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
        {\r
                DoPrintf("ShellExecute - %s", Fname);\r
                ShellExecute(NULL, "open", Fname, NULL, CurDir, SW_SHOW);\r
index d44d1ef..72d8966 100644 (file)
@@ -7,6 +7,7 @@
 #define UNICODE\r
 #define _UNICODE\r
 \r
 #define UNICODE\r
 #define _UNICODE\r
 \r
+#include <stdio.h>\r
 #include <tchar.h>\r
 #include <direct.h>\r
 #include <windows.h>\r
 #include <tchar.h>\r
 #include <direct.h>\r
 #include <windows.h>\r
@@ -2149,12 +2150,11 @@ START_ROUTINE
        while((c = GetNextCharM(_Str, &p)) > 0)\r
        {\r
                if(c == _Ch)\r
        while((c = GetNextCharM(_Str, &p)) > 0)\r
        {\r
                if(c == _Ch)\r
-               {\r
-                       r = (unsigned char*)_Str;\r
                        break;\r
                        break;\r
-               }\r
                _Str = p;\r
        }\r
                _Str = p;\r
        }\r
+       if(c == _Ch)\r
+               r = (unsigned char*)_Str;\r
 END_ROUTINE\r
        return r;\r
 }\r
 END_ROUTINE\r
        return r;\r
 }\r
@@ -2171,6 +2171,8 @@ START_ROUTINE
                        r = (unsigned char*)_Str;\r
                _Str = p;\r
        }\r
                        r = (unsigned char*)_Str;\r
                _Str = p;\r
        }\r
+       if(c == _Ch)\r
+               r = (unsigned char*)_Str;\r
 END_ROUTINE\r
        return r;\r
 }\r
 END_ROUTINE\r
        return r;\r
 }\r
diff --git a/misc.c b/misc.c
index d064173..cc00144 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -33,7 +33,9 @@
 #include <stdarg.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
 #include <stdarg.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <shlobj.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <shlobj.h>\r
@@ -1724,3 +1726,44 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma)
 }\r
 \r
 \r
 }\r
 \r
 \r
+// 異なるファイルが表示されるバグ修正\r
+\r
+// ShellExecute等で使用されるファイル名を修正\r
+// UNCでない場合に末尾の半角スペースは無視されるため拡張子が補完されなくなるまで半角スペースを追加\r
+// 現在UNC対応の予定は無い\r
+char* MakeDistinguishableFileName(char* Out, char* In)\r
+{\r
+       char Tmp[FMAX_PATH+1];\r
+       char Tmp2[FMAX_PATH+3];\r
+       HANDLE hFind;\r
+       WIN32_FIND_DATA Find;\r
+       if(strlen(GetFileExt(GetFileName(In))) > 0)\r
+               strcpy(Out, In);\r
+       else\r
+       {\r
+               strcpy(Tmp, In);\r
+               strcpy(Tmp2, Tmp);\r
+               strcat(Tmp2, ".*");\r
+               while(strlen(Tmp) < FMAX_PATH && (hFind = FindFirstFile(Tmp2, &Find)) != INVALID_HANDLE_VALUE)\r
+               {\r
+                       do\r
+                       {\r
+                               if(strchr(Find.cFileName, '.'))\r
+                                       break;\r
+                       }\r
+                       while(FindNextFile(hFind, &Find));\r
+                       FindClose(hFind);\r
+                       if(strchr(Find.cFileName, '.'))\r
+                       {\r
+                               strcat(Tmp, " ");\r
+                               strcpy(Tmp2, Tmp);\r
+                               strcat(Tmp2, ".*");\r
+                       }\r
+                       else\r
+                               break;\r
+               }\r
+               strcpy(Out, Tmp);\r
+       }\r
+       return Out;\r
+}\r
+\r
index 2f7e00f..9952ebe 100644 (file)
--- a/option.c
+++ b/option.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define        STRICT\r
 /============================================================================*/\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
diff --git a/ras.c b/ras.c
index ebcb896..798cbe1 100644 (file)
--- a/ras.c
+++ b/ras.c
@@ -32,6 +32,8 @@
 // UTF-8対応\r
 //#define WINVER 0x400\r
 \r
 // UTF-8対応\r
 //#define WINVER 0x400\r
 \r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -39,7 +41,8 @@
 #include <mbstring.h>\r
 #include <malloc.h>\r
 #include <windowsx.h>\r
 #include <mbstring.h>\r
 #include <malloc.h>\r
 #include <windowsx.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 #include <ras.h>\r
 #include <rasdlg.h>\r
 #include <raserror.h>\r
 #include <ras.h>\r
 #include <rasdlg.h>\r
 #include <raserror.h>\r
index 70e3579..141ce66 100644 (file)
--- a/regexp.c
+++ b/regexp.c
@@ -30,7 +30,9 @@
 #define        STRICT\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #define        STRICT\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 \r
 #include "common.h"\r
 #include <windowsx.h>\r
 \r
 #include "common.h"\r
index 368745a..b1cd7f4 100644 (file)
@@ -33,6 +33,8 @@
 #endif\r
 \r
 #define        STRICT\r
 #endif\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index b2fffd6..6ee947c 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -36,7 +36,9 @@
 #include <string.h>\r
 #include <mbstring.h>\r
 #include <time.h>\r
 #include <string.h>\r
 #include <mbstring.h>\r
 #include <time.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
diff --git a/skey.c b/skey.c
index 9d39d88..d607d90 100644 (file)
--- a/skey.c
+++ b/skey.c
@@ -32,7 +32,9 @@
 #define        STRICT\r
 #include <stdlib.h>\r
 #include <string.h>\r
 #define        STRICT\r
 #include <stdlib.h>\r
 #include <string.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 \r
 #include "common.h"\r
 #include <windowsx.h>\r
 \r
 #include "common.h"\r
index 419d9c4..0549f9c 100644 (file)
--- a/socket.c
+++ b/socket.c
@@ -29,7 +29,7 @@
 \r
 #define        STRICT\r
 // IPv6対応\r
 \r
 #define        STRICT\r
 // IPv6対応\r
-#include <ws2tcpip.h>\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -40,8 +40,6 @@
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
-// UTF-8対応\r
-#include "punycode.h"\r
 \r
 #define USE_THIS       1\r
 #define DBG_MSG                0\r
 \r
 #define USE_THIS       1\r
 #define DBG_MSG                0\r
@@ -97,10 +95,6 @@ static int RegistAsyncTable(SOCKET s);
 static int RegistAsyncTableDbase(HANDLE Async);\r
 static int UnRegistAsyncTable(SOCKET s);\r
 static int UnRegistAsyncTableDbase(HANDLE Async);\r
 static int RegistAsyncTableDbase(HANDLE Async);\r
 static int UnRegistAsyncTable(SOCKET s);\r
 static int UnRegistAsyncTableDbase(HANDLE Async);\r
-// UTF-8対応\r
-static HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen);\r
-// IPv6対応\r
-static HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family);\r
 \r
 \r
 /*===== 外部参照 =====*/\r
 \r
 \r
 /*===== 外部参照 =====*/\r
@@ -1231,357 +1225,3 @@ int CheckClosedAndReconnect(void)
 \r
 \r
 \r
 \r
 \r
 \r
-// IPv6対応\r
-\r
-typedef struct\r
-{\r
-       HANDLE h;\r
-       HWND hWnd;\r
-       u_int wMsg;\r
-       char * name;\r
-       char * buf;\r
-       int buflen;\r
-       short Family;\r
-} GETHOSTBYNAMEDATA;\r
-\r
-static DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)\r
-{\r
-       GETHOSTBYNAMEDATA* pData;\r
-       struct hostent* pHost;\r
-       struct addrinfo* pAddr;\r
-       struct addrinfo* p;\r
-       pHost = NULL;\r
-       pData = (GETHOSTBYNAMEDATA*)lpParameter;\r
-       if(getaddrinfo(pData->name, NULL, NULL, &pAddr) == 0)\r
-       {\r
-               p = pAddr;\r
-               while(p)\r
-               {\r
-                       if(p->ai_family == pData->Family)\r
-                       {\r
-                               switch(p->ai_family)\r
-                               {\r
-                               case AF_INET:\r
-                                       pHost = (struct hostent*)pData->buf;\r
-                                       if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in_addr)\r
-                                               && p->ai_addrlen >= sizeof(struct sockaddr_in))\r
-                                       {\r
-                                               pHost->h_name = NULL;\r
-                                               pHost->h_aliases = NULL;\r
-                                               pHost->h_addrtype = p->ai_family;\r
-                                               pHost->h_length = sizeof(struct in_addr);\r
-                                               pHost->h_addr_list = (char**)(&pHost[1]);\r
-                                               pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);\r
-                                               pHost->h_addr_list[1] = NULL;\r
-                                               memcpy(pHost->h_addr_list[0], &((struct sockaddr_in*)p->ai_addr)->sin_addr, sizeof(struct in_addr));\r
-                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));\r
-                                       }\r
-                                       else\r
-                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));\r
-                                       break;\r
-                               case AF_INET6:\r
-                                       pHost = (struct hostent*)pData->buf;\r
-                                       if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in6_addr)\r
-                                               && p->ai_addrlen >= sizeof(struct sockaddr_in6))\r
-                                       {\r
-                                               pHost->h_name = NULL;\r
-                                               pHost->h_aliases = NULL;\r
-                                               pHost->h_addrtype = p->ai_family;\r
-                                               pHost->h_length = sizeof(struct in6_addr);\r
-                                               pHost->h_addr_list = (char**)(&pHost[1]);\r
-                                               pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);\r
-                                               pHost->h_addr_list[1] = NULL;\r
-                                               memcpy(pHost->h_addr_list[0], &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(struct in6_addr));\r
-                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));\r
-                                       }\r
-                                       else\r
-                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));\r
-                                       break;\r
-                               }\r
-                       }\r
-                       if(pHost)\r
-                               break;\r
-                       p = p->ai_next;\r
-               }\r
-               if(!p)\r
-                       PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16));\r
-               freeaddrinfo(pAddr);\r
-       }\r
-       else\r
-               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16));\r
-       free(pData->name);\r
-       free(pData);\r
-       // CreateThreadが返すハンドルが重複するのを回避\r
-       Sleep(10000);\r
-       return 0;\r
-}\r
-\r
-// IPv6対応のWSAAsyncGetHostByName相当の関数\r
-// FamilyにはAF_INETまたはAF_INET6を指定可能\r
-// ただしANSI用\r
-static HANDLE WSAAsyncGetHostByNameIPv6(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family)\r
-{\r
-       HANDLE hResult;\r
-       GETHOSTBYNAMEDATA* pData;\r
-       hResult = NULL;\r
-       if(pData = malloc(sizeof(GETHOSTBYNAMEDATA)))\r
-       {\r
-               pData->hWnd = hWnd;\r
-               pData->wMsg = wMsg;\r
-               if(pData->name = malloc(sizeof(char) * (strlen(name) + 1)))\r
-               {\r
-                       strcpy(pData->name, name);\r
-                       pData->buf = buf;\r
-                       pData->buflen = buflen;\r
-                       pData->Family = Family;\r
-                       if(pData->h = CreateThread(NULL, 0, WSAAsyncGetHostByNameIPv6ThreadProc, pData, CREATE_SUSPENDED, NULL))\r
-                       {\r
-                               ResumeThread(pData->h);\r
-                               hResult = pData->h;\r
-                       }\r
-               }\r
-       }\r
-       if(!hResult)\r
-       {\r
-               if(pData)\r
-               {\r
-                       if(pData->name)\r
-                               free(pData->name);\r
-                       free(pData);\r
-               }\r
-       }\r
-       return hResult;\r
-}\r
-\r
-// WSAAsyncGetHostByNameIPv6用のWSACancelAsyncRequest相当の関数\r
-int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle)\r
-{\r
-       int Result;\r
-       Result = SOCKET_ERROR;\r
-       if(TerminateThread(hAsyncTaskHandle, 0))\r
-               Result = 0;\r
-       return Result;\r
-}\r
-\r
-char* AddressToStringIPv6(char* str, void* in6)\r
-{\r
-       char* pResult;\r
-       unsigned char* p;\r
-       int MaxZero;\r
-       int MaxZeroLen;\r
-       int i;\r
-       int j;\r
-       char Tmp[5];\r
-       pResult = str;\r
-       p = (unsigned char*)in6;\r
-       MaxZero = 8;\r
-       MaxZeroLen = 1;\r
-       for(i = 0; i < 8; i++)\r
-       {\r
-               for(j = i; j < 8; j++)\r
-               {\r
-                       if(p[j * 2] != 0 || p[j * 2 + 1] != 0)\r
-                               break;\r
-               }\r
-               if(j - i > MaxZeroLen)\r
-               {\r
-                       MaxZero = i;\r
-                       MaxZeroLen = j - i;\r
-               }\r
-       }\r
-       strcpy(str, "");\r
-       for(i = 0; i < 8; i++)\r
-       {\r
-               if(i == MaxZero)\r
-               {\r
-                       if(i == 0)\r
-                               strcat(str, ":");\r
-                       strcat(str, ":");\r
-               }\r
-               else if(i < MaxZero || i >= MaxZero + MaxZeroLen)\r
-               {\r
-                       sprintf(Tmp, "%x", (((int)p[i * 2] & 0xff) << 8) | ((int)p[i * 2 + 1] & 0xff));\r
-                       strcat(str, Tmp);\r
-                       if(i < 7)\r
-                               strcat(str, ":");\r
-               }\r
-       }\r
-       return pResult;\r
-}\r
-\r
-// IPv6対応のinet_ntoa相当の関数\r
-// ただしANSI用\r
-char* inet6_ntoa(struct in6_addr in6)\r
-{\r
-       char* pResult;\r
-       static char Adrs[40];\r
-       pResult = NULL;\r
-       memset(Adrs, 0, sizeof(Adrs));\r
-       pResult = AddressToStringIPv6(Adrs, &in6);\r
-       return pResult;\r
-}\r
-\r
-// IPv6対応のinet_addr相当の関数\r
-// ただしANSI用\r
-struct in6_addr inet6_addr(const char* cp)\r
-{\r
-       struct in6_addr Result;\r
-       int AfterZero;\r
-       int i;\r
-       char* p;\r
-       memset(&Result, 0, sizeof(Result));\r
-       AfterZero = 0;\r
-       for(i = 0; i < 8; i++)\r
-       {\r
-               if(!cp)\r
-               {\r
-                       memset(&Result, 0xff, sizeof(Result));\r
-                       break;\r
-               }\r
-               if(i >= AfterZero)\r
-               {\r
-                       if(strncmp(cp, ":", 1) == 0)\r
-                       {\r
-                               cp = cp + 1;\r
-                               if(i == 0 && strncmp(cp, ":", 1) == 0)\r
-                                       cp = cp + 1;\r
-                               p = (char*)cp;\r
-                               AfterZero = 7;\r
-                               while(p = strstr(p, ":"))\r
-                               {\r
-                                       p = p + 1;\r
-                                       AfterZero--;\r
-                               }\r
-                       }\r
-                       else\r
-                       {\r
-                               Result.u.Word[i] = (USHORT)strtol(cp, &p, 16);\r
-                               Result.u.Word[i] = ((Result.u.Word[i] & 0xff00) >> 8) | ((Result.u.Word[i] & 0x00ff) << 8);\r
-                               if(strncmp(p, ":", 1) != 0 && strlen(p) > 0)\r
-                               {\r
-                                       memset(&Result, 0xff, sizeof(Result));\r
-                                       break;\r
-                               }\r
-                               if(cp = strstr(cp, ":"))\r
-                                       cp = cp + 1;\r
-                       }\r
-               }\r
-       }\r
-       return Result;\r
-}\r
-\r
-// UTF-8対応\r
-\r
-static BOOL ConvertStringToPunycode(LPSTR Output, DWORD Count, LPCSTR Input)\r
-{\r
-       BOOL bResult;\r
-       punycode_uint* pUnicode;\r
-       punycode_uint* p;\r
-       BOOL bNeeded;\r
-       LPCSTR InputString;\r
-       punycode_uint Length;\r
-       punycode_uint OutputLength;\r
-       bResult = FALSE;\r
-       if(pUnicode = malloc(sizeof(punycode_uint) * strlen(Input)))\r
-       {\r
-               p = pUnicode;\r
-               bNeeded = FALSE;\r
-               InputString = Input;\r
-               Length = 0;\r
-               while(*InputString != '\0')\r
-               {\r
-                       *p = (punycode_uint)GetNextCharM(InputString, &InputString);\r
-                       if(*p >= 0x80)\r
-                               bNeeded = TRUE;\r
-                       p++;\r
-                       Length++;\r
-               }\r
-               if(bNeeded)\r
-               {\r
-                       if(Count >= strlen("xn--") + 1)\r
-                       {\r
-                               strcpy(Output, "xn--");\r
-                               OutputLength = Count - strlen("xn--");\r
-                               if(punycode_encode(Length, pUnicode, NULL, (punycode_uint*)&OutputLength, Output + strlen("xn--")) == punycode_success)\r
-                               {\r
-                                       Output[strlen("xn--") + OutputLength] = '\0';\r
-                                       bResult = TRUE;\r
-                               }\r
-                       }\r
-               }\r
-               free(pUnicode);\r
-       }\r
-       if(!bResult)\r
-       {\r
-               if(Count >= strlen(Input) + 1)\r
-               {\r
-                       strcpy(Output, Input);\r
-                       bResult = TRUE;\r
-               }\r
-       }\r
-       return bResult;\r
-}\r
-\r
-static BOOL ConvertNameToPunycode(LPSTR Output, LPCSTR Input)\r
-{\r
-       BOOL bResult;\r
-       DWORD Length;\r
-       char* pm0;\r
-       char* pm1;\r
-       char* p;\r
-       char* pNext;\r
-       bResult = FALSE;\r
-       Length = strlen(Input);\r
-       if(pm0 = AllocateStringM(Length + 1))\r
-       {\r
-               if(pm1 = AllocateStringM(Length * 4 + 1))\r
-               {\r
-                       strcpy(pm0, Input);\r
-                       p = pm0;\r
-                       while(p)\r
-                       {\r
-                               if(pNext = strchr(p, '.'))\r
-                               {\r
-                                       *pNext = '\0';\r
-                                       pNext++;\r
-                               }\r
-                               if(ConvertStringToPunycode(pm1, Length * 4, p))\r
-                                       strcat(Output, pm1);\r
-                               if(pNext)\r
-                                       strcat(Output, ".");\r
-                               p = pNext;\r
-                       }\r
-                       bResult = TRUE;\r
-                       FreeDuplicatedString(pm1);\r
-               }\r
-               FreeDuplicatedString(pm0);\r
-       }\r
-       return bResult;\r
-}\r
-\r
-static HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen)\r
-{\r
-       HANDLE r = NULL;\r
-       char* pa0 = NULL;\r
-       if(pa0 = AllocateStringA(strlen(name) * 4))\r
-       {\r
-               if(ConvertNameToPunycode(pa0, name))\r
-                       r = WSAAsyncGetHostByName(hWnd, wMsg, pa0, buf, buflen);\r
-       }\r
-       FreeDuplicatedString(pa0);\r
-       return r;\r
-}\r
-\r
-static HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family)\r
-{\r
-       HANDLE r = NULL;\r
-       char* pa0 = NULL;\r
-       if(pa0 = AllocateStringA(strlen(name) * 4))\r
-       {\r
-               if(ConvertNameToPunycode(pa0, name))\r
-                       r = WSAAsyncGetHostByNameIPv6(hWnd, wMsg, pa0, buf, buflen, Family);\r
-       }\r
-       FreeDuplicatedString(pa0);\r
-       return r;\r
-}\r
-\r
index 8aac220..edd8418 100644 (file)
@@ -2,15 +2,19 @@
 // Copyright (C) 2011 Suguru Kawamoto\r
 // ソケットラッパー\r
 // socket関連関数をOpenSSL用に置換\r
 // Copyright (C) 2011 Suguru Kawamoto\r
 // ソケットラッパー\r
 // socket関連関数をOpenSSL用に置換\r
+// socket関連関数のIPv6対応\r
 // コンパイルにはOpenSSLのヘッダーファイルが必要\r
 // 実行にはOpenSSLのDLLが必要\r
 \r
 // コンパイルにはOpenSSLのヘッダーファイルが必要\r
 // 実行にはOpenSSLのDLLが必要\r
 \r
+#include <ws2tcpip.h>\r
 #include <windows.h>\r
 #include <mmsystem.h>\r
 #include <openssl/ssl.h>\r
 \r
 #include "socketwrapper.h"\r
 #include "protectprocess.h"\r
 #include <windows.h>\r
 #include <mmsystem.h>\r
 #include <openssl/ssl.h>\r
 \r
 #include "socketwrapper.h"\r
 #include "protectprocess.h"\r
+#include "mbswrapper.h"\r
+#include "punycode.h"\r
 \r
 typedef void (__cdecl* _SSL_load_error_strings)();\r
 typedef int (__cdecl* _SSL_library_init)();\r
 \r
 typedef void (__cdecl* _SSL_load_error_strings)();\r
 typedef int (__cdecl* _SSL_library_init)();\r
@@ -581,3 +585,355 @@ int recvS(SOCKET s, char * buf, int len, int flags)
        return p_SSL_read(*ppSSL, buf, len);\r
 }\r
 \r
        return p_SSL_read(*ppSSL, buf, len);\r
 }\r
 \r
+// IPv6対応\r
+\r
+typedef struct\r
+{\r
+       HANDLE h;\r
+       HWND hWnd;\r
+       u_int wMsg;\r
+       char * name;\r
+       char * buf;\r
+       int buflen;\r
+       short Family;\r
+} GETHOSTBYNAMEDATA;\r
+\r
+DWORD WINAPI WSAAsyncGetHostByNameIPv6ThreadProc(LPVOID lpParameter)\r
+{\r
+       GETHOSTBYNAMEDATA* pData;\r
+       struct hostent* pHost;\r
+       struct addrinfo* pAddr;\r
+       struct addrinfo* p;\r
+       pHost = NULL;\r
+       pData = (GETHOSTBYNAMEDATA*)lpParameter;\r
+       if(getaddrinfo(pData->name, NULL, NULL, &pAddr) == 0)\r
+       {\r
+               p = pAddr;\r
+               while(p)\r
+               {\r
+                       if(p->ai_family == pData->Family)\r
+                       {\r
+                               switch(p->ai_family)\r
+                               {\r
+                               case AF_INET:\r
+                                       pHost = (struct hostent*)pData->buf;\r
+                                       if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in_addr)\r
+                                               && p->ai_addrlen >= sizeof(struct sockaddr_in))\r
+                                       {\r
+                                               pHost->h_name = NULL;\r
+                                               pHost->h_aliases = NULL;\r
+                                               pHost->h_addrtype = p->ai_family;\r
+                                               pHost->h_length = sizeof(struct in_addr);\r
+                                               pHost->h_addr_list = (char**)(&pHost[1]);\r
+                                               pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);\r
+                                               pHost->h_addr_list[1] = NULL;\r
+                                               memcpy(pHost->h_addr_list[0], &((struct sockaddr_in*)p->ai_addr)->sin_addr, sizeof(struct in_addr));\r
+                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));\r
+                                       }\r
+                                       else\r
+                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));\r
+                                       break;\r
+                               case AF_INET6:\r
+                                       pHost = (struct hostent*)pData->buf;\r
+                                       if((size_t)pData->buflen >= sizeof(struct hostent) + sizeof(char*) * 2 + sizeof(struct in6_addr)\r
+                                               && p->ai_addrlen >= sizeof(struct sockaddr_in6))\r
+                                       {\r
+                                               pHost->h_name = NULL;\r
+                                               pHost->h_aliases = NULL;\r
+                                               pHost->h_addrtype = p->ai_family;\r
+                                               pHost->h_length = sizeof(struct in6_addr);\r
+                                               pHost->h_addr_list = (char**)(&pHost[1]);\r
+                                               pHost->h_addr_list[0] = (char*)(&pHost->h_addr_list[2]);\r
+                                               pHost->h_addr_list[1] = NULL;\r
+                                               memcpy(pHost->h_addr_list[0], &((struct sockaddr_in6*)p->ai_addr)->sin6_addr, sizeof(struct in6_addr));\r
+                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(sizeof(struct hostent) + sizeof(char*) * 2 + p->ai_addrlen));\r
+                                       }\r
+                                       else\r
+                                               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(WSAENOBUFS << 16));\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if(pHost)\r
+                               break;\r
+                       p = p->ai_next;\r
+               }\r
+               if(!p)\r
+                       PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16));\r
+               freeaddrinfo(pAddr);\r
+       }\r
+       else\r
+               PostMessage(pData->hWnd, pData->wMsg, (WPARAM)pData->h, (LPARAM)(ERROR_INVALID_FUNCTION << 16));\r
+       free(pData->name);\r
+       free(pData);\r
+       // CreateThreadが返すハンドルが重複するのを回避\r
+       Sleep(10000);\r
+       return 0;\r
+}\r
+\r
+// IPv6対応のWSAAsyncGetHostByName相当の関数\r
+// FamilyにはAF_INETまたはAF_INET6を指定可能\r
+// ただしANSI用\r
+HANDLE WSAAsyncGetHostByNameIPv6(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family)\r
+{\r
+       HANDLE hResult;\r
+       GETHOSTBYNAMEDATA* pData;\r
+       hResult = NULL;\r
+       if(pData = malloc(sizeof(GETHOSTBYNAMEDATA)))\r
+       {\r
+               pData->hWnd = hWnd;\r
+               pData->wMsg = wMsg;\r
+               if(pData->name = malloc(sizeof(char) * (strlen(name) + 1)))\r
+               {\r
+                       strcpy(pData->name, name);\r
+                       pData->buf = buf;\r
+                       pData->buflen = buflen;\r
+                       pData->Family = Family;\r
+                       if(pData->h = CreateThread(NULL, 0, WSAAsyncGetHostByNameIPv6ThreadProc, pData, CREATE_SUSPENDED, NULL))\r
+                       {\r
+                               ResumeThread(pData->h);\r
+                               hResult = pData->h;\r
+                       }\r
+               }\r
+       }\r
+       if(!hResult)\r
+       {\r
+               if(pData)\r
+               {\r
+                       if(pData->name)\r
+                               free(pData->name);\r
+                       free(pData);\r
+               }\r
+       }\r
+       return hResult;\r
+}\r
+\r
+// WSAAsyncGetHostByNameIPv6用のWSACancelAsyncRequest相当の関数\r
+int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle)\r
+{\r
+       int Result;\r
+       Result = SOCKET_ERROR;\r
+       if(TerminateThread(hAsyncTaskHandle, 0))\r
+               Result = 0;\r
+       return Result;\r
+}\r
+\r
+char* AddressToStringIPv6(char* str, void* in6)\r
+{\r
+       char* pResult;\r
+       unsigned char* p;\r
+       int MaxZero;\r
+       int MaxZeroLen;\r
+       int i;\r
+       int j;\r
+       char Tmp[5];\r
+       pResult = str;\r
+       p = (unsigned char*)in6;\r
+       MaxZero = 8;\r
+       MaxZeroLen = 1;\r
+       for(i = 0; i < 8; i++)\r
+       {\r
+               for(j = i; j < 8; j++)\r
+               {\r
+                       if(p[j * 2] != 0 || p[j * 2 + 1] != 0)\r
+                               break;\r
+               }\r
+               if(j - i > MaxZeroLen)\r
+               {\r
+                       MaxZero = i;\r
+                       MaxZeroLen = j - i;\r
+               }\r
+       }\r
+       strcpy(str, "");\r
+       for(i = 0; i < 8; i++)\r
+       {\r
+               if(i == MaxZero)\r
+               {\r
+                       if(i == 0)\r
+                               strcat(str, ":");\r
+                       strcat(str, ":");\r
+               }\r
+               else if(i < MaxZero || i >= MaxZero + MaxZeroLen)\r
+               {\r
+                       sprintf(Tmp, "%x", (((int)p[i * 2] & 0xff) << 8) | ((int)p[i * 2 + 1] & 0xff));\r
+                       strcat(str, Tmp);\r
+                       if(i < 7)\r
+                               strcat(str, ":");\r
+               }\r
+       }\r
+       return pResult;\r
+}\r
+\r
+// IPv6対応のinet_ntoa相当の関数\r
+// ただしANSI用\r
+char* inet6_ntoa(struct in6_addr in6)\r
+{\r
+       char* pResult;\r
+       static char Adrs[40];\r
+       pResult = NULL;\r
+       memset(Adrs, 0, sizeof(Adrs));\r
+       pResult = AddressToStringIPv6(Adrs, &in6);\r
+       return pResult;\r
+}\r
+\r
+// IPv6対応のinet_addr相当の関数\r
+// ただしANSI用\r
+struct in6_addr inet6_addr(const char* cp)\r
+{\r
+       struct in6_addr Result;\r
+       int AfterZero;\r
+       int i;\r
+       char* p;\r
+       memset(&Result, 0, sizeof(Result));\r
+       AfterZero = 0;\r
+       for(i = 0; i < 8; i++)\r
+       {\r
+               if(!cp)\r
+               {\r
+                       memset(&Result, 0xff, sizeof(Result));\r
+                       break;\r
+               }\r
+               if(i >= AfterZero)\r
+               {\r
+                       if(strncmp(cp, ":", 1) == 0)\r
+                       {\r
+                               cp = cp + 1;\r
+                               if(i == 0 && strncmp(cp, ":", 1) == 0)\r
+                                       cp = cp + 1;\r
+                               p = (char*)cp;\r
+                               AfterZero = 7;\r
+                               while(p = strstr(p, ":"))\r
+                               {\r
+                                       p = p + 1;\r
+                                       AfterZero--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               Result.u.Word[i] = (USHORT)strtol(cp, &p, 16);\r
+                               Result.u.Word[i] = ((Result.u.Word[i] & 0xff00) >> 8) | ((Result.u.Word[i] & 0x00ff) << 8);\r
+                               if(strncmp(p, ":", 1) != 0 && strlen(p) > 0)\r
+                               {\r
+                                       memset(&Result, 0xff, sizeof(Result));\r
+                                       break;\r
+                               }\r
+                               if(cp = strstr(cp, ":"))\r
+                                       cp = cp + 1;\r
+                       }\r
+               }\r
+       }\r
+       return Result;\r
+}\r
+\r
+BOOL ConvertDomainNameToPunycode(LPSTR Output, DWORD Count, LPCSTR Input)\r
+{\r
+       BOOL bResult;\r
+       punycode_uint* pUnicode;\r
+       punycode_uint* p;\r
+       BOOL bNeeded;\r
+       LPCSTR InputString;\r
+       punycode_uint Length;\r
+       punycode_uint OutputLength;\r
+       bResult = FALSE;\r
+       if(pUnicode = malloc(sizeof(punycode_uint) * strlen(Input)))\r
+       {\r
+               p = pUnicode;\r
+               bNeeded = FALSE;\r
+               InputString = Input;\r
+               Length = 0;\r
+               while(*InputString != '\0')\r
+               {\r
+                       *p = (punycode_uint)GetNextCharM(InputString, &InputString);\r
+                       if(*p >= 0x80)\r
+                               bNeeded = TRUE;\r
+                       p++;\r
+                       Length++;\r
+               }\r
+               if(bNeeded)\r
+               {\r
+                       if(Count >= strlen("xn--") + 1)\r
+                       {\r
+                               strcpy(Output, "xn--");\r
+                               OutputLength = Count - strlen("xn--");\r
+                               if(punycode_encode(Length, pUnicode, NULL, (punycode_uint*)&OutputLength, Output + strlen("xn--")) == punycode_success)\r
+                               {\r
+                                       Output[strlen("xn--") + OutputLength] = '\0';\r
+                                       bResult = TRUE;\r
+                               }\r
+                       }\r
+               }\r
+               free(pUnicode);\r
+       }\r
+       if(!bResult)\r
+       {\r
+               if(Count >= strlen(Input) + 1)\r
+               {\r
+                       strcpy(Output, Input);\r
+                       bResult = TRUE;\r
+               }\r
+       }\r
+       return bResult;\r
+}\r
+\r
+BOOL ConvertNameToPunycode(LPSTR Output, LPCSTR Input)\r
+{\r
+       BOOL bResult;\r
+       DWORD Length;\r
+       char* pm0;\r
+       char* pm1;\r
+       char* p;\r
+       char* pNext;\r
+       bResult = FALSE;\r
+       Length = strlen(Input);\r
+       if(pm0 = AllocateStringM(Length + 1))\r
+       {\r
+               if(pm1 = AllocateStringM(Length * 4 + 1))\r
+               {\r
+                       strcpy(pm0, Input);\r
+                       p = pm0;\r
+                       while(p)\r
+                       {\r
+                               if(pNext = strchr(p, '.'))\r
+                               {\r
+                                       *pNext = '\0';\r
+                                       pNext++;\r
+                               }\r
+                               if(ConvertDomainNameToPunycode(pm1, Length * 4, p))\r
+                                       strcat(Output, pm1);\r
+                               if(pNext)\r
+                                       strcat(Output, ".");\r
+                               p = pNext;\r
+                       }\r
+                       bResult = TRUE;\r
+                       FreeDuplicatedString(pm1);\r
+               }\r
+               FreeDuplicatedString(pm0);\r
+       }\r
+       return bResult;\r
+}\r
+\r
+HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen)\r
+{\r
+       HANDLE r = NULL;\r
+       char* pa0 = NULL;\r
+       if(pa0 = AllocateStringA(strlen(name) * 4))\r
+       {\r
+               if(ConvertNameToPunycode(pa0, name))\r
+                       r = WSAAsyncGetHostByName(hWnd, wMsg, pa0, buf, buflen);\r
+       }\r
+       FreeDuplicatedString(pa0);\r
+       return r;\r
+}\r
+\r
+HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family)\r
+{\r
+       HANDLE r = NULL;\r
+       char* pa0 = NULL;\r
+       if(pa0 = AllocateStringA(strlen(name) * 4))\r
+       {\r
+               if(ConvertNameToPunycode(pa0, name))\r
+                       r = WSAAsyncGetHostByNameIPv6(hWnd, wMsg, pa0, buf, buflen, Family);\r
+       }\r
+       FreeDuplicatedString(pa0);\r
+       return r;\r
+}\r
+\r
index b903e9f..f06c752 100644 (file)
@@ -5,6 +5,9 @@
 #ifndef __SOCKETWRAPPER_H__\r
 #define __SOCKETWRAPPER_H__\r
 \r
 #ifndef __SOCKETWRAPPER_H__\r
 #define __SOCKETWRAPPER_H__\r
 \r
+#include <ws2tcpip.h>\r
+#include <windows.h>\r
+\r
 #define USE_OPENSSL\r
 \r
 typedef BOOL (__stdcall* LPSSLTIMEOUTCALLBACK)(BOOL*);\r
 #define USE_OPENSSL\r
 \r
 typedef BOOL (__stdcall* LPSSLTIMEOUTCALLBACK)(BOOL*);\r
@@ -29,5 +32,13 @@ int closesocketS(SOCKET s);
 int sendS(SOCKET s, const char * buf, int len, int flags);\r
 int recvS(SOCKET s, char * buf, int len, int flags);\r
 \r
 int sendS(SOCKET s, const char * buf, int len, int flags);\r
 int recvS(SOCKET s, char * buf, int len, int flags);\r
 \r
+HANDLE WSAAsyncGetHostByNameIPv6(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family);\r
+int WSACancelAsyncRequestIPv6(HANDLE hAsyncTaskHandle);\r
+char* AddressToStringIPv6(char* str, void* in6);\r
+char* inet6_ntoa(struct in6_addr in6);\r
+struct in6_addr inet6_addr(const char* cp);\r
+HANDLE WSAAsyncGetHostByNameM(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen);\r
+HANDLE WSAAsyncGetHostByNameIPv6M(HWND hWnd, u_int wMsg, const char * name, char * buf, int buflen, short Family);\r
+\r
 #endif\r
 \r
 #endif\r
 \r
index 735dfbb..cdb0acd 100644 (file)
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -37,7 +39,8 @@
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
index 5b950d4..9e269d3 100644 (file)
--- a/taskwin.c
+++ b/taskwin.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -37,7 +39,8 @@
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
diff --git a/tool.c b/tool.c
index 3a5b4a8..e319634 100644 (file)
--- a/tool.c
+++ b/tool.c
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define        STRICT\r
 /============================================================================*/\r
 \r
 #define        STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index 786a754..4753add 100644 (file)
@@ -28,6 +28,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
@@ -37,7 +39,8 @@
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 #include <stdarg.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
 \r
 #include "common.h"\r
 #include "resource.h"\r
index 2507303..8546348 100644 (file)
@@ -27,6 +27,8 @@
 /============================================================================*/\r
 \r
 #define  STRICT\r
 /============================================================================*/\r
 \r
 #define  STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <windows.h>\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
index 42aeb70..9146756 100644 (file)
@@ -30,7 +30,9 @@
 #define        STRICT\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #define        STRICT\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 \r
 #include "common.h"\r
 #include <windowsx.h>\r
 \r
 #include "common.h"\r