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

#include "Python.h"

#define PyInit_termios inittermios

#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

static char 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;
}

static char 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 = PyString_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;
}

static char 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 (PyString_Check(v) && PyString_Size(v) == 1)
			mode.c_cc[i] = (cc_t) * PyString_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;
}

static char 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;
}

static char 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;
}

static char 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;
}

static char 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
	{"ONLCR", ONLCR},
#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
	{"VEOL2", VEOL2},


#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}
};


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

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

	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;
	}
}
