From: Karel Zak Date: Tue, 16 Apr 2024 11:31:55 +0000 (+0200) Subject: libfdisk: add fdisk_ask_menu() X-Git-Tag: v2.42-start~397^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7817415a5538354dfa24532f3420bfd3e74df795;p=thirdparty%2Futil-linux.git 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 --- 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 + /** * 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;