/* termiosmodule.c -- POSIX terminal I/O module implementation.  */

#include "Python.h"

#define PyInit_termios inittermios

/* Apparently, on SGI, termios.h won't define CTRL if _XOPEN_SOURCE
   is defined, so we define it here. */
#if defined(__sgi)
#define CTRL(c) ((c)&037)
#endif

#include <termios.h>
#ifdef __osf__
/* On OSF, sys/ioctl.h requires that struct termio already be defined,
 * so this needs to be included first on that platform. */
#include <termio.h>
#endif
#include <sys/ioctl.h>

/* HP-UX requires that this be included to pick up MDCD, MCTS, MDSR,
 * MDTR, MRI, and MRTS (appearantly used internally by some things
 * defined as macros; these are not used here directly).
 */
#ifdef HAVE_SYS_MODEM_H
#include <sys/modem.h>
#endif
/* HP-UX requires that this be included to pick up TIOCGPGRP and friends */
#ifdef HAVE_SYS_BSDTTY_H
#include <sys/bsdtty.h>
#endif

PyDoc_STRVAR(termios__doc__,
"This module provides an interface to the Posix calls for tty I/O control.\n\
For a complete description of these calls, see the Posix or Unix manual\n\
pages. It is only available for those Unix versions that support Posix\n\
termios style tty I/O control.\n\
\n\
All functions in this module take a file descriptor fd as their first\n\
argument. This can be an integer file descriptor, such as returned by\n\
sys.stdin.fileno(), or a file object, such as sys.stdin itself.");

static PyObject *TermiosError;

static int fdconv(PyObject* obj, void* p)
{
	int fd;

	fd = PyObject_AsFileDescriptor(obj);
	if (fd >= 0) {
		*(int*)p = fd;
		return 1;
	}
	return 0;
}

PyDoc_STRVAR(termios_tcgetattr__doc__,
"tcgetattr(fd) -> list_of_attrs\n\
\n\
Get the tty attributes for file descriptor fd, as follows:\n\
[iflag, oflag, cflag, lflag, ispeed, ospeed, cc] where cc is a list\n\
of the tty special characters (each a string of length 1, except the items\n\
with indices VMIN and VTIME, which are integers when these fields are\n\
defined).  The interpretation of the flags and the speeds as well as the\n\
indexing in the cc array must be done using the symbolic constants defined\n\
in this module.");

static PyObject *
termios_tcgetattr(PyObject *self, PyObject *args)
{
	int fd;
	struct termios mode;
	PyObject *cc;
	speed_t ispeed, ospeed;
	PyObject *v;
	int i;
	char ch;

	if (!PyArg_ParseTuple(args, "O&:tcgetattr", 
			      fdconv, (void*)&fd))
		return NULL;

	if (tcgetattr(fd, &mode) == -1)
		return PyErr_SetFromErrno(TermiosError);

	ispeed = cfgetispeed(&mode);
	ospeed = cfgetospeed(&mode);

	cc = PyList_New(NCCS);
	if (cc == NULL)
		return NULL;
	for (i = 0; i < NCCS; i++) {
		ch = (char)mode.c_cc[i];
		v = PyBytes_FromStringAndSize(&ch, 1);
		if (v == NULL)
			goto err;
		PyList_SetItem(cc, i, v);
	}

	/* Convert the MIN and TIME slots to integer.  On some systems, the
	   MIN and TIME slots are the same as the EOF and EOL slots.  So we
	   only do this in noncanonical input mode.  */
	if ((mode.c_lflag & ICANON) == 0) {
		v = PyInt_FromLong((long)mode.c_cc[VMIN]);
		if (v == NULL)
			goto err;
		PyList_SetItem(cc, VMIN, v);
		v = PyInt_FromLong((long)mode.c_cc[VTIME]);
		if (v == NULL)
			goto err;
		PyList_SetItem(cc, VTIME, v);
	}

	if (!(v = PyList_New(7)))
		goto err;

	PyList_SetItem(v, 0, PyInt_FromLong((long)mode.c_iflag));
	PyList_SetItem(v, 1, PyInt_FromLong((long)mode.c_oflag));
	PyList_SetItem(v, 2, PyInt_FromLong((long)mode.c_cflag));
	PyList_SetItem(v, 3, PyInt_FromLong((long)mode.c_lflag));
	PyList_SetItem(v, 4, PyInt_FromLong((long)ispeed));
	PyList_SetItem(v, 5, PyInt_FromLong((long)ospeed));
	PyList_SetItem(v, 6, cc);
	if (PyErr_Occurred()){
		Py_DECREF(v);
		goto err;
	}
	return v;
  err:
	Py_DECREF(cc);
	return NULL;
}

