]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add Yes/No to Ask API
authorKarel Zak <kzak@redhat.com>
Mon, 11 Feb 2013 10:41:19 +0000 (11:41 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 11 Mar 2013 12:00:56 +0000 (13:00 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisks/fdisk-ask.c
libfdisk/src/ask.c
libfdisk/src/fdiskP.h
libfdisk/src/libfdisk.h

index f26db2ef56e5aefd5e1a225a505245990800560c..9d2f87ac3e3f68a41c4432831980cf45dc8ff118 100644 (file)
@@ -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;
 }
index 3f8da0e65c02ca64b19cce4a53254ff43c6fd42f..8bb7e9464cda7d3ac736468a441bf96425d4c42a 100644 (file)
@@ -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)
index 3c180639eafe19e54aae73d8d3fe699ac4100b35..ab41740865651527fb00a839ce753a3e48f02722 100644 (file)
@@ -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;
 };
 
index f0f080e401be40740c0f16d64e72511a9af40634..f34d487d1076198a15241dbc652fa1024df291f1 100644 (file)
@@ -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, ...);