X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=scp.c;h=a11d53cd70a8e5f8cd2fa7caaf9e7c5ccdf1a4c9;hb=949cecd569fc1f6876f35cb19a067462add74ab8;hp=34f6ffb5bdff2d9ac805b54084b416e8fb24463d;hpb=fdbd6978016e9fd87db7b3bfc33ff0da8bd3eea9;p=PuTTY.git diff --git a/scp.c b/scp.c index 34f6ffb5..a11d53cd 100644 --- a/scp.c +++ b/scp.c @@ -40,15 +40,39 @@ ((*(LONGLONG*)&(ft)) / (LONGLONG) 10000000 - (LONGLONG) 11644473600)) /* GUI Adaptation - Sept 2000 */ + +/* This is just a base value from which the main message numbers are + * derived. */ #define WM_APP_BASE 0x8000 + +/* These two pass a single character value in wParam. They represent + * the visible output from PSCP. */ #define WM_STD_OUT_CHAR ( WM_APP_BASE+400 ) #define WM_STD_ERR_CHAR ( WM_APP_BASE+401 ) + +/* These pass a transfer status update. WM_STATS_CHAR passes a single + * character in wParam, and is called repeatedly to pass the name of + * the file, terminated with "\n". WM_STATS_SIZE passes the size of + * the file being transferred in wParam. WM_STATS_ELAPSED is called + * to pass the elapsed time (in seconds) in wParam, and + * WM_STATS_PERCENT passes the percentage of the transfer which is + * complete, also in wParam. */ #define WM_STATS_CHAR ( WM_APP_BASE+402 ) #define WM_STATS_SIZE ( WM_APP_BASE+403 ) #define WM_STATS_PERCENT ( WM_APP_BASE+404 ) #define WM_STATS_ELAPSED ( WM_APP_BASE+405 ) + +/* These are used at the end of a run to pass an error code in + * wParam: zero means success, nonzero means failure. WM_RET_ERR_CNT + * is used after a copy, and WM_LS_RET_ERR_CNT is used after a file + * list operation. */ #define WM_RET_ERR_CNT ( WM_APP_BASE+406 ) #define WM_LS_RET_ERR_CNT ( WM_APP_BASE+407 ) + +/* More transfer status update messages. WM_STATS_DONE passes the + * number of bytes sent so far in wParam. WM_STATS_ETA passes the + * estimated time to completion (in seconds). WM_STATS_RATEBS passes + * the average transfer rate (in bytes per second). */ #define WM_STATS_DONE ( WM_APP_BASE+408 ) #define WM_STATS_ETA ( WM_APP_BASE+409 ) #define WM_STATS_RATEBS ( WM_APP_BASE+410 ) @@ -210,7 +234,7 @@ void fatalbox(char *fmt, ...) 0 /*lParam */ ))SleepEx(1000, TRUE); } - exit(1); + cleanup_exit(1); } void connection_fatal(char *fmt, ...) { @@ -233,7 +257,7 @@ void connection_fatal(char *fmt, ...) 0 /*lParam */ ))SleepEx(1000, TRUE); } - exit(1); + cleanup_exit(1); } /* @@ -404,7 +428,7 @@ static void bump(char *fmt, ...) 0 /*lParam */ ))SleepEx(1000, TRUE); } - exit(1); + cleanup_exit(1); } /* @@ -666,6 +690,12 @@ void scp_sftp_listdir(char *dirname) int nnames, namesize; int i; + if (!fxp_init()) { + tell_user(stderr, "unable to initialise SFTP: %s", fxp_error()); + errs++; + return; + } + printf("Listing directory %s\n", dirname); dirh = fxp_opendir(dirname); @@ -748,6 +778,12 @@ void scp_source_setup(char *target, int shouldbedir) */ struct fxp_attrs attrs; + if (!fxp_init()) { + tell_user(stderr, "unable to initialise SFTP: %s", fxp_error()); + errs++; + return 1; + } + if (!fxp_stat(target, &attrs) || !(attrs.flags & SSH_FILEXFER_ATTR_PERMISSIONS)) scp_sftp_targetisdir = 0; @@ -959,6 +995,12 @@ int scp_sink_setup(char *source, int preserve, int recursive) { if (using_sftp) { char *newsource; + + if (!fxp_init()) { + tell_user(stderr, "unable to initialise SFTP: %s", fxp_error()); + errs++; + return 1; + } /* * It's possible that the source string we've been given * contains a wildcard. If so, we must split the directory @@ -2055,7 +2097,7 @@ static void usage(void) printf (" -gui hWnd GUI mode with the windows handle for receiving messages\n"); #endif - exit(1); + cleanup_exit(1); } /*