login_tty: Make the replacement code work on BSD systems.
authorBruno Haible <bruno@clisp.org>
Fri, 17 Sep 2010 02:05:32 +0000 (04:05 +0200)
committerBruno Haible <bruno@clisp.org>
Fri, 17 Sep 2010 02:05:32 +0000 (04:05 +0200)
* lib/login_tty.c: Include <sys/ioctl.h>.
(login_tty): Use ioctl TIOCSCTTY when available.
* modules/login_tty (Depends-on): Add sys_ioctl.
Reported by Mats Erik Andersson <mats.andersson@gisladisker.se>.

ChangeLog
lib/login_tty.c
modules/login_tty

index 25c63a520daf0e23015b4fe27916fafa1fe085cf..e9a60cd2ec267449dee872e4d57c5cdbed407530 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2010-09-16  Bruno Haible  <bruno@clisp.org>
+
+       login_tty: Make the replacement code work on BSD systems.
+       * lib/login_tty.c: Include <sys/ioctl.h>.
+       (login_tty): Use ioctl TIOCSCTTY when available.
+       * modules/login_tty (Depends-on): Add sys_ioctl.
+       Reported by Mats Erik Andersson <mats.andersson@gisladisker.se>.
+
 2010-09-16  Bruno Haible  <bruno@clisp.org>
 
        login_tty: Stricter unit test.
index e5ec248eadff7a39702e01f2e59ce35d01e728b4..5bc7dbe76badfba9812b948d752667ba6c1b77e6 100644 (file)
@@ -21,6 +21,7 @@
 
 #include <fcntl.h>
 #include <unistd.h>
+#include <sys/ioctl.h>
 
 int
 login_tty (int slave_fd)
@@ -31,15 +32,22 @@ login_tty (int slave_fd)
   setsid ();
 
   /* Make fd the controlling terminal for the current process.
-     On Solaris: A terminal becomes the controlling terminal of a session
-     if it is being open()ed, at a moment when
-       1. it is not already the controlling terminal of some session, and
-       2. the process that open()s it is a session leader that does not have
-          a controlling terminal.
-     We assume condition 1, try to ensure condition 2, and then open() it.  */
+     On BSD and OSF/1: There is ioctl TIOCSCTTY for this purpose.
+     On Solaris:
+       A terminal becomes the controlling terminal of a session
+       if it is being open()ed, at a moment when
+         1. it is not already the controlling terminal of some session, and
+         2. the process that open()s it is a session leader that does not have
+            a controlling terminal.
+       We assume condition 1, try to ensure condition 2, and then open() it.
+   */
   for (i = 0; i < 3; i++)
     if (i != slave_fd)
       close (i);
+#ifdef TIOCSCTTY
+  if (ioctl (slave_fd, TIOCSCTTY, NULL) < 0)
+    return -1;
+#else
   {
     char *slave_name;
     int dummy_fd;
@@ -52,6 +60,7 @@ login_tty (int slave_fd)
       return -1;
     close (dummy_fd);
   }
+#endif
 
   /* Assign fd to the standard input, standard output, and standard error of
      the current process.  */
index 032472f17feb93af7c5974ac215cddd1c7b8b2f3..53c5caee1bc0d11a0363f10c5114f4070eede345 100644 (file)
@@ -8,6 +8,7 @@ m4/pty.m4
 
 Depends-on:
 pty
+sys_ioctl
 
 configure.ac:
 gl_FUNC_LOGIN_TTY