libfdisk: add Yes/No to Ask API

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2013-02-11 11:41:19 +01:00
parent 9ff2ce0a54
commit ccf48af540
4 changed files with 61 additions and 2 deletions

View file

@ -168,6 +168,7 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
void *data __attribute__((__unused__)))
{
va_list ap;
int rc = 0;
char buf[BUFSIZ];
assert(cxt);
@ -197,9 +198,17 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
fprintf(stderr, ": %m\n");
va_end(ap);
break;
case FDISK_ASKTYPE_YESNO:
fputc('\n', stdout);
fputs(fdisk_ask_get_query(ask), stdout);
rc = get_user_reply(cxt, _(" [Y]es/[N]o: "), buf, sizeof(buf));
if (rc == 0)
ask->data.yesno.result = rpmatch(buf);
DBG(ASK, dbgprint("yes-no ask: reply '%s' [rc=%d]", buf, rc));
break;
default:
warnx(_("internal error: unssuported dialog type %d"), fdisk_ask_get_type(ask));
return -EINVAL;
}
return 0;
return rc;
}

View file

@ -357,6 +357,47 @@ int fdisk_ask_number(struct fdisk_context *cxt,
return rc;
}
int fdisk_ask_yesno(struct fdisk_context *cxt,
const char *query,
int *result)
{
struct fdisk_ask *ask;
int rc;
assert(cxt);
ask = fdisk_new_ask();
if (!ask)
return -ENOMEM;
rc = fdisk_ask_set_type(ask, FDISK_ASKTYPE_YESNO);
if (!rc)
fdisk_ask_set_query(ask, query);
if (!rc)
rc = fdisk_do_ask(cxt, ask);
if (!rc)
*result = fdisk_ask_yesno_get_result(ask);
fdisk_free_ask(ask);
DBG(ASK, dbgprint("result: %d [rc=%d]\n", *result, rc));
return rc;
}
uint64_t fdisk_ask_yesno_get_result(struct fdisk_ask *ask)
{
assert(ask);
assert(fdisk_is_ask(ask, YESNO));
return ask->data.yesno.result;
}
int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, uint64_t result)
{
assert(ask);
ask->data.yesno.result = result;
return 0;
}
#define is_print_ask(a) (fdisk_is_ask(a, WARN) || fdisk_is_ask(a, WARNX) || fdisk_is_ask(a, INFO))
int fdisk_ask_print_get_errno(struct fdisk_ask *ask)

View file

@ -234,6 +234,10 @@ struct fdisk_ask {
unsigned int has_va:1;
int errnum; /* errno */
} print;
/* FDISK_ASKTYPE_YESNO */
struct ask_yesno {
int result; /* TRUE or FALSE */
} yesno;
} data;
};

View file

@ -58,7 +58,8 @@ enum {
FDISK_ASKTYPE_OFFSET,
FDISK_ASKTYPE_WARN,
FDISK_ASKTYPE_WARNX,
FDISK_ASKTYPE_INFO
FDISK_ASKTYPE_INFO,
FDISK_ASKTYPE_YESNO
};
/* init.c */
@ -159,6 +160,10 @@ extern int fdisk_ask_number(struct fdisk_context *cxt,
const char *query,
uintmax_t *result);
extern int fdisk_ask_yesno(struct fdisk_context *cxt, const char *query, int *result);
extern uint64_t fdisk_ask_yesno_get_result(struct fdisk_ask *ask);
extern int fdisk_ask_yesno_set_result(struct fdisk_ask *ask, uint64_t result);
extern int fdisk_info(struct fdisk_context *cxt, const char *fmt, ...);
extern int fdisk_warnx(struct fdisk_context *cxt, const char *fmt, ...);
extern int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...);