17db96d56Sopenharmony_ci/* termios.c -- POSIX terminal I/O module implementation. */ 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci#include "Python.h" 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci/* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE 67db96d56Sopenharmony_ci is defined, so we define it here. */ 77db96d56Sopenharmony_ci#if defined(__sgi) 87db96d56Sopenharmony_ci#define CTRL(c) ((c)&037) 97db96d56Sopenharmony_ci#endif 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci#if defined(__sun) 127db96d56Sopenharmony_ci/* We could do better. Check issue-32660 */ 137db96d56Sopenharmony_ci#include <sys/filio.h> 147db96d56Sopenharmony_ci#include <sys/sockio.h> 157db96d56Sopenharmony_ci#endif 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci#include <termios.h> 187db96d56Sopenharmony_ci#include <sys/ioctl.h> 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR, 217db96d56Sopenharmony_ci * MDTR, MRI, and MRTS (apparently used internally by some things 227db96d56Sopenharmony_ci * defined as macros; these are not used here directly). 237db96d56Sopenharmony_ci */ 247db96d56Sopenharmony_ci#ifdef HAVE_SYS_MODEM_H 257db96d56Sopenharmony_ci#include <sys/modem.h> 267db96d56Sopenharmony_ci#endif 277db96d56Sopenharmony_ci/* HP-UX requires that this be included to pick up TIOCGPGRP and friends */ 287db96d56Sopenharmony_ci#ifdef HAVE_SYS_BSDTTY_H 297db96d56Sopenharmony_ci#include <sys/bsdtty.h> 307db96d56Sopenharmony_ci#endif 317db96d56Sopenharmony_ci 327db96d56Sopenharmony_ci/*[clinic input] 337db96d56Sopenharmony_cimodule termios 347db96d56Sopenharmony_ci[clinic start generated code]*/ 357db96d56Sopenharmony_ci/*[clinic end generated code: output=da39a3ee5e6b4b0d input=01105c85d0ca7252]*/ 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci#include "clinic/termios.c.h" 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ciPyDoc_STRVAR(termios__doc__, 407db96d56Sopenharmony_ci"This module provides an interface to the Posix calls for tty I/O control.\n\ 417db96d56Sopenharmony_ciFor a complete description of these calls, see the Posix or Unix manual\n\ 427db96d56Sopenharmony_cipages. It is only available for those Unix versions that support Posix\n\ 437db96d56Sopenharmony_citermios style tty I/O control.\n\ 447db96d56Sopenharmony_ci\n\ 457db96d56Sopenharmony_ciAll functions in this module take a file descriptor fd as their first\n\ 467db96d56Sopenharmony_ciargument. This can be an integer file descriptor, such as returned by\n\ 477db96d56Sopenharmony_cisys.stdin.fileno(), or a file object, such as sys.stdin itself."); 487db96d56Sopenharmony_ci 497db96d56Sopenharmony_citypedef struct { 507db96d56Sopenharmony_ci PyObject *TermiosError; 517db96d56Sopenharmony_ci} termiosmodulestate; 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_cistatic inline termiosmodulestate* 547db96d56Sopenharmony_ciget_termios_state(PyObject *module) 557db96d56Sopenharmony_ci{ 567db96d56Sopenharmony_ci void *state = PyModule_GetState(module); 577db96d56Sopenharmony_ci assert(state != NULL); 587db96d56Sopenharmony_ci return (termiosmodulestate *)state; 597db96d56Sopenharmony_ci} 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_cistatic struct PyModuleDef termiosmodule; 627db96d56Sopenharmony_ci 637db96d56Sopenharmony_ci/*[clinic input] 647db96d56Sopenharmony_citermios.tcgetattr 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci fd: fildes 677db96d56Sopenharmony_ci / 687db96d56Sopenharmony_ci 697db96d56Sopenharmony_ciGet the tty attributes for file descriptor fd. 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ciReturns a list [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] 727db96d56Sopenharmony_ciwhere cc is a list of the tty special characters (each a string of 737db96d56Sopenharmony_cilength 1, except the items with indices VMIN and VTIME, which are 747db96d56Sopenharmony_ciintegers when these fields are defined). The interpretation of the 757db96d56Sopenharmony_ciflags and the speeds as well as the indexing in the cc array must be 767db96d56Sopenharmony_cidone using the symbolic constants defined in this module. 777db96d56Sopenharmony_ci[clinic start generated code]*/ 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_cistatic PyObject * 807db96d56Sopenharmony_citermios_tcgetattr_impl(PyObject *module, int fd) 817db96d56Sopenharmony_ci/*[clinic end generated code: output=2b3da39db870e629 input=54dad9779ebe74b1]*/ 827db96d56Sopenharmony_ci{ 837db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 847db96d56Sopenharmony_ci struct termios mode; 857db96d56Sopenharmony_ci int r; 867db96d56Sopenharmony_ci 877db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 887db96d56Sopenharmony_ci r = tcgetattr(fd, &mode); 897db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 907db96d56Sopenharmony_ci if (r == -1) { 917db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 927db96d56Sopenharmony_ci } 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci speed_t ispeed = cfgetispeed(&mode); 957db96d56Sopenharmony_ci speed_t ospeed = cfgetospeed(&mode); 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci PyObject *cc = PyList_New(NCCS); 987db96d56Sopenharmony_ci if (cc == NULL) { 997db96d56Sopenharmony_ci return NULL; 1007db96d56Sopenharmony_ci } 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci PyObject *v; 1037db96d56Sopenharmony_ci int i; 1047db96d56Sopenharmony_ci for (i = 0; i < NCCS; i++) { 1057db96d56Sopenharmony_ci char ch = (char)mode.c_cc[i]; 1067db96d56Sopenharmony_ci v = PyBytes_FromStringAndSize(&ch, 1); 1077db96d56Sopenharmony_ci if (v == NULL) 1087db96d56Sopenharmony_ci goto err; 1097db96d56Sopenharmony_ci PyList_SetItem(cc, i, v); 1107db96d56Sopenharmony_ci } 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci /* Convert the MIN and TIME slots to integer. On some systems, the 1137db96d56Sopenharmony_ci MIN and TIME slots are the same as the EOF and EOL slots. So we 1147db96d56Sopenharmony_ci only do this in noncanonical input mode. */ 1157db96d56Sopenharmony_ci if ((mode.c_lflag & ICANON) == 0) { 1167db96d56Sopenharmony_ci v = PyLong_FromLong((long)mode.c_cc[VMIN]); 1177db96d56Sopenharmony_ci if (v == NULL) 1187db96d56Sopenharmony_ci goto err; 1197db96d56Sopenharmony_ci PyList_SetItem(cc, VMIN, v); 1207db96d56Sopenharmony_ci v = PyLong_FromLong((long)mode.c_cc[VTIME]); 1217db96d56Sopenharmony_ci if (v == NULL) 1227db96d56Sopenharmony_ci goto err; 1237db96d56Sopenharmony_ci PyList_SetItem(cc, VTIME, v); 1247db96d56Sopenharmony_ci } 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci if (!(v = PyList_New(7))) 1277db96d56Sopenharmony_ci goto err; 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci PyList_SetItem(v, 0, PyLong_FromLong((long)mode.c_iflag)); 1307db96d56Sopenharmony_ci PyList_SetItem(v, 1, PyLong_FromLong((long)mode.c_oflag)); 1317db96d56Sopenharmony_ci PyList_SetItem(v, 2, PyLong_FromLong((long)mode.c_cflag)); 1327db96d56Sopenharmony_ci PyList_SetItem(v, 3, PyLong_FromLong((long)mode.c_lflag)); 1337db96d56Sopenharmony_ci PyList_SetItem(v, 4, PyLong_FromLong((long)ispeed)); 1347db96d56Sopenharmony_ci PyList_SetItem(v, 5, PyLong_FromLong((long)ospeed)); 1357db96d56Sopenharmony_ci if (PyErr_Occurred()) { 1367db96d56Sopenharmony_ci Py_DECREF(v); 1377db96d56Sopenharmony_ci goto err; 1387db96d56Sopenharmony_ci } 1397db96d56Sopenharmony_ci PyList_SetItem(v, 6, cc); 1407db96d56Sopenharmony_ci return v; 1417db96d56Sopenharmony_ci err: 1427db96d56Sopenharmony_ci Py_DECREF(cc); 1437db96d56Sopenharmony_ci return NULL; 1447db96d56Sopenharmony_ci} 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci/*[clinic input] 1477db96d56Sopenharmony_citermios.tcsetattr 1487db96d56Sopenharmony_ci 1497db96d56Sopenharmony_ci fd: fildes 1507db96d56Sopenharmony_ci when: int 1517db96d56Sopenharmony_ci attributes as term: object 1527db96d56Sopenharmony_ci / 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ciSet the tty attributes for file descriptor fd. 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ciThe attributes to be set are taken from the attributes argument, which 1577db96d56Sopenharmony_ciis a list like the one returned by tcgetattr(). The when argument 1587db96d56Sopenharmony_cidetermines when the attributes are changed: termios.TCSANOW to 1597db96d56Sopenharmony_cichange immediately, termios.TCSADRAIN to change after transmitting all 1607db96d56Sopenharmony_ciqueued output, or termios.TCSAFLUSH to change after transmitting all 1617db96d56Sopenharmony_ciqueued output and discarding all queued input. 1627db96d56Sopenharmony_ci[clinic start generated code]*/ 1637db96d56Sopenharmony_ci 1647db96d56Sopenharmony_cistatic PyObject * 1657db96d56Sopenharmony_citermios_tcsetattr_impl(PyObject *module, int fd, int when, PyObject *term) 1667db96d56Sopenharmony_ci/*[clinic end generated code: output=bcd2b0a7b98a4bf5 input=5dafabdd5a08f018]*/ 1677db96d56Sopenharmony_ci{ 1687db96d56Sopenharmony_ci if (!PyList_Check(term) || PyList_Size(term) != 7) { 1697db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, 1707db96d56Sopenharmony_ci "tcsetattr, arg 3: must be 7 element list"); 1717db96d56Sopenharmony_ci return NULL; 1727db96d56Sopenharmony_ci } 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci /* Get the old mode, in case there are any hidden fields... */ 1757db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 1767db96d56Sopenharmony_ci struct termios mode; 1777db96d56Sopenharmony_ci int r; 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 1807db96d56Sopenharmony_ci r = tcgetattr(fd, &mode); 1817db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 1827db96d56Sopenharmony_ci if (r == -1) { 1837db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 1847db96d56Sopenharmony_ci } 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci mode.c_iflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 0)); 1877db96d56Sopenharmony_ci mode.c_oflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 1)); 1887db96d56Sopenharmony_ci mode.c_cflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 2)); 1897db96d56Sopenharmony_ci mode.c_lflag = (tcflag_t) PyLong_AsLong(PyList_GetItem(term, 3)); 1907db96d56Sopenharmony_ci speed_t ispeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 4)); 1917db96d56Sopenharmony_ci speed_t ospeed = (speed_t) PyLong_AsLong(PyList_GetItem(term, 5)); 1927db96d56Sopenharmony_ci PyObject *cc = PyList_GetItem(term, 6); 1937db96d56Sopenharmony_ci if (PyErr_Occurred()) { 1947db96d56Sopenharmony_ci return NULL; 1957db96d56Sopenharmony_ci } 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) { 1987db96d56Sopenharmony_ci PyErr_Format(PyExc_TypeError, 1997db96d56Sopenharmony_ci "tcsetattr: attributes[6] must be %d element list", 2007db96d56Sopenharmony_ci NCCS); 2017db96d56Sopenharmony_ci return NULL; 2027db96d56Sopenharmony_ci } 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci int i; 2057db96d56Sopenharmony_ci PyObject *v; 2067db96d56Sopenharmony_ci for (i = 0; i < NCCS; i++) { 2077db96d56Sopenharmony_ci v = PyList_GetItem(cc, i); 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci if (PyBytes_Check(v) && PyBytes_Size(v) == 1) 2107db96d56Sopenharmony_ci mode.c_cc[i] = (cc_t) * PyBytes_AsString(v); 2117db96d56Sopenharmony_ci else if (PyLong_Check(v)) 2127db96d56Sopenharmony_ci mode.c_cc[i] = (cc_t) PyLong_AsLong(v); 2137db96d56Sopenharmony_ci else { 2147db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, 2157db96d56Sopenharmony_ci "tcsetattr: elements of attributes must be characters or integers"); 2167db96d56Sopenharmony_ci return NULL; 2177db96d56Sopenharmony_ci } 2187db96d56Sopenharmony_ci } 2197db96d56Sopenharmony_ci 2207db96d56Sopenharmony_ci if (cfsetispeed(&mode, (speed_t) ispeed) == -1) 2217db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 2227db96d56Sopenharmony_ci if (cfsetospeed(&mode, (speed_t) ospeed) == -1) 2237db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 2247db96d56Sopenharmony_ci 2257db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 2267db96d56Sopenharmony_ci r = tcsetattr(fd, when, &mode); 2277db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 2287db96d56Sopenharmony_ci 2297db96d56Sopenharmony_ci if (r == -1) 2307db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci Py_RETURN_NONE; 2337db96d56Sopenharmony_ci} 2347db96d56Sopenharmony_ci 2357db96d56Sopenharmony_ci/*[clinic input] 2367db96d56Sopenharmony_citermios.tcsendbreak 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci fd: fildes 2397db96d56Sopenharmony_ci duration: int 2407db96d56Sopenharmony_ci / 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ciSend a break on file descriptor fd. 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ciA zero duration sends a break for 0.25-0.5 seconds; a nonzero duration 2457db96d56Sopenharmony_cihas a system dependent meaning. 2467db96d56Sopenharmony_ci[clinic start generated code]*/ 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_cistatic PyObject * 2497db96d56Sopenharmony_citermios_tcsendbreak_impl(PyObject *module, int fd, int duration) 2507db96d56Sopenharmony_ci/*[clinic end generated code: output=5945f589b5d3ac66 input=dc2f32417691f8ed]*/ 2517db96d56Sopenharmony_ci{ 2527db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 2537db96d56Sopenharmony_ci int r; 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 2567db96d56Sopenharmony_ci r = tcsendbreak(fd, duration); 2577db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 2587db96d56Sopenharmony_ci 2597db96d56Sopenharmony_ci if (r == -1) { 2607db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 2617db96d56Sopenharmony_ci } 2627db96d56Sopenharmony_ci 2637db96d56Sopenharmony_ci Py_RETURN_NONE; 2647db96d56Sopenharmony_ci} 2657db96d56Sopenharmony_ci 2667db96d56Sopenharmony_ci/*[clinic input] 2677db96d56Sopenharmony_citermios.tcdrain 2687db96d56Sopenharmony_ci 2697db96d56Sopenharmony_ci fd: fildes 2707db96d56Sopenharmony_ci / 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ciWait until all output written to file descriptor fd has been transmitted. 2737db96d56Sopenharmony_ci[clinic start generated code]*/ 2747db96d56Sopenharmony_ci 2757db96d56Sopenharmony_cistatic PyObject * 2767db96d56Sopenharmony_citermios_tcdrain_impl(PyObject *module, int fd) 2777db96d56Sopenharmony_ci/*[clinic end generated code: output=5fd86944c6255955 input=c99241b140b32447]*/ 2787db96d56Sopenharmony_ci{ 2797db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 2807db96d56Sopenharmony_ci int r; 2817db96d56Sopenharmony_ci 2827db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 2837db96d56Sopenharmony_ci r = tcdrain(fd); 2847db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci if (r == -1) { 2877db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 2887db96d56Sopenharmony_ci } 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci Py_RETURN_NONE; 2917db96d56Sopenharmony_ci} 2927db96d56Sopenharmony_ci 2937db96d56Sopenharmony_ci/*[clinic input] 2947db96d56Sopenharmony_citermios.tcflush 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci fd: fildes 2977db96d56Sopenharmony_ci queue: int 2987db96d56Sopenharmony_ci / 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ciDiscard queued data on file descriptor fd. 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ciThe queue selector specifies which queue: termios.TCIFLUSH for the input 3037db96d56Sopenharmony_ciqueue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for 3047db96d56Sopenharmony_ciboth queues. 3057db96d56Sopenharmony_ci[clinic start generated code]*/ 3067db96d56Sopenharmony_ci 3077db96d56Sopenharmony_cistatic PyObject * 3087db96d56Sopenharmony_citermios_tcflush_impl(PyObject *module, int fd, int queue) 3097db96d56Sopenharmony_ci/*[clinic end generated code: output=2424f80312ec2f21 input=0f7d08122ddc07b5]*/ 3107db96d56Sopenharmony_ci{ 3117db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 3127db96d56Sopenharmony_ci int r; 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 3157db96d56Sopenharmony_ci r = tcflush(fd, queue); 3167db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 3177db96d56Sopenharmony_ci 3187db96d56Sopenharmony_ci if (r == -1) { 3197db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 3207db96d56Sopenharmony_ci } 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ci Py_RETURN_NONE; 3237db96d56Sopenharmony_ci} 3247db96d56Sopenharmony_ci 3257db96d56Sopenharmony_ci/*[clinic input] 3267db96d56Sopenharmony_citermios.tcflow 3277db96d56Sopenharmony_ci 3287db96d56Sopenharmony_ci fd: fildes 3297db96d56Sopenharmony_ci action: int 3307db96d56Sopenharmony_ci / 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ciSuspend or resume input or output on file descriptor fd. 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ciThe action argument can be termios.TCOOFF to suspend output, 3357db96d56Sopenharmony_citermios.TCOON to restart output, termios.TCIOFF to suspend input, 3367db96d56Sopenharmony_cior termios.TCION to restart input. 3377db96d56Sopenharmony_ci[clinic start generated code]*/ 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_cistatic PyObject * 3407db96d56Sopenharmony_citermios_tcflow_impl(PyObject *module, int fd, int action) 3417db96d56Sopenharmony_ci/*[clinic end generated code: output=afd10928e6ea66eb input=c6aff0640b6efd9c]*/ 3427db96d56Sopenharmony_ci{ 3437db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 3447db96d56Sopenharmony_ci int r; 3457db96d56Sopenharmony_ci 3467db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 3477db96d56Sopenharmony_ci r = tcflow(fd, action); 3487db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_ci if (r == -1) { 3517db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 3527db96d56Sopenharmony_ci } 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci Py_RETURN_NONE; 3557db96d56Sopenharmony_ci} 3567db96d56Sopenharmony_ci 3577db96d56Sopenharmony_ci/*[clinic input] 3587db96d56Sopenharmony_citermios.tcgetwinsize 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci fd: fildes 3617db96d56Sopenharmony_ci / 3627db96d56Sopenharmony_ci 3637db96d56Sopenharmony_ciGet the tty winsize for file descriptor fd. 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ciReturns a tuple (ws_row, ws_col). 3667db96d56Sopenharmony_ci[clinic start generated code]*/ 3677db96d56Sopenharmony_ci 3687db96d56Sopenharmony_cistatic PyObject * 3697db96d56Sopenharmony_citermios_tcgetwinsize_impl(PyObject *module, int fd) 3707db96d56Sopenharmony_ci/*[clinic end generated code: output=31825977d5325fb6 input=5706c379d7fd984d]*/ 3717db96d56Sopenharmony_ci{ 3727db96d56Sopenharmony_ci#if defined(TIOCGWINSZ) 3737db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 3747db96d56Sopenharmony_ci struct winsize w; 3757db96d56Sopenharmony_ci int r; 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 3787db96d56Sopenharmony_ci r = ioctl(fd, TIOCGWINSZ, &w); 3797db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci if (r == -1) { 3827db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 3837db96d56Sopenharmony_ci } 3847db96d56Sopenharmony_ci 3857db96d56Sopenharmony_ci PyObject *v; 3867db96d56Sopenharmony_ci if (!(v = PyTuple_New(2))) { 3877db96d56Sopenharmony_ci return NULL; 3887db96d56Sopenharmony_ci } 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ci PyTuple_SetItem(v, 0, PyLong_FromLong((long)w.ws_row)); 3917db96d56Sopenharmony_ci PyTuple_SetItem(v, 1, PyLong_FromLong((long)w.ws_col)); 3927db96d56Sopenharmony_ci if (PyErr_Occurred()) { 3937db96d56Sopenharmony_ci Py_DECREF(v); 3947db96d56Sopenharmony_ci return NULL; 3957db96d56Sopenharmony_ci } 3967db96d56Sopenharmony_ci return v; 3977db96d56Sopenharmony_ci#elif defined(TIOCGSIZE) 3987db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 3997db96d56Sopenharmony_ci struct ttysize s; 4007db96d56Sopenharmony_ci int r; 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 4037db96d56Sopenharmony_ci r = ioctl(fd, TIOCGSIZE, &s); 4047db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 4057db96d56Sopenharmony_ci if (r == -1) { 4067db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 4077db96d56Sopenharmony_ci } 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci PyObject *v; 4107db96d56Sopenharmony_ci if (!(v = PyTuple_New(2))) { 4117db96d56Sopenharmony_ci return NULL; 4127db96d56Sopenharmony_ci } 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci PyTuple_SetItem(v, 0, PyLong_FromLong((long)s.ts_lines)); 4157db96d56Sopenharmony_ci PyTuple_SetItem(v, 1, PyLong_FromLong((long)s.ts_cols)); 4167db96d56Sopenharmony_ci if (PyErr_Occurred()) { 4177db96d56Sopenharmony_ci Py_DECREF(v); 4187db96d56Sopenharmony_ci return NULL; 4197db96d56Sopenharmony_ci } 4207db96d56Sopenharmony_ci return v; 4217db96d56Sopenharmony_ci#else 4227db96d56Sopenharmony_ci PyErr_SetString(PyExc_NotImplementedError, 4237db96d56Sopenharmony_ci "requires termios.TIOCGWINSZ and/or termios.TIOCGSIZE"); 4247db96d56Sopenharmony_ci return NULL; 4257db96d56Sopenharmony_ci#endif /* defined(TIOCGWINSZ) */ 4267db96d56Sopenharmony_ci} 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci/*[clinic input] 4297db96d56Sopenharmony_citermios.tcsetwinsize 4307db96d56Sopenharmony_ci 4317db96d56Sopenharmony_ci fd: fildes 4327db96d56Sopenharmony_ci winsize as winsz: object 4337db96d56Sopenharmony_ci / 4347db96d56Sopenharmony_ci 4357db96d56Sopenharmony_ciSet the tty winsize for file descriptor fd. 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ciThe winsize to be set is taken from the winsize argument, which 4387db96d56Sopenharmony_ciis a two-item tuple (ws_row, ws_col) like the one returned by tcgetwinsize(). 4397db96d56Sopenharmony_ci[clinic start generated code]*/ 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_cistatic PyObject * 4427db96d56Sopenharmony_citermios_tcsetwinsize_impl(PyObject *module, int fd, PyObject *winsz) 4437db96d56Sopenharmony_ci/*[clinic end generated code: output=2ac3c9bb6eda83e1 input=4a06424465b24aee]*/ 4447db96d56Sopenharmony_ci{ 4457db96d56Sopenharmony_ci if (!PySequence_Check(winsz) || PySequence_Size(winsz) != 2) { 4467db96d56Sopenharmony_ci PyErr_SetString(PyExc_TypeError, 4477db96d56Sopenharmony_ci "tcsetwinsize, arg 2: must be a two-item sequence"); 4487db96d56Sopenharmony_ci return NULL; 4497db96d56Sopenharmony_ci } 4507db96d56Sopenharmony_ci 4517db96d56Sopenharmony_ci PyObject *tmp_item; 4527db96d56Sopenharmony_ci long winsz_0, winsz_1; 4537db96d56Sopenharmony_ci tmp_item = PySequence_GetItem(winsz, 0); 4547db96d56Sopenharmony_ci winsz_0 = PyLong_AsLong(tmp_item); 4557db96d56Sopenharmony_ci if (winsz_0 == -1 && PyErr_Occurred()) { 4567db96d56Sopenharmony_ci Py_XDECREF(tmp_item); 4577db96d56Sopenharmony_ci return NULL; 4587db96d56Sopenharmony_ci } 4597db96d56Sopenharmony_ci Py_XDECREF(tmp_item); 4607db96d56Sopenharmony_ci tmp_item = PySequence_GetItem(winsz, 1); 4617db96d56Sopenharmony_ci winsz_1 = PyLong_AsLong(tmp_item); 4627db96d56Sopenharmony_ci if (winsz_1 == -1 && PyErr_Occurred()) { 4637db96d56Sopenharmony_ci Py_XDECREF(tmp_item); 4647db96d56Sopenharmony_ci return NULL; 4657db96d56Sopenharmony_ci } 4667db96d56Sopenharmony_ci Py_XDECREF(tmp_item); 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci termiosmodulestate *state = PyModule_GetState(module); 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci#if defined(TIOCGWINSZ) && defined(TIOCSWINSZ) 4717db96d56Sopenharmony_ci struct winsize w; 4727db96d56Sopenharmony_ci /* Get the old winsize because it might have 4737db96d56Sopenharmony_ci more fields such as xpixel, ypixel. */ 4747db96d56Sopenharmony_ci if (ioctl(fd, TIOCGWINSZ, &w) == -1) { 4757db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 4767db96d56Sopenharmony_ci } 4777db96d56Sopenharmony_ci 4787db96d56Sopenharmony_ci w.ws_row = (unsigned short) winsz_0; 4797db96d56Sopenharmony_ci w.ws_col = (unsigned short) winsz_1; 4807db96d56Sopenharmony_ci if ((((long)w.ws_row) != winsz_0) || (((long)w.ws_col) != winsz_1)) { 4817db96d56Sopenharmony_ci PyErr_SetString(PyExc_OverflowError, 4827db96d56Sopenharmony_ci "winsize value(s) out of range."); 4837db96d56Sopenharmony_ci return NULL; 4847db96d56Sopenharmony_ci } 4857db96d56Sopenharmony_ci 4867db96d56Sopenharmony_ci int r; 4877db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 4887db96d56Sopenharmony_ci r = ioctl(fd, TIOCSWINSZ, &w); 4897db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 4907db96d56Sopenharmony_ci 4917db96d56Sopenharmony_ci if (r == -1) { 4927db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 4937db96d56Sopenharmony_ci } 4947db96d56Sopenharmony_ci 4957db96d56Sopenharmony_ci Py_RETURN_NONE; 4967db96d56Sopenharmony_ci#elif defined(TIOCGSIZE) && defined(TIOCSSIZE) 4977db96d56Sopenharmony_ci struct ttysize s; 4987db96d56Sopenharmony_ci int r; 4997db96d56Sopenharmony_ci /* Get the old ttysize because it might have more fields. */ 5007db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 5017db96d56Sopenharmony_ci r = ioctl(fd, TIOCGSIZE, &s); 5027db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 5037db96d56Sopenharmony_ci 5047db96d56Sopenharmony_ci if (r == -1) { 5057db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 5067db96d56Sopenharmony_ci } 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci s.ts_lines = (int) winsz_0; 5097db96d56Sopenharmony_ci s.ts_cols = (int) winsz_1; 5107db96d56Sopenharmony_ci if ((((long)s.ts_lines) != winsz_0) || (((long)s.ts_cols) != winsz_1)) { 5117db96d56Sopenharmony_ci PyErr_SetString(PyExc_OverflowError, 5127db96d56Sopenharmony_ci "winsize value(s) out of range."); 5137db96d56Sopenharmony_ci return NULL; 5147db96d56Sopenharmony_ci } 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci Py_BEGIN_ALLOW_THREADS 5177db96d56Sopenharmony_ci r = ioctl(fd, TIOCSSIZE, &s); 5187db96d56Sopenharmony_ci Py_END_ALLOW_THREADS 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci if (r == -1) { 5217db96d56Sopenharmony_ci return PyErr_SetFromErrno(state->TermiosError); 5227db96d56Sopenharmony_ci } 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci Py_RETURN_NONE; 5257db96d56Sopenharmony_ci#else 5267db96d56Sopenharmony_ci PyErr_SetString(PyExc_NotImplementedError, 5277db96d56Sopenharmony_ci "requires termios.TIOCGWINSZ, termios.TIOCSWINSZ and/or termios.TIOCGSIZE, termios.TIOCSSIZE"); 5287db96d56Sopenharmony_ci return NULL; 5297db96d56Sopenharmony_ci#endif /* defined(TIOCGWINSZ) && defined(TIOCSWINSZ) */ 5307db96d56Sopenharmony_ci} 5317db96d56Sopenharmony_ci 5327db96d56Sopenharmony_cistatic PyMethodDef termios_methods[] = 5337db96d56Sopenharmony_ci{ 5347db96d56Sopenharmony_ci TERMIOS_TCGETATTR_METHODDEF 5357db96d56Sopenharmony_ci TERMIOS_TCSETATTR_METHODDEF 5367db96d56Sopenharmony_ci TERMIOS_TCSENDBREAK_METHODDEF 5377db96d56Sopenharmony_ci TERMIOS_TCDRAIN_METHODDEF 5387db96d56Sopenharmony_ci TERMIOS_TCFLUSH_METHODDEF 5397db96d56Sopenharmony_ci TERMIOS_TCFLOW_METHODDEF 5407db96d56Sopenharmony_ci TERMIOS_TCGETWINSIZE_METHODDEF 5417db96d56Sopenharmony_ci TERMIOS_TCSETWINSIZE_METHODDEF 5427db96d56Sopenharmony_ci {NULL, NULL} 5437db96d56Sopenharmony_ci}; 5447db96d56Sopenharmony_ci 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci#if defined(VSWTCH) && !defined(VSWTC) 5477db96d56Sopenharmony_ci#define VSWTC VSWTCH 5487db96d56Sopenharmony_ci#endif 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci#if defined(VSWTC) && !defined(VSWTCH) 5517db96d56Sopenharmony_ci#define VSWTCH VSWTC 5527db96d56Sopenharmony_ci#endif 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_cistatic struct constant { 5557db96d56Sopenharmony_ci char *name; 5567db96d56Sopenharmony_ci long value; 5577db96d56Sopenharmony_ci} termios_constants[] = { 5587db96d56Sopenharmony_ci /* cfgetospeed(), cfsetospeed() constants */ 5597db96d56Sopenharmony_ci {"B0", B0}, 5607db96d56Sopenharmony_ci {"B50", B50}, 5617db96d56Sopenharmony_ci {"B75", B75}, 5627db96d56Sopenharmony_ci {"B110", B110}, 5637db96d56Sopenharmony_ci {"B134", B134}, 5647db96d56Sopenharmony_ci {"B150", B150}, 5657db96d56Sopenharmony_ci {"B200", B200}, 5667db96d56Sopenharmony_ci {"B300", B300}, 5677db96d56Sopenharmony_ci {"B600", B600}, 5687db96d56Sopenharmony_ci {"B1200", B1200}, 5697db96d56Sopenharmony_ci {"B1800", B1800}, 5707db96d56Sopenharmony_ci {"B2400", B2400}, 5717db96d56Sopenharmony_ci {"B4800", B4800}, 5727db96d56Sopenharmony_ci {"B9600", B9600}, 5737db96d56Sopenharmony_ci {"B19200", B19200}, 5747db96d56Sopenharmony_ci {"B38400", B38400}, 5757db96d56Sopenharmony_ci#ifdef B57600 5767db96d56Sopenharmony_ci {"B57600", B57600}, 5777db96d56Sopenharmony_ci#endif 5787db96d56Sopenharmony_ci#ifdef B115200 5797db96d56Sopenharmony_ci {"B115200", B115200}, 5807db96d56Sopenharmony_ci#endif 5817db96d56Sopenharmony_ci#ifdef B230400 5827db96d56Sopenharmony_ci {"B230400", B230400}, 5837db96d56Sopenharmony_ci#endif 5847db96d56Sopenharmony_ci#ifdef B460800 5857db96d56Sopenharmony_ci {"B460800", B460800}, 5867db96d56Sopenharmony_ci#endif 5877db96d56Sopenharmony_ci#ifdef B500000 5887db96d56Sopenharmony_ci {"B500000", B500000}, 5897db96d56Sopenharmony_ci#endif 5907db96d56Sopenharmony_ci#ifdef B576000 5917db96d56Sopenharmony_ci {"B576000", B576000}, 5927db96d56Sopenharmony_ci#endif 5937db96d56Sopenharmony_ci#ifdef B921600 5947db96d56Sopenharmony_ci {"B921600", B921600}, 5957db96d56Sopenharmony_ci#endif 5967db96d56Sopenharmony_ci#ifdef B1000000 5977db96d56Sopenharmony_ci {"B1000000", B1000000}, 5987db96d56Sopenharmony_ci#endif 5997db96d56Sopenharmony_ci#ifdef B1152000 6007db96d56Sopenharmony_ci {"B1152000", B1152000}, 6017db96d56Sopenharmony_ci#endif 6027db96d56Sopenharmony_ci#ifdef B1500000 6037db96d56Sopenharmony_ci {"B1500000", B1500000}, 6047db96d56Sopenharmony_ci#endif 6057db96d56Sopenharmony_ci#ifdef B2000000 6067db96d56Sopenharmony_ci {"B2000000", B2000000}, 6077db96d56Sopenharmony_ci#endif 6087db96d56Sopenharmony_ci#ifdef B2500000 6097db96d56Sopenharmony_ci {"B2500000", B2500000}, 6107db96d56Sopenharmony_ci#endif 6117db96d56Sopenharmony_ci#ifdef B3000000 6127db96d56Sopenharmony_ci {"B3000000", B3000000}, 6137db96d56Sopenharmony_ci#endif 6147db96d56Sopenharmony_ci#ifdef B3500000 6157db96d56Sopenharmony_ci {"B3500000", B3500000}, 6167db96d56Sopenharmony_ci#endif 6177db96d56Sopenharmony_ci#ifdef B4000000 6187db96d56Sopenharmony_ci {"B4000000", B4000000}, 6197db96d56Sopenharmony_ci#endif 6207db96d56Sopenharmony_ci 6217db96d56Sopenharmony_ci#ifdef CBAUDEX 6227db96d56Sopenharmony_ci {"CBAUDEX", CBAUDEX}, 6237db96d56Sopenharmony_ci#endif 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci /* tcsetattr() constants */ 6267db96d56Sopenharmony_ci {"TCSANOW", TCSANOW}, 6277db96d56Sopenharmony_ci {"TCSADRAIN", TCSADRAIN}, 6287db96d56Sopenharmony_ci {"TCSAFLUSH", TCSAFLUSH}, 6297db96d56Sopenharmony_ci#ifdef TCSASOFT 6307db96d56Sopenharmony_ci {"TCSASOFT", TCSASOFT}, 6317db96d56Sopenharmony_ci#endif 6327db96d56Sopenharmony_ci 6337db96d56Sopenharmony_ci /* tcflush() constants */ 6347db96d56Sopenharmony_ci {"TCIFLUSH", TCIFLUSH}, 6357db96d56Sopenharmony_ci {"TCOFLUSH", TCOFLUSH}, 6367db96d56Sopenharmony_ci {"TCIOFLUSH", TCIOFLUSH}, 6377db96d56Sopenharmony_ci 6387db96d56Sopenharmony_ci /* tcflow() constants */ 6397db96d56Sopenharmony_ci {"TCOOFF", TCOOFF}, 6407db96d56Sopenharmony_ci {"TCOON", TCOON}, 6417db96d56Sopenharmony_ci {"TCIOFF", TCIOFF}, 6427db96d56Sopenharmony_ci {"TCION", TCION}, 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ci /* struct termios.c_iflag constants */ 6457db96d56Sopenharmony_ci {"IGNBRK", IGNBRK}, 6467db96d56Sopenharmony_ci {"BRKINT", BRKINT}, 6477db96d56Sopenharmony_ci {"IGNPAR", IGNPAR}, 6487db96d56Sopenharmony_ci {"PARMRK", PARMRK}, 6497db96d56Sopenharmony_ci {"INPCK", INPCK}, 6507db96d56Sopenharmony_ci {"ISTRIP", ISTRIP}, 6517db96d56Sopenharmony_ci {"INLCR", INLCR}, 6527db96d56Sopenharmony_ci {"IGNCR", IGNCR}, 6537db96d56Sopenharmony_ci {"ICRNL", ICRNL}, 6547db96d56Sopenharmony_ci#ifdef IUCLC 6557db96d56Sopenharmony_ci {"IUCLC", IUCLC}, 6567db96d56Sopenharmony_ci#endif 6577db96d56Sopenharmony_ci {"IXON", IXON}, 6587db96d56Sopenharmony_ci {"IXANY", IXANY}, 6597db96d56Sopenharmony_ci {"IXOFF", IXOFF}, 6607db96d56Sopenharmony_ci#ifdef IMAXBEL 6617db96d56Sopenharmony_ci {"IMAXBEL", IMAXBEL}, 6627db96d56Sopenharmony_ci#endif 6637db96d56Sopenharmony_ci 6647db96d56Sopenharmony_ci /* struct termios.c_oflag constants */ 6657db96d56Sopenharmony_ci {"OPOST", OPOST}, 6667db96d56Sopenharmony_ci#ifdef OLCUC 6677db96d56Sopenharmony_ci {"OLCUC", OLCUC}, 6687db96d56Sopenharmony_ci#endif 6697db96d56Sopenharmony_ci#ifdef ONLCR 6707db96d56Sopenharmony_ci {"ONLCR", ONLCR}, 6717db96d56Sopenharmony_ci#endif 6727db96d56Sopenharmony_ci#ifdef OCRNL 6737db96d56Sopenharmony_ci {"OCRNL", OCRNL}, 6747db96d56Sopenharmony_ci#endif 6757db96d56Sopenharmony_ci#ifdef ONOCR 6767db96d56Sopenharmony_ci {"ONOCR", ONOCR}, 6777db96d56Sopenharmony_ci#endif 6787db96d56Sopenharmony_ci#ifdef ONLRET 6797db96d56Sopenharmony_ci {"ONLRET", ONLRET}, 6807db96d56Sopenharmony_ci#endif 6817db96d56Sopenharmony_ci#ifdef OFILL 6827db96d56Sopenharmony_ci {"OFILL", OFILL}, 6837db96d56Sopenharmony_ci#endif 6847db96d56Sopenharmony_ci#ifdef OFDEL 6857db96d56Sopenharmony_ci {"OFDEL", OFDEL}, 6867db96d56Sopenharmony_ci#endif 6877db96d56Sopenharmony_ci#ifdef NLDLY 6887db96d56Sopenharmony_ci {"NLDLY", NLDLY}, 6897db96d56Sopenharmony_ci#endif 6907db96d56Sopenharmony_ci#ifdef CRDLY 6917db96d56Sopenharmony_ci {"CRDLY", CRDLY}, 6927db96d56Sopenharmony_ci#endif 6937db96d56Sopenharmony_ci#ifdef TABDLY 6947db96d56Sopenharmony_ci {"TABDLY", TABDLY}, 6957db96d56Sopenharmony_ci#endif 6967db96d56Sopenharmony_ci#ifdef BSDLY 6977db96d56Sopenharmony_ci {"BSDLY", BSDLY}, 6987db96d56Sopenharmony_ci#endif 6997db96d56Sopenharmony_ci#ifdef VTDLY 7007db96d56Sopenharmony_ci {"VTDLY", VTDLY}, 7017db96d56Sopenharmony_ci#endif 7027db96d56Sopenharmony_ci#ifdef FFDLY 7037db96d56Sopenharmony_ci {"FFDLY", FFDLY}, 7047db96d56Sopenharmony_ci#endif 7057db96d56Sopenharmony_ci 7067db96d56Sopenharmony_ci /* struct termios.c_oflag-related values (delay mask) */ 7077db96d56Sopenharmony_ci#ifdef NL0 7087db96d56Sopenharmony_ci {"NL0", NL0}, 7097db96d56Sopenharmony_ci#endif 7107db96d56Sopenharmony_ci#ifdef NL1 7117db96d56Sopenharmony_ci {"NL1", NL1}, 7127db96d56Sopenharmony_ci#endif 7137db96d56Sopenharmony_ci#ifdef CR0 7147db96d56Sopenharmony_ci {"CR0", CR0}, 7157db96d56Sopenharmony_ci#endif 7167db96d56Sopenharmony_ci#ifdef CR1 7177db96d56Sopenharmony_ci {"CR1", CR1}, 7187db96d56Sopenharmony_ci#endif 7197db96d56Sopenharmony_ci#ifdef CR2 7207db96d56Sopenharmony_ci {"CR2", CR2}, 7217db96d56Sopenharmony_ci#endif 7227db96d56Sopenharmony_ci#ifdef CR3 7237db96d56Sopenharmony_ci {"CR3", CR3}, 7247db96d56Sopenharmony_ci#endif 7257db96d56Sopenharmony_ci#ifdef TAB0 7267db96d56Sopenharmony_ci {"TAB0", TAB0}, 7277db96d56Sopenharmony_ci#endif 7287db96d56Sopenharmony_ci#ifdef TAB1 7297db96d56Sopenharmony_ci {"TAB1", TAB1}, 7307db96d56Sopenharmony_ci#endif 7317db96d56Sopenharmony_ci#ifdef TAB2 7327db96d56Sopenharmony_ci {"TAB2", TAB2}, 7337db96d56Sopenharmony_ci#endif 7347db96d56Sopenharmony_ci#ifdef TAB3 7357db96d56Sopenharmony_ci {"TAB3", TAB3}, 7367db96d56Sopenharmony_ci#endif 7377db96d56Sopenharmony_ci#ifdef XTABS 7387db96d56Sopenharmony_ci {"XTABS", XTABS}, 7397db96d56Sopenharmony_ci#endif 7407db96d56Sopenharmony_ci#ifdef BS0 7417db96d56Sopenharmony_ci {"BS0", BS0}, 7427db96d56Sopenharmony_ci#endif 7437db96d56Sopenharmony_ci#ifdef BS1 7447db96d56Sopenharmony_ci {"BS1", BS1}, 7457db96d56Sopenharmony_ci#endif 7467db96d56Sopenharmony_ci#ifdef VT0 7477db96d56Sopenharmony_ci {"VT0", VT0}, 7487db96d56Sopenharmony_ci#endif 7497db96d56Sopenharmony_ci#ifdef VT1 7507db96d56Sopenharmony_ci {"VT1", VT1}, 7517db96d56Sopenharmony_ci#endif 7527db96d56Sopenharmony_ci#ifdef FF0 7537db96d56Sopenharmony_ci {"FF0", FF0}, 7547db96d56Sopenharmony_ci#endif 7557db96d56Sopenharmony_ci#ifdef FF1 7567db96d56Sopenharmony_ci {"FF1", FF1}, 7577db96d56Sopenharmony_ci#endif 7587db96d56Sopenharmony_ci 7597db96d56Sopenharmony_ci /* struct termios.c_cflag constants */ 7607db96d56Sopenharmony_ci {"CSIZE", CSIZE}, 7617db96d56Sopenharmony_ci {"CSTOPB", CSTOPB}, 7627db96d56Sopenharmony_ci {"CREAD", CREAD}, 7637db96d56Sopenharmony_ci {"PARENB", PARENB}, 7647db96d56Sopenharmony_ci {"PARODD", PARODD}, 7657db96d56Sopenharmony_ci {"HUPCL", HUPCL}, 7667db96d56Sopenharmony_ci {"CLOCAL", CLOCAL}, 7677db96d56Sopenharmony_ci#ifdef CIBAUD 7687db96d56Sopenharmony_ci {"CIBAUD", CIBAUD}, 7697db96d56Sopenharmony_ci#endif 7707db96d56Sopenharmony_ci#ifdef CRTSCTS 7717db96d56Sopenharmony_ci {"CRTSCTS", (long)CRTSCTS}, 7727db96d56Sopenharmony_ci#endif 7737db96d56Sopenharmony_ci 7747db96d56Sopenharmony_ci /* struct termios.c_cflag-related values (character size) */ 7757db96d56Sopenharmony_ci {"CS5", CS5}, 7767db96d56Sopenharmony_ci {"CS6", CS6}, 7777db96d56Sopenharmony_ci {"CS7", CS7}, 7787db96d56Sopenharmony_ci {"CS8", CS8}, 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci /* struct termios.c_lflag constants */ 7817db96d56Sopenharmony_ci {"ISIG", ISIG}, 7827db96d56Sopenharmony_ci {"ICANON", ICANON}, 7837db96d56Sopenharmony_ci#ifdef XCASE 7847db96d56Sopenharmony_ci {"XCASE", XCASE}, 7857db96d56Sopenharmony_ci#endif 7867db96d56Sopenharmony_ci {"ECHO", ECHO}, 7877db96d56Sopenharmony_ci {"ECHOE", ECHOE}, 7887db96d56Sopenharmony_ci {"ECHOK", ECHOK}, 7897db96d56Sopenharmony_ci {"ECHONL", ECHONL}, 7907db96d56Sopenharmony_ci#ifdef ECHOCTL 7917db96d56Sopenharmony_ci {"ECHOCTL", ECHOCTL}, 7927db96d56Sopenharmony_ci#endif 7937db96d56Sopenharmony_ci#ifdef ECHOPRT 7947db96d56Sopenharmony_ci {"ECHOPRT", ECHOPRT}, 7957db96d56Sopenharmony_ci#endif 7967db96d56Sopenharmony_ci#ifdef ECHOKE 7977db96d56Sopenharmony_ci {"ECHOKE", ECHOKE}, 7987db96d56Sopenharmony_ci#endif 7997db96d56Sopenharmony_ci#ifdef FLUSHO 8007db96d56Sopenharmony_ci {"FLUSHO", FLUSHO}, 8017db96d56Sopenharmony_ci#endif 8027db96d56Sopenharmony_ci {"NOFLSH", NOFLSH}, 8037db96d56Sopenharmony_ci {"TOSTOP", TOSTOP}, 8047db96d56Sopenharmony_ci#ifdef PENDIN 8057db96d56Sopenharmony_ci {"PENDIN", PENDIN}, 8067db96d56Sopenharmony_ci#endif 8077db96d56Sopenharmony_ci {"IEXTEN", IEXTEN}, 8087db96d56Sopenharmony_ci 8097db96d56Sopenharmony_ci /* indexes into the control chars array returned by tcgetattr() */ 8107db96d56Sopenharmony_ci {"VINTR", VINTR}, 8117db96d56Sopenharmony_ci {"VQUIT", VQUIT}, 8127db96d56Sopenharmony_ci {"VERASE", VERASE}, 8137db96d56Sopenharmony_ci {"VKILL", VKILL}, 8147db96d56Sopenharmony_ci {"VEOF", VEOF}, 8157db96d56Sopenharmony_ci {"VTIME", VTIME}, 8167db96d56Sopenharmony_ci {"VMIN", VMIN}, 8177db96d56Sopenharmony_ci#ifdef VSWTC 8187db96d56Sopenharmony_ci /* The #defines above ensure that if either is defined, both are, 8197db96d56Sopenharmony_ci * but both may be omitted by the system headers. ;-( */ 8207db96d56Sopenharmony_ci {"VSWTC", VSWTC}, 8217db96d56Sopenharmony_ci {"VSWTCH", VSWTCH}, 8227db96d56Sopenharmony_ci#endif 8237db96d56Sopenharmony_ci {"VSTART", VSTART}, 8247db96d56Sopenharmony_ci {"VSTOP", VSTOP}, 8257db96d56Sopenharmony_ci {"VSUSP", VSUSP}, 8267db96d56Sopenharmony_ci {"VEOL", VEOL}, 8277db96d56Sopenharmony_ci#ifdef VREPRINT 8287db96d56Sopenharmony_ci {"VREPRINT", VREPRINT}, 8297db96d56Sopenharmony_ci#endif 8307db96d56Sopenharmony_ci#ifdef VDISCARD 8317db96d56Sopenharmony_ci {"VDISCARD", VDISCARD}, 8327db96d56Sopenharmony_ci#endif 8337db96d56Sopenharmony_ci#ifdef VWERASE 8347db96d56Sopenharmony_ci {"VWERASE", VWERASE}, 8357db96d56Sopenharmony_ci#endif 8367db96d56Sopenharmony_ci#ifdef VLNEXT 8377db96d56Sopenharmony_ci {"VLNEXT", VLNEXT}, 8387db96d56Sopenharmony_ci#endif 8397db96d56Sopenharmony_ci#ifdef VEOL2 8407db96d56Sopenharmony_ci {"VEOL2", VEOL2}, 8417db96d56Sopenharmony_ci#endif 8427db96d56Sopenharmony_ci 8437db96d56Sopenharmony_ci 8447db96d56Sopenharmony_ci#ifdef B460800 8457db96d56Sopenharmony_ci {"B460800", B460800}, 8467db96d56Sopenharmony_ci#endif 8477db96d56Sopenharmony_ci#ifdef B500000 8487db96d56Sopenharmony_ci {"B500000", B500000}, 8497db96d56Sopenharmony_ci#endif 8507db96d56Sopenharmony_ci#ifdef B576000 8517db96d56Sopenharmony_ci { "B576000", B576000}, 8527db96d56Sopenharmony_ci#endif 8537db96d56Sopenharmony_ci#ifdef B921600 8547db96d56Sopenharmony_ci { "B921600", B921600}, 8557db96d56Sopenharmony_ci#endif 8567db96d56Sopenharmony_ci#ifdef B1000000 8577db96d56Sopenharmony_ci { "B1000000", B1000000}, 8587db96d56Sopenharmony_ci#endif 8597db96d56Sopenharmony_ci#ifdef B1152000 8607db96d56Sopenharmony_ci { "B1152000", B1152000}, 8617db96d56Sopenharmony_ci#endif 8627db96d56Sopenharmony_ci#ifdef B1500000 8637db96d56Sopenharmony_ci { "B1500000", B1500000}, 8647db96d56Sopenharmony_ci#endif 8657db96d56Sopenharmony_ci#ifdef B2000000 8667db96d56Sopenharmony_ci { "B2000000", B2000000}, 8677db96d56Sopenharmony_ci#endif 8687db96d56Sopenharmony_ci#ifdef B2500000 8697db96d56Sopenharmony_ci { "B2500000", B2500000}, 8707db96d56Sopenharmony_ci#endif 8717db96d56Sopenharmony_ci#ifdef B3000000 8727db96d56Sopenharmony_ci { "B3000000", B3000000}, 8737db96d56Sopenharmony_ci#endif 8747db96d56Sopenharmony_ci#ifdef B3500000 8757db96d56Sopenharmony_ci { "B3500000", B3500000}, 8767db96d56Sopenharmony_ci#endif 8777db96d56Sopenharmony_ci#ifdef B4000000 8787db96d56Sopenharmony_ci { "B4000000", B4000000}, 8797db96d56Sopenharmony_ci#endif 8807db96d56Sopenharmony_ci#ifdef CBAUD 8817db96d56Sopenharmony_ci {"CBAUD", CBAUD}, 8827db96d56Sopenharmony_ci#endif 8837db96d56Sopenharmony_ci#ifdef CDEL 8847db96d56Sopenharmony_ci {"CDEL", CDEL}, 8857db96d56Sopenharmony_ci#endif 8867db96d56Sopenharmony_ci#ifdef CDSUSP 8877db96d56Sopenharmony_ci {"CDSUSP", CDSUSP}, 8887db96d56Sopenharmony_ci#endif 8897db96d56Sopenharmony_ci#ifdef CEOF 8907db96d56Sopenharmony_ci {"CEOF", CEOF}, 8917db96d56Sopenharmony_ci#endif 8927db96d56Sopenharmony_ci#ifdef CEOL 8937db96d56Sopenharmony_ci {"CEOL", CEOL}, 8947db96d56Sopenharmony_ci#endif 8957db96d56Sopenharmony_ci#ifdef CEOL2 8967db96d56Sopenharmony_ci {"CEOL2", CEOL2}, 8977db96d56Sopenharmony_ci#endif 8987db96d56Sopenharmony_ci#ifdef CEOT 8997db96d56Sopenharmony_ci {"CEOT", CEOT}, 9007db96d56Sopenharmony_ci#endif 9017db96d56Sopenharmony_ci#ifdef CERASE 9027db96d56Sopenharmony_ci {"CERASE", CERASE}, 9037db96d56Sopenharmony_ci#endif 9047db96d56Sopenharmony_ci#ifdef CESC 9057db96d56Sopenharmony_ci {"CESC", CESC}, 9067db96d56Sopenharmony_ci#endif 9077db96d56Sopenharmony_ci#ifdef CFLUSH 9087db96d56Sopenharmony_ci {"CFLUSH", CFLUSH}, 9097db96d56Sopenharmony_ci#endif 9107db96d56Sopenharmony_ci#ifdef CINTR 9117db96d56Sopenharmony_ci {"CINTR", CINTR}, 9127db96d56Sopenharmony_ci#endif 9137db96d56Sopenharmony_ci#ifdef CKILL 9147db96d56Sopenharmony_ci {"CKILL", CKILL}, 9157db96d56Sopenharmony_ci#endif 9167db96d56Sopenharmony_ci#ifdef CLNEXT 9177db96d56Sopenharmony_ci {"CLNEXT", CLNEXT}, 9187db96d56Sopenharmony_ci#endif 9197db96d56Sopenharmony_ci#ifdef CNUL 9207db96d56Sopenharmony_ci {"CNUL", CNUL}, 9217db96d56Sopenharmony_ci#endif 9227db96d56Sopenharmony_ci#ifdef COMMON 9237db96d56Sopenharmony_ci {"COMMON", COMMON}, 9247db96d56Sopenharmony_ci#endif 9257db96d56Sopenharmony_ci#ifdef CQUIT 9267db96d56Sopenharmony_ci {"CQUIT", CQUIT}, 9277db96d56Sopenharmony_ci#endif 9287db96d56Sopenharmony_ci#ifdef CRPRNT 9297db96d56Sopenharmony_ci {"CRPRNT", CRPRNT}, 9307db96d56Sopenharmony_ci#endif 9317db96d56Sopenharmony_ci#ifdef CSTART 9327db96d56Sopenharmony_ci {"CSTART", CSTART}, 9337db96d56Sopenharmony_ci#endif 9347db96d56Sopenharmony_ci#ifdef CSTOP 9357db96d56Sopenharmony_ci {"CSTOP", CSTOP}, 9367db96d56Sopenharmony_ci#endif 9377db96d56Sopenharmony_ci#ifdef CSUSP 9387db96d56Sopenharmony_ci {"CSUSP", CSUSP}, 9397db96d56Sopenharmony_ci#endif 9407db96d56Sopenharmony_ci#ifdef CSWTCH 9417db96d56Sopenharmony_ci {"CSWTCH", CSWTCH}, 9427db96d56Sopenharmony_ci#endif 9437db96d56Sopenharmony_ci#ifdef CWERASE 9447db96d56Sopenharmony_ci {"CWERASE", CWERASE}, 9457db96d56Sopenharmony_ci#endif 9467db96d56Sopenharmony_ci#ifdef EXTA 9477db96d56Sopenharmony_ci {"EXTA", EXTA}, 9487db96d56Sopenharmony_ci#endif 9497db96d56Sopenharmony_ci#ifdef EXTB 9507db96d56Sopenharmony_ci {"EXTB", EXTB}, 9517db96d56Sopenharmony_ci#endif 9527db96d56Sopenharmony_ci#ifdef FIOASYNC 9537db96d56Sopenharmony_ci {"FIOASYNC", FIOASYNC}, 9547db96d56Sopenharmony_ci#endif 9557db96d56Sopenharmony_ci#ifdef FIOCLEX 9567db96d56Sopenharmony_ci {"FIOCLEX", FIOCLEX}, 9577db96d56Sopenharmony_ci#endif 9587db96d56Sopenharmony_ci#ifdef FIONBIO 9597db96d56Sopenharmony_ci {"FIONBIO", FIONBIO}, 9607db96d56Sopenharmony_ci#endif 9617db96d56Sopenharmony_ci#ifdef FIONCLEX 9627db96d56Sopenharmony_ci {"FIONCLEX", FIONCLEX}, 9637db96d56Sopenharmony_ci#endif 9647db96d56Sopenharmony_ci#ifdef FIONREAD 9657db96d56Sopenharmony_ci {"FIONREAD", FIONREAD}, 9667db96d56Sopenharmony_ci#endif 9677db96d56Sopenharmony_ci#ifdef IBSHIFT 9687db96d56Sopenharmony_ci {"IBSHIFT", IBSHIFT}, 9697db96d56Sopenharmony_ci#endif 9707db96d56Sopenharmony_ci#ifdef INIT_C_CC 9717db96d56Sopenharmony_ci {"INIT_C_CC", INIT_C_CC}, 9727db96d56Sopenharmony_ci#endif 9737db96d56Sopenharmony_ci#ifdef IOCSIZE_MASK 9747db96d56Sopenharmony_ci {"IOCSIZE_MASK", IOCSIZE_MASK}, 9757db96d56Sopenharmony_ci#endif 9767db96d56Sopenharmony_ci#ifdef IOCSIZE_SHIFT 9777db96d56Sopenharmony_ci {"IOCSIZE_SHIFT", IOCSIZE_SHIFT}, 9787db96d56Sopenharmony_ci#endif 9797db96d56Sopenharmony_ci#ifdef NCC 9807db96d56Sopenharmony_ci {"NCC", NCC}, 9817db96d56Sopenharmony_ci#endif 9827db96d56Sopenharmony_ci#ifdef NCCS 9837db96d56Sopenharmony_ci {"NCCS", NCCS}, 9847db96d56Sopenharmony_ci#endif 9857db96d56Sopenharmony_ci#ifdef NSWTCH 9867db96d56Sopenharmony_ci {"NSWTCH", NSWTCH}, 9877db96d56Sopenharmony_ci#endif 9887db96d56Sopenharmony_ci#ifdef N_MOUSE 9897db96d56Sopenharmony_ci {"N_MOUSE", N_MOUSE}, 9907db96d56Sopenharmony_ci#endif 9917db96d56Sopenharmony_ci#ifdef N_PPP 9927db96d56Sopenharmony_ci {"N_PPP", N_PPP}, 9937db96d56Sopenharmony_ci#endif 9947db96d56Sopenharmony_ci#ifdef N_SLIP 9957db96d56Sopenharmony_ci {"N_SLIP", N_SLIP}, 9967db96d56Sopenharmony_ci#endif 9977db96d56Sopenharmony_ci#ifdef N_STRIP 9987db96d56Sopenharmony_ci {"N_STRIP", N_STRIP}, 9997db96d56Sopenharmony_ci#endif 10007db96d56Sopenharmony_ci#ifdef N_TTY 10017db96d56Sopenharmony_ci {"N_TTY", N_TTY}, 10027db96d56Sopenharmony_ci#endif 10037db96d56Sopenharmony_ci#ifdef TCFLSH 10047db96d56Sopenharmony_ci {"TCFLSH", TCFLSH}, 10057db96d56Sopenharmony_ci#endif 10067db96d56Sopenharmony_ci#ifdef TCGETA 10077db96d56Sopenharmony_ci {"TCGETA", TCGETA}, 10087db96d56Sopenharmony_ci#endif 10097db96d56Sopenharmony_ci#ifdef TCGETS 10107db96d56Sopenharmony_ci {"TCGETS", TCGETS}, 10117db96d56Sopenharmony_ci#endif 10127db96d56Sopenharmony_ci#ifdef TCSBRK 10137db96d56Sopenharmony_ci {"TCSBRK", TCSBRK}, 10147db96d56Sopenharmony_ci#endif 10157db96d56Sopenharmony_ci#ifdef TCSBRKP 10167db96d56Sopenharmony_ci {"TCSBRKP", TCSBRKP}, 10177db96d56Sopenharmony_ci#endif 10187db96d56Sopenharmony_ci#ifdef TCSETA 10197db96d56Sopenharmony_ci {"TCSETA", TCSETA}, 10207db96d56Sopenharmony_ci#endif 10217db96d56Sopenharmony_ci#ifdef TCSETAF 10227db96d56Sopenharmony_ci {"TCSETAF", TCSETAF}, 10237db96d56Sopenharmony_ci#endif 10247db96d56Sopenharmony_ci#ifdef TCSETAW 10257db96d56Sopenharmony_ci {"TCSETAW", TCSETAW}, 10267db96d56Sopenharmony_ci#endif 10277db96d56Sopenharmony_ci#ifdef TCSETS 10287db96d56Sopenharmony_ci {"TCSETS", TCSETS}, 10297db96d56Sopenharmony_ci#endif 10307db96d56Sopenharmony_ci#ifdef TCSETSF 10317db96d56Sopenharmony_ci {"TCSETSF", TCSETSF}, 10327db96d56Sopenharmony_ci#endif 10337db96d56Sopenharmony_ci#ifdef TCSETSW 10347db96d56Sopenharmony_ci {"TCSETSW", TCSETSW}, 10357db96d56Sopenharmony_ci#endif 10367db96d56Sopenharmony_ci#ifdef TCXONC 10377db96d56Sopenharmony_ci {"TCXONC", TCXONC}, 10387db96d56Sopenharmony_ci#endif 10397db96d56Sopenharmony_ci#ifdef TIOCCONS 10407db96d56Sopenharmony_ci {"TIOCCONS", TIOCCONS}, 10417db96d56Sopenharmony_ci#endif 10427db96d56Sopenharmony_ci#ifdef TIOCEXCL 10437db96d56Sopenharmony_ci {"TIOCEXCL", TIOCEXCL}, 10447db96d56Sopenharmony_ci#endif 10457db96d56Sopenharmony_ci#ifdef TIOCGETD 10467db96d56Sopenharmony_ci {"TIOCGETD", TIOCGETD}, 10477db96d56Sopenharmony_ci#endif 10487db96d56Sopenharmony_ci#ifdef TIOCGICOUNT 10497db96d56Sopenharmony_ci {"TIOCGICOUNT", TIOCGICOUNT}, 10507db96d56Sopenharmony_ci#endif 10517db96d56Sopenharmony_ci#ifdef TIOCGLCKTRMIOS 10527db96d56Sopenharmony_ci {"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS}, 10537db96d56Sopenharmony_ci#endif 10547db96d56Sopenharmony_ci#ifdef TIOCGPGRP 10557db96d56Sopenharmony_ci {"TIOCGPGRP", TIOCGPGRP}, 10567db96d56Sopenharmony_ci#endif 10577db96d56Sopenharmony_ci#ifdef TIOCGSERIAL 10587db96d56Sopenharmony_ci {"TIOCGSERIAL", TIOCGSERIAL}, 10597db96d56Sopenharmony_ci#endif 10607db96d56Sopenharmony_ci#ifdef TIOCGSIZE 10617db96d56Sopenharmony_ci {"TIOCGSIZE", TIOCGSIZE}, 10627db96d56Sopenharmony_ci#endif 10637db96d56Sopenharmony_ci#ifdef TIOCGSOFTCAR 10647db96d56Sopenharmony_ci {"TIOCGSOFTCAR", TIOCGSOFTCAR}, 10657db96d56Sopenharmony_ci#endif 10667db96d56Sopenharmony_ci#ifdef TIOCGWINSZ 10677db96d56Sopenharmony_ci {"TIOCGWINSZ", TIOCGWINSZ}, 10687db96d56Sopenharmony_ci#endif 10697db96d56Sopenharmony_ci#ifdef TIOCINQ 10707db96d56Sopenharmony_ci {"TIOCINQ", TIOCINQ}, 10717db96d56Sopenharmony_ci#endif 10727db96d56Sopenharmony_ci#ifdef TIOCLINUX 10737db96d56Sopenharmony_ci {"TIOCLINUX", TIOCLINUX}, 10747db96d56Sopenharmony_ci#endif 10757db96d56Sopenharmony_ci#ifdef TIOCMBIC 10767db96d56Sopenharmony_ci {"TIOCMBIC", TIOCMBIC}, 10777db96d56Sopenharmony_ci#endif 10787db96d56Sopenharmony_ci#ifdef TIOCMBIS 10797db96d56Sopenharmony_ci {"TIOCMBIS", TIOCMBIS}, 10807db96d56Sopenharmony_ci#endif 10817db96d56Sopenharmony_ci#ifdef TIOCMGET 10827db96d56Sopenharmony_ci {"TIOCMGET", TIOCMGET}, 10837db96d56Sopenharmony_ci#endif 10847db96d56Sopenharmony_ci#ifdef TIOCMIWAIT 10857db96d56Sopenharmony_ci {"TIOCMIWAIT", TIOCMIWAIT}, 10867db96d56Sopenharmony_ci#endif 10877db96d56Sopenharmony_ci#ifdef TIOCMSET 10887db96d56Sopenharmony_ci {"TIOCMSET", TIOCMSET}, 10897db96d56Sopenharmony_ci#endif 10907db96d56Sopenharmony_ci#ifdef TIOCM_CAR 10917db96d56Sopenharmony_ci {"TIOCM_CAR", TIOCM_CAR}, 10927db96d56Sopenharmony_ci#endif 10937db96d56Sopenharmony_ci#ifdef TIOCM_CD 10947db96d56Sopenharmony_ci {"TIOCM_CD", TIOCM_CD}, 10957db96d56Sopenharmony_ci#endif 10967db96d56Sopenharmony_ci#ifdef TIOCM_CTS 10977db96d56Sopenharmony_ci {"TIOCM_CTS", TIOCM_CTS}, 10987db96d56Sopenharmony_ci#endif 10997db96d56Sopenharmony_ci#ifdef TIOCM_DSR 11007db96d56Sopenharmony_ci {"TIOCM_DSR", TIOCM_DSR}, 11017db96d56Sopenharmony_ci#endif 11027db96d56Sopenharmony_ci#ifdef TIOCM_DTR 11037db96d56Sopenharmony_ci {"TIOCM_DTR", TIOCM_DTR}, 11047db96d56Sopenharmony_ci#endif 11057db96d56Sopenharmony_ci#ifdef TIOCM_LE 11067db96d56Sopenharmony_ci {"TIOCM_LE", TIOCM_LE}, 11077db96d56Sopenharmony_ci#endif 11087db96d56Sopenharmony_ci#ifdef TIOCM_RI 11097db96d56Sopenharmony_ci {"TIOCM_RI", TIOCM_RI}, 11107db96d56Sopenharmony_ci#endif 11117db96d56Sopenharmony_ci#ifdef TIOCM_RNG 11127db96d56Sopenharmony_ci {"TIOCM_RNG", TIOCM_RNG}, 11137db96d56Sopenharmony_ci#endif 11147db96d56Sopenharmony_ci#ifdef TIOCM_RTS 11157db96d56Sopenharmony_ci {"TIOCM_RTS", TIOCM_RTS}, 11167db96d56Sopenharmony_ci#endif 11177db96d56Sopenharmony_ci#ifdef TIOCM_SR 11187db96d56Sopenharmony_ci {"TIOCM_SR", TIOCM_SR}, 11197db96d56Sopenharmony_ci#endif 11207db96d56Sopenharmony_ci#ifdef TIOCM_ST 11217db96d56Sopenharmony_ci {"TIOCM_ST", TIOCM_ST}, 11227db96d56Sopenharmony_ci#endif 11237db96d56Sopenharmony_ci#ifdef TIOCNOTTY 11247db96d56Sopenharmony_ci {"TIOCNOTTY", TIOCNOTTY}, 11257db96d56Sopenharmony_ci#endif 11267db96d56Sopenharmony_ci#ifdef TIOCNXCL 11277db96d56Sopenharmony_ci {"TIOCNXCL", TIOCNXCL}, 11287db96d56Sopenharmony_ci#endif 11297db96d56Sopenharmony_ci#ifdef TIOCOUTQ 11307db96d56Sopenharmony_ci {"TIOCOUTQ", TIOCOUTQ}, 11317db96d56Sopenharmony_ci#endif 11327db96d56Sopenharmony_ci#ifdef TIOCPKT 11337db96d56Sopenharmony_ci {"TIOCPKT", TIOCPKT}, 11347db96d56Sopenharmony_ci#endif 11357db96d56Sopenharmony_ci#ifdef TIOCPKT_DATA 11367db96d56Sopenharmony_ci {"TIOCPKT_DATA", TIOCPKT_DATA}, 11377db96d56Sopenharmony_ci#endif 11387db96d56Sopenharmony_ci#ifdef TIOCPKT_DOSTOP 11397db96d56Sopenharmony_ci {"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP}, 11407db96d56Sopenharmony_ci#endif 11417db96d56Sopenharmony_ci#ifdef TIOCPKT_FLUSHREAD 11427db96d56Sopenharmony_ci {"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD}, 11437db96d56Sopenharmony_ci#endif 11447db96d56Sopenharmony_ci#ifdef TIOCPKT_FLUSHWRITE 11457db96d56Sopenharmony_ci {"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE}, 11467db96d56Sopenharmony_ci#endif 11477db96d56Sopenharmony_ci#ifdef TIOCPKT_NOSTOP 11487db96d56Sopenharmony_ci {"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP}, 11497db96d56Sopenharmony_ci#endif 11507db96d56Sopenharmony_ci#ifdef TIOCPKT_START 11517db96d56Sopenharmony_ci {"TIOCPKT_START", TIOCPKT_START}, 11527db96d56Sopenharmony_ci#endif 11537db96d56Sopenharmony_ci#ifdef TIOCPKT_STOP 11547db96d56Sopenharmony_ci {"TIOCPKT_STOP", TIOCPKT_STOP}, 11557db96d56Sopenharmony_ci#endif 11567db96d56Sopenharmony_ci#ifdef TIOCSCTTY 11577db96d56Sopenharmony_ci {"TIOCSCTTY", TIOCSCTTY}, 11587db96d56Sopenharmony_ci#endif 11597db96d56Sopenharmony_ci#ifdef TIOCSERCONFIG 11607db96d56Sopenharmony_ci {"TIOCSERCONFIG", TIOCSERCONFIG}, 11617db96d56Sopenharmony_ci#endif 11627db96d56Sopenharmony_ci#ifdef TIOCSERGETLSR 11637db96d56Sopenharmony_ci {"TIOCSERGETLSR", TIOCSERGETLSR}, 11647db96d56Sopenharmony_ci#endif 11657db96d56Sopenharmony_ci#ifdef TIOCSERGETMULTI 11667db96d56Sopenharmony_ci {"TIOCSERGETMULTI", TIOCSERGETMULTI}, 11677db96d56Sopenharmony_ci#endif 11687db96d56Sopenharmony_ci#ifdef TIOCSERGSTRUCT 11697db96d56Sopenharmony_ci {"TIOCSERGSTRUCT", TIOCSERGSTRUCT}, 11707db96d56Sopenharmony_ci#endif 11717db96d56Sopenharmony_ci#ifdef TIOCSERGWILD 11727db96d56Sopenharmony_ci {"TIOCSERGWILD", TIOCSERGWILD}, 11737db96d56Sopenharmony_ci#endif 11747db96d56Sopenharmony_ci#ifdef TIOCSERSETMULTI 11757db96d56Sopenharmony_ci {"TIOCSERSETMULTI", TIOCSERSETMULTI}, 11767db96d56Sopenharmony_ci#endif 11777db96d56Sopenharmony_ci#ifdef TIOCSERSWILD 11787db96d56Sopenharmony_ci {"TIOCSERSWILD", TIOCSERSWILD}, 11797db96d56Sopenharmony_ci#endif 11807db96d56Sopenharmony_ci#ifdef TIOCSER_TEMT 11817db96d56Sopenharmony_ci {"TIOCSER_TEMT", TIOCSER_TEMT}, 11827db96d56Sopenharmony_ci#endif 11837db96d56Sopenharmony_ci#ifdef TIOCSETD 11847db96d56Sopenharmony_ci {"TIOCSETD", TIOCSETD}, 11857db96d56Sopenharmony_ci#endif 11867db96d56Sopenharmony_ci#ifdef TIOCSLCKTRMIOS 11877db96d56Sopenharmony_ci {"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS}, 11887db96d56Sopenharmony_ci#endif 11897db96d56Sopenharmony_ci#ifdef TIOCSPGRP 11907db96d56Sopenharmony_ci {"TIOCSPGRP", TIOCSPGRP}, 11917db96d56Sopenharmony_ci#endif 11927db96d56Sopenharmony_ci#ifdef TIOCSSERIAL 11937db96d56Sopenharmony_ci {"TIOCSSERIAL", TIOCSSERIAL}, 11947db96d56Sopenharmony_ci#endif 11957db96d56Sopenharmony_ci#ifdef TIOCSSIZE 11967db96d56Sopenharmony_ci {"TIOCSSIZE", TIOCSSIZE}, 11977db96d56Sopenharmony_ci#endif 11987db96d56Sopenharmony_ci#ifdef TIOCSSOFTCAR 11997db96d56Sopenharmony_ci {"TIOCSSOFTCAR", TIOCSSOFTCAR}, 12007db96d56Sopenharmony_ci#endif 12017db96d56Sopenharmony_ci#ifdef TIOCSTI 12027db96d56Sopenharmony_ci {"TIOCSTI", TIOCSTI}, 12037db96d56Sopenharmony_ci#endif 12047db96d56Sopenharmony_ci#ifdef TIOCSWINSZ 12057db96d56Sopenharmony_ci {"TIOCSWINSZ", TIOCSWINSZ}, 12067db96d56Sopenharmony_ci#endif 12077db96d56Sopenharmony_ci#ifdef TIOCTTYGSTRUCT 12087db96d56Sopenharmony_ci {"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT}, 12097db96d56Sopenharmony_ci#endif 12107db96d56Sopenharmony_ci 12117db96d56Sopenharmony_ci /* sentinel */ 12127db96d56Sopenharmony_ci {NULL, 0} 12137db96d56Sopenharmony_ci}; 12147db96d56Sopenharmony_ci 12157db96d56Sopenharmony_cistatic int termiosmodule_traverse(PyObject *m, visitproc visit, void *arg) { 12167db96d56Sopenharmony_ci Py_VISIT(get_termios_state(m)->TermiosError); 12177db96d56Sopenharmony_ci return 0; 12187db96d56Sopenharmony_ci} 12197db96d56Sopenharmony_ci 12207db96d56Sopenharmony_cistatic int termiosmodule_clear(PyObject *m) { 12217db96d56Sopenharmony_ci Py_CLEAR(get_termios_state(m)->TermiosError); 12227db96d56Sopenharmony_ci return 0; 12237db96d56Sopenharmony_ci} 12247db96d56Sopenharmony_ci 12257db96d56Sopenharmony_cistatic void termiosmodule_free(void *m) { 12267db96d56Sopenharmony_ci termiosmodule_clear((PyObject *)m); 12277db96d56Sopenharmony_ci} 12287db96d56Sopenharmony_ci 12297db96d56Sopenharmony_cistatic int 12307db96d56Sopenharmony_citermios_exec(PyObject *mod) 12317db96d56Sopenharmony_ci{ 12327db96d56Sopenharmony_ci struct constant *constant = termios_constants; 12337db96d56Sopenharmony_ci termiosmodulestate *state = get_termios_state(mod); 12347db96d56Sopenharmony_ci state->TermiosError = PyErr_NewException("termios.error", NULL, NULL); 12357db96d56Sopenharmony_ci if (state->TermiosError == NULL) { 12367db96d56Sopenharmony_ci return -1; 12377db96d56Sopenharmony_ci } 12387db96d56Sopenharmony_ci Py_INCREF(state->TermiosError); 12397db96d56Sopenharmony_ci if (PyModule_AddObject(mod, "error", state->TermiosError) < 0) { 12407db96d56Sopenharmony_ci Py_DECREF(state->TermiosError); 12417db96d56Sopenharmony_ci return -1; 12427db96d56Sopenharmony_ci } 12437db96d56Sopenharmony_ci 12447db96d56Sopenharmony_ci while (constant->name != NULL) { 12457db96d56Sopenharmony_ci if (PyModule_AddIntConstant( 12467db96d56Sopenharmony_ci mod, constant->name, constant->value) < 0) { 12477db96d56Sopenharmony_ci return -1; 12487db96d56Sopenharmony_ci } 12497db96d56Sopenharmony_ci ++constant; 12507db96d56Sopenharmony_ci } 12517db96d56Sopenharmony_ci return 0; 12527db96d56Sopenharmony_ci} 12537db96d56Sopenharmony_ci 12547db96d56Sopenharmony_cistatic PyModuleDef_Slot termios_slots[] = { 12557db96d56Sopenharmony_ci {Py_mod_exec, termios_exec}, 12567db96d56Sopenharmony_ci {0, NULL} 12577db96d56Sopenharmony_ci}; 12587db96d56Sopenharmony_ci 12597db96d56Sopenharmony_cistatic struct PyModuleDef termiosmodule = { 12607db96d56Sopenharmony_ci PyModuleDef_HEAD_INIT, 12617db96d56Sopenharmony_ci .m_name = "termios", 12627db96d56Sopenharmony_ci .m_doc = termios__doc__, 12637db96d56Sopenharmony_ci .m_size = sizeof(termiosmodulestate), 12647db96d56Sopenharmony_ci .m_methods = termios_methods, 12657db96d56Sopenharmony_ci .m_slots = termios_slots, 12667db96d56Sopenharmony_ci .m_traverse = termiosmodule_traverse, 12677db96d56Sopenharmony_ci .m_clear = termiosmodule_clear, 12687db96d56Sopenharmony_ci .m_free = termiosmodule_free, 12697db96d56Sopenharmony_ci}; 12707db96d56Sopenharmony_ci 12717db96d56Sopenharmony_ciPyMODINIT_FUNC PyInit_termios(void) 12727db96d56Sopenharmony_ci{ 12737db96d56Sopenharmony_ci return PyModuleDef_Init(&termiosmodule); 12747db96d56Sopenharmony_ci} 1275