mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 19:34:08 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			936 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			936 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* termiosmodule.c -- POSIX terminal I/O module implementation.  */
 | 
						|
 | 
						|
#include "Python.h"
 | 
						|
 | 
						|
/* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE
 | 
						|
   is defined, so we define it here. */
 | 
						|
#if defined(__sgi)
 | 
						|
#define CTRL(c) ((c)&037)
 | 
						|
#endif
 | 
						|
 | 
						|
#include <termios.h>
 | 
						|
#ifdef __osf__
 | 
						|
/* On OSF, sys/ioctl.h requires that struct termio already be defined,
 | 
						|
 * so this needs to be included first on that platform. */
 | 
						|
#include <termio.h>
 | 
						|
#endif
 | 
						|
#include <sys/ioctl.h>
 | 
						|
 | 
						|
/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
 | 
						|
 * MDTR, MRI, and MRTS (appearantly used internally by some things
 | 
						|
 * defined as macros; these are not used here directly).
 | 
						|
 */
 | 
						|
#ifdef HAVE_SYS_MODEM_H
 | 
						|
#include <sys/modem.h>
 | 
						|
#endif
 | 
						|
/* HP-UX requires that this be included to pick up TIOCGPGRP and friends */
 | 
						|
#ifdef HAVE_SYS_BSDTTY_H
 | 
						|
#include <sys/bsdtty.h>
 | 
						|
#endif
 | 
						|
 | 
						|
