changeset 13691:353ba0b294e1

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>.
author Bruno Haible <bruno@clisp.org>
date Fri, 17 Sep 2010 04:05:32 +0200
parents 4a7853b78e64
children 4ca8fd7377b9
files ChangeLog lib/login_tty.c modules/login_tty
diffstat 3 files changed, 24 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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.
--- a/lib/login_tty.c
+++ b/lib/login_tty.c
@@ -21,6 +21,7 @@
 
 #include <fcntl.h>
 #include <unistd.h>
+#include <sys/ioctl.h>
 
 int
 login_tty (int slave_fd)
@@ -31,15 +32,22 @@
   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 @@
       return -1;
     close (dummy_fd);
   }
+#endif
 
   /* Assign fd to the standard input, standard output, and standard error of
      the current process.  */
--- a/modules/login_tty
+++ b/modules/login_tty
@@ -8,6 +8,7 @@
 
 Depends-on:
 pty
+sys_ioctl
 
 configure.ac:
 gl_FUNC_LOGIN_TTY