10 int openpty(int* amaster
, int* aslave
, char* name
, struct termios
* termp
, 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
, struct termios
* termp
, struct winsize
* winp
)
51 if (openpty(&master
, &slave
, name
, termp
, winp
) == -1) {
56 switch (pid
= fork()) {
61 if (login_tty(slave
)) _exit(1);