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 speed_t 101 cfgetospeed(const struct termios *t) 102 { 103 104 return (t->c_ospeed); 105 } 106 107 speed_t 108 cfgetispeed(const struct termios *t) 109 { 110 111 return (t->c_ispeed); 112 } 113 114 int 115 cfsetospeed(struct termios *t, speed_t speed) 116 { 117 118 t->c_ospeed = speed; 119 return (0); 120 } 121 122 int 123 cfsetispeed(struct termios *t, speed_t speed) 124 { 125 126 t->c_ispeed = speed; 127 return (0); 128 } 129 130 int 131 cfsetspeed(struct termios *t, speed_t speed) 132 { 133 134 t->c_ispeed = t->c_ospeed = speed; 135 return (0); 136 } 137 138 /* 139 * Make a pre-existing termios structure into "raw" mode: character-at-a-time 140 * mode with no characters interpreted, 8-bit data path. 141 */ 142 void 143 cfmakeraw(struct termios *t) 144 { 145 146 t->c_iflag &= ~(IMAXBEL|IXOFF|INPCK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IGNPAR); 147 t->c_iflag |= IGNBRK; 148 t->c_oflag &= ~OPOST; 149 t->c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|ICANON|ISIG|IEXTEN|NOFLSH|TOSTOP|PENDIN); 150 t->c_cflag &= ~(CSIZE|PARENB); 151 t->c_cflag |= CS8|CREAD; 152 t->c_cc[VMIN] = 1; 153 t->c_cc[VTIME] = 0; 154 } 155 156 int 157 tcsendbreak(int fd, int len __unused) 158 { 159 struct timeval sleepytime; 160 161 sleepytime.tv_sec = 0; 162 sleepytime.tv_usec = 400000; 163 if (_ioctl(fd, TIOCSBRK, 0) == -1) 164 return (-1); 165 _select(0, 0, 0, 0, &sleepytime); 166 if (_ioctl(fd, TIOCCBRK, 0) == -1) 167 return (-1); 168 return (0); 169 } 170 171 int 172 __tcdrain(int fd) 173 { 174 return (_ioctl(fd, TIOCDRAIN, 0)); 175 } 176 177 #ifndef _THREAD_SAFE 178 __weak_reference(__tcdrain, tcdrain); 179 #endif 180 181 int 182 tcflush(int fd, int which) 183 { 184 int com; 185 186 switch (which) { 187 case TCIFLUSH: 188 com = FREAD; 189 break; 190 case TCOFLUSH: 191 com = FWRITE; 192 break; 193 case TCIOFLUSH: 194 com = FREAD | FWRITE; 195 break; 196 default: 197 errno = EINVAL; 198 return (-1); 199 } 200 return (_ioctl(fd, TIOCFLUSH, &com)); 201 } 202 203 int 204 tcflow(int fd, int action) 205 { 206 struct termios term; 207 u_char c; 208 209 switch (action) { 210 case TCOOFF: 211 return (_ioctl(fd, TIOCSTOP, 0)); 212 case TCOON: 213 return (_ioctl(fd, TIOCSTART, 0)); 214 case TCION: 215 case TCIOFF: 216 if (tcgetattr(fd, &term) == -1) 217 return (-1); 218 c = term.c_cc[action == TCIOFF ? VSTOP : VSTART]; 219 if (c != _POSIX_VDISABLE && _write(fd, &c, sizeof(c)) == -1) 220 return (-1); 221 return (0); 222 default: 223 errno = EINVAL; 224 return (-1); 225 } 226 /* NOTREACHED */ 227 } 228