diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-12-07 14:57:32 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-12-07 15:16:14 +0200 |
commit | 5a7b73860974384d8e00065105435403b0842ab0 (patch) | |
tree | 3f029c22f0a29a842002279bb4b5561af61a8aa8 /lib | |
parent | c12cd5695cf1a6c2c44100a68762ab66356f43b8 (diff) | |
download | eclat-5a7b73860974384d8e00065105435403b0842ab0.tar.gz eclat-5a7b73860974384d8e00065105435403b0842ab0.tar.bz2 |
Re-implement confirmation support.
* doc/eclat-delete-volume.1: Update.
* doc/eclat-release-address.1: Update.
* doc/eclat.1: Update.
* doc/eclat.conf.5: New section "CONFIRMATION"
* lib/getyn.c (eclat_vgetyn): Negative default stands for no
default at all.
* lib/confirm.c (eclat_confirm_mode): Remove.
(eclat_confirm): Change signature. Act according to the
first argument.
* lib/libeclat.h (eclat_confirm_mode): New enum.
(eclat_confirm): Change signature.
* src/cmdline.opt: Change handling of -Y and -N options.
* src/config.c: New statement "confirm".
* src/cretags.c: Remove call to eclat_confirm. This is done by
the caller.
* src/delvol.c: Likewise.
* src/reladdr.c: Likewise.
* src/eclat.c (confirm_mode): New variable.
(command) <flags>: New member.
(cmdtab): Mark commands with appropriate flags.
(main): Call eclat_confirm to confirm the command.
* src/eclat.h (confirm_mode): New extern.
(set_command_confirmation): New proto.
* etc/eclat.cfin: Set a reasonably safe confirmation default.
* lib/forlan.c (strtots): Remove unused variable.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/confirm.c | 28 | ||||
-rw-r--r-- | lib/forlan.c | 1 | ||||
-rw-r--r-- | lib/getyn.c | 14 | ||||
-rw-r--r-- | lib/libeclat.h | 12 |
4 files changed, 39 insertions, 16 deletions
diff --git a/lib/confirm.c b/lib/confirm.c index bd283a1..18eb409 100644 --- a/lib/confirm.c +++ b/lib/confirm.c @@ -17,22 +17,32 @@ #include "libeclat.h" #include <sysexits.h> -int eclat_confirm_mode = -1; - int -eclat_confirm(const char *prompt, ...) +eclat_confirm(enum eclat_confirm_mode mode, const char *prompt, ...) { int rc; va_list ap; - - if (!isatty(0) || eclat_confirm_mode >= 0) { - if (eclat_confirm_mode == -1) - die(EX_USAGE, "stdin not a terminal and no default response provided; use -Y or -N option to override"); - return eclat_confirm_mode; + + switch (mode) { + case eclat_confirm_unspecified: + case eclat_confirm_positive: + return 1; + case eclat_confirm_negative: + return 0; + case eclat_confirm_tty: + if (!isatty(0)) + return 1; + break; + case eclat_confirm_always: + if (!isatty(0)) + die(EX_USAGE, + "confirmation required, " + "but stdin is not a terminal"); + break; } va_start(ap, prompt); - rc = eclat_vgetyn(!!eclat_confirm_mode, prompt, ap); + rc = eclat_vgetyn(-1, prompt, ap); va_end(ap); return rc; diff --git a/lib/forlan.c b/lib/forlan.c index 7a9dab1..828fb09 100644 --- a/lib/forlan.c +++ b/lib/forlan.c @@ -58,7 +58,6 @@ static unsigned long strtots(const char *input) { struct tm tm; - time_t t; /* 2012-06-21T10:36:48.000Z */ memset(&tm, 0, sizeof(tm)); diff --git a/lib/getyn.c b/lib/getyn.c index 8ec8a07..ee49d3f 100644 --- a/lib/getyn.c +++ b/lib/getyn.c @@ -21,10 +21,14 @@ int eclat_vgetyn(int dfl, const char *prompt, va_list ap) { - static char *hint[] = { "y/N", "Y/n" }; + static char *hint[] = { "y/n", "y/N", "Y/n" }; int state = 0; int c, resp; - + + if (dfl < -1) + dfl = -1; + else if (dfl > 1) + dfl = 1; do { switch (state) { case 1: @@ -43,7 +47,9 @@ eclat_vgetyn(int dfl, const char *prompt, va_list ap) case 'N': return 0; case '\n': - return dfl; + if (dfl >= 0) + return dfl; + /* fall through */ default: err("Please, reply 'y' or 'n'"); } @@ -52,7 +58,7 @@ eclat_vgetyn(int dfl, const char *prompt, va_list ap) break; case 0: vfprintf(stdout, prompt, ap); - fprintf(stdout, " [%s] ", hint[dfl]); + fprintf(stdout, " [%s] ", hint[dfl+1]); fflush(stdout); state = 1; break; diff --git a/lib/libeclat.h b/lib/libeclat.h index 35d2538..a558dae 100644 --- a/lib/libeclat.h +++ b/lib/libeclat.h @@ -110,8 +110,16 @@ char *eclat_getans(char *prompt, char *dfl, int pass); int eclat_getyn(int dfl, const char *prompt, ...); int eclat_vgetyn(int dfl, const char *prompt, va_list ap); -extern int eclat_confirm_mode; -int eclat_confirm(const char *prompt, ...); +enum eclat_confirm_mode +{ + eclat_confirm_unspecified, + eclat_confirm_positive, + eclat_confirm_negative, + eclat_confirm_tty, + eclat_confirm_always +}; + +int eclat_confirm(enum eclat_confirm_mode mode, const char *prompt, ...); #define ECLAT_MAP_OPEN 0x01 |