summaryrefslogtreecommitdiff
path: root/networking/wget.c
diff options
context:
space:
mode:
authorJames Byrne <james.byrne@origamienergy.com>2019-07-02 11:35:03 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2019-07-02 11:35:03 +0200
commit6937487be73cd4563b876413277a295a5fe2f32c (patch)
treef16cc9999a7c827891e6ec8d99c699fc791008ee /networking/wget.c
parentcaecfdc20d450686cd1f7e9b5f650322f894b3c2 (diff)
downloadbusybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.gz
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.tar.bz2
busybox-w32-6937487be73cd4563b876413277a295a5fe2f32c.zip
libbb: reduce the overhead of single parameter bb_error_msg() calls
Back in 2007, commit 0c97c9d43707 ("'simple' error message functions by Loic Grenie") introduced bb_simple_perror_msg() to allow for a lower overhead call to bb_perror_msg() when only a string was being printed with no parameters. This saves space for some CPU architectures because it avoids the overhead of a call to a variadic function. However there has never been a simple version of bb_error_msg(), and since 2007 many new calls to bb_perror_msg() have been added that only take a single parameter and so could have been using bb_simple_perror_message(). This changeset introduces 'simple' versions of bb_info_msg(), bb_error_msg(), bb_error_msg_and_die(), bb_herror_msg() and bb_herror_msg_and_die(), and replaces all calls that only take a single parameter, or use something like ("%s", arg), with calls to the corresponding 'simple' version. Since it is likely that single parameter calls to the variadic functions may be accidentally reintroduced in the future a new debugging config option WARN_SIMPLE_MSG has been introduced. This uses some macro magic which will cause any such calls to generate a warning, but this is turned off by default to avoid use of the unpleasant macros in normal circumstances. This is a large changeset due to the number of calls that have been replaced. The only files that contain changes other than simple substitution of function calls are libbb.h, libbb/herror_msg.c, libbb/verror_msg.c and libbb/xfuncs_printf.c. In miscutils/devfsd.c, networking/udhcp/common.h and util-linux/mdev.c additonal macros have been added for logging so that single parameter and multiple parameter logging variants exist. The amount of space saved varies considerably by architecture, and was found to be as follows (for 'defconfig' using GCC 7.4): Arm: -92 bytes MIPS: -52 bytes PPC: -1836 bytes x86_64: -938 bytes Note that for the MIPS architecture only an exception had to be made disabling the 'simple' calls for 'udhcp' (in networking/udhcp/common.h) because it made these files larger on MIPS. Signed-off-by: James Byrne <james.byrne@origamienergy.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/wget.c')
-rw-r--r--networking/wget.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/networking/wget.c b/networking/wget.c
index b6f9d605a..9e5a40b6f 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -368,7 +368,7 @@ static void alarm_handler(int sig UNUSED_PARAM)
368{ 368{
369 /* This is theoretically unsafe (uses stdio and malloc in signal handler) */ 369 /* This is theoretically unsafe (uses stdio and malloc in signal handler) */
370 if (G.die_if_timed_out) 370 if (G.die_if_timed_out)
371 bb_error_msg_and_die("download timed out"); 371 bb_simple_error_msg_and_die("download timed out");
372} 372}
373static void set_alarm(void) 373static void set_alarm(void)
374{ 374{
@@ -452,7 +452,7 @@ static char fgets_trim_sanitize(FILE *fp, const char *fmt)
452 452
453 set_alarm(); 453 set_alarm();
454 if (fgets(G.wget_buf, sizeof(G.wget_buf), fp) == NULL) 454 if (fgets(G.wget_buf, sizeof(G.wget_buf), fp) == NULL)
455 bb_perror_msg_and_die("error getting response"); 455 bb_simple_perror_msg_and_die("error getting response");
456 clear_alarm(); 456 clear_alarm();
457 457
458 buf_ptr = strchrnul(G.wget_buf, '\n'); 458 buf_ptr = strchrnul(G.wget_buf, '\n');
@@ -633,7 +633,7 @@ static char *get_sanitized_hdr(FILE *fp)
633 633
634static void reset_beg_range_to_zero(void) 634static void reset_beg_range_to_zero(void)
635{ 635{
636 bb_error_msg("restart failed"); 636 bb_simple_error_msg("restart failed");
637 G.beg_range = 0; 637 G.beg_range = 0;
638 xlseek(G.output_fd, 0, SEEK_SET); 638 xlseek(G.output_fd, 0, SEEK_SET);
639 /* Done at the end instead: */ 639 /* Done at the end instead: */
@@ -651,7 +651,7 @@ static int spawn_https_helper_openssl(const char *host, unsigned port)
651 651
652 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0) 652 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0)
653 /* Kernel can have AF_UNIX support disabled */ 653 /* Kernel can have AF_UNIX support disabled */
654 bb_perror_msg_and_die("socketpair"); 654 bb_simple_perror_msg_and_die("socketpair");
655 655
656 if (!strchr(host, ':')) 656 if (!strchr(host, ':'))
657 host = allocated = xasprintf("%s:%u", host, port); 657 host = allocated = xasprintf("%s:%u", host, port);
@@ -724,7 +724,7 @@ static void spawn_ssl_client(const char *host, int network_fd, int flags)
724 724
725 if (!(option_mask32 & WGET_OPT_NO_CHECK_CERT)) { 725 if (!(option_mask32 & WGET_OPT_NO_CHECK_CERT)) {
726 option_mask32 |= WGET_OPT_NO_CHECK_CERT; 726 option_mask32 |= WGET_OPT_NO_CHECK_CERT;
727 bb_error_msg("note: TLS certificate validation not implemented"); 727 bb_simple_error_msg("note: TLS certificate validation not implemented");
728 } 728 }
729 729
730 servername = xstrdup(host); 730 servername = xstrdup(host);
@@ -733,7 +733,7 @@ static void spawn_ssl_client(const char *host, int network_fd, int flags)
733 733
734 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0) 734 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) != 0)
735 /* Kernel can have AF_UNIX support disabled */ 735 /* Kernel can have AF_UNIX support disabled */
736 bb_perror_msg_and_die("socketpair"); 736 bb_simple_perror_msg_and_die("socketpair");
737 737
738 fflush_all(); 738 fflush_all();
739 pid = BB_MMU ? xfork() : xvfork(); 739 pid = BB_MMU ? xfork() : xvfork();
@@ -785,7 +785,7 @@ static FILE* prepare_ftp_session(FILE **dfpp, struct host_info *target, len_and_
785#endif 785#endif
786 786
787 if (ftpcmd(NULL, NULL, sfp) != 220) 787 if (ftpcmd(NULL, NULL, sfp) != 220)
788 bb_error_msg_and_die("%s", G.wget_buf); 788 bb_simple_error_msg_and_die(G.wget_buf);
789 /* note: ftpcmd() sanitizes G.wget_buf, ok to print */ 789 /* note: ftpcmd() sanitizes G.wget_buf, ok to print */
790 790
791 /* Split username:password pair */ 791 /* Split username:password pair */
@@ -948,7 +948,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
948 if (errno != EAGAIN) { 948 if (errno != EAGAIN) {
949 if (ferror(dfp)) { 949 if (ferror(dfp)) {
950 progress_meter(PROGRESS_END); 950 progress_meter(PROGRESS_END);
951 bb_perror_msg_and_die(bb_msg_read_error); 951 bb_simple_perror_msg_and_die(bb_msg_read_error);
952 } 952 }
953 break; /* EOF, not error */ 953 break; /* EOF, not error */
954 } 954 }
@@ -961,7 +961,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
961# if ENABLE_FEATURE_WGET_TIMEOUT 961# if ENABLE_FEATURE_WGET_TIMEOUT
962 if (second_cnt != 0 && --second_cnt == 0) { 962 if (second_cnt != 0 && --second_cnt == 0) {
963 progress_meter(PROGRESS_END); 963 progress_meter(PROGRESS_END);
964 bb_error_msg_and_die("download timed out"); 964 bb_simple_error_msg_and_die("download timed out");
965 } 965 }
966# endif 966# endif
967 /* We used to loop back to poll here, 967 /* We used to loop back to poll here,
@@ -1014,7 +1014,7 @@ static void NOINLINE retrieve_file_data(FILE *dfp)
1014 G.got_clen = 1; /* makes it show 100% even for download of (formerly) unknown size */ 1014 G.got_clen = 1; /* makes it show 100% even for download of (formerly) unknown size */
1015 progress_meter(PROGRESS_END); 1015 progress_meter(PROGRESS_END);
1016 if (G.content_len != 0) { 1016 if (G.content_len != 0) {
1017 bb_perror_msg_and_die("connection closed prematurely"); 1017 bb_simple_perror_msg_and_die("connection closed prematurely");
1018 /* GNU wget says "DATE TIME (NN MB/s) - Connection closed at byte NNN. Retrying." */ 1018 /* GNU wget says "DATE TIME (NN MB/s) - Connection closed at byte NNN. Retrying." */
1019 } 1019 }
1020 1020
@@ -1348,7 +1348,7 @@ However, in real world it was observed that some web servers
1348 } 1348 }
1349 if (key == KEY_location && status >= 300) { 1349 if (key == KEY_location && status >= 300) {
1350 if (--redir_limit == 0) 1350 if (--redir_limit == 0)
1351 bb_error_msg_and_die("too many redirections"); 1351 bb_simple_error_msg_and_die("too many redirections");
1352 fclose(sfp); 1352 fclose(sfp);
1353 if (str[0] == '/') { 1353 if (str[0] == '/') {
1354 free(redirected_path); 1354 free(redirected_path);