]> andersk Git - openssh.git/blobdiff - sftp-client.c
- stevesk@cvs.openbsd.org 2006/07/22 19:08:54
[openssh.git] / sftp-client.c
index ce15fc0a36e933c34add59237de9be3bc43b2d16..5ba4f0a9f44f8d978bcb4625fd8aeae7780f5f88 100644 (file)
@@ -1,3 +1,4 @@
+/* $OpenBSD: sftp-client.c,v 1.68 2006/07/17 01:31:09 stevesk Exp $ */
 /*
  * Copyright (c) 2001-2004 Damien Miller <djm@openbsd.org>
  *
 /* XXX: copy between two remote sites */
 
 #include "includes.h"
-RCSID("$OpenBSD: sftp-client.c,v 1.55 2005/06/17 02:44:33 djm Exp $");
+
+#include <sys/types.h>
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <unistd.h>
 
 #include "openbsd-compat/sys-queue.h"
 
 #include "buffer.h"
 #include "bufaux.h"
-#include "getput.h"
 #include "xmalloc.h"
 #include "log.h"
 #include "atomicio.h"
 #include "progressmeter.h"
+#include "misc.h"
 
 #include "sftp.h"
 #include "sftp-common.h"
@@ -39,12 +49,9 @@ RCSID("$OpenBSD: sftp-client.c,v 1.55 2005/06/17 02:44:33 djm Exp $");
 extern volatile sig_atomic_t interrupted;
 extern int showprogress;
 
-/* Minimum amount of data to read at at time */
+/* Minimum amount of data to read at a time */
 #define MIN_READ_SIZE  512
 
-/* Maximum packet size */
-#define MAX_MSG_LENGTH (256 * 1024)
-
 struct sftp_conn {
        int fd_in;
        int fd_out;
@@ -58,16 +65,19 @@ static void
 send_msg(int fd, Buffer *m)
 {
        u_char mlen[4];
+       struct iovec iov[2];
 
-       if (buffer_len(m) > MAX_MSG_LENGTH)
+       if (buffer_len(m) > SFTP_MAX_MSG_LENGTH)
                fatal("Outbound message too long %u", buffer_len(m));
 
        /* Send length first */
-       PUT_32BIT(mlen, buffer_len(m));
-       if (atomicio(vwrite, fd, mlen, sizeof(mlen)) != sizeof(mlen))
-               fatal("Couldn't send packet: %s", strerror(errno));
-
-       if (atomicio(vwrite, fd, buffer_ptr(m), buffer_len(m)) != buffer_len(m))
+       put_u32(mlen, buffer_len(m));
+       iov[0].iov_base = mlen;
+       iov[0].iov_len = sizeof(mlen);
+       iov[1].iov_base = buffer_ptr(m);
+       iov[1].iov_len = buffer_len(m);
+       
+       if (atomiciov(writev, fd, iov, 2) != buffer_len(m) + sizeof(mlen))
                fatal("Couldn't send packet: %s", strerror(errno));
 
        buffer_clear(m);
@@ -87,7 +97,7 @@ get_msg(int fd, Buffer *m)
        }
 
        msg_len = buffer_get_int(m);
-       if (msg_len > MAX_MSG_LENGTH)
+       if (msg_len > SFTP_MAX_MSG_LENGTH)
                fatal("Received message too long %u", msg_len);
 
        buffer_append_space(m, msg_len);
@@ -391,8 +401,7 @@ do_lsreaddir(struct sftp_conn *conn, char *path, int printflag,
                                printf("%s\n", longname);
 
                        if (dir) {
-                               *dir = xrealloc(*dir, sizeof(**dir) *
-                                   (ents + 2));
+                               *dir = xrealloc(*dir, ents + 2, sizeof(**dir));
                                (*dir)[ents] = xmalloc(sizeof(***dir));
                                (*dir)[ents]->filename = xstrdup(filename);
                                (*dir)[ents]->longname = xstrdup(longname);
@@ -742,7 +751,7 @@ do_download(struct sftp_conn *conn, char *remote_path, char *local_path,
        Attrib junk, *a;
        Buffer msg;
        char *handle;
-       int local_fd, status, write_error;
+       int local_fd, status = 0, write_error;
        int read_error, write_errno;
        u_int64_t offset, size;
        u_int handle_len, mode, type, id, buflen, num_req, max_req;
@@ -1126,7 +1135,7 @@ do_upload(struct sftp_conn *conn, char *local_path, char *remote_path,
                                goto done;
                        }
                        debug3("In write loop, ack for %u %u bytes at %llu",
-                          ack->id, ack->len, (unsigned long long)ack->offset);
+                           ack->id, ack->len, (unsigned long long)ack->offset);
                        ++ackid;
                        xfree(ack);
                }
This page took 0.037198 seconds and 4 git commands to generate.