Annotation of embedaddon/tmux/compat/forkpty-hpux.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
3: *
4: * Permission to use, copy, modify, and distribute this software for any
5: * purpose with or without fee is hereby granted, provided that the above
6: * copyright notice and this permission notice appear in all copies.
7: *
8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
13: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
14: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15: */
16:
17: #include <sys/types.h>
18: #include <sys/ioctl.h>
19:
20: #include <fcntl.h>
21: #include <stdlib.h>
22: #include <stropts.h>
23: #include <unistd.h>
24:
25: #include "compat.h"
26:
27: void fatal(const char *, ...);
28: void fatalx(const char *, ...);
29:
30: pid_t
31: forkpty(int *master, char *name, struct termios *tio, struct winsize *ws)
32: {
33: int slave = -1;
34: char *path;
35: pid_t pid;
36:
37: if ((*master = open("/dev/ptmx", O_RDWR|O_NOCTTY)) == -1)
38: return (-1);
39: if (grantpt(*master) != 0)
40: goto out;
41: if (unlockpt(*master) != 0)
42: goto out;
43:
44: if ((path = ptsname(*master)) == NULL)
45: goto out;
46: if (name != NULL)
47: strlcpy(name, path, TTY_NAME_MAX);
48: if ((slave = open(path, O_RDWR|O_NOCTTY)) == -1)
49: goto out;
50:
51: switch (pid = fork()) {
52: case -1:
53: goto out;
54: case 0:
55: close(*master);
56:
57: setsid();
58: #ifdef TIOCSCTTY
59: if (ioctl(slave, TIOCSCTTY, NULL) == -1)
60: fatal("ioctl failed");
61: #endif
62:
63: if (ioctl(slave, I_PUSH, "ptem") == -1)
64: fatal("ioctl failed");
65: if (ioctl(slave, I_PUSH, "ldterm") == -1)
66: fatal("ioctl failed");
67:
68: if (tio != NULL && tcsetattr(slave, TCSAFLUSH, tio) == -1)
69: fatal("tcsetattr failed");
70: if (ioctl(slave, TIOCSWINSZ, ws) == -1)
71: fatal("ioctl failed");
72:
73: dup2(slave, 0);
74: dup2(slave, 1);
75: dup2(slave, 2);
76: if (slave > 2)
77: close(slave);
78: return (0);
79: }
80:
81: close(slave);
82: return (pid);
83:
84: out:
85: if (*master != -1)
86: close(*master);
87: if (slave != -1)
88: close(slave);
89: return (-1);
90: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>