| /* 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}, | |
| #ifdef TCSASOFT | |
| {"TCSASOFT", TCSASOFT}, | |
| #endif | |
| /* 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; | |
| } | |
| } |