OSDN Git Service

Add prefix for file sizes.
[ffftp/ffftp.git] / filelist.c
old mode 100644 (file)
new mode 100755 (executable)
index 33edb2c..4cd3bd4
 / THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
 /============================================================================*/\r
 \r
-#define _WIN32_WINNT   0x400\r
+// UTF-8対応\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
@@ -80,8 +83,13 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
 static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LONGLONG Size, int Attr, int Type, int Link, char *Owner, int InfoExist, int Win);\r
 static void EraseDispFileList(FLISTANCHOR *Anchor);\r
 static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor);\r
-static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist);\r
-static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// ファイルアイコン表示対応\r
+//static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist);\r
+static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist, int ImageId);\r
+// 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
@@ -90,12 +98,14 @@ static int GetListOneLine(char *Buf, int Max, FILE *Fd);
 static int MakeDirPath(char *Str, int ListType, char *Path, char *Dir);\r
 static void MakeLocalTree(char *Path, FILELIST **Base);\r
 static void AddFileList(FILELIST *Pkt, FILELIST **Base);\r
-static int AnalizeFileInfo(char *Str);\r
+static int AnalyzeFileInfo(char *Str);\r
 static int CheckUnixType(char *Str, char *Tmp, int Add1, int Add2, int Day);\r
 static int CheckHHMMformat(char *Str);\r
 static int CheckYYMMDDformat(char *Str, char Sym, int Dig3);\r
 static int CheckYYYYMMDDformat(char *Str, char Sym);\r
-static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
+// Windows Server 2008 R2\r
+static int CheckMMDDYYYYformat(char *Str, char Sym);\r
+static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist);\r
 static int FindField(char *Str, char *Buf, int Num, int ToLast);\r
 // MLSD対応\r
 static int FindField2(char *Str, char *Buf, char Separator, int Num, int ToLast);\r
@@ -105,7 +115,9 @@ static int GetHourAndMinute(char *Str, WORD *Hour, WORD *Minute);
 static int GetVMSdate(char *Str, WORD *Year, WORD *Month, WORD *Day);\r
 static int CheckSpecialDirName(char *Fname);\r
 static int AskFilterStr(char *Fname, int Type);\r
-static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+// 64ビット対応\r
+//static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
+static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);\r
 static int atoi_n(const char *Str, int Len);\r
 \r
 /*===== 外部参照 =====*/\r
@@ -115,6 +127,10 @@ extern int RemoteWidth;
 extern int ListHeight;\r
 extern char FilterStr[FILTER_EXT_LEN+1];\r
 extern HWND hHelpWin;\r
+// 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+extern int SuppressRefresh;\r
+// ローカル側自動更新\r
+extern HANDLE ChangeNotification;\r
 \r
 /* 設定値 */\r
 extern int LocalWidth;\r
@@ -128,6 +144,12 @@ extern int DotFile;
 extern int DispIgnoreHide;\r
 extern int DispDrives;\r
 extern int MoveMode;\r
+// ファイルアイコン表示対応\r
+extern int DispFileIcon;\r
+// タイムスタンプのバグ修正\r
+extern int DispTimeSeconds;\r
+// ファイルの属性を数字で表示\r
+extern int DispPermissionsNumber;\r
 \r
 /*===== ローカルなワーク =====*/\r
 \r
@@ -138,6 +160,8 @@ static WNDPROC LocalProcPtr;
 static WNDPROC RemoteProcPtr;\r
 \r
 static HIMAGELIST ListImg = NULL;\r
+// ファイルアイコン表示対応\r
+static HIMAGELIST ListImgFileIcon = NULL;\r
 \r
 static char FindStr[40+1] = { "*" };           /* 検索文字列 */\r
 static int IgnoreNew = NO;\r
@@ -172,6 +196,9 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
        LV_COLUMN LvCol;\r
        long Tmp;\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvCol, 0, sizeof(LV_COLUMN));\r
+\r
        /*===== ローカル側のリストビュー =====*/\r
 \r
        hWndListLocal = CreateWindowEx(/*WS_EX_STATICEDGE*/WS_EX_CLIENTEDGE,\r
@@ -182,7 +209,9 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
 \r
        if(hWndListLocal != NULL)\r
        {\r
-               LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc);\r
+               // 64ビット対応\r
+//             LocalProcPtr = (WNDPROC)SetWindowLong(hWndListLocal, GWL_WNDPROC, (LONG)LocalWndProc);\r
+               LocalProcPtr = (WNDPROC)SetWindowLongPtr(hWndListLocal, GWLP_WNDPROC, (LONG_PTR)LocalWndProc);\r
 \r
            Tmp = SendMessage(hWndListLocal, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
            Tmp |= LVS_EX_FULLROWSELECT;\r
@@ -231,7 +260,9 @@ int MakeListWin(HWND hWnd, HINSTANCE hInst)
 \r
        if(hWndListRemote != NULL)\r
        {\r
-               RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc);\r
+               // 64ビット対応\r
+//             RemoteProcPtr = (WNDPROC)SetWindowLong(hWndListRemote, GWL_WNDPROC, (LONG)RemoteWndProc);\r
+               RemoteProcPtr = (WNDPROC)SetWindowLongPtr(hWndListRemote, GWLP_WNDPROC, (LONG_PTR)RemoteWndProc);\r
 \r
            Tmp = SendMessage(hWndListRemote, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0);\r
            Tmp |= LVS_EX_FULLROWSELECT;\r
@@ -433,9 +464,11 @@ static void doTransferRemoteFile(void)
        int CancelFlg = NO;\r
        char LocDir[FMAX_PATH+1];\r
        char TmpDir[FMAX_PATH+1];\r
-       char buf[32];\r
+       // 環境依存の不具合対策\r
+//     char buf[32];\r
        int i;\r
-       DWORD pid;\r
+       // 環境依存の不具合対策\r
+//     DWORD pid;\r
 \r
        // すでにリモートから転送済みなら何もしない。(2007.9.3 yutaka)\r
        if (remoteFileListBase != NULL)\r
@@ -451,10 +484,15 @@ static void doTransferRemoteFile(void)
 \r
        // アプリを多重起動してもコンフリクトしないように、テンポラリフォルダ名にプロセスID\r
        // を付加する。(2007.9.13 yutaka)\r
-       GetTempPath(sizeof(TmpDir), TmpDir);\r
-       pid = GetCurrentProcessId();\r
-       _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid);\r
-       strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE);\r
+       // 環境依存の不具合対策\r
+//     GetTempPath(sizeof(TmpDir), TmpDir);\r
+//     pid = GetCurrentProcessId();\r
+//     _snprintf_s(buf, sizeof(buf), _TRUNCATE, "ffftp%d", pid);\r
+//     strncat_s(TmpDir, sizeof(TmpDir), buf, _TRUNCATE);\r
+       GetAppTempPath(TmpDir);\r
+       _mkdir(TmpDir);\r
+       SetYenTail(TmpDir);\r
+       strcat(TmpDir, "file");\r
        _mkdir(TmpDir);\r
 #if 0\r
        if (TmpDir[strlen(TmpDir) - 1] == '\\') {\r
@@ -473,6 +511,11 @@ static void doTransferRemoteFile(void)
                remove(fn);\r
        }\r
 \r
+       // 同時接続対応\r
+       DisableUserOpe();\r
+       // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+       SuppressRefresh = 1;\r
+\r
        // ダウンロード先をテンポラリに設定\r
        SetLocalDirHist(TmpDir);\r
 \r
@@ -504,6 +547,12 @@ static void doTransferRemoteFile(void)
        SetLocalDirHist(LocDir);\r
        SetCurrentDirAsDirHist();\r
 \r
