-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 According to Jim Meyering on 8/19/2007 12:47 AM: >> Jim, you are affected the most - which would you rather see, a relatively >> big patch to yesno/closein that potentially changes API, or a one-line >> patch to each of your five affected programs? > > The complexity of the yesno-modifying approach seems too high, > and not limited just to yesno, so I think the per-application > one-line changes are better.
Here's what I'm committing to gnulib; a patch for coreutils will follow. 2007-08-19 Eric Blake <[EMAIL PROTECTED]> Test yesno in combination with closein. * lib/yesno.c (yesno): Document use of stdin. * modules/yesno-tests (Files): New module. * tests/test-yesno.c (main): New file. * tests/test-yesno.sh: Likewise. - -- Don't work too hard, make some time for fun as well! Eric Blake [EMAIL PROTECTED] -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.5 (Cygwin) Comment: Public key at home.comcast.net/~ericblake/eblake.gpg Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFGyGEc84KuGfSFAYARAktLAKCEpwYZTx1AXP93bB12nZDLHPKTdACgtmpc xTz7FUZG5iqa68XreZ0t+YI= =9W1R -----END PGP SIGNATURE-----
Index: lib/yesno.c =================================================================== RCS file: /sources/gnulib/gnulib/lib/yesno.c,v retrieving revision 1.17 diff -u -p -r1.17 yesno.c --- lib/yesno.c 14 Dec 2006 18:47:36 -0000 1.17 +++ lib/yesno.c 19 Aug 2007 15:07:18 -0000 @@ -1,6 +1,6 @@ /* yesno.c -- read a yes/no response from stdin - Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006 Free + Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify @@ -28,10 +28,14 @@ # include "getline.h" #endif -/* Return true if we read an affirmative line from standard input. */ - extern int rpmatch (char const *response); +/* Return true if we read an affirmative line from standard input. + + Since this function uses stdin, it is suggested that the caller not + use STDIN_FILENO directly, and also that the line + atexit(close_stdin) be added to main(). */ + bool yesno (void) { Index: modules/yesno-tests =================================================================== RCS file: modules/yesno-tests diff -N modules/yesno-tests --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ modules/yesno-tests 19 Aug 2007 15:07:18 -0000 @@ -0,0 +1,15 @@ +Files: +tests/test-yesno.c +tests/test-yesno.sh + +Depends-on: +closein + +configure.ac: + +Makefile.am: +TESTS += test-yesno.sh +TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' +check_PROGRAMS += test-yesno +EXTRA_DIST += test-yesno.sh +test_yesno_LDADD = $(LDADD) @LIBINTL@ Index: tests/test-yesno.c =================================================================== RCS file: tests/test-yesno.c diff -N tests/test-yesno.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/test-yesno.c 19 Aug 2007 15:07:18 -0000 @@ -0,0 +1,51 @@ +/* Test of yesno module. + Copyright (C) 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "closein.h" +#include "yesno.h" + +char *program_name; + +/* Test yesno. Without arguments, read one line. If first argument + is zero, close stdin before attempting to read one line. + Otherwise, read the number of lines specified by first + argument. */ +int +main (int argc, char **argv) +{ + int i = 1; + program_name = argv[0]; + /* yesno recommends that all clients use close_stdin in main. */ + atexit (close_stdin); + + if (1 < argc) + i = atoi (argv[1]); + if (!i) + { + i = 1; + close (0); + } + while (i--) + puts (yesno () ? "Y" : "N"); + return 0; +} Index: tests/test-yesno.sh =================================================================== RCS file: tests/test-yesno.sh diff -N tests/test-yesno.sh --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ tests/test-yesno.sh 19 Aug 2007 15:07:18 -0000 @@ -0,0 +1,58 @@ +#!/bin/sh + +tmpfiles= +trap 'rm -fr $tmpfiles' 1 2 3 15 + +p=t-yesno- +tmpfiles="${p}in.tmp ${p}xout.tmp ${p}out.tmp" + +# For now, only test with C locale +LC_ALL=C +export LC_ALL + +# Test with seekable stdin; followon process must see remaining data +cat <<EOF > ${p}in.tmp +nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn - entire line consumed +yn - backspace does not change result +y +does not match either yesexpr or noexpr +n +EOF +cat <<EOF > ${p}xout.tmp +N +Y +Y +N +n +EOF +(./test-yesno${EXEEXT}; ./test-yesno${EXEEXT} 3; cat) \ + < ${p}in.tmp > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +(./test-yesno${EXEEXT} 3; ./test-yesno${EXEEXT}; cat) \ + < ${p}in.tmp > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Test for behavior on pipe +cat <<EOF > ${p}xout.tmp +Y +N +EOF +echo yes | ./test-yesno${EXEEXT} 2 > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Test for behavior on EOF +cat <<EOF > ${p}xout.tmp +N +EOF +./test-yesno${EXEEXT} </dev/null > ${p}out.tmp || exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Test for behavior when stdin is closed +./test-yesno${EXEEXT} 0 <&- > ${p}out.tmp && exit 1 +cmp ${p}xout.tmp ${p}out.tmp || exit 1 + +# Cleanup +rm -fr $tmpfiles + +exit 0