]> granicus.if.org Git - shadow/commitdiff
Merge Debian's patch 466_fflush-prompt
authornekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Wed, 26 Dec 2007 16:50:38 +0000 (16:50 +0000)
committernekral-guest <nekral-guest@5a98b0ae-9ef6-0310-add3-de5d479b70d7>
Wed, 26 Dec 2007 16:50:38 +0000 (16:50 +0000)
* libmisc/Makefile.am, lib/prototypes.h, libmisc/yesno.c, src/grpck.c,
src/pwck.c: move yes_or_no() from grpck/pwck to a separate
libmisc/yesno.c (with a read_only argument).
* libmisc/fields.c, libmisc/yesno.c: Make sure stdout is flushed before
reading the user's answer.

ChangeLog
lib/prototypes.h
libmisc/Makefile.am
libmisc/fields.c
libmisc/yesno.c [new file with mode: 0644]
src/grpck.c
src/pwck.c

index fd1386164c9a1b2240767c3e8038fabbafa425d2..787ebda00d9a2588d495e96bc406c07c84c7dad0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-12-26  Nicolas François  <nicolas.francois@centraliens.net>
+
+       Merge Debian's patch 466_fflush-prompt
+       * libmisc/Makefile.am, lib/prototypes.h, libmisc/yesno.c, src/grpck.c,
+       src/pwck.c: move yes_or_no() from grpck/pwck to a separate
+       libmisc/yesno.c (with a read_only argument).
+       * libmisc/fields.c, libmisc/yesno.c: Make sure stdout is flushed before
+       reading the user's answer.
+
 2007-12-26  Nicolas François  <nicolas.francois@centraliens.net>
 
        Merge Debian's patch 480_getopt_args_reorder
index f88f3db3cf6f5c96f0e7d8c438f4bd5f012c9b8d..64b205cda920b7af87471dd3bc369bca643ba37a 100644 (file)
@@ -194,4 +194,7 @@ extern struct group *xgetgrgid (gid_t);
 /* xgetspnam.c */
 extern struct spwd *xgetspnam(const char *);
 
+/* yesno.c */
+extern int yes_or_no (int read_only);
+
 #endif                         /* _PROTOTYPES_H */
index 95ce28cdb52f201005c5d2dbe8f25b2e1c36919c..3df8885e353b887ebfd9190e840486a5675b92f2 100644 (file)
@@ -55,4 +55,5 @@ libmisc_a_SOURCES = \
        xgetgrnam.c \
        xgetgrgid.c \
        xgetspnam.c \
-       xmalloc.c
+       xmalloc.c \
+       yesno.c
index 10dc352072f87d7d32a53422ec577ff7c990a97e..e021f06d11873264354c01ca4745d3db5d2f8a07 100644 (file)
@@ -71,6 +71,7 @@ void change_field (char *buf, size_t maxsize, const char *prompt)
                maxsize = sizeof (newf);
 
        printf ("\t%s [%s]: ", prompt, buf);
+       fflush (stdout);
        if (fgets (newf, maxsize, stdin) != newf)
                return;
 
diff --git a/libmisc/yesno.c b/libmisc/yesno.c
new file mode 100644 (file)
index 0000000..e536456
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * Copyright 1992 - 1994, Julianne Frances Haugh
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Julianne F. Haugh nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JULIE HAUGH AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL JULIE HAUGH OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Common code for yes/no prompting
+ *
+ * Used by pwck.c and grpck.c
+ */
+
+#include "config.h"
+
+#ident "$Id$"
+
+#include <stdio.h>
+#include "prototypes.h"
+
+/*
+ * yes_or_no - get answer to question from the user
+ *
+ *     It returns 0 if no.
+ *
+ *     If the read_only flag is set, it will print No, and will return 0.
+ */
+int yes_or_no (int read_only)
+{
+       char buf[80];
+
+       /*
+        * In read-only mode all questions are answered "no".
+        */
+       if (read_only) {
+               printf (_("No\n"));
+               return 0;
+       }
+
+       /*
+        * Typically, there's a prompt on stdout, sometimes unflushed.
+        */
+       fflush (stdout);
+
+       /*
+        * Get a line and see what the first character is.
+        */
+       /* TODO: use gettext */
+       if (fgets (buf, sizeof buf, stdin))
+               return buf[0] == 'y' || buf[0] == 'Y';
+
+       return 0;
+}
index 1b7615980aa9439afaba833d6c41a382893d7700..ecf22b17929c182f5de3a3a42dab6d4493a59359 100644 (file)
@@ -74,7 +74,6 @@ static int read_only = 0;
 
 /* local function prototypes */
 static void usage (void);
