]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: extend fdisk_info() functionality
authorKarel Zak <kzak@redhat.com>
Tue, 3 Sep 2013 11:28:02 +0000 (13:28 +0200)
committerKarel Zak <kzak@redhat.com>
Mon, 16 Sep 2013 14:47:09 +0000 (16:47 +0200)
 - 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 <kzak@redhat.com>
fdisks/fdisk-ask.c
libfdisk/src/ask.c
libfdisk/src/fdiskP.h
libfdisk/src/libfdisk.h

index 47ed7f5f37f7c335bb0917e5076db29e2c5607db..f3dffcb8748eb9f6de3841627c6b75a1f097d5dc 100644 (file)
@@ -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);
index 6b390425088c9743d9620eba41ccacbddb32b3b5..3c1ba659bcee3331d884e14bd5102941e361a11d 100644 (file)
@@ -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;
index 1c089a612657729c9d9cf324eb57ad2deedb0989..8c9fc71e07928e5611d431baf738fdb4873984fe 100644 (file)
@@ -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} */
index 1e1da6bd6a2dfeceac8c1ad9352273ba744280fd..0175a8d0f412a321bb53439fb38800b0a6b7df06 100644 (file)
@@ -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, ...);