- single KERNEL_VERSION(a,b,c) macro in platform.h
[oweals/busybox.git] / networking / ftpgetput.c
index 2ef0b2c44f192c2d38347eff48e06cbc6588f238..f285e8b31889634c3bfea379a708cee9689cb306 100644 (file)
  * Based on wget.c by Chip Rosenthal Covad Communications
  * <chip@laserlink.net>
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
+ * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
 #include <sys/types.h>
@@ -65,16 +52,21 @@ static int ftpcmd(const char *s1, const char *s2, FILE *stream, char *buf)
 
        if (s1) {
                if (s2) {
-                       fprintf(stream, "%s%s\n", s1, s2);
+                       fprintf(stream, "%s%s\r\n", s1, s2);
                } else {
-                       fprintf(stream, "%s\n", s1);
+                       fprintf(stream, "%s\r\n", s1);
                }
        }
-
        do {
+               char *buf_ptr;
+
                if (fgets(buf, 510, stream) == NULL) {
                        bb_perror_msg_and_die("fgets()");
                }
+               buf_ptr = strstr(buf, "\r\n");
+               if (buf_ptr) {
+                       *buf_ptr = '\0';
+               }
        } while (! isdigit(buf[0]) || buf[3] != ' ');
 
        return atoi(buf);
@@ -130,7 +122,9 @@ static FILE *ftp_login(ftp_host_info_t *server)
        return(control_stream);
 }
 
-#ifdef CONFIG_FTPGET
+#if !ENABLE_FTPGET
+#define ftp_receive 0
+#else
 static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
                const char *local_path, char *server_path)
 {
@@ -151,6 +145,9 @@ static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
                if (safe_strtoul(buf + 4, &value))
                        bb_error_msg_and_die("SIZE error: %s", buf + 4);
                filesize = value;
+       } else {
+               filesize = -1;
+               do_continue = 0;
        }
 
        if ((local_path[0] == '-') && (local_path[1] == '\0')) {
@@ -193,8 +190,12 @@ static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
        }
 
        /* Copy the file */
-       if (bb_copyfd_size(fd_data, fd_local, filesize) == -1) {
-               exit(EXIT_FAILURE);
+       if (filesize != -1) {
+               if (-1 == bb_copyfd_size(fd_data, fd_local, filesize))
+                       exit(EXIT_FAILURE);
+       } else {
+               if (-1 == bb_copyfd_eof(fd_data, fd_local))
+                       exit(EXIT_FAILURE);
        }
 
        /* close it all down */
@@ -208,7 +209,9 @@ static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
 }
 #endif
 
-#ifdef CONFIG_FTPPUT
+#if !ENABLE_FTPPUT
+#define ftp_send 0
+#else
 static int ftp_send(ftp_host_info_t *server, FILE *control_stream,
                const char *server_path, char *local_path)
 {
@@ -224,10 +227,6 @@ static int ftp_send(ftp_host_info_t *server, FILE *control_stream,
        }
        fd_data = xconnect_ftpdata(server, buf);
 
-       if (ftpcmd("CWD ", server_path, control_stream, buf) != 250) {
-               bb_error_msg_and_die("CWD error: %s", buf + 4);
-       }
-
        /* get the local file */
        if ((local_path[0] == '-') && (local_path[1] == '\0')) {
                fd_local = STDIN_FILENO;
@@ -247,7 +246,7 @@ static int ftp_send(ftp_host_info_t *server, FILE *control_stream,
                        break;
                }
        }
-       response = ftpcmd("STOR ", local_path, control_stream, buf);
+       response = ftpcmd("STOR ", server_path, control_stream, buf);
        switch (response) {
        case 125:
        case 150:
@@ -304,24 +303,12 @@ int ftpgetput_main(int argc, char **argv)
        int (*ftp_action)(ftp_host_info_t *, FILE *, const char *, char *) = NULL;
 
        /* Check to see if the command is ftpget or ftput */
-#ifdef CONFIG_FTPPUT
-# ifdef CONFIG_FTPGET
-       if (bb_applet_name[3] == 'p') {
+       if (ENABLE_FTPPUT && (!ENABLE_FTPGET || bb_applet_name[3] == 'p')) {
                ftp_action = ftp_send;
        }
-# else
-       ftp_action = ftp_send;
-# endif
-#endif
-#ifdef CONFIG_FTPGET
-# ifdef CONFIG_FTPPUT
-       if (bb_applet_name[3] == 'g') {
+       if (ENABLE_FTPGET && (!ENABLE_FTPPUT || bb_applet_name[3] == 'g')) {
                ftp_action = ftp_recieve;
        }
-# else
-       ftp_action = ftp_recieve;
-# endif
-#endif
 
        /* Set default values */
        server = xmalloc(sizeof(ftp_host_info_t));