Pseudoterminals 1387
q mfd = ptyMasterOpen(slname, MAX_SNAME);
if (mfd == -1)
return -1;
w if (slaveName != NULL) { / Return slave name to caller /
if (strlen(slname) < snLen) {
strncpy(slaveName, slname, snLen);
} else { /* 'slaveName' was too small */
close(mfd);
errno = EOVERFLOW;
return -1;
}
}
e childPid = fork();
if (childPid == -1) { /* fork() failed */
savedErrno = errno; /* close() might change 'errno' */
close(mfd); /* Don't leak file descriptors */
errno = savedErrno;
return -1;
}
r if (childPid != 0) { / Parent /
masterFd = mfd; / Only parent gets master fd /
return childPid; / Like parent of fork() */
}
/* Child falls through to here */
t if (setsid() == -1) / Start a new session /
err_exit("ptyFork:setsid");
y close(mfd); / Not needed in child /
u slaveFd = open(slname, O_RDWR); / Becomes controlling tty /
if (slaveFd == -1)
err_exit("ptyFork:open-slave");
i#ifdef TIOCSCTTY / Acquire controlling tty on BSD /
if (ioctl(slaveFd, TIOCSCTTY, 0) == -1)
err_exit("ptyFork:ioctl-TIOCSCTTY");
#endif
o if (slaveTermios != NULL) / Set slave tty attributes /
if (tcsetattr(slaveFd, TCSANOW, slaveTermios) == -1)
err_exit("ptyFork:tcsetattr");
a if (slaveWS != NULL) / Set slave tty window size /
if (ioctl(slaveFd, TIOCSWINSZ, slaveWS) == -1)
err_exit("ptyFork:ioctl-TIOCSWINSZ");