| From b5584b0235bc0cb98e63e1b338cfd9cd09d29978 Mon Sep 17 00:00:00 2001 |
| From: Mike Frysinger <vapier@gentoo.org> |
| Date: Tue, 7 May 2013 18:14:22 -0400 |
| Subject: [PATCH [mtd-utils] 06/12] mtd-utils: new prompt() helper for talking |
| to the user |
| |
| We've got a few tools that prompt the user for "yes/no" questions. |
| Add a common helper to simplify the various implementations. |
| |
| Signed-off-by: Mike Frysinger <vapier@gentoo.org> |
| --- |
| flash_otp_lock.c | 6 +++--- |
| ftl_format.c | 11 +++-------- |
| include/common.h | 39 ++++++++++++++++++++++++++++++++++++++- |
| ubi-utils/ubiformat.c | 39 +++++++-------------------------------- |
| 4 files changed, 51 insertions(+), 44 deletions(-) |
| |
| diff --git a/include/common.h b/include/common.h |
| index d0c4146..4ffccea 100644 |
| --- a/include/common.h |
| +++ b/include/common.h |
| @@ -19,6 +19,7 @@ |
| #ifndef __MTD_UTILS_COMMON_H__ |
| #define __MTD_UTILS_COMMON_H__ |
| |
| +#include <stdbool.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <ctype.h> |
| @@ -101,9 +102,45 @@ extern "C" { |
| fprintf(stderr, "%s: warning!: " fmt "\n", PROGRAM_NAME, ##__VA_ARGS__); \ |
| } while(0) |
| |
| +/** |
| + * prompt the user for confirmation |
| + */ |
| +static inline bool prompt(const char *msg, bool def) |
| +{ |
| + char *line = NULL; |
| + size_t len; |
| + bool ret = def; |
| + |
| + do { |
| + normsg_cont("%s (%c/%c) ", msg, def ? 'Y' : 'y', def ? 'n' : 'N'); |
| + fflush(stdout); |
| + |
| + while (getline(&line, &len, stdin) == -1) { |
| + printf("failed to read prompt; assuming '%s'\n", |
| + def ? "yes" : "no"); |
| + break; |
| + } |
| + |
| + if (strcmp("\n", line) != 0) { |
| + switch (rpmatch(line)) { |
| + case 0: ret = false; break; |
| + case 1: ret = true; break; |
| + case -1: |
| + puts("unknown response; please try again"); |
| + continue; |
| + } |
| + } |
| + break; |
| + } while (1); |
| + |
| + free(line); |
| + |
| + return ret; |
| +} |
| + |
| static inline int is_power_of_2(unsigned long long n) |
| { |
| - return (n != 0 && ((n & (n - 1)) == 0)); |
| + return (n != 0 && ((n & (n - 1)) == 0)); |
| } |
| |
| /** |
| diff --git a/ubi-utils/ubiformat.c b/ubi-utils/ubiformat.c |
| index 899f9fc..97a4eab 100644 |
| --- a/ubi-utils/ubiformat.c |
| +++ b/ubi-utils/ubiformat.c |
| @@ -243,35 +243,12 @@ static int parse_opt(int argc, char * const argv[]) |
| |
| static int want_exit(void) |
| { |
| - char buf[4]; |
| - |
| - while (1) { |
| - normsg_cont("continue? (yes/no) "); |
| - if (scanf("%3s", buf) == EOF) { |
| - sys_errmsg("scanf returned unexpected EOF, assume \"yes\""); |
| - return 1; |
| - } |
| - if (!strncmp(buf, "yes", 3) || !strncmp(buf, "y", 1)) |
| - return 0; |
| - if (!strncmp(buf, "no", 2) || !strncmp(buf, "n", 1)) |
| - return 1; |
| - } |
| + return prompt("continue?", false) == true ? 0 : 1; |
| } |
| |
| -static int answer_is_yes(void) |
| +static int answer_is_yes(const char *msg) |
| { |
| - char buf[4]; |
| - |
| - while (1) { |
| - if (scanf("%3s", buf) == EOF) { |
| - sys_errmsg("scanf returned unexpected EOF, assume \"no\""); |
| - return 0; |
| - } |
| - if (!strncmp(buf, "yes", 3) || !strncmp(buf, "y", 1)) |
| - return 1; |
| - if (!strncmp(buf, "no", 2) || !strncmp(buf, "n", 1)) |
| - return 0; |
| - } |
| + return prompt(msg ? : "continue?", false); |
| } |
| |
| static void print_bad_eraseblocks(const struct mtd_dev_info *mtd, |
| @@ -412,11 +389,9 @@ static int mark_bad(const struct mtd_dev_info *mtd, struct ubi_scan_info *si, in |
| { |
| int err; |
| |
| - if (!args.yes) { |
| - normsg_cont("mark it as bad? Continue (yes/no) "); |
| - if (!answer_is_yes()) |
| + if (!args.yes) |
| + if (!answer_is_yes("mark it as bad?")) |
| return -1; |
| - } |
| |
| if (!args.quiet) |
| normsg_cont("marking block %d bad", eb); |
| @@ -922,10 +897,10 @@ int main(int argc, char * const argv[]) |
| "which is different to requested offsets %d and %d", |
| si->vid_hdr_offs, si->data_offs, ui.vid_hdr_offs, |
| ui.data_offs); |
| - normsg_cont("use new offsets %d and %d? (yes/no) ", |
| + normsg_cont("use new offsets %d and %d? ", |
| ui.vid_hdr_offs, ui.data_offs); |
| } |
| - if (args.yes || answer_is_yes()) { |
| + if (args.yes || answer_is_yes(NULL)) { |
| if (args.yes && !args.quiet) |
| printf("yes\n"); |
| } else |
| -- |
| 1.8.2.1 |
| |