PyDoc_STRVAR(termios_tcsetattr__doc__,
"tcsetattr(fd, when, attributes) -> None\n\
\n\
Set the tty attributes for file descriptor fd.\n\
The attributes to be set are taken from the attributes argument, which\n\
is a list like the one returned by tcgetattr(). The when argument\n\
determines when the attributes are changed: termios.TCSANOW to\n\
change immediately, termios.TCSADRAIN to change after transmitting all\n\
queued output, or termios.TCSAFLUSH to change after transmitting all\n\
queued output and discarding all queued input. ");

static PyObject *
termios_tcsetattr(PyObject *self, PyObject *args)
{
	int fd, when;
	struct termios mode;
	speed_t ispeed, ospeed;
	PyObject *term, *cc, *v;
	int i;

	if (!PyArg_ParseTuple(args, "O&iO:tcsetattr", 
			      fdconv, &fd, &when, &term))
		return NULL;
	if (!PyList_Check(term) || PyList_Size(term) != 7) {
		PyErr_SetString(PyExc_TypeError, 
			     "tcsetattr, arg 3: must be 7 element list");
		return NULL;
	}

	/* Get the old mode, in case there are any hidden fields... */
	if (tcgetattr(fd, &mode) == -1)
		return PyErr_SetFromErrno(TermiosError);
	mode.c_iflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 0));
	mode.c_oflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 1));
	mode.c_cflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 2));
	mode.c_lflag = (tcflag_t) PyInt_AsLong(PyList_GetItem(term, 3));
	ispeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 4));
	ospeed = (speed_t) PyInt_AsLong(PyList_GetItem(term, 5));
	cc = PyList_GetItem(term, 6);
	if (PyErr_Occurred())
		return NULL;

	if (!PyList_Check(cc) || PyList_Size(cc) != NCCS) {
		PyErr_Format(PyExc_TypeError, 
			"tcsetattr: attributes[6] must be %d element list",
			     NCCS);
		return NULL;
	}

	for (i = 0; i < NCCS; i++) {
		v = PyList_GetItem(cc, i);

		if (PyBytes_Check(v) && PyBytes_Size(v) == 1)
			mode.c_cc[i] = (cc_t) * PyBytes_AsString(v);
		else if (PyInt_Check(v))
			mode.c_cc[i] = (cc_t) PyInt_AsLong(v);
		else {
			PyErr_SetString(PyExc_TypeError, 
     "tcsetattr: elements of attributes must be characters or integers");
			return NULL;
		}
	}

	if (cfsetispeed(&mode, (speed_t) ispeed) == -1)
		return PyErr_SetFromErrno(TermiosError);
	if (cfsetospeed(&mode, (speed_t) ospeed) == -1)
		return PyErr_SetFromErrno(TermiosError);
	if (tcsetattr(fd, when, &mode) == -1)
		return PyErr_SetFromErrno(TermiosError);

	Py_INCREF(Py_None);
	return Py_None;
}

PyDoc_STRVAR(termios_tcsendbreak__doc__,
"tcsendbreak(fd, duration) -> None\n\
\n\
Send a break on file descriptor fd.\n\
A zero duration sends a break for 0.25-0.5 seconds; a nonzero duration\n\
has a system dependent meaning.");

static PyObject *
termios_tcsendbreak(PyObject *self, PyObject *args)
{
	int fd, duration;

	if (!PyArg_ParseTuple(args, "O&i:tcsendbreak", 
			      fdconv, &fd, &duration))
		return NULL;
	if (tcsendbreak(fd, duration) == -1)
		return PyErr_SetFromErrno(TermiosError);

	Py_INCREF(Py_None);
	return Py_None;
}

PyDoc_STRVAR(termios_tcdrain__doc__,
"tcdrain(fd) -> None\n\
\n\
Wait until all output written to file descriptor fd has been transmitted.");

