diff options
author | Karel Zak <kzak@redhat.com> | 2024-04-16 13:31:55 +0200 |
---|---|---|
committer | Karel Zak <kzak@redhat.com> | 2024-04-17 09:32:20 +0200 |
commit | 7817415a5538354dfa24532f3420bfd3e74df795 (patch) | |
tree | 3d24153a92620791bdd10cd2acf64b741b265509 | |
parent | 9bdcf863bedec6d401d0ecd165a8c6c5e237084a (diff) | |
download | util-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.txt | 1 | ||||
-rw-r--r-- | libfdisk/src/ask.c | 46 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h.in | 3 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.sym | 4 |
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; |