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.
//#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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\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 <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
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
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
#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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.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
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\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
-- 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
\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
\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
//#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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\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
#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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.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
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\r
{\r
SHELLEXECUTEINFO sInfo;\r
// 異なるファイルが表示されるバグ修正\r
- // UNCでない場合に末尾に半角スペースを置くと拡張子の補完がされなくなる\r
- // 現在UNC対応の予定は無い\r
char Fname2[FMAX_PATH+1];\r
\r
memset(&sInfo, NUL, sizeof(SHELLEXECUTEINFO));\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
/* このソースは 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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.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
// 拡張子が無いと補完されるため\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
#define UNICODE\r
#define _UNICODE\r
\r
+#include <stdio.h>\r
#include <tchar.h>\r
#include <direct.h>\r
#include <windows.h>\r
while((c = GetNextCharM(_Str, &p)) > 0)\r
{\r
if(c == _Ch)\r
- {\r
- r = (unsigned char*)_Str;\r
break;\r
- }\r
_Str = p;\r
}\r
+ if(c == _Ch)\r
+ r = (unsigned char*)_Str;\r
END_ROUTINE\r
return r;\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
#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
}\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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\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 <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
#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
#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 <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
#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
\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
\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
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
-// 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
// Copyright (C) 2011 Suguru Kawamoto\r
// ソケットラッパー\r
// socket関連関数をOpenSSL用に置換\r
+// socket関連関数のIPv6対応\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 "mbswrapper.h"\r
+#include "punycode.h"\r
\r
typedef void (__cdecl* _SSL_load_error_strings)();\r
typedef int (__cdecl* _SSL_library_init)();\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
#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
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
/============================================================================*/\r
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.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
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.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
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\r
#include <stdio.h>\r
#include <stdlib.h>\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 <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
\r
#define STRICT\r
+// IPv6対応\r
+#include <winsock2.h>\r
#include <windows.h>\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