aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2024-04-16 13:31:55 +0200
committerKarel Zak <kzak@redhat.com>2024-04-17 09:32:20 +0200
commit7817415a5538354dfa24532f3420bfd3e74df795 (patch)
tree3d24153a92620791bdd10cd2acf64b741b265509
parent9bdcf863bedec6d401d0ecd165a8c6c5e237084a (diff)
downloadutil-linux-7817415a5538354dfa24532f3420bfd3e74df795.tar.gz
libfdisk: add fdisk_ask_menu()
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>
-rw-r--r--libfdisk/docs/libfdisk-sections.txt1
-rw-r--r--libfdisk/src/ask.c46
-rw-r--r--libfdisk/src/libfdisk.h.in3
-rw-r--r--libfdisk/src/libfdisk.sym4
4 files changed, 54 insertions, 0 deletions
diff --git a/libfdisk/docs/libfdisk-sections.txt b/libfdisk/docs/libfdisk-sections.txt
index efc138571d..b58c880997 100644
--- a/libfdisk/docs/libfdisk-sections.txt
+++ b/libfdisk/docs/libfdisk-sections.txt
@@ -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
diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c
index 299f65b434..4ce7dc0b4e 100644
--- a/libfdisk/src/ask.c
+++ b/libfdisk/src/ask.c
@@ -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
diff --git a/libfdisk/src/libfdisk.h.in b/libfdisk/src/libfdisk.h.in
index 9c20f44beb..be3b22e7a3 100644
--- a/libfdisk/src/libfdisk.h.in
+++ b/libfdisk/src/libfdisk.h.in
@@ -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);
diff --git a/libfdisk/src/libfdisk.sym b/libfdisk/src/libfdisk.sym
index bb69e93c41..43eb0f251a 100644
--- a/libfdisk/src/libfdisk.sym
+++ b/libfdisk/src/libfdisk.sym
@@ -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;