From bae8fc4436f9aeb43ef0aaccd1c9b1b35b5a4617 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sat, 7 Apr 2018 15:21:35 +0200 Subject: [PATCH] xargs: use bb_ask_y_confirmation_FILE() instead of homegrown copy function old new delta bb_ask_y_confirmation_FILE - 83 +83 inetd_main 2033 2043 +10 udhcp_send_kernel_packet 295 301 +6 rmescapes 306 310 +4 send_tree 353 355 +2 i2cdetect_main 674 672 -2 confirm_or_abort 43 38 -5 get_terminal_width_height 242 234 -8 bb_ask_y_confirmation 76 10 -66 xargs_main 823 755 -68 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 4/5 up/down: 105/-149) Total: -44 bytes Signed-off-by: Denys Vlasenko --- findutils/xargs.c | 12 ++++++------ include/libbb.h | 1 + libbb/ask_confirmation.c | 12 +++++++++--- libbb/remove_file.c | 7 ++++--- miscutils/i2c_tools.c | 1 - 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/findutils/xargs.c b/findutils/xargs.c index 117a39b62..1d85d50e8 100644 --- a/findutils/xargs.c +++ b/findutils/xargs.c @@ -496,16 +496,16 @@ static char* FAST_FUNC process_stdin_with_replace(int n_max_chars, int n_max_arg static int xargs_ask_confirmation(void) { FILE *tty_stream; - int c, savec; + int r; tty_stream = xfopen_for_read(CURRENT_TTY); + fputs(" ?...", stderr); - fflush_all(); - c = savec = getc(tty_stream); - while (c != EOF && c != '\n') - c = getc(tty_stream); + r = bb_ask_y_confirmation_FILE(tty_stream); + fclose(tty_stream); - return (savec == 'y' || savec == 'Y'); + + return r; } #else # define xargs_ask_confirmation() 1 diff --git a/include/libbb.h b/include/libbb.h index c7e830c09..5388d9d95 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -1412,6 +1412,7 @@ extern int set_loop(char **devname, const char *file, unsigned long long offset, char *bb_ask_noecho_stdin(const char *prompt) FAST_FUNC; //TODO: pass buf pointer or return allocated buf (avoid statics)? char *bb_ask_noecho(const int fd, int timeout, const char *prompt) FAST_FUNC; +int bb_ask_y_confirmation_FILE(FILE *fp) FAST_FUNC; int bb_ask_y_confirmation(void) FAST_FUNC; /* Returns -1 if input is invalid. current_mode is a base for e.g. "u+rw" */ diff --git a/libbb/ask_confirmation.c b/libbb/ask_confirmation.c index ccd983c29..e4814e215 100644 --- a/libbb/ask_confirmation.c +++ b/libbb/ask_confirmation.c @@ -8,15 +8,16 @@ */ #include "libbb.h" -/* Read a line from stdin. If the first non-whitespace char is 'y' or 'Y', +/* Read a line from fp. If the first non-whitespace char is 'y' or 'Y', * return 1. Otherwise return 0. */ -int FAST_FUNC bb_ask_y_confirmation(void) +int FAST_FUNC bb_ask_y_confirmation_FILE(FILE *fp) { char first = 0; int c; - while (((c = getchar()) != EOF) && (c != '\n')) { + fflush_all(); + while (((c = fgetc(fp)) != EOF) && (c != '\n')) { if (first == 0 && !isblank(c)) { first = c|0x20; } @@ -24,3 +25,8 @@ int FAST_FUNC bb_ask_y_confirmation(void) return first == 'y'; } + +int FAST_FUNC bb_ask_y_confirmation(void) +{ + return bb_ask_y_confirmation_FILE(stdin); +} diff --git a/libbb/remove_file.c b/libbb/remove_file.c index 074ffae70..86c9a5c56 100644 --- a/libbb/remove_file.c +++ b/libbb/remove_file.c @@ -39,8 +39,8 @@ int FAST_FUNC remove_file(const char *path, int flags) if ((!(flags & FILEUTILS_FORCE) && access(path, W_OK) < 0 && isatty(0)) || (flags & FILEUTILS_INTERACTIVE) ) { - fprintf(stderr, "%s: descend into directory '%s'? ", applet_name, - path); + fprintf(stderr, "%s: descend into directory '%s'? ", + applet_name, path); if (!bb_ask_y_confirmation()) return 0; } @@ -67,7 +67,8 @@ int FAST_FUNC remove_file(const char *path, int flags) } if (flags & FILEUTILS_INTERACTIVE) { - fprintf(stderr, "%s: remove directory '%s'? ", applet_name, path); + fprintf(stderr, "%s: remove directory '%s'? ", + applet_name, path); if (!bb_ask_y_confirmation()) return status; } diff --git a/miscutils/i2c_tools.c b/miscutils/i2c_tools.c index 8b201c0b1..6a2134063 100644 --- a/miscutils/i2c_tools.c +++ b/miscutils/i2c_tools.c @@ -421,7 +421,6 @@ static void check_write_funcs(int fd, int mode, int pec) static void confirm_or_abort(void) { fprintf(stderr, "Continue? [y/N] "); - fflush_all(); if (!bb_ask_y_confirmation()) bb_error_msg_and_die("aborting"); }