blob: 6e868729e48632e5149263ecd47d65845ad07ef7 [file] [log] [blame]
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