| /* termiosmodule.c -- POSIX terminal I/O module implementation.  */ | 
 |  | 
 | #include "Python.h" | 
 |  | 
 | #define PyInit_termios inittermios | 
 |  | 
 | #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 | 
 |  | 
 | 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 = PyString_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 = PyInt_FromLong((long)mode.c_cc[VMIN]); | 
 | 		if (v == NULL) | 
 | 			goto err; | 
 | 		PyList_SetItem(cc, VMIN, v); | 
 | 		v = PyInt_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, PyInt_FromLong((long)mode.c_iflag)); | 
 | 	PyList_SetItem(v, 1, PyInt_FromLong((long)mode.c_oflag)); | 
 | 	PyList_SetItem(v, 2, PyInt_FromLong((long)mode.c_cflag)); | 
 | 	PyList_SetItem(v, 3, PyInt_FromLong((long)mode.c_lflag)); | 
 | 	PyList_SetItem(v, 4, PyInt_FromLong((long)ispeed)); | 
 | 	PyList_SetItem(v, 5, PyInt_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) PyInt_AsLong(PyList_GetItem(term, 0)); | 
 | 	mode.c_oflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 1)); | 
 | 	mode.c_cflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 2)); | 
 | 	mode.c_lflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 3)); | 
 | 	ispeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 4)); | 
 | 	ospeed = (speed_t) PyInt_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 (PyString_Check(v) && PyString_Size(v) == 1) | 
 | 			mode.c_cc[i] = (cc_t) * PyString_AsString(v); | 
 | 		else if (PyInt_Check(v)) | 
 | 			mode.c_cc[i] = (cc_t) PyInt_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} | 
 | }; | 
 |  | 
 |  | 
 | PyMODINIT_FUNC | 
 | PyInit_termios(void) | 
 | { | 
 | 	PyObject *m; | 
 | 	struct constant *constant = termios_constants; | 
 |  | 
 | 	m = Py_InitModule4("termios", termios_methods, termios__doc__, | 
 |                            (PyObject *)NULL, PYTHON_API_VERSION); | 
 |  | 
 | 	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; | 
 | 	} | 
 | } |