blob: c53566c12b70524941dea6ec1fe7a145c7703573 [file] [log] [blame]
Guido van Rossum9adae8e1994-09-12 10:41:22 +00001/* termiosmodule.c -- POSIX terminal I/O module implementation. */
2
Guido van Rossumca6954a1999-01-14 19:31:42 +00003#include "Python.h"
Guido van Rossum9adae8e1994-09-12 10:41:22 +00004
5#define PyInit_termios inittermios
6
Martin v. Löwisbe4fea62003-10-31 13:01:24 +00007/* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE
8 is defined, so we define it here. */
9#if defined(__sgi)
10#define CTRL(c) ((c)&037)
11#endif
12
Guido van Rossum9adae8e1994-09-12 10:41:22 +000013#include <termios.h>
Fred Drakeb2877dd2001-05-09 17:53:06 +000014#ifdef __osf__
15/* On OSF, sys/ioctl.h requires that struct termio already be defined,
16 * so this needs to be included first on that platform. */
Fred Drakeb638aaf2001-05-07 17:55:35 +000017#include <termio.h>
Fred Drakeb2877dd2001-05-09 17:53:06 +000018#endif
Fred Drake9b3bc492001-04-04 21:19:26 +000019#include <sys/ioctl.h>
Guido van Rossum1aca4d81998-03-03 22:10:18 +000020
Fred Drake87068f12001-05-11 16:14:17 +000021/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
22 * MDTR, MRI, and MRTS (appearantly used internally by some things
23 * defined as macros; these are not used here directly).
24 */
25#ifdef HAVE_SYS_MODEM_H
26#include <sys/modem.h>
27#endif
Neal Norwitz82251032003-05-23 14:35:24 +000028/* HP-UX requires that this be included to pick up TIOCGPGRP and friends */
29#ifdef HAVE_SYS_BSDTTY_H
30#include <sys/bsdtty.h>
31#endif
Fred Drake87068f12001-05-11 16:14:17 +000032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000033PyDoc_STRVAR(termios__doc__,
34"This module provides an interface to the Posix calls for tty I/O control.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000035For a complete description of these calls, see the Posix or Unix manual\n\
36pages. It is only available for those Unix versions that support Posix\n\
37termios style tty I/O control.\n\
38\n\
39All functions in this module take a file descriptor fd as their first\n\
40argument. This can be an integer file descriptor, such as returned by\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000041sys.stdin.fileno(), or a file object, such as sys.stdin itself.");
Guido van Rossum9adae8e1994-09-12 10:41:22 +000042
43static PyObject *TermiosError;
44
Fred Drakeb638aaf2001-05-07 17:55:35 +000045static int fdconv(PyObject* obj, void* p)
46{
47 int fd;
48
49 fd = PyObject_AsFileDescriptor(obj);
Fred Drakec99ff602001-05-09 20:14:09 +000050 if (fd >= 0) {
51 *(int*)p = fd;
52 return 1;
Fred Drakeb638aaf2001-05-07 17:55:35 +000053 }
Fred Drakec99ff602001-05-09 20:14:09 +000054 return 0;
Fred Drakeb638aaf2001-05-07 17:55:35 +000055}
Guido van Rossum9adae8e1994-09-12 10:41:22 +000056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000057PyDoc_STRVAR(termios_tcgetattr__doc__,
58"tcgetattr(fd) -> list_of_attrs\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000059\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +000060Get the tty attributes for file descriptor fd, as follows:\n\
61[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
62of the tty special characters (each a string of length 1, except the items\n\
63with indices VMIN and VTIME, which are integers when these fields are\n\
64defined). The interpretation of the flags and the speeds as well as the\n\
65indexing in the cc array must be done using the symbolic constants defined\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000066in this module.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +000067
Guido van Rossum9adae8e1994-09-12 10:41:22 +000068static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +000069termios_tcgetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +000070{
71 int fd;
72 struct termios mode;
73 PyObject *cc;
74 speed_t ispeed, ospeed;
75 PyObject *v;
76 int i;
77 char ch;
78
Fred Drakeb638aaf2001-05-07 17:55:35 +000079 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
80 fdconv, (void*)&fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +000081 return NULL;
82
83 if (tcgetattr(fd, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +000084 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000085
86 ispeed = cfgetispeed(&mode);
87 ospeed = cfgetospeed(&mode);
88
89 cc = PyList_New(NCCS);
90 if (cc == NULL)
91 return NULL;
92 for (i = 0; i < NCCS; i++) {
93 ch = (char)mode.c_cc[i];
94 v = PyString_FromStringAndSize(&ch, 1);
95 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +000096 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000097 PyList_SetItem(cc, i, v);
98 }
99
100 /* Convert the MIN and TIME slots to integer. On some systems, the
101 MIN and TIME slots are the same as the EOF and EOL slots. So we
102 only do this in noncanonical input mode. */
Guido van Rossum36dd0d21996-12-10 15:23:00 +0000103 if ((mode.c_lflag & ICANON) == 0) {
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000104 v = PyInt_FromLong((long)mode.c_cc[VMIN]);
105 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000106 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000107 PyList_SetItem(cc, VMIN, v);
108 v = PyInt_FromLong((long)mode.c_cc[VTIME]);
109 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000110 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000111 PyList_SetItem(cc, VTIME, v);
112 }
113
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000114 if (!(v = PyList_New(7)))
115 goto err;
116
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000117 PyList_SetItem(v, 0, PyInt_FromLong((long)mode.c_iflag));
118 PyList_SetItem(v, 1, PyInt_FromLong((long)mode.c_oflag));
119 PyList_SetItem(v, 2, PyInt_FromLong((long)mode.c_cflag));
120 PyList_SetItem(v, 3, PyInt_FromLong((long)mode.c_lflag));
121 PyList_SetItem(v, 4, PyInt_FromLong((long)ispeed));
122 PyList_SetItem(v, 5, PyInt_FromLong((long)ospeed));
123 PyList_SetItem(v, 6, cc);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000124 if (PyErr_Occurred()){
125 Py_DECREF(v);
126 goto err;
127 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000128 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000129 err:
130 Py_DECREF(cc);
131 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000132}
133
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000134PyDoc_STRVAR(termios_tcsetattr__doc__,
135"tcsetattr(fd, when, attributes) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000136\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000137Set the tty attributes for file descriptor fd.\n\
138The attributes to be set are taken from the attributes argument, which\n\
139is a list like the one returned by tcgetattr(). The when argument\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000140determines when the attributes are changed: termios.TCSANOW to\n\
141change immediately, termios.TCSADRAIN to change after transmitting all\n\
142queued output, or termios.TCSAFLUSH to change after transmitting all\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000143queued output and discarding all queued input. ");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000144
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000145static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000146termios_tcsetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000147{
148 int fd, when;
149 struct termios mode;
150 speed_t ispeed, ospeed;
151 PyObject *term, *cc, *v;
152 int i;
153
Fred Drakeb638aaf2001-05-07 17:55:35 +0000154 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
155 fdconv, &fd, &when, &term))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000156 return NULL;
157 if (!PyList_Check(term) || PyList_Size(term) != 7) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000158 PyErr_SetString(PyExc_TypeError,
159 "tcsetattr, arg 3: must be 7 element list");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000160 return NULL;
161 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000162
Guido van Rossume7c41931998-06-12 14:26:18 +0000163 /* Get the old mode, in case there are any hidden fields... */
164 if (tcgetattr(fd, &mode) == -1)
165 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000166 mode.c_iflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 0));
167 mode.c_oflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 1));
168 mode.c_cflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 2));
169 mode.c_lflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 3));
170 ispeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 4));
171 ospeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 5));
172 cc = PyList_GetItem(term, 6);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000173 if (PyErr_Occurred())
174 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000175
176 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000177 PyErr_Format(PyExc_TypeError,
178 "tcsetattr: attributes[6] must be %d element list",
179 NCCS);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000180 return NULL;
181 }
182
183 for (i = 0; i < NCCS; i++) {
184 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000185
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000186 if (PyString_Check(v) && PyString_Size(v) == 1)
187 mode.c_cc[i] = (cc_t) * PyString_AsString(v);
188 else if (PyInt_Check(v))
189 mode.c_cc[i] = (cc_t) PyInt_AsLong(v);
190 else {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000191 PyErr_SetString(PyExc_TypeError,
192 "tcsetattr: elements of attributes must be characters or integers");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000193 return NULL;
194 }
195 }
196
197 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000198 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000199 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000200 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000201 if (tcsetattr(fd, when, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000202 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000203
204 Py_INCREF(Py_None);
205 return Py_None;
206}
207
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000208PyDoc_STRVAR(termios_tcsendbreak__doc__,
209"tcsendbreak(fd, duration) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000210\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000211Send a break on file descriptor fd.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000212A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000213has a system dependent meaning.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000214
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000215static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000216termios_tcsendbreak(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000217{
218 int fd, duration;
219
Fred Drakeb638aaf2001-05-07 17:55:35 +0000220 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
221 fdconv, &fd, &duration))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000222 return NULL;
223 if (tcsendbreak(fd, duration) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000224 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000225
226 Py_INCREF(Py_None);
227 return Py_None;
228}
229
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000230PyDoc_STRVAR(termios_tcdrain__doc__,
231"tcdrain(fd) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000232\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000233Wait until all output written to file descriptor fd has been transmitted.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000234
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000235static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000236termios_tcdrain(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000237{
238 int fd;
239
Fred Drakeb638aaf2001-05-07 17:55:35 +0000240 if (!PyArg_ParseTuple(args, "O&:tcdrain",
241 fdconv, &fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000242 return NULL;
243 if (tcdrain(fd) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000244 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000245
246 Py_INCREF(Py_None);
247 return Py_None;
248}
249
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000250PyDoc_STRVAR(termios_tcflush__doc__,
251"tcflush(fd, queue) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000252\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000253Discard queued data on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000254The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
255queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000256both queues. ");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000257
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000258static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000259termios_tcflush(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000260{
261 int fd, queue;
262
Fred Drakeb638aaf2001-05-07 17:55:35 +0000263 if (!PyArg_ParseTuple(args, "O&i:tcflush",
264 fdconv, &fd, &queue))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000265 return NULL;
266 if (tcflush(fd, queue) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000267 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000268
269 Py_INCREF(Py_None);
270 return Py_None;
271}
272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000273PyDoc_STRVAR(termios_tcflow__doc__,
274"tcflow(fd, action) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000275\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000276Suspend or resume input or output on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000277The action argument can be termios.TCOOFF to suspend output,\n\
278termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000279or termios.TCION to restart input.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000280
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000281static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000282termios_tcflow(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000283{
284 int fd, action;
285
Fred Drakeb638aaf2001-05-07 17:55:35 +0000286 if (!PyArg_ParseTuple(args, "O&i:tcflow",
287 fdconv, &fd, &action))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000288 return NULL;
289 if (tcflow(fd, action) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000290 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000291
292 Py_INCREF(Py_None);
293 return Py_None;
294}
295
296static PyMethodDef termios_methods[] =
297{
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000298 {"tcgetattr", termios_tcgetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000299 METH_VARARGS, termios_tcgetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000300 {"tcsetattr", termios_tcsetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000301 METH_VARARGS, termios_tcsetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000302 {"tcsendbreak", termios_tcsendbreak,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000303 METH_VARARGS, termios_tcsendbreak__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000304 {"tcdrain", termios_tcdrain,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000305 METH_VARARGS, termios_tcdrain__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000306 {"tcflush", termios_tcflush,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000307 METH_VARARGS, termios_tcflush__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000308 {"tcflow", termios_tcflow,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000309 METH_VARARGS, termios_tcflow__doc__},
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000310 {NULL, NULL}
311};
312
Fred Drakedf48d142001-02-27 21:22:39 +0000313
Fred Drake9ef7fa82001-03-01 21:54:49 +0000314#if defined(VSWTCH) && !defined(VSWTC)
315#define VSWTC VSWTCH
316#endif
317
318#if defined(VSWTC) && !defined(VSWTCH)
319#define VSWTCH VSWTC
320#endif
321
Fred Drakedf48d142001-02-27 21:22:39 +0000322static struct constant {
323 char *name;
324 long value;
325} termios_constants[] = {
326 /* cfgetospeed(), cfsetospeed() constants */
327 {"B0", B0},
328 {"B50", B50},
329 {"B75", B75},
330 {"B110", B110},
331 {"B134", B134},
332 {"B150", B150},
333 {"B200", B200},
334 {"B300", B300},
335 {"B600", B600},
336 {"B1200", B1200},
337 {"B1800", B1800},
338 {"B2400", B2400},
339 {"B4800", B4800},
340 {"B9600", B9600},
341 {"B19200", B19200},
342 {"B38400", B38400},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000343#ifdef B57600
Fred Drakedf48d142001-02-27 21:22:39 +0000344 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000345#endif
346#ifdef B115200
Fred Drakedf48d142001-02-27 21:22:39 +0000347 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000348#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000349#ifdef B230400
Fred Drakedf48d142001-02-27 21:22:39 +0000350 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000351#endif
Fred Drake9ef7fa82001-03-01 21:54:49 +0000352#ifdef CBAUDEX
Fred Drakedf48d142001-02-27 21:22:39 +0000353 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000354#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000355
356 /* tcsetattr() constants */
357 {"TCSANOW", TCSANOW},
358 {"TCSADRAIN", TCSADRAIN},
359 {"TCSAFLUSH", TCSAFLUSH},
360
361 /* tcflush() constants */
362 {"TCIFLUSH", TCIFLUSH},
363 {"TCOFLUSH", TCOFLUSH},
364 {"TCIOFLUSH", TCIOFLUSH},
365
366 /* tcflow() constants */
367 {"TCOOFF", TCOOFF},
368 {"TCOON", TCOON},
369 {"TCIOFF", TCIOFF},
370 {"TCION", TCION},
371
372 /* struct termios.c_iflag constants */
373 {"IGNBRK", IGNBRK},
374 {"BRKINT", BRKINT},
375 {"IGNPAR", IGNPAR},
376 {"PARMRK", PARMRK},
377 {"INPCK", INPCK},
378 {"ISTRIP", ISTRIP},
379 {"INLCR", INLCR},
380 {"IGNCR", IGNCR},
381 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000382#ifdef IUCLC
Fred Drakedf48d142001-02-27 21:22:39 +0000383 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000384#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000385 {"IXON", IXON},
386 {"IXANY", IXANY},
387 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000388#ifdef IMAXBEL
Fred Drakedf48d142001-02-27 21:22:39 +0000389 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000390#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000391
392 /* struct termios.c_oflag constants */
393 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000394#ifdef OLCUC
Fred Drakedf48d142001-02-27 21:22:39 +0000395 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000396#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000397#ifdef ONLCR
Fred Drakedf48d142001-02-27 21:22:39 +0000398 {"ONLCR", ONLCR},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000399#endif
Fred Draked85556c2001-03-03 18:08:52 +0000400#ifdef OCRNL
Fred Drakedf48d142001-02-27 21:22:39 +0000401 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000402#endif
403#ifdef ONOCR
Fred Drakedf48d142001-02-27 21:22:39 +0000404 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000405#endif
406#ifdef ONLRET
Fred Drakedf48d142001-02-27 21:22:39 +0000407 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000408#endif
409#ifdef OFILL
Fred Drakedf48d142001-02-27 21:22:39 +0000410 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000411#endif
412#ifdef OFDEL
Fred Drakedf48d142001-02-27 21:22:39 +0000413 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000414#endif
415#ifdef NLDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000416 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000417#endif
418#ifdef CRDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000419 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000420#endif
421#ifdef TABDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000422 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000423#endif
424#ifdef BSDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000425 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000426#endif
427#ifdef VTDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000428 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000429#endif
430#ifdef FFDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000431 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000432#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000433
434 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000435#ifdef NL0
Fred Drakedf48d142001-02-27 21:22:39 +0000436 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000437#endif
438#ifdef NL1
Fred Drakedf48d142001-02-27 21:22:39 +0000439 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000440#endif
441#ifdef CR0
Fred Drakedf48d142001-02-27 21:22:39 +0000442 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000443#endif
444#ifdef CR1
Fred Drakedf48d142001-02-27 21:22:39 +0000445 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000446#endif
447#ifdef CR2
Fred Drakedf48d142001-02-27 21:22:39 +0000448 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000449#endif
450#ifdef CR3
Fred Drakedf48d142001-02-27 21:22:39 +0000451 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000452#endif
453#ifdef TAB0
Fred Drakedf48d142001-02-27 21:22:39 +0000454 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000455#endif
456#ifdef TAB1
Fred Drakedf48d142001-02-27 21:22:39 +0000457 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000458#endif
459#ifdef TAB2
Fred Drakedf48d142001-02-27 21:22:39 +0000460 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000461#endif
462#ifdef TAB3
Fred Drakedf48d142001-02-27 21:22:39 +0000463 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000464#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000465#ifdef XTABS
Fred Drakedf48d142001-02-27 21:22:39 +0000466 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000467#endif
Fred Draked85556c2001-03-03 18:08:52 +0000468#ifdef BS0
Fred Drakedf48d142001-02-27 21:22:39 +0000469 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000470#endif
471#ifdef BS1
Fred Drakedf48d142001-02-27 21:22:39 +0000472 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000473#endif
474#ifdef VT0
Fred Drakedf48d142001-02-27 21:22:39 +0000475 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000476#endif
477#ifdef VT1
Fred Drakedf48d142001-02-27 21:22:39 +0000478 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000479#endif
480#ifdef FF0
Fred Drakedf48d142001-02-27 21:22:39 +0000481 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000482#endif
483#ifdef FF1
Fred Drakedf48d142001-02-27 21:22:39 +0000484 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000485#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000486
487 /* struct termios.c_cflag constants */
488 {"CSIZE", CSIZE},
489 {"CSTOPB", CSTOPB},
490 {"CREAD", CREAD},
491 {"PARENB", PARENB},
492 {"PARODD", PARODD},
493 {"HUPCL", HUPCL},
494 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000495#ifdef CIBAUD
Fred Drakedf48d142001-02-27 21:22:39 +0000496 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000497#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000498#ifdef CRTSCTS
499 {"CRTSCTS", (long)CRTSCTS},
500#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000501
502 /* struct termios.c_cflag-related values (character size) */
503 {"CS5", CS5},
504 {"CS6", CS6},
505 {"CS7", CS7},
506 {"CS8", CS8},
507
508 /* struct termios.c_lflag constants */
509 {"ISIG", ISIG},
510 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000511#ifdef XCASE
Fred Drakedf48d142001-02-27 21:22:39 +0000512 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000513#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000514 {"ECHO", ECHO},
515 {"ECHOE", ECHOE},
516 {"ECHOK", ECHOK},
517 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000518#ifdef ECHOCTL
Fred Drakedf48d142001-02-27 21:22:39 +0000519 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000520#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000521#ifdef ECHOPRT
Fred Drakedf48d142001-02-27 21:22:39 +0000522 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000523#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000524#ifdef ECHOKE
Fred Drakedf48d142001-02-27 21:22:39 +0000525 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000526#endif
527#ifdef FLUSHO
Fred Drakedf48d142001-02-27 21:22:39 +0000528 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000529#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000530 {"NOFLSH", NOFLSH},
531 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000532#ifdef PENDIN
Fred Drakedf48d142001-02-27 21:22:39 +0000533 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000534#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000535 {"IEXTEN", IEXTEN},
536
537 /* indexes into the control chars array returned by tcgetattr() */
538 {"VINTR", VINTR},
539 {"VQUIT", VQUIT},
540 {"VERASE", VERASE},
541 {"VKILL", VKILL},
542 {"VEOF", VEOF},
543 {"VTIME", VTIME},
544 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000545#ifdef VSWTC
546 /* The #defines above ensure that if either is defined, both are,
547 * but both may be omitted by the system headers. ;-( */
Fred Drakedf48d142001-02-27 21:22:39 +0000548 {"VSWTC", VSWTC},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000549 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000550#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000551 {"VSTART", VSTART},
552 {"VSTOP", VSTOP},
553 {"VSUSP", VSUSP},
554 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000555#ifdef VREPRINT
Fred Drakedf48d142001-02-27 21:22:39 +0000556 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000557#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000558#ifdef VDISCARD
Fred Drakedf48d142001-02-27 21:22:39 +0000559 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000560#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000561#ifdef VWERASE
Fred Drakedf48d142001-02-27 21:22:39 +0000562 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000563#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000564#ifdef VLNEXT
Fred Drakedf48d142001-02-27 21:22:39 +0000565 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000566#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000567#ifdef VEOL2
Fred Drakedf48d142001-02-27 21:22:39 +0000568 {"VEOL2", VEOL2},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000569#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000570
Fred Drake55a00342001-03-26 17:14:02 +0000571
572#ifdef B460800
573 {"B460800", B460800},
574#endif
575#ifdef CBAUD
576 {"CBAUD", CBAUD},
577#endif
578#ifdef CDEL
579 {"CDEL", CDEL},
580#endif
581#ifdef CDSUSP
582 {"CDSUSP", CDSUSP},
583#endif
584#ifdef CEOF
585 {"CEOF", CEOF},
586#endif
587#ifdef CEOL
588 {"CEOL", CEOL},
589#endif
590#ifdef CEOL2
591 {"CEOL2", CEOL2},
592#endif
593#ifdef CEOT
594 {"CEOT", CEOT},
595#endif
596#ifdef CERASE
597 {"CERASE", CERASE},
598#endif
599#ifdef CESC
600 {"CESC", CESC},
601#endif
602#ifdef CFLUSH
603 {"CFLUSH", CFLUSH},
604#endif
605#ifdef CINTR
606 {"CINTR", CINTR},
607#endif
608#ifdef CKILL
609 {"CKILL", CKILL},
610#endif
611#ifdef CLNEXT
612 {"CLNEXT", CLNEXT},
613#endif
614#ifdef CNUL
615 {"CNUL", CNUL},
616#endif
617#ifdef COMMON
618 {"COMMON", COMMON},
619#endif
620#ifdef CQUIT
621 {"CQUIT", CQUIT},
622#endif
623#ifdef CRPRNT
624 {"CRPRNT", CRPRNT},
625#endif
626#ifdef CSTART
627 {"CSTART", CSTART},
628#endif
629#ifdef CSTOP
630 {"CSTOP", CSTOP},
631#endif
632#ifdef CSUSP
633 {"CSUSP", CSUSP},
634#endif
635#ifdef CSWTCH
636 {"CSWTCH", CSWTCH},
637#endif
638#ifdef CWERASE
639 {"CWERASE", CWERASE},
640#endif
641#ifdef EXTA
642 {"EXTA", EXTA},
643#endif
644#ifdef EXTB
645 {"EXTB", EXTB},
646#endif
647#ifdef FIOASYNC
648 {"FIOASYNC", FIOASYNC},
649#endif
650#ifdef FIOCLEX
651 {"FIOCLEX", FIOCLEX},
652#endif
653#ifdef FIONBIO
654 {"FIONBIO", FIONBIO},
655#endif
656#ifdef FIONCLEX
657 {"FIONCLEX", FIONCLEX},
658#endif
659#ifdef FIONREAD
660 {"FIONREAD", FIONREAD},
661#endif
662#ifdef IBSHIFT
663 {"IBSHIFT", IBSHIFT},
664#endif
665#ifdef INIT_C_CC
666 {"INIT_C_CC", INIT_C_CC},
667#endif
668#ifdef IOCSIZE_MASK
669 {"IOCSIZE_MASK", IOCSIZE_MASK},
670#endif
671#ifdef IOCSIZE_SHIFT
672 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
673#endif
674#ifdef NCC
675 {"NCC", NCC},
676#endif
677#ifdef NCCS
678 {"NCCS", NCCS},
679#endif
680#ifdef NSWTCH
681 {"NSWTCH", NSWTCH},
682#endif
683#ifdef N_MOUSE
684 {"N_MOUSE", N_MOUSE},
685#endif
686#ifdef N_PPP
687 {"N_PPP", N_PPP},
688#endif
689#ifdef N_SLIP
690 {"N_SLIP", N_SLIP},
691#endif
692#ifdef N_STRIP
693 {"N_STRIP", N_STRIP},
694#endif
695#ifdef N_TTY
696 {"N_TTY", N_TTY},
697#endif
698#ifdef TCFLSH
699 {"TCFLSH", TCFLSH},
700#endif
701#ifdef TCGETA
702 {"TCGETA", TCGETA},
703#endif
704#ifdef TCGETS
705 {"TCGETS", TCGETS},
706#endif
707#ifdef TCSBRK
708 {"TCSBRK", TCSBRK},
709#endif
710#ifdef TCSBRKP
711 {"TCSBRKP", TCSBRKP},
712#endif
713#ifdef TCSETA
714 {"TCSETA", TCSETA},
715#endif
716#ifdef TCSETAF
717 {"TCSETAF", TCSETAF},
718#endif
719#ifdef TCSETAW
720 {"TCSETAW", TCSETAW},
721#endif
722#ifdef TCSETS
723 {"TCSETS", TCSETS},
724#endif
725#ifdef TCSETSF
726 {"TCSETSF", TCSETSF},
727#endif
728#ifdef TCSETSW
729 {"TCSETSW", TCSETSW},
730#endif
731#ifdef TCXONC
732 {"TCXONC", TCXONC},
733#endif
734#ifdef TIOCCONS
735 {"TIOCCONS", TIOCCONS},
736#endif
737#ifdef TIOCEXCL
738 {"TIOCEXCL", TIOCEXCL},
739#endif
740#ifdef TIOCGETD
741 {"TIOCGETD", TIOCGETD},
742#endif
743#ifdef TIOCGICOUNT
744 {"TIOCGICOUNT", TIOCGICOUNT},
745#endif
746#ifdef TIOCGLCKTRMIOS
747 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
748#endif
749#ifdef TIOCGPGRP
750 {"TIOCGPGRP", TIOCGPGRP},
751#endif
752#ifdef TIOCGSERIAL
753 {"TIOCGSERIAL", TIOCGSERIAL},
754#endif
755#ifdef TIOCGSOFTCAR
756 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
757#endif
758#ifdef TIOCGWINSZ
759 {"TIOCGWINSZ", TIOCGWINSZ},
760#endif
761#ifdef TIOCINQ
762 {"TIOCINQ", TIOCINQ},
763#endif
764#ifdef TIOCLINUX
765 {"TIOCLINUX", TIOCLINUX},
766#endif
767#ifdef TIOCMBIC
768 {"TIOCMBIC", TIOCMBIC},
769#endif
770#ifdef TIOCMBIS
771 {"TIOCMBIS", TIOCMBIS},
772#endif
773#ifdef TIOCMGET
774 {"TIOCMGET", TIOCMGET},
775#endif
776#ifdef TIOCMIWAIT
777 {"TIOCMIWAIT", TIOCMIWAIT},
778#endif
779#ifdef TIOCMSET
780 {"TIOCMSET", TIOCMSET},
781#endif
782#ifdef TIOCM_CAR
783 {"TIOCM_CAR", TIOCM_CAR},
784#endif
785#ifdef TIOCM_CD
786 {"TIOCM_CD", TIOCM_CD},
787#endif
788#ifdef TIOCM_CTS
789 {"TIOCM_CTS", TIOCM_CTS},
790#endif
791#ifdef TIOCM_DSR
792 {"TIOCM_DSR", TIOCM_DSR},
793#endif
794#ifdef TIOCM_DTR
795 {"TIOCM_DTR", TIOCM_DTR},
796#endif
797#ifdef TIOCM_LE
798 {"TIOCM_LE", TIOCM_LE},
799#endif
800#ifdef TIOCM_RI
801 {"TIOCM_RI", TIOCM_RI},
802#endif
803#ifdef TIOCM_RNG
804 {"TIOCM_RNG", TIOCM_RNG},
805#endif
806#ifdef TIOCM_RTS
807 {"TIOCM_RTS", TIOCM_RTS},
808#endif
809#ifdef TIOCM_SR
810 {"TIOCM_SR", TIOCM_SR},
811#endif
812#ifdef TIOCM_ST
813 {"TIOCM_ST", TIOCM_ST},
814#endif
815#ifdef TIOCNOTTY
816 {"TIOCNOTTY", TIOCNOTTY},
817#endif
818#ifdef TIOCNXCL
819 {"TIOCNXCL", TIOCNXCL},
820#endif
821#ifdef TIOCOUTQ
822 {"TIOCOUTQ", TIOCOUTQ},
823#endif
824#ifdef TIOCPKT
825 {"TIOCPKT", TIOCPKT},
826#endif
827#ifdef TIOCPKT_DATA
828 {"TIOCPKT_DATA", TIOCPKT_DATA},
829#endif
830#ifdef TIOCPKT_DOSTOP
831 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
832#endif
833#ifdef TIOCPKT_FLUSHREAD
834 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
835#endif
836#ifdef TIOCPKT_FLUSHWRITE
837 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
838#endif
839#ifdef TIOCPKT_NOSTOP
840 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
841#endif
842#ifdef TIOCPKT_START
843 {"TIOCPKT_START", TIOCPKT_START},
844#endif
845#ifdef TIOCPKT_STOP
846 {"TIOCPKT_STOP", TIOCPKT_STOP},
847#endif
848#ifdef TIOCSCTTY
849 {"TIOCSCTTY", TIOCSCTTY},
850#endif
851#ifdef TIOCSERCONFIG
852 {"TIOCSERCONFIG", TIOCSERCONFIG},
853#endif
854#ifdef TIOCSERGETLSR
855 {"TIOCSERGETLSR", TIOCSERGETLSR},
856#endif
857#ifdef TIOCSERGETMULTI
858 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
859#endif
860#ifdef TIOCSERGSTRUCT
861 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
862#endif
863#ifdef TIOCSERGWILD
864 {"TIOCSERGWILD", TIOCSERGWILD},
865#endif
866#ifdef TIOCSERSETMULTI
867 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
868#endif
869#ifdef TIOCSERSWILD
870 {"TIOCSERSWILD", TIOCSERSWILD},
871#endif
872#ifdef TIOCSER_TEMT
873 {"TIOCSER_TEMT", TIOCSER_TEMT},
874#endif
875#ifdef TIOCSETD
876 {"TIOCSETD", TIOCSETD},
877#endif
878#ifdef TIOCSLCKTRMIOS
879 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
880#endif
881#ifdef TIOCSPGRP
882 {"TIOCSPGRP", TIOCSPGRP},
883#endif
884#ifdef TIOCSSERIAL
885 {"TIOCSSERIAL", TIOCSSERIAL},
886#endif
887#ifdef TIOCSSOFTCAR
888 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
889#endif
890#ifdef TIOCSTI
891 {"TIOCSTI", TIOCSTI},
892#endif
893#ifdef TIOCSWINSZ
894 {"TIOCSWINSZ", TIOCSWINSZ},
895#endif
896#ifdef TIOCTTYGSTRUCT
897 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
898#endif
899
Fred Drakedf48d142001-02-27 21:22:39 +0000900 /* sentinel */
901 {NULL, 0}
902};
903
904
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000905PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000906PyInit_termios(void)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000907{
Fred Drake78f6c862002-02-14 07:11:23 +0000908 PyObject *m;
Fred Drakedf48d142001-02-27 21:22:39 +0000909 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000910
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000911 m = Py_InitModule4("termios", termios_methods, termios__doc__,
912 (PyObject *)NULL, PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000913 if (m == NULL)
914 return;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000915
Fred Drake78f6c862002-02-14 07:11:23 +0000916 if (TermiosError == NULL) {
917 TermiosError = PyErr_NewException("termios.error", NULL, NULL);
918 }
919 Py_INCREF(TermiosError);
920 PyModule_AddObject(m, "error", TermiosError);
Fred Drakedf48d142001-02-27 21:22:39 +0000921
922 while (constant->name != NULL) {
923 PyModule_AddIntConstant(m, constant->name, constant->value);
924 ++constant;
925 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000926}