You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
924 lines
19 KiB
924 lines
19 KiB
/* 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 (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; |
|
} |
|
}
|
|
|