diff options
author | Thomas Adam <thomas@xteddy.org> | 2017-01-23 12:20:43 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2017-01-23 12:20:43 +0000 |
commit | b3a724f30ced2f3be3a52fb54c6551b2b6c6de63 (patch) | |
tree | eba69fe13464cf92fcf64cf32505e308949718b6 /pty.c | |
parent | d2eab39ffa42a0d5d8e796cbe3352f951f42b4f7 (diff) | |
parent | 98e7fbb2acee0238381feea5d583fc439aae08e2 (diff) | |
download | rtmux-b3a724f30ced2f3be3a52fb54c6551b2b6c6de63.tar.gz rtmux-b3a724f30ced2f3be3a52fb54c6551b2b6c6de63.tar.bz2 rtmux-b3a724f30ced2f3be3a52fb54c6551b2b6c6de63.zip |
Merge branch 'obsd-master'
Conflicts:
Makefile
tmux.c
Diffstat (limited to 'pty.c')
-rw-r--r-- | pty.c | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -0,0 +1,67 @@ +/* $OpenBSD$ */ + +/* + * Copyright (c) 2017 Nicholas Marriott <nicholas.marriott@gmail.com> + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include <sys/types.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <sys/tty.h> + +#include <fcntl.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> +#include <util.h> + +int pty_open(int *); +pid_t pty_fork(int, int *, char *, size_t, struct winsize *); + +int +pty_open(int *fd) +{ + *fd = open(PATH_PTMDEV, O_RDWR|O_CLOEXEC); + if (*fd < 0) + return (-1); + return (0); +} + +pid_t +pty_fork(int ptmfd, int *fd, char *name, size_t namelen, struct winsize *ws) +{ + struct ptmget ptm; + pid_t pid; + + if ((ioctl(ptmfd, PTMGET, &ptm) == -1)) + return (-1); + + strlcpy(name, ptm.sn, namelen); + ioctl(ptm.sfd, TIOCSWINSZ, ws); + + switch (pid = fork()) { + case -1: + close(ptm.cfd); + close(ptm.sfd); + return (-1); + case 0: + close(ptm.cfd); + login_tty(ptm.sfd); + return (0); + } + *fd = ptm.cfd; + close(ptm.sfd); + return (pid); +} |