-static int yes_or_no (void);
 static void delete_member (char **, const char *);
 
 /*
@@ -90,30 +89,6 @@ static void usage (void)
        exit (E_USAGE);
 }
 
-/*
- * yes_or_no - get answer to question from the user
- */
-static int yes_or_no (void)
-{
-       char buf[80];
-
-       /*
-        * In read-only mode all questions are answered "no".
-        */
-       if (read_only) {
-               printf (_("No\n"));
-               return 0;
-       }
-
-       /*
-        * Get a line and see what the first character is.
-        */
-       if (fgets (buf, sizeof buf, stdin))
-               return buf[0] == 'y' || buf[0] == 'Y';
-
-       return 0;
-}
-
 /*
  * delete_member - delete an entry in a list of members
  */
@@ -296,7 +271,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        /*
@@ -352,7 +327,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (yes_or_no ())
+                       if (yes_or_no (read_only))
                                goto delete_gr;
                }
 
@@ -389,7 +364,7 @@ int main (int argc, char **argv)
                                grp->gr_name, grp->gr_mem[i]);
                        printf (_("delete member '%s'? "), grp->gr_mem[i]);
 
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        SYSLOG ((LOG_INFO, "delete member '%s' group '%s'",
@@ -414,7 +389,7 @@ int main (int argc, char **argv)
                                printf (_("add group '%s' in %s ?"),
                                        grp->gr_name, sgr_file);
                                errors++;
-                               if (yes_or_no ()) {
+                               if (yes_or_no (read_only)) {
                                        struct sgrp sg;
                                        struct group gr;
                                        static char *empty = NULL;
@@ -501,7 +476,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        /*
@@ -557,7 +532,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (yes_or_no ())
+                       if (yes_or_no (read_only))
                                goto delete_sg;
                }
 
@@ -570,7 +545,7 @@ int main (int argc, char **argv)
                                grp_file);
                        printf (_("delete line '%s'? "), sge->line);
                        errors++;
-                       if (yes_or_no ())
+                       if (yes_or_no (read_only))
                                goto delete_sg;
                } else {
                        /**
@@ -612,7 +587,7 @@ int main (int argc, char **argv)
                        printf (_("delete administrative member '%s'? "),
                                sgr->sg_adm[i]);
 
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        SYSLOG ((LOG_INFO,
@@ -640,7 +615,7 @@ int main (int argc, char **argv)
                                sgr->sg_name, sgr->sg_mem[i]);
                        printf (_("delete member '%s'? "), sgr->sg_mem[i]);
 
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        SYSLOG ((LOG_INFO,
index 5fdf79b4121bbb20f179d54d5a8e44cc0a53d83b..8bc5762673acd9395d98293e4244a98f3c27bc33 100644 (file)
@@ -73,7 +73,6 @@ static int quiet = 0;         /* don't report warnings, only errors */
 
 /* local function prototypes */
 static void usage (void);
-static int yes_or_no (void);
 
 /*
  * usage - print syntax message and exit
@@ -85,31 +84,6 @@ static void usage (void)
        exit (E_USAGE);
 }
 
-/*
- * yes_or_no - get answer to question from the user
- */
-static int yes_or_no (void)
-{
-       char buf[80];
-
-       /*
-        * In read-only mode all questions are answered "no".
-        */
-
-       if (read_only) {
-               printf (_("No\n"));
-               return 0;
-       }
-
-       /*
-        * Get a line and see what the first character is.
-        */
-       if (fgets (buf, sizeof buf, stdin))
-               return buf[0] == 'y' || buf[0] == 'Y';
-
-       return 0;
-}
-
 /*
  * pwck - verify password file integrity
  */
@@ -261,7 +235,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        /*
@@ -316,7 +290,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (yes_or_no ())
+                       if (yes_or_no (read_only))
                                goto delete_pw;
                }
 
@@ -383,7 +357,7 @@ int main (int argc, char **argv)
                                printf (_("add user '%s' in %s? "),
                                        pwd->pw_name, spw_file);
                                errors++;
-                               if (yes_or_no ()) {
+                               if (yes_or_no (read_only)) {
                                        struct spwd sp;
                                        struct passwd pw;
 
@@ -462,7 +436,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (!yes_or_no ())
+                       if (!yes_or_no (read_only))
                                continue;
 
                        /*
@@ -517,7 +491,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (yes_or_no ())
+                       if (yes_or_no (read_only))
                                goto delete_spw;
                }
 
@@ -538,7 +512,7 @@ int main (int argc, char **argv)
                        /*
                         * prompt the user to delete the entry or not
                         */
-                       if (yes_or_no ())
+                       if (yes_or_no (read_only))
                                goto delete_spw;
                }