From: Karel Zak Date: Wed, 25 Mar 2015 09:31:37 +0000 (+0100) Subject: fdisk: add GNU Readline support to fdisk X-Git-Tag: v2.27-rc1~320 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=740c36f657ddef7b8adf829230e91995a0dd3143;p=thirdparty%2Futil-linux.git fdisk: add GNU Readline support to fdisk Signed-off-by: Karel Zak --- diff --git a/disk-utils/Makemodule.am b/disk-utils/Makemodule.am index 35a02bd6ed..dd4e96b7d5 100644 --- a/disk-utils/Makemodule.am +++ b/disk-utils/Makemodule.am @@ -134,7 +134,8 @@ fdisk_SOURCES = \ disk-utils/fdisk-list.c \ disk-utils/fdisk-list.h -fdisk_LDADD = $(LDADD) libcommon.la libfdisk.la libsmartcols.la libtcolors.la +fdisk_LDADD = $(LDADD) libcommon.la libfdisk.la \ + libsmartcols.la libtcolors.la $(READLINE_LIBS) fdisk_CFLAGS = $(AM_CFLAGS) -I$(ul_libfdisk_incdir) -I$(ul_libsmartcols_incdir) if BUILD_LIBBLKID @@ -147,7 +148,6 @@ fdisk_CFLAGS += -I$(ul_libuuid_incdir) fdisk_LDADD += libuuid.la endif - if HAVE_STATIC_FDISK sbin_PROGRAMS += fdisk.static fdisk_static_SOURCES = $(fdisk_SOURCES) diff --git a/disk-utils/fdisk.c b/disk-utils/fdisk.c index 6c63d06cd6..0e3f579978 100644 --- a/disk-utils/fdisk.c +++ b/disk-utils/fdisk.c @@ -22,6 +22,9 @@ #include #include #include +#ifdef HAVE_LIBREADLINE +# include +#endif #include "c.h" #include "xalloc.h" @@ -58,6 +61,22 @@ static void fdiskprog_init_debug(void) __UL_INIT_DEBUG(fdisk, FDISKPROG_DEBUG_, 0, FDISK_DEBUG); } +#ifdef HAVE_LIBREADLINE +static char *rl_fgets(char *s, int n, FILE *stream, const char *prompt) +{ + char *p; + + rl_outstream = stream; + p = readline(prompt); + if (!p) + return NULL; + + memcpy(s, p, n); + free(p); + return s; +} +#endif + int get_user_reply(struct fdisk_context *cxt, const char *prompt, char *buf, size_t bufsz) { @@ -65,20 +84,37 @@ int get_user_reply(struct fdisk_context *cxt, const char *prompt, size_t sz; do { - fputs(prompt, stdout); - fflush(stdout); - - if (!fgets(buf, bufsz, stdin)) { - if (fdisk_label_is_changed(fdisk_get_label(cxt, NULL))) { - fprintf(stderr, _("\nDo you really want to quit? ")); - - if (fgets(buf, bufsz, stdin) && !rpmatch(buf)) - continue; - } - fdisk_unref_context(cxt); - exit(EXIT_FAILURE); - } else - break; +#ifdef HAVE_LIBREADLINE + if (isatty(STDIN_FILENO)) { + if (!rl_fgets(buf, bufsz, stdout, prompt)) { + if (fdisk_label_is_changed(fdisk_get_label(cxt, NULL))) { + if (rl_fgets(buf, bufsz, stderr, + _("\nDo you really want to quit? ")) + && !rpmatch(buf)) + continue; + } + fdisk_unref_context(cxt); + exit(EXIT_FAILURE); + } else + break; + } + else +#endif + { + fputs(prompt, stdout); + fflush(stdout); + if (!fgets(buf, bufsz, stdin)) { + if (fdisk_label_is_changed(fdisk_get_label(cxt, NULL))) { + fprintf(stderr, _("\nDo you really want to quit? ")); + + if (fgets(buf, bufsz, stdin) && !rpmatch(buf)) + continue; + } + fdisk_unref_context(cxt); + exit(EXIT_FAILURE); + } else + break; + } } while (1); for (p = buf; *p && !isgraph(*p); p++); /* get first non-blank */