ptem - STREAMS Pseudo Terminal Emulation module
int ioctl(fd, I_PUSH, "ptem");
ptem is a STREAMS module that, when used in conjunction with a line discipline and pseudo terminal driver, emulates a terminal.
The ptem module must be pushed (see I_PUSH, streamio(4I)) onto the slave side of a pseudo terminal STREAM, before the ldterm(4M) module is pushed. This is done automatically by autopush(8) on Oracle Solaris 11.4 and later releases.
On the write-side, the TCSETA, TCSETAF, TCSETAW, TCGETA, TCSETS, TCSETSW, TCSETSF, TCGETS, TCSBRK, JWINSIZE, TIOCGWINSZ, and TIOCSWINSZ termio ioctl(2) messages are processed and acknowledged. If remote mode is not in effect, ptem handles the TIOCSTI ioctl by copying the argument bytes into an M_DATA message and passing it back up the read side. Regardless of the remote mode setting, ptem acknowledges the ioctl and passes a copy of it downstream for possible further processing. A hang up (that is, stty 0) is converted to a zero length M_DATA message and passed downstream. Termio cflags and window row and column information are stored locally one per stream. M_DELAY messages are discarded. All other messages are passed downstream unmodified.
On the read-side all messages are passed upstream unmodified with the following exceptions. All M_READ and M_DELAY messages are freed in both directions. A TCSBRK ioctl is converted to an M_BREAK message and passed upstream and an acknowledgement is returned downstream. A TIOCSIGNAL ioctl is converted into an M_PCSIG message, and passed upstream and an acknowledgement is returned downstream. Finally a TIOCREMOTE ioctl is converted into an M_CTL message, acknowledged, and passed upstream; the resulting mode is retained for use in subsequent TIOCSTI parsing.
Prior to Oracle Solaris 11.4, programs needed to push the ptem module onto the slave side of a pseudo-terminal pair if open() was called from a program not linked for XPG4 or later standards. If called from a program linked with values-xpg4.o or values-xpg6.o, then open() would automatically push ptem, ldterm, and ttcompat modules onto the slave side, and callers pushing them as well would encounter unexpected behavior.
Oracle Solaris 11.4 added these modules to /etc/iu.system.ap for pts(4D) so that they are automatically pushed by autopush(8) regardless of how the program is linked, and ensured that only one copy of each is pushed onto each stream.