blob: efdeeaacb28e48fb0b361e341ddd7bacfd1000d2 [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},
Gregory P. Smithcafc22f2009-11-01 19:24:18 +0000358#ifdef TCSASOFT
359 {"TCSASOFT", TCSASOFT},
360#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000361
362 /* tcflush() constants */
363 {"TCIFLUSH", TCIFLUSH},
364 {"TCOFLUSH", TCOFLUSH},
365 {"TCIOFLUSH", TCIOFLUSH},
366
367 /* tcflow() constants */
368 {"TCOOFF", TCOOFF},
369 {"TCOON", TCOON},
370 {"TCIOFF", TCIOFF},
371 {"TCION", TCION},
372
373 /* struct termios.c_iflag constants */
374 {"IGNBRK", IGNBRK},
375 {"BRKINT", BRKINT},
376 {"IGNPAR", IGNPAR},
377 {"PARMRK", PARMRK},
378 {"INPCK", INPCK},
379 {"ISTRIP", ISTRIP},
380 {"INLCR", INLCR},
381 {"IGNCR", IGNCR},
382 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000383#ifdef IUCLC
Fred Drakedf48d142001-02-27 21:22:39 +0000384 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000385#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000386 {"IXON", IXON},
387 {"IXANY", IXANY},
388 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000389#ifdef IMAXBEL
Fred Drakedf48d142001-02-27 21:22:39 +0000390 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000391#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000392
393 /* struct termios.c_oflag constants */
394 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000395#ifdef OLCUC
Fred Drakedf48d142001-02-27 21:22:39 +0000396 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000397#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000398#ifdef ONLCR
Fred Drakedf48d142001-02-27 21:22:39 +0000399 {"ONLCR", ONLCR},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000400#endif
Fred Draked85556c2001-03-03 18:08:52 +0000401#ifdef OCRNL
Fred Drakedf48d142001-02-27 21:22:39 +0000402 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000403#endif
404#ifdef ONOCR
Fred Drakedf48d142001-02-27 21:22:39 +0000405 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000406#endif
407#ifdef ONLRET
Fred Drakedf48d142001-02-27 21:22:39 +0000408 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000409#endif
410#ifdef OFILL
Fred Drakedf48d142001-02-27 21:22:39 +0000411 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000412#endif
413#ifdef OFDEL
Fred Drakedf48d142001-02-27 21:22:39 +0000414 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000415#endif
416#ifdef NLDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000417 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000418#endif
419#ifdef CRDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000420 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000421#endif
422#ifdef TABDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000423 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000424#endif
425#ifdef BSDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000426 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000427#endif
428#ifdef VTDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000429 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000430#endif
431#ifdef FFDLY
Fred Drakedf48d142001-02-27 21:22:39 +0000432 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000433#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000434
435 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000436#ifdef NL0
Fred Drakedf48d142001-02-27 21:22:39 +0000437 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000438#endif
439#ifdef NL1
Fred Drakedf48d142001-02-27 21:22:39 +0000440 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000441#endif
442#ifdef CR0
Fred Drakedf48d142001-02-27 21:22:39 +0000443 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000444#endif
445#ifdef CR1
Fred Drakedf48d142001-02-27 21:22:39 +0000446 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000447#endif
448#ifdef CR2
Fred Drakedf48d142001-02-27 21:22:39 +0000449 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000450#endif
451#ifdef CR3
Fred Drakedf48d142001-02-27 21:22:39 +0000452 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000453#endif
454#ifdef TAB0
Fred Drakedf48d142001-02-27 21:22:39 +0000455 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000456#endif
457#ifdef TAB1
Fred Drakedf48d142001-02-27 21:22:39 +0000458 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000459#endif
460#ifdef TAB2
Fred Drakedf48d142001-02-27 21:22:39 +0000461 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000462#endif
463#ifdef TAB3
Fred Drakedf48d142001-02-27 21:22:39 +0000464 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000465#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000466#ifdef XTABS
Fred Drakedf48d142001-02-27 21:22:39 +0000467 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000468#endif
Fred Draked85556c2001-03-03 18:08:52 +0000469#ifdef BS0
Fred Drakedf48d142001-02-27 21:22:39 +0000470 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000471#endif
472#ifdef BS1
Fred Drakedf48d142001-02-27 21:22:39 +0000473 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000474#endif
475#ifdef VT0
Fred Drakedf48d142001-02-27 21:22:39 +0000476 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000477#endif
478#ifdef VT1
Fred Drakedf48d142001-02-27 21:22:39 +0000479 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000480#endif
481#ifdef FF0
Fred Drakedf48d142001-02-27 21:22:39 +0000482 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000483#endif
484#ifdef FF1
Fred Drakedf48d142001-02-27 21:22:39 +0000485 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000486#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000487
488 /* struct termios.c_cflag constants */
489 {"CSIZE", CSIZE},
490 {"CSTOPB", CSTOPB},
491 {"CREAD", CREAD},
492 {"PARENB", PARENB},
493 {"PARODD", PARODD},
494 {"HUPCL", HUPCL},
495 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000496#ifdef CIBAUD
Fred Drakedf48d142001-02-27 21:22:39 +0000497 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000498#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000499#ifdef CRTSCTS
500 {"CRTSCTS", (long)CRTSCTS},
501#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000502
503 /* struct termios.c_cflag-related values (character size) */
504 {"CS5", CS5},
505 {"CS6", CS6},
506 {"CS7", CS7},
507 {"CS8", CS8},
508
509 /* struct termios.c_lflag constants */
510 {"ISIG", ISIG},
511 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000512#ifdef XCASE
Fred Drakedf48d142001-02-27 21:22:39 +0000513 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000514#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000515 {"ECHO", ECHO},
516 {"ECHOE", ECHOE},
517 {"ECHOK", ECHOK},
518 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000519#ifdef ECHOCTL
Fred Drakedf48d142001-02-27 21:22:39 +0000520 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000521#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000522#ifdef ECHOPRT
Fred Drakedf48d142001-02-27 21:22:39 +0000523 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000524#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000525#ifdef ECHOKE
Fred Drakedf48d142001-02-27 21:22:39 +0000526 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000527#endif
528#ifdef FLUSHO
Fred Drakedf48d142001-02-27 21:22:39 +0000529 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000530#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000531 {"NOFLSH", NOFLSH},
532 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000533#ifdef PENDIN
Fred Drakedf48d142001-02-27 21:22:39 +0000534 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000535#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000536 {"IEXTEN", IEXTEN},
537
538 /* indexes into the control chars array returned by tcgetattr() */
539 {"VINTR", VINTR},
540 {"VQUIT", VQUIT},
541 {"VERASE", VERASE},
542 {"VKILL", VKILL},
543 {"VEOF", VEOF},
544 {"VTIME", VTIME},
545 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000546#ifdef VSWTC
547 /* The #defines above ensure that if either is defined, both are,
548 * but both may be omitted by the system headers. ;-( */
Fred Drakedf48d142001-02-27 21:22:39 +0000549 {"VSWTC", VSWTC},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000550 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000551#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000552 {"VSTART", VSTART},
553 {"VSTOP", VSTOP},
554 {"VSUSP", VSUSP},
555 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000556#ifdef VREPRINT
Fred Drakedf48d142001-02-27 21:22:39 +0000557 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000558#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000559#ifdef VDISCARD
Fred Drakedf48d142001-02-27 21:22:39 +0000560 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000561#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000562#ifdef VWERASE
Fred Drakedf48d142001-02-27 21:22:39 +0000563 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000564#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000565#ifdef VLNEXT
Fred Drakedf48d142001-02-27 21:22:39 +0000566 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000567#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000568#ifdef VEOL2
Fred Drakedf48d142001-02-27 21:22:39 +0000569 {"VEOL2", VEOL2},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000570#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000571
Fred Drake55a00342001-03-26 17:14:02 +0000572
573#ifdef B460800
574 {"B460800", B460800},
575#endif
576#ifdef CBAUD
577 {"CBAUD", CBAUD},
578#endif
579#ifdef CDEL
580 {"CDEL", CDEL},
581#endif
582#ifdef CDSUSP
583 {"CDSUSP", CDSUSP},
584#endif
585#ifdef CEOF
586 {"CEOF", CEOF},
587#endif
588#ifdef CEOL
589 {"CEOL", CEOL},
590#endif
591#ifdef CEOL2
592 {"CEOL2", CEOL2},
593#endif
594#ifdef CEOT
595 {"CEOT", CEOT},
596#endif
597#ifdef CERASE
598 {"CERASE", CERASE},
599#endif
600#ifdef CESC
601 {"CESC", CESC},
602#endif
603#ifdef CFLUSH
604 {"CFLUSH", CFLUSH},
605#endif
606#ifdef CINTR
607 {"CINTR", CINTR},
608#endif
609#ifdef CKILL
610 {"CKILL", CKILL},
611#endif
612#ifdef CLNEXT
613 {"CLNEXT", CLNEXT},
614#endif
615#ifdef CNUL
616 {"CNUL", CNUL},
617#endif
618#ifdef COMMON
619 {"COMMON", COMMON},
620#endif
621#ifdef CQUIT
622 {"CQUIT", CQUIT},
623#endif
624#ifdef CRPRNT
625 {"CRPRNT", CRPRNT},
626#endif
627#ifdef CSTART
628 {"CSTART", CSTART},
629#endif
630#ifdef CSTOP
631 {"CSTOP", CSTOP},
632#endif
633#ifdef CSUSP
634 {"CSUSP", CSUSP},
635#endif
636#ifdef CSWTCH
637 {"CSWTCH", CSWTCH},
638#endif
639#ifdef CWERASE
640 {"CWERASE", CWERASE},
641#endif
642#ifdef EXTA
643 {"EXTA", EXTA},
644#endif
645#ifdef EXTB
646 {"EXTB", EXTB},
647#endif
648#ifdef FIOASYNC
649 {"FIOASYNC", FIOASYNC},
650#endif
651#ifdef FIOCLEX
652 {"FIOCLEX", FIOCLEX},
653#endif
654#ifdef FIONBIO
655 {"FIONBIO", FIONBIO},
656#endif
657#ifdef FIONCLEX
658 {"FIONCLEX", FIONCLEX},
659#endif
660#ifdef FIONREAD
661 {"FIONREAD", FIONREAD},
662#endif
663#ifdef IBSHIFT
664 {"IBSHIFT", IBSHIFT},
665#endif
666#ifdef INIT_C_CC
667 {"INIT_C_CC", INIT_C_CC},
668#endif
669#ifdef IOCSIZE_MASK
670 {"IOCSIZE_MASK", IOCSIZE_MASK},
671#endif
672#ifdef IOCSIZE_SHIFT
673 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
674#endif
675#ifdef NCC
676 {"NCC", NCC},
677#endif
678#ifdef NCCS
679 {"NCCS", NCCS},
680#endif
681#ifdef NSWTCH
682 {"NSWTCH", NSWTCH},
683#endif
684#ifdef N_MOUSE
685 {"N_MOUSE", N_MOUSE},
686#endif
687#ifdef N_PPP
688 {"N_PPP", N_PPP},
689#endif
690#ifdef N_SLIP
691 {"N_SLIP", N_SLIP},
692#endif
693#ifdef N_STRIP
694 {"N_STRIP", N_STRIP},
695#endif
696#ifdef N_TTY
697 {"N_TTY", N_TTY},
698#endif
699#ifdef TCFLSH
700 {"TCFLSH", TCFLSH},
701#endif
702#ifdef TCGETA
703 {"TCGETA", TCGETA},
704#endif
705#ifdef TCGETS
706 {"TCGETS", TCGETS},
707#endif
708#ifdef TCSBRK
709 {"TCSBRK", TCSBRK},
710#endif
711#ifdef TCSBRKP
712 {"TCSBRKP", TCSBRKP},
713#endif
714#ifdef TCSETA
715 {"TCSETA", TCSETA},
716#endif
717#ifdef TCSETAF
718 {"TCSETAF", TCSETAF},
719#endif
720#ifdef TCSETAW
721 {"TCSETAW", TCSETAW},
722#endif
723#ifdef TCSETS
724 {"TCSETS", TCSETS},
725#endif
726#ifdef TCSETSF
727 {"TCSETSF", TCSETSF},
728#endif
729#ifdef TCSETSW
730 {"TCSETSW", TCSETSW},
731#endif
732#ifdef TCXONC
733 {"TCXONC", TCXONC},
734#endif
735#ifdef TIOCCONS
736 {"TIOCCONS", TIOCCONS},
737#endif
738#ifdef TIOCEXCL
739 {"TIOCEXCL", TIOCEXCL},
740#endif
741#ifdef TIOCGETD
742 {"TIOCGETD", TIOCGETD},
743#endif
744#ifdef TIOCGICOUNT
745 {"TIOCGICOUNT", TIOCGICOUNT},
746#endif
747#ifdef TIOCGLCKTRMIOS
748 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
749#endif
750#ifdef TIOCGPGRP
751 {"TIOCGPGRP", TIOCGPGRP},
752#endif
753#ifdef TIOCGSERIAL
754 {"TIOCGSERIAL", TIOCGSERIAL},
755#endif
756#ifdef TIOCGSOFTCAR
757 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
758#endif
759#ifdef TIOCGWINSZ
760 {"TIOCGWINSZ", TIOCGWINSZ},
761#endif
762#ifdef TIOCINQ
763 {"TIOCINQ", TIOCINQ},
764#endif
765#ifdef TIOCLINUX
766 {"TIOCLINUX", TIOCLINUX},
767#endif
768#ifdef TIOCMBIC
769 {"TIOCMBIC", TIOCMBIC},
770#endif
771#ifdef TIOCMBIS
772 {"TIOCMBIS", TIOCMBIS},
773#endif
774#ifdef TIOCMGET
775 {"TIOCMGET", TIOCMGET},
776#endif
777#ifdef TIOCMIWAIT
778 {"TIOCMIWAIT", TIOCMIWAIT},
779#endif
780#ifdef TIOCMSET
781 {"TIOCMSET", TIOCMSET},
782#endif
783#ifdef TIOCM_CAR
784 {"TIOCM_CAR", TIOCM_CAR},
785#endif
786#ifdef TIOCM_CD
787 {"TIOCM_CD", TIOCM_CD},
788#endif
789#ifdef TIOCM_CTS
790 {"TIOCM_CTS", TIOCM_CTS},
791#endif
792#ifdef TIOCM_DSR
793 {"TIOCM_DSR", TIOCM_DSR},
794#endif
795#ifdef TIOCM_DTR
796 {"TIOCM_DTR", TIOCM_DTR},
797#endif
798#ifdef TIOCM_LE
799 {"TIOCM_LE", TIOCM_LE},
800#endif
801#ifdef TIOCM_RI
802 {"TIOCM_RI", TIOCM_RI},
803#endif
804#ifdef TIOCM_RNG
805 {"TIOCM_RNG", TIOCM_RNG},
806#endif
807#ifdef TIOCM_RTS
808 {"TIOCM_RTS", TIOCM_RTS},
809#endif
810#ifdef TIOCM_SR
811 {"TIOCM_SR", TIOCM_SR},
812#endif
813#ifdef TIOCM_ST
814 {"TIOCM_ST", TIOCM_ST},
815#endif
816#ifdef TIOCNOTTY
817 {"TIOCNOTTY", TIOCNOTTY},
818#endif
819#ifdef TIOCNXCL
820 {"TIOCNXCL", TIOCNXCL},
821#endif
822#ifdef TIOCOUTQ
823 {"TIOCOUTQ", TIOCOUTQ},
824#endif
825#ifdef TIOCPKT
826 {"TIOCPKT", TIOCPKT},
827#endif
828#ifdef TIOCPKT_DATA
829 {"TIOCPKT_DATA", TIOCPKT_DATA},
830#endif
831#ifdef TIOCPKT_DOSTOP
832 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
833#endif
834#ifdef TIOCPKT_FLUSHREAD
835 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
836#endif
837#ifdef TIOCPKT_FLUSHWRITE
838 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
839#endif
840#ifdef TIOCPKT_NOSTOP
841 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
842#endif
843#ifdef TIOCPKT_START
844 {"TIOCPKT_START", TIOCPKT_START},
845#endif
846#ifdef TIOCPKT_STOP
847 {"TIOCPKT_STOP", TIOCPKT_STOP},
848#endif
849#ifdef TIOCSCTTY
850 {"TIOCSCTTY", TIOCSCTTY},
851#endif
852#ifdef TIOCSERCONFIG
853 {"TIOCSERCONFIG", TIOCSERCONFIG},
854#endif
855#ifdef TIOCSERGETLSR
856 {"TIOCSERGETLSR", TIOCSERGETLSR},
857#endif
858#ifdef TIOCSERGETMULTI
859 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
860#endif
861#ifdef TIOCSERGSTRUCT
862 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
863#endif
864#ifdef TIOCSERGWILD
865 {"TIOCSERGWILD", TIOCSERGWILD},
866#endif
867#ifdef TIOCSERSETMULTI
868 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
869#endif
870#ifdef TIOCSERSWILD
871 {"TIOCSERSWILD", TIOCSERSWILD},
872#endif
873#ifdef TIOCSER_TEMT
874 {"TIOCSER_TEMT", TIOCSER_TEMT},
875#endif
876#ifdef TIOCSETD
877 {"TIOCSETD", TIOCSETD},
878#endif
879#ifdef TIOCSLCKTRMIOS
880 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
881#endif
882#ifdef TIOCSPGRP
883 {"TIOCSPGRP", TIOCSPGRP},
884#endif
885#ifdef TIOCSSERIAL
886 {"TIOCSSERIAL", TIOCSSERIAL},
887#endif
888#ifdef TIOCSSOFTCAR
889 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
890#endif
891#ifdef TIOCSTI
892 {"TIOCSTI", TIOCSTI},
893#endif
894#ifdef TIOCSWINSZ
895 {"TIOCSWINSZ", TIOCSWINSZ},
896#endif
897#ifdef TIOCTTYGSTRUCT
898 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
899#endif
900
Fred Drakedf48d142001-02-27 21:22:39 +0000901 /* sentinel */
902 {NULL, 0}
903};
904
905
Martin v. Löwis1a214512008-06-11 05:26:20 +0000906static struct PyModuleDef termiosmodule = {
907 PyModuleDef_HEAD_INIT,
908 "termios",
909 termios__doc__,
910 -1,
911 termios_methods,
912 NULL,
913 NULL,
914 NULL,
915 NULL
916};
917
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000918PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000919PyInit_termios(void)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000920{
Fred Drake78f6c862002-02-14 07:11:23 +0000921 PyObject *m;
Fred Drakedf48d142001-02-27 21:22:39 +0000922 struct constant *constant = termios_constants;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000923
Martin v. Löwis1a214512008-06-11 05:26:20 +0000924 m = PyModule_Create(&termiosmodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000925 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000926 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000927
Fred Drake78f6c862002-02-14 07:11:23 +0000928 if (TermiosError == NULL) {
929 TermiosError = PyErr_NewException("termios.error", NULL, NULL);
930 }
931 Py_INCREF(TermiosError);
932 PyModule_AddObject(m, "error", TermiosError);
Fred Drakedf48d142001-02-27 21:22:39 +0000933
934 while (constant->name != NULL) {
935 PyModule_AddIntConstant(m, constant->name, constant->value);
936 ++constant;
937 }
Martin v. Löwis1a214512008-06-11 05:26:20 +0000938 return m;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000939}