There are a number of reasons for reinventing printf(). Writing status to
[oweals/busybox.git] / networking / ftpgetput.c
index f6bd82bc85ea68e38742c40e394a977993045efb..453cce571364d4ff2a64fe4c6917d9cc63c1f522 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>
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/stat.h>
-
-#include <ctype.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <getopt.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-
-#include <netinet/in.h>
-#include <netdb.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-
 #include "busybox.h"
+#include <getopt.h>
 
 typedef struct ftp_host_info_s {
        char *user;
@@ -65,9 +33,9 @@ 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 {
@@ -135,8 +103,10 @@ static FILE *ftp_login(ftp_host_info_t *server)
        return(control_stream);
 }
 
-#ifdef CONFIG_FTPGET
-static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
+#if !ENABLE_FTPGET
+#define ftp_receive 0
+#else
+static int ftp_receive(ftp_host_info_t *server, FILE *control_stream,
                const char *local_path, char *server_path)
 {
        char buf[512];
@@ -156,6 +126,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')) {
@@ -191,15 +164,19 @@ static int ftp_recieve(ftp_host_info_t *server, FILE *control_stream,
        /* only make a local file if we know that one exists on the remote server */
        if (fd_local == -1) {
                if (do_continue) {
-                       fd_local = bb_xopen(local_path, O_APPEND | O_WRONLY);
+                       fd_local = xopen(local_path, O_APPEND | O_WRONLY);
                } else {
-                       fd_local = bb_xopen(local_path, O_CREAT | O_TRUNC | O_WRONLY);
+                       fd_local = xopen3(local_path, O_CREAT | O_TRUNC | O_WRONLY, 0777);
                }
        }
 
        /* 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 */
@@ -213,7 +190,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)
 {
@@ -229,15 +208,11 @@ 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;
        } else {
-               fd_local = bb_xopen(local_path, O_RDONLY);
+               fd_local = xopen(local_path, O_RDONLY);
                fstat(fd_local, &sbuf);
 
                sprintf(buf, "ALLO %lu", (unsigned long)sbuf.st_size);
@@ -252,7 +227,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:
@@ -284,6 +259,7 @@ static int ftp_send(ftp_host_info_t *server, FILE *control_stream,
 #define FTPGETPUT_OPT_PASSWORD 8
 #define FTPGETPUT_OPT_PORT     16
 
+#if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS
 static const struct option ftpgetput_long_options[] = {
        {"continue", 1, NULL, 'c'},
        {"verbose", 0, NULL, 'v'},
@@ -292,6 +268,9 @@ static const struct option ftpgetput_long_options[] = {
        {"port", 1, NULL, 'P'},
        {0, 0, 0, 0}
 };
+#else
+#define ftpgetput_long_options 0
+#endif
 
 int ftpgetput_main(int argc, char **argv)
 {
@@ -309,24 +288,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') {
-               ftp_action = ftp_recieve;
+       if (ENABLE_FTPGET && (!ENABLE_FTPPUT || bb_applet_name[3] == 'g')) {
+               ftp_action = ftp_receive;
        }
-# else
-       ftp_action = ftp_recieve;
-# endif
-#endif
 
        /* Set default values */
        server = xmalloc(sizeof(ftp_host_info_t));
@@ -337,7 +304,9 @@ int ftpgetput_main(int argc, char **argv)
        /*
         * Decipher the command line
         */
-       bb_applet_long_options = ftpgetput_long_options;
+       if (ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS)
+               bb_applet_long_options = ftpgetput_long_options;
+
        opt = bb_getopt_ulflags(argc, argv, "cvu:p:P:", &server->user, &server->password, &port);
 
        /* Process the non-option command line arguments */
@@ -368,11 +337,3 @@ int ftpgetput_main(int argc, char **argv)
 
        return(ftp_action(server, control_stream, argv[optind + 1], argv[optind + 2]));
 }
-
-/*
-Local Variables:
-c-file-style: "linux"
-c-basic-offset: 4
-tab-width: 4
-End:
-*/