ash: retain envvars with bad names in initial environment. Closes 10231
[oweals/busybox.git] / networking / ftpgetput.c
index 09c5ff30faa5222bb360bc8f152a2a0107e0f2c4..e866a7754ac72127470358613d37842a21381bdd 100644 (file)
  *
  * Licensed under GPLv2 or later, see file LICENSE in this source tree.
  */
+//config:config FTPGET
+//config:      bool "ftpget (8 kb)"
+//config:      default y
+//config:      help
+//config:      Retrieve a remote file via FTP.
+//config:
+//config:config FTPPUT
+//config:      bool "ftpput (7.7 kb)"
+//config:      default y
+//config:      help
+//config:      Store a remote file via FTP.
+//config:
+//config:config FEATURE_FTPGETPUT_LONG_OPTIONS
+//config:      bool "Enable long options in ftpget/ftpput"
+//config:      default y
+//config:      depends on LONG_OPTS && (FTPGET || FTPPUT)
+
+//applet:IF_FTPGET(APPLET_ODDNAME(ftpget, ftpgetput, BB_DIR_USR_BIN, BB_SUID_DROP, ftpget))
+//applet:IF_FTPPUT(APPLET_ODDNAME(ftpput, ftpgetput, BB_DIR_USR_BIN, BB_SUID_DROP, ftpput))
+
+//kbuild:lib-$(CONFIG_FTPGET) += ftpgetput.o
+//kbuild:lib-$(CONFIG_FTPPUT) += ftpgetput.o
+
+//usage:#define ftpget_trivial_usage
+//usage:       "[OPTIONS] HOST [LOCAL_FILE] REMOTE_FILE"
+//usage:#define ftpget_full_usage "\n\n"
+//usage:       "Download a file via FTP\n"
+//usage:     "\n       -c      Continue previous transfer"
+//usage:     "\n       -v      Verbose"
+//usage:     "\n       -u USER Username"
+//usage:     "\n       -p PASS Password"
+//usage:     "\n       -P NUM  Port"
+//usage:
+//usage:#define ftpput_trivial_usage
+//usage:       "[OPTIONS] HOST [REMOTE_FILE] LOCAL_FILE"
+//usage:#define ftpput_full_usage "\n\n"
+//usage:       "Upload a file to a FTP server\n"
+//usage:     "\n       -v      Verbose"
+//usage:     "\n       -u USER Username"
+//usage:     "\n       -p PASS Password"
+//usage:     "\n       -P NUM  Port number"
 
 #include "libbb.h"
+#include "common_bufsiz.h"
 
 struct globals {
        const char *user;
@@ -22,13 +64,10 @@ struct globals {
        FILE *control_stream;
        int verbose_flag;
        int do_continue;
-       char buf[1]; /* actually [BUFSZ] */
+       char buf[4]; /* actually [BUFSZ] */
 } FIX_ALIASING;
-#define G (*(struct globals*)&bb_common_bufsiz1)
+#define G (*(struct globals*)bb_common_bufsiz1)
 enum { BUFSZ = COMMON_BUFSIZE - offsetof(struct globals, buf) };
-struct BUG_G_too_big {
-       char BUG_G_too_big[sizeof(G) <= COMMON_BUFSIZE ? 1 : -1];
-};
 #define user           (G.user          )
 #define password       (G.password      )
 #define lsa            (G.lsa           )
@@ -36,7 +75,10 @@ struct BUG_G_too_big {
 #define verbose_flag   (G.verbose_flag  )
 #define do_continue    (G.do_continue   )
 #define buf            (G.buf           )
-#define INIT_G() do { } while (0)
+#define INIT_G() do { \
+       setup_common_bufsiz(); \
+       BUILD_BUG_ON(sizeof(G) > COMMON_BUFSIZE); \
+} while (0)
 
 
 static void ftp_die(const char *msg) NORETURN;
@@ -67,7 +109,7 @@ static int ftpcmd(const char *s1, const char *s2)
        }
 
        do {
-               strcpy(buf, "EOF");
+               strcpy(buf, "EOF"); /* for ftp_die */
                if (fgets(buf, BUFSZ - 2, control_stream) == NULL) {
                        ftp_die(NULL);
                }
@@ -278,7 +320,6 @@ static const char ftpgetput_longopts[] ALIGN1 =
 int ftpgetput_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int ftpgetput_main(int argc UNUSED_PARAM, char **argv)
 {
-       unsigned opt;
        const char *port = "ftp";
        /* socket to ftp server */
 
@@ -303,12 +344,15 @@ int ftpgetput_main(int argc UNUSED_PARAM, char **argv)
        /*
         * Decipher the command line
         */
+       /* must have 2 to 3 params; -v and -c count */
+#define OPTSTRING "^cvu:p:P:" "\0" "-2:?3:vv:cc"
 #if ENABLE_FEATURE_FTPGETPUT_LONG_OPTIONS
-       applet_long_options = ftpgetput_longopts;
+       getopt32long(argv, OPTSTRING, ftpgetput_longopts,
+#else
+       getopt32(argv, OPTSTRING,
 #endif
-       opt_complementary = "-2:vv:cc"; /* must have 2 to 3 params; -v and -c count */
-       opt = getopt32(argv, "cvu:p:P:", &user, &password, &port,
-                                       &verbose_flag, &do_continue);
+                       &user, &password, &port, &verbose_flag, &do_continue
+       );
        argv += optind;
 
        /* We want to do exactly _one_ DNS lookup, since some