blob: 9fccb2e8309bb312e98bae704907a572f9aafdb8 [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{
45 int fd;
46
47 fd = PyObject_AsFileDescriptor(obj);
Fred Drakec99ff602001-05-09 20:14:09 +000048 if (fd >= 0) {
49 *(int*)p = fd;
50 return 1;
Fred Drakeb638aaf2001-05-07 17:55:35 +000051 }
Fred Drakec99ff602001-05-09 20:14:09 +000052 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{
69 int fd;
70 struct termios mode;
71 PyObject *cc;
72 speed_t ispeed, ospeed;
73 PyObject *v;
74 int i;
75 char ch;
76
Fred Drakeb638aaf2001-05-07 17:55:35 +000077 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
78 fdconv, (void*)&fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +000079 return NULL;
80
81 if (tcgetattr(fd, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +000082 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000083
84 ispeed = cfgetispeed(&mode);
85 ospeed = cfgetospeed(&mode);
86
87 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];
Christian Heimes72b710a2008-05-26 13:28:38 +000092 v = PyBytes_FromStringAndSize(&ch, 1);
Guido van Rossum9adae8e1994-09-12 10:41:22 +000093 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +000094 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +000095 PyList_SetItem(cc, i, v);
96 }
97
98 /* 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. */
Guido van Rossum36dd0d21996-12-10 15:23:00 +0000101 if ((mode.c_lflag & ICANON) == 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000102 v = PyLong_FromLong((long)mode.c_cc[VMIN]);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000103 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000104 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000105 PyList_SetItem(cc, VMIN, v);
Christian Heimes217cfd12007-12-02 14:31:20 +0000106 v = PyLong_FromLong((long)mode.c_cc[VTIME]);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000107 if (v == NULL)
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000108 goto err;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000109 PyList_SetItem(cc, VTIME, v);
110 }
111
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000112 if (!(v = PyList_New(7)))
113 goto err;
114
Christian Heimes217cfd12007-12-02 14:31:20 +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));
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000121 PyList_SetItem(v, 6, cc);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000122 if (PyErr_Occurred()){
123 Py_DECREF(v);
124 goto err;
125 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000126 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000127 err:
128 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{
146 int fd, when;
147 struct termios mode;
148 speed_t ispeed, ospeed;
149 PyObject *term, *cc, *v;
150 int i;
151
Fred Drakeb638aaf2001-05-07 17:55:35 +0000152 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
153 fdconv, &fd, &when, &term))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000154 return NULL;
155 if (!PyList_Check(term) || PyList_Size(term) != 7) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000156 PyErr_SetString(PyExc_TypeError,
157 "tcsetattr, arg 3: must be 7 element list");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000158 return NULL;
159 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000160
Guido van Rossume7c41931998-06-12 14:26:18 +0000161 /* Get the old mode, in case there are any hidden fields... */
162 if (tcgetattr(fd, &mode) == -1)
163 return PyErr_SetFromErrno(TermiosError);
Christian Heimes217cfd12007-12-02 14:31:20 +0000164 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));
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000170 cc = PyList_GetItem(term, 6);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000171 if (PyErr_Occurred())
172 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000173
174 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000175 PyErr_Format(PyExc_TypeError,
176 "tcsetattr: attributes[6] must be %d element list",
177 NCCS);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000178 return NULL;
179 }
180
181 for (i = 0; i < NCCS; i++) {
182 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000183
Christian Heimes72b710a2008-05-26 13:28:38 +0000184 if (PyBytes_Check(v) && PyBytes_Size(v) == 1)
185 mode.c_cc[i] = (cc_t) * PyBytes_AsString(v);
Christian Heimes217cfd12007-12-02 14:31:20 +0000186 else if (PyLong_Check(v))
187 mode.c_cc[i] = (cc_t) PyLong_AsLong(v);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000188 else {
Fred Drakeb638aaf2001-05-07 17:55:35 +0000189 PyErr_SetString(PyExc_TypeError,
190 "tcsetattr: elements of attributes must be characters or integers");
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000191 return NULL;
192 }
193 }
194
195 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000196 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000197 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000198 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000199 if (tcsetattr(fd, when, &mode) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000200 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000201
202 Py_INCREF(Py_None);
203 return Py_None;
204}
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{
216 int fd, duration;
217
Fred Drakeb638aaf2001-05-07 17:55:35 +0000218 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
219 fdconv, &fd, &duration))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000220 return NULL;
221 if (tcsendbreak(fd, duration) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000222 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000223
224 Py_INCREF(Py_None);
225 return Py_None;
226}
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{
236 int fd;
237
Fred Drakeb638aaf2001-05-07 17:55:35 +0000238 if (!PyArg_ParseTuple(args, "O&:tcdrain",
239 fdconv, &fd))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000240 return NULL;
241 if (tcdrain(fd) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000242 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000243
244 Py_INCREF(Py_None);
245 return Py_None;
246}
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{
259 int fd, queue;
260
Fred Drakeb638aaf2001-05-07 17:55:35 +0000261 if (!PyArg_ParseTuple(args, "O&i:tcflush",
262 fdconv, &fd, &queue))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000263 return NULL;
264 if (tcflush(fd, queue) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000265 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000266
267 Py_INCREF(Py_None);
268 return Py_None;
269}
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{
282 int fd, action;
283
Fred Drakeb638aaf2001-05-07 17:55:35 +0000284 if (!PyArg_ParseTuple(args, "O&i:tcflow",
285 fdconv, &fd, &action))
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000286 return NULL;
287 if (tcflow(fd, action) == -1)
Guido van Rossumb8ad0241997-07-17 22:55:06 +0000288 return PyErr_SetFromErrno(TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000289
290 Py_INCREF(Py_None);
291 return Py_None;
292}
293
294static PyMethodDef termios_methods[] =
295{
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000296 {"tcgetattr", termios_tcgetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000297 METH_VARARGS, termios_tcgetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000298 {"tcsetattr", termios_tcsetattr,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000299 METH_VARARGS, termios_tcsetattr__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000300 {"tcsendbreak", termios_tcsendbreak,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000301 METH_VARARGS, termios_tcsendbreak__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000302 {"tcdrain", termios_tcdrain,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000303 METH_VARARGS, termios_tcdrain__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000304 {"tcflush", termios_tcflush,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000305 METH_VARARGS, termios_tcflush__doc__},
Andrew M. Kuchlinga1abb722000-08-03 02:34:44 +0000306 {"tcflow", termios_tcflow,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000307 METH_VARARGS, termios_tcflow__doc__},
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000308 {NULL, NULL}
309};
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 {
321 char *name;
322 long value;
323} termios_constants[] = {
324 /* 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
Fred Drakedf48d142001-02-27 21:22:39 +0000342 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000343#endif
344#ifdef B115200
Fred Drakedf48d142001-02-27 21:22:39 +0000345 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000346#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000347#ifdef B230400
Fred Drakedf48d142001-02-27 21:22:39 +0000348 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000349#endif
Fred Drake9ef7fa82001-03-01 21:54:49 +0000350#ifdef CBAUDEX
Fred Drakedf48d142001-02-27 21:22:39 +0000351 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000352#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000353
354 /* tcsetattr() constants */
355 {"TCSANOW", TCSANOW},
356 {"TCSADRAIN", TCSADRAIN},
357 {"TCSAFLUSH", TCSAFLUSH},
358
359 /* tcflush() constants */
360 {"TCIFLUSH", TCIFLUSH},
361 {"TCOFLUSH", TCOFLUSH},
362 {"TCIOFLUSH", TCIOFLUSH},
363
364 /* tcflow() constants */
365 {"TCOOFF", TCOOFF},
366 {"TCOON", TCOON},
367 {"TCIOFF", TCIOFF},
368 {"TCION", TCION},
369
370 /* struct termios.c_iflag constants */
371 {"IGNBRK", IGNBRK},
372 {"BRKINT", BRKINT},
373 {"IGNPAR", IGNPAR},
374 {"PARMRK", PARMRK},
375 {"INPCK", INPCK},
376 {"ISTRIP", ISTRIP},
377 {"INLCR", INLCR},
378 {"IGNCR", IGNCR},
379 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000380#ifdef IUCLC
Fred Drakedf48d142001-02-27 21:22:39 +0000381 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000382#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000383 {"IXON", IXON},
384 {"IXANY", IXANY},
385 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000386#ifdef IMAXBEL
Fred Drakedf48d142001-02-27 21:22:39 +0000387 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000388#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000389
390 /* struct termios.c_oflag constants */
391 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000392#ifdef OLCUC
Fred Drakedf48d142001-02-27 21:22:39 +0000393 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000394#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000395#ifdef ONLCR
Fred Drakedf48d142001-02-27 21:22:39 +0000396 {"ONLCR", ONLCR},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000397#endif
Fred Draked85556c2001-03-03 18:08:52 +0000398#ifdef OCRNL
Fred Drakedf48d142001-02-27 21:22:39 +0000399 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000400#endif
401#ifdef ONOCR
Fred Drakedf48d142001-02-27 21:22:39 +0000402 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000403#endif
404#ifdef ONLRET
Fred Drakedf48d142001-02-27 21:22:39 +0000405 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000406#endif
407#ifdef OFILL
Fred Drakedf48d142001-02-27 21:22:39 +0000408 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000409#endif
410#ifdef OFDEL
Fred Drakedf48d142001-02-27 21:22:39 +0000411 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000412#endif
413#ifdef NLDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000414 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000415#endif
416#ifdef CRDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000417 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000418#endif
419#ifdef TABDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000420 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000421#endif
422#ifdef BSDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000423 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000424#endif
425#ifdef VTDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000426 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000427#endif
428#ifdef FFDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000429 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000430#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000431
432 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000433#ifdef NL0
Fred Drakedf48d142001-02-27 21:22:39 +0000434 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000435#endif
436#ifdef NL1
Fred Drakedf48d142001-02-27 21:22:39 +0000437 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000438#endif
439#ifdef CR0
Fred Drakedf48d142001-02-27 21:22:39 +0000440 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000441#endif
442#ifdef CR1
Fred Drakedf48d142001-02-27 21:22:39 +0000443 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000444#endif
445#ifdef CR2
Fred Drakedf48d142001-02-27 21:22:39 +0000446 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000447#endif
448#ifdef CR3
Fred Drakedf48d142001-02-27 21:22:39 +0000449 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000450#endif
451#ifdef TAB0
Fred Drakedf48d142001-02-27 21:22:39 +0000452 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000453#endif
454#ifdef TAB1
Fred Drakedf48d142001-02-27 21:22:39 +0000455 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000456#endif
457#ifdef TAB2
Fred Drakedf48d142001-02-27 21:22:39 +0000458 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000459#endif
460#ifdef TAB3
Fred Drakedf48d142001-02-27 21:22:39 +0000461 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000462#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000463#ifdef XTABS
Fred Drakedf48d142001-02-27 21:22:39 +0000464 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000465#endif
Fred Draked85556c2001-03-03 18:08:52 +0000466#ifdef BS0
Fred Drakedf48d142001-02-27 21:22:39 +0000467 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000468#endif
469#ifdef BS1
Fred Drakedf48d142001-02-27 21:22:39 +0000470 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000471#endif
472#ifdef VT0
Fred Drakedf48d142001-02-27 21:22:39 +0000473 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000474#endif
475#ifdef VT1
Fred Drakedf48d142001-02-27 21:22:39 +0000476 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000477#endif
478#ifdef FF0
Fred Drakedf48d142001-02-27 21:22:39 +0000479 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000480#endif
481#ifdef FF1
Fred Drakedf48d142001-02-27 21:22:39 +0000482 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000483#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000484
485 /* struct termios.c_cflag constants */
486 {"CSIZE", CSIZE},
487 {"CSTOPB", CSTOPB},
488 {"CREAD", CREAD},
489 {"PARENB", PARENB},
490 {"PARODD", PARODD},
491 {"HUPCL", HUPCL},
492 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000493#ifdef CIBAUD
Fred Drakedf48d142001-02-27 21:22:39 +0000494 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000495#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000496#ifdef CRTSCTS
497 {"CRTSCTS", (long)CRTSCTS},
498#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000499
500 /* struct termios.c_cflag-related values (character size) */
501 {"CS5", CS5},
502 {"CS6", CS6},
503 {"CS7", CS7},
504 {"CS8", CS8},
505
506 /* struct termios.c_lflag constants */
507 {"ISIG", ISIG},
508 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000509#ifdef XCASE
Fred Drakedf48d142001-02-27 21:22:39 +0000510 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000511#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000512 {"ECHO", ECHO},
513 {"ECHOE", ECHOE},
514 {"ECHOK", ECHOK},
515 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000516#ifdef ECHOCTL
Fred Drakedf48d142001-02-27 21:22:39 +0000517 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000518#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000519#ifdef ECHOPRT
Fred Drakedf48d142001-02-27 21:22:39 +0000520 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000521#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000522#ifdef ECHOKE
Fred Drakedf48d142001-02-27 21:22:39 +0000523 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000524#endif
525#ifdef FLUSHO
Fred Drakedf48d142001-02-27 21:22:39 +0000526 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000527#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000528 {"NOFLSH", NOFLSH},
529 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000530#ifdef PENDIN
Fred Drakedf48d142001-02-27 21:22:39 +0000531 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000532#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000533 {"IEXTEN", IEXTEN},
534
535 /* indexes into the control chars array returned by tcgetattr() */
536 {"VINTR", VINTR},
537 {"VQUIT", VQUIT},
538 {"VERASE", VERASE},
539 {"VKILL", VKILL},
540 {"VEOF", VEOF},
541 {"VTIME", VTIME},
542 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000543#ifdef VSWTC
544 /* The #defines above ensure that if either is defined, both are,
545 * but both may be omitted by the system headers. ;-( */
Fred Drakedf48d142001-02-27 21:22:39 +0000546 {"VSWTC", VSWTC},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000547 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000548#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000549 {"VSTART", VSTART},
550 {"VSTOP", VSTOP},
551 {"VSUSP", VSUSP},
552 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000553#ifdef VREPRINT
Fred Drakedf48d142001-02-27 21:22:39 +0000554 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000555#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000556#ifdef VDISCARD
Fred Drakedf48d142001-02-27 21:22:39 +0000557 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000558#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000559#ifdef VWERASE
Fred Drakedf48d142001-02-27 21:22:39 +0000560 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000561#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000562#ifdef VLNEXT
Fred Drakedf48d142001-02-27 21:22:39 +0000563 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000564#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000565#ifdef VEOL2
Fred Drakedf48d142001-02-27 21:22:39 +0000566 {"VEOL2", VEOL2},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000567#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000568
Fred Drake55a00342001-03-26 17:14:02 +0000569
570#ifdef B460800
571 {"B460800", B460800},
572#endif
573#ifdef CBAUD
574 {"CBAUD", CBAUD},
575#endif
576#ifdef CDEL
577 {"CDEL", CDEL},
578#endif
579#ifdef CDSUSP
580 {"CDSUSP", CDSUSP},
581#endif
582#ifdef CEOF
583 {"CEOF", CEOF},
584#endif
585#ifdef CEOL
586 {"CEOL", CEOL},
587#endif
588#ifdef CEOL2
589 {"CEOL2", CEOL2},
590#endif
591#ifdef CEOT
592 {"CEOT", CEOT},
593#endif
594#ifdef CERASE
595 {"CERASE", CERASE},
596#endif
597#ifdef CESC
598 {"CESC", CESC},
599#endif
600#ifdef CFLUSH
601 {"CFLUSH", CFLUSH},
602#endif
603#ifdef CINTR
604 {"CINTR", CINTR},
605#endif
606#ifdef CKILL
607 {"CKILL", CKILL},
608#endif
609#ifdef CLNEXT
610 {"CLNEXT", CLNEXT},
611#endif
612#ifdef CNUL
613 {"CNUL", CNUL},
614#endif
615#ifdef COMMON
616 {"COMMON", COMMON},
617#endif
618#ifdef CQUIT
619 {"CQUIT", CQUIT},
620#endif
621#ifdef CRPRNT
622 {"CRPRNT", CRPRNT},
623#endif
624#ifdef CSTART
625 {"CSTART", CSTART},
626#endif
627#ifdef CSTOP
628 {"CSTOP", CSTOP},
629#endif
630#ifdef CSUSP
631 {"CSUSP", CSUSP},
632#endif
633#ifdef CSWTCH
634 {"CSWTCH", CSWTCH},
635#endif
636#ifdef CWERASE
637 {"CWERASE", CWERASE},
638#endif
639#ifdef EXTA
640 {"EXTA", EXTA},
641#endif
642#ifdef EXTB
643 {"EXTB", EXTB},
644#endif
645#ifdef FIOASYNC
646 {"FIOASYNC", FIOASYNC},
647#endif
648#ifdef FIOCLEX
649 {"FIOCLEX", FIOCLEX},
650#endif
651#ifdef FIONBIO
652 {"FIONBIO", FIONBIO},
653#endif
654#ifdef FIONCLEX
655 {"FIONCLEX", FIONCLEX},
656#endif
657#ifdef FIONREAD
658 {"FIONREAD", FIONREAD},
659#endif
660#ifdef IBSHIFT
661 {"IBSHIFT", IBSHIFT},
662#endif
663#ifdef INIT_C_CC
664 {"INIT_C_CC", INIT_C_CC},
665#endif
666#ifdef IOCSIZE_MASK
667 {"IOCSIZE_MASK", IOCSIZE_MASK},
668#endif
669#ifdef IOCSIZE_SHIFT
670 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
671#endif
672#ifdef NCC
673 {"NCC", NCC},
674#endif
675#ifdef NCCS
676 {"NCCS", NCCS},
677#endif
678#ifdef NSWTCH
679 {"NSWTCH", NSWTCH},
680#endif
681#ifdef N_MOUSE
682 {"N_MOUSE", N_MOUSE},
683#endif
684#ifdef N_PPP
685 {"N_PPP", N_PPP},
686#endif
687#ifdef N_SLIP
688 {"N_SLIP", N_SLIP},
689#endif
690#ifdef N_STRIP
691 {"N_STRIP", N_STRIP},
692#endif
693#ifdef N_TTY
694 {"N_TTY", N_TTY},
695#endif
696#ifdef TCFLSH
697 {"TCFLSH", TCFLSH},
698#endif
699#ifdef TCGETA
700 {"TCGETA", TCGETA},
701#endif
702#ifdef TCGETS
703 {"TCGETS", TCGETS},
704#endif
705#ifdef TCSBRK
706 {"TCSBRK", TCSBRK},
707#endif
708#ifdef TCSBRKP
709 {"TCSBRKP", TCSBRKP},
710#endif
711#ifdef TCSETA
712 {"TCSETA", TCSETA},
713#endif
714#ifdef TCSETAF
715 {"TCSETAF", TCSETAF},
716#endif
717#ifdef TCSETAW
718 {"TCSETAW", TCSETAW},
719#endif
720#ifdef TCSETS
721 {"TCSETS", TCSETS},
722#endif
723#ifdef TCSETSF
724 {"TCSETSF", TCSETSF},
725#endif
726#ifdef TCSETSW
727 {"TCSETSW", TCSETSW},
728#endif
729#ifdef TCXONC
730 {"TCXONC", TCXONC},
731#endif
732#ifdef TIOCCONS
733 {"TIOCCONS", TIOCCONS},
734#endif
735#ifdef TIOCEXCL
736 {"TIOCEXCL", TIOCEXCL},
737#endif
738#ifdef TIOCGETD
739 {"TIOCGETD", TIOCGETD},
740#endif
741#ifdef TIOCGICOUNT
742 {"TIOCGICOUNT", TIOCGICOUNT},
743#endif
744#ifdef TIOCGLCKTRMIOS
745 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
746#endif
747#ifdef TIOCGPGRP
748 {"TIOCGPGRP", TIOCGPGRP},
749#endif
750#ifdef TIOCGSERIAL
751 {"TIOCGSERIAL", TIOCGSERIAL},
752#endif
753#ifdef TIOCGSOFTCAR
754 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
755#endif
756#ifdef TIOCGWINSZ
757 {"TIOCGWINSZ", TIOCGWINSZ},
758#endif
759#ifdef TIOCINQ
760 {"TIOCINQ", TIOCINQ},
761#endif
762#ifdef TIOCLINUX
763 {"TIOCLINUX", TIOCLINUX},
764#endif
765#ifdef TIOCMBIC
766 {"TIOCMBIC", TIOCMBIC},
767#endif
768#ifdef TIOCMBIS
769 {"TIOCMBIS", TIOCMBIS},
770#endif
771#ifdef TIOCMGET
772 {"TIOCMGET", TIOCMGET},
773#endif
774#ifdef TIOCMIWAIT
775 {"TIOCMIWAIT", TIOCMIWAIT},
776#endif
777#ifdef TIOCMSET
778 {"TIOCMSET", TIOCMSET},
779#endif
780#ifdef TIOCM_CAR
781 {"TIOCM_CAR", TIOCM_CAR},
782#endif
783#ifdef TIOCM_CD
784 {"TIOCM_CD", TIOCM_CD},
785#endif
786#ifdef TIOCM_CTS
787 {"TIOCM_CTS", TIOCM_CTS},
788#endif
789#ifdef TIOCM_DSR
790 {"TIOCM_DSR", TIOCM_DSR},
791#endif
792#ifdef TIOCM_DTR
793 {"TIOCM_DTR", TIOCM_DTR},
794#endif
795#ifdef TIOCM_LE
796 {"TIOCM_LE", TIOCM_LE},
797#endif
798#ifdef TIOCM_RI
799 {"TIOCM_RI", TIOCM_RI},
800#endif
801#ifdef TIOCM_RNG
802 {"TIOCM_RNG", TIOCM_RNG},
803#endif
804#ifdef TIOCM_RTS
805 {"TIOCM_RTS", TIOCM_RTS},
806#endif
807#ifdef TIOCM_SR
808 {"TIOCM_SR", TIOCM_SR},
809#endif
810#ifdef TIOCM_ST
811 {"TIOCM_ST", TIOCM_ST},
812#endif
813#ifdef TIOCNOTTY
814 {"TIOCNOTTY", TIOCNOTTY},
815#endif
816#ifdef TIOCNXCL
817 {"TIOCNXCL", TIOCNXCL},
818#endif
819#ifdef TIOCOUTQ
820 {"TIOCOUTQ", TIOCOUTQ},
821#endif
822#ifdef TIOCPKT
823 {"TIOCPKT", TIOCPKT},
824#endif
825#ifdef TIOCPKT_DATA
826 {"TIOCPKT_DATA", TIOCPKT_DATA},
827#endif
828#ifdef TIOCPKT_DOSTOP
829 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
830#endif
831#ifdef TIOCPKT_FLUSHREAD
832 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
833#endif
834#ifdef TIOCPKT_FLUSHWRITE
835 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
836#endif
837#ifdef TIOCPKT_NOSTOP
838 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
839#endif
840#ifdef TIOCPKT_START
841 {"TIOCPKT_START", TIOCPKT_START},
842#endif
843#ifdef TIOCPKT_STOP
844 {"TIOCPKT_STOP", TIOCPKT_STOP},
845#endif
846#ifdef TIOCSCTTY
847 {"TIOCSCTTY", TIOCSCTTY},
848#endif
849#ifdef TIOCSERCONFIG
850 {"TIOCSERCONFIG", TIOCSERCONFIG},
851#endif
852#ifdef TIOCSERGETLSR
853 {"TIOCSERGETLSR", TIOCSERGETLSR},
854#endif
855#ifdef TIOCSERGETMULTI
856 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
857#endif
858#ifdef TIOCSERGSTRUCT
859 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
860#endif
861#ifdef TIOCSERGWILD
862 {"TIOCSERGWILD", TIOCSERGWILD},
863#endif
864#ifdef TIOCSERSETMULTI
865 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
866#endif
867#ifdef TIOCSERSWILD
868 {"TIOCSERSWILD", TIOCSERSWILD},
869#endif
870#ifdef TIOCSER_TEMT
871 {"TIOCSER_TEMT", TIOCSER_TEMT},
872#endif
873#ifdef TIOCSETD
874 {"TIOCSETD", TIOCSETD},
875#endif
876#ifdef TIOCSLCKTRMIOS
877 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
878#endif
879#ifdef TIOCSPGRP
880 {"TIOCSPGRP", TIOCSPGRP},
881#endif
882#ifdef TIOCSSERIAL
883 {"TIOCSSERIAL", TIOCSSERIAL},
884#endif
885#ifdef TIOCSSOFTCAR
886 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
887#endif
888#ifdef TIOCSTI
889 {"TIOCSTI", TIOCSTI},
890#endif
891#ifdef TIOCSWINSZ
892 {"TIOCSWINSZ", TIOCSWINSZ},
893#endif
894#ifdef TIOCTTYGSTRUCT
895 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
896#endif
897
Fred Drakedf48d142001-02-27 21:22:39 +0000898 /* sentinel */
899 {NULL, 0}
900};
901
902
Martin v. Löwis1a214512008-06-11 05:26:20 +0000903static struct PyModuleDef termiosmodule = {
904 PyModuleDef_HEAD_INIT,
905 "termios",
906 termios__doc__,
907 -1,
908 termios_methods,
909 NULL,
910 NULL,
911 NULL,
912 NULL
913};
914
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000915PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000916PyInit_termios(void)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000917{
Fred Drake78f6c862002-02-14 07:11:23 +0000918 PyObject *m;
Fred Drakedf48d142001-02-27 21:22:39 +0000919 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000920
Martin v. Löwis1a214512008-06-11 05:26:20 +0000921 m = PyModule_Create(&termiosmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000922 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000923 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000924
Fred Drake78f6c862002-02-14 07:11:23 +0000925 if (TermiosError == NULL) {
926 TermiosError = PyErr_NewException("termios.error", NULL, NULL);
927 }
928 Py_INCREF(TermiosError);
929 PyModule_AddObject(m, "error", TermiosError);
Fred Drakedf48d142001-02-27 21:22:39 +0000930
931 while (constant->name != NULL) {
932 PyModule_AddIntConstant(m, constant->name, constant->value);
933 ++constant;
934 }
Martin v. Löwis1a214512008-06-11 05:26:20 +0000935 return m;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000936}