static int ask_menu(struct fdisk_context *cxt, struct fdisk_ask *ask, char *buf, size_t bufsz) { const char *q = fdisk_ask_get_query(ask); int dft = fdisk_ask_menu_get_default(ask); if (q) { fputs(q, stdout); /* print header */ fputc('\n', stdout); } do { char prompt[128]; int key, c, rc; const char *name, *desc; size_t i = 0; /* print menu items */ while (fdisk_ask_menu_get_item(ask, i++, &key, &name, &desc) == 0) fprintf(stdout, " %c %s (%s)\n", key, name, desc); /* ask for key */ snprintf(prompt, sizeof(prompt), _("Select (default %c): "), dft); rc = get_user_reply(cxt, prompt, buf, bufsz); if (rc) return rc; if (!*buf) { fdisk_info(cxt, _("Using default response %c."), dft); c = dft; } else c = tolower(buf[0]); /* check result */ i = 0; while (fdisk_ask_menu_get_item(ask, i++, &key, NULL, NULL) == 0) { if (c == key) { fdisk_ask_menu_set_result(ask, c); return 0; /* success */ } } fdisk_warnx(cxt, _("Value out of range.")); } while (1); return -EINVAL; }
/* converts libfdisk FDISK_ASKTYPE_MENU to cfdisk menu and returns user's * responseback to libfdisk */ static int ask_menu(struct fdisk_ask *ask, struct cfdisk *cf) { struct cfdisk_menuitem *d, *cm; int key; size_t i = 0, nitems; const char *name, *desc; assert(ask); assert(cf); /* create cfdisk menu according to libfdisk ask-menu, note that the * last cm[] item has to be empty -- so nitems + 1 */ nitems = fdisk_ask_menu_get_nitems(ask); cm = xcalloc(nitems + 1, sizeof(struct cfdisk_menuitem)); for (i = 0; i < nitems; i++) { if (fdisk_ask_menu_get_item(ask, i, &key, &name, &desc)) break; cm[i].key = key; cm[i].desc = desc; cm[i].name = name; } /* make the new menu active */ menu_push(cf, cm); ui_draw_menu(cf); refresh(); /* wait for keys */ do { int key = getch(); if (ui_resize) ui_menu_resize(cf); if (ui_menu_move(cf, key) == 0) continue; switch (key) { case KEY_ENTER: case '\n': case '\r': d = menu_get_menuitem(cf, cf->menu->idx); if (d) fdisk_ask_menu_set_result(ask, d->key); menu_pop(cf); free(cm); return 0; } } while (1); menu_pop(cf); free(cm); return -1; }