]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
sfdisk: cleanup prompt usage
authorKarel Zak <kzak@redhat.com>
Fri, 27 Mar 2015 14:04:58 +0000 (15:04 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 27 Mar 2015 14:04:58 +0000 (15:04 +0100)
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>
disk-utils/sfdisk.c

index c69cae9ce1d7f35310411cc0e4b368ba1eb07ab3..6b60d040e115bc167582e72aa5a89804aee17bca 100644 (file)
@@ -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"));