X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fftpgetput.c;h=e866a7754ac72127470358613d37842a21381bdd;hb=9c143ce52da11ec3d21a3491c3749841d3dc10f0;hp=2dd7e92328b0e7a1e1e6455e6b9977216fceb425;hpb=a3aa3e309506ea96fa8f7546f6b22fa85263a934;p=oweals%2Fbusybox.git diff --git a/networking/ftpgetput.c b/networking/ftpgetput.c index 2dd7e9232..e866a7754 100644 --- a/networking/ftpgetput.c +++ b/networking/ftpgetput.c @@ -10,10 +10,52 @@ * Based on wget.c by Chip Rosenthal Covad Communications * * - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * 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] */ -}; -#define G (*(struct globals*)&bb_common_bufsiz1) + char buf[4]; /* actually [BUFSZ] */ +} FIX_ALIASING; +#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); } @@ -151,7 +193,7 @@ TODO2: need to stop ignoring IP address in PASV response. *buf_ptr = '\0'; port_num += xatoul_range(buf_ptr + 1, 0, 255) * 256; - set_nport(lsa, htons(port_num)); + set_nport(&lsa->u.sa, htons(port_num)); return xconnect_stream(lsa); } @@ -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