symbian-qemu-0.9.1-12/python-2.6.1/Modules/termios.c
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Modules/termios.c	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,926 @@
+/* termiosmodule.c -- POSIX terminal I/O module implementation.  */
+
+#include "Python.h"
+
+#define PyInit_termios inittermios
+
+/* 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 = 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 (m == NULL)
+		return;
+
+	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;
+	}
+}