func tiosTounix(ut *unix.Termios) *unix.Termios {
	return &unix.Termios{
		Iflag: ut.Iflag,
		Oflag: ut.Oflag,
		Cflag: ut.Cflag,
		Lflag: ut.Lflag,
		Cc:    ut.Cc,
	}
}
tiosTounix copies a x/sys/unix.Termios to a unix.Termios.
package termios
import "C"
import (
	"golang.org/x/sys/unix"
	"unsafe"
)
const (
	TCSETS  = 0x5402
	TCSETSW = 0x5403
	TCSETSF = 0x5404
	TCSBRK  = 0x5409
	TCSBRKP = 0x5425
	IXON    = 0x00000400
	IXANY   = 0x00000800
	IXOFF   = 0x00001000
	CRTSCTS = 0x80000000
)
func Tcgetattr(fd uintptr) (*unix.Termios, error) {
	return unix.IoctlGetTermios(int(fd), unix.TCGETS)
}
func Tcsetattr(fd, action uintptr, argp *unix.Termios) error {
	return unix.IoctlSetTermios(int(fd), uint(action), tiosToUnix(argp))
}
func Tcsendbreak(fd uintptr, duration int) error {
	return ioctl(fd, TCSBRKP, uintptr(duration))
}
func Tcdrain(fd uintptr) error {
	var attr unix.Termios
	if err := Tcgetattr(fd, &attr); err != nil {
		return err
	}
	return Tcsetattr(fd, TCSADRAIN, &attr)
}
func Tcflush(fd, selector uintptr) error {
	return ioctl(fd, unix.TCFLSH, selector)
}
func Tiocinq(fd uintptr) (int, error) {
	return unix.IoctlGetInt(int(fd), unix.FIORDCHK)
}
func Cfgetispeed(attr *unix.Termios) uint32 {
	solTermios := tiosToUnix(attr)
	return uint32(C.cfgetispeed((*C.termios_t)(unsafe.Pointer(solTermios))))
}
func Cfsetispeed(attr *unix.Termios, speed uintptr) error {
	solTermios := tiosToUnix(attr)
	_, err := C.cfsetispeed((*C.termios_t)(unsafe.Pointer(solTermios)), C.speed_t(speed))
	return err
}
func Cfgetospeed(attr *unix.Termios) uint32 {
	solTermios := tiosToUnix(attr)
	return uint32(C.cfgetospeed((*C.termios_t)(unsafe.Pointer(solTermios))))
}
func Cfsetospeed(attr *unix.Termios, speed uintptr) error {
	solTermios := tiosToUnix(attr)
	_, err := C.cfsetospeed((*C.termios_t)(unsafe.Pointer(solTermios)), C.speed_t(speed))
	return err
}
func tiosToUnix(st *unix.Termios) *unix.Termios {
	return &unix.Termios{
		Iflag: st.Iflag,
		Oflag: st.Oflag,
		Cflag: st.Cflag,
		Lflag: st.Lflag,
		Cc:    st.Cc,
	}
}