Jump to content United States-English
HP.com Home Products and Services Support and Drivers Solutions How to Buy
» Contact HP
More options
HP.com home
HP-UX Reference > L

ldterm(7)

HP-UX 11i Version 3: February 2007
» 

Technical documentation

» Feedback
Content starts here

 » Table of Contents

 » Index

NAME

ldterm — standard STREAMS terminal line discipline module

SYNOPSIS

#include <sys/stream.h> #include <sys/stropts.h> #include <sys/termios.h> #include <sys/bsdtty.h> #include <sys/ttold.h> #include <sys/strtio.h> #include <sys/eucioctl.h> int ioctl( fd, I_PUSH, "ldterm");

DESCRIPTION

ldterm is a STREAMS module that supplies the line discipline for streams-based terminal or pseudo-terminal device drivers. This module provides most of the functions of the general terminal interface described in termio(7). However, it does not perform the low-level device control functions specified by the c_cflag word defined by the POSIX termios structure or the System V termio structure (defined in termios.h and termio.h, respectively). Also, some operations require the cooperation of the modules and drivers pushed below the ldterm module in a tty or pty (slave) stream. This man page only covers ldterm specific interface here and refers to the readers to termio(7) for the detail terminal interface.

Internally, the ldterm module uses the Extended UNIX Code (EUC) character encoding scheme. This encoding scheme enables the ldterm module to process multibyte characters as well as simple 8-bit characters. It correctly handles backspacing, word erasing, and tab expansion for multibyte EUC characters.

The ldterm module provides standard terminal operation consistent with the behavior specified by POSIX 1003.1 and System V Interface Definition (SVID) Third Edition. It also provides compatibility with the behavior of the BSD 4.3 line discipline. Notice that on other STREAMS systems, the BSD 4.3 compatibility feature is usually provided by a separate STREAMS module called ttcompat. Hence, applications on HP-UX need not push ttcompat on top of ldterm to get BSD 4.3 compatibility. In fact, the ttcompat module is not provided on the HP-UX system at all.

The ldterm module normally sits above either a STREAMS tty driver or a STREAMS pty slave driver. The user issues an STREAMS I_PUSH ioctl(2) system call to push ldterm onto the stream once the STREAMS tty or STREAMS pty slave device is opened.

STREAMS Messages

The ldterm module processes various types of STREAMS messages. The line discipline will act on any of the following message types. Any others that the module receives, however, are passed onto the next module on the stream.

Read-side Behavior

ldterm processes the following STREAMS messages on its input stream:

M_FLUSH

If FLUSHR is set, the read put routine flushes the read queue, discards characters in the input message buffers, and discards any partially buffered multibyte EUC characters. Then, it forwards the message upstream.

M_BREAK

The read put routine processes the message according to POSIX rules for processing BREAK events, parity errors, and framing errors and signal generation (see termio(7) for detail). If there is no data in the message, the message is assumed to represent an input BREAK event, which is represented by a framing error with a character value of 0 (zero). If there is data in the message, the data value is an integer that indicates the occurrence of an input BREAK event, or a character received with a parity or framing error. The low-order 8 bits of the data value is the byte that was read. If the TTY_PE flag is set in the higher-order bits of this integer, then a parity error was detected. If the TTY_FE flag is set in the higher-order bits of this integer, a framing error was detected.

After reading the data value, the read put routine discards the message.

M_DATA

The read put routine processes the message according to the POSIX 1003.1 specification, using multibyte processing for backspacing, word erasing, and tab expansion as appropriate.

It generates echo characters and places them in the output buffer to be sent downstream to the write queue. While processing incoming data, it scans for START and STOP characters and sends M_START, M_STOP messages downstream to the write queue, if needed.

If the total number of buffered input characters is more than the high-water mark and IXOFF is set, the read put routine sends an M_STOPI message downstream. When the queue reduces its backlog below the low water mark, it sends an M_STARTI message downstream.

If the number of buffered input characters reaches MAX_INPUT, and the IMAXBEL flag is set, the read put routine discards new input characters and sends a BEL character (Ctrl-G) downstream. If IMAXBEL is not set, it flushes the input queue.

If the ISIG flag is set, the read put routine sends M_PCSIG messages upstream when the appropriate signal characters are encountered. Then it discards the characters.

If a character matching c_cc[VDISCARD] is encountered, and the IEXTEN flag is set, the read put routine sends an M_FLUSH (FLUSHW) message upstream to flush all write queues. The M_FLUSH message is reflected by the stream head and sent downstream through all the write queues.

