X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=pscp.c;h=5d8256dfa27c0578d877e9bc3dc64de01e723960;hb=415224eab5791f504c08146db901fe87837a19f6;hp=e56d760fbd7f09dc2d45f831fbc16efaea9ba1a6;hpb=addf6219bd9406f54b81139d7dfc8b6501ecd81a;p=PuTTY.git diff --git a/pscp.c b/pscp.c index e56d760f..5d8256df 100644 --- a/pscp.c +++ b/pscp.c @@ -48,9 +48,9 @@ static void *backhandle; static Conf *conf; int sent_eof = FALSE; -static void source(char *src); -static void rsource(char *src); -static void sink(char *targ, char *src); +static void source(const char *src); +static void rsource(const char *src); +static void sink(const char *targ, const char *src); const char *const appname = "PSCP"; @@ -60,23 +60,14 @@ const char *const appname = "PSCP"; */ #define MAX_SCP_BUFSIZE 16384 -void ldisc_send(void *handle, char *buf, int len, int interactive) -{ - /* - * This is only here because of the calls to ldisc_send(NULL, - * 0) in ssh.c. Nothing in PSCP actually needs to use the ldisc - * as an ldisc. So if we get called with any real data, I want - * to know about it. - */ - assert(len == 0); -} +void ldisc_echoedit_update(void *handle) { } -static void tell_char(FILE * stream, char c) +static void tell_char(FILE *stream, char c) { fputc(c, stream); } -static void tell_str(FILE * stream, char *str) +static void tell_str(FILE *stream, const char *str) { unsigned int i; @@ -84,7 +75,7 @@ static void tell_str(FILE * stream, char *str) tell_char(stream, str[i]); } -static void tell_user(FILE * stream, char *fmt, ...) +static void tell_user(FILE *stream, const char *fmt, ...) { char *str, *str2; va_list ap; @@ -100,7 +91,7 @@ static void tell_user(FILE * stream, char *fmt, ...) /* * Print an error message and perform a fatal exit. */ -void fatalbox(char *fmt, ...) +void fatalbox(const char *fmt, ...) { char *str, *str2; va_list ap; @@ -115,7 +106,7 @@ void fatalbox(char *fmt, ...) cleanup_exit(1); } -void modalfatalbox(char *fmt, ...) +void modalfatalbox(const char *fmt, ...) { char *str, *str2; va_list ap; @@ -130,7 +121,7 @@ void modalfatalbox(char *fmt, ...) cleanup_exit(1); } -void nonfatal(char *fmt, ...) +void nonfatal(const char *fmt, ...) { char *str, *str2; va_list ap; @@ -143,7 +134,7 @@ void nonfatal(char *fmt, ...) sfree(str2); errs++; } -void connection_fatal(void *frontend, char *fmt, ...) +void connection_fatal(void *frontend, const char *fmt, ...) { char *str, *str2; va_list ap; @@ -311,7 +302,7 @@ static void ssh_scp_init(void) /* * Print an error message and exit after closing the SSH link. */ -static void bump(char *fmt, ...) +static void bump(const char *fmt, ...) { char *str, *str2; va_list ap; @@ -523,6 +514,9 @@ static void do_cmd(char *host, char *user, char *cmd) back = &ssh_backend; + logctx = log_init(NULL, conf); + console_provide_logctx(logctx); + err = back->init(NULL, &backhandle, conf, conf_get_str(conf, CONF_host), conf_get_int(conf, CONF_port), @@ -530,9 +524,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); @@ -542,7 +534,7 @@ static void do_cmd(char *host, char *user, char *cmd) /* * Update statistic information about current file. */ -static void print_stats(char *name, uint64 size, uint64 done, +static void print_stats(const char *name, uint64 size, uint64 done, time_t start, time_t now) { float ratebs; @@ -614,30 +606,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). - */ -static char *stripslashes(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 str; -} - /* * Determine whether a string is entirely composed of dots. */ @@ -691,6 +659,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'. @@ -701,7 +673,7 @@ static int sftp_ls_compare(const void *av, const void *bv) const struct fxp_name *b = (const struct fxp_name *) bv; return strcmp(a->filename, b->filename); } -void scp_sftp_listdir(char *dirname) +void scp_sftp_listdir(const char *dirname) { struct fxp_handle *dirh; struct fxp_names *names; @@ -800,7 +772,7 @@ static struct fxp_handle *scp_sftp_filehandle; static struct fxp_xfer *scp_sftp_xfer; static uint64 scp_sftp_fileoffset; -int scp_source_setup(char *target, int shouldbedir) +int scp_source_setup(const char *target, int shouldbedir) { if (using_sftp) { /* @@ -866,7 +838,7 @@ int scp_send_filetimes(unsigned long mtime, unsigned long atime) } } -int scp_send_filename(char *name, uint64 size, int permissions) +int scp_send_filename(const char *name, uint64 size, int permissions) { if (using_sftp) { char *fullname; @@ -1021,7 +993,7 @@ void scp_restore_remotepath(char *data) scp_sftp_remotepath = data; } -int scp_send_dirname(char *name, int modes) +int scp_send_dirname(const char *name, int modes) { if (using_sftp) { char *fullname; @@ -1096,7 +1068,7 @@ int scp_send_enddir(void) * right at the start, whereas scp_sink_init is called to * initialise every level of recursion in the protocol. */ -int scp_sink_setup(char *source, int preserve, int recursive) +int scp_sink_setup(const char *source, int preserve, int recursive) { if (using_sftp) { char *newsource; @@ -1528,7 +1500,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); @@ -1666,12 +1638,12 @@ static void run_err(const char *fmt, ...) /* * Execute the source part of the SCP protocol. */ -static void source(char *src) +static void source(const char *src) { uint64 size; unsigned long mtime, atime; long permissions; - char *last; + const char *last; RFile *f; int attr; uint64 i; @@ -1691,7 +1663,7 @@ static void source(char *src) /* * Avoid . and .. directories. */ - char *p; + const char *p; p = strrchr(src, '/'); if (!p) p = strrchr(src, '\\'); @@ -1744,11 +1716,12 @@ static void source(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; */ @@ -1779,9 +1752,9 @@ static void source(char *src) /* * Recursively send the contents of a directory. */ -static void rsource(char *src) +static void rsource(const char *src) { - char *last; + const char *last; char *save_target; DirHandle *dir; @@ -1823,7 +1796,7 @@ static void rsource(char *src) /* * Execute the sink part of the SCP protocol. */ -static void sink(char *targ, char *src) +static void sink(const char *targ, const char *src) { char *destfname; int targisdir = 0; @@ -2029,23 +2002,26 @@ static void sink(char *targ, char *src) */ static void toremote(int argc, char *argv[]) { - char *src, *targ, *host, *user; + char *src, *wtarg, *host, *user; + const char *targ; char *cmd; int i, wc_type; uploading = 1; - targ = argv[argc - 1]; + wtarg = argv[argc - 1]; /* Separate host from filename */ - host = targ; - targ = colon(targ); - if (targ == NULL) - bump("targ == NULL in toremote()"); - *targ++ = '\0'; - if (*targ == '\0') - targ = "."; + host = wtarg; + wtarg = colon(wtarg); + if (wtarg == NULL) + bump("wtarg == NULL in toremote()"); + *wtarg++ = '\0'; /* Substitute "." for empty target */ + if (*wtarg == '\0') + targ = "."; + else + targ = wtarg; /* Separate host and username */ user = host; @@ -2121,7 +2097,8 @@ static void toremote(int argc, char *argv[]) */ static void tolocal(int argc, char *argv[]) { - char *src, *targ, *host, *user; + char *wsrc, *host, *user; + const char *src, *targ; char *cmd; uploading = 0; @@ -2129,18 +2106,20 @@ static void tolocal(int argc, char *argv[]) if (argc != 2) bump("More than one remote source not supported"); - src = argv[0]; + wsrc = argv[0]; targ = argv[1]; /* Separate host from filename */ - host = src; - src = colon(src); - if (src == NULL) + host = wsrc; + wsrc = colon(wsrc); + if (wsrc == NULL) bump("Local to local copy not supported"); - *src++ = '\0'; - if (*src == '\0') - src = "."; + *wsrc++ = '\0'; /* Substitute "." for empty filename */ + if (*wsrc == '\0') + src = "."; + else + src = wsrc; /* Separate username and hostname */ user = host; @@ -2173,21 +2152,25 @@ static void tolocal(int argc, char *argv[]) */ static void get_dir_list(int argc, char *argv[]) { - char *src, *host, *user; - char *cmd, *p, *q; + char *wsrc, *host, *user; + const char *src; + char *cmd, *p; + const char *q; char c; - src = argv[0]; + wsrc = argv[0]; /* Separate host from filename */ - host = src; - src = colon(src); - if (src == NULL) + host = wsrc; + wsrc = colon(wsrc); + if (wsrc == NULL) bump("Local file listing not supported"); - *src++ = '\0'; - if (*src == '\0') - src = "."; + *wsrc++ = '\0'; /* Substitute "." for empty filename */ + if (*wsrc == '\0') + src = "."; + else + src = wsrc; /* Separate username and hostname */ user = host; @@ -2262,6 +2245,9 @@ static void usage(void) 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 @@ -2278,11 +2264,13 @@ static void usage(void) void version(void) { - printf("pscp: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("pscp: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); cleanup_exit(1); } -void cmdline_error(char *p, ...) +void cmdline_error(const char *p, ...) { va_list ap; fprintf(stderr, "pscp: "); @@ -2369,6 +2357,8 @@ int psftp_main(int argc, char *argv[]) argv += i; back = NULL; + platform_psftp_post_option_setup(); + if (list) { if (argc != 1) usage();