OSDN Git Service

Add support for linux-ftpd (untested).
[ffftp/ffftp.git] / misc.c
diff --git a/misc.c b/misc.c
index 58700a7..5489e66 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 <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
@@ -62,7 +64,9 @@ typedef struct {
 \r
 /*===== プロトタイプ =====*/\r
 \r
-static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 \r
 /*===== 外部参照 =====*/\r
 \r
@@ -132,7 +136,9 @@ int InputDialogBox(int Res, HWND hWnd, char *Title, char *Buf, int Max, int *Flg
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
 {\r
        char Tmp[FMAX_PATH+1];\r
 \r
@@ -186,7 +192,9 @@ static BOOL CALLBACK InputDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (message)\r
        {\r
@@ -222,7 +230,9 @@ BOOL CALLBACK ExeEscDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lP
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//BOOL CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
+INT_PTR CALLBACK ExeEscTextDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (message)\r
        {\r
@@ -987,9 +997,23 @@ int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char
                        strncpy(User, Tmp, USER_NAME_LEN);\r
        }\r
 \r
+       // IPv6対応\r
+       if((Pos2 = _mbschr(Pos1, '[')) != NULL && Pos2 < _mbschr(Pos1, ':'))\r
+       {\r
+               Pos1 = Pos2 + 1;\r
+               if((Pos2 = _mbschr(Pos2, ']')) != NULL)\r
+               {\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+                       Pos1 = Pos2 + 1;\r
+               }\r
+       }\r
+\r
        if((Pos2 = _mbschr(Pos1, ':')) != NULL)\r
        {\r
-               memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               // IPv6対応\r
+//             memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               if(strlen(Host) == 0)\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
                Pos2++;\r
                if(IsDigit(*Pos2))\r
                {\r
@@ -1006,13 +1030,19 @@ int SplitUNCpath(char *unc, char *Host, char *Path, char *File, char *User, char
        }\r
        else if((Pos2 = _mbschr(Pos1, '/')) != NULL)\r
        {\r
-               memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               // IPv6対応\r
+//             memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
+               if(strlen(Host) == 0)\r
+                       memcpy(Host, Pos1, min1(Pos2-Pos1, HOST_ADRS_LEN));\r
                RemoveFileName(Pos2, Path);\r
                strncpy(File, GetFileName(Pos2), FMAX_PATH);\r
        }\r
        else\r
        {\r
-               strncpy(Host, Pos1, HOST_ADRS_LEN);\r
+               // IPv6対応\r
+//             strncpy(Host, Pos1, HOST_ADRS_LEN);\r
+               if(strlen(Host) == 0)\r
+                       strncpy(Host, Pos1, HOST_ADRS_LEN);\r
        }\r
 \r
        Sts = FFFTP_FAIL;\r
@@ -1704,3 +1734,57 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma)
 }\r
 \r
 \r
+// 異なるファイルが表示されるバグ修正\r
+\r
+// ShellExecute等で使用されるファイル名を修正\r
+// UNCでない場合に末尾の半角スペースは無視されるため拡張子が補完されなくなるまで半角スペースを追加\r
+// 現在UNC対応の予定は無い\r
+char* MakeDistinguishableFileName(char* Out, char* In)\r
+{\r
+       char* Fname;\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
+               Fname = GetFileName(In);\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(strcmp(Find.cFileName, Fname) != 0)\r
+                                       break;\r
+                       }\r
+                       while(FindNextFile(hFind, &Find));\r
+                       FindClose(hFind);\r
+                       if(strcmp(Find.cFileName, Fname) != 0)\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
+char* GetAppTempPath(char* Buf)\r
+{\r
+       char Temp[32];\r
+       GetTempPath(MAX_PATH, Buf);\r
+       SetYenTail(Buf);\r
+       sprintf(Temp, "ffftp%08x", GetCurrentProcessId());\r
+       strcat(Buf, Temp);\r
+       return Buf;\r
+}\r
+\r