+       // 外部アプリケーションへドロップ後にローカル側のファイル一覧に作業フォルダが表示されるバグ対策\r
+       SuppressRefresh = 0;\r
+       GetLocalDirForWnd();\r
+       // 同時接続対応\r
+       EnableUserOpe();\r
+\r
        remoteFileListBase = FileListBase;  // あとでフリーすること\r
        remoteFileListBaseNoExpand = FileListBaseNoExpand;  // あとでフリーすること\r
        strncpy_s(remoteFileDir, sizeof(remoteFileDir), TmpDir, _TRUNCATE);\r
@@ -766,6 +815,9 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                        return(CallWindowProc(ProcPtr, hWnd, message, wParam, lParam));\r
 \r
                case WM_DROPFILES :\r
+                       // 同時接続対応\r
+                       if(AskUserOpeDisabled() == YES)\r
+                               break;\r
                        // ドラッグ中は処理しない。ドラッグ後にWM_LBUTTONDOWNが飛んでくるため、そこで処理する。\r
                        if (Dragging == YES) \r
                                return (FALSE);\r
@@ -773,7 +825,7 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                        if(hWnd == hWndListRemote)\r
                        {\r
                                if(AskConnecting() == YES)\r
-                                       UpLoadDragProc(wParam);\r
+                                       UploadDragProc(wParam);\r
                        }\r
                        else if(hWnd == hWndListLocal)\r
                        {\r
@@ -798,6 +850,9 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                hCsrDrg = LoadCursor(NULL, IDC_ARROW);\r
                                SetCursor(hCsrDrg);\r
 \r
+                               // 同時接続対応\r
+                               if(AskUserOpeDisabled() == YES)\r
+                                       break;\r
                                Point.x = (long)(short)LOWORD(lParam);\r
                                Point.y = (long)(short)HIWORD(lParam);\r
                                ClientToScreen(hWnd, &Point);\r
@@ -853,7 +908,10 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
                                                PathDir = LocDir;\r
  \r
                                                FileListBase = NULL;\r
-                                               MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
+                                               // ローカル側からアプリケーションにD&Dできないバグ修正\r
+//                                             MakeSelectedFileList(WIN_LOCAL, YES, NO, &FileListBase, &CancelFlg);                    \r
+                                               MakeSelectedFileList(WIN_LOCAL, NO, NO, &FileListBase, &CancelFlg);                     \r
+                                               FileListBaseNoExpand = FileListBase;\r
  \r
                                        } else if (hWndDragStart == hWndListRemote) {\r
                                                GetCursorPos(&Point);\r
@@ -875,6 +933,11 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA
  \r
                                        } \r
  \r
+#if defined(HAVE_TANDEM)\r
+                                       if(FileListBaseNoExpand == NULL)\r
+                                               pf = FileListBase;\r
+                                       else\r
+#endif\r
                                        pf = FileListBaseNoExpand;\r
                                        for (filenum = 0; pf ; filenum++) {\r
                                                pf = pf->Next;\r
@@ -1089,6 +1152,9 @@ void GetListTabWidth(void)
        LV_COLUMN LvCol;\r
        int i;\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvCol, 0, sizeof(LV_COLUMN));\r
+\r
        for(i = 0; i <= 3; i++)\r
        {\r
                LvCol.mask = LVCF_WIDTH;\r
@@ -1117,32 +1183,50 @@ void GetListTabWidth(void)
 \r
 void SetListViewType(void)\r
 {\r
-       long lStyle;\r
+       // 64ビット対応\r
+//     long lStyle;\r
+       LONG_PTR lStyle;\r
 \r
        switch(ListType)\r
        {\r
                case LVS_LIST :\r
-                       lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+                       // 64ビット対応\r
+//                     lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+                       lStyle = GetWindowLongPtr(GetLocalHwnd(), GWL_STYLE);\r
                        lStyle &= ~(LVS_REPORT | LVS_LIST);\r
                        lStyle |= LVS_LIST;\r
-                       SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+                       // 64ビット対応\r
+//                     SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+                       SetWindowLongPtr(GetLocalHwnd(), GWL_STYLE, lStyle);\r
 \r
-                       lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+                       // 64ビット対応\r
+//                     lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+                       lStyle = GetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE);\r
                        lStyle &= ~(LVS_REPORT | LVS_LIST);\r
                        lStyle |= LVS_LIST;\r
-                       SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+                       // 64ビット対応\r
+//                     SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+                       SetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
                        break;\r
 \r
                default :\r
-                       lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+                       // 64ビット対応\r
+//                     lStyle = GetWindowLong(GetLocalHwnd(), GWL_STYLE);\r
+                       lStyle = GetWindowLongPtr(GetLocalHwnd(), GWL_STYLE);\r
                        lStyle &= ~(LVS_REPORT | LVS_LIST);\r
                        lStyle |= LVS_REPORT;\r
-                       SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+                       // 64ビット対応\r
+//                     SetWindowLong(GetLocalHwnd(), GWL_STYLE, lStyle);\r
+                       SetWindowLongPtr(GetLocalHwnd(), GWL_STYLE, lStyle);\r
 \r
-                       lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+                       // 64ビット対応\r
+//                     lStyle = GetWindowLong(GetRemoteHwnd(), GWL_STYLE);\r
+                       lStyle = GetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE);\r
                        lStyle &= ~(LVS_REPORT | LVS_LIST);\r
                        lStyle |= LVS_REPORT;\r
-                       SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+                       // 64ビット対応\r
+//                     SetWindowLong(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
+                       SetWindowLongPtr(GetRemoteHwnd(), GWL_STYLE, lStyle);\r
                        break;\r
        }\r
        return;\r
@@ -1219,9 +1303,9 @@ void GetRemoteDirForWnd(int Mode, int *CancelCheckWork)
 \r
                                while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)\r
                                {\r
-                                       if((ListType = AnalizeFileInfo(Str)) != LIST_UNKNOWN)\r
+                                       if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)\r
                                        {\r
-                                               if((Type = ResolvFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE)\r
+                                               if((Type = ResolveFileInfo(Str, ListType, Buf, &Size, &Time, &Attr, Owner, &Link, &InfoExist)) != NODE_NONE)\r
                                                {\r
                                                        if(AskFilterStr(Buf, Type) == YES)\r
                                                        {\r
@@ -1279,6 +1363,64 @@ void GetRemoteDirForWnd(int Mode, int *CancelCheckWork)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
+// ファイルアイコン表示対応\r
+void RefreshIconImageList(FLISTANCHOR *Anchor)\r
+{\r
+       HBITMAP hBitmap;\r
+       int ImageId;\r
+       FILELIST *Pos;\r
+       int i;\r
+       char Cur[FMAX_PATH+1];\r
+       SHFILEINFO FileInfo;\r
+       if(DispFileIcon == YES)\r
+       {\r
+               SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL);\r
+               ShowWindow(hWndListLocal, SW_SHOW);\r
+               SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)NULL);\r
+               ShowWindow(hWndListRemote, SW_SHOW);\r
+               ImageList_Destroy(ListImgFileIcon);\r
+               ListImgFileIcon = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 0, 1);\r
+               hBitmap = LoadBitmap(GetFtpInst(), MAKEINTRESOURCE(dirattr16_bmp));\r
+               ImageList_AddMasked(ListImgFileIcon, hBitmap, RGB(255, 0, 0));\r
+               DeleteObject(hBitmap);\r
+               ImageId = 0;\r
+               Pos = Anchor->Top;\r
+               for(i = 0; i < Anchor->Files; i++)\r
+               {\r
+                       Pos->ImageId = -1;\r
+                       if(Pos->Node == NODE_DRIVE)\r
+                               strcpy(Cur, Pos->File);\r
+                       else\r
+                       {\r
+                               AskLocalCurDir(Cur, FMAX_PATH);\r
+                               SetYenTail(Cur);\r
+                               strcat(Cur, Pos->File);\r
+                       }\r
+                       if(SHGetFileInfo(Cur, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_SMALLICON | SHGFI_ICON) != 0)\r
+                       {\r
+                               if(ImageList_AddIcon(ListImgFileIcon, FileInfo.hIcon) >= 0)\r
+                               {\r
+                                       Pos->ImageId = ImageId;\r
+                                       ImageId++;\r
+                               }\r
+                               DestroyIcon(FileInfo.hIcon);\r
+                       }\r
+                       Pos = Pos->Next;\r
+               }\r
+               SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon);\r
+               ShowWindow(hWndListLocal, SW_SHOW);\r
+               SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImgFileIcon);\r
+               ShowWindow(hWndListRemote, SW_SHOW);\r
+       }\r
+       else\r
+       {\r
+               SendMessage(hWndListLocal, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);\r
+               ShowWindow(hWndListLocal, SW_SHOW);\r
+               SendMessage(hWndListRemote, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)ListImg);\r
+               ShowWindow(hWndListRemote, SW_SHOW);\r
+       }\r
+}\r
+\r
 void GetLocalDirForWnd(void)\r
 {\r
        HANDLE fHnd;\r
@@ -1298,6 +1440,11 @@ void GetLocalDirForWnd(void)
        SetLocalDirHist(Scan);\r
        DispLocalFreeSpace(Scan);\r
 \r
+       // ローカル側自動更新\r
+       if(ChangeNotification != INVALID_HANDLE_VALUE)\r
+               FindCloseChangeNotification(ChangeNotification);\r
+       ChangeNotification = FindFirstChangeNotification(Scan, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE);\r
+\r
        /* ディレクトリ/ファイル */\r
 \r
        SetYenTail(Scan);\r
@@ -1331,7 +1478,7 @@ void GetLocalDirForWnd(void)
        if(DispDrives)\r
        {\r
                GetLogicalDriveStrings(FMAX_PATH, Scan);\r
-               NoDrives = LoadHideDriveListRegistory();\r
+               NoDrives = LoadHideDriveListRegistry();\r
 \r
                Pos = Scan;\r
                while(*Pos != NUL)\r
@@ -1347,6 +1494,8 @@ void GetLocalDirForWnd(void)
                }\r
        }\r
 \r