If the character signifies the logical termination of input, the read put routine sends the currently buffered characters upstream to the stream head.

Logical termination of input depends on the state of the ICANON flag. If ICANON is set, the ldterm module is in canonical input mode. In that case, the read put routine logically terminates input at the end of a line of input. Canonical line termination characters are NEWLINE, EOF, EOL, and EOL2. If ICANON is clear, the ldterm discipline module is in noncanonical or raw input mode. In that case, the read put routine terminates input when at least VMIN bytes are present in the input message buffer or the timer specified by VTIME expires (see termio(7) for more details).

M_IOCACK

If the message acknowledges the POSIX termios TCGETS command, the read put routine copies the c_cflag and speeds information, which is sent by the console driver downstream, from the message into the internal POSIX termios structure. Then it copies the internal POSIX termios structure into the message.

If the message acknowledges one of the POSIX termios set commands (i.e. TCSETS, TCSETSW, and TCSETSF) the read put routine copies all of the data from the message into the internal POSIX termios structure.

After this processing is done, the read put routine determines if the I/O control command was originally a BSD 4.3 or System V I/O control command that was converted to a POSIX termios command by the write service routine. If so, it restores the original data so that the message acknowledges the original I/O control command. Then it forwards the message upstream.

M_CTL

This message was sent by the driver to make special requests to ldterm. The structure of M_CTL messages is the same as that of M_IOCTL messages. The M_CTL message block points to a message buffer containing an iocblk data structure (defined in <sys/stream.h>). The ioc_cmd member of this structure contains a command, just as it does in an M_IOCTL message. The b_cont member of the M_CTL message block contains a pointer to an M_DATA message block, which contains data associated with the M_CTL message.

The read put routine processes M_CTL messages containing the following commands:

MC_NO_CANON

Turn off input processing normally performed on upstream M_DATA messages. This is for the use of modules or drivers that perform their own input processing such as pseudo-terminal (see ptm(7) and pts(7)) in REMOTE mode connected to a program that performs the input processing.

MC_DO_CANON

Turn on input processing normally performed on upstream M_DATA messages. This message is sent when the driver want ldterm to exit the REMOTE mode.

Write-side Behavior

ldterm processes the following STREAMS messages on its output stream. Messages not listed here are simply forwarded downstream.

M_FLUSH

The write put routine flushes the write queue and discards any buffered output data. Then, it forwards the message downstream.

M_DATA

The write service routine processes the data according to the POSIX 1003.1 specification output flags. It sends the processed characters downstream to the driver when the output queue fills up and all of the data is processed.

M_IOCTL

The write put routine validates the format of the M_IOCTL message and checks for known commands. If the message format is invalid, it turns the M_IOCTL message into an M_IOCNAK message, and returns the message upstream. If the I/O control command is not recognized, it forwards the M_IOCTL message downstream for processing by other modules.

The write put routine determines if the command is one that must be processed in the proper sequence relative to M_DATA messages. If so, it queues the M_IOCTL message to the write queue for later processing by the write service routine. Commands that require processing in sequence are:

TCSETSW, TCSETSF, TCSETAW, TCSETAF, TCSBRK

Otherwise, the module's write put routine processes the command immediately. Detailed descriptions of the preceding ioctl commands are provided in the ioctlCommands subsection, below.

M_READ

This message is sent by the stream head to notify downstream modules when an application has issued a read request and there is not enough data queued at the stream head to satisfy the request. The M_READ is sent downstream normally when ldterm is operating in non-canonical input mode. If VTIME is positive, the write put routine starts an input timer. When the timer expires, it sends all buffered input upstream. Then, it forwards the M_READ message downstream.

ioctl Commands

The ldterm module acts on two categories of ioctl commands:

  • Primary terminal I/O control commands

  • BSD 4.3 compatibility terminal I/O control commands

Detail descriptions on how to use these ioctls can be found on the termio(7) man page. NOTE: the FIO[xyz] ioctls documented on termio(7) are currently not supported on ldterm.

Primary Terminal I/O Control Commands

The ldterm module acts on the following primary terminal I/O commands:

TCSETS, TCSETSW, TCSETSF

When the ldterm module receives any of these commands in an M_IOCTL message, it forwards them downstream. When it receives the M_IOCACK message in the read queue, it copies the POSIX termios information from the message into the internal POSIX termios structure and forwards the message upstream. If a mode change requires options at the stream head to be changed, an M_SETOPTS message is sent upstream. If the ICANON flag is turned on or off, the read mode at the stream head is changed to message-nondiscard (RMSGN) with read notification on (SO_MREADON) or byte-stream mode (RNORM) with read notification off (SO_MREADOFF), respectively. If the TOSTOP flag is turned on or off, the tostop mode at the stream head is turned on (SO_TOSTOP) or off (SO_TONSTOP), respectively.

