X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/4f36159abbe62ef300c709b190691f998f75ee04..bc9a470b2b90552bce6faf239d79227fc30ad5aa:/sftp-client.c diff --git a/sftp-client.c b/sftp-client.c index 512a8ad4..5e39aa7d 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.83 2008/06/07 21:52:46 djm Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.86 2008/06/26 06:10:09 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -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,8 +274,8 @@ 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); @@ -283,8 +283,8 @@ get_decode_statvfs(int fd, struct statvfs *st, u_int expected_id, int quiet) st->f_ffree = buffer_get_int64(&msg); st->f_favail = buffer_get_int64(&msg); st->f_fsid = buffer_get_int64(&msg); - flag = buffer_get_int(&msg); - st->f_namemax = buffer_get_int(&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, "2") == 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, "2") == 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,