#include <u.h>
#include <libc.h>
#include <ureg.h>
#include "linuxsys.h"
#include "linux.h"
enum {
VEOF =0,
VEOL =1,
VEOL2 =2,
VERASE =3,
VWERASE =4,
VKILL =5,
VREPRINT =6,
VSWTC =7,
VINTR =8,
VQUIT =9,
VSUSP =10,
VSTART =12,
VSTOP =13,
VLNEXT =14,
VDISCARD =15,
VMIN =16,
VTIME =17,
/* c_iflag bits */
IGNBRK =0000001,
BRKINT =0000002,
IGNPAR =0000004,
PARMRK =0000010,
INPCK =0000020,
ISTRIP =0000040,
INLCR =0000100,
IGNCR =0000200,
ICRNL =0000400,
IXON =0001000,
IXOFF =0002000,
IXANY =0004000,
IUCLC =0010000,
IMAXBEL =0020000,
IUTF8 =0040000,
/* c_oflag bits */
OPOST =0000001,
ONLCR =0000002,
OLCUC =0000004,
OCRNL =0000010,
ONOCR =0000020,
ONLRET =0000040,
OFILL =00000100,
OFDEL =00000200,
NLDLY =00001400,
NL0 =00000000,
NL1 =00000400,
NL2 =00001000,
NL3 =00001400,
TABDLY =00006000,
TAB0 =00000000,
TAB1 =00002000,
TAB2 =00004000,
TAB3 =00006000,
CRDLY =00030000,
CR0 =00000000,
CR1 =00010000,
CR2 =00020000,
CR3 =00030000,
FFDLY =00040000,
FF0 =00000000,
FF1 =00040000,
BSDLY =00100000,
BS0 =00000000,
BS1 =00100000,
VTDLY =00200000,
VT0 =00000000,
VT1 =00200000,
XTABS =01000000,
/* c_cflag bit meaning */
CBAUD =0000037,
B0 =0000000,
B50 =0000001,
B75 =0000002,
B110 =0000003,
B134 =0000004,
B150 =0000005,
B200 =0000006,
B300 =0000007,
B600 =0000010,
B1200 =0000011,
B1800 =0000012,
B2400 =0000013,
B4800 =0000014,
B9600 =0000015,
B19200 =0000016,
B38400 =0000017,
EXTA =0000016,
EXTB =0000017,
CBAUDEX =0000000,
B57600 =00020,
B115200 =00021,
B230400 =00022,
B460800 =00023,
B500000 =00024,
B576000 =00025,
B921600 =00026,
B1000000 =00027,
B1152000 =00030,
B1500000 =00031,
B2000000 =00032,
B2500000 =00033,
B3000000 =00034,
B3500000 =00035,
B4000000 =00036,
CSIZE =00001400,
CS5 =00000000,
CS6 =00000400,
CS7 =00001000,
CS8 =00001400,
CSTOPB =00002000,
CREAD =00004000,
PARENB =00010000,
PARODD =00020000,
HUPCL =00040000,
CLOCAL =00100000,
CMSPAR =010000000000,
CRTSCTS =020000000000,
/* c_lflag bits */
ISIG =0x00000080,
ICANON =0x00000100,
XCASE =0x00004000,
ECHO =0x00000008,
ECHOE =0x00000002,
ECHOK =0x00000004,
ECHONL =0x00000010,
NOFLSH =0x80000000,
TOSTOP =0x00400000,
ECHOCTL =0x00000040,
ECHOPRT =0x00000020,
ECHOKE =0x00000001,
FLUSHO =0x00800000,
PENDIN =0x20000000,
IEXTEN =0x00000400,
/* Values for the ACTION argument to `tcflow'. */
TCOOFF =0,
TCOON =1,
TCIOFF =2,
TCION =3,
/* Values for the QUEUE_SELECTOR argument to `tcflush'. */
TCIFLUSH =0,
TCOFLUSH =1,
TCIOFLUSH =2,
/* Values for the OPTIONAL_ACTIONS argument to `tcsetattr'. */
TCSANOW =0,
TCSADRAIN =1,
TCSAFLUSH =2,
/* number of control characters */
NCCS =19,
};
struct termios {
uint c_iflag; /* input mode flags */
uint c_oflag; /* output mode flags */
uint c_cflag; /* control mode flags */
uint c_lflag; /* local mode flags */
uchar c_cc[NCCS]; /* control characters */
uchar c_line; /* line discipline (== c_cc[19]) */
uint c_ispeed; /* input speed */
uint c_ospeed; /* output speed */
};
static int
checktty(int fd)
{
Dir *d;
if((d = dirfstat(fd)) == nil)
return -EINVAL;
if(strcmp(d->name, "cons")){
free(d);
return -ENOTTY;
}
free(d);
return 0;
}
IOCTL(ioctl_TCGETS)
{
int r;
struct termios *tios;
if((r = checktty(fd)) < 0)
return r;
tios = (struct termios*)arg;
tios->c_iflag = IGNBRK | IUTF8;
tios->c_oflag = 0;
tios->c_cflag = CS8 | B4000000;
tios->c_lflag = ISIG;
memset(tios->c_cc, 0, sizeof(uchar)*NCCS);
tios->c_line = 0;
tios->c_ispeed = 4000000;
tios->c_ospeed = 4000000;
return 0;
}
IOCTL(ioctl_TCSETS)
{
int r;
if((r = checktty(fd)) < 0)
return r;
return 0;
}
|