static PyObject *
termios_tcdrain(PyObject *self, PyObject *args)
{
	int fd;

	if (!PyArg_ParseTuple(args, "O&:tcdrain", 
			      fdconv, &fd))
		return NULL;
	if (tcdrain(fd) == -1)
		return PyErr_SetFromErrno(TermiosError);

	Py_INCREF(Py_None);
	return Py_None;
}

PyDoc_STRVAR(termios_tcflush__doc__,
"tcflush(fd, queue) -> None\n\
\n\
Discard queued data on file descriptor fd.\n\
The queue selector specifies which queue: termios.TCIFLUSH for the input\n\
queue, termios.TCOFLUSH for the output queue, or termios.TCIOFLUSH for\n\
both queues. ");

static PyObject *
termios_tcflush(PyObject *self, PyObject *args)
{
	int fd, queue;

	if (!PyArg_ParseTuple(args, "O&i:tcflush", 
			      fdconv, &fd, &queue))
		return NULL;
	if (tcflush(fd, queue) == -1)
		return PyErr_SetFromErrno(TermiosError);

	Py_INCREF(Py_None);
	return Py_None;
}

PyDoc_STRVAR(termios_tcflow__doc__,
"tcflow(fd, action) -> None\n\
\n\
Suspend or resume input or output on file descriptor fd.\n\
The action argument can be termios.TCOOFF to suspend output,\n\
termios.TCOON to restart output, termios.TCIOFF to suspend input,\n\
or termios.TCION to restart input.");

static PyObject *
termios_tcflow(PyObject *self, PyObject *args)
{
	int fd, action;

	if (!PyArg_ParseTuple(args, "O&i:tcflow", 
			      fdconv, &fd, &action))
		return NULL;
	if (tcflow(fd, action) == -1)
		return PyErr_SetFromErrno(TermiosError);

	Py_INCREF(Py_None);
	return Py_None;
}

static PyMethodDef termios_methods[] =
{
	{"tcgetattr", termios_tcgetattr, 
	 METH_VARARGS, termios_tcgetattr__doc__},
	{"tcsetattr", termios_tcsetattr, 
	 METH_VARARGS, termios_tcsetattr__doc__},
	{"tcsendbreak", termios_tcsendbreak, 
	 METH_VARARGS, termios_tcsendbreak__doc__},
	{"tcdrain", termios_tcdrain, 
	 METH_VARARGS, termios_tcdrain__doc__},
	{"tcflush", termios_tcflush, 
	 METH_VARARGS, termios_tcflush__doc__},
	{"tcflow", termios_tcflow, 
	 METH_VARARGS, termios_tcflow__doc__},
	{NULL, NULL}
};


#if defined(VSWTCH) && !defined(VSWTC)
#define VSWTC VSWTCH
#endif

#if defined(VSWTC) && !defined(VSWTCH)
#define VSWTCH VSWTC
#endif

