Print this page
14249 pseudo-terminal nomenclature should reflect POSIX
Change-Id: Ib4a3cef899ff4c71b09cb0dc6878863c5e8357bc
@@ -22,12 +22,10 @@
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
@@ -67,28 +65,28 @@
* prefix.
*/
#define PTY_CNTRL "pty"
/*
- * Pseudo-terminal slave device file names start with the following
+ * Pseudo-terminal subsidiary device file names start with the following
* prefix.
*/
-#define PTY_SLAVE "tty"
+#define PTY_SUBSID "tty"
/*
- * Specify the maximum suffix length for the control and slave device
+ * Specify the maximum suffix length for the control and subsidiary device
* names.
*/
#define PTY_MAX_SUFFIX 10
/*
- * Set the maximum length of the master and slave terminal device filenames,
- * including space for a terminating '\0'.
+ * Set the maximum length of the manager and subsidiary terminal device
+ * filenames, including space for a terminating '\0'.
*/
#define PTY_MAX_NAME (sizeof(PTY_DEV_DIR)-1 + \
- (sizeof(PTY_SLAVE) > sizeof(PTY_CNTRL) ? \
- sizeof(PTY_SLAVE) : sizeof(PTY_CNTRL))-1 \
+ (sizeof(PTY_SUBSID) > sizeof(PTY_CNTRL) ? \
+ sizeof(PTY_SUBSID) : sizeof(PTY_CNTRL))-1 \
+ PTY_MAX_SUFFIX + 1)
/*
* Set the maximum length of an input line.
*/
#define PTY_MAX_LINE 4096
@@ -108,19 +106,19 @@
* Set the timeout delay used to check for quickly arriving
* sequential output from the application.
*/
#define PTY_READ_TIMEOUT 100000 /* micro-seconds */
-static int pty_open_master(const char *prog, int *cntrl, char *slave_name);
-static int pty_open_slave(const char *prog, char *slave_name);
-static int pty_child(const char *prog, int slave, char *argv[]);
+static int pty_open_manager(const char *prog, int *cntrl, char *subsid_name);
+static int pty_open_subsid(const char *prog, char *subsid_name);
+static int pty_child(const char *prog, int subsid, char *argv[]);
static int pty_parent(const char *prog, int cntrl);
static int pty_stop_parent(int waserr, int cntrl, GetLine *gl, char *rbuff);
static GL_FD_EVENT_FN(pty_read_from_program);
static int pty_write_to_fd(int fd, const char *string, int n);
static void pty_child_exited(int sig);
-static int pty_master_readable(int fd, long usec);
+static int pty_manager_readable(int fd, long usec);
/*.......................................................................
* Run a program with enhanced terminal editing facilities.
*
* Usage:
@@ -127,15 +125,15 @@
* enhance program [args...]
*/
int main(int argc, char *argv[])
{
int cntrl = -1; /* The fd of the pseudo-terminal controller device */
- int slave = -1; /* The fd of the pseudo-terminal slave device */
+ int subsid = -1; /* The fd of the pseudo-terminal subsidiary device */
pid_t pid; /* The return value of fork() */
int status; /* The return statuses of the parent and child functions */
- char slave_name[PTY_MAX_NAME]; /* The filename of the slave end of the */
- /* pseudo-terminal. */
+ char subsid_name[PTY_MAX_NAME]; /* The filename of the subsidiary end of */
+ /* the pseudo-terminal. */
char *prog; /* The name of the program (ie. argv[0]) */
/*
* Check the arguments.
*/
if(argc < 2) {
@@ -163,15 +161,15 @@
fflush(stderr);
_exit(1);
};
};
/*
- * Open the master side of a pseudo-terminal pair, and return
+ * Open the manager side of a pseudo-terminal pair, and return
* the corresponding file descriptor and the filename of the
- * slave end of the pseudo-terminal.
+ * subsidiary end of the pseudo-terminal.
*/
- if(pty_open_master(prog, &cntrl, slave_name))
+ if(pty_open_manager(prog, &cntrl, subsid_name))
return 1;
/*
* Set up a signal handler to watch for the child process exiting.
*/
signal(SIGCHLD, pty_child_exited);
@@ -199,79 +197,79 @@
*/
if(pid!=0) {
status = pty_parent(prog, cntrl);
close(cntrl);
} else {
- close(cntrl); /* The child doesn't use the slave device */
+ close(cntrl); /* The child doesn't use the subsidiary device */
signal(SIGCHLD, pty_child_exited);
- if((slave = pty_open_slave(prog, slave_name)) >= 0) {
- status = pty_child(prog, slave, argv + 1);
- close(slave);
+ if((subsid = pty_open_subsid(prog, subsid_name)) >= 0) {
+ status = pty_child(prog, subsid, argv + 1);
+ close(subsid);
} else {
status = 1;
};
};
return status;
}
/*.......................................................................
- * Open the master side of a pseudo-terminal pair, and return
+ * Open the manager side of a pseudo-terminal pair, and return
* the corresponding file descriptor and the filename of the
- * slave end of the pseudo-terminal.
+ * subsidiary end of the pseudo-terminal.
*
* Input/Output:
* prog const char * The name of this program.
* cntrl int * The file descriptor of the pseudo-terminal
* controller device will be assigned tp *cntrl.
- * slave_name char * The file-name of the pseudo-terminal slave device
- * will be recorded in slave_name[], which must have
+ * subsid_name char * The file-name of the pseudo-terminal subsidiary device
+ * will be recorded in subsid_name[], which must have
* at least PTY_MAX_NAME elements.
* Output:
* return int 0 - OK.
* 1 - Error.
*/
-static int pty_open_master(const char *prog, int *cntrl, char *slave_name)
+static int pty_open_manager(const char *prog, int *cntrl, char *subsid_name)
{
- char master_name[PTY_MAX_NAME]; /* The filename of the master device */
+ char manager_name[PTY_MAX_NAME]; /* The filename of the manager device */
DIR *dir; /* The directory iterator */
struct dirent *file; /* A file in "/dev" */
/*
* Mark the controller device as not opened yet.
*/
*cntrl = -1;
/*
* On systems with the Sys-V pseudo-terminal interface, we don't
- * have to search for a free master terminal. We just open /dev/ptmx,
- * and if there is a free master terminal device, we are given a file
+ * have to search for a free manager terminal. We just open /dev/ptmx,
+ * and if there is a free manager terminal device, we are given a file
* descriptor connected to it.
*/
#if HAVE_SYSV_PTY
*cntrl = open("/dev/ptmx", O_RDWR);
if(*cntrl >= 0) {
/*
- * Get the filename of the slave side of the pseudo-terminal.
+ * Get the filename of the subsidiary side of the pseudo-terminal.
*/
char *name = ptsname(*cntrl);
if(name) {
if(strlen(name)+1 > PTY_MAX_NAME) {
- fprintf(stderr, "%s: Slave pty filename too long.\n", prog);
+ fprintf(stderr, "%s: Subsidiary pty filename too long.\n", prog);
return 1;
};
- strlcpy(slave_name, name, PTY_MAX_NAME);
+ strlcpy(subsid_name, name, PTY_MAX_NAME);
/*
- * If unable to get the slave name, discard the controller file descriptor,
- * ready to try a search instead.
+ * If unable to get the subsidiary name, discard the controller file
+ * descriptor, ready to try a search instead.
*/
} else {
close(*cntrl);
*cntrl = -1;
};
} else {
#endif
/*
* On systems without /dev/ptmx, or if opening /dev/ptmx failed,
- * we open one master terminal after another, until one that isn't
+ * we open one manager terminal after another, until one that isn't
* in use by another program is found.
*
* Open the devices directory.
*/
dir = opendir(PTY_DEV_DIR);
@@ -285,30 +283,30 @@
* directory.
*/
while(*cntrl < 0 && (file = readdir(dir))) {
if(strncmp(file->d_name, PTY_CNTRL, sizeof(PTY_CNTRL)-1) == 0) {
/*
- * Get the common extension of the control and slave filenames.
+ * Get the common extension of the control and subsidiary filenames.
*/
const char *ext = file->d_name + sizeof(PTY_CNTRL)-1;
if(strlen(ext) > PTY_MAX_SUFFIX)
continue;
/*
* Attempt to open the control file.
*/
- strlcpy(master_name, PTY_DEV_DIR, sizeof(master_name));
- strlcat(master_name, PTY_CNTRL, sizeof(master_name));
- strlcat(master_name, ext, sizeof(master_name));
- *cntrl = open(master_name, O_RDWR);
+ strlcpy(manager_name, PTY_DEV_DIR, sizeof(manager_name));
+ strlcat(manager_name, PTY_CNTRL, sizeof(manager_name));
+ strlcat(manager_name, ext, sizeof(manager_name));
+ *cntrl = open(manager_name, O_RDWR);
if(*cntrl < 0)
continue;
/*
- * Attempt to open the matching slave file.
+ * Attempt to open the matching subsidiary file.
*/
- strlcpy(slave_name, PTY_DEV_DIR, PTY_MAX_NAME);
- strlcat(slave_name, PTY_SLAVE, PTY_MAX_NAME);
- strlcat(slave_name, ext, PTY_MAX_NAME);
+ strlcpy(subsid_name, PTY_DEV_DIR, PTY_MAX_NAME);
+ strlcat(subsid_name, PTY_SUBSID, PTY_MAX_NAME);
+ strlcat(subsid_name, ext, PTY_MAX_NAME);
};
};
closedir(dir);
#if HAVE_SYSV_PTY
};
@@ -319,12 +317,12 @@
if(*cntrl < 0) {
fprintf(stderr, "%s: Unable to find a free pseudo-terminal.\n", prog);
return 1;
};
/*
- * System V systems require the program that opens the master to
- * grant access to the slave side of the pseudo-terminal.
+ * System V systems require the program that opens the manager to
+ * grant access to the subsidiary side of the pseudo-terminal.
*/
#ifdef HAVE_SYSV_PTY
if(grantpt(*cntrl) < 0 ||
unlockpt(*cntrl) < 0) {
fprintf(stderr, "%s: Unable to unlock terminal (%s).\n", prog,
@@ -337,22 +335,22 @@
*/
return 0;
}
/*.......................................................................
- * Open the slave end of a pseudo-terminal.
+ * Open the subsidiary end of a pseudo-terminal.
*
* Input:
* prog const char * The name of this program.
- * slave_name char * The filename of the slave device.
+ * subsid_name char * The filename of the subsidiary device.
* Output:
* return int The file descriptor of the successfully opened
- * slave device, or < 0 on error.
+ * subsidiary device, or < 0 on error.
*/
-static int pty_open_slave(const char *prog, char *slave_name)
+static int pty_open_subsid(const char *prog, char *subsid_name)
{
- int fd; /* The file descriptor of the slave device */
+ int fd; /* The file descriptor of the subsidiary device */
/*
* Place the process in its own process group. In system-V based
* OS's, this ensures that when the pseudo-terminal is opened, it
* becomes the controlling terminal of the process.
*/
@@ -362,20 +360,20 @@
return -1;
};
/*
* Attempt to open the specified device.
*/
- fd = open(slave_name, O_RDWR);
+ fd = open(subsid_name, O_RDWR);
if(fd < 0) {
- fprintf(stderr, "%s: Unable to open pseudo-terminal slave device (%s).\n",
+ fprintf(stderr, "%s: Unable to open pty subsidiary device (%s).\n",
prog, strerror(errno));
return -1;
};
/*
* On system-V streams based systems, we need to push the stream modules
* that implement pseudo-terminal and termio interfaces. At least on
- * Solaris, which pushes these automatically when a slave is opened,
+ * Solaris, which pushes these automatically when a subsidiary is opened,
* this is redundant, so ignore errors when pushing the modules.
*/
#if HAVE_SYSV_PTY
(void) ioctl(fd, I_PUSH, "ptem");
(void) ioctl(fd, I_PUSH, "ldterm");
@@ -496,15 +494,15 @@
return waserr ? 1 : status;
}
/*.......................................................................
* Run the user's program, with its stdin and stdout connected to the
- * slave end of the psuedo-terminal.
+ * subsidiary end of the psuedo-terminal.
*
* Input:
* prog const char * The name of this program.
- * slave int The file descriptor of the slave end of the
+ * subsid int The file descriptor of the subsidiary end of the
* pseudo terminal.
* argv char *[] The argument vector to pass to the user's program,
* where argv[0] is the name of the user's program,
* and the last argument is followed by a pointer
* to NULL.
@@ -512,37 +510,37 @@
* return int If this function returns at all, an error must
* have occured when trying to overlay the process
* with the user's program. In this case 1 is
* returned.
*/
-static int pty_child(const char *prog, int slave, char *argv[])
+static int pty_child(const char *prog, int subsid, char *argv[])
{
struct termios attr; /* The terminal attributes */
/*
* We need to stop the pseudo-terminal from echoing everything that we send it.
*/
- if(tcgetattr(slave, &attr)) {
+ if(tcgetattr(subsid, &attr)) {
fprintf(stderr, "%s: Can't get pseudo-terminal attributes (%s).\n", prog,
strerror(errno));
return 1;
};
attr.c_lflag &= ~(ECHO);
- while(tcsetattr(slave, TCSADRAIN, &attr)) {
+ while(tcsetattr(subsid, TCSADRAIN, &attr)) {
if(errno != EINTR) {
fprintf(stderr, "%s: tcsetattr error: %s\n", prog, strerror(errno));
return 1;
};
};
/*
- * Arrange for stdin, stdout and stderr to be connected to the slave device,
- * ignoring errors that imply that either stdin or stdout is closed.
+ * Arrange for stdin, stdout and stderr to be connected to the subsidiary
+ * device, ignoring errors that imply that either stdin or stdout is closed.
*/
- while(dup2(slave, STDIN_FILENO) < 0 && errno==EINTR)
+ while(dup2(subsid, STDIN_FILENO) < 0 && errno==EINTR)
;
- while(dup2(slave, STDOUT_FILENO) < 0 && errno==EINTR)
+ while(dup2(subsid, STDOUT_FILENO) < 0 && errno==EINTR)
;
- while(dup2(slave, STDERR_FILENO) < 0 && errno==EINTR)
+ while(dup2(subsid, STDERR_FILENO) < 0 && errno==EINTR)
;
/*
* Run the user's program.
*/
if(execvp(argv[0], argv) < 0) {
@@ -646,11 +644,11 @@
* Move any unwritten text following the newline, to the start of the
* buffer.
*/
memmove(rbuff, nextp, len - (nextp - rbuff) + 1);
};
- } while(pty_master_readable(fd, PTY_READ_TIMEOUT));
+ } while(pty_manager_readable(fd, PTY_READ_TIMEOUT));
/*
* Make the incomplete line in the output buffer the current prompt.
*/
gl_replace_prompt(gl, rbuff);
return GLFD_REFRESH;
@@ -684,11 +682,11 @@
}
/*.......................................................................
* This is the signal handler that is called when the child process
* that is running the user's program exits for any reason. It closes
- * the slave end of the terminal, so that gl_get_line() in the parent
+ * the subsidiary end of the terminal, so that gl_get_line() in the parent
* process sees an end of file.
*/
static void pty_child_exited(int sig)
{
raise(SIGINT);
@@ -705,11 +703,11 @@
* Output:
* return int 0 - No data is waiting to be read (or select isn't
* available).
* 1 - Data is waiting to be read.
*/
-static int pty_master_readable(int fd, long usec)
+static int pty_manager_readable(int fd, long usec)
{
#if HAVE_SELECT
fd_set rfds; /* The set of file descriptors to check */
struct timeval timeout; /* The timeout */
FD_ZERO(&rfds);