int fdisk_ask_menu_add_item(struct fdisk_ask *ask, int key, const char *name, const char *desc) { struct ask_menuitem *mi; assert(ask); assert(fdisk_is_ask(ask, MENU)); mi = calloc(1, sizeof(*mi)); if (!mi) return -ENOMEM; mi->key = key; mi->name = name; mi->desc = desc; if (!ask->data.menu.first) ask->data.menu.first = mi; else { struct ask_menuitem *last = ask->data.menu.first; while (last->next) last = last->next; last->next = mi; } DBG(ASK, dbgprint("new menu item: %c, \"%s\" (%s)\n", mi->key, mi->name, mi->desc)); return 0; }
/* * menu */ int fdisk_ask_menu_set_default(struct fdisk_ask *ask, int dfl) { assert(ask); assert(fdisk_is_ask(ask, MENU)); ask->data.menu.dfl = dfl; return 0; }
int fdisk_ask_menu_get_result(struct fdisk_ask *ask, int *key) { assert(ask); assert(fdisk_is_ask(ask, MENU)); if (key) *key = ask->data.menu.result; return 0; }
int fdisk_ask_menu_set_result(struct fdisk_ask *ask, int key) { assert(ask); assert(fdisk_is_ask(ask, MENU)); ask->data.menu.result = key; DBG(ASK, dbgprint("menu result: %c\n", key)); return 0; }
void fdisk_reset_ask(struct fdisk_ask *ask) { assert(ask); free(ask->query); if (fdisk_is_ask(ask, MENU)) fdisk_ask_menu_reset_items(ask); memset(ask, 0, sizeof(*ask)); }
size_t fdisk_ask_menu_get_nitems(struct fdisk_ask *ask) { struct ask_menuitem *mi; size_t n; assert(ask); assert(fdisk_is_ask(ask, MENU)); for (n = 0, mi = ask->data.menu.first; mi; mi = mi->next, n++); return n; }
static void fdisk_ask_menu_reset_items(struct fdisk_ask *ask) { struct ask_menuitem *mi; assert(ask); assert(fdisk_is_ask(ask, MENU)); for (mi = ask->data.menu.first; mi; ) { struct ask_menuitem *next = mi->next; free(mi); mi = next; } }
void fdisk_reset_ask(struct fdisk_ask *ask) { int refcount; assert(ask); free(ask->query); DBG(ASK, ul_debugobj(ask, "reset")); refcount = ask->refcount; if (fdisk_is_ask(ask, MENU)) fdisk_ask_menu_reset_items(ask); memset(ask, 0, sizeof(*ask)); ask->refcount = refcount; }
/* returns: 0 = success, <0 = error, >0 = idx out-of-range */ int fdisk_ask_menu_get_item(struct fdisk_ask *ask, size_t idx, int *key, const char **name, const char **desc) { size_t i; struct ask_menuitem *mi; assert(ask); assert(fdisk_is_ask(ask, MENU)); for (i = 0, mi = ask->data.menu.first; mi; mi = mi->next, i++) { if (i == idx) break; } if (!mi) return 1; /* no more items */ if (key) *key = mi->key; if (name) *name = mi->name; if (desc) *desc = mi->desc; return 0; }
struct tt *fdisk_ask_get_table(struct fdisk_ask *ask) { assert(ask); assert(fdisk_is_ask(ask, TABLE)); return ask->data.table; }
uint64_t fdisk_ask_yesno_get_result(struct fdisk_ask *ask) { assert(ask); assert(fdisk_is_ask(ask, YESNO)); return ask->data.yesno.result; }
char *fdisk_ask_string_get_result(struct fdisk_ask *ask) { assert(ask); assert(fdisk_is_ask(ask, STRING)); return ask->data.str.result; }
int fdisk_ask_menu_get_default(struct fdisk_ask *ask) { assert(ask); assert(fdisk_is_ask(ask, MENU)); return ask->data.menu.dfl; }