From: Karel Zak Date: Tue, 3 Sep 2013 11:28:02 +0000 (+0200) Subject: libfdisk: extend fdisk_info() functionality X-Git-Tag: v2.24-rc1~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dd00d1b27dae225f5ffad8fe0790f35fab44bb11;p=thirdparty%2Futil-linux.git libfdisk: extend fdisk_info() functionality - add per message flags - add fdisk_colon() for "foo bar: bla bla..." messages - add fdisk_sinfo() as smart version of fdisk_info() Signed-off-by: Karel Zak --- diff --git a/fdisks/fdisk-ask.c b/fdisks/fdisk-ask.c index 47ed7f5f37..f3dffcb874 100644 --- a/fdisks/fdisk-ask.c +++ b/fdisks/fdisk-ask.c @@ -192,31 +192,48 @@ static int ask_offset(struct fdisk_context *cxt, return -1; } -static void fputs_info(const char *msg, FILE *out, char *buf, size_t bufsz) +static void fputs_info(struct fdisk_ask *ask, FILE *out, char *buf, size_t bufsz) { + const char *msg; + unsigned int flags; + + assert(ask); + + msg = fdisk_ask_print_get_mesg(ask); + flags = fdisk_ask_get_flags(ask); + + if (!msg) + return; if (info_count == 1) fputc('\n', out); + if (flags == 0 || !colors_wanted()) + goto simple; - if (msg && colors_wanted()) { + if (flags & FDISK_INFO_COLON) { + size_t sz; char *sep = _(": "); char *p = strstr(msg, sep); - if (p) { - size_t sz = strlen(sep); - - strncpy(buf, msg, bufsz); - buf[p - msg + sz] = '\0'; - - color_enable(UL_COLOR_BROWN); - fputs(buf, out); - color_disable(); - fputs(p + sz, out); - goto done; - } + if (!p) + goto simple; + + sz = strlen(sep); + strncpy(buf, msg, bufsz); + buf[p - msg + sz] = '\0'; + + color_enable(UL_COLOR_BROWN); + fputs(buf, out); + color_disable(); + fputs(p + sz, out); + + } else if (flags & FDISK_INFO_SUCCESS) { + color_enable(UL_COLOR_BOLD); + fputs(msg, out); + color_disable(); + } else { +simple: + fputs(msg, out); } - - fputs(msg, out); -done: fputc('\n', out); } @@ -239,7 +256,7 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask, return ask_offset(cxt, ask, buf, sizeof(buf)); case FDISK_ASKTYPE_INFO: info_count++; - fputs_info(fdisk_ask_print_get_mesg(ask), stdout, buf, sizeof(buf)); + fputs_info(ask, stdout, buf, sizeof(buf)); break; case FDISK_ASKTYPE_WARNX: color_fenable(UL_COLOR_RED, stderr); diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c index 6b39042508..3c1ba659bc 100644 --- a/libfdisk/src/ask.c +++ b/libfdisk/src/ask.c @@ -49,6 +49,19 @@ int fdisk_ask_set_type(struct fdisk_ask *ask, int type) return 0; } +unsigned int fdisk_ask_get_flags(struct fdisk_ask *ask) +{ + assert(ask); + return ask->flags; +} + +int fdisk_ask_set_flags(struct fdisk_ask *ask, unsigned int flags) +{ + assert(ask); + ask->flags = flags; + return 0; +} + int fdisk_do_ask(struct fdisk_context *cxt, struct fdisk_ask *ask) { int rc; @@ -535,7 +548,7 @@ int fdisk_ask_print_set_mesg(struct fdisk_ask *ask, const char *mesg) } static int do_vprint(struct fdisk_context *cxt, int errnum, int type, - const char *fmt, va_list va) + unsigned int flags, const char *fmt, va_list va) { struct fdisk_ask *ask; int rc; @@ -553,6 +566,7 @@ static int do_vprint(struct fdisk_context *cxt, int errnum, int type, } fdisk_ask_set_type(ask, type); + fdisk_ask_set_flags(ask, flags); fdisk_ask_print_set_mesg(ask, mesg); if (errnum >= 0) fdisk_ask_print_set_errno(ask, errnum); @@ -570,11 +584,39 @@ int fdisk_info(struct fdisk_context *cxt, const char *fmt, ...) assert(cxt); va_start(ap, fmt); - rc = do_vprint(cxt, -1, FDISK_ASKTYPE_INFO, fmt, ap); + rc = do_vprint(cxt, -1, FDISK_ASKTYPE_INFO, 0, fmt, ap); va_end(ap); return rc; } +/* "smart" version, allows to set flags for the message */ +int fdisk_sinfo(struct fdisk_context *cxt, + unsigned int flags, const char *fmt, ...) +{ + int rc; + va_list ap; + + assert(cxt); + va_start(ap, fmt); + rc = do_vprint(cxt, -1, FDISK_ASKTYPE_INFO, flags, fmt, ap); + va_end(ap); + return rc; + +} + +int fdisk_colon(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, FDISK_INFO_COLON, fmt, ap); + va_end(ap); + return rc; + +} + int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...) { int rc; @@ -582,7 +624,7 @@ int fdisk_warn(struct fdisk_context *cxt, const char *fmt, ...) assert(cxt); va_start(ap, fmt); - rc = do_vprint(cxt, errno, FDISK_ASKTYPE_WARN, fmt, ap); + rc = do_vprint(cxt, errno, FDISK_ASKTYPE_WARN, 0, fmt, ap); va_end(ap); return rc; } @@ -594,7 +636,7 @@ int fdisk_warnx(struct fdisk_context *cxt, const char *fmt, ...) assert(cxt); va_start(ap, fmt); - rc = do_vprint(cxt, -1, FDISK_ASKTYPE_WARNX, fmt, ap); + rc = do_vprint(cxt, -1, FDISK_ASKTYPE_WARNX, 0, fmt, ap); va_end(ap); return rc; } @@ -608,7 +650,8 @@ int fdisk_info_new_partition( char *str = size_to_human_string(SIZE_SUFFIX_3LETTER | SIZE_SUFFIX_SPACE, (uint64_t)(stop - start + 1) * cxt->sector_size); - rc = fdisk_info(cxt, _("Partition %d of type %s and of size %s is set\n"), + rc = fdisk_sinfo(cxt, FDISK_INFO_SUCCESS, + _("Partition %d of type %s and of size %s is set."), num, t ? t->name : _("Unknown"), str); free(str); return rc; diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h index 1c089a6126..8c9fc71e07 100644 --- a/libfdisk/src/fdiskP.h +++ b/libfdisk/src/fdiskP.h @@ -225,6 +225,7 @@ extern struct fdisk_label *fdisk_new_sun_label(struct fdisk_context *cxt); struct fdisk_ask { int type; /* FDISK_ASKTYPE_* */ char *query; + unsigned int flags; union { /* FDISK_ASKTYPE_{NUMBER,OFFSET} */ diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h index 1e1da6bd6a..0175a8d0f4 100644 --- a/libfdisk/src/libfdisk.h +++ b/libfdisk/src/libfdisk.h @@ -62,7 +62,11 @@ enum { FDISK_ASKTYPE_STRING }; - +/* extra flags for info massages (see fdisk_sinfo() */ +enum { + FDISK_INFO_COLON = 1, /* colorize "foo bar:" prefix in the message */ + FDISK_INFO_SUCCESS, /* info after successful action */ +}; /* init.c */ extern void fdisk_init_debug(int mask); @@ -205,6 +209,9 @@ extern const char *fdisk_ask_get_query(struct fdisk_ask *ask); extern int fdisk_ask_set_query(struct fdisk_ask *ask, const char *str); extern int fdisk_ask_get_type(struct fdisk_ask *ask); extern int fdisk_ask_set_type(struct fdisk_ask *ask, int type); +extern int fdisk_ask_set_flags(struct fdisk_ask *ask, unsigned int flags); +extern unsigned int fdisk_ask_get_flags(struct fdisk_ask *ask); + extern int fdisk_do_ask(struct fdisk_context *cxt, struct fdisk_ask *ask); extern const char *fdisk_ask_number_get_range(struct fdisk_ask *ask); @@ -244,6 +251,9 @@ 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_colon(struct fdisk_context *cxt, const char *fmt, ...); +extern int fdisk_sinfo(struct fdisk_context *cxt, unsigned int flags, 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, ...);