TCGETS

The ldterm module forwards the M_IOCTL message downstream. When it receives the M_IOCACK message in the read queue, it copies the CLOCAL flags and speeds from the message into the internal POSIX termios structure. Then, it copies the entire structure into the M_IOCACK message and forwards the message upstream.

TCSETA, TCSETAW, TCSETAF

These commands set the old System V termio information. The ldterm module converts the message to a POSIX termios M_IOCTL message, then forwards the message with a corresponding POSIX termios command (i.e. TCSETS, TCSETSW, TCSETSF). The original I/O control command and M_IOCTL message are stored for use on M_IOCACK.

TCGETA

This command get the old System V termio information. The ldterm module converts the message to a POSIX termios M_IOCTL message, then forwards the message with the TCGETS command. The original I/O control command and M_IOCTL message are stored to be used on M_IOCACK. When it receives the matching M_IOCACK message, the ldterm module processes it as for a TCGETS command, then converts the POSIX termios information into the System V termio information and replies.

TCSBRK

The ldterm module forwards this command downstream to be handled by the driver so that the driver has a chance to drain the data before sending an M_IOCACK message upstream.

TCXONC

This command controls the behavior of input/output flow control. If the argument is 0 and output is not already stopped, an M_STOP message is sent downstream. If the argument is 1 and the output is stopped, an M_START message is sent downstream. If the argument is 2 and input is not already stopped, an M_STOPI message is sent downstream. If the argument is 3 and input is stopped, an M_STARTI message is sent downstream.

TCFLSH

This command flush the input or/and output streams. If the argument is 0, an M_FLUSH message with a flag byte of FLUSHR is sent downstream. This M_FLUSH(FLUSHR) message will be reflected back upstream by the driver to flush the entire input stream. If the argument is 1, an M_FLUSH message with a flag byte of FLUSHW is sent upstream. This M_FLUSH(FLUSHW) message will be reflected downstream by the stream head to flush the entire output stream.

TIOCSWINSZ

This command sets the window size variables. The argument of this command takes a pointer to a winsize structure. The ldterm module does not use the window size variable, but maintains it here for any needed replies to TIOCGWINSZ commands. The module forwards the message downstream.

TIOCGWINSZ

When the ldterm module receives this command, it returns the window size variable that was set by the last TIOCSWINSZ command. The argument of this command takes a pointer to a winsize structure.

EUC_WSET

This command sets the character widths and screen widths for the EUC character sets. The argument of this command takes a pointer to an eucioc structure which contains the information for setting the character widths and screen widths of the EUC character sets. After processing the command, ldterm forwards this message downstream to the next module.

EUC_WGET

This command returns the character widths and screen widths for the EUC character sets. This command takes a pointer to an eucioc structure via which the EUC character widths and screen widths information will be returned.

EUC_SET_HP15

This command put ldterm to the so called HP15 mode which enable ldterm to recognize the HP15_SJIS, HP15_BIG5, HP15_CCDC, and HP15_GB character sets and process them in such a way that they behave like EUC characters. The argument for this command takes a pointer to an integer value which specify on of the above-mentioned four supported HP15 character sets. If the argument is set to HP15_ASCII, then ldterm will switch back to normal ASCII processing. EUC_WSET is mutually exclusive with EUC_SET_HP15.

EUC_GET_HP15

This command returns the current HP15 character that has been set via the EUC_SET_HP15 command. This command takes a pointer to an integer via which the result is returned. If no previous EUC_SET_HP15 has been issued, then it will return HP15_ASCII.

BSD 4.3 Compatible Terminal I/O Commands

The ldterm module acts on the following I/O commands, which are compatible with the BSD I/O environment:

TIOCEXCL

Set `exclusive-use' mode. No further opens are permitted until the file has been closed.

TIOCNXCL

Turn off `exclusive-use' mode.

TIOCSETD

The ldterm module does nothing but reply to this command. In a BSD system, the command is used to set the current line discipline type. It does not have much meaning in a STREAMS environment, because line discipline modules are changed by popping the current module from the stream and pushing a different one onto the stream.

TIOCGETD

In a BSD system, this command is used to get the current line discipline type. The command does not have much meaning in a STREAMS environment. The ldterm module replies with a value of 2 for binary compatibility, since ldterm supports job control.

