--- /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;
+ }
+}