OSDN Git Service

Change the behavior of Delete of a symbolic link for a directory.
authorYuji Tanaka <chibi_honu@users.sourceforge.jp>
Thu, 8 Nov 2012 08:45:05 +0000 (17:45 +0900)
committerYuji Tanaka <chibi_honu@users.sourceforge.jp>
Thu, 8 Nov 2012 08:45:05 +0000 (17:45 +0900)
filelist.c [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index 38d3b2e..4fbc59d
@@ -89,6 +89,7 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
 // 64ビット対応\r
 //static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 static INT_PTR CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static int GetImageIndex(int Win, int Pos);\r
 static void DispListList(FILELIST *Pos, char *Title);\r
 static void MakeRemoteTree1(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
 static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelCheckWork);\r
@@ -2627,6 +2628,35 @@ int GetNodeType(int Win, int Pos)
 }\r
 \r
 \r
+/*----- 指定位置のアイテムのイメージ番号を返す ----------------------------------------\r
+*\r
+*      Parameter\r
+*              int Win : ウインドウ番号 (WIN_xxx)\r
+*              int Pos : 位置\r
+*\r
+*      Return Value\r
+*              int イメージ番号\r
+*                      4 Symlink\r
+*----------------------------------------------------------------------------*/\r
+static int GetImageIndex(int Win, int Pos)\r
+{\r
+       HWND hWnd;\r
+       LV_ITEM LvItem;\r
+\r
+       hWnd = GetLocalHwnd();\r
+       if(Win == WIN_REMOTE)\r
+               hWnd = GetRemoteHwnd();\r
+\r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
+       LvItem.mask = LVIF_IMAGE;\r
+       LvItem.iItem = Pos;\r
+       LvItem.iSubItem = 0;\r
+       SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
+       return LvItem.iImage;\r
+}\r
+\r
+\r
 /*----- 指定位置のアイテムのオーナ名を返す ------------------------------------\r
 *\r
 *      Parameter\r
@@ -2808,26 +2838,31 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
 \r
                                        if(Ignore == NO)\r
                                        {\r
-                                               Pkt.Node = NODE_DIR;\r
+                                               if(GetImageIndex(Win, Pos) == 4) // symlink\r
+                                                       Pkt.Node = NODE_FILE;\r
+                                               else\r
+                                                       Pkt.Node = NODE_DIR;\r
                                                Pkt.Attr = 0;\r
                                                Pkt.Size = 0;\r
                                                memset(&Pkt.Time, 0, sizeof(FILETIME));\r
                                                AddFileList(&Pkt, Base);\r
 \r
-                                               if(Win == WIN_LOCAL)\r
-                                                       MakeLocalTree(Name, Base);\r
-                                               else\r
-                                               {\r
-                                                       AskRemoteCurDir(Cur, FMAX_PATH);\r
-\r
-                                                       if((AskListCmdMode() == NO) &&\r
-                                                          (AskUseNLST_R() == YES))\r
-                                                               MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\r
+                                               if(GetImageIndex(Win, Pos) != 4) { // symlink\r
+                                                       if(Win == WIN_LOCAL)\r
+                                                               MakeLocalTree(Name, Base);\r
                                                        else\r
-                                                               MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
+                                                       {\r
+                                                               AskRemoteCurDir(Cur, FMAX_PATH);\r
+\r
+                                                               if((AskListCmdMode() == NO) &&\r
+                                                                  (AskUseNLST_R() == YES))\r
+                                                                       MakeRemoteTree1(Name, Cur, Base, CancelCheckWork);\r
+                                                               else\r
+                                                                       MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
 \r
 //DispListList(*Base, "LIST");\r
 \r
+                                                       }\r
                                                }\r
                                        }\r
                                }\r
@@ -3046,14 +3081,19 @@ static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelC
 \r
                                        /* まずディレクトリ名をセット */\r
                                        strcpy(Pkt.File, Pos->File);\r
-                                       Pkt.Node = NODE_DIR;\r
+                                       Pkt.Link = Pos->Link;\r
+                                       if(Pkt.Link)\r
+                                               Pkt.Node = NODE_FILE;\r
+                                       else\r
+                                               Pkt.Node = NODE_DIR;\r
                                        Pkt.Size = 0;\r
                                        Pkt.Attr = 0;\r
                                        memset(&Pkt.Time, 0, sizeof(FILETIME));\r
                                        AddFileList(&Pkt, Base);\r
 \r
                                        /* そのディレクトリの中を検索 */\r
-                                       MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
+                                       if(!Pkt.Link)\r
+                                               MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
                                }\r
                                Pos = Pos->Next;\r
                        }\r
@@ -5049,6 +5089,9 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                        // 不完全な実装のホストが存在するため以下の形式も許容\r
                        // fact1=value1;fact2=value2;fact3=value3 filename\r\n\r
                        // fact1=value1;fact2=value2;fact3=value3;filename\r\n\r
+                       // SymlinkはRFC3659の7.7.4. A More Complex Exampleに\r
+                       // よるとtype=OS.unix=slink:(target)だが\r
+                       // ProFTPDはtype=OS.unix=symlink:(target)となる\r
                case LIST_MLSD:\r
                        {\r
                                int i = 0;\r
@@ -5056,6 +5099,7 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                char Fact[FMAX_PATH + 1];\r
                                char Name[FMAX_PATH + 1];\r
                                char Value[FMAX_PATH + 1];\r
+                               char Value2[FMAX_PATH + 1];\r
                                char* pFileName;\r
                                strncpy(StrBuf, Str, FMAX_PATH * 2);\r
                                StrBuf[FMAX_PATH * 2] = '\0';\r
@@ -5086,6 +5130,12 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                                                Ret = NODE_DIR;\r
                                                        else if(_stricmp(Value, "file") == 0)\r
                                                                Ret = NODE_FILE;\r
+                                                       else if(_stricmp(Value, "OS.unix") == 0)\r
+                                                               if(FindField2(Fact, Value2, '=', 2, NO) == FFFTP_SUCCESS)\r
+                                                                       if(_stricmp(Value2, "symlink") == 0 || _stricmp(Value2, "slink") == 0) { // ProFTPD is symlink. A example of RFC3659 is slink.\r
+                                                                               Ret = NODE_DIR;\r
+                                                                               *Link = YES;\r
+                                                                       }\r
                                                }\r
                                                else if(_stricmp(Name, "size") == 0)\r
                                                {\r