]> andersk Git - openssh.git/blobdiff - sftp-client.c
- (stevesk) logintest.c: fix for systems without __progname
[openssh.git] / sftp-client.c
index 9f77d366ccf9d3d698c5cfeec46c853aed4cb503..7be73d29fee905a1b6e26f5b61b2164ae07f15ff 100644 (file)
@@ -29,7 +29,7 @@
 /* XXX: copy between two remote sites */
 
 #include "includes.h"
-RCSID("$OpenBSD: sftp-client.c,v 1.12 2001/03/13 22:42:54 djm Exp $");
+RCSID("$OpenBSD: sftp-client.c,v 1.15 2001/03/19 10:52:51 djm Exp $");
 
 #include "ssh.h"
 #include "buffer.h"
@@ -77,7 +77,9 @@ get_msg(int fd, Buffer *m)
        unsigned char buf[4096];
 
        len = atomicio(read, fd, buf, 4);
-       if (len != 4)
+       if (len == 0)
+               fatal("Connection closed");
+       else if (len == -1)
                fatal("Couldn't read packet: %s", strerror(errno));
 
        msg_len = GET_32BIT(buf);
@@ -86,7 +88,9 @@ get_msg(int fd, Buffer *m)
 
        while (msg_len) {
                len = atomicio(read, fd, buf, MIN(msg_len, sizeof(buf)));
-               if (len <= 0)
+               if (len == 0)
+                       fatal("Connection closed");
+               else if (len == -1)
                        fatal("Couldn't read packet: %s", strerror(errno));
 
                msg_len -= len;
@@ -180,7 +184,7 @@ get_handle(int fd, u_int expected_id, u_int *len)
 }
 
 Attrib *
-get_decode_stat(int fd, u_int expected_id)
+get_decode_stat(int fd, u_int expected_id, int quiet)
 {
        Buffer msg;
        u_int type, id;
@@ -198,7 +202,10 @@ get_decode_stat(int fd, u_int expected_id)
        if (type == SSH2_FXP_STATUS) {
                int status = buffer_get_int(&msg);
 
-               error("Couldn't stat remote file: %s", fx2txt(status));
+               if (quiet)
+                       debug("Couldn't stat remote file: %s", fx2txt(status));
+               else
+                       error("Couldn't stat remote file: %s", fx2txt(status));
                return(NULL);
        } else if (type != SSH2_FXP_ATTRS) {
                fatal("Expected SSH2_FXP_ATTRS(%d) packet, got %d",
@@ -281,7 +288,7 @@ do_lsreaddir(int fd_in, int fd_out, char *path, int printflag,
     SFTP_DIRENT ***dir)
 {
        Buffer msg;
-       u_int type, id, handle_len, i, expected_id, ents;
+       u_int type, id, handle_len, i, expected_id, ents = 0;
        char *handle;
 
        id = msg_id++;
@@ -455,34 +462,33 @@ do_rmdir(int fd_in, int fd_out, char *path)
 }
 
 Attrib *
-do_stat(int fd_in, int fd_out, char *path)
+do_stat(int fd_in, int fd_out, char *path, int quiet)
 {
        u_int id;
 
        id = msg_id++;
        send_string_request(fd_out, id, SSH2_FXP_STAT, path, strlen(path));
-       return(get_decode_stat(fd_in, id));
+       return(get_decode_stat(fd_in, id, quiet));
 }
 
 Attrib *
-do_lstat(int fd_in, int fd_out, char *path)
+do_lstat(int fd_in, int fd_out, char *path, int quiet)
 {
        u_int id;
 
        id = msg_id++;
        send_string_request(fd_out, id, SSH2_FXP_LSTAT, path, strlen(path));
-       return(get_decode_stat(fd_in, id));
+       return(get_decode_stat(fd_in, id, quiet));
 }
 
 Attrib *
-do_fstat(int fd_in, int fd_out, char *handle,
-    u_int handle_len)
+do_fstat(int fd_in, int fd_out, char *handle, u_int handle_len, int quiet)
 {
        u_int id;
 
        id = msg_id++;
        send_string_request(fd_out, id, SSH2_FXP_FSTAT, handle, handle_len);
-       return(get_decode_stat(fd_in, id));
+       return(get_decode_stat(fd_in, id, quiet));
 }
 
 int
@@ -677,7 +683,7 @@ do_download(int fd_in, int fd_out, char *remote_path, char *local_path,
        Attrib junk, *a;
        int status;
 
-       a = do_stat(fd_in, fd_out, remote_path);
+       a = do_stat(fd_in, fd_out, remote_path, 0);
        if (a == NULL)
                return(-1);
 
@@ -687,11 +693,17 @@ do_download(int fd_in, int fd_out, char *remote_path, char *local_path,
        else
                mode = 0666;
 
+       if ((a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) &&
+           (a->perm & S_IFDIR)) {
+               error("Cannot download a directory: %s", remote_path);
+               return(-1);
+       }
+
        local_fd = open(local_path, O_WRONLY | O_CREAT | O_TRUNC, mode);
        if (local_fd == -1) {
                error("Couldn't open local file \"%s\" for writing: %s",
                    local_path, strerror(errno));
-               return(errno);
+               return(-1);
        }
 
        buffer_init(&msg);
This page took 0.037863 seconds and 4 git commands to generate.