blob: cc0d5853f85e3527274bf2a096171f3465e44c17 [file] [log] [blame]
Soumendra Ganguly97003462020-08-16 10:51:00 -05001/* termios.c -- POSIX terminal I/O module implementation. */
Guido van Rossum9adae8e1994-09-12 10:41:22 +00002
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
jceaf0a95f22018-01-28 14:00:48 +010011#if defined(__sun)
12/* We could do better. Check issue-32660 */
13#include <sys/filio.h>
14#include <sys/sockio.h>
15#endif
16
Guido van Rossum9adae8e1994-09-12 10:41:22 +000017#include <termios.h>
Fred Drake9b3bc492001-04-04 21:19:26 +000018#include <sys/ioctl.h>
Guido van Rossum1aca4d81998-03-03 22:10:18 +000019
Fred Drake87068f12001-05-11 16:14:17 +000020/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
Min ho Kim39d87b52019-08-31 06:21:19 +100021 * MDTR, MRI, and MRTS (apparently used internally by some things
Fred Drake87068f12001-05-11 16:14:17 +000022 * defined as macros; these are not used here directly).
23 */
24#ifdef HAVE_SYS_MODEM_H
25#include <sys/modem.h>
26#endif
Neal Norwitz82251032003-05-23 14:35:24 +000027/* HP-UX requires that this be included to pick up TIOCGPGRP and friends */
28#ifdef HAVE_SYS_BSDTTY_H
29#include <sys/bsdtty.h>
30#endif
Fred Drake87068f12001-05-11 16:14:17 +000031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000032PyDoc_STRVAR(termios__doc__,
33"This module provides an interface to the Posix calls for tty I/O control.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000034For a complete description of these calls, see the Posix or Unix manual\n\
35pages. It is only available for those Unix versions that support Posix\n\
36termios style tty I/O control.\n\
37\n\
38All functions in this module take a file descriptor fd as their first\n\
39argument. This can be an integer file descriptor, such as returned by\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000040sys.stdin.fileno(), or a file object, such as sys.stdin itself.");
Guido van Rossum9adae8e1994-09-12 10:41:22 +000041
Dino Viehlandbd0c7a12019-09-10 11:33:30 +010042typedef struct {
43 PyObject *TermiosError;
44} termiosmodulestate;
Hai Shif707d942020-03-16 21:15:01 +080045
46static inline termiosmodulestate*
47get_termios_state(PyObject *module)
48{
49 void *state = PyModule_GetState(module);
50 assert(state != NULL);
51 return (termiosmodulestate *)state;
52}
53
Fred Drakeb638aaf2001-05-07 17:55:35 +000054static int fdconv(PyObject* obj, void* p)
55{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000056 int fd;
Fred Drakeb638aaf2001-05-07 17:55:35 +000057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000058 fd = PyObject_AsFileDescriptor(obj);
59 if (fd >= 0) {
60 *(int*)p = fd;
61 return 1;
62 }
63 return 0;
Fred Drakeb638aaf2001-05-07 17:55:35 +000064}
Guido van Rossum9adae8e1994-09-12 10:41:22 +000065
Dino Viehlandbd0c7a12019-09-10 11:33:30 +010066static struct PyModuleDef termiosmodule;
67
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000068PyDoc_STRVAR(termios_tcgetattr__doc__,
69"tcgetattr(fd) -> list_of_attrs\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +000070\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +000071Get the tty attributes for file descriptor fd, as follows:\n\
72[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
73of the tty special characters (each a string of length 1, except the items\n\
74with indices VMIN and VTIME, which are integers when these fields are\n\
75defined). The interpretation of the flags and the speeds as well as the\n\
76indexing in the cc array must be done using the symbolic constants defined\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000077in this module.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +000078
Guido van Rossum9adae8e1994-09-12 10:41:22 +000079static PyObject *
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -050080termios_tcgetattr(PyObject *module, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +000081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 int fd;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -050083 if (!PyArg_ParseTuple(args, "O&:tcgetattr",
84 fdconv, (void*)&fd)) {
85 return NULL;
86 }
87
88 termiosmodulestate *state = PyModule_GetState(module);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 struct termios mode;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -050090 if (tcgetattr(fd, &mode) == -1) {
91 return PyErr_SetFromErrno(state->TermiosError);
92 }
93
94 speed_t ispeed = cfgetispeed(&mode);
95 speed_t ospeed = cfgetospeed(&mode);
96
97 PyObject *cc = PyList_New(NCCS);
98 if (cc == NULL) {
99 return NULL;
100 }
101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 PyObject *v;
103 int i;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 for (i = 0; i < NCCS; i++) {
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500105 char ch = (char)mode.c_cc[i];
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 v = PyBytes_FromStringAndSize(&ch, 1);
107 if (v == NULL)
108 goto err;
109 PyList_SetItem(cc, i, v);
110 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000111
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000112 /* Convert the MIN and TIME slots to integer. On some systems, the
113 MIN and TIME slots are the same as the EOF and EOL slots. So we
114 only do this in noncanonical input mode. */
115 if ((mode.c_lflag & ICANON) == 0) {
116 v = PyLong_FromLong((long)mode.c_cc[VMIN]);
117 if (v == NULL)
118 goto err;
119 PyList_SetItem(cc, VMIN, v);
120 v = PyLong_FromLong((long)mode.c_cc[VTIME]);
121 if (v == NULL)
122 goto err;
123 PyList_SetItem(cc, VTIME, v);
124 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 if (!(v = PyList_New(7)))
127 goto err;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000128
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000129 PyList_SetItem(v, 0, PyLong_FromLong((long)mode.c_iflag));
130 PyList_SetItem(v, 1, PyLong_FromLong((long)mode.c_oflag));
131 PyList_SetItem(v, 2, PyLong_FromLong((long)mode.c_cflag));
132 PyList_SetItem(v, 3, PyLong_FromLong((long)mode.c_lflag));
133 PyList_SetItem(v, 4, PyLong_FromLong((long)ispeed));
134 PyList_SetItem(v, 5, PyLong_FromLong((long)ospeed));
Zackery Spytz53835e92018-10-28 22:55:20 -0600135 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 Py_DECREF(v);
137 goto err;
138 }
Zackery Spytz53835e92018-10-28 22:55:20 -0600139 PyList_SetItem(v, 6, cc);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000140 return v;
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000141 err:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000142 Py_DECREF(cc);
143 return NULL;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000144}
145
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000146PyDoc_STRVAR(termios_tcsetattr__doc__,
147"tcsetattr(fd, when, attributes) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000148\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000149Set the tty attributes for file descriptor fd.\n\
150The attributes to be set are taken from the attributes argument, which\n\
151is a list like the one returned by tcgetattr(). The when argument\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000152determines when the attributes are changed: termios.TCSANOW to\n\
153change immediately, termios.TCSADRAIN to change after transmitting all\n\
154queued output, or termios.TCSAFLUSH to change after transmitting all\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000155queued output and discarding all queued input. ");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000156
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000157static PyObject *
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500158termios_tcsetattr(PyObject *module, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 int fd, when;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500161 PyObject *term;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 if (!PyArg_ParseTuple(args, "O&iO:tcsetattr",
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500163 fdconv, &fd, &when, &term)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 return NULL;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500165 }
166
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000167 if (!PyList_Check(term) || PyList_Size(term) != 7) {
168 PyErr_SetString(PyExc_TypeError,
169 "tcsetattr, arg 3: must be 7 element list");
170 return NULL;
171 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 /* Get the old mode, in case there are any hidden fields... */
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500174 termiosmodulestate *state = PyModule_GetState(module);
175 struct termios mode;
176 if (tcgetattr(fd, &mode) == -1) {
Dino Viehlandbd0c7a12019-09-10 11:33:30 +0100177 return PyErr_SetFromErrno(state->TermiosError);
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500178 }
179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0));
181 mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1));
182 mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2));
183 mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3));
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500184 speed_t ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4));
185 speed_t ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5));
186 PyObject *cc = PyList_GetItem(term, 6);
187 if (PyErr_Occurred()) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 return NULL;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500189 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000190
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
192 PyErr_Format(PyExc_TypeError,
193 "tcsetattr: attributes[6] must be %d element list",
194 NCCS);
195 return NULL;
196 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000197
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500198 int i;
199 PyObject *v;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 for (i = 0; i < NCCS; i++) {
201 v = PyList_GetItem(cc, i);
Barry Warsaw5709dcf1997-01-10 18:42:18 +0000202
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 if (PyBytes_Check(v) && PyBytes_Size(v) == 1)
204 mode.c_cc[i] = (cc_t) * PyBytes_AsString(v);
205 else if (PyLong_Check(v))
206 mode.c_cc[i] = (cc_t) PyLong_AsLong(v);
207 else {
208 PyErr_SetString(PyExc_TypeError,
Fred Drakeb638aaf2001-05-07 17:55:35 +0000209 "tcsetattr: elements of attributes must be characters or integers");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 return NULL;
211 }
212 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
Dino Viehlandbd0c7a12019-09-10 11:33:30 +0100215 return PyErr_SetFromErrno(state->TermiosError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
Dino Viehlandbd0c7a12019-09-10 11:33:30 +0100217 return PyErr_SetFromErrno(state->TermiosError);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (tcsetattr(fd, when, &mode) == -1)
Dino Viehlandbd0c7a12019-09-10 11:33:30 +0100219 return PyErr_SetFromErrno(state->TermiosError);
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000220
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200221 Py_RETURN_NONE;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000222}
223
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000224PyDoc_STRVAR(termios_tcsendbreak__doc__,
225"tcsendbreak(fd, duration) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000226\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000227Send a break on file descriptor fd.\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000228A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000229has a system dependent meaning.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000230
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000231static PyObject *
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500232termios_tcsendbreak(PyObject *module, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 int fd, duration;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 if (!PyArg_ParseTuple(args, "O&i:tcsendbreak",
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500236 fdconv, &fd, &duration)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 return NULL;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500238 }
239
240 termiosmodulestate *state = PyModule_GetState(module);
241 if (tcsendbreak(fd, duration) == -1) {
242 return PyErr_SetFromErrno(state->TermiosError);
243 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000244
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200245 Py_RETURN_NONE;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000246}
247
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000248PyDoc_STRVAR(termios_tcdrain__doc__,
249"tcdrain(fd) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000250\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000251Wait until all output written to file descriptor fd has been transmitted.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000252
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000253static PyObject *
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500254termios_tcdrain(PyObject *module, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000255{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 int fd;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 if (!PyArg_ParseTuple(args, "O&:tcdrain",
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500258 fdconv, &fd)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 return NULL;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500260 }
261
262 termiosmodulestate *state = PyModule_GetState(module);
263 if (tcdrain(fd) == -1) {
264 return PyErr_SetFromErrno(state->TermiosError);
265 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000266
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200267 Py_RETURN_NONE;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000268}
269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000270PyDoc_STRVAR(termios_tcflush__doc__,
271"tcflush(fd, queue) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000272\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000273Discard queued data on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000274The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
275queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000276both queues. ");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000277
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000278static PyObject *
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500279termios_tcflush(PyObject *module, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 int fd, queue;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 if (!PyArg_ParseTuple(args, "O&i:tcflush",
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500283 fdconv, &fd, &queue)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000284 return NULL;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500285 }
286
287 termiosmodulestate *state = PyModule_GetState(module);
288 if (tcflush(fd, queue) == -1) {
289 return PyErr_SetFromErrno(state->TermiosError);
290 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000291
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200292 Py_RETURN_NONE;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000293}
294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000295PyDoc_STRVAR(termios_tcflow__doc__,
296"tcflow(fd, action) -> None\n\
Fred Drakeb638aaf2001-05-07 17:55:35 +0000297\n\
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000298Suspend or resume input or output on file descriptor fd.\n\
Fred Drake29fd0312001-04-09 19:32:52 +0000299The action argument can be termios.TCOOFF to suspend output,\n\
300termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000301or termios.TCION to restart input.");
Guido van Rossum1aca4d81998-03-03 22:10:18 +0000302
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000303static PyObject *
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500304termios_tcflow(PyObject *module, PyObject *args)
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000305{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 int fd, action;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 if (!PyArg_ParseTuple(args, "O&i:tcflow",
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500308 fdconv, &fd, &action)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 return NULL;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -0500310 }
311
312 termiosmodulestate *state = PyModule_GetState(module);
313 if (tcflow(fd, action) == -1) {
314 return PyErr_SetFromErrno(state->TermiosError);
315 }
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000316
Serhiy Storchaka228b12e2017-01-23 09:47:21 +0200317 Py_RETURN_NONE;
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000318}
319
320static PyMethodDef termios_methods[] =
321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000322 {"tcgetattr", termios_tcgetattr,
323 METH_VARARGS, termios_tcgetattr__doc__},
324 {"tcsetattr", termios_tcsetattr,
325 METH_VARARGS, termios_tcsetattr__doc__},
326 {"tcsendbreak", termios_tcsendbreak,
327 METH_VARARGS, termios_tcsendbreak__doc__},
328 {"tcdrain", termios_tcdrain,
329 METH_VARARGS, termios_tcdrain__doc__},
330 {"tcflush", termios_tcflush,
331 METH_VARARGS, termios_tcflush__doc__},
332 {"tcflow", termios_tcflow,
333 METH_VARARGS, termios_tcflow__doc__},
334 {NULL, NULL}
Guido van Rossum9adae8e1994-09-12 10:41:22 +0000335};
336
Fred Drakedf48d142001-02-27 21:22:39 +0000337
Fred Drake9ef7fa82001-03-01 21:54:49 +0000338#if defined(VSWTCH) && !defined(VSWTC)
339#define VSWTC VSWTCH
340#endif
341
342#if defined(VSWTC) && !defined(VSWTCH)
343#define VSWTCH VSWTC
344#endif
345
Fred Drakedf48d142001-02-27 21:22:39 +0000346static struct constant {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000347 char *name;
348 long value;
Fred Drakedf48d142001-02-27 21:22:39 +0000349} termios_constants[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 /* cfgetospeed(), cfsetospeed() constants */
351 {"B0", B0},
352 {"B50", B50},
353 {"B75", B75},
354 {"B110", B110},
355 {"B134", B134},
356 {"B150", B150},
357 {"B200", B200},
358 {"B300", B300},
359 {"B600", B600},
360 {"B1200", B1200},
361 {"B1800", B1800},
362 {"B2400", B2400},
363 {"B4800", B4800},
364 {"B9600", B9600},
365 {"B19200", B19200},
366 {"B38400", B38400},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000367#ifdef B57600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 {"B57600", B57600},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000369#endif
370#ifdef B115200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 {"B115200", B115200},
Guido van Rossum2242f2f2001-04-11 20:58:20 +0000372#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000373#ifdef B230400
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000374 {"B230400", B230400},
Fred Drakeabb379e2001-03-01 03:28:08 +0000375#endif
Antoine Pitroua78f74c2010-11-20 20:03:08 +0000376#ifdef B460800
377 {"B460800", B460800},
378#endif
379#ifdef B500000
380 {"B500000", B500000},
381#endif
382#ifdef B576000
383 {"B576000", B576000},
384#endif
385#ifdef B921600
386 {"B921600", B921600},
387#endif
388#ifdef B1000000
389 {"B1000000", B1000000},
390#endif
391#ifdef B1152000
392 {"B1152000", B1152000},
393#endif
394#ifdef B1500000
395 {"B1500000", B1500000},
396#endif
397#ifdef B2000000
398 {"B2000000", B2000000},
399#endif
400#ifdef B2500000
401 {"B2500000", B2500000},
402#endif
403#ifdef B3000000
404 {"B3000000", B3000000},
405#endif
406#ifdef B3500000
407 {"B3500000", B3500000},
408#endif
409#ifdef B4000000
410 {"B4000000", B4000000},
411#endif
412
Fred Drake9ef7fa82001-03-01 21:54:49 +0000413#ifdef CBAUDEX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000414 {"CBAUDEX", CBAUDEX},
Fred Drake9ef7fa82001-03-01 21:54:49 +0000415#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 /* tcsetattr() constants */
418 {"TCSANOW", TCSANOW},
419 {"TCSADRAIN", TCSADRAIN},
420 {"TCSAFLUSH", TCSAFLUSH},
Gregory P. Smithcafc22f2009-11-01 19:24:18 +0000421#ifdef TCSASOFT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000422 {"TCSASOFT", TCSASOFT},
Gregory P. Smithcafc22f2009-11-01 19:24:18 +0000423#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000425 /* tcflush() constants */
426 {"TCIFLUSH", TCIFLUSH},
427 {"TCOFLUSH", TCOFLUSH},
428 {"TCIOFLUSH", TCIOFLUSH},
Fred Drakedf48d142001-02-27 21:22:39 +0000429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 /* tcflow() constants */
431 {"TCOOFF", TCOOFF},
432 {"TCOON", TCOON},
433 {"TCIOFF", TCIOFF},
434 {"TCION", TCION},
Fred Drakedf48d142001-02-27 21:22:39 +0000435
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000436 /* struct termios.c_iflag constants */
437 {"IGNBRK", IGNBRK},
438 {"BRKINT", BRKINT},
439 {"IGNPAR", IGNPAR},
440 {"PARMRK", PARMRK},
441 {"INPCK", INPCK},
442 {"ISTRIP", ISTRIP},
443 {"INLCR", INLCR},
444 {"IGNCR", IGNCR},
445 {"ICRNL", ICRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000446#ifdef IUCLC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 {"IUCLC", IUCLC},
Fred Draked85556c2001-03-03 18:08:52 +0000448#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 {"IXON", IXON},
450 {"IXANY", IXANY},
451 {"IXOFF", IXOFF},
Thomas Wouters2b305242001-06-15 12:05:44 +0000452#ifdef IMAXBEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 {"IMAXBEL", IMAXBEL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000454#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000455
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000456 /* struct termios.c_oflag constants */
457 {"OPOST", OPOST},
Fred Draked85556c2001-03-03 18:08:52 +0000458#ifdef OLCUC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 {"OLCUC", OLCUC},
Fred Draked85556c2001-03-03 18:08:52 +0000460#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000461#ifdef ONLCR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 {"ONLCR", ONLCR},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000463#endif
Fred Draked85556c2001-03-03 18:08:52 +0000464#ifdef OCRNL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000465 {"OCRNL", OCRNL},
Fred Draked85556c2001-03-03 18:08:52 +0000466#endif
467#ifdef ONOCR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 {"ONOCR", ONOCR},
Fred Draked85556c2001-03-03 18:08:52 +0000469#endif
470#ifdef ONLRET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 {"ONLRET", ONLRET},
Fred Draked85556c2001-03-03 18:08:52 +0000472#endif
473#ifdef OFILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 {"OFILL", OFILL},
Fred Draked85556c2001-03-03 18:08:52 +0000475#endif
476#ifdef OFDEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 {"OFDEL", OFDEL},
Fred Draked85556c2001-03-03 18:08:52 +0000478#endif
479#ifdef NLDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 {"NLDLY", NLDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000481#endif
482#ifdef CRDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 {"CRDLY", CRDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000484#endif
485#ifdef TABDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 {"TABDLY", TABDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000487#endif
488#ifdef BSDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 {"BSDLY", BSDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000490#endif
491#ifdef VTDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 {"VTDLY", VTDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000493#endif
494#ifdef FFDLY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 {"FFDLY", FFDLY},
Fred Draked85556c2001-03-03 18:08:52 +0000496#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 /* struct termios.c_oflag-related values (delay mask) */
Fred Draked85556c2001-03-03 18:08:52 +0000499#ifdef NL0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000500 {"NL0", NL0},
Fred Draked85556c2001-03-03 18:08:52 +0000501#endif
502#ifdef NL1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 {"NL1", NL1},
Fred Draked85556c2001-03-03 18:08:52 +0000504#endif
505#ifdef CR0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 {"CR0", CR0},
Fred Draked85556c2001-03-03 18:08:52 +0000507#endif
508#ifdef CR1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 {"CR1", CR1},
Fred Draked85556c2001-03-03 18:08:52 +0000510#endif
511#ifdef CR2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000512 {"CR2", CR2},
Fred Draked85556c2001-03-03 18:08:52 +0000513#endif
514#ifdef CR3
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 {"CR3", CR3},
Fred Draked85556c2001-03-03 18:08:52 +0000516#endif
517#ifdef TAB0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 {"TAB0", TAB0},
Fred Draked85556c2001-03-03 18:08:52 +0000519#endif
520#ifdef TAB1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 {"TAB1", TAB1},
Fred Draked85556c2001-03-03 18:08:52 +0000522#endif
523#ifdef TAB2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 {"TAB2", TAB2},
Fred Draked85556c2001-03-03 18:08:52 +0000525#endif
526#ifdef TAB3
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 {"TAB3", TAB3},
Fred Draked85556c2001-03-03 18:08:52 +0000528#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000529#ifdef XTABS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000530 {"XTABS", XTABS},
Fred Drakededbebf2001-03-02 06:50:58 +0000531#endif
Fred Draked85556c2001-03-03 18:08:52 +0000532#ifdef BS0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 {"BS0", BS0},
Fred Draked85556c2001-03-03 18:08:52 +0000534#endif
535#ifdef BS1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 {"BS1", BS1},
Fred Draked85556c2001-03-03 18:08:52 +0000537#endif
538#ifdef VT0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 {"VT0", VT0},
Fred Draked85556c2001-03-03 18:08:52 +0000540#endif
541#ifdef VT1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000542 {"VT1", VT1},
Fred Draked85556c2001-03-03 18:08:52 +0000543#endif
544#ifdef FF0
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 {"FF0", FF0},
Fred Draked85556c2001-03-03 18:08:52 +0000546#endif
547#ifdef FF1
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 {"FF1", FF1},
Fred Draked85556c2001-03-03 18:08:52 +0000549#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* struct termios.c_cflag constants */
552 {"CSIZE", CSIZE},
553 {"CSTOPB", CSTOPB},
554 {"CREAD", CREAD},
555 {"PARENB", PARENB},
556 {"PARODD", PARODD},
557 {"HUPCL", HUPCL},
558 {"CLOCAL", CLOCAL},
Fred Drakeabb379e2001-03-01 03:28:08 +0000559#ifdef CIBAUD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000560 {"CIBAUD", CIBAUD},
Fred Drakeabb379e2001-03-01 03:28:08 +0000561#endif
Fred Drakededbebf2001-03-02 06:50:58 +0000562#ifdef CRTSCTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 {"CRTSCTS", (long)CRTSCTS},
Fred Drakededbebf2001-03-02 06:50:58 +0000564#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 /* struct termios.c_cflag-related values (character size) */
567 {"CS5", CS5},
568 {"CS6", CS6},
569 {"CS7", CS7},
570 {"CS8", CS8},
Fred Drakedf48d142001-02-27 21:22:39 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 /* struct termios.c_lflag constants */
573 {"ISIG", ISIG},
574 {"ICANON", ICANON},
Fred Drakeabb379e2001-03-01 03:28:08 +0000575#ifdef XCASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 {"XCASE", XCASE},
Fred Drakeabb379e2001-03-01 03:28:08 +0000577#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000578 {"ECHO", ECHO},
579 {"ECHOE", ECHOE},
580 {"ECHOK", ECHOK},
581 {"ECHONL", ECHONL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000582#ifdef ECHOCTL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 {"ECHOCTL", ECHOCTL},
Thomas Wouters2b305242001-06-15 12:05:44 +0000584#endif
Fred Drakeabb379e2001-03-01 03:28:08 +0000585#ifdef ECHOPRT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 {"ECHOPRT", ECHOPRT},
Fred Drakeabb379e2001-03-01 03:28:08 +0000587#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000588#ifdef ECHOKE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 {"ECHOKE", ECHOKE},
Thomas Wouters2b305242001-06-15 12:05:44 +0000590#endif
591#ifdef FLUSHO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000592 {"FLUSHO", FLUSHO},
Thomas Wouters2b305242001-06-15 12:05:44 +0000593#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000594 {"NOFLSH", NOFLSH},
595 {"TOSTOP", TOSTOP},
Fred Drakeabb379e2001-03-01 03:28:08 +0000596#ifdef PENDIN
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000597 {"PENDIN", PENDIN},
Fred Drakeabb379e2001-03-01 03:28:08 +0000598#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 {"IEXTEN", IEXTEN},
Fred Drakedf48d142001-02-27 21:22:39 +0000600
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 /* indexes into the control chars array returned by tcgetattr() */
602 {"VINTR", VINTR},
603 {"VQUIT", VQUIT},
604 {"VERASE", VERASE},
605 {"VKILL", VKILL},
606 {"VEOF", VEOF},
607 {"VTIME", VTIME},
608 {"VMIN", VMIN},
Fred Drakededbebf2001-03-02 06:50:58 +0000609#ifdef VSWTC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000610 /* The #defines above ensure that if either is defined, both are,
611 * but both may be omitted by the system headers. ;-( */
612 {"VSWTC", VSWTC},
613 {"VSWTCH", VSWTCH},
Fred Drakededbebf2001-03-02 06:50:58 +0000614#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 {"VSTART", VSTART},
616 {"VSTOP", VSTOP},
617 {"VSUSP", VSUSP},
618 {"VEOL", VEOL},
Fred Draked0b625d2001-05-22 15:44:15 +0000619#ifdef VREPRINT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 {"VREPRINT", VREPRINT},
Fred Drake87068f12001-05-11 16:14:17 +0000621#endif
Fred Draked0b625d2001-05-22 15:44:15 +0000622#ifdef VDISCARD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 {"VDISCARD", VDISCARD},
Fred Drake87068f12001-05-11 16:14:17 +0000624#endif
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000625#ifdef VWERASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 {"VWERASE", VWERASE},
Thomas Wouters819bb2c2001-06-11 15:25:16 +0000627#endif
Thomas Wouters2b305242001-06-15 12:05:44 +0000628#ifdef VLNEXT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 {"VLNEXT", VLNEXT},
Thomas Wouters2b305242001-06-15 12:05:44 +0000630#endif
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000631#ifdef VEOL2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000632 {"VEOL2", VEOL2},
Andrew MacIntyre7bf68332002-03-03 02:59:16 +0000633#endif
Fred Drakedf48d142001-02-27 21:22:39 +0000634
Fred Drake55a00342001-03-26 17:14:02 +0000635
636#ifdef B460800
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 {"B460800", B460800},
Fred Drake55a00342001-03-26 17:14:02 +0000638#endif
Anthony Shaw7dc72b82020-01-04 23:56:31 +1100639#ifdef B500000
640 {"B500000", B500000},
641#endif
642#ifdef B576000
643 { "B576000", B576000},
644#endif
645#ifdef B921600
646 { "B921600", B921600},
647#endif
648#ifdef B1000000
649 { "B1000000", B1000000},
650#endif
651#ifdef B1152000
652 { "B1152000", B1152000},
653#endif
654#ifdef B1500000
655 { "B1500000", B1500000},
656#endif
657#ifdef B2000000
658 { "B2000000", B2000000},
659#endif
660#ifdef B2500000
661 { "B2500000", B2500000},
662#endif
663#ifdef B3000000
664 { "B3000000", B3000000},
665#endif
666#ifdef B3500000
667 { "B3500000", B3500000},
668#endif
669#ifdef B4000000
670 { "B4000000", B4000000},
671#endif
Fred Drake55a00342001-03-26 17:14:02 +0000672#ifdef CBAUD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 {"CBAUD", CBAUD},
Fred Drake55a00342001-03-26 17:14:02 +0000674#endif
675#ifdef CDEL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 {"CDEL", CDEL},
Fred Drake55a00342001-03-26 17:14:02 +0000677#endif
678#ifdef CDSUSP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 {"CDSUSP", CDSUSP},
Fred Drake55a00342001-03-26 17:14:02 +0000680#endif
681#ifdef CEOF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 {"CEOF", CEOF},
Fred Drake55a00342001-03-26 17:14:02 +0000683#endif
684#ifdef CEOL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 {"CEOL", CEOL},
Fred Drake55a00342001-03-26 17:14:02 +0000686#endif
687#ifdef CEOL2
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 {"CEOL2", CEOL2},
Fred Drake55a00342001-03-26 17:14:02 +0000689#endif
690#ifdef CEOT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 {"CEOT", CEOT},
Fred Drake55a00342001-03-26 17:14:02 +0000692#endif
693#ifdef CERASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 {"CERASE", CERASE},
Fred Drake55a00342001-03-26 17:14:02 +0000695#endif
696#ifdef CESC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 {"CESC", CESC},
Fred Drake55a00342001-03-26 17:14:02 +0000698#endif
699#ifdef CFLUSH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 {"CFLUSH", CFLUSH},
Fred Drake55a00342001-03-26 17:14:02 +0000701#endif
702#ifdef CINTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703 {"CINTR", CINTR},
Fred Drake55a00342001-03-26 17:14:02 +0000704#endif
705#ifdef CKILL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 {"CKILL", CKILL},
Fred Drake55a00342001-03-26 17:14:02 +0000707#endif
708#ifdef CLNEXT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000709 {"CLNEXT", CLNEXT},
Fred Drake55a00342001-03-26 17:14:02 +0000710#endif
711#ifdef CNUL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 {"CNUL", CNUL},
Fred Drake55a00342001-03-26 17:14:02 +0000713#endif
714#ifdef COMMON
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 {"COMMON", COMMON},
Fred Drake55a00342001-03-26 17:14:02 +0000716#endif
717#ifdef CQUIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 {"CQUIT", CQUIT},
Fred Drake55a00342001-03-26 17:14:02 +0000719#endif
720#ifdef CRPRNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000721 {"CRPRNT", CRPRNT},
Fred Drake55a00342001-03-26 17:14:02 +0000722#endif
723#ifdef CSTART
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000724 {"CSTART", CSTART},
Fred Drake55a00342001-03-26 17:14:02 +0000725#endif
726#ifdef CSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000727 {"CSTOP", CSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000728#endif
729#ifdef CSUSP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 {"CSUSP", CSUSP},
Fred Drake55a00342001-03-26 17:14:02 +0000731#endif
732#ifdef CSWTCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000733 {"CSWTCH", CSWTCH},
Fred Drake55a00342001-03-26 17:14:02 +0000734#endif
735#ifdef CWERASE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000736 {"CWERASE", CWERASE},
Fred Drake55a00342001-03-26 17:14:02 +0000737#endif
738#ifdef EXTA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 {"EXTA", EXTA},
Fred Drake55a00342001-03-26 17:14:02 +0000740#endif
741#ifdef EXTB
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000742 {"EXTB", EXTB},
Fred Drake55a00342001-03-26 17:14:02 +0000743#endif
744#ifdef FIOASYNC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 {"FIOASYNC", FIOASYNC},
Fred Drake55a00342001-03-26 17:14:02 +0000746#endif
747#ifdef FIOCLEX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000748 {"FIOCLEX", FIOCLEX},
Fred Drake55a00342001-03-26 17:14:02 +0000749#endif
750#ifdef FIONBIO
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000751 {"FIONBIO", FIONBIO},
Fred Drake55a00342001-03-26 17:14:02 +0000752#endif
753#ifdef FIONCLEX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000754 {"FIONCLEX", FIONCLEX},
Fred Drake55a00342001-03-26 17:14:02 +0000755#endif
756#ifdef FIONREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 {"FIONREAD", FIONREAD},
Fred Drake55a00342001-03-26 17:14:02 +0000758#endif
759#ifdef IBSHIFT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 {"IBSHIFT", IBSHIFT},
Fred Drake55a00342001-03-26 17:14:02 +0000761#endif
762#ifdef INIT_C_CC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000763 {"INIT_C_CC", INIT_C_CC},
Fred Drake55a00342001-03-26 17:14:02 +0000764#endif
765#ifdef IOCSIZE_MASK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 {"IOCSIZE_MASK", IOCSIZE_MASK},
Fred Drake55a00342001-03-26 17:14:02 +0000767#endif
768#ifdef IOCSIZE_SHIFT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 {"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
Fred Drake55a00342001-03-26 17:14:02 +0000770#endif
771#ifdef NCC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 {"NCC", NCC},
Fred Drake55a00342001-03-26 17:14:02 +0000773#endif
774#ifdef NCCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000775 {"NCCS", NCCS},
Fred Drake55a00342001-03-26 17:14:02 +0000776#endif
777#ifdef NSWTCH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 {"NSWTCH", NSWTCH},
Fred Drake55a00342001-03-26 17:14:02 +0000779#endif
780#ifdef N_MOUSE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 {"N_MOUSE", N_MOUSE},
Fred Drake55a00342001-03-26 17:14:02 +0000782#endif
783#ifdef N_PPP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000784 {"N_PPP", N_PPP},
Fred Drake55a00342001-03-26 17:14:02 +0000785#endif
786#ifdef N_SLIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 {"N_SLIP", N_SLIP},
Fred Drake55a00342001-03-26 17:14:02 +0000788#endif
789#ifdef N_STRIP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 {"N_STRIP", N_STRIP},
Fred Drake55a00342001-03-26 17:14:02 +0000791#endif
792#ifdef N_TTY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 {"N_TTY", N_TTY},
Fred Drake55a00342001-03-26 17:14:02 +0000794#endif
795#ifdef TCFLSH
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 {"TCFLSH", TCFLSH},
Fred Drake55a00342001-03-26 17:14:02 +0000797#endif
798#ifdef TCGETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000799 {"TCGETA", TCGETA},
Fred Drake55a00342001-03-26 17:14:02 +0000800#endif
801#ifdef TCGETS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802 {"TCGETS", TCGETS},
Fred Drake55a00342001-03-26 17:14:02 +0000803#endif
804#ifdef TCSBRK
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000805 {"TCSBRK", TCSBRK},
Fred Drake55a00342001-03-26 17:14:02 +0000806#endif
807#ifdef TCSBRKP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000808 {"TCSBRKP", TCSBRKP},
Fred Drake55a00342001-03-26 17:14:02 +0000809#endif
810#ifdef TCSETA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000811 {"TCSETA", TCSETA},
Fred Drake55a00342001-03-26 17:14:02 +0000812#endif
813#ifdef TCSETAF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000814 {"TCSETAF", TCSETAF},
Fred Drake55a00342001-03-26 17:14:02 +0000815#endif
816#ifdef TCSETAW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000817 {"TCSETAW", TCSETAW},
Fred Drake55a00342001-03-26 17:14:02 +0000818#endif
819#ifdef TCSETS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 {"TCSETS", TCSETS},
Fred Drake55a00342001-03-26 17:14:02 +0000821#endif
822#ifdef TCSETSF
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000823 {"TCSETSF", TCSETSF},
Fred Drake55a00342001-03-26 17:14:02 +0000824#endif
825#ifdef TCSETSW
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000826 {"TCSETSW", TCSETSW},
Fred Drake55a00342001-03-26 17:14:02 +0000827#endif
828#ifdef TCXONC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000829 {"TCXONC", TCXONC},
Fred Drake55a00342001-03-26 17:14:02 +0000830#endif
831#ifdef TIOCCONS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 {"TIOCCONS", TIOCCONS},
Fred Drake55a00342001-03-26 17:14:02 +0000833#endif
834#ifdef TIOCEXCL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 {"TIOCEXCL", TIOCEXCL},
Fred Drake55a00342001-03-26 17:14:02 +0000836#endif
837#ifdef TIOCGETD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 {"TIOCGETD", TIOCGETD},
Fred Drake55a00342001-03-26 17:14:02 +0000839#endif
840#ifdef TIOCGICOUNT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 {"TIOCGICOUNT", TIOCGICOUNT},
Fred Drake55a00342001-03-26 17:14:02 +0000842#endif
843#ifdef TIOCGLCKTRMIOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
Fred Drake55a00342001-03-26 17:14:02 +0000845#endif
846#ifdef TIOCGPGRP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 {"TIOCGPGRP", TIOCGPGRP},
Fred Drake55a00342001-03-26 17:14:02 +0000848#endif
849#ifdef TIOCGSERIAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 {"TIOCGSERIAL", TIOCGSERIAL},
Fred Drake55a00342001-03-26 17:14:02 +0000851#endif
852#ifdef TIOCGSOFTCAR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 {"TIOCGSOFTCAR", TIOCGSOFTCAR},
Fred Drake55a00342001-03-26 17:14:02 +0000854#endif
855#ifdef TIOCGWINSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000856 {"TIOCGWINSZ", TIOCGWINSZ},
Fred Drake55a00342001-03-26 17:14:02 +0000857#endif
858#ifdef TIOCINQ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000859 {"TIOCINQ", TIOCINQ},
Fred Drake55a00342001-03-26 17:14:02 +0000860#endif
861#ifdef TIOCLINUX
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 {"TIOCLINUX", TIOCLINUX},
Fred Drake55a00342001-03-26 17:14:02 +0000863#endif
864#ifdef TIOCMBIC
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000865 {"TIOCMBIC", TIOCMBIC},
Fred Drake55a00342001-03-26 17:14:02 +0000866#endif
867#ifdef TIOCMBIS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000868 {"TIOCMBIS", TIOCMBIS},
Fred Drake55a00342001-03-26 17:14:02 +0000869#endif
870#ifdef TIOCMGET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 {"TIOCMGET", TIOCMGET},
Fred Drake55a00342001-03-26 17:14:02 +0000872#endif
873#ifdef TIOCMIWAIT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 {"TIOCMIWAIT", TIOCMIWAIT},
Fred Drake55a00342001-03-26 17:14:02 +0000875#endif
876#ifdef TIOCMSET
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 {"TIOCMSET", TIOCMSET},
Fred Drake55a00342001-03-26 17:14:02 +0000878#endif
879#ifdef TIOCM_CAR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000880 {"TIOCM_CAR", TIOCM_CAR},
Fred Drake55a00342001-03-26 17:14:02 +0000881#endif
882#ifdef TIOCM_CD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000883 {"TIOCM_CD", TIOCM_CD},
Fred Drake55a00342001-03-26 17:14:02 +0000884#endif
885#ifdef TIOCM_CTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000886 {"TIOCM_CTS", TIOCM_CTS},
Fred Drake55a00342001-03-26 17:14:02 +0000887#endif
888#ifdef TIOCM_DSR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000889 {"TIOCM_DSR", TIOCM_DSR},
Fred Drake55a00342001-03-26 17:14:02 +0000890#endif
891#ifdef TIOCM_DTR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000892 {"TIOCM_DTR", TIOCM_DTR},
Fred Drake55a00342001-03-26 17:14:02 +0000893#endif
894#ifdef TIOCM_LE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000895 {"TIOCM_LE", TIOCM_LE},
Fred Drake55a00342001-03-26 17:14:02 +0000896#endif
897#ifdef TIOCM_RI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 {"TIOCM_RI", TIOCM_RI},
Fred Drake55a00342001-03-26 17:14:02 +0000899#endif
900#ifdef TIOCM_RNG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000901 {"TIOCM_RNG", TIOCM_RNG},
Fred Drake55a00342001-03-26 17:14:02 +0000902#endif
903#ifdef TIOCM_RTS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000904 {"TIOCM_RTS", TIOCM_RTS},
Fred Drake55a00342001-03-26 17:14:02 +0000905#endif
906#ifdef TIOCM_SR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000907 {"TIOCM_SR", TIOCM_SR},
Fred Drake55a00342001-03-26 17:14:02 +0000908#endif
909#ifdef TIOCM_ST
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000910 {"TIOCM_ST", TIOCM_ST},
Fred Drake55a00342001-03-26 17:14:02 +0000911#endif
912#ifdef TIOCNOTTY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000913 {"TIOCNOTTY", TIOCNOTTY},
Fred Drake55a00342001-03-26 17:14:02 +0000914#endif
915#ifdef TIOCNXCL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000916 {"TIOCNXCL", TIOCNXCL},
Fred Drake55a00342001-03-26 17:14:02 +0000917#endif
918#ifdef TIOCOUTQ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000919 {"TIOCOUTQ", TIOCOUTQ},
Fred Drake55a00342001-03-26 17:14:02 +0000920#endif
921#ifdef TIOCPKT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000922 {"TIOCPKT", TIOCPKT},
Fred Drake55a00342001-03-26 17:14:02 +0000923#endif
924#ifdef TIOCPKT_DATA
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000925 {"TIOCPKT_DATA", TIOCPKT_DATA},
Fred Drake55a00342001-03-26 17:14:02 +0000926#endif
927#ifdef TIOCPKT_DOSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000928 {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000929#endif
930#ifdef TIOCPKT_FLUSHREAD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000931 {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
Fred Drake55a00342001-03-26 17:14:02 +0000932#endif
933#ifdef TIOCPKT_FLUSHWRITE
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000934 {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
Fred Drake55a00342001-03-26 17:14:02 +0000935#endif
936#ifdef TIOCPKT_NOSTOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000937 {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
Fred Drake55a00342001-03-26 17:14:02 +0000938#endif
939#ifdef TIOCPKT_START
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000940 {"TIOCPKT_START", TIOCPKT_START},
Fred Drake55a00342001-03-26 17:14:02 +0000941#endif
942#ifdef TIOCPKT_STOP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000943 {"TIOCPKT_STOP", TIOCPKT_STOP},
Fred Drake55a00342001-03-26 17:14:02 +0000944#endif
945#ifdef TIOCSCTTY
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 {"TIOCSCTTY", TIOCSCTTY},
Fred Drake55a00342001-03-26 17:14:02 +0000947#endif
948#ifdef TIOCSERCONFIG
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000949 {"TIOCSERCONFIG", TIOCSERCONFIG},
Fred Drake55a00342001-03-26 17:14:02 +0000950#endif
951#ifdef TIOCSERGETLSR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000952 {"TIOCSERGETLSR", TIOCSERGETLSR},
Fred Drake55a00342001-03-26 17:14:02 +0000953#endif
954#ifdef TIOCSERGETMULTI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000955 {"TIOCSERGETMULTI", TIOCSERGETMULTI},
Fred Drake55a00342001-03-26 17:14:02 +0000956#endif
957#ifdef TIOCSERGSTRUCT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 {"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
Fred Drake55a00342001-03-26 17:14:02 +0000959#endif
960#ifdef TIOCSERGWILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000961 {"TIOCSERGWILD", TIOCSERGWILD},
Fred Drake55a00342001-03-26 17:14:02 +0000962#endif
963#ifdef TIOCSERSETMULTI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000964 {"TIOCSERSETMULTI", TIOCSERSETMULTI},
Fred Drake55a00342001-03-26 17:14:02 +0000965#endif
966#ifdef TIOCSERSWILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000967 {"TIOCSERSWILD", TIOCSERSWILD},
Fred Drake55a00342001-03-26 17:14:02 +0000968#endif
969#ifdef TIOCSER_TEMT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 {"TIOCSER_TEMT", TIOCSER_TEMT},
Fred Drake55a00342001-03-26 17:14:02 +0000971#endif
972#ifdef TIOCSETD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000973 {"TIOCSETD", TIOCSETD},
Fred Drake55a00342001-03-26 17:14:02 +0000974#endif
975#ifdef TIOCSLCKTRMIOS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
Fred Drake55a00342001-03-26 17:14:02 +0000977#endif
978#ifdef TIOCSPGRP
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 {"TIOCSPGRP", TIOCSPGRP},
Fred Drake55a00342001-03-26 17:14:02 +0000980#endif
981#ifdef TIOCSSERIAL
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000982 {"TIOCSSERIAL", TIOCSSERIAL},
Fred Drake55a00342001-03-26 17:14:02 +0000983#endif
984#ifdef TIOCSSOFTCAR
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000985 {"TIOCSSOFTCAR", TIOCSSOFTCAR},
Fred Drake55a00342001-03-26 17:14:02 +0000986#endif
987#ifdef TIOCSTI
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 {"TIOCSTI", TIOCSTI},
Fred Drake55a00342001-03-26 17:14:02 +0000989#endif
990#ifdef TIOCSWINSZ
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000991 {"TIOCSWINSZ", TIOCSWINSZ},
Fred Drake55a00342001-03-26 17:14:02 +0000992#endif
993#ifdef TIOCTTYGSTRUCT
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000994 {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
Fred Drake55a00342001-03-26 17:14:02 +0000995#endif
996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000997 /* sentinel */
998 {NULL, 0}
Fred Drakedf48d142001-02-27 21:22:39 +0000999};
1000
Dino Viehlandbd0c7a12019-09-10 11:33:30 +01001001static int termiosmodule_traverse(PyObject *m, visitproc visit, void *arg) {
Hai Shif707d942020-03-16 21:15:01 +08001002 Py_VISIT(get_termios_state(m)->TermiosError);
Dino Viehlandbd0c7a12019-09-10 11:33:30 +01001003 return 0;
1004}
1005
1006static int termiosmodule_clear(PyObject *m) {
Hai Shif707d942020-03-16 21:15:01 +08001007 Py_CLEAR(get_termios_state(m)->TermiosError);
Dino Viehlandbd0c7a12019-09-10 11:33:30 +01001008 return 0;
1009}
1010
1011static void termiosmodule_free(void *m) {
1012 termiosmodule_clear((PyObject *)m);
1013}
Fred Drakedf48d142001-02-27 21:22:39 +00001014
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -05001015static int
1016termios_exec(PyObject *mod)
Guido van Rossum9adae8e1994-09-12 10:41:22 +00001017{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001018 struct constant *constant = termios_constants;
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -05001019 termiosmodulestate *state = get_termios_state(mod);
Dino Viehlandbd0c7a12019-09-10 11:33:30 +01001020 state->TermiosError = PyErr_NewException("termios.error", NULL, NULL);
1021 if (state->TermiosError == NULL) {
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -05001022 return -1;
Dino Viehlandbd0c7a12019-09-10 11:33:30 +01001023 }
1024 Py_INCREF(state->TermiosError);
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -05001025 if (PyModule_AddObject(mod, "error", state->TermiosError) < 0) {
1026 Py_DECREF(state->TermiosError);
1027 return -1;
1028 }
Fred Drakedf48d142001-02-27 21:22:39 +00001029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001030 while (constant->name != NULL) {
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -05001031 if (PyModule_AddIntConstant(
1032 mod, constant->name, constant->value) < 0) {
1033 return -1;
1034 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001035 ++constant;
1036 }
Mohamed Koubaa15dcdb22020-09-08 03:59:15 -05001037 return 0;
1038}
1039
1040static PyModuleDef_Slot termios_slots[] = {
1041 {Py_mod_exec, termios_exec},
1042 {0, NULL}
1043};
1044
1045static struct PyModuleDef termiosmodule = {
1046 PyModuleDef_HEAD_INIT,
1047 .m_name = "termios",
1048 .m_doc = termios__doc__,
1049 .m_size = sizeof(termiosmodulestate),
1050 .m_methods = termios_methods,
1051 .m_slots = termios_slots,
1052 .m_traverse = termiosmodule_traverse,
1053 .m_clear = termiosmodule_clear,
1054 .m_free = termiosmodule_free,
1055};
1056
1057PyMODINIT_FUNC PyInit_termios(void)
1058{
1059 return PyModuleDef_Init(&termiosmodule);
Guido van Rossum9adae8e1994-09-12 10:41:22 +00001060}