From f793d5347f08bdb742e8ad8a2cc5a7d30e6bd623 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Mon, 27 Feb 2012 21:56:49 -0600 Subject: [PATCH] Upgrade yesno() and make cp -i use it. --- lib/lib.c | 15 +++++++-------- lib/lib.h | 2 +- toys/cp.c | 17 +++++------------ 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/lib/lib.c b/lib/lib.c index 3f04cb6..cc441f9 100644 --- a/lib/lib.c +++ b/lib/lib.c @@ -792,20 +792,19 @@ void terminal_size(unsigned *x, unsigned *y) } // This should use a raw tty, fixit later. -int yesno(int def) +int yesno(char *prompt, int def) { - char buf[16]; + char buf; int i; for (i=0; i<3 && !isatty(i); i++); if (i == 3) return 1; - sprintf(buf, "(%c/%c):", def ? 'Y' : 'y', def ? 'n' : 'N'); - write(i, buf, 6); - while (read(i, buf, 1)) { - if (isspace(*buf)) break; - if (tolower(*buf) == 'y') return 1; - if (tolower(*buf) == 'n') return 0; + fdprintf(i, "%s (%c/%c):", prompt, def ? 'Y' : 'y', def ? 'n' : 'N'); + while (read(i, &buf, 1)) { + if (isspace(buf)) break; + if (tolower(buf) == 'y') return 1; + if (tolower(buf) == 'n') return 0; } return def; } diff --git a/lib/lib.h b/lib/lib.h index a695973..ab10eb7 100644 --- a/lib/lib.h +++ b/lib/lib.h @@ -109,7 +109,7 @@ void delete_tempfile(int fdin, int fdout, char **tempname); void replace_tempfile(int fdin, int fdout, char **tempname); void crc_init(unsigned int *crc_table, int little_endian); void terminal_size(unsigned *x, unsigned *y); -int yesno(int def); +int yesno(char *prompt, int def); void for_each_pid_with_name_in(char **names, void (*callback)(pid_t pid)); diff --git a/toys/cp.c b/toys/cp.c index e9d9d50..236c00f 100644 --- a/toys/cp.c +++ b/toys/cp.c @@ -58,18 +58,11 @@ DEFINE_GLOBALS( void cp_file(char *src, char *dst, struct stat *srcst) { int fdout = -1; - char overwrite; - - if ((toys.optflags & FLAG_i) && access(dst, R_OK) == 0) { - // -i flag is specified and dst file exists. - // If user does not confirm, don't copy the file - // Ideally I'd use perror here, but it always appends a newline - // to the string, resulting in the input prompt being displayed - // on the next line. - fprintf(stderr, "cp: overwrite '%s'? ", dst); - (void)scanf("%c", &overwrite); - if (!(overwrite == 'y' || overwrite == 'Y')) return; - } + + // -i flag is specified and dst file exists. + if ((toys.optflags&FLAG_i) && !access(dst, R_OK) + && !yesno("cp: overwrite", 1)) + return; if (toys.optflags & FLAG_v) printf("'%s' -> '%s'\n", src, dst); -- 2.7.4