Mercurial > hg > octave-lyh > gnulib-hg
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. */