xref: /inferno-os/emu/port/deveia-bsd.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1 /*
2  * BSD serial port control features not found in POSIX
3  * including modem line control and hardware flow control
4  */
5 
6 static struct flagmap lines[] = {
7         {"cts",         TIOCM_CTS},
8         {"dsr",         TIOCM_DSR},
9         {"ring",        TIOCM_RI},
10         {"dcd",         TIOCM_CD},
11         {"dtr",         TIOCM_DTR},
12         {"rts",         TIOCM_RTS},
13 	{0,		-1}
14 };
15 
16 static void
resxtra(int port,struct termios * ts)17 resxtra(int port, struct termios *ts)
18 {
19         int fd = eia[port].fd;
20 
21 	USED(ts);
22 
23         if(eia[port].dtr)
24 	        ioctl(fd, TIOCM_DTR, eia[port].dtr);
25 	if(eia[port].rts)
26 	        ioctl(fd, TIOCM_RTS, eia[port].rts);
27 	if(eia[port].cts)
28 	        ioctl(fd, TIOCM_CTS, eia[port].cts);
29 }
30 
31 static char *
rdxtra(int port,struct termios * ts,char * str)32 rdxtra(int port, struct termios *ts, char *str)
33 {
34 	int fd = eia[port].fd;
35 	int line;
36 //	struct flagmap *lp;
37 	char *s = str;
38 
39 	USED(ts);
40 
41 	if(ioctl(fd, TIOCMGET, &line) < 0)
42 		oserror();
43 
44 //	for(lp = lines; lp->str; lp++)
45 //	        if(line&lp->flag)
46 //		        s += sprint(s, " %s", lp->str);
47 
48 	return s;
49 }
50 
51 static char *
wrxtra(int port,struct termios * ts,char * cmd)52 wrxtra(int port, struct termios *ts, char *cmd)
53 {
54 	int fd = eia[port].fd;
55 	int n, r, flag, iocmd, *l;
56 
57 	USED(ts);
58 
59 	switch(*cmd) {
60 	case 'D':
61 	case 'd':
62 		flag = TIOCM_DTR;
63 		l = &eia[port].dtr;
64 		break;
65 	case 'R':
66 	case 'r':
67 		flag = TIOCM_RTS;
68 		l = &eia[port].rts;
69 		break;
70 	case 'M':
71 	case 'm':
72 		flag = TIOCM_CTS;
73 		l = &eia[port].cts;
74 		break;
75 	default:
76 		return nil;
77 	}
78 
79 	n = atoi(cmd+1);
80 	if(n)
81 		iocmd = TIOCMBIS;
82 	else
83 		iocmd = TIOCMBIC;
84 
85 	osenter();
86 	r = ioctl(fd, iocmd, &flag);
87 	osleave();
88 	if(r < 0)
89 		oserror();
90 
91 	eia[port].restore = 1;
92 	*l = iocmd;
93 
94 	return nil;
95 }
96