+       // ファイルアイコン表示対応\r
+       RefreshIconImageList(&Anchor);\r
        DispFileList2View(GetLocalHwnd(), &Anchor);\r
        EraseDispFileList(&Anchor);\r
 \r
@@ -1411,15 +1560,36 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON
 \r
                        if((Sort & SORT_GET_ORD) == SORT_ASCENT)\r
                        {\r
-                               if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
-                                       ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||\r
-                                  (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
-                                       ((Cmp = Size - Pos->Size) < 0)) ||\r
-                                  (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
-                                       ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)))\r
-                               {\r
+                               // 読みにくいのでリファクタリング\r
+//                             if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+//                                     ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) ||\r
+//#if defined(HAVE_TANDEM)\r
+//                                ((AskHostType() == HTYPE_TANDEM) &&\r
+//                                 ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+//                                     ((Cmp = Attr - Pos->Attr) < 0)) ||\r
+//#endif\r
+//                                (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+//                                     ((Cmp = Size - Pos->Size) < 0)) ||\r
+//                                (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+//                                     ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0)))\r
+//                             {\r
+//                                     break;\r
+//                             }\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+                                       ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0))\r
+                                       break;\r
+#if defined(HAVE_TANDEM)\r
+                               if((AskHostType() == HTYPE_TANDEM) &&\r
+                                       ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+                                       ((Cmp = Attr - Pos->Attr) < 0))\r
+                                       break;\r
+#endif\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+                                       ((Cmp = Size - Pos->Size) < 0))\r
+                                       break;\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+                                       ((Cmp = CompareFileTime(Time, &Pos->Time)) < 0))\r
                                        break;\r
-                               }\r
 \r
                                if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
                                {\r
@@ -1429,15 +1599,36 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON
                        }\r
                        else\r
                        {\r
+                               // 読みにくいのでリファクタリング\r
+//                             if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+//                                     ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
+//#if defined(HAVE_TANDEM)\r
+//                                ((AskHostType() == HTYPE_TANDEM) &&\r
+//                                 ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+//                                     ((Cmp = Attr - Pos->Attr) > 0)) ||\r
+//#endif\r
+//                                (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+//                                     ((Cmp = Size - Pos->Size) > 0)) ||\r
+//                                (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+//                                     ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
+//                             {\r
+//                                     break;\r
+//                             }\r
                                if((((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
-                                       ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) ||\r
-                                  (((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
-                                       ((Cmp = Size - Pos->Size) > 0)) ||\r
-                                  (((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
-                                       ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0)))\r
-                               {\r
+                                       ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)))\r
+                                       break;\r
+#if defined(HAVE_TANDEM)\r
+                               if(((AskHostType() == HTYPE_TANDEM) &&\r
+                                   ((Sort & SORT_MASK_ORD) == SORT_EXT) &&\r
+                                       ((Cmp = Attr - Pos->Attr) > 0)))\r
+                                       break;\r
+#endif\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_SIZE) &&\r
+                                       ((Cmp = Size - Pos->Size) > 0))\r
+                                       break;\r
+                               if(((Sort & SORT_MASK_ORD) == SORT_DATE) &&\r
+                                       ((Cmp = CompareFileTime(Time, &Pos->Time)) > 0))\r
                                        break;\r
-                               }\r
 \r
                                if(((Sort & SORT_MASK_ORD) == SORT_NAME) || (Cmp == 0))\r
                                {\r
@@ -1526,7 +1717,9 @@ static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor)
        Pos = Anchor->Top;\r
        for(i = 0; i < Anchor->Files; i++)\r
        {\r
-               AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist);\r
+               // ファイルアイコン表示対応\r
+//             AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist);\r
+               AddListView(hWnd, -1, Pos->File, Pos->Node, Pos->Size, &Pos->Time, Pos->Attr, Pos->Owner, Pos->Link, Pos->InfoExist, Pos->ImageId);\r
                Pos = Pos->Next;\r
        }\r
 \r
@@ -1556,7 +1749,9 @@ static void DispFileList2View(HWND hWnd, FLISTANCHOR *Anchor)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist)\r
+// ファイルアイコン表示対応\r
+//static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist)\r
+static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, FILETIME *Time, int Attr, char *Owner, int Link, int InfoExist, int ImageId)\r
 {\r
        LV_ITEM LvItem;\r
        char Tmp[20];\r
@@ -1564,6 +1759,8 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
        if(Pos == -1)\r
                Pos = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0);\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        /* アイコン/ファイル名 */\r
        LvItem.mask = LVIF_TEXT | LVIF_IMAGE;\r
        LvItem.iItem = Pos;\r
@@ -1575,10 +1772,15 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
                LvItem.iImage = Type;\r
        else\r
                LvItem.iImage = 4;\r
+       // ファイルアイコン表示対応\r
+       if(DispFileIcon == YES && hWnd == GetLocalHwnd())\r
+               LvItem.iImage = ImageId + 5;\r
        LvItem.iItem = SendMessage(hWnd, LVM_INSERTITEM, 0, (LPARAM)&LvItem);\r
 \r
        /* 日付/時刻 */\r
-       FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist);\r
+       // タイムスタンプのバグ修正\r
+//     FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist);\r
+       FileTime2TimeString(Time, Tmp, DISPFORM_LEGACY, InfoExist, DispTimeSeconds);\r
        LvItem.mask = LVIF_TEXT;\r
        LvItem.iItem = Pos;\r
        LvItem.iSubItem = 1;\r
@@ -1604,6 +1806,12 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
        LvItem.mask = LVIF_TEXT;\r
        LvItem.iItem = Pos;\r
        LvItem.iSubItem = 3;\r
+#if defined(HAVE_TANDEM)\r
+       if (AskHostType() == HTYPE_TANDEM) {\r
+               _itoa_s(Attr, Tmp, sizeof(Tmp), 10);\r
+               LvItem.pszText = Tmp;\r
+       } else\r
+#endif\r
        LvItem.pszText = GetFileExt(Name);\r
        LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem);\r
 \r