PyDoc_STRVAR(termios__doc__,
 | 
						|
"This module provides an interface to the Posix calls for tty I/O control.\n\
 | 
						|
For a complete description of these calls, see the Posix or Unix manual\n\
 | 
						|
pages. It is only available for those Unix versions that support Posix\n\
 | 
						|
termios style tty I/O control.\n\
 | 
						|
\n\
 | 
						|
All functions in this module take a file descriptor fd as their first\n\
 | 
						|
argument. This can be an integer file descriptor, such as returned by\n\
 | 
						|
sys.stdin.fileno(), or a file object, such as sys.stdin itself.");
 | 
						|
 | 
						|
static PyObject *TermiosError;
 | 
						|
 | 
						|
static int fdconv(PyObject* obj, void* p)
 | 
						|
{
 | 
						|
	int fd;
 | 
						|
 | 
						|
	fd = PyObject_AsFileDescriptor(obj);
 | 
						|
	if (fd >= 0) {
 | 
						|
		*(int*)p = fd;
 | 
						|
		return 1;
 | 
						|
	}
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(termios_tcgetattr__doc__,
 | 
						|
"tcgetattr(fd) -> list_of_attrs\n\
 | 
						|
\n\
 | 
						|
Get the tty attributes for file descriptor fd, as follows:\n\
 | 
						|
[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
 | 
						|
of the tty special characters (each a string of length 1, except the items\n\
 | 
						|
with indices VMIN and VTIME, which are integers when these fields are\n\
 | 
						|
defined).  The interpretation of the flags and the speeds as well as the\n\
 | 
						|
indexing in the cc array must be done using the symbolic constants defined\n\
 | 
						|
in this module.");
 | 
						|
 | 
						|
static PyObject *
 | 
						|
termios_tcgetattr(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
	int fd;
 | 
						|
	struct termios mode;
 | 
						|
	PyObject *cc;
 | 
						|
	speed_t ispeed, ospeed;
 | 
						|
	PyObject *v;
 | 
						|
	int i;
 | 
						|
	char ch;
 | 
						|
 | 
						|
	if (!PyArg_ParseTuple(args, "O&:tcgetattr", 
 | 
						|
			      fdconv, (void*)&fd))
 | 
						|
		return NULL;
 | 
						|
 | 
						|
	if (tcgetattr(fd, &mode) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
 | 
						|
	ispeed = cfgetispeed(&mode);
 | 
						|
	ospeed = cfgetospeed(&mode);
 | 
						|
 | 
						|
	cc = PyList_New(NCCS);
 | 
						|
	if (cc == NULL)
 | 
						|
		return NULL;
 | 
						|
	for (i = 0; i < NCCS; i++) {
 | 
						|
		ch = (char)mode.c_cc[i];
 | 
						|
		v = PyBytes_FromStringAndSize(&ch, 1);
 | 
						|
		if (v == NULL)
 | 
						|
			goto err;
 | 
						|
		PyList_SetItem(cc, i, v);
 | 
						|
	}
 | 
						|
 | 
						|
	/* Convert the MIN and TIME slots to integer.  On some systems, the
 | 
						|
	   MIN and TIME slots are the same as the EOF and EOL slots.  So we
 | 
						|
	   only do this in noncanonical input mode.  */
 | 
						|
	if ((mode.c_lflag & ICANON) == 0) {
 | 
						|
		v = PyLong_FromLong((long)mode.c_cc[VMIN]);
 | 
						|
		if (v == NULL)
 | 
						|
			goto err;
 | 
						|
		PyList_SetItem(cc, VMIN, v);
 | 
						|
		v = PyLong_FromLong((long)mode.c_cc[VTIME]);
 | 
						|
		if (v == NULL)
 | 
						|
			goto err;
 | 
						|
		PyList_SetItem(cc, VTIME, v);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!(v = PyList_New(7)))
 | 
						|
		goto err;
 | 
						|
 | 
						|
	PyList_SetItem(v, 0, PyLong_FromLong((long)mode.c_iflag));
 | 
						|
	PyList_SetItem(v, 1, PyLong_FromLong((long)mode.c_oflag));
 | 
						|
	PyList_SetItem(v, 2, PyLong_FromLong((long)mode.c_cflag));
 | 
						|
	PyList_SetItem(v, 3, PyLong_FromLong((long)mode.c_lflag));
 | 
						|
	PyList_SetItem(v, 4, PyLong_FromLong((long)ispeed));
 | 
						|
	PyList_SetItem(v, 5, PyLong_FromLong((long)ospeed));
 | 
						|
	PyList_SetItem(v, 6, cc);
 | 
						|
	if (PyErr_Occurred()){
 | 
						|
		Py_DECREF(v);
 | 
						|
		goto err;
 | 
						|
	}
 | 
						|
	return v;
 | 
						|
  err:
 | 
						|
	Py_DECREF(cc);
 | 
						|
	return NULL;
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(termios_tcsetattr__doc__,
 | 
						|
"tcsetattr(fd, when, attributes) -> None\n\
 | 
						|
\n\
 | 
						|
Set the tty attributes for file descriptor fd.\n\
 | 
						|
The attributes to be set are taken from the attributes argument, which\n\
 | 
						|
is a list like the one returned by tcgetattr(). The when argument\n\
 | 
						|
determines when the attributes are changed: termios.TCSANOW to\n\
 | 
						|
change immediately, termios.TCSADRAIN to change after transmitting all\n\
 | 
						|
queued output, or termios.TCSAFLUSH to change after transmitting all\n\
 | 
						|
queued output and discarding all queued input. ");
 | 
						|
 | 
						|
static PyObject *
 | 
						|
termios_tcsetattr(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
	int fd, when;
 | 
						|
	struct termios mode;
 | 
						|
	speed_t ispeed, ospeed;
 | 
						|
	PyObject *term, *cc, *v;
 | 
						|
	int i;
 | 
						|
 | 
						|
	if (!PyArg_ParseTuple(args, "O&iO:tcsetattr", 
 | 
						|
			      fdconv, &fd, &when, &term))
 | 
						|
		return NULL;
 | 
						|
	if (!PyList_Check(term) || PyList_Size(term) != 7) {
 | 
						|
		PyErr_SetString(PyExc_TypeError, 
 | 
						|
			     "tcsetattr, arg 3: must be 7 element list");
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	/* Get the old mode, in case there are any hidden fields... */
 | 
						|
	if (tcgetattr(fd, &mode) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
	mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0));
 | 
						|
	mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1));
 | 
						|
	mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2));
 | 
						|
	mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3));
 | 
						|
	ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4));
 | 
						|
	ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5));
 | 
						|
	cc = PyList_GetItem(term, 6);
 | 
						|
	if (PyErr_Occurred())
 | 
						|
		return NULL;
 | 
						|
 | 
						|
	if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
 | 
						|
		PyErr_Format(PyExc_TypeError, 
 | 
						|
			"tcsetattr: attributes[6] must be %d element list",
 | 
						|
			     NCCS);
 | 
						|
		return NULL;
 | 
						|
	}
 | 
						|
 | 
						|
	for (i = 0; i < NCCS; i++) {
 | 
						|
		v = PyList_GetItem(cc, i);
 | 
						|
 | 
						|
		if (PyBytes_Check(v) && PyBytes_Size(v) == 1)
 | 
						|
			mode.c_cc[i] = (cc_t) * PyBytes_AsString(v);
 | 
						|
		else if (PyLong_Check(v))
 | 
						|
			mode.c_cc[i] = (cc_t) PyLong_AsLong(v);
 | 
						|
		else {
 | 
						|
			PyErr_SetString(PyExc_TypeError, 
 | 
						|
     "tcsetattr: elements of attributes must be characters or integers");
 | 
						|
			return NULL;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
	if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
	if (tcsetattr(fd, when, &mode) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(termios_tcsendbreak__doc__,
 | 
						|
"tcsendbreak(fd, duration) -> None\n\
 | 
						|
\n\
 | 
						|
Send a break on file descriptor fd.\n\
 | 
						|
A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
 | 
						|
has a system dependent meaning.");
 | 
						|
 | 
						|
static PyObject *
 | 
						|
termios_tcsendbreak(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
	int fd, duration;
 | 
						|
 | 
						|
	if (!PyArg_ParseTuple(args, "O&i:tcsendbreak", 
 | 
						|
			      fdconv, &fd, &duration))
 | 
						|
		return NULL;
 | 
						|
	if (tcsendbreak(fd, duration) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(termios_tcdrain__doc__,
 | 
						|
"tcdrain(fd) -> None\n\
 | 
						|
\n\
 | 
						|
Wait until all output written to file descriptor fd has been transmitted.");
 | 
						|
 | 
						|
static PyObject *
 | 
						|
termios_tcdrain(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
	int fd;
 | 
						|
 | 
						|
	if (!PyArg_ParseTuple(args, "O&:tcdrain", 
 | 
						|
			      fdconv, &fd))
 | 
						|
		return NULL;
 | 
						|
	if (tcdrain(fd) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(termios_tcflush__doc__,
 | 
						|
"tcflush(fd, queue) -> None\n\
 | 
						|
\n\
 | 
						|
Discard queued data on file descriptor fd.\n\
 | 
						|
The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
 | 
						|
queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
 | 
						|
both queues. ");
 | 
						|
 | 
						|
static PyObject *
 | 
						|
termios_tcflush(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
	int fd, queue;
 | 
						|
 | 
						|
	if (!PyArg_ParseTuple(args, "O&i:tcflush", 
 | 
						|
			      fdconv, &fd, &queue))
 | 
						|
		return NULL;
 | 
						|
	if (tcflush(fd, queue) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
PyDoc_STRVAR(termios_tcflow__doc__,
 | 
						|
"tcflow(fd, action) -> None\n\
 | 
						|
\n\
 | 
						|
Suspend or resume input or output on file descriptor fd.\n\
 | 
						|
The action argument can be termios.TCOOFF to suspend output,\n\
 | 
						|
termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
 | 
						|
or termios.TCION to restart input.");
 | 
						|
 | 
						|
static PyObject *
 | 
						|
termios_tcflow(PyObject *self, PyObject *args)
 | 
						|
{
 | 
						|
	int fd, action;
 | 
						|
 | 
						|
	if (!PyArg_ParseTuple(args, "O&i:tcflow", 
 | 
						|
			      fdconv, &fd, &action))
 | 
						|
		return NULL;
 | 
						|
	if (tcflow(fd, action) == -1)
 | 
						|
		return PyErr_SetFromErrno(TermiosError);
 | 
						|
 | 
						|
	Py_INCREF(Py_None);
 | 
						|
	return Py_None;
 | 
						|
}
 | 
						|
 | 
						|
static PyMethodDef termios_methods[] =
 | 
						|
{
 | 
						|
	{"tcgetattr", termios_tcgetattr, 
 | 
						|
	 METH_VARARGS, termios_tcgetattr__doc__},
 | 
						|
	{"tcsetattr", termios_tcsetattr, 
 | 
						|
	 METH_VARARGS, termios_tcsetattr__doc__},
 | 
						|
	{"tcsendbreak", termios_tcsendbreak, 
 | 
						|
	 METH_VARARGS, termios_tcsendbreak__doc__},
 | 
						|
	{"tcdrain", termios_tcdrain, 
 | 
						|
	 METH_VARARGS, termios_tcdrain__doc__},
 | 
						|
	{"tcflush", termios_tcflush, 
 | 
						|
	 METH_VARARGS, termios_tcflush__doc__},
 | 
						|
	{"tcflow", termios_tcflow, 
 | 
						|
	 METH_VARARGS, termios_tcflow__doc__},
 | 
						|
	{NULL, NULL}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
#if defined(VSWTCH) && !defined(VSWTC)
 | 
						|
#define VSWTC VSWTCH
 | 
						|
#endif
 | 
						|
 | 
						|
#if defined(VSWTC) && !defined(VSWTCH)
 | 
						|
#define VSWTCH VSWTC
 | 
						|
#endif
 | 
						|
 | 
						|
static struct constant {
 | 
						|
	char *name;
 | 
						|
	long value;
 | 
						|
} termios_constants[] = {
 | 
						|
	/* cfgetospeed(), cfsetospeed() constants */
 | 
						|
	{"B0", B0},
 | 
						|
	{"B50", B50},
 | 
						|
	{"B75", B75},
 | 
						|
	{"B110", B110},
 | 
						|
	{"B134", B134},
 | 
						|
	{"B150", B150},
 | 
						|
	{"B200", B200},
 | 
						|
	{"B300", B300},
 | 
						|
	{"B600", B600},
 | 
						|
	{"B1200", B1200},
 | 
						|
	{"B1800", B1800},
 | 
						|
	{"B2400", B2400},
 | 
						|
	{"B4800", B4800},
 | 
						|
	{"B9600", B9600},
 | 
						|
	{"B19200", B19200},
 | 
						|
	{"B38400", B38400},
 | 
						|
#ifdef B57600
 | 
						|
	{"B57600", B57600},
 | 
						|
#endif
 | 
						|
#ifdef B115200
 | 
						|
	{"B115200", B115200},
 | 
						|
#endif
 | 
						|
#ifdef B230400
 | 
						|
	{"B230400", B230400},
 | 
						|
#endif
 | 
						|
#ifdef CBAUDEX
 | 
						|
	{"CBAUDEX", CBAUDEX},
 | 
						|
#endif
 | 
						|
 | 
						|
	/* tcsetattr() constants */
 | 
						|
	{"TCSANOW", TCSANOW},
 | 
						|
	{"TCSADRAIN", TCSADRAIN},
 | 
						|
	{"TCSAFLUSH", TCSAFLUSH},
 | 
						|
 | 
						|
	/* tcflush() constants */
 | 
						|
	{"TCIFLUSH", TCIFLUSH},
 | 
						|
	{"TCOFLUSH", TCOFLUSH},
 | 
						|
	{"TCIOFLUSH", TCIOFLUSH},
 | 
						|
 | 
						|
	/* tcflow() constants */
 | 
						|
	{"TCOOFF", TCOOFF},
 | 
						|
	{"TCOON", TCOON},
 | 
						|
	{"TCIOFF", TCIOFF},
 | 
						|
	{"TCION", TCION},
 | 
						|
 | 
						|
	/* struct termios.c_iflag constants */
 | 
						|
	{"IGNBRK", IGNBRK},
 | 
						|
	{"BRKINT", BRKINT},
 | 
						|
	{"IGNPAR", IGNPAR},
 | 
						|
	{"PARMRK", PARMRK},
 | 
						|
	{"INPCK", INPCK},
 | 
						|
	{"ISTRIP", ISTRIP},
 | 
						|
	{"INLCR", INLCR},
 | 
						|
	{"IGNCR", IGNCR},
 | 
						|
	{"ICRNL", ICRNL},
 | 
						|
#ifdef IUCLC
 | 
						|
	{"IUCLC", IUCLC},
 | 
						|
#endif
 | 
						|
	{"IXON", IXON},
 | 
						|
	{"IXANY", IXANY},
 | 
						|
	{"IXOFF", IXOFF},
 | 
						|
#ifdef IMAXBEL
 | 
						|
	{"IMAXBEL", IMAXBEL},
 | 
						|
#endif
 | 
						|
 | 
						|
	/* struct termios.c_oflag constants */
 | 
						|
	{"OPOST", OPOST},
 | 
						|
#ifdef OLCUC
 | 
						|
	{"OLCUC", OLCUC},
 | 
						|
#endif
 | 
						|
#ifdef ONLCR
 | 
						|
	{"ONLCR", ONLCR},
 | 
						|
#endif
 | 
						|
#ifdef OCRNL
 | 
						|
	{"OCRNL", OCRNL},
 | 
						|
#endif
 | 
						|
#ifdef ONOCR
 | 
						|
	{"ONOCR", ONOCR},
 | 
						|
#endif
 | 
						|
#ifdef ONLRET
 | 
						|
	{"ONLRET", ONLRET},
 | 
						|
#endif
 | 
						|
#ifdef OFILL
 | 
						|
	{"OFILL", OFILL},
 | 
						|
#endif
 | 
						|
#ifdef OFDEL
 | 
						|
	{"OFDEL", OFDEL},
 | 
						|
#endif
 | 
						|
#ifdef NLDLY
 | 
						|
	{"NLDLY", NLDLY},
 | 
						|
#endif
 | 
						|
#ifdef CRDLY
 | 
						|
	{"CRDLY", CRDLY},
 | 
						|
#endif
 | 
						|
#ifdef TABDLY
 | 
						|
	{"TABDLY", TABDLY},
 | 
						|
#endif
 | 
						|
#ifdef BSDLY
 | 
						|
	{"BSDLY", BSDLY},
 | 
						|
#endif
 | 
						|
#ifdef VTDLY
 | 
						|
	{"VTDLY", VTDLY},
 | 
						|
#endif
 | 
						|
#ifdef FFDLY
 | 
						|
	{"FFDLY", FFDLY},
 | 
						|
#endif
 | 
						|
 | 
						|
	/* struct termios.c_oflag-related values (delay mask) */
 | 
						|
#ifdef NL0
 | 
						|
	{"NL0", NL0},
 | 
						|
#endif
 | 
						|
#ifdef NL1
 | 
						|
	{"NL1", NL1},
 | 
						|
#endif
 | 
						|
#ifdef CR0
 | 
						|
	{"CR0", CR0},
 | 
						|
#endif
 | 
						|
#ifdef CR1
 | 
						|
	{"CR1", CR1},
 | 
						|
#endif
 | 
						|
#ifdef CR2
 | 
						|
	{"CR2", CR2},
 | 
						|
#endif
 | 
						|
#ifdef CR3
 | 
						|
	{"CR3", CR3},
 | 
						|
#endif
 | 
						|
#ifdef TAB0
 | 
						|
	{"TAB0", TAB0},
 | 
						|
#endif
 | 
						|
#ifdef TAB1
 | 
						|
	{"TAB1", TAB1},
 | 
						|
#endif
 | 
						|
#ifdef TAB2
 | 
						|
	{"TAB2", TAB2},
 | 
						|
#endif
 | 
						|
#ifdef TAB3
 | 
						|
	{"TAB3", TAB3},
 | 
						|
#endif
 | 
						|
#ifdef XTABS
 | 
						|
	{"XTABS", XTABS},
 | 
						|
#endif
 | 
						|
#ifdef BS0
 | 
						|
	{"BS0", BS0},
 | 
						|
#endif
 | 
						|
#ifdef BS1
 | 
						|
	{"BS1", BS1},
 | 
						|
#endif
 | 
						|
#ifdef VT0
 | 
						|
	{"VT0", VT0},
 | 
						|
#endif
 | 
						|
#ifdef VT1
 | 
						|
	{"VT1", VT1},
 | 
						|
#endif
 | 
						|
#ifdef FF0
 | 
						|
	{"FF0", FF0},
 | 
						|
#endif
 | 
						|
#ifdef FF1
 | 
						|
	{"FF1", FF1},
 | 
						|
#endif
 | 
						|
 | 
						|
	/* struct termios.c_cflag constants */
 | 
						|
	{"CSIZE", CSIZE},
 | 
						|
	{"CSTOPB", CSTOPB},
 | 
						|
	{"CREAD", CREAD},
 | 
						|
	{"PARENB", PARENB},
 | 
						|
	{"PARODD", PARODD},
 | 
						|
	{"HUPCL", HUPCL},
 | 
						|
	{"CLOCAL", CLOCAL},
 | 
						|
#ifdef CIBAUD
 | 
						|
	{"CIBAUD", CIBAUD},
 | 
						|
#endif
 | 
						|
#ifdef CRTSCTS
 | 
						|
	{"CRTSCTS", (long)CRTSCTS},
 | 
						|
#endif
 | 
						|
 | 
						|
	/* struct termios.c_cflag-related values (character size) */
 | 
						|
	{"CS5", CS5},
 | 
						|
	{"CS6", CS6},
 | 
						|
	{"CS7", CS7},
 | 
						|
	{"CS8", CS8},
 | 
						|
 | 
						|
	/* struct termios.c_lflag constants */
 | 
						|
	{"ISIG", ISIG},
 | 
						|
	{"ICANON", ICANON},
 | 
						|
#ifdef XCASE
 | 
						|
	{"XCASE", XCASE},
 | 
						|
#endif
 | 
						|
	{"ECHO", ECHO},
 | 
						|
	{"ECHOE", ECHOE},
 | 
						|
	{"ECHOK", ECHOK},
 | 
						|
	{"ECHONL", ECHONL},
 | 
						|
#ifdef ECHOCTL
 | 
						|
	{"ECHOCTL", ECHOCTL},
 | 
						|
#endif
 | 
						|
#ifdef ECHOPRT
 | 
						|
	{"ECHOPRT", ECHOPRT},
 | 
						|
#endif
 | 
						|
#ifdef ECHOKE
 | 
						|
	{"ECHOKE", ECHOKE},
 | 
						|
#endif
 | 
						|
#ifdef FLUSHO
 | 
						|
	{"FLUSHO", FLUSHO},
 | 
						|
#endif
 | 
						|
	{"NOFLSH", NOFLSH},
 | 
						|
	{"TOSTOP", TOSTOP},
 | 
						|
#ifdef PENDIN
 | 
						|
	{"PENDIN", PENDIN},
 | 
						|
#endif
 | 
						|
	{"IEXTEN", IEXTEN},
 | 
						|
 | 
						|
	/* indexes into the control chars array returned by tcgetattr() */
 | 
						|
	{"VINTR", VINTR},
 | 
						|
	{"VQUIT", VQUIT},
 | 
						|
	{"VERASE", VERASE},
 | 
						|
	{"VKILL", VKILL},
 | 
						|
	{"VEOF", VEOF},
 | 
						|
	{"VTIME", VTIME},
 | 
						|
	{"VMIN", VMIN},
 | 
						|
#ifdef VSWTC
 | 
						|
	/* The #defines above ensure that if either is defined, both are,
 | 
						|
         * but both may be omitted by the system headers.  ;-(  */
 | 
						|
	{"VSWTC", VSWTC},
 | 
						|
	{"VSWTCH", VSWTCH},
 | 
						|
#endif
 | 
						|
	{"VSTART", VSTART},
 | 
						|
	{"VSTOP", VSTOP},
 | 
						|
	{"VSUSP", VSUSP},
 | 
						|
	{"VEOL", VEOL},
 | 
						|
#ifdef VREPRINT
 | 
						|
	{"VREPRINT", VREPRINT},
 | 
						|
#endif
 | 
						|
#ifdef VDISCARD
 | 
						|
	{"VDISCARD", VDISCARD},
 | 
						|
#endif
 | 
						|
#ifdef VWERASE
 | 
						|
	{"VWERASE", VWERASE},
 | 
						|
#endif
 | 
						|
#ifdef VLNEXT
 | 
						|
	{"VLNEXT", VLNEXT},
 | 
						|
#endif
 | 
						|
#ifdef VEOL2
 | 
						|
	{"VEOL2", VEOL2},
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef B460800
 | 
						|
	{"B460800", B460800},
 | 
						|
#endif
 | 
						|
#ifdef CBAUD
 | 
						|
	{"CBAUD", CBAUD},
 | 
						|
#endif
 | 
						|
#ifdef CDEL
 | 
						|
	{"CDEL", CDEL},
 | 
						|
#endif
 | 
						|
#ifdef CDSUSP
 | 
						|
	{"CDSUSP", CDSUSP},
 | 
						|
#endif
 | 
						|
#ifdef CEOF
 | 
						|
	{"CEOF", CEOF},
 | 
						|
#endif
 | 
						|
#ifdef CEOL
 | 
						|
	{"CEOL", CEOL},
 | 
						|
#endif
 | 
						|
#ifdef CEOL2
 | 
						|
	{"CEOL2", CEOL2},
 | 
						|
#endif
 | 
						|
#ifdef CEOT
 | 
						|
	{"CEOT", CEOT},
 | 
						|
#endif
 | 
						|
#ifdef CERASE
 | 
						|
	{"CERASE", CERASE},
 | 
						|
#endif
 | 
						|
#ifdef CESC
 | 
						|
	{"CESC", CESC},
 | 
						|
#endif
 | 
						|
#ifdef CFLUSH
 | 
						|
	{"CFLUSH", CFLUSH},
 | 
						|
#endif
 | 
						|
#ifdef CINTR
 | 
						|
	{"CINTR", CINTR},
 | 
						|
#endif
 | 
						|
#ifdef CKILL
 | 
						|
	{"CKILL", CKILL},
 | 
						|
#endif
 | 
						|
#ifdef CLNEXT
 | 
						|
	{"CLNEXT", CLNEXT},
 | 
						|
#endif
 | 
						|
#ifdef CNUL
 | 
						|
	{"CNUL", CNUL},
 | 
						|
#endif
 | 
						|
#ifdef COMMON
 | 
						|
	{"COMMON", COMMON},
 | 
						|
#endif
 | 
						|
#ifdef CQUIT
 | 
						|
	{"CQUIT", CQUIT},
 | 
						|
#endif
 | 
						|
#ifdef CRPRNT
 | 
						|
	{"CRPRNT", CRPRNT},
 | 
						|
#endif
 | 
						|
#ifdef CSTART
 | 
						|
	{"CSTART", CSTART},
 | 
						|
#endif
 | 
						|
#ifdef CSTOP
 | 
						|
	{"CSTOP", CSTOP},
 | 
						|
#endif
 | 
						|
#ifdef CSUSP
 | 
						|
	{"CSUSP", CSUSP},
 | 
						|
#endif
 | 
						|
#ifdef CSWTCH
 | 
						|
	{"CSWTCH", CSWTCH},
 | 
						|
#endif
 | 
						|
#ifdef CWERASE
 | 
						|
	{"CWERASE", CWERASE},
 | 
						|
#endif
 | 
						|
#ifdef EXTA
 | 
						|
	{"EXTA", EXTA},
 | 
						|
#endif
 | 
						|
#ifdef EXTB
 | 
						|
	{"EXTB", EXTB},
 | 
						|
#endif
 | 
						|
#ifdef FIOASYNC
 | 
						|
	{"FIOASYNC", FIOASYNC},
 | 
						|
#endif
 | 
						|
#ifdef FIOCLEX
 | 
						|
	{"FIOCLEX", FIOCLEX},
 | 
						|
#endif
 | 
						|
#ifdef FIONBIO
 | 
						|
	{"FIONBIO", FIONBIO},
 | 
						|
#endif
 | 
						|
#ifdef FIONCLEX
 | 
						|
	{"FIONCLEX", FIONCLEX},
 | 
						|
#endif
 | 
						|
#ifdef FIONREAD
 | 
						|
	{"FIONREAD", FIONREAD},
 | 
						|
#endif
 | 
						|
#ifdef IBSHIFT
 | 
						|
	{"IBSHIFT", IBSHIFT},
 | 
						|
#endif
 | 
						|
#ifdef INIT_C_CC
 | 
						|
	{"INIT_C_CC", INIT_C_CC},
 | 
						|
#endif
 | 
						|
#ifdef IOCSIZE_MASK
 | 
						|
	{"IOCSIZE_MASK", IOCSIZE_MASK},
 | 
						|
#endif
 | 
						|
#ifdef IOCSIZE_SHIFT
 | 
						|
	{"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
 | 
						|
#endif
 | 
						|
#ifdef NCC
 | 
						|
	{"NCC", NCC},
 | 
						|
#endif
 | 
						|
#ifdef NCCS
 | 
						|
	{"NCCS", NCCS},
 | 
						|
#endif
 | 
						|
#ifdef NSWTCH
 | 
						|
	{"NSWTCH", NSWTCH},
 | 
						|
#endif
 | 
						|
#ifdef N_MOUSE
 | 
						|
	{"N_MOUSE", N_MOUSE},
 | 
						|
#endif
 | 
						|
#ifdef N_PPP
 | 
						|
	{"N_PPP", N_PPP},
 | 
						|
#endif
 | 
						|
#ifdef N_SLIP
 | 
						|
	{"N_SLIP", N_SLIP},
 | 
						|
#endif
 | 
						|
#ifdef N_STRIP
 | 
						|
	{"N_STRIP", N_STRIP},
 | 
						|
#endif
 | 
						|
#ifdef N_TTY
 | 
						|
	{"N_TTY", N_TTY},
 | 
						|
#endif
 | 
						|
#ifdef TCFLSH
 | 
						|
	{"TCFLSH", TCFLSH},
 | 
						|
#endif
 | 
						|
#ifdef TCGETA
 | 
						|
	{"TCGETA", TCGETA},
 | 
						|
#endif
 | 
						|
#ifdef TCGETS
 | 
						|
	{"TCGETS", TCGETS},
 | 
						|
#endif
 | 
						|
#ifdef TCSBRK
 | 
						|
	{"TCSBRK", TCSBRK},
 | 
						|
#endif
 | 
						|
#ifdef TCSBRKP
 | 
						|
	{"TCSBRKP", TCSBRKP},
 | 
						|
#endif
 | 
						|
#ifdef TCSETA
 | 
						|
	{"TCSETA", TCSETA},
 | 
						|
#endif
 | 
						|
#ifdef TCSETAF
 | 
						|
	{"TCSETAF", TCSETAF},
 | 
						|
#endif
 | 
						|
#ifdef TCSETAW
 | 
						|
	{"TCSETAW", TCSETAW},
 | 
						|
#endif
 | 
						|
#ifdef TCSETS
 | 
						|
	{"TCSETS", TCSETS},
 | 
						|
#endif
 | 
						|
#ifdef TCSETSF
 | 
						|
	{"TCSETSF", TCSETSF},
 | 
						|
#endif
 | 
						|
#ifdef TCSETSW
 | 
						|
	{"TCSETSW", TCSETSW},
 | 
						|
#endif
 | 
						|
#ifdef TCXONC
 | 
						|
	{"TCXONC", TCXONC},
 | 
						|
#endif
 | 
						|
#ifdef TIOCCONS
 | 
						|
	{"TIOCCONS", TIOCCONS},
 | 
						|
#endif
 | 
						|
#ifdef TIOCEXCL
 | 
						|
	{"TIOCEXCL", TIOCEXCL},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGETD
 | 
						|
	{"TIOCGETD", TIOCGETD},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGICOUNT
 | 
						|
	{"TIOCGICOUNT", TIOCGICOUNT},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGLCKTRMIOS
 | 
						|
	{"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGPGRP
 | 
						|
	{"TIOCGPGRP", TIOCGPGRP},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGSERIAL
 | 
						|
	{"TIOCGSERIAL", TIOCGSERIAL},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGSOFTCAR
 | 
						|
	{"TIOCGSOFTCAR", TIOCGSOFTCAR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCGWINSZ
 | 
						|
	{"TIOCGWINSZ", TIOCGWINSZ},
 | 
						|
#endif
 | 
						|
#ifdef TIOCINQ
 | 
						|
	{"TIOCINQ", TIOCINQ},
 | 
						|
#endif
 | 
						|
#ifdef TIOCLINUX
 | 
						|
	{"TIOCLINUX", TIOCLINUX},
 | 
						|
#endif
 | 
						|
#ifdef TIOCMBIC
 | 
						|
	{"TIOCMBIC", TIOCMBIC},
 | 
						|
#endif
 | 
						|
#ifdef TIOCMBIS
 | 
						|
	{"TIOCMBIS", TIOCMBIS},
 | 
						|
#endif
 | 
						|
#ifdef TIOCMGET
 | 
						|
	{"TIOCMGET", TIOCMGET},
 | 
						|
#endif
 | 
						|
#ifdef TIOCMIWAIT
 | 
						|
	{"TIOCMIWAIT", TIOCMIWAIT},
 | 
						|
#endif
 | 
						|
#ifdef TIOCMSET
 | 
						|
	{"TIOCMSET", TIOCMSET},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_CAR
 | 
						|
	{"TIOCM_CAR", TIOCM_CAR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_CD
 | 
						|
	{"TIOCM_CD", TIOCM_CD},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_CTS
 | 
						|
	{"TIOCM_CTS", TIOCM_CTS},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_DSR
 | 
						|
	{"TIOCM_DSR", TIOCM_DSR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_DTR
 | 
						|
	{"TIOCM_DTR", TIOCM_DTR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_LE
 | 
						|
	{"TIOCM_LE", TIOCM_LE},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_RI
 | 
						|
	{"TIOCM_RI", TIOCM_RI},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_RNG
 | 
						|
	{"TIOCM_RNG", TIOCM_RNG},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_RTS
 | 
						|
	{"TIOCM_RTS", TIOCM_RTS},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_SR
 | 
						|
	{"TIOCM_SR", TIOCM_SR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCM_ST
 | 
						|
	{"TIOCM_ST", TIOCM_ST},
 | 
						|
#endif
 | 
						|
#ifdef TIOCNOTTY
 | 
						|
	{"TIOCNOTTY", TIOCNOTTY},
 | 
						|
#endif
 | 
						|
#ifdef TIOCNXCL
 | 
						|
	{"TIOCNXCL", TIOCNXCL},
 | 
						|
#endif
 | 
						|
#ifdef TIOCOUTQ
 | 
						|
	{"TIOCOUTQ", TIOCOUTQ},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT
 | 
						|
	{"TIOCPKT", TIOCPKT},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_DATA
 | 
						|
	{"TIOCPKT_DATA", TIOCPKT_DATA},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_DOSTOP
 | 
						|
	{"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_FLUSHREAD
 | 
						|
	{"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_FLUSHWRITE
 | 
						|
	{"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_NOSTOP
 | 
						|
	{"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_START
 | 
						|
	{"TIOCPKT_START", TIOCPKT_START},
 | 
						|
#endif
 | 
						|
#ifdef TIOCPKT_STOP
 | 
						|
	{"TIOCPKT_STOP", TIOCPKT_STOP},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSCTTY
 | 
						|
	{"TIOCSCTTY", TIOCSCTTY},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERCONFIG
 | 
						|
	{"TIOCSERCONFIG", TIOCSERCONFIG},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERGETLSR
 | 
						|
	{"TIOCSERGETLSR", TIOCSERGETLSR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERGETMULTI
 | 
						|
	{"TIOCSERGETMULTI", TIOCSERGETMULTI},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERGSTRUCT
 | 
						|
	{"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERGWILD
 | 
						|
	{"TIOCSERGWILD", TIOCSERGWILD},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERSETMULTI
 | 
						|
	{"TIOCSERSETMULTI", TIOCSERSETMULTI},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSERSWILD
 | 
						|
	{"TIOCSERSWILD", TIOCSERSWILD},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSER_TEMT
 | 
						|
	{"TIOCSER_TEMT", TIOCSER_TEMT},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSETD
 | 
						|
	{"TIOCSETD", TIOCSETD},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSLCKTRMIOS
 | 
						|
	{"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSPGRP
 | 
						|
	{"TIOCSPGRP", TIOCSPGRP},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSSERIAL
 | 
						|
	{"TIOCSSERIAL", TIOCSSERIAL},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSSOFTCAR
 | 
						|
	{"TIOCSSOFTCAR", TIOCSSOFTCAR},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSTI
 | 
						|
	{"TIOCSTI", TIOCSTI},
 | 
						|
#endif
 | 
						|
#ifdef TIOCSWINSZ
 | 
						|
	{"TIOCSWINSZ", TIOCSWINSZ},
 | 
						|
#endif
 | 
						|
#ifdef TIOCTTYGSTRUCT
 | 
						|
	{"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
 | 
						|
#endif
 | 
						|
 | 
						|
	/* sentinel */
 | 
						|
	{NULL, 0}
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
static struct PyModuleDef termiosmodule = {
 | 
						|
	PyModuleDef_HEAD_INIT,
 | 
						|
	"termios",
 | 
						|
	termios__doc__,
 | 
						|
	-1,
 | 
						|
	termios_methods,
 | 
						|
	NULL,
 | 
						|
	NULL,
 | 
						|
	NULL,
 | 
						|
	NULL
 | 
						|
};
 | 
						|
 | 
						|
PyMODINIT_FUNC
 | 
						|
PyInit_termios(void)
 | 
						|
{
 | 
						|
	PyObject *m;
 | 
						|
	struct constant *constant = termios_constants;
 | 
						|
 | 
						|
	m = PyModule_Create(&termiosmodule);
 | 
						|
	if (m == NULL)
 | 
						|
		return NULL;
 | 
						|
 | 
						|
	if (TermiosError == NULL) {
 | 
						|
		TermiosError = PyErr_NewException("termios.error", NULL, NULL);
 | 
						|
	}
 | 
						|
	Py_INCREF(TermiosError);
 | 
						|
	PyModule_AddObject(m, "error", TermiosError);
 | 
						|
 | 
						|
	while (constant->name != NULL) {
 | 
						|
		PyModule_AddIntConstant(m, constant->name, constant->value);
 | 
						|
		++constant;
 | 
						|
	}
 | 
						|
	return m;
 | 
						|
}
 |