changeset 16934:aac870b341ad

grantpt: Relax requirement regarding invalid file descriptors. * lib/grantpt.c: Don't include <fcntl.h>. (grantpt): Don't verify the validity of the file descriptor. * modules/grantpt (Depends-on): Remove fcntl-h. * tests/test-grantpt.c (main): Allow grantpt to succeed for invalid file descriptors. * doc/posix-functions/grantpt.texi: Document more platforms on which grantpt succeeds for invalid file descriptors. Reported by Rich Felker <dalias@aerifal.cx>.
author Bruno Haible <bruno@clisp.org>
date Fri, 22 Jun 2012 12:36:47 +0200
parents d86f5b7cd392
children 498a2211d839
files ChangeLog doc/posix-functions/grantpt.texi lib/grantpt.c modules/grantpt tests/test-grantpt.c
diffstat 5 files changed, 38 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2012-06-22  Bruno Haible  <bruno@clisp.org>
+
+	grantpt: Relax requirement regarding invalid file descriptors.
+	* lib/grantpt.c: Don't include <fcntl.h>.
+	(grantpt): Don't verify the validity of the file descriptor.
+	* modules/grantpt (Depends-on): Remove fcntl-h.
+	* tests/test-grantpt.c (main): Allow grantpt to succeed for invalid
+	file descriptors.
+	* doc/posix-functions/grantpt.texi: Document more platforms on which
+	grantpt succeeds for invalid file descriptors.
+	Reported by Rich Felker <dalias@aerifal.cx>.
+
 2012-06-22  Bruno Haible  <bruno@clisp.org>
 
 	fbufmode test: Don't test unportable behaviour.
--- a/doc/posix-functions/grantpt.texi
+++ b/doc/posix-functions/grantpt.texi
@@ -20,5 +20,5 @@
 IRIX 5.3.
 @item
 This function reports success for invalid file descriptors on some platforms:
-Cygwin 1.7.9.
+OpenBSD, Cygwin 1.7.9, musl libc.
 @end itemize
--- a/lib/grantpt.c
+++ b/lib/grantpt.c
@@ -21,7 +21,6 @@
 
 #include <assert.h>
 #include <errno.h>
-#include <fcntl.h>
 #include <string.h>
 #include <sys/wait.h>
 #include <unistd.h>
@@ -50,8 +49,6 @@
 #if defined __OpenBSD__
   /* On OpenBSD, master and slave of a pseudo-terminal are allocated together,
      through an ioctl on /dev/ptm.  There is no need for grantpt().  */
-  if (fcntl (fd, F_GETFD) < 0)
-    return -1;
   return 0;
 #else
   /* This function is most often called from a process without 'root'
--- a/modules/grantpt
+++ b/modules/grantpt
@@ -9,7 +9,6 @@
 Depends-on:
 stdlib
 extensions
-fcntl-h         [test $HAVE_GRANTPT = 0]
 pt_chown        [test $HAVE_GRANTPT = 0]
 waitpid         [test $HAVE_GRANTPT = 0]
 configmake      [test $HAVE_GRANTPT = 0]
--- a/tests/test-grantpt.c
+++ b/tests/test-grantpt.c
@@ -28,22 +28,36 @@
 int
 main (void)
 {
-  /* Test behaviour for invalid file descriptors.  */
+  /* Test behaviour for invalid file descriptors.
+     These calls don't fail on OpenBSD (with gnulib's replacement) and on
+     musl libc.  */
   {
+    int ret;
+
     errno = 0;
-    ASSERT (grantpt (-1) == -1);
-    ASSERT (errno == EBADF
-            || errno == EINVAL /* seen on FreeBSD 6.4 */
-            || errno == 0 /* seen on Solaris 8 */
-           );
+    ret = grantpt (-1);
+    if (ret != 0)
+      {
+        ASSERT (ret == -1);
+        ASSERT (errno == EBADF
+                || errno == EINVAL /* seen on FreeBSD 6.4 */
+                || errno == 0 /* seen on Solaris 8 */
+               );
+      }
   }
   {
+    int ret;
+
     errno = 0;
-    ASSERT (grantpt (99) == -1);
-    ASSERT (errno == EBADF
-            || errno == EINVAL /* seen on FreeBSD 6.4 */
-            || errno == 0 /* seen on Solaris 8 */
-           );
+    ret = grantpt (99);
+    if (ret != 0)
+      {
+        ASSERT (ret == -1);
+        ASSERT (errno == EBADF
+                || errno == EINVAL /* seen on FreeBSD 6.4 */
+                || errno == 0 /* seen on Solaris 8 */
+               );
+      }
   }
 
   return 0;