@@ -1611,8 +1819,14 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size,
        {\r
                /* 属性 */\r
                strcpy(Tmp, "");\r
+#if defined(HAVE_TANDEM)\r
+               if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM))\r
+#else\r
                if(InfoExist & FINFO_ATTR)\r
-                       AttrValue2String(Attr, Tmp);\r
+#endif\r
+                       // ファイルの属性を数字で表示\r
+//                     AttrValue2String(Attr, Tmp);\r
+                       AttrValue2String(Attr, Tmp, DispPermissionsNumber);\r
                LvItem.mask = LVIF_TEXT;\r
                LvItem.iItem = Pos;\r
                LvItem.iSubItem = 4;\r
@@ -1659,7 +1873,9 @@ void ReSortDispList(int Win, int *CancelCheckWork)
 *              なし\r
 *----------------------------------------------------------------------------*/\r
 \r
-void SelectFileInList(HWND hWnd, int Type)\r
+// ローカル側自動更新\r
+//void SelectFileInList(HWND hWnd, int Type)\r
+void SelectFileInList(HWND hWnd, int Type, FILELIST *Base)\r
 {\r
        int Win;\r
        int WinDst;\r
@@ -1673,6 +1889,8 @@ void SelectFileInList(HWND hWnd, int Type)
        FILETIME Time2;\r
        int Find;\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        Win = WIN_LOCAL;\r
        WinDst = WIN_REMOTE;\r
        if(hWnd == GetRemoteHwnd())\r
@@ -1775,6 +1993,22 @@ void SelectFileInList(HWND hWnd, int Type)
                                }\r
                        }\r
                        break;\r
+\r
+               // ローカル側自動更新\r
+               case SELECT_LIST :\r
+                       for(i = 0; i < Num; i++)\r
+                       {\r
+                               LvItem.state = 0;\r
+                               GetNodeName(Win, i, Name, FMAX_PATH);\r
+                               if(SearchFileList(Name, Base, COMP_STRICT) != NULL)\r
+                                       LvItem.state = LVIS_SELECTED;\r
+                               LvItem.mask = LVIF_STATE;\r
+                               LvItem.iItem = i;\r
+                               LvItem.stateMask = LVIS_SELECTED;\r
+                               LvItem.iSubItem = 0;\r
+                               SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
+                       }\r
+                       break;\r
        }\r
        return;\r
 }\r
@@ -1792,7 +2026,9 @@ void SelectFileInList(HWND hWnd, int Type)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK SelectDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 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
 {\r
        switch (iMessage)\r
        {\r
@@ -1851,6 +2087,8 @@ void FindFileInList(HWND hWnd, int Type)
        LV_ITEM LvItem;\r
        char *Title;\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        Win = WIN_LOCAL;\r
        Title = MSGJPN050;\r
        if(hWnd == GetRemoteHwnd())\r
@@ -2112,6 +2350,58 @@ int GetNextSelected(int Win, int Pos, int All)
 }\r
 \r
 \r
+// ローカル側自動更新\r
+int GetHotSelected(int Win, char *Fname)\r
+{\r
+       HWND hWnd;\r
+       int Pos;\r
+\r
+       hWnd = GetLocalHwnd();\r
+       if(Win == WIN_REMOTE)\r
+               hWnd = GetRemoteHwnd();\r
+\r
+       Pos = SendMessage(hWnd, LVM_GETNEXTITEM, (WPARAM)-1, (LPARAM)MAKELPARAM(LVNI_FOCUSED, 0));\r
+       if(Pos != -1)\r
+               GetNodeName(Win, Pos, Fname, FMAX_PATH);\r
+\r
+       return Pos;\r
+}\r
+\r
+int SetHotSelected(int Win, char *Fname)\r
+{\r
+       HWND hWnd;\r
+       int i;\r
+       int Num;\r
+       char Name[FMAX_PATH+1];\r
+       LV_ITEM LvItem;\r
+       int Pos;\r
+\r
+       hWnd = GetLocalHwnd();\r
+       if(Win == WIN_REMOTE)\r
+               hWnd = GetRemoteHwnd();\r
+\r
+       Num = GetItemCount(Win);\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
+       Pos = -1;\r
+       for(i = 0; i < Num; i++)\r
+       {\r
+               LvItem.state = 0;\r
+               GetNodeName(Win, i, Name, FMAX_PATH);\r
+               if(_mbscmp(Fname, Name) == 0)\r
+               {\r
+                       Pos = i;\r
+                       LvItem.state = LVIS_FOCUSED;\r
+               }\r
+               LvItem.mask = LVIF_STATE;\r
+               LvItem.iItem = i;\r
+               LvItem.stateMask = LVIS_FOCUSED;\r
+               LvItem.iSubItem = 0;\r
+               SendMessage(hWnd, LVM_SETITEMSTATE, i, (LPARAM)&LvItem);\r
+       }\r
+\r
+       return Pos;\r
+}\r
+\r
 /*----- 指定された名前のアイテムを探す ----------------------------------------\r
 *\r
 *      Parameter\r
@@ -2132,6 +2422,8 @@ int FindNameNode(int Win, char *Name)
        if(Win == WIN_REMOTE)\r
                hWnd = GetRemoteHwnd();\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&FindInfo, 0, sizeof(LV_FINDINFO));\r
        FindInfo.flags = LVFI_STRING;\r
        FindInfo.psz = Name;\r
        return(SendMessage(hWnd, LVM_FINDITEM, -1, (LPARAM)&FindInfo));\r
@@ -2159,6 +2451,8 @@ void GetNodeName(int Win, int Pos, char *Buf, int Max)
        if(Win == WIN_REMOTE)\r
                hWnd = GetRemoteHwnd();\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        LvItem.mask = LVIF_TEXT;\r
        LvItem.iItem = Pos;\r
        LvItem.iSubItem = 0;\r
@@ -2192,6 +2486,8 @@ int GetNodeTime(int Win, int Pos, FILETIME *Buf)
        if(Win == WIN_REMOTE)\r
                hWnd = GetRemoteHwnd();\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        LvItem.mask = LVIF_TEXT;\r
        LvItem.iItem = Pos;\r
        LvItem.iSubItem = 1;\r
@@ -2226,6 +2522,8 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf)
        if(Win == WIN_REMOTE)\r
                hWnd = GetRemoteHwnd();\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        LvItem.mask = LVIF_TEXT;\r
        LvItem.iItem = Pos;\r
        LvItem.iSubItem = 2;\r
@@ -2234,6 +2532,13 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf)
        SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem);\r
        *Buf = -1;\r
        Ret = NO;\r
+#if defined(HAVE_TANDEM)\r
+       if(AskHostType() == HTYPE_TANDEM) {\r
+               RemoveComma(Tmp);\r
+               *Buf = _atoi64(Tmp);\r
+               Ret = YES;\r
+       } else\r
+#endif\r
        if(strlen(Tmp) > 0)\r
        {\r
                RemoveComma(Tmp);\r
@@ -2266,14 +2571,26 @@ int GetNodeAttr(int Win, int Pos, int *Buf)
        Ret = NO;\r
        if(Win == WIN_REMOTE)\r
        {\r
+               // 変数が未初期化のバグ修正\r
+               memset(&LvItem, 0, sizeof(LV_ITEM));\r
                LvItem.mask = LVIF_TEXT;\r
                LvItem.iItem = Pos;\r
+#if defined(HAVE_TANDEM)\r
+               if(AskHostType() == HTYPE_TANDEM)\r
+                       LvItem.iSubItem = 3;\r
+               else\r
+#endif\r
                LvItem.iSubItem = 4;\r
                LvItem.pszText = Tmp;\r
                LvItem.cchTextMax = 20;\r
                SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem);\r
                if(strlen(Tmp) > 0)\r
                {\r
+#if defined(HAVE_TANDEM)\r
+                       if(AskHostType() == HTYPE_TANDEM)\r
+                               *Buf = atoi(Tmp);\r
+                       else\r
+#endif\r
                        *Buf = AttrString2Value(Tmp);\r
                        Ret = YES;\r
                }\r
@@ -2303,6 +2620,8 @@ int GetNodeType(int Win, int Pos)
        if(Win == WIN_REMOTE)\r
                hWnd = GetRemoteHwnd();\r
 \r
+       // 変数が未初期化のバグ修正\r
+       memset(&LvItem, 0, sizeof(LV_ITEM));\r
        LvItem.mask = LVIF_TEXT;\r
        LvItem.iItem = Pos;\r
        LvItem.iSubItem = 2;\r
@@ -2321,6 +2640,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
@@ -2340,6 +2688,8 @@ void GetNodeOwner(int Win, int Pos, char *Buf, int Max)
        strcpy(Buf, "");\r
        if(Win == WIN_REMOTE)\r
        {\r
+               // 変数が未初期化のバグ修正\r
+               memset(&LvItem, 0, sizeof(LV_ITEM));\r
                LvItem.mask = LVIF_TEXT;\r
                LvItem.iItem = Pos;\r
                LvItem.iSubItem = 5;\r
@@ -2439,6 +2789,9 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
                        if((Node == NODE_FILE) ||\r
                           ((Expand == NO) && (Node == NODE_DIR)))\r
                        {\r
+                               // 変数が未初期化のバグ修正\r
+                               memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                Pkt.InfoExist = 0;\r
                                GetNodeName(Win, Pos, Pkt.File, FMAX_PATH);\r
                                if(GetNodeSize(Win, Pos, &Pkt.Size) == YES)\r
@@ -2475,6 +2828,9 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
                        {\r
                                if(GetNodeType(Win, Pos) == NODE_DIR)\r
                                {\r
+                                       // 変数が未初期化のバグ修正\r
+                                       memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                        GetNodeName(Win, Pos, Name, FMAX_PATH);\r
                                        strcpy(Pkt.File, Name);\r
                                        ReplaceAll(Pkt.File, '\\', '/');\r
@@ -2494,26 +2850,44 @@ void MakeSelectedFileList(int Win, int Expand, int All, FILELIST **Base, int *Ca
 \r
                                        if(Ignore == NO)\r
                                        {\r
-                                               Pkt.Node = NODE_DIR;\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(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
+//                                                     else\r
+//                                                             MakeRemoteTree2(Name, Cur, Base, CancelCheckWork);\r
+//                                             }\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
@@ -2572,14 +2946,26 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base)
 \r
                if((GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY) == 0)\r
                {\r
+                       // 変数が未初期化のバグ修正\r
+                       memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                        Pkt.Node = NODE_FILE;\r
                        strcpy(Pkt.File, GetFileName(Name));\r
 \r
                        memset(&Pkt.Time, 0, sizeof(FILETIME));\r
+#if defined(HAVE_TANDEM)\r
+                       /* Guardian スペースへのアップロードのためにサイズが必要 */\r
+                       Pkt.Size = 0;\r
+                       Pkt.InfoExist = 0;\r
+#endif\r
                        if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE)\r
                        {\r
                                FindClose(fHnd);\r
                                Pkt.Time = Find.ftLastWriteTime;\r
+#if defined(HAVE_TANDEM)\r
+                               Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow);\r
+                               Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
+#endif\r
                        }\r
                        AddFileList(&Pkt, Base);\r
                }\r
