OSDN Git Service

Enhance routines for extra commands.
[ffftp/ffftp.git] / filelist.c
index be49252..a55cb55 100644 (file)
@@ -4109,6 +4109,8 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \r
        /* まずクリアしておく */\r
        Ret = NODE_NONE;\r
+       // バグ対策\r
+       memset(Fname, NUL, FMAX_PATH+1);\r
        *Size = -1;\r
        *Attr = 0;\r
        *Link = NO;\r
@@ -4844,6 +4846,81 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                        break;\r
 #endif\r
 \r
+                       // MLSD対応\r
+                       // 以下の形式に対応\r
+                       // fact1=value1;fact2=value2;fact3=value3; filename\r\n\r
+                       // 不完全な実装のホストが存在するため以下の形式も許容\r
+                       // fact1=value1;fact2=value2;fact3=value3 filename\r\n\r
+                       // fact1=value1;fact2=value2;fact3=value3;filename\r\n\r
+               case LIST_MLSD:\r
+                       {\r
+                               int i = 0;\r
+                               char StrBuf[(FMAX_PATH * 2) + 1];\r
+                               char Fact[FMAX_PATH + 1];\r
+                               char Name[FMAX_PATH + 1];\r
+                               char Value[FMAX_PATH + 1];\r
+                               char* pFileName;\r
+                               strncpy(StrBuf, Str, FMAX_PATH * 2);\r
+                               StrBuf[FMAX_PATH * 2] = '\0';\r
+                               if((pFileName = strstr(StrBuf, "; ")) != NULL)\r
+                               {\r
+                                       *pFileName = '\0';\r
+                                       pFileName += 2;\r
+                               }\r
+                               else if((pFileName = strchr(StrBuf, ' ')) != NULL)\r
+                               {\r
+                                       *pFileName = '\0';\r
+                                       pFileName++;\r
+                               }\r
+                               else if((pFileName = strrchr(StrBuf, ';')) != NULL)\r
+                               {\r
+                                       *pFileName = '\0';\r
+                                       pFileName++;\r
+                               }\r
+                               if(pFileName != NULL)\r
+                                       strcpy(Fname, pFileName);\r
+                               while(FindField2(StrBuf, Fact, ';', i, NO) == FFFTP_SUCCESS)\r
+                               {\r
+                                       if(FindField2(Fact, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Fact, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
+                                       {\r
+                                               if(_stricmp(Name, "type") == 0)\r
+                                               {\r
+                                                       if(_stricmp(Value, "dir") == 0)\r
+                                                               Ret = NODE_DIR;\r
+                                                       else if(_stricmp(Value, "file") == 0)\r
+                                                               Ret = NODE_FILE;\r
+                                               }\r
+                                               else if(_stricmp(Name, "size") == 0)\r
+                                               {\r
+                                                       *Size = _atoi64(Value);\r
+                                                       *InfoExist |= FINFO_SIZE;\r
+                                               }\r
+                                               else if(_stricmp(Name, "modify") == 0)\r
+                                               {\r
+                                                       sTime.wYear = atoi_n(Value, 4);\r
+                                                       sTime.wMonth = atoi_n(Value + 4, 2);\r
+                                                       sTime.wDay = atoi_n(Value + 6, 2);\r
+                                                       sTime.wHour = atoi_n(Value + 8, 2);\r
+                                                       sTime.wMinute = atoi_n(Value + 10, 2);\r
+                                                       sTime.wSecond = atoi_n(Value + 12, 2);\r
+                                                       sTime.wMilliseconds = 0;\r
+                                                       SystemTimeToFileTime(&sTime, Time);\r
+//                                                     SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+                                                       *InfoExist |= FINFO_DATE | FINFO_TIME;\r
+                                               }\r
+                                               else if(_stricmp(Name, "UNIX.mode") == 0)\r
+                                               {\r
+                                                       *Attr = strtol(Value, NULL, 16);\r
+                                                       *InfoExist |= FINFO_ATTR;\r
+                                               }\r
+                                               else if(_stricmp(Name, "UNIX.owner") == 0)\r
+                                                       strcpy(Owner, Value);\r
+                                       }\r
+                                       i++;\r
+                               }\r
+                       }\r
+                       break;\r
+\r
                case LIST_UNIX_10 :\r
                case LIST_UNIX_11 :\r
                case LIST_UNIX_12 :\r
@@ -5109,57 +5186,6 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                        Ret = NODE_NONE;\r
                        }\r
                        break;\r
-\r
-                       // MLSD対応\r
-               case LIST_MLSD:\r
-                       {\r
-                               int i = 0;\r
-                               char Tmp[FMAX_PATH + 1];\r
-                               char Name[FMAX_PATH + 1];\r
-                               char Value[FMAX_PATH + 1];\r
-                               while(FindField2(Str, Tmp, ';', i, NO) == FFFTP_SUCCESS)\r
-                               {\r
-                                       if(i >= 1 && strncmp(Tmp, " ", 1) == 0)\r
-                                               strcpy(Fname, strstr(Str, "; ") + 2);\r
-                                       else if(FindField2(Tmp, Name, '=', 0, NO) == FFFTP_SUCCESS && FindField2(Tmp, Value, '=', 1, NO) == FFFTP_SUCCESS)\r
-                                       {\r
-                                               if(_stricmp(Name, "type") == 0)\r
-                                               {\r
-                                                       if(_stricmp(Value, "dir") == 0)\r
-                                                               Ret = NODE_DIR;\r
-                                                       else if(_stricmp(Value, "file") == 0)\r
-                                                               Ret = NODE_FILE;\r
-                                               }\r
-                                               else if(_stricmp(Name, "size") == 0)\r
-                                               {\r
-                                                       *Size = _atoi64(Value);\r
-                                                       *InfoExist |= FINFO_SIZE;\r
-                                               }\r
-                                               else if(_stricmp(Name, "modify") == 0)\r
-                                               {\r
-                                                       sTime.wYear = atoi_n(Value, 4);\r
-                                                       sTime.wMonth = atoi_n(Value + 4, 2);\r
-                                                       sTime.wDay = atoi_n(Value + 6, 2);\r
-                                                       sTime.wHour = atoi_n(Value + 8, 2);\r
-                                                       sTime.wMinute = atoi_n(Value + 10, 2);\r
-                                                       sTime.wSecond = atoi_n(Value + 12, 2);\r
-                                                       sTime.wMilliseconds = 0;\r
-                                                       SystemTimeToFileTime(&sTime, Time);\r
-//                                                     SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
-                                                       *InfoExist |= FINFO_DATE | FINFO_TIME;\r
-                                               }\r
-                                               else if(_stricmp(Name, "UNIX.mode") == 0)\r
-                                               {\r
-                                                       *Attr = strtol(Value, NULL, 16);\r
-                                                       *InfoExist |= FINFO_ATTR;\r
-                                               }\r
-                                               else if(_stricmp(Name, "UNIX.owner") == 0)\r
-                                                       strcpy(Owner, Value);\r
-                                       }\r
-                                       i++;\r
-                               }\r
-                       }\r
-                       break;\r
        }\r
 \r
        // UTF-8対応\r