1 /*- 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * $FreeBSD: src/lib/libc/gen/termios.c,v 1.9.2.1 2000/03/18 23:13:25 jasone Exp $ 34 * $DragonFly: src/lib/libc/gen/termios.c,v 1.5 2005/11/19 22:32:53 swildner Exp $ 35 * 36 * @(#)termios.c 8.2 (Berkeley) 2/21/94 37 */ 38 39 #include "namespace.h" 40 #include <sys/types.h> 41 #include <sys/fcntl.h> 42 #include <sys/ioctl.h> 43 #include <sys/time.h> 44 45 #include <errno.h> 46 #include <termios.h> 47 #include <unistd.h> 48 #include "un-namespace.h" 49 50 int 51 tcgetattr(int fd, struct termios *t) 52 { 53 54 return (_ioctl(fd, TIOCGETA, t)); 55 } 56 57 int 58 tcsetattr(int fd, int opt, const struct termios *t) 59 { 60 struct termios localterm; 61 62 if (opt & TCSASOFT) { 63 localterm = *t; 64 localterm.c_cflag |= CIGNORE; 65 t = &localterm; 66 } 67 switch (opt & ~TCSASOFT) { 68 case TCSANOW: 69 return (_ioctl(fd, TIOCSETA, t)); 70 case TCSADRAIN: 71 return (_ioctl(fd, TIOCSETAW, t)); 72 case TCSAFLUSH: 73 return (_ioctl(fd, TIOCSETAF, t)); 74 default: 75 errno = EINVAL; 76 return (-1); 77 } 78 } 79 80 int 81 tcsetpgrp(int fd, pid_t pgrp) 82 { 83 int s; 84 85 s = pgrp; 86 return (_ioctl(fd, TIOCSPGRP, &s)); 87 } 88 89 pid_t 90 tcgetpgrp(int fd) 91 { 92 int s; 93 94 if (_ioctl(fd, TIOCGPGRP, &s) < 0) 95 return ((pid_t)-1); 96 97 return ((pid_t)s); 98 } 99 100 pid_t 101 tcgetsid(int fd) 102 { 103 int s; 104 105 if (_ioctl(fd, TIOCGSID, &s) < 0) 106 return ((pid_t)-1); 107 108 return ((pid_t)s); 109 } 110 111 speed_t 112 cfgetospeed(const struct termios *t) 113 { 114 115 return (t->c_ospeed); 116 } 117 118 speed_t 119 cfgetispeed(const struct termios *t) 120 { 121 122 return (t->c_ispeed); 123 } 124 125 int 126 cfsetospeed(struct termios *t, speed_t speed) 127 { 128 129 t->c_ospeed = speed; 130 return (0); 131 } 132 133 int 134 cfsetispeed(struct termios *t, speed_t speed) 135 { 136 137 t->c_ispeed = speed; 138 return (0); 139 } 140 141 int 142 cfsetspeed(struct termios *t, speed_t speed) 143 { 144 145 t->c_ispeed = t->c_ospeed = speed; 146 return (0); 147 } 148 149 /* 150 * Make a pre-existing termios structure into "raw" mode: character-at-a-time 151 * mode with no characters interpreted, 8-bit data path. 152 */ 153 void 154 cfmakeraw(struct termios *t) 155 { 156 157 t->c_iflag &= ~(IMAXBEL|IXOFF|INPCK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IGNPAR); 158 t->c_iflag |= IGNBRK; 159 t->c_oflag &= ~OPOST; 160 t->c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|ICANON|ISIG|IEXTEN|NOFLSH|TOSTOP|PENDIN); 161 t->c_cflag &= ~(CSIZE|PARENB); 162 t->c_cflag |= CS8|CREAD; 163 t->c_cc[VMIN] = 1; 164 t->c_cc[VTIME] = 0; 165 } 166 167 int 168 tcsendbreak(int fd, int len __unused) 169 { 170 struct timeval sleepytime; 171 172 sleepytime.tv_sec = 0; 173 sleepytime.tv_usec = 400000; 174 if (_ioctl(fd, TIOCSBRK, 0) == -1) 175 return (-1); 176 _select(0, 0, 0, 0, &sleepytime); 177 if (_ioctl(fd, TIOCCBRK, 0) == -1) 178 return (-1); 179 return (0); 180 } 181 182 int 183 __tcdrain(int fd) 184 { 185 return (_ioctl(fd, TIOCDRAIN, 0)); 186 } 187 188 #ifndef _THREAD_SAFE 189 __weak_reference(__tcdrain, tcdrain); 190 #endif 191 192 int 193 tcflush(int fd, int which) 194 { 195 int com; 196 197 switch (which) { 198 case TCIFLUSH: 199 com = FREAD; 200 break; 201 case TCOFLUSH: 202 com = FWRITE; 203 break; 204 case TCIOFLUSH: 205 com = FREAD | FWRITE; 206 break; 207 default: 208 errno = EINVAL; 209 return (-1); 210 } 211 return (_ioctl(fd, TIOCFLUSH, &com)); 212 } 213 214 int 215 tcflow(int fd, int action) 216 { 217 struct termios term; 218 u_char c; 219 220 switch (action) { 221 case TCOOFF: 222 return (_ioctl(fd, TIOCSTOP, 0)); 223 case TCOON: 224 return (_ioctl(fd, TIOCSTART, 0)); 225 case TCION: 226 case TCIOFF: 227 if (tcgetattr(fd, &term) == -1) 228 return (-1); 229 c = term.c_cc[action == TCIOFF ? VSTOP : VSTART]; 230 if (c != _POSIX_VDISABLE && _write(fd, &c, sizeof(c)) == -1) 231 return (-1); 232 return (0); 233 default: 234 errno = EINVAL; 235 return (-1); 236 } 237 /* NOTREACHED */ 238 } 239