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
fdisk_LDADD += libuuid.la
endif
-
if HAVE_STATIC_FDISK
sbin_PROGRAMS += fdisk.static
fdisk_static_SOURCES = $(fdisk_SOURCES)
#include <time.h>
#include <limits.h>
#include <libsmartcols.h>
+#ifdef HAVE_LIBREADLINE
+# include <readline/readline.h>
+#endif
#include "c.h"
#include "xalloc.h"
__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)
{
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 */