diff options
author | Eric Andersen <andersen@codepoet.org> | 2001-05-08 19:58:20 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2001-05-08 19:58:20 +0000 |
commit | a3e03be058a9b9a2caf36c5b18f66c0fc3df3bf0 (patch) | |
tree | 2ad333bd1e56590e981eba3c54f6057cbf5758bb /libutil/login_tty.c | |
parent | 6c0899094d50e0d35d699594bfcd9cae4164abe2 (diff) |
Add in libutil, based on Cory Visi's variant of Michael Shmulevich's libutil
port. I have reworked the code quite a bit so that the stuff that is supposed
to be in libc is in libc, and I added a bunch of missing stuff so the libutil
interface matches that of glibc's libutil. The only caveat is that
libutil/login.c is currently a stub.
-Erik
Diffstat (limited to 'libutil/login_tty.c')
-rw-r--r-- | libutil/login_tty.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/libutil/login_tty.c b/libutil/login_tty.c new file mode 100644 index 000000000..d354407f2 --- /dev/null +++ b/libutil/login_tty.c @@ -0,0 +1,69 @@ +/*- + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* Make FD be the controlling terminal, stdin, stdout, and stderr; + then close FD. Returns 0 on success, nonzero on error. */ + +#include <sys/param.h> +#include <sys/ioctl.h> +#include <unistd.h> +#include <fcntl.h> +#include <utmp.h> + +int login_tty(int fd) +{ + (void) setsid(); +#ifdef TIOCSCTTY + if (ioctl(fd, TIOCSCTTY, (char *)NULL) == -1) + return (-1); +#else + { + /* This might work. */ + char *fdname = ttyname (fd); + int newfd; + if (fdname) + { + if (fd != 0) + (void) close (0); + if (fd != 1) + (void) close (1); + if (fd != 2) + (void) close (2); + newfd = open (fdname, O_RDWR); + (void) close (newfd); + } + } +#endif + (void) dup2(fd, 0); + (void) dup2(fd, 1); + (void) dup2(fd, 2); + if (fd > 2) + (void) close(fd); + return (0); +} |