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