aboutsummaryrefslogtreecommitdiff
path: root/pty.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-01-23 12:20:43 +0000
committerThomas Adam <thomas@xteddy.org>2017-01-23 12:20:43 +0000
commitb3a724f30ced2f3be3a52fb54c6551b2b6c6de63 (patch)
treeeba69fe13464cf92fcf64cf32505e308949718b6 /pty.c
parentd2eab39ffa42a0d5d8e796cbe3352f951f42b4f7 (diff)
parent98e7fbb2acee0238381feea5d583fc439aae08e2 (diff)
downloadrtmux-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.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/pty.c b/pty.c
new file mode 100644
index 00000000..05a02ef0
--- /dev/null
+++ b/pty.c
@@ -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);
+}