@@ -2593,6 +2979,9 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base)
 \r
                if(GetFileAttributes(Name) & FILE_ATTRIBUTE_DIRECTORY)\r
                {\r
+                       // 変数が未初期化のバグ修正\r
+                       memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                        Pkt.Node = NODE_DIR;\r
                        strcpy(Pkt.File, GetFileName(Name));\r
                        AddFileList(&Pkt, Base);\r
@@ -2712,16 +3101,26 @@ static void MakeRemoteTree2(char *Path, char *Cur, FILELIST **Base, int *CancelC
                        {\r
                                if(Pos->Node == NODE_DIR)\r
                                {\r
+                                       // 変数が未初期化のバグ修正\r
+                                       memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                        /* まずディレクトリ名をセット */\r
                                        strcpy(Pkt.File, Pos->File);\r
-                                       Pkt.Node = NODE_DIR;\r
+//                                     Pkt.Node = NODE_DIR;\r
+                                       Pkt.Link = Pos->Link;\r
+                                       if(Pkt.Link == YES)\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
+//                                     MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
+                                       if(Pkt.Link == NO)\r
+                                               MakeRemoteTree2(Pos->File, Cur, Base, CancelCheckWork);\r
                                }\r
                                Pos = Pos->Next;\r
                        }\r
@@ -2796,12 +3195,15 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base)
 \r
                while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)\r
                {\r
-                       if((ListType = AnalizeFileInfo(Str)) == LIST_UNKNOWN)\r
+                       if((ListType = AnalyzeFileInfo(Str)) == LIST_UNKNOWN)\r
                        {\r
                                if(MakeDirPath(Str, ListType, Path, Dir) == FFFTP_SUCCESS)\r
                                {\r
                                        if(IncDir == RDIR_NLST)\r
                                        {\r
+                                               // 変数が未初期化のバグ修正\r
+                                               memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                                strcpy(Pkt.File, Dir);\r
                                                Pkt.Node = NODE_DIR;\r
                                                Pkt.Size = 0;\r
@@ -2813,13 +3215,16 @@ void AddRemoteTreeToFileList(int Num, char *Path, int IncDir, FILELIST **Base)
                        }\r
                        else\r
                        {\r
-                               Node = ResolvFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
+                               Node = ResolveFileInfo(Str, ListType, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
 \r
                                if(AskFilterStr(Name, Node) == YES)\r
                                {\r
                                        if((Node == NODE_FILE) ||\r
                                           ((IncDir == RDIR_CWD) && (Node == NODE_DIR)))\r
                                        {\r
+                                               // 変数が未初期化のバグ修正\r
+                                               memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                                strcpy(Pkt.File, Dir);\r
                                                if(strlen(Pkt.File) > 0)\r
                                                        SetSlashTail(Pkt.File);\r
@@ -2987,6 +3392,9 @@ static void MakeLocalTree(char *Path, FILELIST **Base)
                        {\r
                                if(AskFilterStr(FindBuf.cFileName, NODE_FILE) == YES)\r
                                {\r
+                                       // 変数が未初期化のバグ修正\r
+                                       memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                        strcpy(Pkt.File, Path);\r
                                        SetSlashTail(Pkt.File);\r
                                        strcat(Pkt.File, FindBuf.cFileName);\r
@@ -2996,7 +3404,10 @@ static void MakeLocalTree(char *Path, FILELIST **Base)
                                        Pkt.Attr = 0;\r
                                        Pkt.Time = FindBuf.ftLastWriteTime;\r
                                        FileTimeToSystemTime(&Pkt.Time, &TmpStime);\r
-                                       TmpStime.wSecond = 0;\r
+                                       // タイムスタンプのバグ修正\r
+//                                     TmpStime.wSecond = 0;\r
+                                       if(DispTimeSeconds == NO)\r
+                                               TmpStime.wSecond = 0;\r
                                        TmpStime.wMilliseconds = 0;\r
                                        SystemTimeToFileTime(&TmpStime, &Pkt.Time);\r
                                        AddFileList(&Pkt, Base);\r
@@ -3015,6 +3426,9 @@ static void MakeLocalTree(char *Path, FILELIST **Base)
                           (strcmp(FindBuf.cFileName, ".") != 0) &&\r
                           (strcmp(FindBuf.cFileName, "..") != 0))\r
                        {\r
+                               // 変数が未初期化のバグ修正\r
+                               memset(&Pkt, 0, sizeof(FILELIST));\r
+\r
                                strcpy(Src, Path);\r
                                SetYenTail(Src);\r
                                strcat(Src, FindBuf.cFileName);\r
@@ -3162,7 +3576,7 @@ FILELIST *SearchFileList(char *Fname, FILELIST *Base, int Caps)
 *              int リストタイプ (LIST_xxx)\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int AnalizeFileInfo(char *Str)\r
+static int AnalyzeFileInfo(char *Str)\r
 {\r
        int Ret;\r
        char Tmp[FMAX_PATH+1];\r
@@ -3192,11 +3606,26 @@ static int AnalizeFileInfo(char *Str)
                Ret = LIST_SHIBASOKU;\r
        else\r
        {\r
+               // MLSD対応\r
+               if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
+               {\r
+                       _strlwr(Tmp);\r
+                       if(strstr(Tmp, "type=") != NULL)\r
+                       {\r
+                               if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
+                               {\r
+                                       Ret = LIST_MLSD;\r
+                               }\r
+                       }\r
+               }\r
+\r
                /* 以下のフォーマットをチェック */\r
                /* LIST_UNIX_10, LIST_UNIX_20, LIST_UNIX_12, LIST_UNIX_22, LIST_UNIX_50, LIST_UNIX_60 */\r
                /* MELCOM80 */\r
 \r
-               if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
+               // MLSD対応\r
+//             if(FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
+               if(Ret == LIST_UNKNOWN && FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS)\r
                {\r
                        /* MELCOM80は "d rwxrwxrwx" のようにスペースが空いている */\r
                        Flag1 = NO;\r
@@ -3292,8 +3721,30 @@ static int AnalizeFileInfo(char *Str)
                                        }\r
                                }\r
 \r
+                               // linux-ftpd\r
+                               if((Ret == LIST_UNKNOWN) &&\r
+                                  (FindField(Str, Tmp, 7+Add1, NO) == FFFTP_SUCCESS))\r
+                               {\r
+                                       if((FindField(Str, Tmp, 5, NO) == FFFTP_SUCCESS) &&\r
+                                          (CheckYYYYMMDDformat(Tmp, NUL) != 0))\r
+                                       {\r
+                                               if((FindField(Str, Tmp, 6, NO) == FFFTP_SUCCESS) &&\r
+                                                  (CheckHHMMformat(Tmp) == YES))\r
+                                               {\r
+                                                       Ret = LIST_UNIX_16;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
                                if((Ret != LIST_UNKNOWN) && (Flag1 == YES))\r
                                        Ret |= LIST_MELCOM;\r
+\r
+                               // uClinux\r
+                               if((Ret == LIST_UNKNOWN) &&\r
+                                  (FindField(Str, Tmp, 5+Add1, NO) == FFFTP_SUCCESS))\r
+                               {\r
+                                       Ret = LIST_UNIX_17;\r
+                               }\r
                        }\r
                }\r
 \r
@@ -3440,6 +3891,27 @@ static int AnalizeFileInfo(char *Str)
                        }\r
                }\r
 \r
+               // Windows Server 2008 R2\r
+               if(Ret == LIST_UNKNOWN)\r
+               {\r
+                       if((FindField(Str, Tmp, 1, NO) == FFFTP_SUCCESS) &&\r
+                          (CheckHHMMformat(Tmp) == YES))\r
+                       {\r
+                               if((FindField(Str, Tmp, 2, NO) == FFFTP_SUCCESS) &&\r
+                                  ((Tmp[0] == '<') || (IsDigit(Tmp[0]) != 0)))\r
+                               {\r
+                                       if(FindField(Str, Tmp, 3, NO) == FFFTP_SUCCESS)\r
+                                       {\r
+                                               if((FindField(Str, Tmp, 0, NO) == FFFTP_SUCCESS) &&\r
+                                                  (CheckMMDDYYYYformat(Tmp, NUL) != 0))\r
+                                               {\r
+                                                       Ret = LIST_DOS_5;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
                /* 以下のフォーマットをチェック */\r
                /* LIST_CHAMELEON */\r
 \r
@@ -3595,15 +4067,21 @@ static int AnalizeFileInfo(char *Str)
                                }\r
                        }\r
                }\r
+#if defined(HAVE_TANDEM)\r
+               /* 以下のフォーマットをチェック */\r
+               /* LIST_TANDEM */\r
 \r
-               // MLSD対応\r
-               if(Ret == LIST_UNKNOWN)\r
-               {\r
-                       if(FindField2(Str, Tmp, ';', 1, NO) == FFFTP_SUCCESS && FindField2(Str, Tmp, '=', 1, NO) == FFFTP_SUCCESS)\r
-                       {\r
-                               Ret = LIST_MLSD;\r
+               /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */\r
+               if(AskRealHostType() == HTYPE_TANDEM) {\r
+                       if(Ret == LIST_UNKNOWN) {\r
+                               SetOSS(NO);\r
+                               Ret = LIST_TANDEM;\r
+                       } else {\r
+                               SetOSS(YES);\r
                        }\r
                }\r
+#endif\r
+\r
        }\r
 \r
 DoPrintf("ListType=%d", Ret);\r
@@ -3888,6 +4366,26 @@ static int CheckYYYYMMDDformat(char *Str, char Sym)
 }\r
 \r
 \r
+// Windows Server 2008 R2\r
+static int CheckMMDDYYYYformat(char *Str, char Sym)\r
+{\r
+       int Ret;\r
+\r
+       Ret = NO;\r
+       if((strlen(Str) == 10) &&\r
+          (IsDigitSym(Str[0], Sym) != 0) && (IsDigitSym(Str[1], Sym) != 0) &&\r
+          (IsDigit(Str[2]) == 0) &&\r
+          (IsDigitSym(Str[3], Sym) != 0) && (IsDigitSym(Str[4], Sym) != 0) &&\r
+          (IsDigit(Str[5]) == 0) &&\r
+          (IsDigitSym(Str[6], Sym) != 0) && (IsDigitSym(Str[7], Sym) != 0) &&\r
+          (IsDigitSym(Str[8], Sym) != 0) && (IsDigitSym(Str[9], Sym) != 0))\r
+       {\r
+               Ret = YES; \r
+       }\r
+       return(Ret);\r
+}\r
+\r
+\r
 /*----- ファイル情報からファイル名、サイズなどを取り出す ----------------------\r
 *\r
 *      Parameter\r
@@ -3905,7 +4403,7 @@ static int CheckYYYYMMDDformat(char *Str, char Sym)
 *              int 種類 (NODE_xxxx)\r
 *----------------------------------------------------------------------------*/\r
 \r
-static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist)\r
+static int ResolveFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, FILETIME *Time, int *Attr, char *Owner, int *Link, int *InfoExist)\r
 {\r
        SYSTEMTIME sTime;\r
        SYSTEMTIME sTimeNow;\r
@@ -3926,6 +4424,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
@@ -4034,6 +4534,48 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                        }\r
                        break;\r
 \r
+               // Windows Server 2008 R2\r
+               case LIST_DOS_5 :\r
+                       *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE);\r
+\r
+                       /* 日付 */\r
+                       FindField(Str, Buf, 0, NO);\r
+                       sTime.wMonth = atoi(Buf);\r
+                       sTime.wDay = atoi(Buf+3);\r
+                       sTime.wYear = atoi(Buf+6);\r
+\r
+                       /* 時刻 */\r
+                       FindField(Str, Buf, 1, NO);\r
+                       sTime.wHour = atoi(Buf);\r
+                       sTime.wMinute = atoi(Buf+3);\r
+                       sTime.wSecond = 0;\r
+                       sTime.wMilliseconds = 0;\r
+                       if(_strnicmp(Buf+5, "AM", 2) == 0)\r
+                       {\r
+                               if(sTime.wHour == 12)\r
+                                       sTime.wHour = 0;\r
+                       }\r
+                       else if(_strnicmp(Buf+5, "PM", 2) == 0)\r
+                       {\r
+                               if(sTime.wHour != 12)\r
+                                       sTime.wHour += 12;\r
+                       }\r
+                       SystemTimeToFileTime(&sTime, Time);\r
+                       SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+\r
+                       /* サイズ */\r
+                       FindField(Str, Buf, 2, NO);\r
+                       *Size = _atoi64(Buf);\r
+\r
+                       /* 名前 */\r
+                       if(FindField(Str, Fname, 3, YES) == FFFTP_SUCCESS)\r
+                       {\r
+                               Ret = NODE_FILE;\r
+                               if(Buf[0] == '<')\r
+                                       Ret = NODE_DIR;\r
+                       }\r
+                       break;\r
+\r
                case LIST_OS2 :\r
                        *InfoExist |= (FINFO_DATE | FINFO_SIZE);\r
 \r
@@ -4601,6 +5143,152 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                        }\r
                        break;\r
 \r
+#if defined(HAVE_TANDEM)\r
+               case LIST_TANDEM :\r
+                       *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
+                       /* Open 中だったらずらす */\r
+                       if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS)\r
+                               break;\r
+                       if (!strncmp(Buf, "O", 1)) {\r
+                               offs = 1;\r
+                       }\r
+                       /* 日付 */\r
+                       if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS)\r
+                               break;\r
+                       if (Buf[1] == '-') {  /* 日付が 1桁 */\r
+                               sTime.wYear = Assume1900or2000(atoi(Buf + 6));\r
+                               Buf[5] = 0;\r
+                               GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay);    /* wDayは常に0 */\r
+                               sTime.wDay = atoi(Buf);\r
+                               sTime.wDayOfWeek = 0;\r
+                       } else {\r
+                               sTime.wYear = Assume1900or2000(atoi(Buf + 7));\r
+                               Buf[6] = 0;\r
+                               GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay);    /* wDayは常に0 */\r
+                               sTime.wDay = atoi(Buf);\r
+                               sTime.wDayOfWeek = 0;\r
+                       }\r
+                       /* 時刻 */\r
+                       FindField(Str, Buf, 4 + offs, NO);\r
+                       sTime.wHour = atoi(Buf);\r
+                       sTime.wMinute = atoi(Buf+3);\r
+                       sTime.wSecond = atoi(Buf+6);\r
+                       sTime.wMilliseconds = 0;\r
+                       SystemTimeToFileTime(&sTime, Time);\r
+                       SpecificLocalFileTime2FileTime(Time, AskHostTimeZone());\r
+\r
+                       /* 属性 セキュリティではなく FileCode を保存する */\r
+                       FindField(Str, Buf, 1 + offs, NO);\r
+                       *Attr = atoi(Buf);\r
+                       /* サイズ */\r
+                       FindField(Str, Buf, 2 + offs, NO);\r
+                       *Size = _atoi64(Buf);\r
+                       /* オーナ名 */\r
+                       if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) {\r
+                               if(strncmp(Buf, "Owner", sizeof("Owner"))) {\r
+                                       memset(Owner, NUL, OWNER_NAME_LEN+1);\r
+                                       strncpy(Owner, Buf, OWNER_NAME_LEN);\r
+                                       /* 通常は 255,255 だが、20, 33 などにも対応する */\r
+                                       /* 最後の文字が , だったら後ろとつなげる */\r
+                                       if (Buf[strlen(Buf)-1] == ',') {\r
+                                               FindField(Str, Buf, 6 + offs, NO);\r
+                                               strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf));\r
+                                       }\r
+                                       /* ファイル名 */\r
+                                       if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) {\r
+                                               Ret = NODE_FILE;\r
+                                       }\r
+                               }\r
+                       }\r
+                       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
+                       // 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 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 Value2[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
+                                                       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
+                                                       *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
+                                                       // 時刻はGMT\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
@@ -4630,6 +5318,10 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                case LIST_UNIX_75 :\r
 // MELCOMはビットフラグになっている\r
 //             case LIST_MELCOM :\r
