1 #define _NO_MACROS
2 #include <sys/unistd.h>
3 #include <sys/termios.h>
4 #include <errno.h>
5 
6 int
tcsendbreak(int fd,int dur)7 tcsendbreak (int fd, int dur) {
8 	do {
9 		if (_ioctl (fd, _TCSBRK, 0) == -1)
10 			return -1;
11 	} while (dur--);
12 	return 0;
13 }
14 
15 int
tcdrain(int fd)16 tcdrain (int fd) {
17 	return _ioctl (fd, _TCSBRK, 1);
18 }
19 
20 int
tcflush(int fd,int what)21 tcflush(int fd, int what) {
22 	return _ioctl (fd, _TCFLSH, what);
23 }
24 
25 /*
26  * I'm not positive about this function.  I *think* it's right,
27  * but I could be missing something.
28  */
29 
30 int
tcflow(int fd,int action)31 tcflow (int fd, int action) {
32 	struct termios t;
33 
34 	switch (action) {
35 	case TCOOFF:
36 	case TCOON:
37 		return _ioctl (fd, _TCXONC, action);
38 /*
39  * Here is where I'm not terribly certain.  1003.1 says:
40  * if action is TCIOFF, the system shall transmit a STOP
41  * character, which is intended to cause the terminal device
42  * to stop transmitting data to the system.  (Similarly for
43  * TCION.)
44  * I *assume* that means I find out what VSTOP for the
45  * terminal device is, and then write it.  1003.1 also does
46  * not say what happens if c_cc[VSTOP] is _POSIX_VDISABLE;
47  * I assume it should reaturn EINVAL, so that's what I do.
48  * Anyway, here's the code.  It might or might not be right.
49  */
50 	case TCIOFF:
51 		if (tcgetattr (fd, &t) == -1)
52 			return -1;
53 		if (tcgetattr (fd, &t) == -1)
54 			return -1;
55 #ifdef _POSIX_VDISABLE
56 		if (t.c_cc[VSTOP] == _POSIX_VDISABLE) {
57 			errno = EINVAL;
58 			return -1;
59 		}
60 #endif
61 		if (write (fd, &t.c_cc[VSTOP], 1) == 1)
62 			return 0;
63 		else
64 			return -1;
65 	case TCION:
66 		if (tcgetattr (fd, &t) == -1)
67 			return -1;
68 		if (tcgetattr (fd, &t) == -1)
69 			return -1;
70 #ifdef _POSIX_VDISABLE
71 		if (t.c_cc[VSTART] == _POSIX_VDISABLE) {
72 			errno = EINVAL;
73 			return -1;
74 		}
75 #endif
76 		if (write (fd, &t.c_cc[VSTART], 1) == 1)
77 			return 0;
78 		else
79 			return -1;
80 	default:
81 		errno = EINVAL;
82 		return -1;
83 	}
84 }
85