1 /*- 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * %sccs.include.redist.c% 6 */ 7 8 #if defined(LIBC_SCCS) && !defined(lint) 9 static char sccsid[] = "@(#)termios.c 8.1 (Berkeley) 06/04/93"; 10 #endif /* LIBC_SCCS and not lint */ 11 12 #include <sys/types.h> 13 #include <sys/ioctl.h> 14 #include <sys/tty.h> 15 #define KERNEL /* XXX - FREAD and FWRITE ifdef'd KERNEL*/ 16 #include <sys/fcntl.h> 17 #undef KERNEL 18 19 #include <errno.h> 20 #include <stdio.h> 21 #include <termios.h> 22 #include <unistd.h> 23 24 int 25 tcgetattr(fd, t) 26 int fd; 27 struct termios *t; 28 { 29 30 return (ioctl(fd, TIOCGETA, t)); 31 } 32 33 int 34 tcsetattr(fd, opt, t) 35 int fd, opt; 36 const struct termios *t; 37 { 38 struct termios localterm; 39 40 if (opt & TCSASOFT) { 41 localterm = *t; 42 localterm.c_cflag |= CIGNORE; 43 t = &localterm; 44 } 45 switch (opt & ~TCSASOFT) { 46 case TCSANOW: 47 return (ioctl(fd, TIOCSETA, t)); 48 case TCSADRAIN: 49 return (ioctl(fd, TIOCSETAW, t)); 50 case TCSAFLUSH: 51 return (ioctl(fd, TIOCSETAF, t)); 52 default: 53 errno = EINVAL; 54 return (-1); 55 } 56 } 57 58 int 59 #if __STDC__ 60 tcsetpgrp(int fd, pid_t pgrp) 61 #else 62 tcsetpgrp(fd, pgrp) 63 int fd; 64 pid_t pgrp; 65 #endif 66 { 67 int s; 68 69 s = pgrp; 70 return (ioctl(fd, TIOCSPGRP, &s)); 71 } 72 73 pid_t 74 tcgetpgrp(fd) 75 { 76 int s; 77 78 if (ioctl(fd, TIOCGPGRP, &s) < 0) 79 return ((pid_t)-1); 80 81 return ((pid_t)s); 82 } 83 84 speed_t 85 cfgetospeed(t) 86 const struct termios *t; 87 { 88 89 return (t->c_ospeed); 90 } 91 92 speed_t 93 cfgetispeed(t) 94 const struct termios *t; 95 { 96 97 return (t->c_ispeed); 98 } 99 100 int 101 cfsetospeed(t, speed) 102 struct termios *t; 103 speed_t speed; 104 { 105 106 t->c_ospeed = speed; 107 return (0); 108 } 109 110 int 111 cfsetispeed(t, speed) 112 struct termios *t; 113 speed_t speed; 114 { 115 116 t->c_ispeed = speed; 117 return (0); 118 } 119 120 int 121 cfsetspeed(t, speed) 122 struct termios *t; 123 speed_t speed; 124 { 125 126 t->c_ispeed = t->c_ospeed = speed; 127 return (0); 128 } 129 130 /* 131 * Make a pre-existing termios structure into "raw" mode: character-at-a-time 132 * mode with no characters interpreted, 8-bit data path. 133 */ 134 void 135 cfmakeraw(t) 136 struct termios *t; 137 { 138 139 t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); 140 t->c_oflag &= ~OPOST; 141 t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); 142 t->c_cflag &= ~(CSIZE|PARENB); 143 t->c_cflag |= CS8; 144 /* XXX set MIN/TIME */ 145 } 146 147 tcsendbreak(fd, len) 148 int fd, len; 149 { 150 struct timeval sleepytime; 151 152 sleepytime.tv_sec = 0; 153 sleepytime.tv_usec = 400000; 154 if (ioctl(fd, TIOCSBRK, 0) == -1) 155 return (-1); 156 (void)select(0, 0, 0, 0, &sleepytime); 157 if (ioctl(fd, TIOCCBRK, 0) == -1) 158 return (-1); 159 return (0); 160 } 161 162 tcdrain(fd) 163 int fd; 164 { 165 166 return (ioctl(fd, TIOCDRAIN, 0)); 167 } 168 169 tcflush(fd, which) 170 int fd, which; 171 { 172 int com; 173 174 switch (which) { 175 case TCIFLUSH: 176 com = FREAD; 177 break; 178 case TCOFLUSH: 179 com = FWRITE; 180 break; 181 case TCIOFLUSH: 182 com = FREAD | FWRITE; 183 break; 184 default: 185 errno = EINVAL; 186 return (-1); 187 } 188 return (ioctl(fd, TIOCFLUSH, &com)); 189 } 190 191 tcflow(fd, action) 192 int fd, action; 193 { 194 struct termios term; 195 u_char c; 196 197 switch (action) { 198 case TCOOFF: 199 return (ioctl(fd, TIOCSTOP, 0)); 200 case TCOON: 201 return (ioctl(fd, TIOCSTART, 0)); 202 case TCION: 203 case TCIOFF: 204 if (tcgetattr(fd, &term) == -1) 205 return (-1); 206 c = term.c_cc[action == TCIOFF ? VSTOP : VSTART]; 207 if (c != _POSIX_VDISABLE && write(fd, &c, sizeof(c)) == -1) 208 return (-1); 209 return (0); 210 default: 211 errno = EINVAL; 212 return (-1); 213 } 214 /* NOTREACHED */ 215 } 216