From ccf48af540cf5446778fff5085afa21d38cb173f Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Mon, 11 Feb 2013 11:41:19 +0100 Subject: [PATCH] libfdisk: add Yes/No to Ask API Signed-off-by: Karel Zak --- fdisks/fdisk-ask.c | 11 ++++++++++- libfdisk/src/ask.c | 41 +++++++++++++++++++++++++++++++++++++++++ libfdisk/src/fdiskP.h | 4 ++++ libfdisk/src/libfdisk.h | 7 ++++++- 4 files changed, 61 insertions(+), 2 deletions(-) diff --git a/fdisks/fdisk-ask.c b/fdisks/fdisk-ask.c index f26db2ef5..9d2f87ac3 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 3f8da0e65..8bb7e9464 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 3c180639e..ab4174086 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 f0f080e40..f34d487d1 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, ...);