From: Yuji Tanaka Date: Tue, 10 Jan 2012 12:01:37 +0000 (+0900) Subject: Add support for HP NonStop Server X-Git-Url: http://git.osdn.net/view?p=ffftp%2Fffftp.git;a=commitdiff_plain;h=19f7cced5712c402119825eb556f3dac6aee54f9 Add support for HP NonStop Server --- diff --git a/FFFTP_Eng_Release/FFFTP.exe b/FFFTP_Eng_Release/FFFTP.exe index 6652352..1fb27ca 100644 Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ diff --git a/Release/FFFTP.exe b/Release/FFFTP.exe index e5b401f..5bba617 100644 Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ diff --git a/Resource/FFFTP.rc b/Resource/FFFTP.rc index 4de913b..c20968b 100644 --- a/Resource/FFFTP.rc +++ b/Resource/FFFTP.rc @@ -219,6 +219,7 @@ BEGIN MENUITEM "URL‚ðƒNƒŠƒbƒvƒ{[ƒh‚Ö", MENU_URL_COPY MENUITEM "‘S‚Ä‚ðƒ_ƒEƒ“ƒ[ƒh", MENU_DOWNLOAD_ALL MENUITEM "‘S‚Ä‚ðƒAƒbƒvƒ[ƒh", MENU_UPLOAD_ALL + MENUITEM "OSS<->GUARDIAN Ø‚è‘Ö‚¦", MENU_SWITCH_OSS END END @@ -817,6 +818,19 @@ BEGIN LTEXT "‚Ì–¼‘O‚ð•ÏX‚µ‚Ä‚­‚¾‚³‚¢B",-1,15,20,133,8 END +updown_as_with_ext_dlg DIALOGEX 0, 0, 187, 89 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "‚l‚r ‚oƒSƒVƒbƒN", 0, 0, 0x0 +BEGIN + EDITTEXT UPDOWNAS_NEW,7,34,173,12,ES_AUTOHSCROLL + LTEXT "",UPDOWNAS_TEXT,7,7,173,8,SS_NOPREFIX + LTEXT "‚Ì–¼‘O‚ð•ÏX‚µ‚Ä‚­‚¾‚³‚¢B",-1,15,20,133,8 + LTEXT "ƒtƒ@ƒCƒ‹ƒR[ƒh",-1,10,51,44,8 + EDITTEXT UPDOWNAS_FILECODE,55,49,21,12,ES_CENTER | ES_AUTOHSCROLL | ES_NUMBER + DEFPUSHBUTTON "OK",IDOK,35,66,50,14 + PUSHBUTTON "’†Ž~(&S)",UPDOWNAS_STOP,101,66,50,14 +END + re_passwd_dlg DIALOG 0, 0, 187, 62 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "ƒpƒXƒ[ƒh" @@ -1695,6 +1709,14 @@ BEGIN BOTTOMMARGIN, 65 END + updown_as_with_ext_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 87 + END + re_passwd_dlg, DIALOG BEGIN LEFTMARGIN, 7 diff --git a/Resource/resource.h b/Resource/resource.h index 78283af..ec5a51a 100644 --- a/Resource/resource.h +++ b/Resource/resource.h @@ -112,6 +112,7 @@ #define hset_adv3_dlg 190 #define savecrypt_dlg 191 #define updatesslroot_dlg 192 +#define updown_as_with_ext_dlg 193 #define TRANS_TIME_BAR 1002 #define TRANS_TEXT 1003 #define TRANS_REMOTE 1003 @@ -358,6 +359,7 @@ #define UPDOWNAS_TEXT 1113 #define UPDOWNAS_NEW 1114 #define UPDOWNAS_STOP 1115 +#define UPDOWNAS_FILECODE 1116 #define SEL_FNAME 1117 #define SEL_REGEXP 1118 #define SEL_NOEXIST 1119 @@ -616,6 +618,7 @@ #define ID_BUTTON40173 40173 #define ID_BUTTON40174 40174 #define ID_BUTTON40175 40175 +#define MENU_SWITCH_OSS 40176 #define FSNOTIFY_TITLE 65535 #define HOST_SIZEGRIP 65535 @@ -624,7 +627,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 193 -#define _APS_NEXT_COMMAND_VALUE 40176 +#define _APS_NEXT_COMMAND_VALUE 40177 #define _APS_NEXT_CONTROL_VALUE 1213 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/Resource_eng/FFFTP-eng.rc b/Resource_eng/FFFTP-eng.rc index b70cb19..2d62437 100644 --- a/Resource_eng/FFFTP-eng.rc +++ b/Resource_eng/FFFTP-eng.rc @@ -219,6 +219,7 @@ BEGIN MENUITEM "URL to clipboard", MENU_URL_COPY MENUITEM "Download all", MENU_DOWNLOAD_ALL MENUITEM "Upload all", MENU_UPLOAD_ALL + MENUITEM "Switch OSS<->GUARDIAN", MENU_SWITCH_OSS END END @@ -824,6 +825,19 @@ BEGIN LTEXT "Enter new name",-1,7,7,133,8 END +updown_as_with_ext_dlg DIALOGEX 0, 0, 187, 89 +STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION +FONT 9, "MS Sans Serif", 0, 0, 0x0 +BEGIN + EDITTEXT UPDOWNAS_NEW,7,34,173,12,ES_AUTOHSCROLL + LTEXT "",UPDOWNAS_TEXT,7,7,173,8,SS_NOPREFIX + LTEXT "Enter new name",-1,15,20,133,8 + LTEXT "File Code",-1,10,51,44,8 + EDITTEXT UPDOWNAS_FILECODE,55,49,21,12,ES_CENTER | ES_AUTOHSCROLL | ES_NUMBER + DEFPUSHBUTTON "OK",IDOK,35,66,50,14 + PUSHBUTTON "Cancel",UPDOWNAS_STOP,101,66,50,14 +END + re_passwd_dlg DIALOG 0, 0, 187, 62 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION CAPTION "Password" @@ -1723,6 +1737,14 @@ BEGIN BOTTOMMARGIN, 65 END + updown_as_with_ext_dlg, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 180 + TOPMARGIN, 7 + BOTTOMMARGIN, 87 + END + re_passwd_dlg, DIALOG BEGIN LEFTMARGIN, 7 diff --git a/Resource_eng/resource.h b/Resource_eng/resource.h index 676d75b..427bdf8 100644 --- a/Resource_eng/resource.h +++ b/Resource_eng/resource.h @@ -112,6 +112,7 @@ #define hset_adv3_dlg 190 #define savecrypt_dlg 191 #define updatesslroot_dlg 192 +#define updown_as_with_ext_dlg 193 #define TRANS_TIME_BAR 1002 #define TRANS_TEXT 1003 #define TRANS_REMOTE 1003 @@ -358,6 +359,7 @@ #define UPDOWNAS_TEXT 1113 #define UPDOWNAS_NEW 1114 #define UPDOWNAS_STOP 1115 +#define UPDOWNAS_FILECODE 1116 #define SEL_FNAME 1117 #define SEL_REGEXP 1118 #define SEL_NOEXIST 1119 @@ -616,6 +618,7 @@ #define ID_BUTTON40173 40173 #define ID_BUTTON40174 40174 #define ID_BUTTON40175 40175 +#define MENU_SWITCH_OSS 40176 #define FSNOTIFY_TITLE 65535 #define HOST_SIZEGRIP 65535 @@ -624,7 +627,7 @@ #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 193 -#define _APS_NEXT_COMMAND_VALUE 40176 +#define _APS_NEXT_COMMAND_VALUE 40177 #define _APS_NEXT_CONTROL_VALUE 1213 #define _APS_NEXT_SYMED_VALUE 101 #endif diff --git a/common.h b/common.h index 2f8be0c..d1f7b5c 100644 --- a/common.h +++ b/common.h @@ -150,6 +150,11 @@ #define CHMOD_CMD_NOR "SITE CHMOD" /* 属性変更コマンド */ #define PORT_NOR 21 /* ポート番号 */ #define LS_FNAME "-alL" /* NLSTに付けるもの */ +#if defined(HAVE_TANDEM) +#define DEF_PRIEXT 4 /* Primary Extents の初期値 */ +#define DEF_SECEXT 28 /* Secondary Extents の初期値 */ +#define DEF_MAXEXT 978 /* Max Extents の初期値 */ +#endif /*===== 同じ名前のファイルがあった時の処理 =====*/ @@ -301,6 +306,9 @@ #define LIST_UNIX_16 48 /* UNIX 16 */ // MLSD対応 #define LIST_MLSD 49 +#if defined(HAVE_TANDEM) +#define LIST_TANDEM 50 /* HP NonStop Server */ +#endif #define LIST_MELCOM 0x100 /* MELCOM80 */ @@ -682,6 +690,13 @@ LIST_UNIX_70 drwxr-x--- 3 root root 4096 2011-12-06 23:39 .. -rw-r----- 1 root root 251 2011-12-06 23:39 .hoge +*LIST_TANDEM + 0 1 2 3 4 5 6 + --------------------------------------------------------------- + File Code EOF Last Modification Owner RWEP + EMSACSTM 101 146 18-Sep-00 09:03:37 170,175 "nunu" + TACLCSTM O 101 101 4-Mar-01 23:50:06 255,255 "oooo" + ------------------------------------*/ /*===== 接続ウインドウの形式 =====*/ @@ -762,6 +777,9 @@ LIST_UNIX_70 #define HTYPE_STRATUS 5 /* Stratus */ #define HTYPE_AGILENT 6 /* Agilent Logic analyzer */ #define HTYPE_SHIBASOKU 7 /* Shibasoku LSI test system */ +#if defined(HAVE_TANDEM) +#define HTYPE_TANDEM 8 /* HP NonStop Server */ +#endif /*===== コマンドラインオプション =====*/ @@ -1066,6 +1084,12 @@ typedef struct transpacket { int KanjiCodeDesired; /* ローカルの漢字コード (KANJI_xxx) */ int KanaCnv; /* 半角カナを全角に変換(YES/NO) */ int Mode; /* 転送モード (EXIST_xxx) */ +#if defined(HAVE_TANDEM) + int FileCode; /* ファイルコード */ + int PriExt; /* Primary Extents */ + int SecExt; /* Secondary Extents */ + int MaxExt; /* Max Extents */ +#endif HWND hWndTrans; /* 転送中ダイアログのウインドウハンドル */ int Abort; /* 転送中止フラグ (ABORT_xxx) */ // 同時接続対応 @@ -1456,6 +1480,11 @@ int AskShareProh(void); void DisconnectProc(void); void DisconnectSet(void); int AskConnecting(void); +#if defined(HAVE_TANDEM) +int AskRealHostType(void); +int SetOSS(int wkOss); +int AskOSS(void); +#endif SOCKET connectsock(char *host, int port, char *PreMsg, int *CancelCheckWork); // IPv6対応 SOCKET connectsockIPv4(char *host, int port, char *PreMsg, int *CancelCheckWork); @@ -1574,6 +1603,9 @@ int DoQUOTE(char *CmdStr); SOCKET DoClose(SOCKET Sock); int DoQUIT(SOCKET ctrl_skt); int DoDirListCmdSkt(char *AddOpt, char *Path, int Num, int *CancelCheckWork); +#if defined(HAVE_TANDEM) +void SwitchOSSProc(void); +#endif int CommandProcCmd(char *Reply, char *fmt, ...); // 同時接続対応 //int CommandProcTrn(char *Reply, char *fmt, ...); @@ -1747,6 +1779,9 @@ char *MakeNumString(LONGLONG Num, char *Buf, BOOL Comma); char* MakeDistinguishableFileName(char* Out, char* In); // 環境依存の不具合対策 char* GetAppTempPath(char* Buf); +#if defined(HAVE_TANDEM) +void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size); +#endif /*===== dlgsize.c =====*/ diff --git a/config.h b/config.h index 8a9a593..50a28a2 100644 --- a/config.h +++ b/config.h @@ -20,3 +20,6 @@ // ファイル転送の同時接続数 #define MAX_DATA_CONNECTION 4 +/* HP NonStop Server 用のコードを有効にする */ +#define HAVE_TANDEM + diff --git a/connect.c b/connect.c index b679a4d..db97a58 100644 --- a/connect.c +++ b/connect.c @@ -123,6 +123,9 @@ static const struct in6_addr IN6ADDR_NONE = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff static int UseIPadrs; static char DomainName[HOST_ADRS_LEN+1]; +#if defined(HAVE_TANDEM) +static int Oss = NO; /* OSS ファイルシステムへアクセスしている場合は YES */ +#endif @@ -895,6 +898,14 @@ int AskHostType(void) if(AskCurrentHost() != HOSTNUM_NOENTRY) CopyHostFromListInConnect(AskCurrentHost(), &CurHost); +#if defined(HAVE_TANDEM) + /* OSS ファイルシステムは UNIX ファイルシステムと同じでいいので AUTO を返す + ただし、Guardian ファイルシステムに戻ったときにおかしくならないように + CurHost.HostType 変数は更新しない */ + if(CurHost.HostType == HTYPE_TANDEM && Oss == YES) + return(HTYPE_AUTO); +#endif + return(CurHost.HostType); } @@ -1316,6 +1327,55 @@ int AskConnecting(void) } +#if defined(HAVE_TANDEM) +/*----- 接続している本当のホストのホストタイプを返す -------------------------- +* +* Parameter +* なし +* +* Return Value +* char *ファイル名/オプション +*----------------------------------------------------------------------------*/ + +int AskRealHostType(void) +{ + if(AskCurrentHost() != HOSTNUM_NOENTRY) + CopyHostFromListInConnect(AskCurrentHost(), &CurHost); + + return(CurHost.HostType); +} + +/*----- OSS ファイルシステムにアクセスしているかどうかのフラグを変更する ------ +* +* Parameter +* int ステータス (YES/NO) +* +* Return Value +* int ステータス (YES/NO) +*----------------------------------------------------------------------------*/ + +int SetOSS(int wkOss) +{ + Oss = wkOss; + return(Oss); +} + +/*----- OSS ファイルシステムにアクセスしているかどうかを返す ------------------ +* +* Parameter +* なし +* +* Return Value +* int ステータス (YES/NO) +*----------------------------------------------------------------------------*/ + +int AskOSS(void) +{ + return(Oss); +} +#endif /* HAVE_TANDEM */ + + /*----- ホストへ接続する ------------------------------------------------------ * * Parameter diff --git a/doc/eng/FFFTP_hpnonstop.txt b/doc/eng/FFFTP_hpnonstop.txt new file mode 100644 index 0000000..fc59e89 --- /dev/null +++ b/doc/eng/FFFTP_hpnonstop.txt @@ -0,0 +1,67 @@ +Overview +--------------------- + +This is a supplemental document for HP NonStop Server. + +FFFTP supports Guardian and OSS environments. You can switch their +environments. + +How to use ? +--------------------- + +Please specify the "NonStop Server" as "Host Type" of "Host Setting" - +"Special" tab. + +HP NonStop Server special features are implemented in right button menu. + +How to switch Guardian and OSS environments ? +--------------------------------------------------------------- + +Please choose "OSS <-> Guardian Switch(O)" in right button menu at +remote window. + +How to move VOL/SUBVOL in Guardian environment ? +--------------------------------------------------------------- + +Please input VOL/SUBVOL directly by clicking the "Change Folder" Icon +(Next to Up button in remote window). Up button is ignored although +the error message is not shown. + +- How to specify the file code for uploading to Guardian environment ? + +Please choose "Upload As..." in right button menu at local window. +You can specify the file code at Upload As dialog. + +Tips for Guardian environment +--------------------------------------------------------------- + +When you upload to Guardian environment by "Filename Depend", "ASCII +mode Filenames" setting is used. So it is useful that "*.c/*.h/*.config/ +*.pl" are added to ASCII mode Filenames of "Option - Transfer1". +This is a global setting. + +When ASCII mode filenames are uploaded to Guardian environment, ASCII +mode transfer is choosen. Otherwise, binary mode transfer is choosen. + +EXTENT and MAXEXTENTS +--------------------------------------------------------------- + +HP Default FTPSERV program creates a file with EXT (4,28) MAXEXTENTS 978 +as a default. When the file size is over than it, upload operation fails +with File Full (Error 45). + +FFFTP calculates the EXTENT and MAXEXTENT automatically when uploading +to Guardian environment with binary mode transfer. + +Target used ratio is 75 % and MAXEXTENTS is maximum (978). But NonStop +NS Series or later adjusts the EXTENT and MAXEXTENTS when it is not +multiples of 14. So it may be that the target used ratio is not accurate. + +When you wonder the EXTENT and MAXEXTENT size, you can see the calculated +size by FFFTP at console window as the follows. + + STOR Filename,FileCode,Primary,Secondary,MaxExtents + +When an append mode transfer is used, EXTENT and MAXEXTENS are not +specified. This is a limitation at this version. + diff --git a/doc/jpn/FFFTP_hpnonstop.txt b/doc/jpn/FFFTP_hpnonstop.txt new file mode 100644 index 0000000..ddc7a03 --- /dev/null +++ b/doc/jpn/FFFTP_hpnonstop.txt @@ -0,0 +1,60 @@ +œŠT—v + +HP NonStop Server ‘Ήž‚Ì•â‘«ƒhƒLƒ…ƒƒ“ƒg‚Å‚· + +Guardian & OSS ‚Ì—¼•û‚ɑΉž‚µ‚Ä‚¨‚èAØ‚è‘Ö‚¦‚ª‚Å‚«‚Ü‚· + +œŽg‚¢•û + +HP NonStop Server ‚̏ꍇ‚́uƒzƒXƒgÝ’聨‚“xv‚©‚çuƒzƒXƒg‚ÌŽí—ށv‚Å +NonStop Server ‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢BNonStop Server“Á—L‚Ì“®ì‚͉Eƒ{ƒ^ƒ“ +ƒƒjƒ…[‚Æ‚µ‚ÄŽÀ‘•‚³‚ê‚Ä‚¢‚Ü‚·B + +- Guardian ‚Æ OSS ‚ðØ‚è‘Ö‚¦‚é + +ƒŠƒ‚[ƒgƒŠƒXƒg‚ª•\Ž¦‚³‚ê‚Ä‚¢‚éƒEƒBƒ“ƒhƒE‚ʼnEƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚Æ•\Ž¦‚³‚ê‚é +ƒƒjƒ…[‚©‚çuOSS<->Guardian Ø‚è‘Ö‚¦v‚ð‘I‘ð‚µ‚Ä‚­‚¾‚³‚¢B + +- Guardian ŠÂ‹«‚Å VOL/SUBVOL‚ðØ‚è‘Ö‚¦‚é + +ƒfƒBƒŒƒNƒgƒŠ‚Ì’¼ÚˆÚ“®‚̃AƒCƒRƒ“(ã‚̃fƒBƒŒƒNƒgƒŠ‚̃AƒCƒRƒ“‚Ì—×)‚ð‰Ÿ +‚µ‚Ä$VOL.SUBVOL‚𒼐ړü—Í‚µ‚Ä‚­‚¾‚³‚¢Bã‚̃fƒBƒŒƒNƒgƒŠƒAƒCƒRƒ“‚Í(‰Ÿ +‚¹‚Ü‚·‚ª)“®ì‚µ‚Ü‚¹‚ñB + +- Guardian ŠÂ‹«‚ÖƒAƒbƒvƒ[ƒh‚·‚é‚Æ‚«‚̃tƒ@ƒCƒ‹ƒR[ƒh‚ðŽw’è‚·‚é + +ƒ[ƒJƒ‹ƒŠƒXƒg‚ª•\Ž¦‚³‚ê‚Ä‚¢‚éƒEƒBƒ“ƒhƒE‚ʼnEƒ{ƒ^ƒ“‚ð‰Ÿ‚·‚Æ•\Ž¦‚³‚ê‚郁 +ƒjƒ…[‚©‚çu–¼‘O‚ð•ÏX‚µ‚ăAƒbƒvƒ[ƒhv‚ð‘I‘ð‚·‚é‚ƃtƒ@ƒCƒ‹ƒR[ƒh‚ðŽw +’肵‚ăAƒbƒvƒ[ƒh‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B + +- Guardian ŠÂ‹«‚Å•Ö—˜‚ÉŽg‚¤‚É‚Í + +uŠÂ‹«Ý’聨“]‘—1v‚ŁuƒAƒXƒL[ƒ‚[ƒh‚̃tƒ@ƒCƒ‹–¼v‚Ɂu*.c/*.h/*.config/ +*.plv‚ð’ljÁ‚µ‚Ä‚¨‚­‚ÆGuardianŠÂ‹«‚ɃAƒbƒvƒ[ƒh‚·‚é‚Æ‚«Ž©“®”»•Ê“]‘—‚ŃA +ƒXƒL[ƒ‚[ƒh‚É‚È‚èAƒtƒ@ƒCƒ‹ƒR[ƒh‚ª101‚É‚È‚è‚Ü‚·‚̂ŒljÁ‚µ‚Ä‚¨‚­‚±‚Æ‚ð +‚¨Š©‚ß‚µ‚Ü‚·Bƒ_ƒEƒ“ƒ[ƒhŽž‚̓tƒ@ƒCƒ‹ƒR[ƒh‚ð‚݂ătƒ@ƒCƒ‹ƒR[ƒh‚ª101‚È +‚ç ASCII ƒ‚[ƒhA‚»‚êˆÈŠO‚È‚çƒoƒCƒiƒŠƒ‚[ƒh‚Å“]‘—‚³‚ê‚Ü‚·B + +œEXTENTƒTƒCƒY‚ÆMAXEXTENTƒTƒCƒY‚ɂ‚¢‚Ä + +FTPƒvƒƒgƒRƒ‹‚ÅGuardianŠÂ‹«‚Ƀtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚·‚é‚Æ‚«FTPƒT[ƒo‚ªƒf +ƒtƒHƒ‹ƒg‚Å EXT (4,28) MAXEXTENTS 978 ‚̃tƒ@ƒCƒ‹‚ðì¬‚µ‚Ü‚·B‚±‚ê‚ð’´‚¦ +‚éƒtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚µ‚悤‚Æ‚·‚é‚Æ File Full (Error 45) ‚Æ‚È‚è‚Ü‚·B + +FFFTP‚Å‚ÍGuardianŠÂ‹«‚ɃoƒCƒiƒŠƒ‚[ƒh‚Ńtƒ@ƒCƒ‹‚ðƒAƒbƒvƒ[ƒh‚·‚é‚Æ‚«‚É +EXTENTƒTƒCƒY‚ÆMAXEXTENTƒTƒCƒY‚ðŽ©“®ŒvŽZ‚µ‚ăAƒbƒvƒ[ƒh‚·‚é‚悤‚É‚È‚Á‚Ä +‚¢‚Ü‚·B + +MAXEXTENTS‚͍őå(978)A75%‚ÌŽg—p—¦‚ð–ÚŽw‚µ‚ÄŒvŽZ‚µ‚Ä‚¢‚Ü‚·‚ª NS Series +ˆÈ~‚ÍEXTENTƒTƒCƒY‚ª14‚Ì”{”‚Å‚È‚¢‚Æ‚«AƒVƒXƒeƒ€‘¤‚ÅŽ©“®“I‚ÉEXTENTƒTƒC +ƒY‚âMAXEXTENTƒTƒCƒY‚Ì’²®‚ðs‚¢‚Ü‚·B•K‚¸‚µ‚àŽw’肳‚ꂽEXTENT‚ō쐬‚³‚ê +‚é‚킯‚Å‚Í‚ ‚è‚Ü‚¹‚ñ‚Ì‚Å‚²—¯ˆÓ‚­‚¾‚³‚¢B + +‚È‚¨AŒvŽZ‚µ‚½EXTAMAXEXTENTƒTƒCƒY‚̓Rƒ“ƒ\[ƒ‹ƒEƒBƒ“ƒhƒE‚ňȉº‚̂悤‚É +•\Ž¦‚³‚ê‚Ä‚¢‚Ü‚·BŒvŽZŒ‹‰Ê‚ª‹C‚É‚È‚é•û‚Í‚²Šm”F‚­‚¾‚³‚¢B + +STOR ƒtƒ@ƒCƒ‹–¼,FileCode,Primary,Secondary,MaxExtents + +ƒtƒ@ƒCƒ‹‚ðÄì¬‚µ‚È‚¢‚ÆEXTENTƒTƒCƒY‚͕ύX‚Å‚«‚È‚¢‚½‚߁A’Ç‹Lƒ‚[ƒh‚Å‚Í +Ž©“®ŒvŽZ‚µ‚È‚¢‚悤‚É‚È‚Á‚Ä‚¢‚Ü‚·B + diff --git a/filelist.c b/filelist.c index 0592d10..be49252 100644 --- a/filelist.c +++ b/filelist.c @@ -898,6 +898,11 @@ static LRESULT FileListCommonWndProc(HWND hWnd, UINT message, WPARAM wParam, LPA } +#if defined(HAVE_TANDEM) + if(FileListBaseNoExpand == NULL) + pf = FileListBase; + else +#endif pf = FileListBaseNoExpand; for (filenum = 0; pf ; filenum++) { pf = pf->Next; @@ -1507,6 +1512,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON { if((((Sort & SORT_MASK_ORD) == SORT_EXT) && ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) < 0)) || +#if defined(HAVE_TANDEM) + ((AskHostType() == HTYPE_TANDEM) && + ((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = Attr - Pos->Attr) < 0)) || +#endif (((Sort & SORT_MASK_ORD) == SORT_SIZE) && ((Cmp = Size - Pos->Size) < 0)) || (((Sort & SORT_MASK_ORD) == SORT_DATE) && @@ -1525,6 +1535,11 @@ static void AddDispFileList(FLISTANCHOR *Anchor, char *Name, FILETIME *Time, LON { if((((Sort & SORT_MASK_ORD) == SORT_EXT) && ((Cmp = _mbsicmp(GetFileExt(Name), GetFileExt(Pos->File))) > 0)) || +#if defined(HAVE_TANDEM) + ((AskHostType() == HTYPE_TANDEM) && + ((Sort & SORT_MASK_ORD) == SORT_EXT) && + ((Cmp = Attr - Pos->Attr) > 0)) || +#endif (((Sort & SORT_MASK_ORD) == SORT_SIZE) && ((Cmp = Size - Pos->Size) > 0)) || (((Sort & SORT_MASK_ORD) == SORT_DATE) && @@ -1705,6 +1720,12 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; LvItem.iSubItem = 3; +#if defined(HAVE_TANDEM) + if (AskHostType() == HTYPE_TANDEM) { + _itoa_s(Attr, Tmp, sizeof(Tmp), 10); + LvItem.pszText = Tmp; + } else +#endif LvItem.pszText = GetFileExt(Name); LvItem.iItem = SendMessage(hWnd, LVM_SETITEM, 0, (LPARAM)&LvItem); @@ -1712,7 +1733,11 @@ static void AddListView(HWND hWnd, int Pos, char *Name, int Type, LONGLONG Size, { /* 属性 */ strcpy(Tmp, ""); +#if defined(HAVE_TANDEM) + if((InfoExist & FINFO_ATTR) && (AskHostType() != HTYPE_TANDEM)) +#else if(InfoExist & FINFO_ATTR) +#endif AttrValue2String(Attr, Tmp); LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; @@ -2337,6 +2362,13 @@ int GetNodeSize(int Win, int Pos, LONGLONG *Buf) SendMessage(hWnd, LVM_GETITEM, 0, (LPARAM)&LvItem); *Buf = -1; Ret = NO; +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) { + RemoveComma(Tmp); + *Buf = _atoi64(Tmp); + Ret = YES; + } else +#endif if(strlen(Tmp) > 0) { RemoveComma(Tmp); @@ -2371,12 +2403,22 @@ int GetNodeAttr(int Win, int Pos, int *Buf) { LvItem.mask = LVIF_TEXT; LvItem.iItem = Pos; +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) + LvItem.iSubItem = 3; + else +#endif LvItem.iSubItem = 4; LvItem.pszText = Tmp; LvItem.cchTextMax = 20; SendMessage(GetRemoteHwnd(), LVM_GETITEM, 0, (LPARAM)&LvItem); if(strlen(Tmp) > 0) { +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) + *Buf = atoi(Tmp); + else +#endif *Buf = AttrString2Value(Tmp); Ret = YES; } @@ -2679,10 +2721,19 @@ void MakeDroppedFileList(WPARAM wParam, char *Cur, FILELIST **Base) strcpy(Pkt.File, GetFileName(Name)); memset(&Pkt.Time, 0, sizeof(FILETIME)); +#if defined(HAVE_TANDEM) + /* Guardian スペースへのアップロードのためにサイズが必要 */ + Pkt.Size = 0; + Pkt.InfoExist = 0; +#endif if((fHnd = FindFirstFile(Name, &Find)) != INVALID_HANDLE_VALUE) { FindClose(fHnd); Pkt.Time = Find.ftLastWriteTime; +#if defined(HAVE_TANDEM) + Pkt.Size = MakeLongLong(Find.nFileSizeHigh, Find.nFileSizeLow); + Pkt.InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE); +#endif } AddFileList(&Pkt, Base); } @@ -3713,6 +3764,20 @@ static int AnalizeFileInfo(char *Str) } } } +#if defined(HAVE_TANDEM) + /* 以下のフォーマットをチェック */ + /* LIST_TANDEM */ + + /* OSS の場合は自動判別可能のため Ret == LIST_UNKNOWN のチェックは後 */ + if(AskRealHostType() == HTYPE_TANDEM) { + if(Ret == LIST_UNKNOWN) { + SetOSS(NO); + Ret = LIST_TANDEM; + } else { + SetOSS(YES); + } + } +#endif // MLSD対応 if(Ret == LIST_UNKNOWN) @@ -4719,6 +4784,66 @@ static int ResolvFileInfo(char *Str, int ListType, char *Fname, LONGLONG *Size, } break; +#if defined(HAVE_TANDEM) + case LIST_TANDEM : + *InfoExist |= (FINFO_TIME | FINFO_DATE | FINFO_SIZE | FINFO_ATTR); + /* Open 中だったらずらす */ + if(FindField(Str, Buf, 1, NO) != FFFTP_SUCCESS) + break; + if (!strncmp(Buf, "O", 1)) { + offs = 1; + } + /* 日付 */ + if(FindField(Str, Buf, 3 + offs, NO) != FFFTP_SUCCESS) + break; + if (Buf[1] == '-') { /* 日付が 1桁 */ + sTime.wYear = Assume1900or2000(atoi(Buf + 6)); + Buf[5] = 0; + GetMonth(Buf+2, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */ + sTime.wDay = atoi(Buf); + sTime.wDayOfWeek = 0; + } else { + sTime.wYear = Assume1900or2000(atoi(Buf + 7)); + Buf[6] = 0; + GetMonth(Buf+3, &sTime.wMonth, &sTime.wDay); /* wDayは常に0 */ + sTime.wDay = atoi(Buf); + sTime.wDayOfWeek = 0; + } + /* 時刻 */ + FindField(Str, Buf, 4 + offs, NO); + sTime.wHour = atoi(Buf); + sTime.wMinute = atoi(Buf+3); + sTime.wSecond = atoi(Buf+6); + sTime.wMilliseconds = 0; + SystemTimeToFileTime(&sTime, Time); + SpecificLocalFileTime2FileTime(Time, AskHostTimeZone()); + + /* 属性 セキュリティではなく FileCode を保存する */ + FindField(Str, Buf, 1 + offs, NO); + *Attr = atoi(Buf); + /* サイズ */ + FindField(Str, Buf, 2 + offs, NO); + *Size = _atoi64(Buf); + /* オーナ名 */ + if(FindField(Str, Buf, 5 + offs, NO) == FFFTP_SUCCESS) { + if(strncmp(Buf, "Owner", sizeof("Owner"))) { + memset(Owner, NUL, OWNER_NAME_LEN+1); + strncpy(Owner, Buf, OWNER_NAME_LEN); + /* 通常は 255,255 だが、20, 33 などにも対応する */ + /* 最後の文字が , だったら後ろとつなげる */ + if (Buf[strlen(Buf)-1] == ',') { + FindField(Str, Buf, 6 + offs, NO); + strncat(Owner, Buf, OWNER_NAME_LEN - strlen(Buf)); + } + /* ファイル名 */ + if(FindField(Str, Fname, 0, NO) == FFFTP_SUCCESS) { + Ret = NODE_FILE; + } + } + } + break; +#endif + case LIST_UNIX_10 : case LIST_UNIX_11 : case LIST_UNIX_12 : diff --git a/ftpproc.c b/ftpproc.c index 3e76a49..8963604 100644 --- a/ftpproc.c +++ b/ftpproc.c @@ -75,6 +75,9 @@ static int AskUpLoadFileAttr(char *Fname); // 64ビット対応 //static BOOL CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +#if defined(HAVE_TANDEM) +static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam); +#endif static void DeleteAllDir(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); static void DelNotifyAndDo(FILELIST *Dt, int Win, int *Sw, int *Flg, char *CurDir); // 64ビット対応 @@ -109,6 +112,9 @@ extern int CancelFlg; /*===== ローカルなワーク =====*/ static char TmpString[FMAX_PATH+80]; /* テンポラリ */ +#if defined(HAVE_TANDEM) +static char TmpFileCode[5]; /* テンポラリ */ +#endif static int CurWin; /* ウインドウ番号 */ int UpExistMode = EXIST_OVW; /* アップロードで同じ名前のファイルがある時の扱い方 EXIST_xxx */ @@ -217,6 +223,19 @@ void DownLoadProc(int ChName, int ForceFile, int All) } strcpy(Pkt.Cmd, "RETR "); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM) { + if(AskTransferType() != TYPE_X) { + Pkt.Type = AskTransferType(); + } else { + Pkt.Attr = Pos->Attr; + if (Pkt.Attr == 101) + Pkt.Type = TYPE_A; + else + Pkt.Type = TYPE_I; + } + } else +#endif Pkt.Type = AskTransferTypeAssoc(Pkt.RemoteFile, AskTransferType()); Pkt.Size = Pos->Size; Pkt.Time = Pos->Time; @@ -911,12 +930,29 @@ void UpLoadListProc(int ChName, int All) _mbslwr(Cat); else if(FnameCnv == FNAME_UPPER) _mbsupr(Cat); +#if defined(HAVE_TANDEM) + Pkt.FileCode = 0; + Pkt.PriExt = DEF_PRIEXT; + Pkt.SecExt = DEF_SECEXT; + Pkt.MaxExt = DEF_MAXEXT; +#endif } else { // 名前を変更する strcpy(TmpString, Pos->File); CurWin = WIN_LOCAL; +#if defined(HAVE_TANDEM) + strcpy(TmpFileCode, "0"); /* ASCII モードの場合は無視される */ + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_with_ext_dlg), GetMainHwnd(), UpDownAsWithExtDialogCallBack) == YES) { + strcat(Pkt.RemoteFile, TmpString); + Pkt.FileCode = atoi(TmpFileCode); + } else { + break; + } + } else +#endif if(DialogBox(GetFtpInst(), MAKEINTRESOURCE(updown_as_dlg), GetMainHwnd(), UpDownAsDialogCallBack) == YES) strcat(Pkt.RemoteFile, TmpString); else @@ -985,6 +1021,11 @@ void UpLoadListProc(int ChName, int All) // UTF-8対応 Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + CalcExtentSize(&Pkt, Pos->Size); + } +#endif Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); if(Pkt.Mode == EXIST_ABORT) break; @@ -1079,6 +1120,12 @@ void UpLoadDragProc(WPARAM wParam) else if(FnameCnv == FNAME_UPPER) _mbsupr(Cat); ReplaceAll(Pkt.RemoteFile, '\\', '/'); +#if defined(HAVE_TANDEM) + Pkt.FileCode = 0; + Pkt.PriExt = DEF_PRIEXT; + Pkt.SecExt = DEF_SECEXT; + Pkt.MaxExt = DEF_MAXEXT; +#endif if(AskHostType() == HTYPE_ACOS) { @@ -1140,6 +1187,12 @@ void UpLoadDragProc(WPARAM wParam) // UTF-8対応 Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + int a = Pos->InfoExist && FINFO_SIZE; + CalcExtentSize(&Pkt, Pos->Size); + } +#endif Pkt.Mode = CheckRemoteFile(&Pkt, RemoteList); if(Pkt.Mode == EXIST_ABORT) break; @@ -1411,6 +1464,11 @@ void MirrorUploadProc(int Notify) // UTF-8対応 Pkt.KanjiCodeDesired = AskLocalKanjiCode(); Pkt.KanaCnv = AskHostKanaCnv(); +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO) { + CalcExtentSize(&Pkt, LocalPos->Size); + } +#endif Pkt.Mode = EXIST_OVW; AddTmpTransFileList(&Pkt, &Base); } @@ -1815,13 +1873,26 @@ static int AskUpLoadFileAttr(char *Fname) static int CheckRemoteFile(TRANSPACKET *Pkt, FILELIST *ListList) { int Ret; +#if defined(HAVE_TANDEM) + int Mode; +#endif FILELIST *Exist; Ret = EXIST_OVW; Pkt->ExistSize = 0; if(SendMode != TRANS_OVW) { +#if defined(HAVE_TANDEM) + /* HP NonStop Server は大文字小文字の区別なし(すべて大文字) */ + if(AskHostType() == HTYPE_TANDEM) + Mode = COMP_IGNORE; + else + Mode = COMP_STRICT; + + if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, Mode)) != NULL) +#else if((Exist = SearchFileList(GetFileName(Pkt->RemoteFile), ListList, COMP_STRICT)) != NULL) +#endif { Pkt->ExistSize = Exist->Size; @@ -1965,6 +2036,57 @@ static INT_PTR CALLBACK UpDownAsDialogCallBack(HWND hDlg, UINT iMessage, WPARAM } +#if defined(HAVE_TANDEM) +/*----- アップロード/ダウンロードファイル名入力ダイアログのコールバック ------ +* +* Parameter +* HWND hDlg : ウインドウハンドル +* UINT message : メッセージ番号 +* WPARAM wParam : メッセージの WPARAM 引数 +* LPARAM lParam : メッセージの LPARAM 引数 +* +* Return Value +* BOOL TRUE/FALSE +*----------------------------------------------------------------------------*/ + +static INT_PTR CALLBACK UpDownAsWithExtDialogCallBack(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam) +{ + switch (iMessage) + { + case WM_INITDIALOG : + if(CurWin == WIN_LOCAL) + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN064); + else + SendMessage(hDlg, WM_SETTEXT, 0, (LPARAM)MSGJPN065); + + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, EM_LIMITTEXT, FMAX_PATH, 0); + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_SETTEXT, 0, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_TEXT, WM_SETTEXT, 0, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, EM_LIMITTEXT, 4, 0); + SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_SETTEXT, 0, (LPARAM)TmpFileCode); + + return(TRUE); + + case WM_COMMAND : + switch(GET_WM_COMMAND_ID(wParam, lParam)) + { + case IDOK : + SendDlgItemMessage(hDlg, UPDOWNAS_NEW, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpString); + SendDlgItemMessage(hDlg, UPDOWNAS_FILECODE, WM_GETTEXT, FMAX_PATH, (LPARAM)TmpFileCode); + EndDialog(hDlg, YES); + break; + + case UPDOWNAS_STOP : + EndDialog(hDlg, NO_ALL); + break; + } + return(TRUE); + } + return(FALSE); +} +#endif + + /*----- ファイル一覧で指定されたファイルを削除する ---------------------------- * * Parameter diff --git a/getput.c b/getput.c index 6c7a2a7..28c2471 100644 --- a/getput.c +++ b/getput.c @@ -2286,6 +2286,12 @@ static void DispDownloadFinishMsg(TRANSPACKET *Pkt, int iRetCode) if (AskHostType() == HTYPE_VMS) return; #endif +#if defined(HAVE_TANDEM) + /* HP Nonstop Server の場合、ファイルのない subvol へ移動すると550 File not found + * になるが問題ないのでエラーダイアログやエラーメッセージを出さないため */ + if (AskHostType() == HTYPE_TANDEM) + return; +#endif if((strncmp(Pkt->Cmd, "NLST", 4) == 0) || (strncmp(Pkt->Cmd, "LIST", 4) == 0)) { @@ -2636,6 +2642,16 @@ static int UpLoadNonPassive(TRANSPACKET *Pkt) { SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); if(Resume == NO) +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) { + if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) { + // EXTENTがデフォルトのときはコードのみ + sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode); + } else { + sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt); + } + } else +#endif sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); else sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); @@ -2779,6 +2795,16 @@ static int UpLoadPassive(TRANSPACKET *Pkt) SetUploadResume(Pkt, Pkt->Mode, Pkt->ExistSize, &Resume); if(Resume == NO) +#if defined(HAVE_TANDEM) + if(AskHostType() == HTYPE_TANDEM && AskOSS() == NO && Pkt->Type != TYPE_A) { + if( Pkt->PriExt == DEF_PRIEXT && Pkt->SecExt == DEF_SECEXT && Pkt->MaxExt == DEF_MAXEXT) { + // EXTENTがデフォルトのときはコードのみ + sprintf(Buf, "%s%s,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode); + } else { + sprintf(Buf, "%s%s,%d,%d,%d,%d", Pkt->Cmd, Pkt->RemoteFile, Pkt->FileCode, Pkt->PriExt, Pkt->SecExt, Pkt->MaxExt); + } + } else +#endif sprintf(Buf, "%s%s", Pkt->Cmd, Pkt->RemoteFile); else sprintf(Buf, "%s%s", "APPE ", Pkt->RemoteFile); diff --git a/hostman.c b/hostman.c index 31b75a2..0249d1a 100644 --- a/hostman.c +++ b/hostman.c @@ -2130,8 +2130,15 @@ static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN144); SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN289); SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN295); +#if defined(HAVE_TANDEM) + SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_ADDSTRING, 0, (LPARAM)MSGJPN2000); +#endif SendDlgItemMessage(hDlg, HSET_HOSTTYPE, CB_SETCURSEL, TmpHost.HostType, 0); +#if defined(HAVE_TANDEM) + if(TmpHost.HostType == 2 || TmpHost.HostType == HTYPE_TANDEM) /* VAX or Tandem */ +#else if(TmpHost.HostType == 2) +#endif { EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); @@ -2200,12 +2207,34 @@ static INT_PTR CALLBACK Adv2SettingProc(HWND hDlg, UINT iMessage, WPARAM wParam, EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE); } +#if defined(HAVE_TANDEM) + else if(Num == HTYPE_TANDEM) /* Tandem */ + { + /* Tandem を選択すると自動的に LIST にチェックをいれる */ + SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_SETCHECK, 1, 0); + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), FALSE); + } + else + { + if(SendDlgItemMessage(hDlg, HSET_LISTCMD, BM_GETCHECK, 0, 0) == 0) { + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE); + EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE); + } else { + EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), FALSE); + EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE); + } + EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE); + } +#else else { EnableWindow(GetDlgItem(hDlg, HSET_NLST_R), TRUE); EnableWindow(GetDlgItem(hDlg, HSET_LISTCMD), TRUE); EnableWindow(GetDlgItem(hDlg, HSET_FULLPATH), TRUE); } +#endif break; } return(TRUE); diff --git a/main.c b/main.c index f48ce74..51d8b35 100644 --- a/main.c +++ b/main.c @@ -1407,6 +1407,12 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA LocalRbuttonMenu(1); break; +#if defined(HAVE_TANDEM) + case MENU_SWITCH_OSS : + SwitchOSSProc(); + break; +#endif + default : if((LOWORD(wParam) >= MENU_BMARK_TOP) && (LOWORD(wParam) < MENU_BMARK_TOP+100)) @@ -1449,7 +1455,15 @@ static LRESULT CALLBACK FtpWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARA case MENU_DOWNLOAD : lpttt->lpszText = MSGJPN157; break; +#if defined(HAVE_TANDEM) + case MENU_DOWNLOAD_AS : + lpttt->lpszText = MSGJPN065; + break; + case MENU_UPLOAD_AS : + lpttt->lpszText = MSGJPN064; + break; +#endif case MENU_UPLOAD : lpttt->lpszText = MSGJPN158; break; diff --git a/mesg-eng.h b/mesg-eng.h index fce4785..fb2cfe5 100644 --- a/mesg-eng.h +++ b/mesg-eng.h @@ -336,3 +336,7 @@ #define MSGJPN336 "Overwrite all later" #define MSGJPN337 "Resume all later" #define MSGJPN338 "Skip all" +#if defined(HAVE_TANDEM) +#define MSGJPN2000 "NonStop Server" +#define MSGJPN2001 "OSS<->GUARDIAN Switch(&O)" +#endif diff --git a/mesg-eng.old.h b/mesg-eng.old.h index fbb560f..968c8f0 100644 --- a/mesg-eng.old.h +++ b/mesg-eng.old.h @@ -336,3 +336,7 @@ #define MSGJPN336 "Overwrite all later" #define MSGJPN337 "Resume all later" #define MSGJPN338 "Skip all" +#if defined(HAVE_TANDEM) +#define MSGJPN2000 "NonStop Server" +#define MSGJPN2001 "OSS<->GUARDIAN Switch(&O)" +#endif diff --git a/mesg-jpn.h b/mesg-jpn.h index 02e3e6c..eb20898 100644 --- a/mesg-jpn.h +++ b/mesg-jpn.h @@ -336,3 +336,7 @@ #define MSGJPN336 "\xE5\x85\xA8\xE3\x81\xA6\xE5\xBE\x8C\xE3\x81\xA7\xE4\xB8\x8A\xE6\x9B\xB8\xE3\x81\x8D" #define MSGJPN337 "\xE5\x85\xA8\xE3\x81\xA6\xE5\xBE\x8C\xE3\x81\xA7\xE3\x83\xAA\xE3\x82\xB8\xE3\x83\xA5\xE3\x83\xBC\xE3\x83\xA0" #define MSGJPN338 "\xE5\x85\xA8\xE3\x81\xA6\xE3\x82\xB9\xE3\x82\xAD\xE3\x83\x83\xE3\x83\x97" +#if defined(HAVE_TANDEM) +#define MSGJPN2000 "NonStop Server" +#define MSGJPN2001 "OSS<->GUARDIAN \xE5\x88\x87\xE3\x82\x8A\xE6\x9B\xBF\xE3\x81\x88(&O)" +#endif diff --git a/mesg-jpn.old.h b/mesg-jpn.old.h index 68a8a23..7f48fcb 100644 --- a/mesg-jpn.old.h +++ b/mesg-jpn.old.h @@ -336,3 +336,7 @@ #define MSGJPN336 "‘S‚ÄŒã‚ŏ㏑‚«" #define MSGJPN337 "‘S‚ÄŒã‚ŃŠƒWƒ…[ƒ€" #define MSGJPN338 "‘S‚ăXƒLƒbƒv" +#if defined(HAVE_TANDEM) +#define MSGJPN2000 "NonStop Server" +#define MSGJPN2001 "OSS<->GUARDIAN Ø‚è‘Ö‚¦(&O)" +#endif diff --git a/misc.c b/misc.c index 5489e66..67ccd91 100644 --- a/misc.c +++ b/misc.c @@ -318,6 +318,13 @@ void RemoveYenTail(char *Str) void SetSlashTail(char *Str) { +#if defined(HAVE_TANDEM) + /* Tandem では / の代わりに . を追加 */ + if(AskHostType() == HTYPE_TANDEM) { + if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), ".") != 0) + strcat(Str, "."); + } else +#endif if(_mbscmp(_mbsninc(Str, _mbslen(Str) - 1), "/") != 0) strcat(Str, "/"); @@ -364,6 +371,12 @@ void ReplaceAll(char *Str, char Src, char Dst) { char *Pos; +/* Tandem ではノード名の変換を行わない */ +/* 最初の1文字が \ でもそのままにする */ +#if defined(HAVE_TANDEM) + if (AskRealHostType() == HTYPE_TANDEM && strlen(Str) > 0) + Str++; +#endif while((Pos = _mbschr(Str, Src)) != NULL) *Pos = Dst; return; @@ -597,6 +610,11 @@ char *GetFileName(char *Path) if((Pos = _mbsrchr(Path, '/')) != NULL) Path = Pos + 1; +#if defined(HAVE_TANDEM) + /* Tandem は . がデリミッタとなる */ + if((AskHostType() == HTYPE_TANDEM) && ((Pos = _mbsrchr(Path, '.')) != NULL)) + Path = Pos + 1; +#endif return(Path); } @@ -1788,3 +1806,34 @@ char* GetAppTempPath(char* Buf) return Buf; } +#if defined(HAVE_TANDEM) +/*----- ファイルサイズからEXTENTサイズの計算を行う ---------------------------- +* +* Parameter +* LONGLONG Size : ファイルサイズ +* +* Return Value +* なし +*----------------------------------------------------------------------------*/ +void CalcExtentSize(TRANSPACKET *Pkt, LONGLONG Size) +{ + LONGLONG extent; + + /* EXTENTS(4,28) MAXEXTENTS 978 */ + if(Size < 56025088) { + Pkt->PriExt = DEF_PRIEXT; + Pkt->SecExt = DEF_SECEXT; + Pkt->MaxExt = DEF_MAXEXT; + } else { + /* 増加余地を残すため Used 75% 近辺になるように EXTENT サイズを調整) */ + extent = (LONGLONG)(Size / ((DEF_MAXEXT * 0.75) * 2048LL)); + /* 28未満にすると誤差でFile Fullになる可能性がある */ + if(extent < 28) + extent = 28; + + Pkt->PriExt = (int)extent; + Pkt->SecExt = (int)extent; + Pkt->MaxExt = DEF_MAXEXT; + } +} +#endif diff --git a/putty/Release/PuTTY.dll b/putty/Release/PuTTY.dll index 6a506e4..123affa 100644 Binary files a/putty/Release/PuTTY.dll and b/putty/Release/PuTTY.dll differ diff --git a/remote.c b/remote.c index 56da76e..bc80b07 100644 --- a/remote.c +++ b/remote.c @@ -685,6 +685,39 @@ int CommandProcCmd(char *Reply, char *fmt, ...) } +#if defined(HAVE_TANDEM) +/*----- OSS/Guardian ファイルシステムを切り替えるコマンドを送る --------------- +* +* Parameter +* なし +* +* Return Value +* なし +*----------------------------------------------------------------------------*/ + +void SwitchOSSProc(void) +{ + char Buf[MAX_PATH+1]; + + /* DoPWD でノード名の \ を保存するために OSSフラグも変更する */ + if(AskOSS() == YES) { + DoQUOTE("GUARDIAN"); + SetOSS(NO); + } else { + DoQUOTE("OSS"); + SetOSS(YES); + } + /* Current Dir 再取得 */ + if (DoPWD(Buf) == FTP_COMPLETE) + SetRemoteDirHist(Buf); + /* ファイルリスト再読み込み */ + PostMessage(GetMainHwnd(), WM_COMMAND, MAKEWPARAM(REFRESH_REMOTE, 0), 0); + + return; +} +#endif + + /*----- リモート側へコマンドを送りリプライを待つ(転送ソケット)--------------- * * Parameter diff --git a/toolmenu.c b/toolmenu.c index ae530b4..217e2c9 100644 --- a/toolmenu.c +++ b/toolmenu.c @@ -1846,9 +1846,18 @@ void RemoteRbuttonMenu(int Pos) AppendMenu(hMenu, MF_STRING | Flg1, MENU_DOWNLOAD_ALL, MSGJPN266); AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_DELETE, MSGJPN267); AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_RENAME, MSGJPN268); +#if defined(HAVE_TANDEM) + /* HP NonStop Server では CHMOD の仕様が異なるため使用不可 */ + if (AskRealHostType() != HTYPE_TANDEM) +#endif AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_CHMOD, MSGJPN269); AppendMenu(hMenu, MF_STRING | Flg1, MENU_MKDIR, MSGJPN270); AppendMenu(hMenu, MF_STRING | Flg1 | Flg2, MENU_URL_COPY, MSGJPN271); +#if defined(HAVE_TANDEM) + /* OSS モードのときに表示されるように AskRealHostType() を使用する */ + if (AskRealHostType() == HTYPE_TANDEM) + AppendMenu(hMenu, MF_STRING | Flg1, MENU_SWITCH_OSS, MSGJPN2001); +#endif AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); AppendMenu(hMenu, MF_STRING | Flg1, MENU_FILESIZE, MSGJPN272); AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);