blob: 845925785598d3d4b5f53e3d50290845ca438d90 [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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000047 int fd;
Fred Drakeb638aaf2001-05-07 17:55:35 +000048
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000049 fd = PyObject_AsFileDescriptor(obj);
50 if (fd >= 0) {
51 *(int*)p = fd;
52 return 1;
53 }
54 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000071 int fd;
72 struct termios mode;
73 PyObject *cc;
74 speed_t ispeed, ospeed;
75 PyObject *v;
76 int i;
77 char ch;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000078
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000079 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
80 fdconv, (void*)&fd))
81 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000082
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000083 if (tcgetattr(fd, &mode) == -1)
84 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000085
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000086 ispeed = cfgetispeed(&mode);
87 ospeed = cfgetospeed(&mode);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000088
Antoine Pitrouc7c96a92010-05-09 15:15:40 +000089 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)
96 goto err;
97 PyList_SetItem(cc, i, v);
98 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +000099
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000100 /* 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. */
103 if ((mode.c_lflag & ICANON) == 0) {
104 v = PyInt_FromLong((long)mode.c_cc[VMIN]);
105 if (v == NULL)
106 goto err;
107 PyList_SetItem(cc, VMIN, v);
108 v = PyInt_FromLong((long)mode.c_cc[VTIME]);
109 if (v == NULL)
110 goto err;
111 PyList_SetItem(cc, VTIME, v);
112 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000113
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000114 if (!(v = PyList_New(7)))
115 goto err;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000116
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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);
124 if (PyErr_Occurred()){
125 Py_DECREF(v);
126 goto err;
127 }
128 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000129 err:
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000130 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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000148 int fd, when;
149 struct termios mode;
150 speed_t ispeed, ospeed;
151 PyObject *term, *cc, *v;
152 int i;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000153
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000154 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
155 fdconv, &fd, &when, &term))
156 return NULL;
157 if (!PyList_Check(term) || PyList_Size(term) != 7) {
158 PyErr_SetString(PyExc_TypeError,
159 "tcsetattr, arg 3: must be 7 element list");
160 return NULL;
161 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000162
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000163 /* Get the old mode, in case there are any hidden fields... */
164 if (tcgetattr(fd, &mode) == -1)
165 return PyErr_SetFromErrno(TermiosError);
166 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);
173 if (PyErr_Occurred())
174 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000175
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000176 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
177 PyErr_Format(PyExc_TypeError,
178 "tcsetattr: attributes[6] must be %d element list",
179 NCCS);
180 return NULL;
181 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000182
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000183 for (i = 0; i < NCCS; i++) {
184 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000185
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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 {
191 PyErr_SetString(PyExc_TypeError,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000192 "tcsetattr: elements of attributes must be characters or integers");
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000193 return NULL;
194 }
195 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000196
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000197 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
198 return PyErr_SetFromErrno(TermiosError);
199 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
200 return PyErr_SetFromErrno(TermiosError);
201 if (tcsetattr(fd, when, &mode) == -1)
202 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000203
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000204 Py_INCREF(Py_None);
205 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000206}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000218 int fd, duration;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000219
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000220 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
221 fdconv, &fd, &duration))
222 return NULL;
223 if (tcsendbreak(fd, duration) == -1)
224 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000225
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000226 Py_INCREF(Py_None);
227 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000228}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000238 int fd;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000239
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000240 if (!PyArg_ParseTuple(args, "O&:tcdrain",
241 fdconv, &fd))
242 return NULL;
243 if (tcdrain(fd) == -1)
244 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000245
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000246 Py_INCREF(Py_None);
247 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000248}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000261 int fd, queue;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000262
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000263 if (!PyArg_ParseTuple(args, "O&i:tcflush",
264 fdconv, &fd, &queue))
265 return NULL;
266 if (tcflush(fd, queue) == -1)
267 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000268
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000269 Py_INCREF(Py_None);
270 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000271}
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000284 int fd, action;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000285
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000286 if (!PyArg_ParseTuple(args, "O&i:tcflow",
287 fdconv, &fd, &action))
288 return NULL;
289 if (tcflow(fd, action) == -1)
290 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000291
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000292 Py_INCREF(Py_None);
293 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000294}
295
296static PyMethodDef termios_methods[] =
297{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000298 {"tcgetattr", termios_tcgetattr,
299 METH_VARARGS, termios_tcgetattr__doc__},
300 {"tcsetattr", termios_tcsetattr,
301 METH_VARARGS, termios_tcsetattr__doc__},
302 {"tcsendbreak", termios_tcsendbreak,
303 METH_VARARGS, termios_tcsendbreak__doc__},
304 {"tcdrain", termios_tcdrain,
305 METH_VARARGS, termios_tcdrain__doc__},
306 {"tcflush", termios_tcflush,
307 METH_VARARGS, termios_tcflush__doc__},
308 {"tcflow", termios_tcflow,
309 METH_VARARGS, termios_tcflow__doc__},
310 {NULL, NULL}
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000311};
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 {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000323 char *name;
324 long value;
Fred Drakedf48d142001-02-27 21:22:39 +0000325} termios_constants[] = {
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000326 /* 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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000344 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000345#endif
346#ifdef B115200
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000347 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000348#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000349#ifdef B230400
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000350 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000351#endif
Fred Drake9ef7fa82001-03-01 21:54:49 +0000352#ifdef CBAUDEX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000353 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000354#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000355
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000356 /* tcsetattr() constants */
357 {"TCSANOW", TCSANOW},
358 {"TCSADRAIN", TCSADRAIN},
359 {"TCSAFLUSH", TCSAFLUSH},
Fred Drakedf48d142001-02-27 21:22:39 +0000360
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000361 /* tcflush() constants */
362 {"TCIFLUSH", TCIFLUSH},
363 {"TCOFLUSH", TCOFLUSH},
364 {"TCIOFLUSH", TCIOFLUSH},
Fred Drakedf48d142001-02-27 21:22:39 +0000365
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000366 /* tcflow() constants */
367 {"TCOOFF", TCOOFF},
368 {"TCOON", TCOON},
369 {"TCIOFF", TCIOFF},
370 {"TCION", TCION},
Fred Drakedf48d142001-02-27 21:22:39 +0000371
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000372 /* 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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000383 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000384#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000385 {"IXON", IXON},
386 {"IXANY", IXANY},
387 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000388#ifdef IMAXBEL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000389 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000390#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000391
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000392 /* struct termios.c_oflag constants */
393 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000394#ifdef OLCUC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000395 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000396#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000397#ifdef ONLCR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000398 {"ONLCR", ONLCR},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000399#endif
Fred Draked85556c2001-03-03 18:08:52 +0000400#ifdef OCRNL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000401 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000402#endif
403#ifdef ONOCR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000404 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000405#endif
406#ifdef ONLRET
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000407 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000408#endif
409#ifdef OFILL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000410 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000411#endif
412#ifdef OFDEL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000413 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000414#endif
415#ifdef NLDLY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000416 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000417#endif
418#ifdef CRDLY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000419 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000420#endif
421#ifdef TABDLY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000422 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000423#endif
424#ifdef BSDLY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000425 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000426#endif
427#ifdef VTDLY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000428 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000429#endif
430#ifdef FFDLY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000431 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000432#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000433
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000434 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000435#ifdef NL0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000436 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000437#endif
438#ifdef NL1
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000439 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000440#endif
441#ifdef CR0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000442 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000443#endif
444#ifdef CR1
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000445 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000446#endif
447#ifdef CR2
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000448 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000449#endif
450#ifdef CR3
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000451 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000452#endif
453#ifdef TAB0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000454 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000455#endif
456#ifdef TAB1
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000457 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000458#endif
459#ifdef TAB2
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000460 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000461#endif
462#ifdef TAB3
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000463 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000464#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000465#ifdef XTABS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000466 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000467#endif
Fred Draked85556c2001-03-03 18:08:52 +0000468#ifdef BS0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000469 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000470#endif
471#ifdef BS1
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000472 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000473#endif
474#ifdef VT0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000475 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000476#endif
477#ifdef VT1
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000478 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000479#endif
480#ifdef FF0
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000481 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000482#endif
483#ifdef FF1
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000484 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000485#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000486
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000487 /* 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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000496 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000497#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000498#ifdef CRTSCTS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000499 {"CRTSCTS", (long)CRTSCTS},
Fred Drakededbebf2001-03-02 06:50:58 +0000500#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000501
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000502 /* struct termios.c_cflag-related values (character size) */
503 {"CS5", CS5},
504 {"CS6", CS6},
505 {"CS7", CS7},
506 {"CS8", CS8},
Fred Drakedf48d142001-02-27 21:22:39 +0000507
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000508 /* struct termios.c_lflag constants */
509 {"ISIG", ISIG},
510 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000511#ifdef XCASE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000512 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000513#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000514 {"ECHO", ECHO},
515 {"ECHOE", ECHOE},
516 {"ECHOK", ECHOK},
517 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000518#ifdef ECHOCTL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000519 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000520#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000521#ifdef ECHOPRT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000522 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000523#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000524#ifdef ECHOKE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000525 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000526#endif
527#ifdef FLUSHO
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000528 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000529#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000530 {"NOFLSH", NOFLSH},
531 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000532#ifdef PENDIN
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000533 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000534#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000535 {"IEXTEN", IEXTEN},
Fred Drakedf48d142001-02-27 21:22:39 +0000536
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000537 /* 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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000546 /* The #defines above ensure that if either is defined, both are,
547 * but both may be omitted by the system headers. ;-( */
548 {"VSWTC", VSWTC},
549 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000550#endif
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000551 {"VSTART", VSTART},
552 {"VSTOP", VSTOP},
553 {"VSUSP", VSUSP},
554 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000555#ifdef VREPRINT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000556 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000557#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000558#ifdef VDISCARD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000559 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000560#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000561#ifdef VWERASE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000562 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000563#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000564#ifdef VLNEXT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000565 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000566#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000567#ifdef VEOL2
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000573 {"B460800", B460800},
Fred Drake55a00342001-03-26 17:14:02 +0000574#endif
575#ifdef CBAUD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000576 {"CBAUD", CBAUD},
Fred Drake55a00342001-03-26 17:14:02 +0000577#endif
578#ifdef CDEL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000579 {"CDEL", CDEL},
Fred Drake55a00342001-03-26 17:14:02 +0000580#endif
581#ifdef CDSUSP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000582 {"CDSUSP", CDSUSP},
Fred Drake55a00342001-03-26 17:14:02 +0000583#endif
584#ifdef CEOF
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000585 {"CEOF", CEOF},
Fred Drake55a00342001-03-26 17:14:02 +0000586#endif
587#ifdef CEOL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000588 {"CEOL", CEOL},
Fred Drake55a00342001-03-26 17:14:02 +0000589#endif
590#ifdef CEOL2
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000591 {"CEOL2", CEOL2},
Fred Drake55a00342001-03-26 17:14:02 +0000592#endif
593#ifdef CEOT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000594 {"CEOT", CEOT},
Fred Drake55a00342001-03-26 17:14:02 +0000595#endif
596#ifdef CERASE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000597 {"CERASE", CERASE},
Fred Drake55a00342001-03-26 17:14:02 +0000598#endif
599#ifdef CESC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000600 {"CESC", CESC},
Fred Drake55a00342001-03-26 17:14:02 +0000601#endif
602#ifdef CFLUSH
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000603 {"CFLUSH", CFLUSH},
Fred Drake55a00342001-03-26 17:14:02 +0000604#endif
605#ifdef CINTR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000606 {"CINTR", CINTR},
Fred Drake55a00342001-03-26 17:14:02 +0000607#endif
608#ifdef CKILL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000609 {"CKILL", CKILL},
Fred Drake55a00342001-03-26 17:14:02 +0000610#endif
611#ifdef CLNEXT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000612 {"CLNEXT", CLNEXT},
Fred Drake55a00342001-03-26 17:14:02 +0000613#endif
614#ifdef CNUL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000615 {"CNUL", CNUL},
Fred Drake55a00342001-03-26 17:14:02 +0000616#endif
617#ifdef COMMON
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000618 {"COMMON", COMMON},
Fred Drake55a00342001-03-26 17:14:02 +0000619#endif
620#ifdef CQUIT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000621 {"CQUIT", CQUIT},
Fred Drake55a00342001-03-26 17:14:02 +0000622#endif
623#ifdef CRPRNT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000624 {"CRPRNT", CRPRNT},
Fred Drake55a00342001-03-26 17:14:02 +0000625#endif
626#ifdef CSTART
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000627 {"CSTART", CSTART},
Fred Drake55a00342001-03-26 17:14:02 +0000628#endif
629#ifdef CSTOP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000630 {"CSTOP", CSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000631#endif
632#ifdef CSUSP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000633 {"CSUSP", CSUSP},
Fred Drake55a00342001-03-26 17:14:02 +0000634#endif
635#ifdef CSWTCH
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000636 {"CSWTCH", CSWTCH},
Fred Drake55a00342001-03-26 17:14:02 +0000637#endif
638#ifdef CWERASE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000639 {"CWERASE", CWERASE},
Fred Drake55a00342001-03-26 17:14:02 +0000640#endif
641#ifdef EXTA
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000642 {"EXTA", EXTA},
Fred Drake55a00342001-03-26 17:14:02 +0000643#endif
644#ifdef EXTB
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000645 {"EXTB", EXTB},
Fred Drake55a00342001-03-26 17:14:02 +0000646#endif
647#ifdef FIOASYNC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000648 {"FIOASYNC", FIOASYNC},
Fred Drake55a00342001-03-26 17:14:02 +0000649#endif
650#ifdef FIOCLEX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000651 {"FIOCLEX", FIOCLEX},
Fred Drake55a00342001-03-26 17:14:02 +0000652#endif
653#ifdef FIONBIO
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000654 {"FIONBIO", FIONBIO},
Fred Drake55a00342001-03-26 17:14:02 +0000655#endif
656#ifdef FIONCLEX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000657 {"FIONCLEX", FIONCLEX},
Fred Drake55a00342001-03-26 17:14:02 +0000658#endif
659#ifdef FIONREAD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000660 {"FIONREAD", FIONREAD},
Fred Drake55a00342001-03-26 17:14:02 +0000661#endif
662#ifdef IBSHIFT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000663 {"IBSHIFT", IBSHIFT},
Fred Drake55a00342001-03-26 17:14:02 +0000664#endif
665#ifdef INIT_C_CC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000666 {"INIT_C_CC", INIT_C_CC},
Fred Drake55a00342001-03-26 17:14:02 +0000667#endif
668#ifdef IOCSIZE_MASK
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000669 {"IOCSIZE_MASK", IOCSIZE_MASK},
Fred Drake55a00342001-03-26 17:14:02 +0000670#endif
671#ifdef IOCSIZE_SHIFT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000672 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
Fred Drake55a00342001-03-26 17:14:02 +0000673#endif
674#ifdef NCC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000675 {"NCC", NCC},
Fred Drake55a00342001-03-26 17:14:02 +0000676#endif
677#ifdef NCCS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000678 {"NCCS", NCCS},
Fred Drake55a00342001-03-26 17:14:02 +0000679#endif
680#ifdef NSWTCH
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000681 {"NSWTCH", NSWTCH},
Fred Drake55a00342001-03-26 17:14:02 +0000682#endif
683#ifdef N_MOUSE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000684 {"N_MOUSE", N_MOUSE},
Fred Drake55a00342001-03-26 17:14:02 +0000685#endif
686#ifdef N_PPP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000687 {"N_PPP", N_PPP},
Fred Drake55a00342001-03-26 17:14:02 +0000688#endif
689#ifdef N_SLIP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000690 {"N_SLIP", N_SLIP},
Fred Drake55a00342001-03-26 17:14:02 +0000691#endif
692#ifdef N_STRIP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000693 {"N_STRIP", N_STRIP},
Fred Drake55a00342001-03-26 17:14:02 +0000694#endif
695#ifdef N_TTY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000696 {"N_TTY", N_TTY},
Fred Drake55a00342001-03-26 17:14:02 +0000697#endif
698#ifdef TCFLSH
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000699 {"TCFLSH", TCFLSH},
Fred Drake55a00342001-03-26 17:14:02 +0000700#endif
701#ifdef TCGETA
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000702 {"TCGETA", TCGETA},
Fred Drake55a00342001-03-26 17:14:02 +0000703#endif
704#ifdef TCGETS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000705 {"TCGETS", TCGETS},
Fred Drake55a00342001-03-26 17:14:02 +0000706#endif
707#ifdef TCSBRK
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000708 {"TCSBRK", TCSBRK},
Fred Drake55a00342001-03-26 17:14:02 +0000709#endif
710#ifdef TCSBRKP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000711 {"TCSBRKP", TCSBRKP},
Fred Drake55a00342001-03-26 17:14:02 +0000712#endif
713#ifdef TCSETA
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000714 {"TCSETA", TCSETA},
Fred Drake55a00342001-03-26 17:14:02 +0000715#endif
716#ifdef TCSETAF
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000717 {"TCSETAF", TCSETAF},
Fred Drake55a00342001-03-26 17:14:02 +0000718#endif
719#ifdef TCSETAW
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000720 {"TCSETAW", TCSETAW},
Fred Drake55a00342001-03-26 17:14:02 +0000721#endif
722#ifdef TCSETS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000723 {"TCSETS", TCSETS},
Fred Drake55a00342001-03-26 17:14:02 +0000724#endif
725#ifdef TCSETSF
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000726 {"TCSETSF", TCSETSF},
Fred Drake55a00342001-03-26 17:14:02 +0000727#endif
728#ifdef TCSETSW
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000729 {"TCSETSW", TCSETSW},
Fred Drake55a00342001-03-26 17:14:02 +0000730#endif
731#ifdef TCXONC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000732 {"TCXONC", TCXONC},
Fred Drake55a00342001-03-26 17:14:02 +0000733#endif
734#ifdef TIOCCONS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000735 {"TIOCCONS", TIOCCONS},
Fred Drake55a00342001-03-26 17:14:02 +0000736#endif
737#ifdef TIOCEXCL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000738 {"TIOCEXCL", TIOCEXCL},
Fred Drake55a00342001-03-26 17:14:02 +0000739#endif
740#ifdef TIOCGETD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000741 {"TIOCGETD", TIOCGETD},
Fred Drake55a00342001-03-26 17:14:02 +0000742#endif
743#ifdef TIOCGICOUNT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000744 {"TIOCGICOUNT", TIOCGICOUNT},
Fred Drake55a00342001-03-26 17:14:02 +0000745#endif
746#ifdef TIOCGLCKTRMIOS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000747 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
Fred Drake55a00342001-03-26 17:14:02 +0000748#endif
749#ifdef TIOCGPGRP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000750 {"TIOCGPGRP", TIOCGPGRP},
Fred Drake55a00342001-03-26 17:14:02 +0000751#endif
752#ifdef TIOCGSERIAL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000753 {"TIOCGSERIAL", TIOCGSERIAL},
Fred Drake55a00342001-03-26 17:14:02 +0000754#endif
755#ifdef TIOCGSOFTCAR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000756 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
Fred Drake55a00342001-03-26 17:14:02 +0000757#endif
758#ifdef TIOCGWINSZ
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000759 {"TIOCGWINSZ", TIOCGWINSZ},
Fred Drake55a00342001-03-26 17:14:02 +0000760#endif
761#ifdef TIOCINQ
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000762 {"TIOCINQ", TIOCINQ},
Fred Drake55a00342001-03-26 17:14:02 +0000763#endif
764#ifdef TIOCLINUX
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000765 {"TIOCLINUX", TIOCLINUX},
Fred Drake55a00342001-03-26 17:14:02 +0000766#endif
767#ifdef TIOCMBIC
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000768 {"TIOCMBIC", TIOCMBIC},
Fred Drake55a00342001-03-26 17:14:02 +0000769#endif
770#ifdef TIOCMBIS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000771 {"TIOCMBIS", TIOCMBIS},
Fred Drake55a00342001-03-26 17:14:02 +0000772#endif
773#ifdef TIOCMGET
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000774 {"TIOCMGET", TIOCMGET},
Fred Drake55a00342001-03-26 17:14:02 +0000775#endif
776#ifdef TIOCMIWAIT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000777 {"TIOCMIWAIT", TIOCMIWAIT},
Fred Drake55a00342001-03-26 17:14:02 +0000778#endif
779#ifdef TIOCMSET
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000780 {"TIOCMSET", TIOCMSET},
Fred Drake55a00342001-03-26 17:14:02 +0000781#endif
782#ifdef TIOCM_CAR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000783 {"TIOCM_CAR", TIOCM_CAR},
Fred Drake55a00342001-03-26 17:14:02 +0000784#endif
785#ifdef TIOCM_CD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000786 {"TIOCM_CD", TIOCM_CD},
Fred Drake55a00342001-03-26 17:14:02 +0000787#endif
788#ifdef TIOCM_CTS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000789 {"TIOCM_CTS", TIOCM_CTS},
Fred Drake55a00342001-03-26 17:14:02 +0000790#endif
791#ifdef TIOCM_DSR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000792 {"TIOCM_DSR", TIOCM_DSR},
Fred Drake55a00342001-03-26 17:14:02 +0000793#endif
794#ifdef TIOCM_DTR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000795 {"TIOCM_DTR", TIOCM_DTR},
Fred Drake55a00342001-03-26 17:14:02 +0000796#endif
797#ifdef TIOCM_LE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000798 {"TIOCM_LE", TIOCM_LE},
Fred Drake55a00342001-03-26 17:14:02 +0000799#endif
800#ifdef TIOCM_RI
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000801 {"TIOCM_RI", TIOCM_RI},
Fred Drake55a00342001-03-26 17:14:02 +0000802#endif
803#ifdef TIOCM_RNG
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000804 {"TIOCM_RNG", TIOCM_RNG},
Fred Drake55a00342001-03-26 17:14:02 +0000805#endif
806#ifdef TIOCM_RTS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000807 {"TIOCM_RTS", TIOCM_RTS},
Fred Drake55a00342001-03-26 17:14:02 +0000808#endif
809#ifdef TIOCM_SR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000810 {"TIOCM_SR", TIOCM_SR},
Fred Drake55a00342001-03-26 17:14:02 +0000811#endif
812#ifdef TIOCM_ST
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000813 {"TIOCM_ST", TIOCM_ST},
Fred Drake55a00342001-03-26 17:14:02 +0000814#endif
815#ifdef TIOCNOTTY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000816 {"TIOCNOTTY", TIOCNOTTY},
Fred Drake55a00342001-03-26 17:14:02 +0000817#endif
818#ifdef TIOCNXCL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000819 {"TIOCNXCL", TIOCNXCL},
Fred Drake55a00342001-03-26 17:14:02 +0000820#endif
821#ifdef TIOCOUTQ
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000822 {"TIOCOUTQ", TIOCOUTQ},
Fred Drake55a00342001-03-26 17:14:02 +0000823#endif
824#ifdef TIOCPKT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000825 {"TIOCPKT", TIOCPKT},
Fred Drake55a00342001-03-26 17:14:02 +0000826#endif
827#ifdef TIOCPKT_DATA
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000828 {"TIOCPKT_DATA", TIOCPKT_DATA},
Fred Drake55a00342001-03-26 17:14:02 +0000829#endif
830#ifdef TIOCPKT_DOSTOP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000831 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000832#endif
833#ifdef TIOCPKT_FLUSHREAD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000834 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
Fred Drake55a00342001-03-26 17:14:02 +0000835#endif
836#ifdef TIOCPKT_FLUSHWRITE
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000837 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
Fred Drake55a00342001-03-26 17:14:02 +0000838#endif
839#ifdef TIOCPKT_NOSTOP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000840 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000841#endif
842#ifdef TIOCPKT_START
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000843 {"TIOCPKT_START", TIOCPKT_START},
Fred Drake55a00342001-03-26 17:14:02 +0000844#endif
845#ifdef TIOCPKT_STOP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000846 {"TIOCPKT_STOP", TIOCPKT_STOP},
Fred Drake55a00342001-03-26 17:14:02 +0000847#endif
848#ifdef TIOCSCTTY
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000849 {"TIOCSCTTY", TIOCSCTTY},
Fred Drake55a00342001-03-26 17:14:02 +0000850#endif
851#ifdef TIOCSERCONFIG
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000852 {"TIOCSERCONFIG", TIOCSERCONFIG},
Fred Drake55a00342001-03-26 17:14:02 +0000853#endif
854#ifdef TIOCSERGETLSR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000855 {"TIOCSERGETLSR", TIOCSERGETLSR},
Fred Drake55a00342001-03-26 17:14:02 +0000856#endif
857#ifdef TIOCSERGETMULTI
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000858 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
Fred Drake55a00342001-03-26 17:14:02 +0000859#endif
860#ifdef TIOCSERGSTRUCT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000861 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
Fred Drake55a00342001-03-26 17:14:02 +0000862#endif
863#ifdef TIOCSERGWILD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000864 {"TIOCSERGWILD", TIOCSERGWILD},
Fred Drake55a00342001-03-26 17:14:02 +0000865#endif
866#ifdef TIOCSERSETMULTI
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000867 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
Fred Drake55a00342001-03-26 17:14:02 +0000868#endif
869#ifdef TIOCSERSWILD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000870 {"TIOCSERSWILD", TIOCSERSWILD},
Fred Drake55a00342001-03-26 17:14:02 +0000871#endif
872#ifdef TIOCSER_TEMT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000873 {"TIOCSER_TEMT", TIOCSER_TEMT},
Fred Drake55a00342001-03-26 17:14:02 +0000874#endif
875#ifdef TIOCSETD
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000876 {"TIOCSETD", TIOCSETD},
Fred Drake55a00342001-03-26 17:14:02 +0000877#endif
878#ifdef TIOCSLCKTRMIOS
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000879 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
Fred Drake55a00342001-03-26 17:14:02 +0000880#endif
881#ifdef TIOCSPGRP
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000882 {"TIOCSPGRP", TIOCSPGRP},
Fred Drake55a00342001-03-26 17:14:02 +0000883#endif
884#ifdef TIOCSSERIAL
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000885 {"TIOCSSERIAL", TIOCSSERIAL},
Fred Drake55a00342001-03-26 17:14:02 +0000886#endif
887#ifdef TIOCSSOFTCAR
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000888 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
Fred Drake55a00342001-03-26 17:14:02 +0000889#endif
890#ifdef TIOCSTI
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000891 {"TIOCSTI", TIOCSTI},
Fred Drake55a00342001-03-26 17:14:02 +0000892#endif
893#ifdef TIOCSWINSZ
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000894 {"TIOCSWINSZ", TIOCSWINSZ},
Fred Drake55a00342001-03-26 17:14:02 +0000895#endif
896#ifdef TIOCTTYGSTRUCT
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000897 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
Fred Drake55a00342001-03-26 17:14:02 +0000898#endif
899
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000900 /* sentinel */
901 {NULL, 0}
Fred Drakedf48d142001-02-27 21:22:39 +0000902};
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{
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000908 PyObject *m;
909 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000910
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000911 m = Py_InitModule4("termios", termios_methods, termios__doc__,
912 (PyObject *)NULL, PYTHON_API_VERSION);
913 if (m == NULL)
914 return;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000915
Antoine Pitrouc7c96a92010-05-09 15:15:40 +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
Antoine Pitrouc7c96a92010-05-09 15:15:40 +0000922 while (constant->name != NULL) {
923 PyModule_AddIntConstant(m, constant->name, constant->value);
924 ++constant;
925 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000926}