+               // linux-ftpd\r
+               case LIST_UNIX_16 :\r
+               // uClinux\r
+               case LIST_UNIX_17 :\r
                default:\r
                        /* offsはサイズの位置, offs=0はカラム4 */\r
                        offs = 0;\r
@@ -4664,6 +5356,16 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \r
                        /* offs2は時間(もしくは年)の位置 */\r
                        offs2 = 0;\r
+                       // linux-ftpd\r
+//                     if((ListType == LIST_UNIX_11) ||\r
+//                        (ListType == LIST_UNIX_13) ||\r
+//                        (ListType == LIST_UNIX_21) ||\r
+//                        (ListType == LIST_UNIX_23) ||\r
+//                        (ListType == LIST_UNIX_51) ||\r
+//                        (ListType == LIST_UNIX_61) ||\r
+//                        (ListType == LIST_UNIX_63) ||\r
+//                        (ListType == LIST_UNIX_71) ||\r
+//                        (ListType == LIST_UNIX_73))\r
                        if((ListType == LIST_UNIX_11) ||\r
                           (ListType == LIST_UNIX_13) ||\r
                           (ListType == LIST_UNIX_21) ||\r
@@ -4672,8 +5374,12 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                           (ListType == LIST_UNIX_61) ||\r
                           (ListType == LIST_UNIX_63) ||\r
                           (ListType == LIST_UNIX_71) ||\r
-                          (ListType == LIST_UNIX_73))\r
+                          (ListType == LIST_UNIX_73) ||\r
+                          (ListType == LIST_UNIX_16))\r
                                offs2 = -1;\r
