]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - psftp.c
first pass
[PuTTY.git] / psftp.c
diff --git a/psftp.c b/psftp.c
index 93a96a4e152a63cc682042474a9a1c0c8d2573fc..5394c1fbb9150007422c8f9d0b39da66ff8aa37e 100644 (file)
--- a/psftp.c
+++ b/psftp.c
@@ -433,7 +433,7 @@ int sftp_get_file(char *fname, char *outfname, int recurse, int restart)
     xfer = xfer_download_init(fh, offset);
     while (!xfer_done(xfer)) {
        void *vbuf;
-       int ret, len;
+       int len;
        int wpos, wlen;
 
        xfer_download_queue(xfer);
@@ -491,7 +491,7 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
     struct sftp_request *req;
     uint64 offset;
     RFile *file;
-    int ret, err, eof;
+    int err = 0, eof;
     struct fxp_attrs attrs;
     long permissions;
 
@@ -644,6 +644,7 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
     if (restart) {
        char decbuf[30];
        struct fxp_attrs attrs;
+        int ret;
 
        req = fxp_fstat_send(fh);
         pktin = sftp_wait_for_reply(req);
@@ -651,11 +652,12 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
 
        if (!ret) {
            printf("read size of %s: %s\n", outfname, fxp_error());
+           err = 1;
             goto cleanup;
        }
        if (!(attrs.flags & SSH_FILEXFER_ATTR_SIZE)) {
            printf("read size of %s: size was not given\n", outfname);
-            ret = 0;
+           err = 1;
             goto cleanup;
        }
        offset = attrs.size;
@@ -674,9 +676,8 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
      * FIXME: we can use FXP_FSTAT here to get the file size, and
      * thus put up a progress bar.
      */
-    ret = 1;
     xfer = xfer_upload_init(fh, offset);
-    err = eof = 0;
+    eof = 0;
     while ((!err && !eof) || !xfer_done(xfer)) {
        char buffer[4096];
        int len, ret;
@@ -712,11 +713,16 @@ int sftp_put_file(char *fname, char *outfname, int recurse, int restart)
   cleanup:
     req = fxp_close_send(fh);
     pktin = sftp_wait_for_reply(req);
-    fxp_close_recv(pktin, req);
+    if (!fxp_close_recv(pktin, req)) {
+       if (!err) {
+           printf("error while closing: %s", fxp_error());
+           err = 1;
+       }
+    }
 
     close_rfile(file);
 
-    return ret;
+    return (err == 0) ? 1 : 0;
 }
 
 /* ----------------------------------------------------------------------
@@ -1044,6 +1050,7 @@ int sftp_cmd_ls(struct sftp_command *cmd)
 
     if (dirh == NULL) {
        printf("Unable to open %s: %s\n", dir, fxp_error());
+       return 0;
     } else {
        nnames = namesize = 0;
        ournames = NULL;
@@ -2618,6 +2625,10 @@ int sftp_senddata(char *buf, int len)
     back->send(backhandle, buf, len);
     return 1;
 }
+int sftp_sendbuffer(void)
+{
+    return back->sendbuffer(backhandle);
+}
 
 /*
  *  Short description of parameters.
@@ -2647,13 +2658,20 @@ 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("  -sshlog file\n");
+    printf("  -sshrawlog file\n");
+    printf("            log protocol details to a file\n");
     cleanup_exit(1);
 }
 
 static void version(void)
 {
-  printf("psftp: %s\n", ver);
-  cleanup_exit(1);
+  char *buildinfo_text = buildinfo("\n");
+  printf("psftp: %s\n%s\n", ver, buildinfo_text);
+  sfree(buildinfo_text);
+  exit(0);
 }
 
 /*
@@ -2822,6 +2840,11 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
 
     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),
@@ -2831,9 +2854,7 @@ static int psftp_connect(char *userhost, char *user, int portnumber)
        fprintf(stderr, "ssh_init: %s\n", err);
        return 1;
     }
-    logctx = log_init(NULL, conf);
     back->provide_logctx(backhandle, logctx);
-    console_provide_logctx(logctx);
     while (!back->sendok(backhandle)) {
        if (back->exitcode(backhandle) >= 0)
            return 1;