OSDN Git Service

Amend VS2005EE build
[ffftp/ffftp.git] / remote.c
index 0613fcb..bc80b07 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -36,7 +36,9 @@
 #include <string.h>\r
 #include <mbstring.h>\r
 #include <time.h>\r
-#include <winsock.h>\r
+// IPv6対応\r
+//#include <winsock.h>\r
+#include <winsock2.h>\r
 #include <windowsx.h>\r
 #include <commctrl.h>\r
 \r
@@ -239,12 +241,8 @@ static int DoPWD(char *Buf)
                if(strlen(Tmp) < FMAX_PATH)\r
                {\r
                        strcpy(Buf, Tmp);\r
-                       // 0x5Cが含まれる文字列を扱えないバグ修正\r
-//                     ReplaceAll(Buf, '\\', '/');\r
-                       ChangeSepaRemote2Local(Buf);\r
-                       ChangeFnameRemote2Local(Buf, FMAX_PATH);\r
-                       // 0x5Cが含まれる文字列を扱えないバグ修正\r
                        ReplaceAll(Buf, '\\', '/');\r
+                       ChangeSepaRemote2Local(Buf);\r
                }\r
                else\r
                        Sts = FTP_ERROR*100;\r
@@ -687,6 +685,39 @@ int CommandProcCmd(char *Reply, char *fmt, ...)
 }\r
 \r
 \r
+#if defined(HAVE_TANDEM)\r
+/*----- OSS/Guardian ファイルシステムを切り替えるコマンドを送る ---------------\r
+*\r
+*      Parameter\r
+*              なし\r
+*\r
+*      Return Value\r
+*              なし\r
+*----------------------------------------------------------------------------*/\r
+\r
+void SwitchOSSProc(void)\r
+{\r
+       char Buf[MAX_PATH+1];\r
+\r
+       /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */\r
+       if(AskOSS() == YES) {\r
+               DoQUOTE("GUARDIAN");\r
+               SetOSS(NO);\r
+       } else {\r
+               DoQUOTE("OSS");\r
+               SetOSS(YES);\r
+       }\r
+       /* Current Dir 再取得 */\r
+       if (DoPWD(Buf) == FTP_COMPLETE)\r
+               SetRemoteDirHist(Buf);\r
+       /* ファイルリスト再読み込み */\r
+       PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0);\r
+\r
+       return;\r
+}\r
+#endif\r
+\r
+\r
 /*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)---------------\r
 *\r
 *      Parameter\r
@@ -744,6 +775,93 @@ int CommandProcTrn(SOCKET cSkt, char *Reply, int* CancelCheckWork, char *fmt, ..
 //#pragma aaa\r
 //static int cntcnt = 0;\r
 \r
+// SFTP対応\r
+int ConvertFTPCommandToPuTTYSFTP(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *Cmd)\r
+{\r
+       // TODO:\r
+       // 未実装\r
+       int Sts;\r
+       char NewCmd[FMAX_PATH*2];\r
+       static char RenameFrom[FMAX_PATH+1];\r
+       Sts = 429;\r
+       Reply[0] = '\0';\r
+       if(strcmp(Cmd, "QUIT") == 0)\r
+       {\r
+               sprintf(NewCmd, "ls\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       if(strcmp(Cmd, "LIST") == 0)\r
+       {\r
+               sprintf(NewCmd, "ls\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "REST ", 5) == 0)\r
+       {\r
+               SFTP_SetFilePosition(cSkt, (LONGLONG)_strtoi64(&Cmd[5], NULL, 10));\r
+       }\r
+       else if(strncmp(Cmd, "RETR ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "get \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "STOR ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "put \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "APPE ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "reput \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "DELE ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "rm \"%s\"\r\n", &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "CWD ", 4) == 0)\r
+       {\r
+               sprintf(NewCmd, "cd \"%s\"\r\n", &Cmd[4]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strcmp(Cmd, "PWD") == 0)\r
+       {\r
+               sprintf(NewCmd, "pwd\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strcmp(Cmd, "XPWD") == 0)\r
+       {\r
+               sprintf(NewCmd, "pwd\r\n");\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "MKD ", 4) == 0)\r
+       {\r
+               sprintf(NewCmd, "mkdir \"%s\"\r\n", &Cmd[4]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "RMD ", 4) == 0)\r
+       {\r
+               sprintf(NewCmd, "rmdir \"%s\"\r\n", &Cmd[4]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "RNFR ", 5) == 0)\r
+       {\r
+               strcpy(RenameFrom, &Cmd[5]);\r
+       }\r
+       else if(strncmp(Cmd, "RNTO ", 5) == 0)\r
+       {\r
+               sprintf(NewCmd, "mv \"%s\" \"%s\"\r\n", RenameFrom, &Cmd[5]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       else if(strncmp(Cmd, "SITE CHMOD ", 11) == 0)\r
+       {\r
+               Cmd[14] = '\0';\r
+               sprintf(NewCmd, "chmod %s \"%s\"\r\n", &Cmd[11], &Cmd[15]);\r
+               SFTP_send(cSkt, NewCmd, strlen(NewCmd), 0);\r
+       }\r
+       return Sts;\r
+}\r
+\r
 int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)\r
 {\r
        va_list Args;\r
@@ -757,6 +875,10 @@ int command(SOCKET cSkt, char *Reply, int *CancelCheckWork, char *fmt, ...)
                wvsprintf(Cmd, fmt, Args);\r
                va_end(Args);\r
 \r
+               // SFTP対応\r
+               if(IsSFTPAttached(cSkt))\r
+                       return ConvertFTPCommandToPuTTYSFTP(cSkt, Reply, CancelCheckWork, Cmd);\r
+\r
                if(strncmp(Cmd, "PASS ", 5) == 0)\r
                        SetTaskMsg(">PASS [xxxxxx]");\r
                else if((strncmp(Cmd, "USER ", 5) == 0) ||\r
@@ -905,6 +1027,8 @@ int ReadReplyMessage(SOCKET cSkt, char *Buf, int Max, int *CancelCheckWork, char
                        iContinue = NO;\r
                        iRetCode = ReadOneLine(cSkt, Tmp, ONELINE_BUF_SIZE, CancelCheckWork);\r
 \r
+                       // 文字化け対策\r
+                       ChangeFnameRemote2Local(Tmp, ONELINE_BUF_SIZE);\r
                        SetTaskMsg("%s", Tmp);\r
 \r
                        if(Buf != NULL)\r