From: Karel Zak Date: Wed, 30 Jan 2013 13:49:27 +0000 (+0100) Subject: libfdisk: add info, warn and wanx Ask API X-Git-Tag: v2.23-rc1~119 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ab6ea0e8f2480cb64dc7b4d9c2b59534892b9ae6;p=thirdparty%2Futil-linux.git libfdisk: add info, warn and wanx Ask API Signed-off-by: Karel Zak --- diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c index fc0214d26e..8d4ec12e61 100644 --- a/libfdisk/src/ask.c +++ b/libfdisk/src/ask.c @@ -11,8 +11,22 @@ struct fdisk_ask *fdisk_new_ask(void) void fdisk_reset_ask(struct fdisk_ask *ask) { assert(ask); - free(ask->data.num.range); free(ask->query); + + switch (ask->type) { + case FDISK_ASKTYPE_OFFSET: + case FDISK_ASKTYPE_NUMBER: + free(ask->data.num.range); + break; + case FDISK_ASKTYPE_WARNX: + case FDISK_ASKTYPE_WARN: + if (ask->data.print.has_va) + va_end(ask->data.print.va); + break; + default: + break; + } + memset(ask, 0, sizeof(*ask)); } @@ -69,10 +83,12 @@ int fdisk_do_ask(struct fdisk_context *cxt, struct fdisk_ask *ask) return rc; } +#define is_number_ask(a) (fdisk_is_ask(a, NUMBER) || fdisk_is_ask(a, OFFSET)) const char *fdisk_ask_number_get_range(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.range; } @@ -85,6 +101,7 @@ int fdisk_ask_number_set_range(struct fdisk_ask *ask, const char *range) uint64_t fdisk_ask_number_get_default(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.dfl; } @@ -98,6 +115,7 @@ int fdisk_ask_number_set_default(struct fdisk_ask *ask, uint64_t dflt) uint64_t fdisk_ask_number_get_low(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.low; } @@ -111,6 +129,7 @@ int fdisk_ask_number_set_low(struct fdisk_ask *ask, uint64_t low) uint64_t fdisk_ask_number_get_high(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.hig; } @@ -124,6 +143,7 @@ int fdisk_ask_number_set_high(struct fdisk_ask *ask, uint64_t high) uint64_t fdisk_ask_number_get_result(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.result; } @@ -137,6 +157,7 @@ int fdisk_ask_number_set_result(struct fdisk_ask *ask, uint64_t result) uint64_t fdisk_ask_number_get_base(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.base; } @@ -151,6 +172,7 @@ int fdisk_ask_number_set_base(struct fdisk_ask *ask, uint64_t base) uint64_t fdisk_ask_number_get_unit(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.unit; } @@ -164,6 +186,7 @@ int fdisk_ask_number_set_unit(struct fdisk_ask *ask, uint64_t unit) int fdisk_ask_number_is_relative(struct fdisk_ask *ask) { assert(ask); + assert(is_number_ask(ask)); return ask->data.num.relative; } @@ -298,6 +321,113 @@ int fdisk_ask_partnum(struct fdisk_context *cxt, size_t *partnum, int wantnew) return rc; } +#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) +{ + assert(ask); + assert(is_print_ask(ask)); + return ask->data.print.errnum; +} + +int fdisk_ask_print_set_errno(struct fdisk_ask *ask, int errnum) +{ + assert(ask); + ask->data.print.errnum = errnum; + return 0; +} + +const char *fdisk_ask_print_get_mesg(struct fdisk_ask *ask) +{ + assert(ask); + assert(is_print_ask(ask)); + return ask->data.print.mesg; +} + +/* does not reallocate the message! */ +int fdisk_ask_print_set_mesg(struct fdisk_ask *ask, const char *mesg) +{ + assert(ask); + ask->data.print.mesg = mesg; + return 0; +} + +/* caller has to call va_end(ap) */ +int fdisk_ask_print_get_va(struct fdisk_ask *ask, va_list ap) +{ + assert(ask); + assert(is_print_ask(ask)); + va_copy(ap, ask->data.print.va); + return 0; +} + +/* note that fdisk_free_ask() calls va_end() to free the private va list. */ +int fdisk_ask_print_set_va(struct fdisk_ask *ask, va_list ap) +{ + assert(ask); + va_copy(ask->data.print.va, ap); + ask->data.print.has_va = 1; + return 0; +} + +static int do_vprint(struct fdisk_context *cxt, int errnum, int type, + const char *fmt, va_list va) +{ + struct fdisk_ask *ask; + int rc; + + assert(cxt); + + ask = fdisk_new_ask(); + if (!ask) + return -ENOMEM; + + fdisk_ask_set_type(ask, type); + fdisk_ask_print_set_mesg(ask, fmt); + fdisk_ask_print_set_va(ask, va); + if (errnum >= 0) + fdisk_ask_print_set_errno(ask, errnum); + rc = fdisk_do_ask(cxt, ask); + + fdisk_free_ask(ask); + return rc; +} + +int fdisk_info(struct fdisk_context *cxt, const char *fmt, ...) +{ + int rc; + va_list ap; + + assert(cxt); + va_start(ap, fmt); + rc = do_vprint(cxt, -1, FDISK_ASKTYPE_INFO, fmt, ap); + va_end(ap); + return rc; +} + +int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...) +{ + int rc; + va_list ap; + + assert(cxt); + va_start(ap, fmt); + rc = do_vprint(cxt, errno, FDISK_ASKTYPE_WARN, fmt, ap); + va_end(ap); + return rc; +} + +int fdisk_warnx(struct fdisk_context *cxt, const char *fmt, ...) +{ + int rc; + va_list ap; + + assert(cxt); + va_start(ap, fmt); + rc = do_vprint(cxt, -1, FDISK_ASKTYPE_WARNX, fmt, ap); + va_end(ap); + return rc; +} #ifdef TEST_PROGRAM struct fdisk_label *fdisk_new_dos_label(struct fdisk_context *cxt) { return NULL; } diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index b1de7036c2..3c180639ea 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -227,6 +227,13 @@ struct fdisk_ask { char *range; /* by library generated list */ unsigned int relative:1; } num; + /* FDISK_ASKTYPE_{WARN,WARNX,..} */ + struct ask_print { + const char *mesg; + va_list va; + unsigned int has_va:1; + int errnum; /* errno */ + } print; } data; }; diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index 8cf5d65e1c..ec99d9f23e 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -25,6 +25,9 @@ extern "C" { #endif +#include +#include + struct fdisk_context; struct fdisk_label; struct fdisk_parttype; @@ -53,6 +56,9 @@ enum { FDISK_ASKTYPE_NONE = 0, FDISK_ASKTYPE_NUMBER, FDISK_ASKTYPE_OFFSET, + FDISK_ASKTYPE_WARN, + FDISK_ASKTYPE_WARNX, + FDISK_ASKTYPE_INFO }; /* init.c */ @@ -117,6 +123,8 @@ extern int fdisk_dos_enable_compatible(struct fdisk_label *lb, int enable); extern int fdisk_dos_is_compatible(struct fdisk_label *lb); /* ask.c */ +#define fdisk_is_ask(a, x) (fdisk_ask_get_type(a) == FDISK_ASKTYPE_ ## x) + extern struct fdisk_ask *fdisk_new_ask(void); extern void fdisk_reset_ask(struct fdisk_ask *ask); extern void fdisk_free_ask(struct fdisk_ask *ask); @@ -143,6 +151,17 @@ extern int fdisk_ask_number_set_result(struct fdisk_ask *ask, uint64_t result); extern int fdisk_ask_number_set_relative(struct fdisk_ask *ask, int relative); extern int fdisk_ask_number_is_relative(struct fdisk_ask *ask); +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, ...); + +extern int fdisk_ask_print_get_errno(struct fdisk_ask *ask); +extern int fdisk_ask_print_set_errno(struct fdisk_ask *ask, int errnum); +extern const char *fdisk_ask_print_get_mesg(struct fdisk_ask *ask); +extern int fdisk_ask_print_set_mesg(struct fdisk_ask *ask, const char *mesg); +extern int fdisk_ask_print_get_va(struct fdisk_ask *ask, va_list ap); +extern int fdisk_ask_print_set_va(struct fdisk_ask *ask, va_list ap); + #ifdef __cplusplus } #endif