10 int openpty(int* amaster, int* aslave, char* name, const struct termios* termp, const struct winsize* winp)
14 int master = open("/dev/ptmx", O_RDWR);
15 if (master == -1) return -1;
16 if (grantpt(master) || unlockpt(master) || ptsname_r(master, buf, sizeof buf)) goto fail;
18 int slave = open(buf, O_RDWR | O_NOCTTY);
19 if (slave == -1) goto fail;
21 /* XXX Should we ignore errors here? */
22 if (termp) tcsetattr(slave, TCSAFLUSH, termp);
23 if (winp) ioctl(slave, TIOCSWINSZ, winp);
27 if (name != NULL) strcpy(name, buf);
39 if (ioctl(fd, TIOCSCTTY, NULL) == -1) return -1;
43 if (fd > 2) close(fd);
48 int forkpty(int* amaster, char* name, const struct termios* termp, const struct winsize* winp)
51 if (openpty(&master, &slave, name, termp, winp) == -1) {
56 switch (pid = fork()) {
61 if (login_tty(slave)) _exit(1);