diff options
Diffstat (limited to 'sftp-client.c')
-rw-r--r-- | sftp-client.c | 51 |
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" |
32 | RCSID("$OpenBSD: sftp-client.c,v 1.4 2001/02/06 23:30:28 djm Exp $"); | 32 | RCSID("$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)); | 678 | done: |
679 | close(local_fd); | ||
680 | buffer_free(&msg); | ||
681 | xfree(handle); | ||
682 | return status; | ||
683 | } | 683 | } |
684 | 684 | ||
685 | int | 685 | int |
@@ -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 | |||
796 | done: | ||
797 | xfree(handle); | ||
798 | buffer_free(&msg); | ||
799 | return status; | ||
797 | } | 800 | } |
801 | |||
802 | |||