// 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
}\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
\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
\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
// 不完全な実装のホストが存在するため以下の形式も許容\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
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
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