+                       // uClinux\r
+                       if(ListType == LIST_UNIX_17)\r
+                               offs2 = -3;\r
 \r
                        /* offs3はオーナ名の位置 */\r
                        offs3 = 0;\r
@@ -4704,6 +5410,9 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                           (ListType == LIST_UNIX_74) ||\r
                           (ListType == LIST_UNIX_75))\r
                                Flag2 = 1;\r
+                       // uClinux\r
+                       if(ListType == LIST_UNIX_17)\r
+                               Flag2 = -1;\r
 \r
                        *InfoExist |= (FINFO_DATE | FINFO_SIZE | FINFO_ATTR);\r
 \r
@@ -4750,6 +5459,16 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                        if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS)\r
                                                *InfoExist |= FINFO_TIME;\r
                                }\r
+                               // linux-ftpd\r
+                               else if(CheckYYYYMMDDformat(Buf, NUL) != 0)\r
+                               {\r
+                                       sTime.wYear = atoi(Buf);\r
+                                       sTime.wMonth = atoi(Buf+5);\r
+                                       sTime.wDay = atoi(Buf+8);\r
+                                       FindField(Str, Buf, 7+offs+offs2, NO);\r
+                                       if(GetHourAndMinute(Buf, &sTime.wHour, &sTime.wMinute) == FFFTP_SUCCESS)\r
+                                               *InfoExist |= FINFO_TIME;\r
+                               }\r
                                else\r
                                {\r
                                        GetMonth(Buf, &sTime.wMonth, &sTime.wDay);\r
@@ -4770,9 +5489,11 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \r
                                                /* 年がない */\r
                                                /* 現在の日付から推定 */\r
-                                               if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
-                                                       sTime.wYear++;\r
-                                               else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
+                                               // 恐らくホストとローカルの時刻が異なる場合の対処のようだがとりあえず無効にする\r
+//                                             if((sTimeNow.wMonth == 12) && (sTime.wMonth == 1))\r
+//                                                     sTime.wYear++;\r
+//                                             else if(sTimeNow.wMonth+1 == sTime.wMonth)\r
+                                               if(sTimeNow.wMonth+1 == sTime.wMonth)\r
                                                        /* nothing */;\r
                                                else if(sTimeNow.wMonth < sTime.wMonth)\r
                                                        sTime.wYear--;\r
@@ -4789,6 +5510,11 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
                                        }\r
                                }\r
                        }\r
