blob: aaabe6034f96c722a38c8c27b831eedb73cc4ba4 [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
Fred Drake87068f12001-05-11 16:14:17 +000015/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
16 * MDTR, MRI, and MRTS (appearantly used internally by some things
17 * defined as macros; these are not used here directly).
18 */
19#ifdef HAVE_SYS_MODEM_H
20#include <sys/modem.h>
21#endif
22
Fred Drakeb638aaf2001-05-07 17:55:35 +000023static char termios__doc__[] = "\
24This module provides an interface to the Posix calls for tty I/O control.\n\
25For a complete description of these calls, see the Posix or Unix manual\n\
26pages. It is only available for those Unix versions that support Posix\n\
27termios style tty I/O control.\n\
28\n\
29All functions in this module take a file descriptor fd as their first\n\
30argument. This can be an integer file descriptor, such as returned by\n\
31sys.stdin.fileno(), or a file object, such as sys.stdin itself.";
Guido van Rossum9adae8e1994-09-12 10:41:22 +000032
33static PyObject *TermiosError;
34
Fred Drakeb638aaf2001-05-07 17:55:35 +000035static int fdconv(PyObject* obj, void* p)
36{
37 int fd;
38
39 fd = PyObject_AsFileDescriptor(obj);
Fred Drakec99ff602001-05-09 20:14:09 +000040 if (fd >= 0) {
41 *(int*)p = fd;
42 return 1;
Fred Drakeb638aaf2001-05-07 17:55:35 +000043 }
Fred Drakec99ff602001-05-09 20:14:09 +000044 return 0;
Fred Drakeb638aaf2001-05-07 17:55:35 +000045}
Guido van Rossum9adae8e1994-09-12 10:41:22 +000046
Guido van Rossum1aca4d81998-03-03 22:10:18 +000047static char termios_tcgetattr__doc__[] = "\
48tcgetattr(fd) -> list_of_attrs\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000049\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +000050Get the tty attributes for file descriptor fd, as follows:\n\
51[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
52of the tty special characters (each a string of length 1, except the items\n\
53with indices VMIN and VTIME, which are integers when these fields are\n\
54defined). The interpretation of the flags and the speeds as well as the\n\
55indexing in the cc array must be done using the symbolic constants defined\n\
Fred Drake29fd0312001-04-09 19:32:52 +000056in this module.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +000057
Guido van Rossum9adae8e1994-09-12 10:41:22 +000058static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +000059termios_tcgetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +000060{
61 int fd;
62 struct termios mode;
63 PyObject *cc;
64 speed_t ispeed, ospeed;
65 PyObject *v;
66 int i;
67 char ch;
68
Fred Drakeb638aaf2001-05-07 17:55:35 +000069 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
70 fdconv, (void*)&fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +000071 return NULL;
72
73 if (tcgetattr(fd, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +000074 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000075
76 ispeed = cfgetispeed(&mode);
77 ospeed = cfgetospeed(&mode);
78
79 cc = PyList_New(NCCS);
80 if (cc == NULL)
81 return NULL;
82 for (i = 0; i < NCCS; i++) {
83 ch = (char)mode.c_cc[i];
84 v = PyString_FromStringAndSize(&ch, 1);
85 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +000086 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000087 PyList_SetItem(cc, i, v);
88 }
89
90 /* Convert the MIN and TIME slots to integer. On some systems, the
91 MIN and TIME slots are the same as the EOF and EOL slots. So we
92 only do this in noncanonical input mode. */
Guido van Rossum36dd0d21996-12-10 15:23:00 +000093 if ((mode.c_lflag & ICANON) == 0) {
Guido van Rossum9adae8e1994-09-12 10:41:22 +000094 v = PyInt_FromLong((long)mode.c_cc[VMIN]);
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, VMIN, v);
98 v = PyInt_FromLong((long)mode.c_cc[VTIME]);
99 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000100 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000101 PyList_SetItem(cc, VTIME, v);
102 }
103
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000104 if (!(v = PyList_New(7)))
105 goto err;
106
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000107 PyList_SetItem(v, 0, PyInt_FromLong((long)mode.c_iflag));
108 PyList_SetItem(v, 1, PyInt_FromLong((long)mode.c_oflag));
109 PyList_SetItem(v, 2, PyInt_FromLong((long)mode.c_cflag));
110 PyList_SetItem(v, 3, PyInt_FromLong((long)mode.c_lflag));
111 PyList_SetItem(v, 4, PyInt_FromLong((long)ispeed));
112 PyList_SetItem(v, 5, PyInt_FromLong((long)ospeed));
113 PyList_SetItem(v, 6, cc);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000114 if (PyErr_Occurred()){
115 Py_DECREF(v);
116 goto err;
117 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000118 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000119 err:
120 Py_DECREF(cc);
121 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000122}
123
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000124static char termios_tcsetattr__doc__[] = "\
125tcsetattr(fd, when, attributes) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000126\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000127Set the tty attributes for file descriptor fd.\n\
128The attributes to be set are taken from the attributes argument, which\n\
129is a list like the one returned by tcgetattr(). The when argument\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000130determines when the attributes are changed: termios.TCSANOW to\n\
131change immediately, termios.TCSADRAIN to change after transmitting all\n\
132queued output, or termios.TCSAFLUSH to change after transmitting all\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000133queued output and discarding all queued input. ";
134
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000135static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000136termios_tcsetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000137{
138 int fd, when;
139 struct termios mode;
140 speed_t ispeed, ospeed;
141 PyObject *term, *cc, *v;
142 int i;
143
Fred Drakeb638aaf2001-05-07 17:55:35 +0000144 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
145 fdconv, &fd, &when, &term))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000146 return NULL;
147 if (!PyList_Check(term) || PyList_Size(term) != 7) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000148 PyErr_SetString(PyExc_TypeError,
149 "tcsetattr, arg 3: must be 7 element list");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000150 return NULL;
151 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000152
Guido van Rossume7c41931998-06-12 14:26:18 +0000153 /* Get the old mode, in case there are any hidden fields... */
154 if (tcgetattr(fd, &mode) == -1)
155 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000156 mode.c_iflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 0));
157 mode.c_oflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 1));
158 mode.c_cflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 2));
159 mode.c_lflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 3));
160 ispeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 4));
161 ospeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 5));
162 cc = PyList_GetItem(term, 6);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000163 if (PyErr_Occurred())
164 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000165
166 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000167 PyErr_Format(PyExc_TypeError,
168 "tcsetattr: attributes[6] must be %d element list",
169 NCCS);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000170 return NULL;
171 }
172
173 for (i = 0; i < NCCS; i++) {
174 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000175
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000176 if (PyString_Check(v) && PyString_Size(v) == 1)
177 mode.c_cc[i] = (cc_t) * PyString_AsString(v);
178 else if (PyInt_Check(v))
179 mode.c_cc[i] = (cc_t) PyInt_AsLong(v);
180 else {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000181 PyErr_SetString(PyExc_TypeError,
182 "tcsetattr: elements of attributes must be characters or integers");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000183 return NULL;
184 }
185 }
186
187 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000188 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000189 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000190 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000191 if (tcsetattr(fd, when, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000192 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000193
194 Py_INCREF(Py_None);
195 return Py_None;
196}
197
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000198static char termios_tcsendbreak__doc__[] = "\
199tcsendbreak(fd, duration) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000200\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000201Send a break on file descriptor fd.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000202A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
203has a system dependent meaning.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000204
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000205static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000206termios_tcsendbreak(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000207{
208 int fd, duration;
209
Fred Drakeb638aaf2001-05-07 17:55:35 +0000210 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
211 fdconv, &fd, &duration))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000212 return NULL;
213 if (tcsendbreak(fd, duration) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000214 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000215
216 Py_INCREF(Py_None);
217 return Py_None;
218}
219
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000220static char termios_tcdrain__doc__[] = "\
221tcdrain(fd) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000222\n\
223Wait until all output written to file descriptor fd has been transmitted.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000224
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000225static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000226termios_tcdrain(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000227{
228 int fd;
229
Fred Drakeb638aaf2001-05-07 17:55:35 +0000230 if (!PyArg_ParseTuple(args, "O&:tcdrain",
231 fdconv, &fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000232 return NULL;
233 if (tcdrain(fd) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000234 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000235
236 Py_INCREF(Py_None);
237 return Py_None;
238}
239
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000240static char termios_tcflush__doc__[] = "\
241tcflush(fd, queue) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000242\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000243Discard queued data on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000244The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
245queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000246both queues. ";
247
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000248static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000249termios_tcflush(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000250{
251 int fd, queue;
252
Fred Drakeb638aaf2001-05-07 17:55:35 +0000253 if (!PyArg_ParseTuple(args, "O&i:tcflush",
254 fdconv, &fd, &queue))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000255 return NULL;
256 if (tcflush(fd, queue) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000257 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000258
259 Py_INCREF(Py_None);
260 return Py_None;
261}
262
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000263static char termios_tcflow__doc__[] = "\
264tcflow(fd, action) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000265\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000266Suspend or resume input or output on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000267The action argument can be termios.TCOOFF to suspend output,\n\
268termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
269or termios.TCION to restart input.";
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000270
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000271static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000272termios_tcflow(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000273{
274 int fd, action;
275
Fred Drakeb638aaf2001-05-07 17:55:35 +0000276 if (!PyArg_ParseTuple(args, "O&i:tcflow",
277 fdconv, &fd, &action))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000278 return NULL;
279 if (tcflow(fd, action) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000280 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000281
282 Py_INCREF(Py_None);
283 return Py_None;
284}
285
286static PyMethodDef termios_methods[] =
287{
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000288 {"tcgetattr", termios_tcgetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000289 METH_VARARGS, termios_tcgetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000290 {"tcsetattr", termios_tcsetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000291 METH_VARARGS, termios_tcsetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000292 {"tcsendbreak", termios_tcsendbreak,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000293 METH_VARARGS, termios_tcsendbreak__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000294 {"tcdrain", termios_tcdrain,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000295 METH_VARARGS, termios_tcdrain__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000296 {"tcflush", termios_tcflush,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000297 METH_VARARGS, termios_tcflush__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000298 {"tcflow", termios_tcflow,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000299 METH_VARARGS, termios_tcflow__doc__},
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000300 {NULL, NULL}
301};
302
Fred Drakedf48d142001-02-27 21:22:39 +0000303
Fred Drake9ef7fa82001-03-01 21:54:49 +0000304#if defined(VSWTCH) && !defined(VSWTC)
305#define VSWTC VSWTCH
306#endif
307
308#if defined(VSWTC) && !defined(VSWTCH)
309#define VSWTCH VSWTC
310#endif
311
Fred Drakedf48d142001-02-27 21:22:39 +0000312static struct constant {
313 char *name;
314 long value;
315} termios_constants[] = {
316 /* cfgetospeed(), cfsetospeed() constants */
317 {"B0", B0},
318 {"B50", B50},
319 {"B75", B75},
320 {"B110", B110},
321 {"B134", B134},
322 {"B150", B150},
323 {"B200", B200},
324 {"B300", B300},
325 {"B600", B600},
326 {"B1200", B1200},
327 {"B1800", B1800},
328 {"B2400", B2400},
329 {"B4800", B4800},
330 {"B9600", B9600},
331 {"B19200", B19200},
332 {"B38400", B38400},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000333#ifdef B57600
Fred Drakedf48d142001-02-27 21:22:39 +0000334 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000335#endif
336#ifdef B115200
Fred Drakedf48d142001-02-27 21:22:39 +0000337 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000338#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000339#ifdef B230400
Fred Drakedf48d142001-02-27 21:22:39 +0000340 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000341#endif
Fred Drake9ef7fa82001-03-01 21:54:49 +0000342#ifdef CBAUDEX
Fred Drakedf48d142001-02-27 21:22:39 +0000343 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000344#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000345
346 /* tcsetattr() constants */
347 {"TCSANOW", TCSANOW},
348 {"TCSADRAIN", TCSADRAIN},
349 {"TCSAFLUSH", TCSAFLUSH},
350
351 /* tcflush() constants */
352 {"TCIFLUSH", TCIFLUSH},
353 {"TCOFLUSH", TCOFLUSH},
354 {"TCIOFLUSH", TCIOFLUSH},
355
356 /* tcflow() constants */
357 {"TCOOFF", TCOOFF},
358 {"TCOON", TCOON},
359 {"TCIOFF", TCIOFF},
360 {"TCION", TCION},
361
362 /* struct termios.c_iflag constants */
363 {"IGNBRK", IGNBRK},
364 {"BRKINT", BRKINT},
365 {"IGNPAR", IGNPAR},
366 {"PARMRK", PARMRK},
367 {"INPCK", INPCK},
368 {"ISTRIP", ISTRIP},
369 {"INLCR", INLCR},
370 {"IGNCR", IGNCR},
371 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000372#ifdef IUCLC
Fred Drakedf48d142001-02-27 21:22:39 +0000373 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000374#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000375 {"IXON", IXON},
376 {"IXANY", IXANY},
377 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000378#ifdef IMAXBEL
Fred Drakedf48d142001-02-27 21:22:39 +0000379 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000380#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000381
382 /* struct termios.c_oflag constants */
383 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000384#ifdef OLCUC
Fred Drakedf48d142001-02-27 21:22:39 +0000385 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000386#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000387 {"ONLCR", ONLCR},
Fred Draked85556c2001-03-03 18:08:52 +0000388#ifdef OCRNL
Fred Drakedf48d142001-02-27 21:22:39 +0000389 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000390#endif
391#ifdef ONOCR
Fred Drakedf48d142001-02-27 21:22:39 +0000392 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000393#endif
394#ifdef ONLRET
Fred Drakedf48d142001-02-27 21:22:39 +0000395 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000396#endif
397#ifdef OFILL
Fred Drakedf48d142001-02-27 21:22:39 +0000398 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000399#endif
400#ifdef OFDEL
Fred Drakedf48d142001-02-27 21:22:39 +0000401 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000402#endif
403#ifdef NLDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000404 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000405#endif
406#ifdef CRDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000407 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000408#endif
409#ifdef TABDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000410 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000411#endif
412#ifdef BSDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000413 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000414#endif
415#ifdef VTDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000416 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000417#endif
418#ifdef FFDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000419 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000420#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000421
422 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000423#ifdef NL0
Fred Drakedf48d142001-02-27 21:22:39 +0000424 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000425#endif
426#ifdef NL1
Fred Drakedf48d142001-02-27 21:22:39 +0000427 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000428#endif
429#ifdef CR0
Fred Drakedf48d142001-02-27 21:22:39 +0000430 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000431#endif
432#ifdef CR1
Fred Drakedf48d142001-02-27 21:22:39 +0000433 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000434#endif
435#ifdef CR2
Fred Drakedf48d142001-02-27 21:22:39 +0000436 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000437#endif
438#ifdef CR3
Fred Drakedf48d142001-02-27 21:22:39 +0000439 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000440#endif
441#ifdef TAB0
Fred Drakedf48d142001-02-27 21:22:39 +0000442 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000443#endif
444#ifdef TAB1
Fred Drakedf48d142001-02-27 21:22:39 +0000445 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000446#endif
447#ifdef TAB2
Fred Drakedf48d142001-02-27 21:22:39 +0000448 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000449#endif
450#ifdef TAB3
Fred Drakedf48d142001-02-27 21:22:39 +0000451 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000452#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000453#ifdef XTABS
Fred Drakedf48d142001-02-27 21:22:39 +0000454 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000455#endif
Fred Draked85556c2001-03-03 18:08:52 +0000456#ifdef BS0
Fred Drakedf48d142001-02-27 21:22:39 +0000457 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000458#endif
459#ifdef BS1
Fred Drakedf48d142001-02-27 21:22:39 +0000460 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000461#endif
462#ifdef VT0
Fred Drakedf48d142001-02-27 21:22:39 +0000463 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000464#endif
465#ifdef VT1
Fred Drakedf48d142001-02-27 21:22:39 +0000466 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000467#endif
468#ifdef FF0
Fred Drakedf48d142001-02-27 21:22:39 +0000469 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000470#endif
471#ifdef FF1
Fred Drakedf48d142001-02-27 21:22:39 +0000472 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000473#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000474
475 /* struct termios.c_cflag constants */
476 {"CSIZE", CSIZE},
477 {"CSTOPB", CSTOPB},
478 {"CREAD", CREAD},
479 {"PARENB", PARENB},
480 {"PARODD", PARODD},
481 {"HUPCL", HUPCL},
482 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000483#ifdef CIBAUD
Fred Drakedf48d142001-02-27 21:22:39 +0000484 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000485#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000486#ifdef CRTSCTS
487 {"CRTSCTS", (long)CRTSCTS},
488#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000489
490 /* struct termios.c_cflag-related values (character size) */
491 {"CS5", CS5},
492 {"CS6", CS6},
493 {"CS7", CS7},
494 {"CS8", CS8},
495
496 /* struct termios.c_lflag constants */
497 {"ISIG", ISIG},
498 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000499#ifdef XCASE
Fred Drakedf48d142001-02-27 21:22:39 +0000500 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000501#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000502 {"ECHO", ECHO},
503 {"ECHOE", ECHOE},
504 {"ECHOK", ECHOK},
505 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000506#ifdef ECHOCTL
Fred Drakedf48d142001-02-27 21:22:39 +0000507 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000508#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000509#ifdef ECHOPRT
Fred Drakedf48d142001-02-27 21:22:39 +0000510 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000511#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000512#ifdef ECHOKE
Fred Drakedf48d142001-02-27 21:22:39 +0000513 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000514#endif
515#ifdef FLUSHO
Fred Drakedf48d142001-02-27 21:22:39 +0000516 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000517#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000518 {"NOFLSH", NOFLSH},
519 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000520#ifdef PENDIN
Fred Drakedf48d142001-02-27 21:22:39 +0000521 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000522#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000523 {"IEXTEN", IEXTEN},
524
525 /* indexes into the control chars array returned by tcgetattr() */
526 {"VINTR", VINTR},
527 {"VQUIT", VQUIT},
528 {"VERASE", VERASE},
529 {"VKILL", VKILL},
530 {"VEOF", VEOF},
531 {"VTIME", VTIME},
532 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000533#ifdef VSWTC
534 /* The #defines above ensure that if either is defined, both are,
535 * but both may be omitted by the system headers. ;-( */
Fred Drakedf48d142001-02-27 21:22:39 +0000536 {"VSWTC", VSWTC},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000537 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000538#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000539 {"VSTART", VSTART},
540 {"VSTOP", VSTOP},
541 {"VSUSP", VSUSP},
542 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000543#ifdef VREPRINT
Fred Drakedf48d142001-02-27 21:22:39 +0000544 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000545#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000546#ifdef VDISCARD
Fred Drakedf48d142001-02-27 21:22:39 +0000547 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000548#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000549#ifdef VWERASE
Fred Drakedf48d142001-02-27 21:22:39 +0000550 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000551#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000552#ifdef VLNEXT
Fred Drakedf48d142001-02-27 21:22:39 +0000553 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000554#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000555 {"VEOL2", VEOL2},
556
Fred Drake55a00342001-03-26 17:14:02 +0000557
558#ifdef B460800
559 {"B460800", B460800},
560#endif
561#ifdef CBAUD
562 {"CBAUD", CBAUD},
563#endif
564#ifdef CDEL
565 {"CDEL", CDEL},
566#endif
567#ifdef CDSUSP
568 {"CDSUSP", CDSUSP},
569#endif
570#ifdef CEOF
571 {"CEOF", CEOF},
572#endif
573#ifdef CEOL
574 {"CEOL", CEOL},
575#endif
576#ifdef CEOL2
577 {"CEOL2", CEOL2},
578#endif
579#ifdef CEOT
580 {"CEOT", CEOT},
581#endif
582#ifdef CERASE
583 {"CERASE", CERASE},
584#endif
585#ifdef CESC
586 {"CESC", CESC},
587#endif
588#ifdef CFLUSH
589 {"CFLUSH", CFLUSH},
590#endif
591#ifdef CINTR
592 {"CINTR", CINTR},
593#endif
594#ifdef CKILL
595 {"CKILL", CKILL},
596#endif
597#ifdef CLNEXT
598 {"CLNEXT", CLNEXT},
599#endif
600#ifdef CNUL
601 {"CNUL", CNUL},
602#endif
603#ifdef COMMON
604 {"COMMON", COMMON},
605#endif
606#ifdef CQUIT
607 {"CQUIT", CQUIT},
608#endif
609#ifdef CRPRNT
610 {"CRPRNT", CRPRNT},
611#endif
612#ifdef CSTART
613 {"CSTART", CSTART},
614#endif
615#ifdef CSTOP
616 {"CSTOP", CSTOP},
617#endif
618#ifdef CSUSP
619 {"CSUSP", CSUSP},
620#endif
621#ifdef CSWTCH
622 {"CSWTCH", CSWTCH},
623#endif
624#ifdef CWERASE
625 {"CWERASE", CWERASE},
626#endif
627#ifdef EXTA
628 {"EXTA", EXTA},
629#endif
630#ifdef EXTB
631 {"EXTB", EXTB},
632#endif
633#ifdef FIOASYNC
634 {"FIOASYNC", FIOASYNC},
635#endif
636#ifdef FIOCLEX
637 {"FIOCLEX", FIOCLEX},
638#endif
639#ifdef FIONBIO
640 {"FIONBIO", FIONBIO},
641#endif
642#ifdef FIONCLEX
643 {"FIONCLEX", FIONCLEX},
644#endif
645#ifdef FIONREAD
646 {"FIONREAD", FIONREAD},
647#endif
648#ifdef IBSHIFT
649 {"IBSHIFT", IBSHIFT},
650#endif
651#ifdef INIT_C_CC
652 {"INIT_C_CC", INIT_C_CC},
653#endif
654#ifdef IOCSIZE_MASK
655 {"IOCSIZE_MASK", IOCSIZE_MASK},
656#endif
657#ifdef IOCSIZE_SHIFT
658 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
659#endif
660#ifdef NCC
661 {"NCC", NCC},
662#endif
663#ifdef NCCS
664 {"NCCS", NCCS},
665#endif
666#ifdef NSWTCH
667 {"NSWTCH", NSWTCH},
668#endif
669#ifdef N_MOUSE
670 {"N_MOUSE", N_MOUSE},
671#endif
672#ifdef N_PPP
673 {"N_PPP", N_PPP},
674#endif
675#ifdef N_SLIP
676 {"N_SLIP", N_SLIP},
677#endif
678#ifdef N_STRIP
679 {"N_STRIP", N_STRIP},
680#endif
681#ifdef N_TTY
682 {"N_TTY", N_TTY},
683#endif
684#ifdef TCFLSH
685 {"TCFLSH", TCFLSH},
686#endif
687#ifdef TCGETA
688 {"TCGETA", TCGETA},
689#endif
690#ifdef TCGETS
691 {"TCGETS", TCGETS},
692#endif
693#ifdef TCSBRK
694 {"TCSBRK", TCSBRK},
695#endif
696#ifdef TCSBRKP
697 {"TCSBRKP", TCSBRKP},
698#endif
699#ifdef TCSETA
700 {"TCSETA", TCSETA},
701#endif
702#ifdef TCSETAF
703 {"TCSETAF", TCSETAF},
704#endif
705#ifdef TCSETAW
706 {"TCSETAW", TCSETAW},
707#endif
708#ifdef TCSETS
709 {"TCSETS", TCSETS},
710#endif
711#ifdef TCSETSF
712 {"TCSETSF", TCSETSF},
713#endif
714#ifdef TCSETSW
715 {"TCSETSW", TCSETSW},
716#endif
717#ifdef TCXONC
718 {"TCXONC", TCXONC},
719#endif
720#ifdef TIOCCONS
721 {"TIOCCONS", TIOCCONS},
722#endif
723#ifdef TIOCEXCL
724 {"TIOCEXCL", TIOCEXCL},
725#endif
726#ifdef TIOCGETD
727 {"TIOCGETD", TIOCGETD},
728#endif
729#ifdef TIOCGICOUNT
730 {"TIOCGICOUNT", TIOCGICOUNT},
731#endif
732#ifdef TIOCGLCKTRMIOS
733 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
734#endif
735#ifdef TIOCGPGRP
736 {"TIOCGPGRP", TIOCGPGRP},
737#endif
738#ifdef TIOCGSERIAL
739 {"TIOCGSERIAL", TIOCGSERIAL},
740#endif
741#ifdef TIOCGSOFTCAR
742 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
743#endif
744#ifdef TIOCGWINSZ
745 {"TIOCGWINSZ", TIOCGWINSZ},
746#endif
747#ifdef TIOCINQ
748 {"TIOCINQ", TIOCINQ},
749#endif
750#ifdef TIOCLINUX
751 {"TIOCLINUX", TIOCLINUX},
752#endif
753#ifdef TIOCMBIC
754 {"TIOCMBIC", TIOCMBIC},
755#endif
756#ifdef TIOCMBIS
757 {"TIOCMBIS", TIOCMBIS},
758#endif
759#ifdef TIOCMGET
760 {"TIOCMGET", TIOCMGET},
761#endif
762#ifdef TIOCMIWAIT
763 {"TIOCMIWAIT", TIOCMIWAIT},
764#endif
765#ifdef TIOCMSET
766 {"TIOCMSET", TIOCMSET},
767#endif
768#ifdef TIOCM_CAR
769 {"TIOCM_CAR", TIOCM_CAR},
770#endif
771#ifdef TIOCM_CD
772 {"TIOCM_CD", TIOCM_CD},
773#endif
774#ifdef TIOCM_CTS
775 {"TIOCM_CTS", TIOCM_CTS},
776#endif
777#ifdef TIOCM_DSR
778 {"TIOCM_DSR", TIOCM_DSR},
779#endif
780#ifdef TIOCM_DTR
781 {"TIOCM_DTR", TIOCM_DTR},
782#endif
783#ifdef TIOCM_LE
784 {"TIOCM_LE", TIOCM_LE},
785#endif
786#ifdef TIOCM_RI
787 {"TIOCM_RI", TIOCM_RI},
788#endif
789#ifdef TIOCM_RNG
790 {"TIOCM_RNG", TIOCM_RNG},
791#endif
792#ifdef TIOCM_RTS
793 {"TIOCM_RTS", TIOCM_RTS},
794#endif
795#ifdef TIOCM_SR
796 {"TIOCM_SR", TIOCM_SR},
797#endif
798#ifdef TIOCM_ST
799 {"TIOCM_ST", TIOCM_ST},
800#endif
801#ifdef TIOCNOTTY
802 {"TIOCNOTTY", TIOCNOTTY},
803#endif
804#ifdef TIOCNXCL
805 {"TIOCNXCL", TIOCNXCL},
806#endif
807#ifdef TIOCOUTQ
808 {"TIOCOUTQ", TIOCOUTQ},
809#endif
810#ifdef TIOCPKT
811 {"TIOCPKT", TIOCPKT},
812#endif
813#ifdef TIOCPKT_DATA
814 {"TIOCPKT_DATA", TIOCPKT_DATA},
815#endif
816#ifdef TIOCPKT_DOSTOP
817 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
818#endif
819#ifdef TIOCPKT_FLUSHREAD
820 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
821#endif
822#ifdef TIOCPKT_FLUSHWRITE
823 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
824#endif
825#ifdef TIOCPKT_NOSTOP
826 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
827#endif
828#ifdef TIOCPKT_START
829 {"TIOCPKT_START", TIOCPKT_START},
830#endif
831#ifdef TIOCPKT_STOP
832 {"TIOCPKT_STOP", TIOCPKT_STOP},
833#endif
834#ifdef TIOCSCTTY
835 {"TIOCSCTTY", TIOCSCTTY},
836#endif
837#ifdef TIOCSERCONFIG
838 {"TIOCSERCONFIG", TIOCSERCONFIG},
839#endif
840#ifdef TIOCSERGETLSR
841 {"TIOCSERGETLSR", TIOCSERGETLSR},
842#endif
843#ifdef TIOCSERGETMULTI
844 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
845#endif
846#ifdef TIOCSERGSTRUCT
847 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
848#endif
849#ifdef TIOCSERGWILD
850 {"TIOCSERGWILD", TIOCSERGWILD},
851#endif
852#ifdef TIOCSERSETMULTI
853 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
854#endif
855#ifdef TIOCSERSWILD
856 {"TIOCSERSWILD", TIOCSERSWILD},
857#endif
858#ifdef TIOCSER_TEMT
859 {"TIOCSER_TEMT", TIOCSER_TEMT},
860#endif
861#ifdef TIOCSETD
862 {"TIOCSETD", TIOCSETD},
863#endif
864#ifdef TIOCSLCKTRMIOS
865 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
866#endif
867#ifdef TIOCSPGRP
868 {"TIOCSPGRP", TIOCSPGRP},
869#endif
870#ifdef TIOCSSERIAL
871 {"TIOCSSERIAL", TIOCSSERIAL},
872#endif
873#ifdef TIOCSSOFTCAR
874 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
875#endif
876#ifdef TIOCSTI
877 {"TIOCSTI", TIOCSTI},
878#endif
879#ifdef TIOCSWINSZ
880 {"TIOCSWINSZ", TIOCSWINSZ},
881#endif
882#ifdef TIOCTTYGSTRUCT
883 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
884#endif
885
Fred Drakedf48d142001-02-27 21:22:39 +0000886 /* sentinel */
887 {NULL, 0}
888};
889
890
Guido van Rossum3886bb61998-12-04 18:50:17 +0000891DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000892PyInit_termios(void)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000893{
Fred Drake78f6c862002-02-14 07:11:23 +0000894 PyObject *m;
Fred Drakedf48d142001-02-27 21:22:39 +0000895 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000896
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000897 m = Py_InitModule4("termios", termios_methods, termios__doc__,
898 (PyObject *)NULL, PYTHON_API_VERSION);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000899
Fred Drake78f6c862002-02-14 07:11:23 +0000900 if (TermiosError == NULL) {
901 TermiosError = PyErr_NewException("termios.error", NULL, NULL);
902 }
903 Py_INCREF(TermiosError);
904 PyModule_AddObject(m, "error", TermiosError);
Fred Drakedf48d142001-02-27 21:22:39 +0000905
906 while (constant->name != NULL) {
907 PyModule_AddIntConstant(m, constant->name, constant->value);
908 ++constant;
909 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000910}