From: Karel Zak Date: Mon, 11 Feb 2013 10:41:19 +0000 (+0100) Subject: libfdisk: add Yes/No to Ask API X-Git-Tag: v2.23-rc1~103 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ccf48af540cf5446778fff5085afa21d38cb173f;p=thirdparty%2Futil-linux.git libfdisk: add Yes/No to Ask API Signed-off-by: Karel Zak --- diff --git a/fdisks/fdisk-ask.c b/fdisks/fdisk-ask.c index f26db2ef56..9d2f87ac3e 100644 --- a/fdisks/fdisk-ask.c +++ b/fdisks/fdisk-ask.c @@ -168,6 +168,7 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask, void *data __attribute__((__unused__))) { va_list ap; + int rc = 0; char buf[BUFSIZ]; assert(cxt); @@ -197,9 +198,17 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask, fprintf(stderr, ": %m\n"); va_end(ap); break; + case FDISK_ASKTYPE_YESNO: + fputc('\n', stdout); + fputs(fdisk_ask_get_query(ask), stdout); + rc = get_user_reply(cxt, _(" [Y]es/[N]o: "), buf, sizeof(buf)); + if (rc == 0) + ask->data.yesno.result = rpmatch(buf); + DBG(ASK, dbgprint("yes-no ask: reply '%s' [rc=%d]", buf, rc)); + break; default: warnx(_("internal error: unssuported dialog type %d"), fdisk_ask_get_type(ask)); return -EINVAL; } - return 0; + return rc; } diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c index 3f8da0e65c..8bb7e9464c 100644 --- a/libfdisk/src/ask.c +++ b/libfdisk/src/ask.c @@ -357,6 +357,47 @@ int fdisk_ask_number(struct fdisk_context *cxt, return rc; } +int fdisk_ask_yesno(struct fdisk_context *cxt, + const char *query, + int *result) +{ + struct fdisk_ask *ask; + int rc; + + assert(cxt); + + ask = fdisk_new_ask(); + if (!ask) + return -ENOMEM; + + rc = fdisk_ask_set_type(ask, FDISK_ASKTYPE_YESNO); + if (!rc) + fdisk_ask_set_query(ask, query); + if (!rc) + rc = fdisk_do_ask(cxt, ask); + if (!rc) + *result = fdisk_ask_yesno_get_result(ask); + + fdisk_free_ask(ask); + DBG(ASK, dbgprint("result: %d [rc=%d]\n", *result, rc)); + return rc; +} + +uint64_t fdisk_ask_yesno_get_result(struct fdisk_ask *ask) +{ + assert(ask); + assert(fdisk_is_ask(ask, YESNO)); + return ask->data.yesno.result; +} + +int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, uint64_t result) +{ + assert(ask); + ask->data.yesno.result = result; + return 0; +} + + #define is_print_ask(a) (fdisk_is_ask(a, WARN) || fdisk_is_ask(a, WARNX) || fdisk_is_ask(a, INFO)) int fdisk_ask_print_get_errno(struct fdisk_ask *ask) diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index 3c180639ea..ab41740865 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -234,6 +234,10 @@ struct fdisk_ask { unsigned int has_va:1; int errnum; /* errno */ } print; + /* FDISK_ASKTYPE_YESNO */ + struct ask_yesno { + int result; /* TRUE or FALSE */ + } yesno; } data; }; diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index f0f080e401..f34d487d10 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -58,7 +58,8 @@ enum { FDISK_ASKTYPE_OFFSET, FDISK_ASKTYPE_WARN, FDISK_ASKTYPE_WARNX, - FDISK_ASKTYPE_INFO + FDISK_ASKTYPE_INFO, + FDISK_ASKTYPE_YESNO }; /* init.c */ @@ -159,6 +160,10 @@ extern int fdisk_ask_number(struct fdisk_context *cxt, const char *query, uintmax_t *result); +extern int fdisk_ask_yesno(struct fdisk_context *cxt, const char *query, int *result); +extern uint64_t fdisk_ask_yesno_get_result(struct fdisk_ask *ask); +extern int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, uint64_t result); + extern int fdisk_info(struct fdisk_context *cxt, const char *fmt, ...); extern int fdisk_warnx(struct fdisk_context *cxt, const char *fmt, ...); extern int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...);