]> andersk Git - openssh.git/blobdiff - sftp-client.c
- naddy@cvs.openbsd.org 2009/01/24 17:10:22
[openssh.git] / sftp-client.c
index 8593cb8ceb81069395b5fd8c4441e6bde5862834..5e39aa7d21bd6f8b309d1e774c0230ed7fc75aa9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: sftp-client.c,v 1.82 2008/04/18 12:32:11 djm Exp $ */
+/* $OpenBSD: sftp-client.c,v 1.86 2008/06/26 06:10:09 djm Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
@@ -243,9 +243,9 @@ get_decode_stat(int fd, u_int expected_id, int quiet)
        return(a);
 }
 
-#ifdef USE_STATVFS
 static int
-get_decode_statvfs(int fd, struct statvfs *st, u_int expected_id, int quiet)
+get_decode_statvfs(int fd, struct sftp_statvfs *st, u_int expected_id,
+    int quiet)
 {
        Buffer msg;
        u_int type, id, flag;
@@ -274,17 +274,17 @@ get_decode_statvfs(int fd, struct statvfs *st, u_int expected_id, int quiet)
        }
 
        bzero(st, sizeof(*st));
-       st->f_bsize = buffer_get_int(&msg);
-       st->f_frsize = buffer_get_int(&msg);
+       st->f_bsize = buffer_get_int64(&msg);
+       st->f_frsize = buffer_get_int64(&msg);
        st->f_blocks = buffer_get_int64(&msg);
        st->f_bfree = buffer_get_int64(&msg);
        st->f_bavail = buffer_get_int64(&msg);
        st->f_files = buffer_get_int64(&msg);
        st->f_ffree = buffer_get_int64(&msg);
        st->f_favail = buffer_get_int64(&msg);
-       st->f_fsid = buffer_get_int(&msg);
-       flag = buffer_get_int(&msg);
-       st->f_namemax = buffer_get_int(&msg);
+       st->f_fsid = buffer_get_int64(&msg);
+       flag = buffer_get_int64(&msg);
+       st->f_namemax = buffer_get_int64(&msg);
 
        st->f_flag = (flag & SSH2_FXE_STATVFS_ST_RDONLY) ? ST_RDONLY : 0;
        st->f_flag |= (flag & SSH2_FXE_STATVFS_ST_NOSUID) ? ST_NOSUID : 0;
@@ -293,7 +293,6 @@ get_decode_statvfs(int fd, struct statvfs *st, u_int expected_id, int quiet)
 
        return 0;
 }
-#endif
 
 struct sftp_conn *
 do_init(int fd_in, int fd_out, u_int transfer_buflen, u_int num_requests)
@@ -327,17 +326,27 @@ do_init(int fd_in, int fd_out, u_int transfer_buflen, u_int num_requests)
        while (buffer_len(&msg) > 0) {
                char *name = buffer_get_string(&msg, NULL);
                char *value = buffer_get_string(&msg, NULL);
+               int known = 0;
 
-               debug2("Init extension: \"%s\"", name);
                if (strcmp(name, "posix-rename@openssh.com") == 0 &&
-                   strcmp(value, "1") == 0)
+                   strcmp(value, "1") == 0) {
                        exts |= SFTP_EXT_POSIX_RENAME;
-               if (strcmp(name, "statvfs@openssh.com") == 0 &&
-                   strcmp(value, "1") == 0)
+                       known = 1;
+               } else if (strcmp(name, "statvfs@openssh.com") == 0 &&
+                   strcmp(value, "2") == 0) {
                        exts |= SFTP_EXT_STATVFS;
-               if (strcmp(name, "fstatvfs@openssh.com") == 0 &&
-                   strcmp(value, "1") == 0)
+                       known = 1;
+               } if (strcmp(name, "fstatvfs@openssh.com") == 0 &&
+                   strcmp(value, "2") == 0) {
                        exts |= SFTP_EXT_FSTATVFS;
+                       known = 1;
+               }
+               if (known) {
+                       debug2("Server supports extension \"%s\" revision %s",
+                           name, value);
+               } else {
+                       debug2("Unrecognised server extension \"%s\"", name);
+               }
                xfree(name);
                xfree(value);
        }
@@ -813,9 +822,8 @@ do_readlink(struct sftp_conn *conn, char *path)
 }
 #endif
 
-#ifdef USE_STATVFS
 int
-do_statvfs(struct sftp_conn *conn, const char *path, struct statvfs *st,
+do_statvfs(struct sftp_conn *conn, const char *path, struct sftp_statvfs *st,
     int quiet)
 {
        Buffer msg;
@@ -839,12 +847,11 @@ do_statvfs(struct sftp_conn *conn, const char *path, struct statvfs *st,
 
        return get_decode_statvfs(conn->fd_in, st, id, quiet);
 }
-#endif
 
 #ifdef notyet
 int
 do_fstatvfs(struct sftp_conn *conn, const char *handle, u_int handle_len,
-    struct statvfs *st, int quiet)
+    struct sftp_statvfs *st, int quiet)
 {
        Buffer msg;
        u_int id;
@@ -913,7 +920,7 @@ do_download(struct sftp_conn *conn, char *remote_path, char *local_path,
        if (a == NULL)
                return(-1);
 
-       /* XXX: should we preserve set[ug]id? */
+       /* Do not preserve set[ug]id here, as we do not preserve ownership */
        if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS)
                mode = a->perm & 0777;
        else
@@ -1216,7 +1223,8 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
                        len = 0;
                else do
                        len = read(local_fd, data, conn->transfer_buflen);
-               while ((len == -1) && (errno == EINTR || errno == EAGAIN));
+               while ((len == -1) &&
+                   (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK));
 
                if (len == -1)
                        fatal("Couldn't read from \"%s\": %s", local_path,
This page took 0.052507 seconds and 4 git commands to generate.