blob: f586bb16222f84da0925324cc35c6d0202e0d355 [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
Guido van Rossum9adae8e1994-09-12 10:41:22 +00007#include <termios.h>
Fred Drakeb2877dd2001-05-09 17:53:06 +00008#ifdef __osf__
9/* On OSF, sys/ioctl.h requires that struct termio already be defined,
10 * so this needs to be included first on that platform. */
Fred Drakeb638aaf2001-05-07 17:55:35 +000011#include <termio.h>
Fred Drakeb2877dd2001-05-09 17:53:06 +000012#endif
Fred Drake9b3bc492001-04-04 21:19:26 +000013#include <sys/ioctl.h>
Guido van Rossum1aca4d81998-03-03 22:10:18 +000014
Guido van Rossumbcc20741998-08-04 22:53:56 +000015#ifdef __BEOS__
16#include <unistd.h>
17#endif
18
Fred Drakeb638aaf2001-05-07 17:55:35 +000019static char termios__doc__[] = "\
20This module provides an interface to the Posix calls for tty I/O control.\n\
21For a complete description of these calls, see the Posix or Unix manual\n\
22pages. It is only available for those Unix versions that support Posix\n\
23termios style tty I/O control.\n\
24\n\
25All functions in this module take a file descriptor fd as their first\n\
26argument. This can be an integer file descriptor, such as returned by\n\
27sys.stdin.fileno(), or a file object, such as sys.stdin itself.";
Guido van Rossum9adae8e1994-09-12 10:41:22 +000028
29static PyObject *TermiosError;
30
Fred Drakeb638aaf2001-05-07 17:55:35 +000031static int fdconv(PyObject* obj, void* p)
32{
33 int fd;
34
35 fd = PyObject_AsFileDescriptor(obj);
Fred Drakec99ff602001-05-09 20:14:09 +000036 if (fd >= 0) {
37 *(int*)p = fd;
38 return 1;
Fred Drakeb638aaf2001-05-07 17:55:35 +000039 }
Fred Drakec99ff602001-05-09 20:14:09 +000040 return 0;
Fred Drakeb638aaf2001-05-07 17:55:35 +000041}
Guido van Rossum9adae8e1994-09-12 10:41:22 +000042
Guido van Rossum1aca4d81998-03-03 22:10:18 +000043static char termios_tcgetattr__doc__[] = "\
44tcgetattr(fd) -> list_of_attrs\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000045\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +000046Get the tty attributes for file descriptor fd, as follows:\n\
47[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
48of the tty special characters (each a string of length 1, except the items\n\
49with indices VMIN and VTIME, which are integers when these fields are\n\
50defined). The interpretation of the flags and the speeds as well as the\n\
51indexing in the cc array must be done using the symbolic constants defined\n\
Fred Drake29fd0312001-04-09 19:32:52 +000052in this module.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +000053
Guido van Rossum9adae8e1994-09-12 10:41:22 +000054static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +000055termios_tcgetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +000056{
57 int fd;
58 struct termios mode;
59 PyObject *cc;
60 speed_t ispeed, ospeed;
61 PyObject *v;
62 int i;
63 char ch;
64
Fred Drakeb638aaf2001-05-07 17:55:35 +000065 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
66 fdconv, (void*)&fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +000067 return NULL;
68
69 if (tcgetattr(fd, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +000070 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000071
72 ispeed = cfgetispeed(&mode);
73 ospeed = cfgetospeed(&mode);
74
75 cc = PyList_New(NCCS);
76 if (cc == NULL)
77 return NULL;
78 for (i = 0; i < NCCS; i++) {
79 ch = (char)mode.c_cc[i];
80 v = PyString_FromStringAndSize(&ch, 1);
81 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +000082 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000083 PyList_SetItem(cc, i, v);
84 }
85
86 /* Convert the MIN and TIME slots to integer. On some systems, the
87 MIN and TIME slots are the same as the EOF and EOL slots. So we
88 only do this in noncanonical input mode. */
Guido van Rossum36dd0d21996-12-10 15:23:00 +000089 if ((mode.c_lflag & ICANON) == 0) {
Guido van Rossum9adae8e1994-09-12 10:41:22 +000090 v = PyInt_FromLong((long)mode.c_cc[VMIN]);
91 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +000092 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000093 PyList_SetItem(cc, VMIN, v);
94 v = PyInt_FromLong((long)mode.c_cc[VTIME]);
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, VTIME, v);
98 }
99
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000100 if (!(v = PyList_New(7)))
101 goto err;
102
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000103 PyList_SetItem(v, 0, PyInt_FromLong((long)mode.c_iflag));
104 PyList_SetItem(v, 1, PyInt_FromLong((long)mode.c_oflag));
105 PyList_SetItem(v, 2, PyInt_FromLong((long)mode.c_cflag));
106 PyList_SetItem(v, 3, PyInt_FromLong((long)mode.c_lflag));
107 PyList_SetItem(v, 4, PyInt_FromLong((long)ispeed));
108 PyList_SetItem(v, 5, PyInt_FromLong((long)ospeed));
109 PyList_SetItem(v, 6, cc);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000110 if (PyErr_Occurred()){
111 Py_DECREF(v);
112 goto err;
113 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000114 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000115 err:
116 Py_DECREF(cc);
117 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000118}
119
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000120static char termios_tcsetattr__doc__[] = "\
121tcsetattr(fd, when, attributes) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000122\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000123Set the tty attributes for file descriptor fd.\n\
124The attributes to be set are taken from the attributes argument, which\n\
125is a list like the one returned by tcgetattr(). The when argument\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000126determines when the attributes are changed: termios.TCSANOW to\n\
127change immediately, termios.TCSADRAIN to change after transmitting all\n\
128queued output, or termios.TCSAFLUSH to change after transmitting all\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000129queued output and discarding all queued input. ";
130
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000131static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000132termios_tcsetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000133{
134 int fd, when;
135 struct termios mode;
136 speed_t ispeed, ospeed;
137 PyObject *term, *cc, *v;
138 int i;
139
Fred Drakeb638aaf2001-05-07 17:55:35 +0000140 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
141 fdconv, &fd, &when, &term))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000142 return NULL;
143 if (!PyList_Check(term) || PyList_Size(term) != 7) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000144 PyErr_SetString(PyExc_TypeError,
145 "tcsetattr, arg 3: must be 7 element list");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000146 return NULL;
147 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000148
Guido van Rossume7c41931998-06-12 14:26:18 +0000149 /* Get the old mode, in case there are any hidden fields... */
150 if (tcgetattr(fd, &mode) == -1)
151 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000152 mode.c_iflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 0));
153 mode.c_oflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 1));
154 mode.c_cflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 2));
155 mode.c_lflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 3));
156 ispeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 4));
157 ospeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 5));
158 cc = PyList_GetItem(term, 6);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000159 if (PyErr_Occurred())
160 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000161
162 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000163 PyErr_Format(PyExc_TypeError,
164 "tcsetattr: attributes[6] must be %d element list",
165 NCCS);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000166 return NULL;
167 }
168
169 for (i = 0; i < NCCS; i++) {
170 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000171
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000172 if (PyString_Check(v) && PyString_Size(v) == 1)
173 mode.c_cc[i] = (cc_t) * PyString_AsString(v);
174 else if (PyInt_Check(v))
175 mode.c_cc[i] = (cc_t) PyInt_AsLong(v);
176 else {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000177 PyErr_SetString(PyExc_TypeError,
178 "tcsetattr: elements of attributes must be characters or integers");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000179 return NULL;
180 }
181 }
182
183 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000184 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000185 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000186 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000187 if (tcsetattr(fd, when, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000188 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000189
190 Py_INCREF(Py_None);
191 return Py_None;
192}
193
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000194static char termios_tcsendbreak__doc__[] = "\
195tcsendbreak(fd, duration) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000196\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000197Send a break on file descriptor fd.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000198A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
199has a system dependent meaning.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000200
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000201static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000202termios_tcsendbreak(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000203{
204 int fd, duration;
205
Fred Drakeb638aaf2001-05-07 17:55:35 +0000206 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
207 fdconv, &fd, &duration))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000208 return NULL;
209 if (tcsendbreak(fd, duration) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000210 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000211
212 Py_INCREF(Py_None);
213 return Py_None;
214}
215
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000216static char termios_tcdrain__doc__[] = "\
217tcdrain(fd) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000218\n\
219Wait until all output written to file descriptor fd has been transmitted.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000220
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000221static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000222termios_tcdrain(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000223{
224 int fd;
225
Fred Drakeb638aaf2001-05-07 17:55:35 +0000226 if (!PyArg_ParseTuple(args, "O&:tcdrain",
227 fdconv, &fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000228 return NULL;
229 if (tcdrain(fd) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000230 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000231
232 Py_INCREF(Py_None);
233 return Py_None;
234}
235
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000236static char termios_tcflush__doc__[] = "\
237tcflush(fd, queue) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000238\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000239Discard queued data on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000240The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
241queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000242both queues. ";
243
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000244static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000245termios_tcflush(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000246{
247 int fd, queue;
248
Fred Drakeb638aaf2001-05-07 17:55:35 +0000249 if (!PyArg_ParseTuple(args, "O&i:tcflush",
250 fdconv, &fd, &queue))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000251 return NULL;
252 if (tcflush(fd, queue) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000253 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000254
255 Py_INCREF(Py_None);
256 return Py_None;
257}
258
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000259static char termios_tcflow__doc__[] = "\
260tcflow(fd, action) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000261\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000262Suspend or resume input or output on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000263The action argument can be termios.TCOOFF to suspend output,\n\
264termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
265or termios.TCION to restart input.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000266
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000267static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000268termios_tcflow(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000269{
270 int fd, action;
271
Fred Drakeb638aaf2001-05-07 17:55:35 +0000272 if (!PyArg_ParseTuple(args, "O&i:tcflow",
273 fdconv, &fd, &action))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000274 return NULL;
275 if (tcflow(fd, action) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000276 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000277
278 Py_INCREF(Py_None);
279 return Py_None;
280}
281
282static PyMethodDef termios_methods[] =
283{
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000284 {"tcgetattr", termios_tcgetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000285 METH_VARARGS, termios_tcgetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000286 {"tcsetattr", termios_tcsetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000287 METH_VARARGS, termios_tcsetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000288 {"tcsendbreak", termios_tcsendbreak,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000289 METH_VARARGS, termios_tcsendbreak__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000290 {"tcdrain", termios_tcdrain,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000291 METH_VARARGS, termios_tcdrain__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000292 {"tcflush", termios_tcflush,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000293 METH_VARARGS, termios_tcflush__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000294 {"tcflow", termios_tcflow,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000295 METH_VARARGS, termios_tcflow__doc__},
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000296 {NULL, NULL}
297};
298
Fred Drakedf48d142001-02-27 21:22:39 +0000299
Fred Drake9ef7fa82001-03-01 21:54:49 +0000300#if defined(VSWTCH) && !defined(VSWTC)
301#define VSWTC VSWTCH
302#endif
303
304#if defined(VSWTC) && !defined(VSWTCH)
305#define VSWTCH VSWTC
306#endif
307
Fred Drakedf48d142001-02-27 21:22:39 +0000308static struct constant {
309 char *name;
310 long value;
311} termios_constants[] = {
312 /* cfgetospeed(), cfsetospeed() constants */
313 {"B0", B0},
314 {"B50", B50},
315 {"B75", B75},
316 {"B110", B110},
317 {"B134", B134},
318 {"B150", B150},
319 {"B200", B200},
320 {"B300", B300},
321 {"B600", B600},
322 {"B1200", B1200},
323 {"B1800", B1800},
324 {"B2400", B2400},
325 {"B4800", B4800},
326 {"B9600", B9600},
327 {"B19200", B19200},
328 {"B38400", B38400},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000329#ifdef B57600
Fred Drakedf48d142001-02-27 21:22:39 +0000330 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000331#endif
332#ifdef B115200
Fred Drakedf48d142001-02-27 21:22:39 +0000333 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000334#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000335#ifdef B230400
Fred Drakedf48d142001-02-27 21:22:39 +0000336 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000337#endif
Fred Drake9ef7fa82001-03-01 21:54:49 +0000338#ifdef CBAUDEX
Fred Drakedf48d142001-02-27 21:22:39 +0000339 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000340#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000341
342 /* tcsetattr() constants */
343 {"TCSANOW", TCSANOW},
344 {"TCSADRAIN", TCSADRAIN},
345 {"TCSAFLUSH", TCSAFLUSH},
346
347 /* tcflush() constants */
348 {"TCIFLUSH", TCIFLUSH},
349 {"TCOFLUSH", TCOFLUSH},
350 {"TCIOFLUSH", TCIOFLUSH},
351
352 /* tcflow() constants */
353 {"TCOOFF", TCOOFF},
354 {"TCOON", TCOON},
355 {"TCIOFF", TCIOFF},
356 {"TCION", TCION},
357
358 /* struct termios.c_iflag constants */
359 {"IGNBRK", IGNBRK},
360 {"BRKINT", BRKINT},
361 {"IGNPAR", IGNPAR},
362 {"PARMRK", PARMRK},
363 {"INPCK", INPCK},
364 {"ISTRIP", ISTRIP},
365 {"INLCR", INLCR},
366 {"IGNCR", IGNCR},
367 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000368#ifdef IUCLC
Fred Drakedf48d142001-02-27 21:22:39 +0000369 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000370#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000371 {"IXON", IXON},
372 {"IXANY", IXANY},
373 {"IXOFF", IXOFF},
374 {"IMAXBEL", IMAXBEL},
375
376 /* struct termios.c_oflag constants */
377 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000378#ifdef OLCUC
Fred Drakedf48d142001-02-27 21:22:39 +0000379 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000380#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000381 {"ONLCR", ONLCR},
Fred Draked85556c2001-03-03 18:08:52 +0000382#ifdef OCRNL
Fred Drakedf48d142001-02-27 21:22:39 +0000383 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000384#endif
385#ifdef ONOCR
Fred Drakedf48d142001-02-27 21:22:39 +0000386 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000387#endif
388#ifdef ONLRET
Fred Drakedf48d142001-02-27 21:22:39 +0000389 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000390#endif
391#ifdef OFILL
Fred Drakedf48d142001-02-27 21:22:39 +0000392 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000393#endif
394#ifdef OFDEL
Fred Drakedf48d142001-02-27 21:22:39 +0000395 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000396#endif
397#ifdef NLDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000398 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000399#endif
400#ifdef CRDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000401 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000402#endif
403#ifdef TABDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000404 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000405#endif
406#ifdef BSDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000407 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000408#endif
409#ifdef VTDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000410 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000411#endif
412#ifdef FFDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000413 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000414#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000415
416 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000417#ifdef NL0
Fred Drakedf48d142001-02-27 21:22:39 +0000418 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000419#endif
420#ifdef NL1
Fred Drakedf48d142001-02-27 21:22:39 +0000421 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000422#endif
423#ifdef CR0
Fred Drakedf48d142001-02-27 21:22:39 +0000424 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000425#endif
426#ifdef CR1
Fred Drakedf48d142001-02-27 21:22:39 +0000427 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000428#endif
429#ifdef CR2
Fred Drakedf48d142001-02-27 21:22:39 +0000430 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000431#endif
432#ifdef CR3
Fred Drakedf48d142001-02-27 21:22:39 +0000433 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000434#endif
435#ifdef TAB0
Fred Drakedf48d142001-02-27 21:22:39 +0000436 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000437#endif
438#ifdef TAB1
Fred Drakedf48d142001-02-27 21:22:39 +0000439 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000440#endif
441#ifdef TAB2
Fred Drakedf48d142001-02-27 21:22:39 +0000442 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000443#endif
444#ifdef TAB3
Fred Drakedf48d142001-02-27 21:22:39 +0000445 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000446#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000447#ifdef XTABS
Fred Drakedf48d142001-02-27 21:22:39 +0000448 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000449#endif
Fred Draked85556c2001-03-03 18:08:52 +0000450#ifdef BS0
Fred Drakedf48d142001-02-27 21:22:39 +0000451 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000452#endif
453#ifdef BS1
Fred Drakedf48d142001-02-27 21:22:39 +0000454 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000455#endif
456#ifdef VT0
Fred Drakedf48d142001-02-27 21:22:39 +0000457 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000458#endif
459#ifdef VT1
Fred Drakedf48d142001-02-27 21:22:39 +0000460 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000461#endif
462#ifdef FF0
Fred Drakedf48d142001-02-27 21:22:39 +0000463 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000464#endif
465#ifdef FF1
Fred Drakedf48d142001-02-27 21:22:39 +0000466 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000467#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000468
469 /* struct termios.c_cflag constants */
470 {"CSIZE", CSIZE},
471 {"CSTOPB", CSTOPB},
472 {"CREAD", CREAD},
473 {"PARENB", PARENB},
474 {"PARODD", PARODD},
475 {"HUPCL", HUPCL},
476 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000477#ifdef CIBAUD
Fred Drakedf48d142001-02-27 21:22:39 +0000478 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000479#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000480#ifdef CRTSCTS
481 {"CRTSCTS", (long)CRTSCTS},
482#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000483
484 /* struct termios.c_cflag-related values (character size) */
485 {"CS5", CS5},
486 {"CS6", CS6},
487 {"CS7", CS7},
488 {"CS8", CS8},
489
490 /* struct termios.c_lflag constants */
491 {"ISIG", ISIG},
492 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000493#ifdef XCASE
Fred Drakedf48d142001-02-27 21:22:39 +0000494 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000495#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000496 {"ECHO", ECHO},
497 {"ECHOE", ECHOE},
498 {"ECHOK", ECHOK},
499 {"ECHONL", ECHONL},
500 {"ECHOCTL", ECHOCTL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000501#ifdef ECHOPRT
Fred Drakedf48d142001-02-27 21:22:39 +0000502 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000503#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000504 {"ECHOKE", ECHOKE},
505 {"FLUSHO", FLUSHO},
506 {"NOFLSH", NOFLSH},
507 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000508#ifdef PENDIN
Fred Drakedf48d142001-02-27 21:22:39 +0000509 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000510#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000511 {"IEXTEN", IEXTEN},
512
513 /* indexes into the control chars array returned by tcgetattr() */
514 {"VINTR", VINTR},
515 {"VQUIT", VQUIT},
516 {"VERASE", VERASE},
517 {"VKILL", VKILL},
518 {"VEOF", VEOF},
519 {"VTIME", VTIME},
520 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000521#ifdef VSWTC
522 /* The #defines above ensure that if either is defined, both are,
523 * but both may be omitted by the system headers. ;-( */
Fred Drakedf48d142001-02-27 21:22:39 +0000524 {"VSWTC", VSWTC},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000525 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000526#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000527 {"VSTART", VSTART},
528 {"VSTOP", VSTOP},
529 {"VSUSP", VSUSP},
530 {"VEOL", VEOL},
531 {"VREPRINT", VREPRINT},
532 {"VDISCARD", VDISCARD},
533 {"VWERASE", VWERASE},
534 {"VLNEXT", VLNEXT},
535 {"VEOL2", VEOL2},
536
Fred Drake55a00342001-03-26 17:14:02 +0000537
538#ifdef B460800
539 {"B460800", B460800},
540#endif
541#ifdef CBAUD
542 {"CBAUD", CBAUD},
543#endif
544#ifdef CDEL
545 {"CDEL", CDEL},
546#endif
547#ifdef CDSUSP
548 {"CDSUSP", CDSUSP},
549#endif
550#ifdef CEOF
551 {"CEOF", CEOF},
552#endif
553#ifdef CEOL
554 {"CEOL", CEOL},
555#endif
556#ifdef CEOL2
557 {"CEOL2", CEOL2},
558#endif
559#ifdef CEOT
560 {"CEOT", CEOT},
561#endif
562#ifdef CERASE
563 {"CERASE", CERASE},
564#endif
565#ifdef CESC
566 {"CESC", CESC},
567#endif
568#ifdef CFLUSH
569 {"CFLUSH", CFLUSH},
570#endif
571#ifdef CINTR
572 {"CINTR", CINTR},
573#endif
574#ifdef CKILL
575 {"CKILL", CKILL},
576#endif
577#ifdef CLNEXT
578 {"CLNEXT", CLNEXT},
579#endif
580#ifdef CNUL
581 {"CNUL", CNUL},
582#endif
583#ifdef COMMON
584 {"COMMON", COMMON},
585#endif
586#ifdef CQUIT
587 {"CQUIT", CQUIT},
588#endif
589#ifdef CRPRNT
590 {"CRPRNT", CRPRNT},
591#endif
592#ifdef CSTART
593 {"CSTART", CSTART},
594#endif
595#ifdef CSTOP
596 {"CSTOP", CSTOP},
597#endif
598#ifdef CSUSP
599 {"CSUSP", CSUSP},
600#endif
601#ifdef CSWTCH
602 {"CSWTCH", CSWTCH},
603#endif
604#ifdef CWERASE
605 {"CWERASE", CWERASE},
606#endif
607#ifdef EXTA
608 {"EXTA", EXTA},
609#endif
610#ifdef EXTB
611 {"EXTB", EXTB},
612#endif
613#ifdef FIOASYNC
614 {"FIOASYNC", FIOASYNC},
615#endif
616#ifdef FIOCLEX
617 {"FIOCLEX", FIOCLEX},
618#endif
619#ifdef FIONBIO
620 {"FIONBIO", FIONBIO},
621#endif
622#ifdef FIONCLEX
623 {"FIONCLEX", FIONCLEX},
624#endif
625#ifdef FIONREAD
626 {"FIONREAD", FIONREAD},
627#endif
628#ifdef IBSHIFT
629 {"IBSHIFT", IBSHIFT},
630#endif
631#ifdef INIT_C_CC
632 {"INIT_C_CC", INIT_C_CC},
633#endif
634#ifdef IOCSIZE_MASK
635 {"IOCSIZE_MASK", IOCSIZE_MASK},
636#endif
637#ifdef IOCSIZE_SHIFT
638 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
639#endif
640#ifdef NCC
641 {"NCC", NCC},
642#endif
643#ifdef NCCS
644 {"NCCS", NCCS},
645#endif
646#ifdef NSWTCH
647 {"NSWTCH", NSWTCH},
648#endif
649#ifdef N_MOUSE
650 {"N_MOUSE", N_MOUSE},
651#endif
652#ifdef N_PPP
653 {"N_PPP", N_PPP},
654#endif
655#ifdef N_SLIP
656 {"N_SLIP", N_SLIP},
657#endif
658#ifdef N_STRIP
659 {"N_STRIP", N_STRIP},
660#endif
661#ifdef N_TTY
662 {"N_TTY", N_TTY},
663#endif
664#ifdef TCFLSH
665 {"TCFLSH", TCFLSH},
666#endif
667#ifdef TCGETA
668 {"TCGETA", TCGETA},
669#endif
670#ifdef TCGETS
671 {"TCGETS", TCGETS},
672#endif
673#ifdef TCSBRK
674 {"TCSBRK", TCSBRK},
675#endif
676#ifdef TCSBRKP
677 {"TCSBRKP", TCSBRKP},
678#endif
679#ifdef TCSETA
680 {"TCSETA", TCSETA},
681#endif
682#ifdef TCSETAF
683 {"TCSETAF", TCSETAF},
684#endif
685#ifdef TCSETAW
686 {"TCSETAW", TCSETAW},
687#endif
688#ifdef TCSETS
689 {"TCSETS", TCSETS},
690#endif
691#ifdef TCSETSF
692 {"TCSETSF", TCSETSF},
693#endif
694#ifdef TCSETSW
695 {"TCSETSW", TCSETSW},
696#endif
697#ifdef TCXONC
698 {"TCXONC", TCXONC},
699#endif
700#ifdef TIOCCONS
701 {"TIOCCONS", TIOCCONS},
702#endif
703#ifdef TIOCEXCL
704 {"TIOCEXCL", TIOCEXCL},
705#endif
706#ifdef TIOCGETD
707 {"TIOCGETD", TIOCGETD},
708#endif
709#ifdef TIOCGICOUNT
710 {"TIOCGICOUNT", TIOCGICOUNT},
711#endif
712#ifdef TIOCGLCKTRMIOS
713 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
714#endif
715#ifdef TIOCGPGRP
716 {"TIOCGPGRP", TIOCGPGRP},
717#endif
718#ifdef TIOCGSERIAL
719 {"TIOCGSERIAL", TIOCGSERIAL},
720#endif
721#ifdef TIOCGSOFTCAR
722 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
723#endif
724#ifdef TIOCGWINSZ
725 {"TIOCGWINSZ", TIOCGWINSZ},
726#endif
727#ifdef TIOCINQ
728 {"TIOCINQ", TIOCINQ},
729#endif
730#ifdef TIOCLINUX
731 {"TIOCLINUX", TIOCLINUX},
732#endif
733#ifdef TIOCMBIC
734 {"TIOCMBIC", TIOCMBIC},
735#endif
736#ifdef TIOCMBIS
737 {"TIOCMBIS", TIOCMBIS},
738#endif
739#ifdef TIOCMGET
740 {"TIOCMGET", TIOCMGET},
741#endif
742#ifdef TIOCMIWAIT
743 {"TIOCMIWAIT", TIOCMIWAIT},
744#endif
745#ifdef TIOCMSET
746 {"TIOCMSET", TIOCMSET},
747#endif
748#ifdef TIOCM_CAR
749 {"TIOCM_CAR", TIOCM_CAR},
750#endif
751#ifdef TIOCM_CD
752 {"TIOCM_CD", TIOCM_CD},
753#endif
754#ifdef TIOCM_CTS
755 {"TIOCM_CTS", TIOCM_CTS},
756#endif
757#ifdef TIOCM_DSR
758 {"TIOCM_DSR", TIOCM_DSR},
759#endif
760#ifdef TIOCM_DTR
761 {"TIOCM_DTR", TIOCM_DTR},
762#endif
763#ifdef TIOCM_LE
764 {"TIOCM_LE", TIOCM_LE},
765#endif
766#ifdef TIOCM_RI
767 {"TIOCM_RI", TIOCM_RI},
768#endif
769#ifdef TIOCM_RNG
770 {"TIOCM_RNG", TIOCM_RNG},
771#endif
772#ifdef TIOCM_RTS
773 {"TIOCM_RTS", TIOCM_RTS},
774#endif
775#ifdef TIOCM_SR
776 {"TIOCM_SR", TIOCM_SR},
777#endif
778#ifdef TIOCM_ST
779 {"TIOCM_ST", TIOCM_ST},
780#endif
781#ifdef TIOCNOTTY
782 {"TIOCNOTTY", TIOCNOTTY},
783#endif
784#ifdef TIOCNXCL
785 {"TIOCNXCL", TIOCNXCL},
786#endif
787#ifdef TIOCOUTQ
788 {"TIOCOUTQ", TIOCOUTQ},
789#endif
790#ifdef TIOCPKT
791 {"TIOCPKT", TIOCPKT},
792#endif
793#ifdef TIOCPKT_DATA
794 {"TIOCPKT_DATA", TIOCPKT_DATA},
795#endif
796#ifdef TIOCPKT_DOSTOP
797 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
798#endif
799#ifdef TIOCPKT_FLUSHREAD
800 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
801#endif
802#ifdef TIOCPKT_FLUSHWRITE
803 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
804#endif
805#ifdef TIOCPKT_NOSTOP
806 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
807#endif
808#ifdef TIOCPKT_START
809 {"TIOCPKT_START", TIOCPKT_START},
810#endif
811#ifdef TIOCPKT_STOP
812 {"TIOCPKT_STOP", TIOCPKT_STOP},
813#endif
814#ifdef TIOCSCTTY
815 {"TIOCSCTTY", TIOCSCTTY},
816#endif
817#ifdef TIOCSERCONFIG
818 {"TIOCSERCONFIG", TIOCSERCONFIG},
819#endif
820#ifdef TIOCSERGETLSR
821 {"TIOCSERGETLSR", TIOCSERGETLSR},
822#endif
823#ifdef TIOCSERGETMULTI
824 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
825#endif
826#ifdef TIOCSERGSTRUCT
827 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
828#endif
829#ifdef TIOCSERGWILD
830 {"TIOCSERGWILD", TIOCSERGWILD},
831#endif
832#ifdef TIOCSERSETMULTI
833 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
834#endif
835#ifdef TIOCSERSWILD
836 {"TIOCSERSWILD", TIOCSERSWILD},
837#endif
838#ifdef TIOCSER_TEMT
839 {"TIOCSER_TEMT", TIOCSER_TEMT},
840#endif
841#ifdef TIOCSETD
842 {"TIOCSETD", TIOCSETD},
843#endif
844#ifdef TIOCSLCKTRMIOS
845 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
846#endif
847#ifdef TIOCSPGRP
848 {"TIOCSPGRP", TIOCSPGRP},
849#endif
850#ifdef TIOCSSERIAL
851 {"TIOCSSERIAL", TIOCSSERIAL},
852#endif
853#ifdef TIOCSSOFTCAR
854 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
855#endif
856#ifdef TIOCSTI
857 {"TIOCSTI", TIOCSTI},
858#endif
859#ifdef TIOCSWINSZ
860 {"TIOCSWINSZ", TIOCSWINSZ},
861#endif
862#ifdef TIOCTTYGSTRUCT
863 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
864#endif
865
Fred Drakedf48d142001-02-27 21:22:39 +0000866 /* sentinel */
867 {NULL, 0}
868};
869
870
Guido van Rossum3886bb61998-12-04 18:50:17 +0000871DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000872PyInit_termios(void)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000873{
874 PyObject *m, *d;
Fred Drakedf48d142001-02-27 21:22:39 +0000875 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000876
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000877 m = Py_InitModule4("termios", termios_methods, termios__doc__,
878 (PyObject *)NULL, PYTHON_API_VERSION);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000879
880 d = PyModule_GetDict(m);
Guido van Rossum0cb96de1997-10-01 04:29:29 +0000881 TermiosError = PyErr_NewException("termios.error", NULL, NULL);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000882 PyDict_SetItemString(d, "error", TermiosError);
Fred Drakedf48d142001-02-27 21:22:39 +0000883
884 while (constant->name != NULL) {
885 PyModule_AddIntConstant(m, constant->name, constant->value);
886 ++constant;
887 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000888}