blob: edeb6f5c452f33875b00e6ba4c329993798afeb5 [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
Martin v. Löwisbe4fea62003-10-31 13:01:24 +00005/* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE
6 is defined, so we define it here. */
7#if defined(__sgi)
8#define CTRL(c) ((c)&037)
9#endif
10
Guido van Rossum9adae8e1994-09-12 10:41:22 +000011#include <termios.h>
Fred Drakeb2877dd2001-05-09 17:53:06 +000012#ifdef __osf__
13/* On OSF, sys/ioctl.h requires that struct termio already be defined,
14 * so this needs to be included first on that platform. */
Fred Drakeb638aaf2001-05-07 17:55:35 +000015#include <termio.h>
Fred Drakeb2877dd2001-05-09 17:53:06 +000016#endif
Fred Drake9b3bc492001-04-04 21:19:26 +000017#include <sys/ioctl.h>
Guido van Rossum1aca4d81998-03-03 22:10:18 +000018
Fred Drake87068f12001-05-11 16:14:17 +000019/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
20 * MDTR, MRI, and MRTS (appearantly used internally by some things
21 * defined as macros; these are not used here directly).
22 */
23#ifdef HAVE_SYS_MODEM_H
24#include <sys/modem.h>
25#endif
Neal Norwitz82251032003-05-23 14:35:24 +000026/* HP-UX requires that this be included to pick up TIOCGPGRP and friends */
27#ifdef HAVE_SYS_BSDTTY_H
28#include <sys/bsdtty.h>
29#endif
Fred Drake87068f12001-05-11 16:14:17 +000030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000031PyDoc_STRVAR(termios__doc__,
32"This module provides an interface to the Posix calls for tty I/O control.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000033For a complete description of these calls, see the Posix or Unix manual\n\
34pages. It is only available for those Unix versions that support Posix\n\
35termios style tty I/O control.\n\
36\n\
37All functions in this module take a file descriptor fd as their first\n\
38argument. This can be an integer file descriptor, such as returned by\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000039sys.stdin.fileno(), or a file object, such as sys.stdin itself.");
Guido van Rossum9adae8e1994-09-12 10:41:22 +000040
41static PyObject *TermiosError;
42
Fred Drakeb638aaf2001-05-07 17:55:35 +000043static int fdconv(PyObject* obj, void* p)
44{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 int fd;
Fred Drakeb638aaf2001-05-07 17:55:35 +000046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000047 fd = PyObject_AsFileDescriptor(obj);
48 if (fd >= 0) {
49 *(int*)p = fd;
50 return 1;
51 }
52 return 0;
Fred Drakeb638aaf2001-05-07 17:55:35 +000053}
Guido van Rossum9adae8e1994-09-12 10:41:22 +000054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000055PyDoc_STRVAR(termios_tcgetattr__doc__,
56"tcgetattr(fd) -> list_of_attrs\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000057\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +000058Get the tty attributes for file descriptor fd, as follows:\n\
59[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
60of the tty special characters (each a string of length 1, except the items\n\
61with indices VMIN and VTIME, which are integers when these fields are\n\
62defined). The interpretation of the flags and the speeds as well as the\n\
63indexing in the cc array must be done using the symbolic constants defined\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000064in this module.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +000065
Guido van Rossum9adae8e1994-09-12 10:41:22 +000066static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +000067termios_tcgetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +000068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 int fd;
70 struct termios mode;
71 PyObject *cc;
72 speed_t ispeed, ospeed;
73 PyObject *v;
74 int i;
75 char ch;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
78 fdconv, (void*)&fd))
79 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 if (tcgetattr(fd, &mode) == -1)
82 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000083
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 ispeed = cfgetispeed(&mode);
85 ospeed = cfgetospeed(&mode);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 cc = PyList_New(NCCS);
88 if (cc == NULL)
89 return NULL;
90 for (i = 0; i < NCCS; i++) {
91 ch = (char)mode.c_cc[i];
92 v = PyBytes_FromStringAndSize(&ch, 1);
93 if (v == NULL)
94 goto err;
95 PyList_SetItem(cc, i, v);
96 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +000097
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 /* Convert the MIN and TIME slots to integer. On some systems, the
99 MIN and TIME slots are the same as the EOF and EOL slots. So we
100 only do this in noncanonical input mode. */
101 if ((mode.c_lflag & ICANON) == 0) {
102 v = PyLong_FromLong((long)mode.c_cc[VMIN]);
103 if (v == NULL)
104 goto err;
105 PyList_SetItem(cc, VMIN, v);
106 v = PyLong_FromLong((long)mode.c_cc[VTIME]);
107 if (v == NULL)
108 goto err;
109 PyList_SetItem(cc, VTIME, v);
110 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 if (!(v = PyList_New(7)))
113 goto err;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 PyList_SetItem(v, 0, PyLong_FromLong((long)mode.c_iflag));
116 PyList_SetItem(v, 1, PyLong_FromLong((long)mode.c_oflag));
117 PyList_SetItem(v, 2, PyLong_FromLong((long)mode.c_cflag));
118 PyList_SetItem(v, 3, PyLong_FromLong((long)mode.c_lflag));
119 PyList_SetItem(v, 4, PyLong_FromLong((long)ispeed));
120 PyList_SetItem(v, 5, PyLong_FromLong((long)ospeed));
121 PyList_SetItem(v, 6, cc);
122 if (PyErr_Occurred()){
123 Py_DECREF(v);
124 goto err;
125 }
126 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000127 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 Py_DECREF(cc);
129 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000130}
131
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000132PyDoc_STRVAR(termios_tcsetattr__doc__,
133"tcsetattr(fd, when, attributes) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000134\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000135Set the tty attributes for file descriptor fd.\n\
136The attributes to be set are taken from the attributes argument, which\n\
137is a list like the one returned by tcgetattr(). The when argument\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000138determines when the attributes are changed: termios.TCSANOW to\n\
139change immediately, termios.TCSADRAIN to change after transmitting all\n\
140queued output, or termios.TCSAFLUSH to change after transmitting all\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000141queued output and discarding all queued input. ");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000142
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000143static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000144termios_tcsetattr(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000145{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000146 int fd, when;
147 struct termios mode;
148 speed_t ispeed, ospeed;
149 PyObject *term, *cc, *v;
150 int i;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
153 fdconv, &fd, &when, &term))
154 return NULL;
155 if (!PyList_Check(term) || PyList_Size(term) != 7) {
156 PyErr_SetString(PyExc_TypeError,
157 "tcsetattr, arg 3: must be 7 element list");
158 return NULL;
159 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 /* Get the old mode, in case there are any hidden fields... */
162 if (tcgetattr(fd, &mode) == -1)
163 return PyErr_SetFromErrno(TermiosError);
164 mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0));
165 mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1));
166 mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2));
167 mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3));
168 ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4));
169 ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5));
170 cc = PyList_GetItem(term, 6);
171 if (PyErr_Occurred())
172 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000173
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
175 PyErr_Format(PyExc_TypeError,
176 "tcsetattr: attributes[6] must be %d element list",
177 NCCS);
178 return NULL;
179 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000181 for (i = 0; i < NCCS; i++) {
182 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000183
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 if (PyBytes_Check(v) && PyBytes_Size(v) == 1)
185 mode.c_cc[i] = (cc_t) * PyBytes_AsString(v);
186 else if (PyLong_Check(v))
187 mode.c_cc[i] = (cc_t) PyLong_AsLong(v);
188 else {
189 PyErr_SetString(PyExc_TypeError,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000190 "tcsetattr: elements of attributes must be characters or integers");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 return NULL;
192 }
193 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000194
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
196 return PyErr_SetFromErrno(TermiosError);
197 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
198 return PyErr_SetFromErrno(TermiosError);
199 if (tcsetattr(fd, when, &mode) == -1)
200 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000201
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 Py_INCREF(Py_None);
203 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000204}
205
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000206PyDoc_STRVAR(termios_tcsendbreak__doc__,
207"tcsendbreak(fd, duration) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000208\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000209Send a break on file descriptor fd.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000210A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000211has a system dependent meaning.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000212
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000213static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000214termios_tcsendbreak(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 int fd, duration;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
219 fdconv, &fd, &duration))
220 return NULL;
221 if (tcsendbreak(fd, duration) == -1)
222 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 Py_INCREF(Py_None);
225 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000226}
227
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000228PyDoc_STRVAR(termios_tcdrain__doc__,
229"tcdrain(fd) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000230\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000231Wait until all output written to file descriptor fd has been transmitted.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000232
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000233static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000234termios_tcdrain(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000235{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 int fd;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (!PyArg_ParseTuple(args, "O&:tcdrain",
239 fdconv, &fd))
240 return NULL;
241 if (tcdrain(fd) == -1)
242 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 Py_INCREF(Py_None);
245 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000246}
247
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000248PyDoc_STRVAR(termios_tcflush__doc__,
249"tcflush(fd, queue) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000250\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000251Discard queued data on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000252The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
253queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000254both queues. ");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000255
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000256static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000257termios_tcflush(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000258{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 int fd, queue;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 if (!PyArg_ParseTuple(args, "O&i:tcflush",
262 fdconv, &fd, &queue))
263 return NULL;
264 if (tcflush(fd, queue) == -1)
265 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 Py_INCREF(Py_None);
268 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000269}
270
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000271PyDoc_STRVAR(termios_tcflow__doc__,
272"tcflow(fd, action) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000273\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000274Suspend or resume input or output on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000275The action argument can be termios.TCOOFF to suspend output,\n\
276termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000277or termios.TCION to restart input.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000278
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000279static PyObject *
Peter Schneider-Kamp416d4132000-07-10 12:15:54 +0000280termios_tcflow(PyObject *self, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 int fd, action;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000283
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 if (!PyArg_ParseTuple(args, "O&i:tcflow",
285 fdconv, &fd, &action))
286 return NULL;
287 if (tcflow(fd, action) == -1)
288 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000289
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 Py_INCREF(Py_None);
291 return Py_None;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000292}
293
294static PyMethodDef termios_methods[] =
295{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 {"tcgetattr", termios_tcgetattr,
297 METH_VARARGS, termios_tcgetattr__doc__},
298 {"tcsetattr", termios_tcsetattr,
299 METH_VARARGS, termios_tcsetattr__doc__},
300 {"tcsendbreak", termios_tcsendbreak,
301 METH_VARARGS, termios_tcsendbreak__doc__},
302 {"tcdrain", termios_tcdrain,
303 METH_VARARGS, termios_tcdrain__doc__},
304 {"tcflush", termios_tcflush,
305 METH_VARARGS, termios_tcflush__doc__},
306 {"tcflow", termios_tcflow,
307 METH_VARARGS, termios_tcflow__doc__},
308 {NULL, NULL}
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000309};
310
Fred Drakedf48d142001-02-27 21:22:39 +0000311
Fred Drake9ef7fa82001-03-01 21:54:49 +0000312#if defined(VSWTCH) && !defined(VSWTC)
313#define VSWTC VSWTCH
314#endif
315
316#if defined(VSWTC) && !defined(VSWTCH)
317#define VSWTCH VSWTC
318#endif
319
Fred Drakedf48d142001-02-27 21:22:39 +0000320static struct constant {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 char *name;
322 long value;
Fred Drakedf48d142001-02-27 21:22:39 +0000323} termios_constants[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000324 /* cfgetospeed(), cfsetospeed() constants */
325 {"B0", B0},
326 {"B50", B50},
327 {"B75", B75},
328 {"B110", B110},
329 {"B134", B134},
330 {"B150", B150},
331 {"B200", B200},
332 {"B300", B300},
333 {"B600", B600},
334 {"B1200", B1200},
335 {"B1800", B1800},
336 {"B2400", B2400},
337 {"B4800", B4800},
338 {"B9600", B9600},
339 {"B19200", B19200},
340 {"B38400", B38400},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000341#ifdef B57600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000343#endif
344#ifdef B115200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000346#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000347#ifdef B230400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000349#endif
Antoine Pitroua78f74c2010-11-20 20:03:08 +0000350#ifdef B460800
351 {"B460800", B460800},
352#endif
353#ifdef B500000
354 {"B500000", B500000},
355#endif
356#ifdef B576000
357 {"B576000", B576000},
358#endif
359#ifdef B921600
360 {"B921600", B921600},
361#endif
362#ifdef B1000000
363 {"B1000000", B1000000},
364#endif
365#ifdef B1152000
366 {"B1152000", B1152000},
367#endif
368#ifdef B1500000
369 {"B1500000", B1500000},
370#endif
371#ifdef B2000000
372 {"B2000000", B2000000},
373#endif
374#ifdef B2500000
375 {"B2500000", B2500000},
376#endif
377#ifdef B3000000
378 {"B3000000", B3000000},
379#endif
380#ifdef B3500000
381 {"B3500000", B3500000},
382#endif
383#ifdef B4000000
384 {"B4000000", B4000000},
385#endif
386
Fred Drake9ef7fa82001-03-01 21:54:49 +0000387#ifdef CBAUDEX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000388 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000389#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391 /* tcsetattr() constants */
392 {"TCSANOW", TCSANOW},
393 {"TCSADRAIN", TCSADRAIN},
394 {"TCSAFLUSH", TCSAFLUSH},
Gregory P. Smithcafc22f2009-11-01 19:24:18 +0000395#ifdef TCSASOFT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 {"TCSASOFT", TCSASOFT},
Gregory P. Smithcafc22f2009-11-01 19:24:18 +0000397#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 /* tcflush() constants */
400 {"TCIFLUSH", TCIFLUSH},
401 {"TCOFLUSH", TCOFLUSH},
402 {"TCIOFLUSH", TCIOFLUSH},
Fred Drakedf48d142001-02-27 21:22:39 +0000403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404 /* tcflow() constants */
405 {"TCOOFF", TCOOFF},
406 {"TCOON", TCOON},
407 {"TCIOFF", TCIOFF},
408 {"TCION", TCION},
Fred Drakedf48d142001-02-27 21:22:39 +0000409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000410 /* struct termios.c_iflag constants */
411 {"IGNBRK", IGNBRK},
412 {"BRKINT", BRKINT},
413 {"IGNPAR", IGNPAR},
414 {"PARMRK", PARMRK},
415 {"INPCK", INPCK},
416 {"ISTRIP", ISTRIP},
417 {"INLCR", INLCR},
418 {"IGNCR", IGNCR},
419 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000420#ifdef IUCLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000421 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000422#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 {"IXON", IXON},
424 {"IXANY", IXANY},
425 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000426#ifdef IMAXBEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000428#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 /* struct termios.c_oflag constants */
431 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000432#ifdef OLCUC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000434#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000435#ifdef ONLCR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 {"ONLCR", ONLCR},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000437#endif
Fred Draked85556c2001-03-03 18:08:52 +0000438#ifdef OCRNL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000439 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000440#endif
441#ifdef ONOCR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000443#endif
444#ifdef ONLRET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000446#endif
447#ifdef OFILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000448 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000449#endif
450#ifdef OFDEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000452#endif
453#ifdef NLDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000455#endif
456#ifdef CRDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000458#endif
459#ifdef TABDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000460 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000461#endif
462#ifdef BSDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000464#endif
465#ifdef VTDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000467#endif
468#ifdef FFDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000470#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000473#ifdef NL0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000475#endif
476#ifdef NL1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000478#endif
479#ifdef CR0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000481#endif
482#ifdef CR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000484#endif
485#ifdef CR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000487#endif
488#ifdef CR3
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000490#endif
491#ifdef TAB0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000493#endif
494#ifdef TAB1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000496#endif
497#ifdef TAB2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000499#endif
500#ifdef TAB3
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000502#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000503#ifdef XTABS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000505#endif
Fred Draked85556c2001-03-03 18:08:52 +0000506#ifdef BS0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000507 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000508#endif
509#ifdef BS1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000511#endif
512#ifdef VT0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000514#endif
515#ifdef VT1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000517#endif
518#ifdef FF0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000519 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000520#endif
521#ifdef FF1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000523#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000524
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 /* struct termios.c_cflag constants */
526 {"CSIZE", CSIZE},
527 {"CSTOPB", CSTOPB},
528 {"CREAD", CREAD},
529 {"PARENB", PARENB},
530 {"PARODD", PARODD},
531 {"HUPCL", HUPCL},
532 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000533#ifdef CIBAUD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000535#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000536#ifdef CRTSCTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 {"CRTSCTS", (long)CRTSCTS},
Fred Drakededbebf2001-03-02 06:50:58 +0000538#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 /* struct termios.c_cflag-related values (character size) */
541 {"CS5", CS5},
542 {"CS6", CS6},
543 {"CS7", CS7},
544 {"CS8", CS8},
Fred Drakedf48d142001-02-27 21:22:39 +0000545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000546 /* struct termios.c_lflag constants */
547 {"ISIG", ISIG},
548 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000549#ifdef XCASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000550 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000551#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000552 {"ECHO", ECHO},
553 {"ECHOE", ECHOE},
554 {"ECHOK", ECHOK},
555 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000556#ifdef ECHOCTL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000557 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000558#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000559#ifdef ECHOPRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000561#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000562#ifdef ECHOKE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000564#endif
565#ifdef FLUSHO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000567#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 {"NOFLSH", NOFLSH},
569 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000570#ifdef PENDIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000571 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000572#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000573 {"IEXTEN", IEXTEN},
Fred Drakedf48d142001-02-27 21:22:39 +0000574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000575 /* indexes into the control chars array returned by tcgetattr() */
576 {"VINTR", VINTR},
577 {"VQUIT", VQUIT},
578 {"VERASE", VERASE},
579 {"VKILL", VKILL},
580 {"VEOF", VEOF},
581 {"VTIME", VTIME},
582 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000583#ifdef VSWTC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* The #defines above ensure that if either is defined, both are,
585 * but both may be omitted by the system headers. ;-( */
586 {"VSWTC", VSWTC},
587 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000588#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 {"VSTART", VSTART},
590 {"VSTOP", VSTOP},
591 {"VSUSP", VSUSP},
592 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000593#ifdef VREPRINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000595#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000596#ifdef VDISCARD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000598#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000599#ifdef VWERASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000601#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000602#ifdef VLNEXT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000603 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000604#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000605#ifdef VEOL2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000606 {"VEOL2", VEOL2},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000607#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000608
Fred Drake55a00342001-03-26 17:14:02 +0000609
610#ifdef B460800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 {"B460800", B460800},
Fred Drake55a00342001-03-26 17:14:02 +0000612#endif
613#ifdef CBAUD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 {"CBAUD", CBAUD},
Fred Drake55a00342001-03-26 17:14:02 +0000615#endif
616#ifdef CDEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000617 {"CDEL", CDEL},
Fred Drake55a00342001-03-26 17:14:02 +0000618#endif
619#ifdef CDSUSP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 {"CDSUSP", CDSUSP},
Fred Drake55a00342001-03-26 17:14:02 +0000621#endif
622#ifdef CEOF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 {"CEOF", CEOF},
Fred Drake55a00342001-03-26 17:14:02 +0000624#endif
625#ifdef CEOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 {"CEOL", CEOL},
Fred Drake55a00342001-03-26 17:14:02 +0000627#endif
628#ifdef CEOL2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 {"CEOL2", CEOL2},
Fred Drake55a00342001-03-26 17:14:02 +0000630#endif
631#ifdef CEOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 {"CEOT", CEOT},
Fred Drake55a00342001-03-26 17:14:02 +0000633#endif
634#ifdef CERASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 {"CERASE", CERASE},
Fred Drake55a00342001-03-26 17:14:02 +0000636#endif
637#ifdef CESC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 {"CESC", CESC},
Fred Drake55a00342001-03-26 17:14:02 +0000639#endif
640#ifdef CFLUSH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 {"CFLUSH", CFLUSH},
Fred Drake55a00342001-03-26 17:14:02 +0000642#endif
643#ifdef CINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000644 {"CINTR", CINTR},
Fred Drake55a00342001-03-26 17:14:02 +0000645#endif
646#ifdef CKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 {"CKILL", CKILL},
Fred Drake55a00342001-03-26 17:14:02 +0000648#endif
649#ifdef CLNEXT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 {"CLNEXT", CLNEXT},
Fred Drake55a00342001-03-26 17:14:02 +0000651#endif
652#ifdef CNUL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000653 {"CNUL", CNUL},
Fred Drake55a00342001-03-26 17:14:02 +0000654#endif
655#ifdef COMMON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 {"COMMON", COMMON},
Fred Drake55a00342001-03-26 17:14:02 +0000657#endif
658#ifdef CQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 {"CQUIT", CQUIT},
Fred Drake55a00342001-03-26 17:14:02 +0000660#endif
661#ifdef CRPRNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 {"CRPRNT", CRPRNT},
Fred Drake55a00342001-03-26 17:14:02 +0000663#endif
664#ifdef CSTART
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 {"CSTART", CSTART},
Fred Drake55a00342001-03-26 17:14:02 +0000666#endif
667#ifdef CSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000668 {"CSTOP", CSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000669#endif
670#ifdef CSUSP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 {"CSUSP", CSUSP},
Fred Drake55a00342001-03-26 17:14:02 +0000672#endif
673#ifdef CSWTCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 {"CSWTCH", CSWTCH},
Fred Drake55a00342001-03-26 17:14:02 +0000675#endif
676#ifdef CWERASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 {"CWERASE", CWERASE},
Fred Drake55a00342001-03-26 17:14:02 +0000678#endif
679#ifdef EXTA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000680 {"EXTA", EXTA},
Fred Drake55a00342001-03-26 17:14:02 +0000681#endif
682#ifdef EXTB
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 {"EXTB", EXTB},
Fred Drake55a00342001-03-26 17:14:02 +0000684#endif
685#ifdef FIOASYNC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 {"FIOASYNC", FIOASYNC},
Fred Drake55a00342001-03-26 17:14:02 +0000687#endif
688#ifdef FIOCLEX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 {"FIOCLEX", FIOCLEX},
Fred Drake55a00342001-03-26 17:14:02 +0000690#endif
691#ifdef FIONBIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 {"FIONBIO", FIONBIO},
Fred Drake55a00342001-03-26 17:14:02 +0000693#endif
694#ifdef FIONCLEX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 {"FIONCLEX", FIONCLEX},
Fred Drake55a00342001-03-26 17:14:02 +0000696#endif
697#ifdef FIONREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000698 {"FIONREAD", FIONREAD},
Fred Drake55a00342001-03-26 17:14:02 +0000699#endif
700#ifdef IBSHIFT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000701 {"IBSHIFT", IBSHIFT},
Fred Drake55a00342001-03-26 17:14:02 +0000702#endif
703#ifdef INIT_C_CC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 {"INIT_C_CC", INIT_C_CC},
Fred Drake55a00342001-03-26 17:14:02 +0000705#endif
706#ifdef IOCSIZE_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 {"IOCSIZE_MASK", IOCSIZE_MASK},
Fred Drake55a00342001-03-26 17:14:02 +0000708#endif
709#ifdef IOCSIZE_SHIFT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000710 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
Fred Drake55a00342001-03-26 17:14:02 +0000711#endif
712#ifdef NCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000713 {"NCC", NCC},
Fred Drake55a00342001-03-26 17:14:02 +0000714#endif
715#ifdef NCCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000716 {"NCCS", NCCS},
Fred Drake55a00342001-03-26 17:14:02 +0000717#endif
718#ifdef NSWTCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000719 {"NSWTCH", NSWTCH},
Fred Drake55a00342001-03-26 17:14:02 +0000720#endif
721#ifdef N_MOUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000722 {"N_MOUSE", N_MOUSE},
Fred Drake55a00342001-03-26 17:14:02 +0000723#endif
724#ifdef N_PPP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000725 {"N_PPP", N_PPP},
Fred Drake55a00342001-03-26 17:14:02 +0000726#endif
727#ifdef N_SLIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 {"N_SLIP", N_SLIP},
Fred Drake55a00342001-03-26 17:14:02 +0000729#endif
730#ifdef N_STRIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 {"N_STRIP", N_STRIP},
Fred Drake55a00342001-03-26 17:14:02 +0000732#endif
733#ifdef N_TTY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000734 {"N_TTY", N_TTY},
Fred Drake55a00342001-03-26 17:14:02 +0000735#endif
736#ifdef TCFLSH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000737 {"TCFLSH", TCFLSH},
Fred Drake55a00342001-03-26 17:14:02 +0000738#endif
739#ifdef TCGETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 {"TCGETA", TCGETA},
Fred Drake55a00342001-03-26 17:14:02 +0000741#endif
742#ifdef TCGETS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000743 {"TCGETS", TCGETS},
Fred Drake55a00342001-03-26 17:14:02 +0000744#endif
745#ifdef TCSBRK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000746 {"TCSBRK", TCSBRK},
Fred Drake55a00342001-03-26 17:14:02 +0000747#endif
748#ifdef TCSBRKP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000749 {"TCSBRKP", TCSBRKP},
Fred Drake55a00342001-03-26 17:14:02 +0000750#endif
751#ifdef TCSETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000752 {"TCSETA", TCSETA},
Fred Drake55a00342001-03-26 17:14:02 +0000753#endif
754#ifdef TCSETAF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000755 {"TCSETAF", TCSETAF},
Fred Drake55a00342001-03-26 17:14:02 +0000756#endif
757#ifdef TCSETAW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000758 {"TCSETAW", TCSETAW},
Fred Drake55a00342001-03-26 17:14:02 +0000759#endif
760#ifdef TCSETS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 {"TCSETS", TCSETS},
Fred Drake55a00342001-03-26 17:14:02 +0000762#endif
763#ifdef TCSETSF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000764 {"TCSETSF", TCSETSF},
Fred Drake55a00342001-03-26 17:14:02 +0000765#endif
766#ifdef TCSETSW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 {"TCSETSW", TCSETSW},
Fred Drake55a00342001-03-26 17:14:02 +0000768#endif
769#ifdef TCXONC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 {"TCXONC", TCXONC},
Fred Drake55a00342001-03-26 17:14:02 +0000771#endif
772#ifdef TIOCCONS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 {"TIOCCONS", TIOCCONS},
Fred Drake55a00342001-03-26 17:14:02 +0000774#endif
775#ifdef TIOCEXCL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 {"TIOCEXCL", TIOCEXCL},
Fred Drake55a00342001-03-26 17:14:02 +0000777#endif
778#ifdef TIOCGETD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 {"TIOCGETD", TIOCGETD},
Fred Drake55a00342001-03-26 17:14:02 +0000780#endif
781#ifdef TIOCGICOUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000782 {"TIOCGICOUNT", TIOCGICOUNT},
Fred Drake55a00342001-03-26 17:14:02 +0000783#endif
784#ifdef TIOCGLCKTRMIOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000785 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
Fred Drake55a00342001-03-26 17:14:02 +0000786#endif
787#ifdef TIOCGPGRP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 {"TIOCGPGRP", TIOCGPGRP},
Fred Drake55a00342001-03-26 17:14:02 +0000789#endif
790#ifdef TIOCGSERIAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000791 {"TIOCGSERIAL", TIOCGSERIAL},
Fred Drake55a00342001-03-26 17:14:02 +0000792#endif
793#ifdef TIOCGSOFTCAR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
Fred Drake55a00342001-03-26 17:14:02 +0000795#endif
796#ifdef TIOCGWINSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000797 {"TIOCGWINSZ", TIOCGWINSZ},
Fred Drake55a00342001-03-26 17:14:02 +0000798#endif
799#ifdef TIOCINQ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 {"TIOCINQ", TIOCINQ},
Fred Drake55a00342001-03-26 17:14:02 +0000801#endif
802#ifdef TIOCLINUX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000803 {"TIOCLINUX", TIOCLINUX},
Fred Drake55a00342001-03-26 17:14:02 +0000804#endif
805#ifdef TIOCMBIC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806 {"TIOCMBIC", TIOCMBIC},
Fred Drake55a00342001-03-26 17:14:02 +0000807#endif
808#ifdef TIOCMBIS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000809 {"TIOCMBIS", TIOCMBIS},
Fred Drake55a00342001-03-26 17:14:02 +0000810#endif
811#ifdef TIOCMGET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000812 {"TIOCMGET", TIOCMGET},
Fred Drake55a00342001-03-26 17:14:02 +0000813#endif
814#ifdef TIOCMIWAIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000815 {"TIOCMIWAIT", TIOCMIWAIT},
Fred Drake55a00342001-03-26 17:14:02 +0000816#endif
817#ifdef TIOCMSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000818 {"TIOCMSET", TIOCMSET},
Fred Drake55a00342001-03-26 17:14:02 +0000819#endif
820#ifdef TIOCM_CAR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 {"TIOCM_CAR", TIOCM_CAR},
Fred Drake55a00342001-03-26 17:14:02 +0000822#endif
823#ifdef TIOCM_CD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 {"TIOCM_CD", TIOCM_CD},
Fred Drake55a00342001-03-26 17:14:02 +0000825#endif
826#ifdef TIOCM_CTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000827 {"TIOCM_CTS", TIOCM_CTS},
Fred Drake55a00342001-03-26 17:14:02 +0000828#endif
829#ifdef TIOCM_DSR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 {"TIOCM_DSR", TIOCM_DSR},
Fred Drake55a00342001-03-26 17:14:02 +0000831#endif
832#ifdef TIOCM_DTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000833 {"TIOCM_DTR", TIOCM_DTR},
Fred Drake55a00342001-03-26 17:14:02 +0000834#endif
835#ifdef TIOCM_LE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000836 {"TIOCM_LE", TIOCM_LE},
Fred Drake55a00342001-03-26 17:14:02 +0000837#endif
838#ifdef TIOCM_RI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 {"TIOCM_RI", TIOCM_RI},
Fred Drake55a00342001-03-26 17:14:02 +0000840#endif
841#ifdef TIOCM_RNG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000842 {"TIOCM_RNG", TIOCM_RNG},
Fred Drake55a00342001-03-26 17:14:02 +0000843#endif
844#ifdef TIOCM_RTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 {"TIOCM_RTS", TIOCM_RTS},
Fred Drake55a00342001-03-26 17:14:02 +0000846#endif
847#ifdef TIOCM_SR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 {"TIOCM_SR", TIOCM_SR},
Fred Drake55a00342001-03-26 17:14:02 +0000849#endif
850#ifdef TIOCM_ST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 {"TIOCM_ST", TIOCM_ST},
Fred Drake55a00342001-03-26 17:14:02 +0000852#endif
853#ifdef TIOCNOTTY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 {"TIOCNOTTY", TIOCNOTTY},
Fred Drake55a00342001-03-26 17:14:02 +0000855#endif
856#ifdef TIOCNXCL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000857 {"TIOCNXCL", TIOCNXCL},
Fred Drake55a00342001-03-26 17:14:02 +0000858#endif
859#ifdef TIOCOUTQ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000860 {"TIOCOUTQ", TIOCOUTQ},
Fred Drake55a00342001-03-26 17:14:02 +0000861#endif
862#ifdef TIOCPKT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 {"TIOCPKT", TIOCPKT},
Fred Drake55a00342001-03-26 17:14:02 +0000864#endif
865#ifdef TIOCPKT_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 {"TIOCPKT_DATA", TIOCPKT_DATA},
Fred Drake55a00342001-03-26 17:14:02 +0000867#endif
868#ifdef TIOCPKT_DOSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000869 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000870#endif
871#ifdef TIOCPKT_FLUSHREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000872 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
Fred Drake55a00342001-03-26 17:14:02 +0000873#endif
874#ifdef TIOCPKT_FLUSHWRITE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000875 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
Fred Drake55a00342001-03-26 17:14:02 +0000876#endif
877#ifdef TIOCPKT_NOSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000879#endif
880#ifdef TIOCPKT_START
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000881 {"TIOCPKT_START", TIOCPKT_START},
Fred Drake55a00342001-03-26 17:14:02 +0000882#endif
883#ifdef TIOCPKT_STOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000884 {"TIOCPKT_STOP", TIOCPKT_STOP},
Fred Drake55a00342001-03-26 17:14:02 +0000885#endif
886#ifdef TIOCSCTTY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000887 {"TIOCSCTTY", TIOCSCTTY},
Fred Drake55a00342001-03-26 17:14:02 +0000888#endif
889#ifdef TIOCSERCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000890 {"TIOCSERCONFIG", TIOCSERCONFIG},
Fred Drake55a00342001-03-26 17:14:02 +0000891#endif
892#ifdef TIOCSERGETLSR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000893 {"TIOCSERGETLSR", TIOCSERGETLSR},
Fred Drake55a00342001-03-26 17:14:02 +0000894#endif
895#ifdef TIOCSERGETMULTI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000896 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
Fred Drake55a00342001-03-26 17:14:02 +0000897#endif
898#ifdef TIOCSERGSTRUCT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000899 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
Fred Drake55a00342001-03-26 17:14:02 +0000900#endif
901#ifdef TIOCSERGWILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 {"TIOCSERGWILD", TIOCSERGWILD},
Fred Drake55a00342001-03-26 17:14:02 +0000903#endif
904#ifdef TIOCSERSETMULTI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
Fred Drake55a00342001-03-26 17:14:02 +0000906#endif
907#ifdef TIOCSERSWILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000908 {"TIOCSERSWILD", TIOCSERSWILD},
Fred Drake55a00342001-03-26 17:14:02 +0000909#endif
910#ifdef TIOCSER_TEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000911 {"TIOCSER_TEMT", TIOCSER_TEMT},
Fred Drake55a00342001-03-26 17:14:02 +0000912#endif
913#ifdef TIOCSETD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000914 {"TIOCSETD", TIOCSETD},
Fred Drake55a00342001-03-26 17:14:02 +0000915#endif
916#ifdef TIOCSLCKTRMIOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000917 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
Fred Drake55a00342001-03-26 17:14:02 +0000918#endif
919#ifdef TIOCSPGRP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 {"TIOCSPGRP", TIOCSPGRP},
Fred Drake55a00342001-03-26 17:14:02 +0000921#endif
922#ifdef TIOCSSERIAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000923 {"TIOCSSERIAL", TIOCSSERIAL},
Fred Drake55a00342001-03-26 17:14:02 +0000924#endif
925#ifdef TIOCSSOFTCAR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
Fred Drake55a00342001-03-26 17:14:02 +0000927#endif
928#ifdef TIOCSTI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000929 {"TIOCSTI", TIOCSTI},
Fred Drake55a00342001-03-26 17:14:02 +0000930#endif
931#ifdef TIOCSWINSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000932 {"TIOCSWINSZ", TIOCSWINSZ},
Fred Drake55a00342001-03-26 17:14:02 +0000933#endif
934#ifdef TIOCTTYGSTRUCT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
Fred Drake55a00342001-03-26 17:14:02 +0000936#endif
937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000938 /* sentinel */
939 {NULL, 0}
Fred Drakedf48d142001-02-27 21:22:39 +0000940};
941
942
Martin v. Löwis1a214512008-06-11 05:26:20 +0000943static struct PyModuleDef termiosmodule = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000944 PyModuleDef_HEAD_INIT,
945 "termios",
946 termios__doc__,
947 -1,
948 termios_methods,
949 NULL,
950 NULL,
951 NULL,
952 NULL
Martin v. Löwis1a214512008-06-11 05:26:20 +0000953};
954
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000955PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000956PyInit_termios(void)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000957{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 PyObject *m;
959 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 m = PyModule_Create(&termiosmodule);
962 if (m == NULL)
963 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000964
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000965 if (TermiosError == NULL) {
966 TermiosError = PyErr_NewException("termios.error", NULL, NULL);
967 }
968 Py_INCREF(TermiosError);
969 PyModule_AddObject(m, "error", TermiosError);
Fred Drakedf48d142001-02-27 21:22:39 +0000970
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000971 while (constant->name != NULL) {
972 PyModule_AddIntConstant(m, constant->name, constant->value);
973 ++constant;
974 }
975 return m;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000976}