From: Karel Zak Date: Fri, 27 Mar 2015 14:04:58 +0000 (+0100) Subject: sfdisk: cleanup prompt usage X-Git-Tag: v2.27-rc1~298 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ba8e422a040c282483803f8ffe6279b93bc6139;p=thirdparty%2Futil-linux.git 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 Signed-off-by: Karel Zak --- diff --git a/disk-utils/sfdisk.c b/disk-utils/sfdisk.c index c69cae9ce1..6b60d040e1 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 [[-N] ] @@ -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"));