]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: add GNU Readline support to fdisk
authorKarel Zak <kzak@redhat.com>
Wed, 25 Mar 2015 09:31:37 +0000 (10:31 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 25 Mar 2015 09:31:37 +0000 (10:31 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
disk-utils/Makemodule.am
disk-utils/fdisk.c

index 35a02bd6ed2c4afe7a5671a7fd30380401f9ca94..dd4e96b7d52436e336533f06854876fffcc653d1 100644 (file)
@@ -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)
index 6c63d06cd630495613aa0cb4e4f3ec88642bfa23..0e3f5799783f24bfe23bcc440c5a39070b3ad4b4 100644 (file)
@@ -22,6 +22,9 @@
 #include <time.h>
 #include <limits.h>
 #include <libsmartcols.h>
+#ifdef HAVE_LIBREADLINE
+# include <readline/readline.h>
+#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 */