#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
extern int TimeOut;\r
extern int SendQuit;\r
\r
+// 同時接続対応\r
+extern int CancelFlg;\r
+\r
/*===== ローカルなワーク =====*/\r
\r
static int PwdCommandType;\r
\r
-static int CheckCancelFlg = NO;\r
+// 同時接続対応\r
+//static int CheckCancelFlg = NO;\r
\r
\r
\r
strcpy(Buf, Tmp);\r
ReplaceAll(Buf, '\\', '/');\r
ChangeSepaRemote2Local(Buf);\r
- ChangeFnameRemote2Local(Buf, FMAX_PATH);\r
}\r
else\r
Sts = FTP_ERROR*100;\r
\r
Sts = CommandProcCmd(NULL, "RNFR %s", Src);\r
if(Sts == 350)\r
- Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst);\r
+ // 同時接続対応\r
+// Sts = command(AskCmdCtrlSkt(), NULL, &CheckCancelFlg, "RNTO %s", Dst);\r
+ Sts = command(AskCmdCtrlSkt(), NULL, &CancelFlg, "RNTO %s", Dst);\r
\r
if(Sts/100 >= FTP_CONTINUE)\r
SoundPlay(SND_ERROR);\r
* サイズが選られない時は Size = -1 を返す\r
*----------------------------------------------------------------------------*/\r
\r
-int DoSIZE(char *Path, LONGLONG *Size)\r
+// 同時接続対応\r
+//int DoSIZE(char *Path, LONGLONG *Size)\r
+int DoSIZE(SOCKET cSkt, char *Path, LONGLONG *Size, int *CancelCheckWork)\r
{\r
int Sts;\r
char Tmp[1024];\r
\r
- Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
+ // 同時接続対応\r
+// Sts = CommandProcTrn(Tmp, "SIZE %s", Path);\r
+ Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "SIZE %s", Path);\r
\r
*Size = -1;\r
if((Sts/100 == FTP_COMPLETE) && (strlen(Tmp) > 4) && IsDigit(Tmp[4]))\r
* 日付が選られない時は Time = 0 を返す\r
*----------------------------------------------------------------------------*/\r
\r
-int DoMDTM(char *Path, FILETIME *Time)\r
+// 同時接続対応\r
+//int DoMDTM(char *Path, FILETIME *Time)\r
+int DoMDTM(SOCKET cSkt, char *Path, FILETIME *Time, int *CancelCheckWork)\r
{\r
int Sts;\r
char Tmp[1024];\r
Time->dwLowDateTime = 0;\r
Time->dwHighDateTime = 0;\r
\r
- Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
+ // 同時接続対応\r
+// Sts = CommandProcTrn(Tmp, "MDTM %s", Path);\r
+ Sts = CommandProcTrn(cSkt, Tmp, CancelCheckWork, "MDTM %s", Path);\r
if(Sts/100 == FTP_COMPLETE)\r
{\r
sTime.wMilliseconds = 0;\r
\r
Ret = FTP_COMPLETE;\r
if(SendQuit == YES)\r
- Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100;\r
+ // 同時接続対応\r
+// Ret = command(ctrl_skt, NULL, &CheckCancelFlg, "QUIT") / 100;\r
+ Ret = command(ctrl_skt, NULL, &CancelFlg, "QUIT") / 100;\r
\r
return(Ret);\r
}\r
}\r
else\r
{\r
- strcpy(MainTransPkt.Cmd, "LIST");\r
+ // MLSD対応\r
+// strcpy(MainTransPkt.Cmd, "LIST");\r
+ if(AskUseMLSD() && (AskHostFeature() & FEATURE_MLSD))\r
+ strcpy(MainTransPkt.Cmd, "MLSD");\r
+ else\r
+ strcpy(MainTransPkt.Cmd, "LIST");\r
if(strlen(AddOpt) > 0)\r
{\r
strcat(MainTransPkt.Cmd, " -");\r
// {\r
// if(ReConnectCmdSkt() == FFFTP_SUCCESS)\r
// {\r
- Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+ // 同時接続対応\r
+// Sts = command(AskCmdCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+ Sts = command(AskCmdCtrlSkt(), Reply, &CancelFlg, "%s", Cmd);\r
// }\r
// }\r
return(Sts);\r
}\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
* 転送コントロールソケットを使う\r
*----------------------------------------------------------------------------*/\r
\r
-int CommandProcTrn(char *Reply, char *fmt, ...)\r
+// 同時接続対応\r
+//int CommandProcTrn(char *Reply, char *fmt, ...)\r
+int CommandProcTrn(SOCKET cSkt, char *Reply, int* CancelCheckWork, char *fmt, ...)\r
{\r
va_list Args;\r
char Cmd[1024];\r
// if((Sts = command(AskTrnCtrlSkt(), Reply, "%s", Cmd)) == 429)\r
// {\r
// if(ReConnectTrnSkt() == FFFTP_SUCCESS)\r
- Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+// Sts = command(AskTrnCtrlSkt(), Reply, &CheckCancelFlg, "%s", Cmd);\r
+ Sts = command(cSkt, Reply, CancelCheckWork, "%s", Cmd);\r
// }\r
return(Sts);\r
}\r
//#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
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
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
\r
if((SizeOnce == -2) || (AskTransferNow() == YES))\r
// 転送中に全て中止を行うと不正なデータが得られる場合のバグ修正\r
- // エラーの種類によっては無限ループとスタックオーバーフローの可能性あり\r
// DisconnectSet();\r
- {\r
- if(SizeOnce == -1)\r
- ReConnectCmdSkt();\r
- else\r
- DisconnectSet();\r
- }\r
+ cSkt = DoClose(cSkt);\r
}\r
else\r
{\r
char *Buf;\r
char *Pos;\r
CODECONVINFO cInfo;\r
+ // バッファ上書きバグ対策\r
+ char *Buf2;\r
\r
Sts = FFFTP_FAIL;\r
if((Buf = malloc(Max)) != NULL)\r
{\r
+ // バッファ上書きバグ対策\r
+ if((Buf2 = malloc(strlen(Fname) + 1)) != NULL)\r
+ {\r
InitCodeConvInfo(&cInfo);\r
cInfo.KanaCnv = NO; //AskHostNameKana();\r
- cInfo.Str = Fname;\r
+ // バッファ上書きバグ対策\r
+// cInfo.Str = Fname;\r
+ strcpy(Buf2, Fname);\r
+ cInfo.Str = Buf2;\r
cInfo.StrLen = strlen(Fname);\r
cInfo.Buf = Buf;\r
cInfo.BufSize = Max - 1;\r
// strcpy(Pos, Buf);\r
// break;\r
}\r
- free(Buf);\r
+ // バッファ上書きバグ対策\r
+ free(Buf2);\r
Sts = FFFTP_SUCCESS;\r
+ }\r
+ free(Buf);\r
+ // バッファ上書きバグ対策\r
+// Sts = FFFTP_SUCCESS;\r
}\r
return(Sts);\r
}\r
char *Buf;\r
char *Pos;\r
CODECONVINFO cInfo;\r
+ // バッファ上書きバグ対策\r
+ char *Buf2;\r
\r
Sts = FFFTP_FAIL;\r
if((Buf = malloc(Max)) != NULL)\r
{\r
+ // バッファ上書きバグ対策\r
+ if((Buf2 = malloc(strlen(Fname) + 1)) != NULL)\r
+ {\r
InitCodeConvInfo(&cInfo);\r
cInfo.KanaCnv = AskHostNameKana();\r
- cInfo.Str = Fname;\r
+ // バッファ上書きバグ対策\r
+// cInfo.Str = Fname;\r
+ strcpy(Buf2, Fname);\r
+ cInfo.Str = Buf2;\r
cInfo.StrLen = strlen(Fname);\r
cInfo.Buf = Buf;\r
cInfo.BufSize = Max - 1;\r
// strcpy(Pos, Buf);\r
// break;\r
}\r
- free(Buf);\r
+ // バッファ上書きバグ対策\r
+ free(Buf2);\r
Sts = FFFTP_SUCCESS;\r
+ }\r
+ free(Buf);\r
+ // バッファ上書きバグ対策\r
+// Sts = FFFTP_SUCCESS;\r
}\r
return(Sts);\r
}\r