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 * 4. Neither the name of the University nor the names of its contributors 14 * may be used to endorse or promote products derived from this software 15 * without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#if defined(LIBC_SCCS) && !defined(lint) 31static char sccsid[] = "@(#)termios.c 8.2 (Berkeley) 2/21/94"; 32#endif /* LIBC_SCCS and not lint */ 33#include <sys/cdefs.h> 34__FBSDID("$FreeBSD: src/lib/libc/gen/termios.c,v 1.16 2009/05/07 13:49:48 ed Exp $"); 35 36#if __DARWIN_UNIX03 37#ifdef VARIANT_CANCELABLE 38#include <pthread.h> 39#endif /* VARIANT_CANCELABLE */ 40#endif /* __DARWIN_UNIX03 */ 41 42#include "namespace.h" 43#include <sys/types.h> 44#include <sys/fcntl.h> 45#include <sys/ioctl.h> 46#include <sys/time.h> 47 48#include <errno.h> 49#include <termios.h> 50#include <unistd.h> 51#include "un-namespace.h" 52 53#ifndef BUILDING_VARIANT 54int 55tcgetattr(fd, t) 56 int fd; 57 struct termios *t; 58{ 59 60 return (_ioctl(fd, TIOCGETA, t)); 61} 62 63int 64tcsetattr(fd, opt, t) 65 int fd, opt; 66 const struct termios *t; 67{ 68 struct termios localterm; 69 70 if (opt & TCSASOFT) { 71 localterm = *t; 72 localterm.c_cflag |= CIGNORE; 73 t = &localterm; 74 } 75 switch (opt & ~TCSASOFT) { 76 case TCSANOW: 77 return (_ioctl(fd, TIOCSETA, t)); 78 case TCSADRAIN: 79 return (_ioctl(fd, TIOCSETAW, t)); 80 case TCSAFLUSH: 81 return (_ioctl(fd, TIOCSETAF, t)); 82 default: 83 errno = EINVAL; 84 return (-1); 85 } 86} 87 88int 89tcsetpgrp(int fd, pid_t pgrp) 90{ 91 int s; 92 93 if (isatty(fd) == 0) 94 return (-1); 95 96 s = pgrp; 97 return (_ioctl(fd, TIOCSPGRP, &s)); 98} 99 100pid_t 101tcgetpgrp(fd) 102 int fd; 103{ 104 int s; 105 106 if (isatty(fd) == 0) 107 return ((pid_t)-1); 108 109 if (_ioctl(fd, TIOCGPGRP, &s) < 0) 110 return ((pid_t)-1); 111 112 return ((pid_t)s); 113} 114 115#if 0 // Needs API review first 116pid_t 117tcgetsid(int fd) 118{ 119 int s; 120 121 if (_ioctl(fd, TIOCGSID, &s) < 0) 122 return ((pid_t)-1); 123 124 return ((pid_t)s); 125} 126 127int 128tcsetsid(int fd, pid_t pid) 129{ 130 131 if (pid != getsid(0)) { 132 errno = EINVAL; 133 return (-1); 134 } 135 136 return (_ioctl(fd, TIOCSCTTY, NULL)); 137} 138#endif 139 140speed_t 141cfgetospeed(t) 142 const struct termios *t; 143{ 144 145 return (t->c_ospeed); 146} 147 148speed_t 149cfgetispeed(t) 150 const struct termios *t; 151{ 152 153 return (t->c_ispeed); 154} 155 156int 157cfsetospeed(t, speed) 158 struct termios *t; 159 speed_t speed; 160{ 161 162 t->c_ospeed = speed; 163 return (0); 164} 165 166int 167cfsetispeed(t, speed) 168 struct termios *t; 169 speed_t speed; 170{ 171 172 t->c_ispeed = speed; 173 return (0); 174} 175 176int 177cfsetspeed(t, speed) 178 struct termios *t; 179 speed_t speed; 180{ 181 182 t->c_ispeed = t->c_ospeed = speed; 183 return (0); 184} 185 186/* 187 * Make a pre-existing termios structure into "raw" mode: character-at-a-time 188 * mode with no characters interpreted, 8-bit data path. 189 */ 190void 191cfmakeraw(t) 192 struct termios *t; 193{ 194 195 t->c_iflag &= ~(IMAXBEL|IXOFF|INPCK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IGNPAR); 196 t->c_iflag |= IGNBRK; 197 t->c_oflag &= ~OPOST; 198 t->c_lflag &= ~(ECHO|ECHOE|ECHOK|ECHONL|ICANON|ISIG|IEXTEN|NOFLSH|TOSTOP|PENDIN); 199 t->c_cflag &= ~(CSIZE|PARENB); 200 t->c_cflag |= CS8|CREAD; 201 t->c_cc[VMIN] = 1; 202 t->c_cc[VTIME] = 0; 203} 204 205int 206tcsendbreak(fd, len) 207 int fd, len; 208{ 209 struct timeval sleepytime; 210 211 sleepytime.tv_sec = 0; 212 sleepytime.tv_usec = 400000; 213 if (_ioctl(fd, TIOCSBRK, 0) == -1) 214 return (-1); 215 (void)_select(0, 0, 0, 0, &sleepytime); 216 if (_ioctl(fd, TIOCCBRK, 0) == -1) 217 return (-1); 218 return (0); 219} 220#endif /* BUILDING_VARIANT */ 221 222int 223__tcdrain(fd) 224 int fd; 225{ 226#if __DARWIN_UNIX03 227#ifdef VARIANT_CANCELABLE 228 pthread_testcancel(); 229#endif /* VARIANT_CANCELABLE */ 230#endif /* __DARWIN_UNIX03 */ 231 return (_ioctl(fd, TIOCDRAIN, 0)); 232} 233 234__weak_reference(__tcdrain, tcdrain); 235__weak_reference(__tcdrain, _tcdrain); 236 237#ifndef BUILDING_VARIANT 238int 239tcflush(fd, which) 240 int fd, which; 241{ 242 int com; 243 244 switch (which) { 245 case TCIFLUSH: 246 com = FREAD; 247 break; 248 case TCOFLUSH: 249 com = FWRITE; 250 break; 251 case TCIOFLUSH: 252 com = FREAD | FWRITE; 253 break; 254 default: 255 errno = EINVAL; 256 return (-1); 257 } 258 return (_ioctl(fd, TIOCFLUSH, &com)); 259} 260 261int 262tcflow(fd, action) 263 int fd, action; 264{ 265 switch (action) { 266 case TCOOFF: 267 return (_ioctl(fd, TIOCSTOP, 0)); 268 case TCOON: 269 return (_ioctl(fd, TIOCSTART, 0)); 270 case TCION: 271 return (_ioctl(fd, TIOCIXON, 0)); 272 case TCIOFF: 273 return (_ioctl(fd, TIOCIXOFF, 0)); 274 default: 275 errno = EINVAL; 276 return (-1); 277 } 278 /* NOTREACHED */ 279} 280#endif /* BUILDING_VARIANT */ 281