Re: [Fwd: Strange-Dangerous behaviour in Cygwin]

2005-05-08 Thread Paul Eggert
Jim Meyering [EMAIL PROTECTED] writes:

 Alternative opinions (or patches to yesno.c) welcome.

In the POSIX locale we don't have any choice; we have to accept
any answer with a leading y as yes.  See:

http://www.opengroup.org/onlinepubs/95399/basedefs/xbd_chap07.html#tag_07_03_06_01

Come to think of it, coreutils is too generous, as it ignores leading
white space; POSIX doesn't allow this, and Solaris 9 agrees with
POSIX.  GNU used to agree with POSIX until Ulrich Drepper's change
dated 1996 to use rpmatch if available, and I think the disagreement
with POSIX was unintended.  So I installed this patch.  (It's not
often that I get to fix one of his bugs!  :-)

2005-05-08  Paul Eggert  [EMAIL PROTECTED]

* NEWS: cp, ln, mv, rm no longer discard white space when intepreting
responses.
* lib/yesno.c: Include getline.h, not ctype.h.
(yesno): Don't remove leading white space; POSIX doesn't allow it.
Use getline to remove arbitrary restriction on response length.

--- NEWS6 May 2005 17:56:49 -   1.286
+++ NEWS8 May 2005 16:52:17 -
@@ -50,6 +50,12 @@ GNU coreutils NEWS  
 
 ** Changes for better conformance to POSIX
 
+  cp, ln, mv, rm changes:
+
+Leading white space is now significant in responses to yes-or-no questions.
+For example, if rm asks remove regular file `foo'? and you respond
+with  y (i.e., space before y), it counts as no.
+
   dd changes:
 
 On a QUIT or PIPE signal, dd now exits without printing statistics.
--- lib/yesno.c 4 Oct 2004 20:18:43 -   1.12
+++ lib/yesno.c 8 May 2005 16:46:42 -
@@ -1,5 +1,7 @@
 /* yesno.c -- read a yes/no response from stdin
-   Copyright (C) 1990, 1998, 2001, 2003, 2004 Free Software Foundation, Inc.
+
+   Copyright (C) 1990, 1998, 2001, 2003, 2004, 2005 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
@@ -21,36 +23,31 @@
 
 #include yesno.h
 
-#include ctype.h
 #include stdlib.h
 #include stdio.h
 
-#if USE_UNLOCKED_IO
-# include unlocked-io.h
-#endif
+#include getline.h
 
-/* Read one line from standard input
-   and return nonzero if that line begins with y or Y,
-   otherwise return 0. */
+/* Return true if we read an affirmative line from standard input.  */
 
 extern int rpmatch (char const *response);
 
 bool
 yesno (void)
 {
-  /* We make some assumptions here:
- a) leading white space in the response are not vital
- b) the first 128 characters of the answer are enough (the rest can
-   be ignored)
- I cannot think for a situation where this is not ok.  [EMAIL PROTECTED]  
*/
-  char buf[128];
-  int len = 0;
-  int c;
-
-  while ((c = getchar ()) != EOF  c != '\n')
-if ((len  0  len  127) || (len == 0  !isspace (c)))
-  buf[len++] = c;
-  buf[len] = '\0';
+  char *response = NULL;
+  size_t response_size = 0;
+  ssize_t response_len = getline (response, response_size, stdin);
+  bool yes;
+
+  if (response_len = 0)
+yes = false;
+  else
+{
+  response[response_len - 1] = '\0';
+  yes = (0  rpmatch (response));
+}
 
-  return rpmatch (buf) == 1;
+  free (response);
+  return yes;
 }


___
Bug-coreutils mailing list
Bug-coreutils@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-coreutils


Re: [Fwd: Strange-Dangerous behaviour in Cygwin]

2005-05-07 Thread Jim Meyering
Eric Blake [EMAIL PROTECTED] wrote:
 Relevant clips from this cygwin bug report.  When tty settings are weird
 (I'm not sure whether the bug is in cygwin, xterm, or just bad tty
 settings that could be reproduced elsewhere), backspace only repositions
 the cursor on screen, so that the actual buffer read by yesno() can
 contain y\bn instead of n.  Is it possible for lib/yesno.c to be a
 little more paranoid and check that there are not embedded characters
 normally used in terminal editing that would undo the first character?

I don't think changing yesno would be appropriate in this case.

What if the string is n\by?
What if \b is not the erase character?
What if the string is yes and `e' is the `erase' character?
Should it handle both DEL and ERASE characters?
Should it also handle word-erase and line-erase characters?
I know you said `normally used...', so I assume you wanted
something simple, befitting yesno's status, but I don't see
an appropriate way to solve the problem by changing yesno.

Alternative opinions (or patches to yesno.c) welcome.


___
Bug-coreutils mailing list
Bug-coreutils@gnu.org
http://lists.gnu.org/mailman/listinfo/bug-coreutils