+                       // uClinux\r
+                       else if(Flag2 == -1)\r
+                       {\r
+                               *InfoExist &= ~(FINFO_DATE | FINFO_TIME);\r
+                       }\r
                        else\r
                        {\r
                                /* LIST_UNIX_?4, LIST_UNIX_?5 の時 */\r
@@ -4824,11 +5550,12 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size,
 \r
                                if(strchr("dl", *Str) != NULL)\r
                                {\r
-                                       if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) ||\r
-                                          (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
-                                       {\r
-                                               *(Fname + strlen(Fname) - 1) = NUL;\r
-                                       }\r
+                                       // 0x5Cが含まれる文字列を扱えないバグ修正\r
+//                                     if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0) ||\r
+//                                        (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
+//                                     {\r
+//                                             *(Fname + strlen(Fname) - 1) = NUL;\r
+//                                     }\r
                                        Ret = NODE_DIR;\r
                                        if(*Str == 'l')\r
                                                *Link = YES;\r
@@ -4840,64 +5567,29 @@ 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(strncmp(Tmp, " ", 1) == 0)\r
-                                               strcpy(Fname, Tmp + 1);\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
-                                                       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
-       if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
+       // UTF-8対応\r
+//     if((Ret != NODE_NONE) && (strlen(Fname) > 0))\r
+       if(!(OrgListType & LIST_RAW_NAME) && (Ret != NODE_NONE) && (strlen(Fname) > 0))\r
        {\r
+               // UTF-8対応\r
+//             if(CheckSpecialDirName(Fname) == YES)\r
+//                     Ret = NODE_NONE;\r
+//             else\r
+//                     ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
+               ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
+               // UTF-8の冗長表現によるディレクトリトラバーサル対策\r
+               FixStringM(Fname, Fname);\r
+               // 0x5Cが含まれる文字列を扱えないバグ修正\r
+               if((_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "/") == 0)\r
+                       || (_mbscmp(_mbsninc(Fname, _mbslen(Fname) - 1), "\\") == 0))\r
+                       *(Fname + strlen(Fname) - 1) = NUL;\r
                if(CheckSpecialDirName(Fname) == YES)\r
                        Ret = NODE_NONE;\r
-               else\r
-                       ChangeFnameRemote2Local(Fname, FMAX_PATH);\r
+               // 文字コードが正しくないために長さが0になったファイル名は表示しない\r
+               if(strlen(Fname) == 0)\r
+                       Ret = NODE_NONE;\r
        }\r
        return(Ret);\r
 }\r
@@ -5390,7 +6082,9 @@ void SetFilter(int *CancelCheckWork)
 *              BOOL TRUE/FALSE\r
 *----------------------------------------------------------------------------*/\r
 \r
-static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+// 64ビット対応\r
+//static BOOL CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
+static INT_PTR CALLBACK FilterWndProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam)\r
 {\r
        switch (iMessage)\r
        {\r
@@ -5448,3 +6142,132 @@ static int atoi_n(const char *Str, int Len)
 \r
 \r
 \r
+// UTF-8対応\r
+// ファイル一覧から漢字コードを推測\r
+// 優先度はUTF-8、Shift_JIS、EUC、JIS、UTF-8 HFS+の順\r
+int AnalyzeNameKanjiCode(int Num)\r
+{\r
+       char Str[FMAX_PATH+1];\r
+       char Name[FMAX_PATH+1];\r
+       LONGLONG Size;\r
+       FILETIME Time;\r
+       int Attr;\r
+       FILE *fd;\r
+       int Node;\r
+       int ListType;\r
+       char Owner[OWNER_NAME_LEN+1];\r
+       int Link;\r
+       int InfoExist;\r
+       int NameKanjiCode;\r
+       int Point;\r
+       int PointSJIS;\r
+       int PointJIS;\r
+       int PointEUC;\r
+       int PointUTF8N;\r
+       int PointUTF8HFSX;\r
+       char* p;\r
+       CODECONVINFO cInfo1;\r
+       CODECONVINFO cInfo2;\r
+       char Buf[FMAX_PATH+1];\r
+\r
+       NameKanjiCode = KANJI_AUTO;\r
+       Point = 0;\r
+       PointSJIS = 0;\r
+       PointJIS = 0;\r
+       PointEUC = 0;\r
+       PointUTF8N = 0;\r
+       PointUTF8HFSX = 0;\r
+       MakeCacheFileName(Num, Str);\r
+       if((fd = fopen(Str, "rb")) != NULL)\r
+       {\r
+               while(GetListOneLine(Str, FMAX_PATH, fd) == FFFTP_SUCCESS)\r
+               {\r
+                       if((ListType = AnalyzeFileInfo(Str)) != LIST_UNKNOWN)\r
+                       {\r
+                               strcpy(Name, "");\r
+                               Node = ResolveFileInfo(Str, ListType | LIST_RAW_NAME, Name, &Size, &Time, &Attr, Owner, &Link, &InfoExist);\r
+                               p = Name;\r
+                               while(*p != '\0')\r
+                               {\r
+                                       if(*p & 0x80)\r
+                                       {\r
+                                               p = NULL;\r
+                                               break;\r
+                                       }\r
+                                       p++;\r
+                               }\r
+                               if(!p)\r
+                               {\r
+                                       // ASCII文字の範囲外\r
+                                       if(!CheckStringM(Name))\r
+                                       {\r
+                                               InitCodeConvInfo(&cInfo1);\r
+                                               cInfo1.KanaCnv = NO;\r
+                                               cInfo1.Str = Name;\r
+                                               cInfo1.StrLen = strlen(Name);\r
+                                               cInfo1.Buf = Buf;\r
+                                               cInfo1.BufSize = FMAX_PATH;\r
+                                               cInfo2 = cInfo1;\r
+                                               ConvUTF8NtoUTF8HFSX(&cInfo1);\r
+                                               ConvUTF8HFSXtoUTF8N(&cInfo2);\r
+                                               if(cInfo1.OutLen > (int)strlen(Name))\r
+                                                       PointUTF8N++;\r
+                                               else\r
+                                                       PointUTF8HFSX++;\r
+                                               if(cInfo2.OutLen < (int)strlen(Name))\r
+                                                       PointUTF8HFSX++;\r
+                                               else\r
+                                                       PointUTF8N++;\r
+                                       }\r
+                                       switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))\r
+                                       {\r
+                                       case KANJI_SJIS:\r
+                                               PointSJIS++;\r
+                                               break;\r
+                                       case KANJI_EUC:\r
+                                               PointEUC++;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       // ASCII文字の範囲内\r
+                                       switch(CheckKanjiCode(Name, strlen(Name), KANJI_SJIS))\r
+                                       {\r
+                                       case KANJI_JIS:\r
+                                               PointJIS++;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               fclose(fd);\r
+       }\r
+       if(PointUTF8HFSX >= Point)\r
+       {\r
+               NameKanjiCode = KANJI_UTF8HFSX;\r
+               Point = PointUTF8HFSX;\r
+       }\r
+       if(PointJIS >= Point)\r
+       {\r
+               NameKanjiCode = KANJI_JIS;\r
+               Point = PointJIS;\r
+       }\r
+       if(PointEUC >= Point)\r
+       {\r
+               NameKanjiCode = KANJI_EUC;\r
+               Point = PointEUC;\r
+       }\r
+       if(PointSJIS >= Point)\r
+       {\r
+               NameKanjiCode = KANJI_SJIS;\r
+               Point = PointSJIS;\r
+       }\r
+       if(PointUTF8N >= Point)\r
+       {\r
+               NameKanjiCode = KANJI_UTF8N;\r
+               Point = PointUTF8N;\r
+       }\r
+       return NameKanjiCode;\r
+}\r
+\r