TIOCFLUSH

This command flush the input or/and output streams similar to that of the TCFLSH command. The argument is a pointer to an int variable. If its value is zero, both the input and output streams are flushed by sending the appropriate FLUSHR/FLUSHW M_FLUSH messages upstream and downstream. Otherwise, the value of the int is treated as the logical OR of the FREAD and FWRITE flags defined by <sys/file.h>. If the FREAD flag is set, the input stream is flushed. If the FWRITE flag is set, the output stream is flushed. Then, ldterm acknowledges the message with M_IOCACK.

TIOCOUTQ

This command takes a pointer to an integer and returns the number of characters buffered up in the ldterm's output buffer.

TIOCHPCL

This command sets the POSIX termios HUPCL flag to indicate that the terminal line should be disconnected when the last file descriptor associated with that line is closed. The ldterm module converts the command into a compatible POSIX termios I/O control command by sending an M_IOCTL message containing the TCSETS command with current termios settings downstream.

TIOCSTART

The command restarts output. If the terminal was stopped, the ldterm module sends an M_START message downstream.

TIOCSTOP

This command stops output. The ldterm module sends an M_STOP message downstream.

TIOCSBRK

This command sets the break condition on a line. The ldterm module sends an M_BREAK message containing a value of 1 as data to the driver, then replies with M_IOCACK

TIOCCBRK

This command clears the break condition on a line. The ldterm module sends an M_BREAK message containing a value of 0 (zero) as data to the driver, then replies with M_IOCACK.

TIOCSETP, TIOCSETN

These commands set the sgttyb information, defined in <sys/ttold.h>. The argument is a pointer to an sgttyb structure. The ldterm module converts the message to a POSIX termios M_IOCTL message. Then, it forwards the POSIX termios M_IOCTL message with a corresponding POSIX termios command (i.e. TCSETSW, TCSETS). The original I/O control command and M_IOCTL message are stored for use on M_IOCACK.

TIOCGETP

This command returns the sgttyb information based on the interpretation of the current content of the POSIX termios structure maintained in ldterm. The argument is a pointer to an sgttyb structure via where the information is returned.

TIOCSETC

This command sets the tchars information, defined in <sys/strtio.h>. The argument is a pointer to an tchars structure. The ldterm module converts the message to a POSIX termios M_IOCTL message. Then, it forwards the POSIX termios M_IOCTL message with a corresponding POSIX termios command (i.e. TCSETS). The original I/O control command and M_IOCTL message are stored for use on M_IOCACK.

TIOCGETC

This command returns the tchars information based on the interpretation of the current content of the POSIX termios structure maintained in ldterm. The argument is a pointer to an tchars structure via where the information is returned.

TIOCSLTC

This command sets the ltchars information defined in <sys/bsdtty.h>. The ldterm module converts the message to a POSIX termios M_IOCTL message. Then, it forwards the POSIX termios M_IOCTL message with a corresponding POSIX termios command (i.e. TCSETS). The original I/O control command and M_IOCTL message are stored for use on M_IOCACK.

TIOCGLTC

The ldterm module returns the ltchars information based on the interpretation of the current content of the POSIX termios structure maintained in ldterm.

TIOCLBIS, TIOCLBIC, TIOCLSET

These commands set the BSD 4.3 flags information, defined in <sys/strtio.h>. For TIOCLBIS and TIOCLBIC, the argument is a pointer to an int whose value is a mask containing flags to be set/clear. For TIOCLSET, the argument is a pointer to an int whose value is a new set of flags to be set. The ldterm module converts the message to a POSIX termios M_IOCTL, then forwards the POSIX termios M_IOCTL message with a corresponding POSIX termios command (i.e. TCSETS). It stores the original I/O control command and M_IOCTL message to be used on M_IOCACK.

TIOCLGET

The ldterm module returns the BSD 4.3 flags information based on the interpretation of the current content of the POSIX termios structure maintained in ldterm.

TIOCSTI

This command takes an argument of a pointer to a character and pretends that the character was typed on the terminal. The user must either have the DEVOPS privilege or have read permission on the controlling terminal against which the ioctl is issued. See privileges(5) for more information about privileged access on systems that support fine-grained privileges.

FIONREAD

This command takes an argument of a pointer to an integer and returns the number of immediately readable characters.

AUTHOR

ldterm was developed by HP and OSF.

Printable version
Privacy statement Using this site means you accept its terms Feedback to webmaster
© 1983-2007 Hewlett-Packard Development Company, L.P.