summaryrefslogtreecommitdiffstats
path: root/disk-utils/sfdisk.c
diff options
context:
space:
mode:
authorKarel Zak2015-03-27 15:04:58 +0100
committerKarel Zak2015-03-27 15:04:58 +0100
commit3ba8e422a040c282483803f8ffe6279b93bc6139 (patch)
tree09b0a7c3ad21ddcad434731de0360dfab4591cad /disk-utils/sfdisk.c
parentcfdisk: provide extra partinfo with "x" (diff)
downloadkernel-qcow2-util-linux-3ba8e422a040c282483803f8ffe6279b93bc6139.tar.gz
kernel-qcow2-util-linux-3ba8e422a040c282483803f8ffe6279b93bc6139.tar.xz
kernel-qcow2-util-linux-3ba8e422a040c282483803f8ffe6279b93bc6139.zip
sfdisk: cleanup prompt usage
Let's use fgets-like callback only when compiled with readline, otherwise (and also for non-tty) print prompt by printf(). Reported-by: Ruediger Meier <sweet_f_a@gmx.de> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils/sfdisk.c')
-rw-r--r--disk-utils/sfdisk.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c
index c69cae9ce..6b60d040e 100644
--- a/disk-utils/sfdisk.c
+++ b/disk-utils/sfdisk.c
@@ -1088,6 +1088,7 @@ static int is_device_used(struct sfdisk *sf)
return 0;
}
+#ifdef HAVE_LIBREADLINE
static char *sfdisk_fgets(struct fdisk_script *dp,
char *buf, size_t bufsz, FILE *f)
{
@@ -1097,8 +1098,7 @@ static char *sfdisk_fgets(struct fdisk_script *dp,
assert(buf);
assert(bufsz > 2);
-#ifdef HAVE_LIBREADLINE
- if (isatty(STDIN_FILENO)) {
+ if (sf->interactive) {
char *p = readline(sf->prompt);
size_t len;
@@ -1112,14 +1112,12 @@ static char *sfdisk_fgets(struct fdisk_script *dp,
buf[len] = '\n'; /* append \n to be compatible with libc fgetc() */
buf[len + 1] = '\0';
free(p);
+ fflush(stdout);
return buf;
}
-#endif
- if (sf->prompt)
- fputs(sf->prompt, stdout);
- fflush(stdout);
return fgets(buf, bufsz, f);
}
+#endif
/*
* sfdisk <device> [[-N] <partno>]
@@ -1151,7 +1149,9 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
if (!dp)
err(EXIT_FAILURE, _("failed to allocate script handler"));
fdisk_set_script(sf->cxt, dp);
+#ifdef HAVE_LIBREADLINE
fdisk_script_set_fgets(dp, sfdisk_fgets);
+#endif
fdisk_script_set_userdata(dp, (void *) sf);
/*
@@ -1268,6 +1268,13 @@ static int command_fdisk(struct sfdisk *sf, int argc, char **argv)
sf->prompt = xstrdup(SFDISK_PROMPT);
}
+#ifndef HAVE_LIBREADLINE
+ if (sf->prompt)
+ fputs(sf->prompt, stdout);
+#else
+ if (!sf->interactive && sf->prompt)
+ fputs(sf->prompt, stdout);
+#endif
rc = fdisk_script_read_line(dp, stdin, buf, sizeof(buf));
if (rc < 0) {
DBG(PARSE, ul_debug("script parsing failed, trying sfdisk specific commands"));