source: trunk/libs/newlib/src/newlib/libc/sys/sysvi386/tcline.c

Last change on this file was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.7 KB
Line 
1#define _NO_MACROS
2#include <sys/unistd.h>
3#include <sys/termios.h>
4#include <errno.h>
5
6int
7tcsendbreak (int fd, int dur) {
8        do {
9                if (_ioctl (fd, _TCSBRK, 0) == -1)
10                        return -1;
11        } while (dur--);
12        return 0;
13}
14
15int
16tcdrain (int fd) {
17        return _ioctl (fd, _TCSBRK, 1);
18}
19
20int
21tcflush(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
30int
31tcflow (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}
Note: See TracBrowser for help on using the repository browser.