X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/d6cc41e6b7e76a763c46965e25847af3fd1a6791..df0870fc8ceb5a8fea66a4d0fe00e7db12317e33:/psftp.c diff --git a/psftp.c b/psftp.c index a032c70c..c1d4950b 100644 --- a/psftp.c +++ b/psftp.c @@ -370,6 +370,7 @@ int sftp_general_get(struct sftp_command *cmd, int restart) struct fxp_handle *fh; struct sftp_packet *pktin; struct sftp_request *req, *rreq; + struct fxp_xfer *xfer; char *fname, *outfname; uint64 offset; FILE *fp; @@ -439,41 +440,43 @@ int sftp_general_get(struct sftp_command *cmd, int restart) * thus put up a progress bar. */ ret = 1; - while (1) { - char buffer[4096]; - int len; + xfer = xfer_download_init(fh, offset); + while (!xfer_done(xfer)) { + void *vbuf; + int ret, len; int wpos, wlen; - sftp_register(req = fxp_read_send(fh, offset, sizeof(buffer))); - rreq = sftp_find_request(pktin = sftp_recv()); - assert(rreq == req); - len = fxp_read_recv(pktin, rreq, buffer, sizeof(buffer)); + xfer_download_queue(xfer); + pktin = sftp_recv(); + ret = xfer_download_gotpkt(xfer, pktin); - if ((len == -1 && fxp_error_type() == SSH_FX_EOF) || len == 0) - break; - if (len == -1) { - printf("error while reading: %s\n", fxp_error()); - ret = 0; - break; + if (ret < 0) { + printf("error while reading: %s\n", fxp_error()); + ret = 0; } - wpos = 0; - while (wpos < len) { - wlen = fwrite(buffer, 1, len - wpos, fp); - if (wlen <= 0) { - printf("error while writing local file\n"); + while (xfer_download_data(xfer, &vbuf, &len)) { + unsigned char *buf = (unsigned char *)vbuf; + + wpos = 0; + while (wpos < len) { + wlen = fwrite(buf + wpos, 1, len - wpos, fp); + if (wlen <= 0) { + printf("error while writing local file\n"); + ret = 0; + xfer_set_error(xfer); + } + wpos += wlen; + } + if (wpos < len) { /* we had an error */ ret = 0; - break; + xfer_set_error(xfer); } - wpos += wlen; - } - if (wpos < len) { /* we had an error */ - ret = 0; - break; } - offset = uint64_add32(offset, len); } + xfer_cleanup(xfer); + fclose(fp); sftp_register(req = fxp_close_send(fh)); @@ -503,12 +506,13 @@ int sftp_cmd_reget(struct sftp_command *cmd) int sftp_general_put(struct sftp_command *cmd, int restart) { struct fxp_handle *fh; + struct fxp_xfer *xfer; char *fname, *origoutfname, *outfname; struct sftp_packet *pktin; struct sftp_request *req, *rreq; uint64 offset; FILE *fp; - int ret; + int ret, err, eof; if (back == NULL) { printf("psftp: not connected to a host; use \"open host.name\"\n"); @@ -592,32 +596,35 @@ int sftp_general_put(struct sftp_command *cmd, int restart) * thus put up a progress bar. */ ret = 1; - while (1) { + xfer = xfer_upload_init(fh, offset); + err = eof = 0; + while ((!err && !eof) || !xfer_done(xfer)) { char buffer[4096]; int len, ret; - len = fread(buffer, 1, sizeof(buffer), fp); - if (len == -1) { - printf("error while reading local file\n"); - ret = 0; - break; - } else if (len == 0) { - break; + while (xfer_upload_ready(xfer) && !err && !eof) { + len = fread(buffer, 1, sizeof(buffer), fp); + if (len == -1) { + printf("error while reading local file\n"); + err = 1; + } else if (len == 0) { + eof = 1; + } else { + xfer_upload_data(xfer, buffer, len); + } } - sftp_register(req = fxp_write_send(fh, buffer, offset, len)); - rreq = sftp_find_request(pktin = sftp_recv()); - assert(rreq == req); - ret = fxp_write_recv(pktin, rreq); + pktin = sftp_recv(); + ret = xfer_upload_gotpkt(xfer, pktin); if (!ret) { printf("error while writing: %s\n", fxp_error()); - ret = 0; - break; + err = 1; } - offset = uint64_add32(offset, len); } + xfer_cleanup(xfer); + sftp_register(req = fxp_close_send(fh)); rreq = sftp_find_request(pktin = sftp_recv()); assert(rreq == req); @@ -894,20 +901,20 @@ int sftp_cmd_chmod(struct sftp_command *cmd) default: printf("chmod: file mode '%.*s' contains unrecognised" " user/group/other specifier '%c'\n", - strcspn(modebegin, ","), modebegin, *mode); + (int)strcspn(modebegin, ","), modebegin, *mode); return 0; } mode++; } if (!*mode || *mode == ',') { printf("chmod: file mode '%.*s' is incomplete\n", - strcspn(modebegin, ","), modebegin); + (int)strcspn(modebegin, ","), modebegin); return 0; } action = *mode++; if (!*mode || *mode == ',') { printf("chmod: file mode '%.*s' is incomplete\n", - strcspn(modebegin, ","), modebegin); + (int)strcspn(modebegin, ","), modebegin); return 0; } perms = 0; @@ -922,7 +929,7 @@ int sftp_cmd_chmod(struct sftp_command *cmd) (subset & 06777) != 02070) { printf("chmod: file mode '%.*s': set[ug]id bit should" " be used with exactly one of u or g only\n", - strcspn(modebegin, ","), modebegin); + (int)strcspn(modebegin, ","), modebegin); return 0; } perms |= 06000; @@ -930,7 +937,7 @@ int sftp_cmd_chmod(struct sftp_command *cmd) default: printf("chmod: file mode '%.*s' contains unrecognised" " permission specifier '%c'\n", - strcspn(modebegin, ","), modebegin, *mode); + (int)strcspn(modebegin, ","), modebegin, *mode); return 0; } mode++; @@ -938,7 +945,7 @@ int sftp_cmd_chmod(struct sftp_command *cmd) if (!(subset & 06777) && (perms &~ subset)) { printf("chmod: file mode '%.*s' contains no user/group/other" " specifier and permissions other than 't' \n", - strcspn(modebegin, ","), modebegin); + (int)strcspn(modebegin, ","), modebegin); return 0; } perms &= subset; @@ -1740,6 +1747,7 @@ static int psftp_connect(char *userhost, char *user, int portnumber) { char *host, *realhost; const char *err; + void *logctx; /* Separate host and username */ host = userhost; @@ -1925,7 +1933,11 @@ int psftp_main(int argc, char *argv[]) char *batchfile = NULL; int errors = 0; - flags = FLAG_STDERR | FLAG_INTERACTIVE | FLAG_SYNCAGENT; + flags = FLAG_STDERR | FLAG_INTERACTIVE +#ifdef FLAG_SYNCAGENT + | FLAG_SYNCAGENT +#endif + ; cmdline_tooltype = TOOLTYPE_FILETRANSFER; ssh_get_line = &console_get_line; sk_init();