X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=pscp.c;h=454ec084c5cf5d161d713ed2f643e5dc4429bee2;hb=510f49e405e71ba5c97875e7a019364e1ef5fac9;hp=1d4967e760bbecdd2ae72b1674901d7073738383;hpb=9e20c81bc9c945565dd182854eeffa03b63f830a;p=PuTTY.git diff --git a/pscp.c b/pscp.c index 1d4967e7..454ec084 100644 --- a/pscp.c +++ b/pscp.c @@ -383,6 +383,7 @@ static void do_cmd(char *host, char *user, char *cmd) /* Use `host' as a bare hostname. */ conf_set_str(conf, CONF_host, host); } + conf_free(conf2); } else { /* Patch in hostname `host' to session details. */ conf_set_str(conf, CONF_host, host); @@ -514,6 +515,11 @@ static void do_cmd(char *host, char *user, char *cmd) back = &ssh_backend; + logctx = log_init(NULL, conf); + console_provide_logctx(logctx); + + platform_psftp_pre_conn_setup(); + err = back->init(NULL, &backhandle, conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), @@ -521,9 +527,7 @@ static void do_cmd(char *host, char *user, char *cmd) conf_get_int(conf, CONF_tcp_keepalives)); if (err != NULL) bump("ssh_init: %s", err); - logctx = log_init(NULL, conf); back->provide_logctx(backhandle, logctx); - console_provide_logctx(logctx); ssh_scp_init(); if (verbose && realhost != NULL && errs == 0) tell_user(stderr, "Connected to %s", realhost); @@ -605,35 +609,6 @@ static char *colon(char *str) return (NULL); } -/* - * Return a pointer to the portion of str that comes after the last - * slash (or backslash or colon, if `local' is TRUE). - * - * This function has the annoying strstr() property of taking a const - * char * and returning a char *. You should treat it as if it was a - * pair of overloaded functions, one mapping mutable->mutable and the - * other const->const :-( - */ -static char *stripslashes(const char *str, int local) -{ - char *p; - - if (local) { - p = strchr(str, ':'); - if (p) str = p+1; - } - - p = strrchr(str, '/'); - if (p) str = p+1; - - if (local) { - p = strrchr(str, '\\'); - if (p) str = p+1; - } - - return (char *)str; -} - /* * Determine whether a string is entirely composed of dots. */ @@ -687,6 +662,10 @@ int sftp_senddata(char *buf, int len) back->send(backhandle, buf, len); return 1; } +int sftp_sendbuffer(void) +{ + return back->sendbuffer(backhandle); +} /* ---------------------------------------------------------------------- * sftp-based replacement for the hacky `pscp -ls'. @@ -720,7 +699,8 @@ void scp_sftp_listdir(const char *dirname) dirh = fxp_opendir_recv(pktin, req); if (dirh == NULL) { - printf("Unable to open %s: %s\n", dirname, fxp_error()); + tell_user(stderr, "Unable to open %s: %s\n", dirname, fxp_error()); + errs++; } else { nnames = namesize = 0; ournames = NULL; @@ -1524,7 +1504,7 @@ int scp_get_sink_action(struct scp_sink_action *act) { char sizestr[40]; - if (sscanf(act->buf, "%lo %s %n", &act->permissions, + if (sscanf(act->buf, "%lo %39s %n", &act->permissions, sizestr, &i) != 2) bump("Protocol error: Illegal file descriptor format"); act->size = uint64_from_decimal(sizestr); @@ -1580,6 +1560,12 @@ int scp_recv_filedata(char *data, int len) } if (xfer_download_data(scp_sftp_xfer, &vbuf, &actuallen)) { + if (actuallen <= 0) { + tell_user(stderr, "pscp: end of file while reading"); + errs++; + sfree(vbuf); + return -1; + } /* * This assertion relies on the fact that the natural * block size used in the xfer manager is at most that @@ -1740,11 +1726,12 @@ static void source(const char *src) stat_starttime = time(NULL); stat_lasttime = 0; +#define PSCP_SEND_BLOCK 4096 for (i = uint64_make(0,0); uint64_compare(i,size) < 0; - i = uint64_add32(i,4096)) { - char transbuf[4096]; - int j, k = 4096; + i = uint64_add32(i,PSCP_SEND_BLOCK)) { + char transbuf[PSCP_SEND_BLOCK]; + int j, k = PSCP_SEND_BLOCK; if (uint64_compare(uint64_add32(i, k),size) > 0) /* i + k > size */ k = (uint64_subtract(size, i)).lo; /* k = size - i; */ @@ -1982,8 +1969,10 @@ static void sink(const char *targ, const char *src) read = scp_recv_filedata(transbuf, (int)blksize.lo); if (read <= 0) bump("Lost connection"); - if (wrerror) + if (wrerror) { + received = uint64_add32(received, read); continue; + } if (write_to_file(f, transbuf, read) != (int)read) { wrerror = 1; /* FIXME: in sftp we can actually abort the transfer */ @@ -1991,6 +1980,7 @@ static void sink(const char *targ, const char *src) printf("\r%-25.25s | %50s\n", stat_name, "Write error.. waiting for end of file"); + received = uint64_add32(received, read); continue; } if (statistics) { @@ -2265,9 +2255,14 @@ static void usage(void) printf(" -hostkey aa:bb:cc:...\n"); printf(" manually specify a host key (may be repeated)\n"); printf(" -batch disable all interactive prompts\n"); + printf(" -proxycmd command\n"); + printf(" use 'command' as local proxy\n"); printf(" -unsafe allow server-side wildcards (DANGEROUS)\n"); printf(" -sftp force use of SFTP protocol\n"); printf(" -scp force use of SCP protocol\n"); + printf(" -sshlog file\n"); + printf(" -sshrawlog file\n"); + printf(" log protocol details to a file\n"); #if 0 /* * -gui is an internal option, used by GUI front ends to get @@ -2284,8 +2279,10 @@ static void usage(void) void version(void) { - printf("pscp: %s\n", ver); - cleanup_exit(1); + char *buildinfo_text = buildinfo("\n"); + printf("pscp: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); + exit(0); } void cmdline_error(const char *p, ...)