Fix possible bug if file length not known
authorGlenn L McGrath <bug1@ihug.co.nz>
Fri, 13 Dec 2002 04:14:36 +0000 (04:14 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Fri, 13 Dec 2002 04:14:36 +0000 (04:14 -0000)
networking/ftpgetput.c

index 4cebbc71c3c9e530bc5b923fedb003538c837e10..cad34073856eb8201e8baa2534fa8c8e90614be8 100644 (file)
@@ -56,14 +56,20 @@ typedef struct ftp_host_info_s {
 static char verbose_flag;
 static char do_continue = 0;
 
-/* If chunksize == 0 read till end of file */
-static int copyfd_chunk(int fd1, int fd2, off_t chunksize)
+static int copyfd_chunk(int fd1, int fd2, const off_t chunksize)
 {
        size_t nread;
        size_t nwritten;
        size_t size;
+       size_t remaining;
        char buffer[BUFSIZ];
 
+       if (chunksize) {
+               remaining = chunksize;
+       } else {
+               remaining = -1;
+       }
+
        do {
                if ((chunksize > BUFSIZ) || (chunksize == 0)) {
                        size = BUFSIZ;
@@ -73,7 +79,7 @@ static int copyfd_chunk(int fd1, int fd2, off_t chunksize)
 
                nread = safe_read(fd1, buffer, size);
 
-               if (nread < 0) {
+               if (nread <= 0) {
                        if (chunksize) {
                                perror_msg_and_die("read error");
                        } else {
@@ -88,10 +94,9 @@ static int copyfd_chunk(int fd1, int fd2, off_t chunksize)
                }
 
                if (chunksize) {
-                       chunksize -= nwritten;
+                       remaining -= nwritten;
                }
-
-       } while (chunksize);
+       } while (remaining != 0);
 
        return 0;
 }