aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/lib.c15
-rw-r--r--lib/lib.h2
-rw-r--r--toys/cp.c17
3 files changed, 13 insertions, 21 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 3f04cb61..cc441f9d 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 a6959730..ab10eb73 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 e9d9d503..236c00f7 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);