[PATCH] wget: new option FEATURE_WGET_FTP to enable/disable FTP

Denys Vlasenko vda.linux at googlemail.com
Tue Mar 9 16:46:54 UTC 2021


Applied, except for

-       h->protocol = P_FTP;
+       h->protocol = NULL;

bit (->protocol[0] must exist).

On Sun, Jan 17, 2021 at 7:35 PM Sergey Ponomarev <stokito at gmail.com> wrote:
>
> Introduce a separate option FTPS_SUPPORTED instead of not obvious ENABLE_FEATURE_WGET_HTTPS.
>
> function                                             old     new   delta
> P_FTP                                                  4       -      -4
> P_FTPS                                                 5       -      -5
> reset_beg_range_to_zero                               41       -     -41
> parse_url                                            431     366     -65
> parse_pasv_epsv                                      154       -    -154
> .rodata                                           115566  115408    -158
> ftpcmd                                               204       -    -204
> spawn_ssl_client                                     291       -    -291
> wget_main                                           2998    2664    -334
> ------------------------------------------------------------------------------
> (add/remove: 0/7 grow/shrink: 0/3 up/down: 0/-1256)         Total: -1256 bytes
>
> Signed-off-by: Sergey Ponomarev <stokito at gmail.com>
> ---
>  networking/wget.c | 43 ++++++++++++++++++++++++++++++++-----------
>  1 file changed, 32 insertions(+), 11 deletions(-)
>
> diff --git a/networking/wget.c b/networking/wget.c
> index e660c279c..51cac1f90 100644
> --- a/networking/wget.c
> +++ b/networking/wget.c
> @@ -25,6 +25,13 @@
>  //config:      default y
>  //config:      depends on WGET
>  //config:
> +//config:config FEATURE_WGET_FTP
> +//config:      bool "Enable FTP protocol (+1k)"
> +//config:      default y
> +//config:      depends on WGET
> +//config:      help
> +//config:      For support FTPS enable FEATURE_WGET_HTTPS
> +//config:
>  //config:config FEATURE_WGET_AUTHENTICATION
>  //config:      bool "Enable HTTP authentication"
>  //config:      default y
> @@ -48,12 +55,12 @@
>  //config:
>  //config:config FEATURE_WGET_HTTPS
>  //config:      bool "Support HTTPS using internal TLS code"
> -//it also enables FTPS support, but it's not well tested yet
>  //config:      default y
>  //config:      depends on WGET
>  //config:      select TLS
>  //config:      help
>  //config:      wget will use internal TLS code to connect to https:// URLs.
> +//config:      It also enables FTPS support, but it's not well tested yet.
>  //config:      Note:
>  //config:      On NOMMU machines, ssl_helper applet should be available
>  //config:      in the $PATH for this to work. Make sure to select that applet.
> @@ -173,6 +180,7 @@
>
>
>  #define SSL_SUPPORTED (ENABLE_FEATURE_WGET_OPENSSL || ENABLE_FEATURE_WGET_HTTPS)
> +#define FTPS_SUPPORTED (ENABLE_FEATURE_WGET_FTP && ENABLE_FEATURE_WGET_HTTPS)
>
>  struct host_info {
>         char *allocated;
> @@ -182,14 +190,16 @@ struct host_info {
>         char       *host;
>         int         port;
>  };
> -static const char P_FTP[] ALIGN1 = "ftp";
>  static const char P_HTTP[] ALIGN1 = "http";
>  #if SSL_SUPPORTED
> -# if ENABLE_FEATURE_WGET_HTTPS
> -static const char P_FTPS[] ALIGN1 = "ftps";
> -# endif
>  static const char P_HTTPS[] ALIGN1 = "https";
>  #endif
> +#if ENABLE_FEATURE_WGET_FTP
> +static const char P_FTP[] ALIGN1 = "ftp";
> +#endif
> +#if FTPS_SUPPORTED
> +static const char P_FTPS[] ALIGN1 = "ftps";
> +#endif
>
>  #if ENABLE_FEATURE_WGET_LONG_OPTIONS
>  /* User-specified headers prevent using our corresponding built-in headers.  */
> @@ -482,6 +492,7 @@ static char fgets_trim_sanitize(FILE *fp, const char *fmt)
>         return c;
>  }
>
> +#if ENABLE_FEATURE_WGET_FTP
>  static int ftpcmd(const char *s1, const char *s2, FILE *fp)
>  {
>         int result;
> @@ -507,6 +518,7 @@ static int ftpcmd(const char *s1, const char *s2, FILE *fp)
>         G.wget_buf[3] = ' ';
>         return result;
>  }
> +#endif
>
>  static void parse_url(const char *src_url, struct host_info *h)
>  {
> @@ -515,21 +527,24 @@ static void parse_url(const char *src_url, struct host_info *h)
>         free(h->allocated);
>         h->allocated = url = xstrdup(src_url);
>
> -       h->protocol = P_FTP;
> +       h->protocol = NULL;
>         p = strstr(url, "://");
>         if (p) {
>                 *p = '\0';
>                 h->host = p + 3;
> +#if ENABLE_FEATURE_WGET_FTP
>                 if (strcmp(url, P_FTP) == 0) {
>                         h->port = bb_lookup_std_port(P_FTP, "tcp", 21);
> +                       h->protocol = P_FTP;
>                 } else
> -#if SSL_SUPPORTED
> -# if ENABLE_FEATURE_WGET_HTTPS
> +#endif
> +#if FTPS_SUPPORTED
>                 if (strcmp(url, P_FTPS) == 0) {
>                         h->port = bb_lookup_std_port(P_FTPS, "tcp", 990);
>                         h->protocol = P_FTPS;
>                 } else
> -# endif
> +#endif
> +#if SSL_SUPPORTED
>                 if (strcmp(url, P_HTTPS) == 0) {
>                         h->port = bb_lookup_std_port(P_HTTPS, "tcp", 443);
>                         h->protocol = P_HTTPS;
> @@ -796,6 +811,7 @@ static void spawn_ssl_client(const char *host, int network_fd, int flags)
>  }
>  #endif
>
> +#if ENABLE_FEATURE_WGET_FTP
>  static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_sockaddr *lsa)
>  {
>         FILE *sfp;
> @@ -803,7 +819,7 @@ static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_
>         int port;
>
>         sfp = open_socket(lsa);
> -#if ENABLE_FEATURE_WGET_HTTPS
> +#if FTPS_SUPPORTED
>         if (target->protocol == P_FTPS)
>                 spawn_ssl_client(target->host, fileno(sfp), TLSLOOP_EXIT_ON_LOCAL_EOF);
>  #endif
> @@ -859,7 +875,7 @@ static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_
>
>         *dfpp = open_socket(lsa);
>
> -#if ENABLE_FEATURE_WGET_HTTPS
> +#if FTPS_SUPPORTED
>         if (target->protocol == P_FTPS) {
>                 /* "PROT P" enables encryption of data stream.
>                  * Without it (or with "PROT C"), data is sent unencrypted.
> @@ -885,6 +901,7 @@ static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_
>
>         return sfp;
>  }
> +#endif
>
>  static void NOINLINE retrieve_file_data(FILE *dfp)
>  {
> @@ -1407,10 +1424,12 @@ However, in real world it was observed that some web servers
>                 /* For HTTP, data is pumped over the same connection */
>                 dfp = sfp;
>         } else {
> +#if ENABLE_FEATURE_WGET_FTP
>                 /*
>                  *  FTP session
>                  */
>                 sfp = prepare_ftp_session(&dfp, &target, lsa);
> +#endif
>         }
>
>         free(lsa);
> @@ -1428,6 +1447,7 @@ However, in real world it was observed that some web servers
>                         fprintf(stderr, "remote file exists\n");
>         }
>
> +#if ENABLE_FEATURE_WGET_FTP
>         if (dfp != sfp) {
>                 /* It's ftp. Close data connection properly */
>                 fclose(dfp);
> @@ -1435,6 +1455,7 @@ However, in real world it was observed that some web servers
>                         bb_error_msg_and_die("ftp error: %s", G.wget_buf);
>                 /* ftpcmd("QUIT", NULL, sfp); - why bother? */
>         }
> +#endif
>         fclose(sfp);
>
>         free(server.allocated);
> --
> 2.27.0
>
> _______________________________________________
> busybox mailing list
> busybox at busybox.net
> http://lists.busybox.net/mailman/listinfo/busybox


More information about the busybox mailing list