diff options
author | Karel Zak | 2015-03-27 15:04:58 +0100 |
---|---|---|
committer | Karel Zak | 2015-03-27 15:04:58 +0100 |
commit | 3ba8e422a040c282483803f8ffe6279b93bc6139 (patch) | |
tree | 09b0a7c3ad21ddcad434731de0360dfab4591cad /disk-utils/sfdisk.c | |
parent | cfdisk: provide extra partinfo with "x" (diff) | |
download | kernel-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.c | 19 |
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")); |