static struct constant {
	char *name;
	long value;
} termios_constants[] = {
	/* cfgetospeed(), cfsetospeed() constants */
	{"B0", B0},
	{"B50", B50},
	{"B75", B75},
	{"B110", B110},
	{"B134", B134},
	{"B150", B150},
	{"B200", B200},
	{"B300", B300},
	{"B600", B600},
	{"B1200", B1200},
	{"B1800", B1800},
	{"B2400", B2400},
	{"B4800", B4800},
	{"B9600", B9600},
	{"B19200", B19200},
	{"B38400", B38400},
#ifdef B57600
	{"B57600", B57600},
#endif
#ifdef B115200
	{"B115200", B115200},
#endif
#ifdef B230400
	{"B230400", B230400},
#endif
#ifdef CBAUDEX
	{"CBAUDEX", CBAUDEX},
#endif

	/* tcsetattr() constants */
	{"TCSANOW", TCSANOW},
	{"TCSADRAIN", TCSADRAIN},
	{"TCSAFLUSH", TCSAFLUSH},

	/* tcflush() constants */
	{"TCIFLUSH", TCIFLUSH},
	{"TCOFLUSH", TCOFLUSH},
	{"TCIOFLUSH", TCIOFLUSH},

	/* tcflow() constants */
	{"TCOOFF", TCOOFF},
	{"TCOON", TCOON},
	{"TCIOFF", TCIOFF},
	{"TCION", TCION},

	/* struct termios.c_iflag constants */
	{"IGNBRK", IGNBRK},
	{"BRKINT", BRKINT},
	{"IGNPAR", IGNPAR},
	{"PARMRK", PARMRK},
	{"INPCK", INPCK},
	{"ISTRIP", ISTRIP},
	{"INLCR", INLCR},
	{"IGNCR", IGNCR},
	{"ICRNL", ICRNL},
#ifdef IUCLC
	{"IUCLC", IUCLC},
#endif
	{"IXON", IXON},
	{"IXANY", IXANY},
	{"IXOFF", IXOFF},
#ifdef IMAXBEL
	{"IMAXBEL", IMAXBEL},
#endif

	/* struct termios.c_oflag constants */
	{"OPOST", OPOST},
#ifdef OLCUC
	{"OLCUC", OLCUC},
#endif
#ifdef ONLCR
	{"ONLCR", ONLCR},
#endif
#ifdef OCRNL
	{"OCRNL", OCRNL},
#endif
#ifdef ONOCR
	{"ONOCR", ONOCR},
#endif
#ifdef ONLRET
	{"ONLRET", ONLRET},
#endif
#ifdef OFILL
	{"OFILL", OFILL},
#endif
#ifdef OFDEL
	{"OFDEL", OFDEL},
#endif
#ifdef NLDLY
	{"NLDLY", NLDLY},
#endif
#ifdef CRDLY
	{"CRDLY", CRDLY},
#endif
#ifdef TABDLY
	{"TABDLY", TABDLY},
#endif
#ifdef BSDLY
	{"BSDLY", BSDLY},
#endif
#ifdef VTDLY
	{"VTDLY", VTDLY},
#endif
#ifdef FFDLY
	{"FFDLY", FFDLY},
#endif

	/* struct termios.c_oflag-related values (delay mask) */
#ifdef NL0
	{"NL0", NL0},
#endif
#ifdef NL1
	{"NL1", NL1},
#endif
#ifdef CR0
	{"CR0", CR0},
#endif
#ifdef CR1
	{"CR1", CR1},
#endif
#ifdef CR2
	{"CR2", CR2},
#endif
#ifdef CR3
	{"CR3", CR3},
#endif
#ifdef TAB0
	{"TAB0", TAB0},
#endif
#ifdef TAB1
	{"TAB1", TAB1},
#endif
#ifdef TAB2
	{"TAB2", TAB2},
#endif
#ifdef TAB3
	{"TAB3", TAB3},
#endif
#ifdef XTABS
	{"XTABS", XTABS},
#endif
#ifdef BS0
	{"BS0", BS0},
#endif
#ifdef BS1
	{"BS1", BS1},
#endif
#ifdef VT0
	{"VT0", VT0},
#endif
#ifdef VT1
	{"VT1", VT1},
#endif
#ifdef FF0
	{"FF0", FF0},
#endif
#ifdef FF1
	{"FF1", FF1},
#endif

	/* struct termios.c_cflag constants */
	{"CSIZE", CSIZE},
	{"CSTOPB", CSTOPB},
	{"CREAD", CREAD},
	{"PARENB", PARENB},
	{"PARODD", PARODD},
	{"HUPCL", HUPCL},
	{"CLOCAL", CLOCAL},
#ifdef CIBAUD
	{"CIBAUD", CIBAUD},
#endif
#ifdef CRTSCTS
	{"CRTSCTS", (long)CRTSCTS},
#endif

	/* struct termios.c_cflag-related values (character size) */
	{"CS5", CS5},
	{"CS6", CS6},
	{"CS7", CS7},
	{"CS8", CS8},

	/* struct termios.c_lflag constants */
	{"ISIG", ISIG},
	{"ICANON", ICANON},
#ifdef XCASE
	{"XCASE", XCASE},
#endif
	{"ECHO", ECHO},
	{"ECHOE", ECHOE},
	{"ECHOK", ECHOK},
	{"ECHONL", ECHONL},
#ifdef ECHOCTL
	{"ECHOCTL", ECHOCTL},
#endif
#ifdef ECHOPRT
	{"ECHOPRT", ECHOPRT},
#endif
#ifdef ECHOKE
	{"ECHOKE", ECHOKE},
#endif
#ifdef FLUSHO
	{"FLUSHO", FLUSHO},
#endif
	{"NOFLSH", NOFLSH},
	{"TOSTOP", TOSTOP},
#ifdef PENDIN
	{"PENDIN", PENDIN},
#endif
	{"IEXTEN", IEXTEN},

	/* indexes into the control chars array returned by tcgetattr() */
	{"VINTR", VINTR},
	{"VQUIT", VQUIT},
	{"VERASE", VERASE},
	{"VKILL", VKILL},
	{"VEOF", VEOF},
	{"VTIME", VTIME},
	{"VMIN", VMIN},
#ifdef VSWTC
	/* The #defines above ensure that if either is defined, both are,
         * but both may be omitted by the system headers.  ;-(  */
	{"VSWTC", VSWTC},
	{"VSWTCH", VSWTCH},
#endif
	{"VSTART", VSTART},
	{"VSTOP", VSTOP},
	{"VSUSP", VSUSP},
	{"VEOL", VEOL},
#ifdef VREPRINT
	{"VREPRINT", VREPRINT},
#endif
#ifdef VDISCARD
	{"VDISCARD", VDISCARD},
#endif
#ifdef VWERASE
	{"VWERASE", VWERASE},
#endif
#ifdef VLNEXT
	{"VLNEXT", VLNEXT},
#endif
#ifdef VEOL2
	{"VEOL2", VEOL2},
#endif


#ifdef B460800
	{"B460800", B460800},
#endif
#ifdef CBAUD
	{"CBAUD", CBAUD},
#endif
#ifdef CDEL
	{"CDEL", CDEL},
#endif
#ifdef CDSUSP
	{"CDSUSP", CDSUSP},
#endif
#ifdef CEOF
	{"CEOF", CEOF},
#endif
#ifdef CEOL
	{"CEOL", CEOL},
#endif
#ifdef CEOL2
	{"CEOL2", CEOL2},
#endif
#ifdef CEOT
	{"CEOT", CEOT},
#endif
#ifdef CERASE
	{"CERASE", CERASE},
#endif
#ifdef CESC
	{"CESC", CESC},
#endif
#ifdef CFLUSH
	{"CFLUSH", CFLUSH},
#endif
#ifdef CINTR
	{"CINTR", CINTR},
#endif
#ifdef CKILL
	{"CKILL", CKILL},
#endif
#ifdef CLNEXT
	{"CLNEXT", CLNEXT},
#endif
#ifdef CNUL
	{"CNUL", CNUL},
#endif
#ifdef COMMON
	{"COMMON", COMMON},
#endif
#ifdef CQUIT
	{"CQUIT", CQUIT},
#endif
#ifdef CRPRNT
	{"CRPRNT", CRPRNT},
#endif
#ifdef CSTART
	{"CSTART", CSTART},
#endif
#ifdef CSTOP
	{"CSTOP", CSTOP},
#endif
#ifdef CSUSP
	{"CSUSP", CSUSP},
#endif
#ifdef CSWTCH
	{"CSWTCH", CSWTCH},
#endif
#ifdef CWERASE
	{"CWERASE", CWERASE},
#endif
#ifdef EXTA
	{"EXTA", EXTA},
#endif
#ifdef EXTB
	{"EXTB", EXTB},
#endif
#ifdef FIOASYNC
	{"FIOASYNC", FIOASYNC},
#endif
#ifdef FIOCLEX
	{"FIOCLEX", FIOCLEX},
#endif
#ifdef FIONBIO
	{"FIONBIO", FIONBIO},
#endif
#ifdef FIONCLEX
	{"FIONCLEX", FIONCLEX},
#endif
#ifdef FIONREAD
	{"FIONREAD", FIONREAD},
#endif
#ifdef IBSHIFT
	{"IBSHIFT", IBSHIFT},
#endif
#ifdef INIT_C_CC
	{"INIT_C_CC", INIT_C_CC},
#endif
#ifdef IOCSIZE_MASK
	{"IOCSIZE_MASK", IOCSIZE_MASK},
#endif
#ifdef IOCSIZE_SHIFT
	{"IOCSIZE_SHIFT", IOCSIZE_SHIFT},
#endif
#ifdef NCC
	{"NCC", NCC},
#endif
#ifdef NCCS
	{"NCCS", NCCS},
#endif
#ifdef NSWTCH
	{"NSWTCH", NSWTCH},
#endif
#ifdef N_MOUSE
	{"N_MOUSE", N_MOUSE},
#endif
#ifdef N_PPP
	{"N_PPP", N_PPP},
#endif
#ifdef N_SLIP
	{"N_SLIP", N_SLIP},
#endif
#ifdef N_STRIP
	{"N_STRIP", N_STRIP},
#endif
#ifdef N_TTY
	{"N_TTY", N_TTY},
#endif
#ifdef TCFLSH
	{"TCFLSH", TCFLSH},
#endif
#ifdef TCGETA
	{"TCGETA", TCGETA},
#endif
#ifdef TCGETS
	{"TCGETS", TCGETS},
#endif
#ifdef TCSBRK
	{"TCSBRK", TCSBRK},
#endif
#ifdef TCSBRKP
	{"TCSBRKP", TCSBRKP},
#endif
#ifdef TCSETA
	{"TCSETA", TCSETA},
#endif
#ifdef TCSETAF
	{"TCSETAF", TCSETAF},
#endif
#ifdef TCSETAW
	{"TCSETAW", TCSETAW},
#endif
#ifdef TCSETS
	{"TCSETS", TCSETS},
#endif
#ifdef TCSETSF
	{"TCSETSF", TCSETSF},
#endif
#ifdef TCSETSW
	{"TCSETSW", TCSETSW},
#endif
#ifdef TCXONC
	{"TCXONC", TCXONC},
#endif
#ifdef TIOCCONS
	{"TIOCCONS", TIOCCONS},
#endif
#ifdef TIOCEXCL
	{"TIOCEXCL", TIOCEXCL},
#endif
#ifdef TIOCGETD
	{"TIOCGETD", TIOCGETD},
#endif
#ifdef TIOCGICOUNT
	{"TIOCGICOUNT", TIOCGICOUNT},
#endif
#ifdef TIOCGLCKTRMIOS
	{"TIOCGLCKTRMIOS", TIOCGLCKTRMIOS},
#endif
#ifdef TIOCGPGRP
	{"TIOCGPGRP", TIOCGPGRP},
#endif
#ifdef TIOCGSERIAL
	{"TIOCGSERIAL", TIOCGSERIAL},
#endif
#ifdef TIOCGSOFTCAR
	{"TIOCGSOFTCAR", TIOCGSOFTCAR},
#endif
#ifdef TIOCGWINSZ
	{"TIOCGWINSZ", TIOCGWINSZ},
#endif
#ifdef TIOCINQ
	{"TIOCINQ", TIOCINQ},
#endif
#ifdef TIOCLINUX
	{"TIOCLINUX", TIOCLINUX},
#endif
#ifdef TIOCMBIC
	{"TIOCMBIC", TIOCMBIC},
#endif
#ifdef TIOCMBIS
	{"TIOCMBIS", TIOCMBIS},
#endif
#ifdef TIOCMGET
	{"TIOCMGET", TIOCMGET},
#endif
#ifdef TIOCMIWAIT
	{"TIOCMIWAIT", TIOCMIWAIT},
#endif
#ifdef TIOCMSET
	{"TIOCMSET", TIOCMSET},
#endif
#ifdef TIOCM_CAR
	{"TIOCM_CAR", TIOCM_CAR},
#endif
#ifdef TIOCM_CD
	{"TIOCM_CD", TIOCM_CD},
#endif
#ifdef TIOCM_CTS
	{"TIOCM_CTS", TIOCM_CTS},
#endif
#ifdef TIOCM_DSR
	{"TIOCM_DSR", TIOCM_DSR},
#endif
#ifdef TIOCM_DTR
	{"TIOCM_DTR", TIOCM_DTR},
#endif
#ifdef TIOCM_LE
	{"TIOCM_LE", TIOCM_LE},
#endif
#ifdef TIOCM_RI
	{"TIOCM_RI", TIOCM_RI},
#endif
#ifdef TIOCM_RNG
	{"TIOCM_RNG", TIOCM_RNG},
#endif
#ifdef TIOCM_RTS
	{"TIOCM_RTS", TIOCM_RTS},
#endif
#ifdef TIOCM_SR
	{"TIOCM_SR", TIOCM_SR},
#endif
#ifdef TIOCM_ST
	{"TIOCM_ST", TIOCM_ST},
#endif
#ifdef TIOCNOTTY
	{"TIOCNOTTY", TIOCNOTTY},
#endif
#ifdef TIOCNXCL
	{"TIOCNXCL", TIOCNXCL},
#endif
#ifdef TIOCOUTQ
	{"TIOCOUTQ", TIOCOUTQ},
#endif
#ifdef TIOCPKT
	{"TIOCPKT", TIOCPKT},
#endif
#ifdef TIOCPKT_DATA
	{"TIOCPKT_DATA", TIOCPKT_DATA},
#endif
#ifdef TIOCPKT_DOSTOP
	{"TIOCPKT_DOSTOP", TIOCPKT_DOSTOP},
#endif
#ifdef TIOCPKT_FLUSHREAD
	{"TIOCPKT_FLUSHREAD", TIOCPKT_FLUSHREAD},
#endif
#ifdef TIOCPKT_FLUSHWRITE
	{"TIOCPKT_FLUSHWRITE", TIOCPKT_FLUSHWRITE},
#endif
#ifdef TIOCPKT_NOSTOP
	{"TIOCPKT_NOSTOP", TIOCPKT_NOSTOP},
#endif
#ifdef TIOCPKT_START
	{"TIOCPKT_START", TIOCPKT_START},
#endif
#ifdef TIOCPKT_STOP
	{"TIOCPKT_STOP", TIOCPKT_STOP},
#endif
#ifdef TIOCSCTTY
	{"TIOCSCTTY", TIOCSCTTY},
#endif
#ifdef TIOCSERCONFIG
	{"TIOCSERCONFIG", TIOCSERCONFIG},
#endif
#ifdef TIOCSERGETLSR
	{"TIOCSERGETLSR", TIOCSERGETLSR},
#endif
#ifdef TIOCSERGETMULTI
	{"TIOCSERGETMULTI", TIOCSERGETMULTI},
#endif
#ifdef TIOCSERGSTRUCT
	{"TIOCSERGSTRUCT", TIOCSERGSTRUCT},
#endif
#ifdef TIOCSERGWILD
	{"TIOCSERGWILD", TIOCSERGWILD},
#endif
#ifdef TIOCSERSETMULTI
	{"TIOCSERSETMULTI", TIOCSERSETMULTI},
#endif
#ifdef TIOCSERSWILD
	{"TIOCSERSWILD", TIOCSERSWILD},
#endif
#ifdef TIOCSER_TEMT
	{"TIOCSER_TEMT", TIOCSER_TEMT},
#endif
#ifdef TIOCSETD
	{"TIOCSETD", TIOCSETD},
#endif
#ifdef TIOCSLCKTRMIOS
	{"TIOCSLCKTRMIOS", TIOCSLCKTRMIOS},
#endif
#ifdef TIOCSPGRP
	{"TIOCSPGRP", TIOCSPGRP},
#endif
#ifdef TIOCSSERIAL
	{"TIOCSSERIAL", TIOCSSERIAL},
#endif
#ifdef TIOCSSOFTCAR
	{"TIOCSSOFTCAR", TIOCSSOFTCAR},
#endif
#ifdef TIOCSTI
	{"TIOCSTI", TIOCSTI},
#endif
#ifdef TIOCSWINSZ
	{"TIOCSWINSZ", TIOCSWINSZ},
#endif
#ifdef TIOCTTYGSTRUCT
	{"TIOCTTYGSTRUCT", TIOCTTYGSTRUCT},
#endif

	/* sentinel */
	{NULL, 0}
};


PyMODINIT_FUNC
PyInit_termios(void)
{
	PyObject *m;
	struct constant *constant = termios_constants;

	m = Py_InitModule4("termios", termios_methods, termios__doc__,
                           (PyObject *)NULL, PYTHON_API_VERSION);
	if (m == NULL)
		return;

	if (TermiosError == NULL) {
		TermiosError = PyErr_NewException("termios.error", NULL, NULL);
	}
	Py_INCREF(TermiosError);
	PyModule_AddObject(m, "error", TermiosError);

	while (constant->name != NULL) {
		PyModule_AddIntConstant(m, constant->name, constant->value);
		++constant;
	}
}
