summaryrefslogtreecommitdiff
path: root/sftp-client.c
diff options
context:
space:
mode:
Diffstat (limited to 'sftp-client.c')
-rw-r--r--sftp-client.c51
1 files changed, 28 insertions, 23 deletions
diff --git a/sftp-client.c b/sftp-client.c
index e8b9007fe..490c00bdd 100644
--- a/sftp-client.c
+++ b/sftp-client.c
@@ -29,7 +29,7 @@
29/* XXX: copy between two remote sites */ 29/* XXX: copy between two remote sites */
30 30
31#include "includes.h" 31#include "includes.h"
32RCSID("$OpenBSD: sftp-client.c,v 1.4 2001/02/06 23:30:28 djm Exp $"); 32RCSID("$OpenBSD: sftp-client.c,v 1.8 2001/02/08 17:11:23 stevesk Exp $");
33 33
34#include "ssh.h" 34#include "ssh.h"
35#include "buffer.h" 35#include "buffer.h"
@@ -338,7 +338,9 @@ do_ls(int fd_in, int fd_out, char *path)
338 SSH2_FXP_NAME, type); 338 SSH2_FXP_NAME, type);
339 339
340 count = buffer_get_int(&msg); 340 count = buffer_get_int(&msg);
341 debug3("Received %i SSH2_FXP_NAME responses", count); 341 if (count == 0)
342 break;
343 debug3("Received %d SSH2_FXP_NAME responses", count);
342 for(i = 0; i < count; i++) { 344 for(i = 0; i < count; i++) {
343 char *filename, *longname; 345 char *filename, *longname;
344 Attrib *a; 346 Attrib *a;
@@ -556,6 +558,7 @@ do_download(int fd_in, int fd_out, char *remote_path, char *local_path,
556 char *handle; 558 char *handle;
557 Buffer msg; 559 Buffer msg;
558 Attrib junk, *a; 560 Attrib junk, *a;
561 int status;
559 562
560 a = do_stat(fd_in, fd_out, remote_path); 563 a = do_stat(fd_in, fd_out, remote_path);
561 if (a == NULL) 564 if (a == NULL)
@@ -635,7 +638,7 @@ do_download(int fd_in, int fd_out, char *remote_path, char *local_path,
635 if (id != expected_id) 638 if (id != expected_id)
636 fatal("ID mismatch (%d != %d)", id, expected_id); 639 fatal("ID mismatch (%d != %d)", id, expected_id);
637 if (type == SSH2_FXP_STATUS) { 640 if (type == SSH2_FXP_STATUS) {
638 int status = buffer_get_int(&msg); 641 status = buffer_get_int(&msg);
639 642
640 if (status == SSH2_FX_EOF) 643 if (status == SSH2_FX_EOF)
641 break; 644 break;
@@ -644,10 +647,7 @@ do_download(int fd_in, int fd_out, char *remote_path, char *local_path,
644 "file \"%s\" : %s", remote_path, 647 "file \"%s\" : %s", remote_path,
645 fx2txt(status)); 648 fx2txt(status));
646 do_close(fd_in, fd_out, handle, handle_len); 649 do_close(fd_in, fd_out, handle, handle_len);
647 xfree(handle); 650 goto done;
648 close(local_fd);
649 buffer_free(&msg);
650 return(status);
651 } 651 }
652 } else if (type != SSH2_FXP_DATA) { 652 } else if (type != SSH2_FXP_DATA) {
653 fatal("Expected SSH2_FXP_DATA(%d) packet, got %d", 653 fatal("Expected SSH2_FXP_DATA(%d) packet, got %d",
@@ -659,27 +659,27 @@ do_download(int fd_in, int fd_out, char *remote_path, char *local_path,
659 fatal("Received more data than asked for %d > %d", 659 fatal("Received more data than asked for %d > %d",
660 len, COPY_SIZE); 660 len, COPY_SIZE);
661 661
662 debug3("In read loop, got %d offset %lld", len, 662 debug3("In read loop, got %d offset %llu", len,
663 (unsigned long long)offset); 663 (unsigned long long)offset);
664 if (atomicio(write, local_fd, data, len) != len) { 664 if (atomicio(write, local_fd, data, len) != len) {
665 error("Couldn't write to \"%s\": %s", local_path, 665 error("Couldn't write to \"%s\": %s", local_path,
666 strerror(errno)); 666 strerror(errno));
667 do_close(fd_in, fd_out, handle, handle_len); 667 do_close(fd_in, fd_out, handle, handle_len);
668 xfree(handle); 668 status = -1;
669 close(local_fd);
670 xfree(data); 669 xfree(data);
671 buffer_free(&msg); 670 goto done;
672 return(-1);
673 } 671 }
674 672
675 offset += len; 673 offset += len;
676 xfree(data); 674 xfree(data);
677 } 675 }
678 xfree(handle); 676 status = do_close(fd_in, fd_out, handle, handle_len);
679 buffer_free(&msg);
680 close(local_fd);
681 677
682 return(do_close(fd_in, fd_out, handle, handle_len)); 678done:
679 close(local_fd);
680 buffer_free(&msg);
681 xfree(handle);
682 return status;
683} 683}
684 684
685int 685int
@@ -693,6 +693,7 @@ do_upload(int fd_in, int fd_out, char *local_path, char *remote_path,
693 Buffer msg; 693 Buffer msg;
694 struct stat sb; 694 struct stat sb;
695 Attrib a; 695 Attrib a;
696 int status;
696 697
697 if ((local_fd = open(local_path, O_RDONLY, 0)) == -1) { 698 if ((local_fd = open(local_path, O_RDONLY, 0)) == -1) {
698 error("Couldn't open local file \"%s\" for reading: %s", 699 error("Couldn't open local file \"%s\" for reading: %s",
@@ -743,7 +744,6 @@ do_upload(int fd_in, int fd_out, char *local_path, char *remote_path,
743 for(;;) { 744 for(;;) {
744 int len; 745 int len;
745 char data[COPY_SIZE]; 746 char data[COPY_SIZE];
746 u_int status;
747 747
748 /* 748 /*
749 * Can't use atomicio here because it returns 0 on EOF, thus losing 749 * Can't use atomicio here because it returns 0 on EOF, thus losing
@@ -774,24 +774,29 @@ do_upload(int fd_in, int fd_out, char *local_path, char *remote_path,
774 error("Couldn't write to remote file \"%s\": %s", 774 error("Couldn't write to remote file \"%s\": %s",
775 remote_path, fx2txt(status)); 775 remote_path, fx2txt(status));
776 do_close(fd_in, fd_out, handle, handle_len); 776 do_close(fd_in, fd_out, handle, handle_len);
777 xfree(handle);
778 close(local_fd); 777 close(local_fd);
779 return(-1); 778 goto done;
780 } 779 }
781 debug3("In write loop, got %d offset %llu", len, 780 debug3("In write loop, got %d offset %llu", len,
782 (unsigned long long)offset); 781 (unsigned long long)offset);
783 782
784 offset += len; 783 offset += len;
785 } 784 }
786 xfree(handle);
787 buffer_free(&msg);
788 785
789 if (close(local_fd) == -1) { 786 if (close(local_fd) == -1) {
790 error("Couldn't close local file \"%s\": %s", local_path, 787 error("Couldn't close local file \"%s\": %s", local_path,
791 strerror(errno)); 788 strerror(errno));
792 do_close(fd_in, fd_out, handle, handle_len); 789 do_close(fd_in, fd_out, handle, handle_len);
793 return(-1); 790 status = -1;
791 goto done;
794 } 792 }
795 793
796 return(do_close(fd_in, fd_out, handle, handle_len)); 794 status = do_close(fd_in, fd_out, handle, handle_len);
795
796done:
797 xfree(handle);
798 buffer_free(&msg);
799 return status;
797} 800}
801
802