fdisk: add GNU Readline support to fdisk
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
0273afda3c
commit
740c36f657
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
#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)) {
|
||||
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;
|
||||
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 */
|
||||
|
|
Loading…
Reference in New Issue