]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: add fdisk_ask_menu()
authorKarel Zak <kzak@redhat.com>
Tue, 16 Apr 2024 11:31:55 +0000 (13:31 +0200)
committerKarel Zak <kzak@redhat.com>
Wed, 17 Apr 2024 07:32:20 +0000 (09:32 +0200)
Currently, only libfdisk has the ability to prompt the user with a
menu. However, this functionality is not accessible through the public
library API. This commit exports this functionality through the use of
a simple function, fdisk_ask_menu().

Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/docs/libfdisk-sections.txt
libfdisk/src/ask.c
libfdisk/src/libfdisk.h.in
libfdisk/src/libfdisk.sym

index efc138571d28009396e2a5505cfe2acede4f45b7..b58c8809975c75bede98b40f3836e4655a757b1f 100644 (file)
@@ -25,6 +25,7 @@ fdisk_ask
 fdisk_is_ask
 fdisk_ask_get_query
 fdisk_ask_get_type
+fdisk_ask_menu
 fdisk_ask_menu_get_default
 fdisk_ask_menu_get_item
 fdisk_ask_menu_get_nitems
index 299f65b43480d3db18bfd7e7dc854be9bc91722d..4ce7dc0b4e0f9495631e8a47b52c57c2d754a2b5 100644 (file)
@@ -2,6 +2,8 @@
 #include "strutils.h"
 #include "fdiskP.h"
 
+#include <stdarg.h>
+
 /**
  * SECTION: ask
  * @title: Ask
@@ -875,6 +877,50 @@ int fdisk_ask_menu_add_item(struct fdisk_ask *ask, int key,
        return 0;
 }
 
+/**
+ * fdisk_ask_menu:
+ * @cxt: fdisk context
+ * @query: query to ask (menu title)
+ * @result: returns selected key
+ * @dflt: default key
+ * @...: list of char *name and int key pairs
+ *
+ * Displays a menu with the given query and returns the result of the menu selection.
+ *
+ * Returns: <0 on error, 0 on success
+ *
+ * Since: 2.41
+ *
+ */
+int fdisk_ask_menu(struct fdisk_context *cxt, char *query, int *result, int dflt, ...)
+{
+       struct fdisk_ask *ask;
+       va_list ap;
+       char *name;
+       int rc;
+
+       if (!query || !result)
+               return -EINVAL;
+
+       ask = fdisk_new_ask();
+       if (!ask)
+               return -ENOMEM;
+
+       fdisk_ask_set_type(ask, FDISK_ASKTYPE_MENU);
+       fdisk_ask_set_query(ask, query);
+       fdisk_ask_menu_set_default(ask, dflt);
+
+       va_start(ap, dflt);
+
+       while ((name = va_arg(ap, char *)))
+               fdisk_ask_menu_add_item(ask, va_arg(ap, int), name, NULL);
+
+       rc = fdisk_do_ask(cxt, ask);
+       if (~rc)
+               fdisk_ask_menu_get_result(ask, result);
+       fdisk_unref_ask(ask);
+       return rc;
+}
 
 /*
  * print-like
index 9c20f44bebff28c658cb2e3e7b1c6312056df719..be3b22e7a3ed8ca356e44098a2af07cf5136d123 100644 (file)
@@ -872,6 +872,9 @@ int fdisk_ask_yesno(struct fdisk_context *cxt,
                     int *result);
 int fdisk_ask_yesno_get_result(struct fdisk_ask *ask);
 int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, int result);
+
+int fdisk_ask_menu(struct fdisk_context *cxt, char *query, int *result, int dflt, ...);
+
 int fdisk_ask_menu_get_default(struct fdisk_ask *ask);
 int fdisk_ask_menu_set_result(struct fdisk_ask *ask, int key);
 int fdisk_ask_menu_get_result(struct fdisk_ask *ask, int *key);
index bb69e93c41033eb4f6e6c32e7561e8f031ff70ba..43eb0f251a5d20ad91b7f450a5f99ce9b4e536a2 100644 (file)
@@ -324,3 +324,7 @@ FDISK_2.38 {
 FDISK_2.40 {
        fdisk_partition_get_max_size;
 } FDISK_2.38;
+
+FDISK_2_41 {
+       fdisk_ask_menu;
+} FDISK_2.40;