/* 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);
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),
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);
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.
*/
back->send(backhandle, buf, len);
return 1;
}
+int sftp_sendbuffer(void)
+{
+ return back->sendbuffer(backhandle);
+}
/* ----------------------------------------------------------------------
* sftp-based replacement for the hacky `pscp -ls'.
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;
{
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);
}
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
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; */
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 */
printf("\r%-25.25s | %50s\n",
stat_name,
"Write error.. waiting for end of file");
+ received = uint64_add32(received, read);
continue;
}
if (statistics) {
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
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, ...)