144301Smarc /*- 238597Skarels * Copyright (c) 1989 The Regents of the University of California. 338597Skarels * All rights reserved. 438597Skarels * 544301Smarc * %sccs.include.redist.c% 638597Skarels */ 738597Skarels 838597Skarels #if defined(LIBC_SCCS) && !defined(lint) 9*47868Smarc static char sccsid[] = "@(#)termios.c 5.6 (Berkeley) 04/09/91"; 1038597Skarels #endif /* LIBC_SCCS and not lint */ 1138597Skarels 1235766Smarc #include <sys/types.h> 1335766Smarc #include <sys/errno.h> 1444301Smarc #include <sys/ioctl.h> 1544301Smarc #include <sys/tty.h> 16*47868Smarc #define KERNEL /* XXX - FREAD and FWRITE was ifdef'd KERNEL*/ 17*47868Smarc #include <sys/fcntl.h> 18*47868Smarc #undef KERNEL 1946597Sdonn #include <termios.h> 2035766Smarc #include <stdio.h> 2146597Sdonn #include <unistd.h> 2235766Smarc 2346597Sdonn int 2435766Smarc tcgetattr(fd, t) 2535766Smarc int fd; 2635766Smarc struct termios *t; 2735766Smarc { 2835766Smarc 2935766Smarc return(ioctl(fd, TIOCGETA, t)); 3035766Smarc } 3135766Smarc 3246597Sdonn int 3335766Smarc tcsetattr(fd, opt, t) 3435766Smarc int fd, opt; 3546597Sdonn const struct termios *t; 3635766Smarc { 3744301Smarc struct termios localterm; 3835766Smarc 3944301Smarc if (opt & TCSASOFT) { 4044301Smarc localterm = *t; 4144301Smarc localterm.c_cflag |= CIGNORE; 4244301Smarc t = &localterm; 4344301Smarc opt &= TCSASOFT; 4435766Smarc } 4544301Smarc if (opt == TCSANOW) 4644301Smarc return (ioctl(fd, TIOCSETA, t)); 4744301Smarc else if (opt == TCSADRAIN) 4844301Smarc return (ioctl(fd, TIOCSETAW, t)); 4946597Sdonn return (ioctl(fd, TIOCSETAF, t)); 5035766Smarc } 5135766Smarc 5246597Sdonn int 5346597Sdonn #if __STDC__ 5446597Sdonn tcsetpgrp(int fd, pid_t pgrp) 5546597Sdonn #else 5635766Smarc tcsetpgrp(fd, pgrp) 5746597Sdonn int fd; 5846597Sdonn pid_t pgrp; 5946597Sdonn #endif 6035766Smarc { 61*47868Smarc 6235766Smarc return(ioctl(fd, TIOCSPGRP, &pgrp)); 6335766Smarc } 6435766Smarc 6546597Sdonn pid_t 6635766Smarc tcgetpgrp(fd) 6735766Smarc { 6847731Sbostic int s; 6935766Smarc 7047731Sbostic if (ioctl(fd, TIOCGPGRP, &s) < 0) 7147731Sbostic return((pid_t)-1); 72*47868Smarc 7347731Sbostic return((pid_t)s); 7435766Smarc } 7535766Smarc 7646597Sdonn speed_t 7735766Smarc cfgetospeed(t) 7846597Sdonn const struct termios *t; 7935766Smarc { 80*47868Smarc 8135766Smarc return(t->c_ospeed); 8235766Smarc } 8335766Smarc 8446597Sdonn speed_t 8535766Smarc cfgetispeed(t) 8646597Sdonn const struct termios *t; 8735766Smarc { 88*47868Smarc 8935766Smarc return(t->c_ispeed); 9035766Smarc } 9135766Smarc 9246597Sdonn int 9335766Smarc cfsetospeed(t, speed) 9435766Smarc struct termios *t; 9546597Sdonn speed_t speed; 9635766Smarc { 9735766Smarc t->c_ospeed = speed; 98*47868Smarc 99*47868Smarc return (0); 10035766Smarc } 10135766Smarc 10246597Sdonn int 10335766Smarc cfsetispeed(t, speed) 10435766Smarc struct termios *t; 10546597Sdonn speed_t speed; 10635766Smarc { 10735766Smarc t->c_ispeed = speed; 108*47868Smarc 109*47868Smarc return (0); 11035766Smarc } 11135766Smarc 11246597Sdonn void 11335766Smarc cfsetspeed(t, speed) 11435766Smarc struct termios *t; 11546597Sdonn speed_t speed; 11635766Smarc { 11735766Smarc t->c_ispeed = t->c_ospeed = speed; 118*47868Smarc 119*47868Smarc return (0) 12035766Smarc } 12135766Smarc 12246248Skarels /* 12346248Skarels * Make a pre-existing termios structure into "raw" mode: 12446248Skarels * character-at-a-time mode with no characters interpreted, 12546248Skarels * 8-bit data path. 12646248Skarels */ 12746597Sdonn void 12835766Smarc cfmakeraw(t) 12935766Smarc struct termios *t; 13035766Smarc { 13146248Skarels t->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); 13246248Skarels t->c_oflag &= ~OPOST; 13338596Skarels t->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); 13446248Skarels t->c_cflag &= ~(CSIZE|PARENB); 13546248Skarels t->c_cflag |= CS8; 13635766Smarc /* set MIN/TIME */ 13735766Smarc } 138*47868Smarc 139*47868Smarc tcsendbreak(fd, len) 140*47868Smarc int fd, len; 141*47868Smarc { 142*47868Smarc struct timeval sleepytime; 143*47868Smarc 144*47868Smarc sleepytime.tv_sec = 0; 145*47868Smarc sleepytime.tv_usec = 400000; 146*47868Smarc if (ioctl(fd, TIOCSBRK, 0) == -1) 147*47868Smarc return (-1); 148*47868Smarc select(0, 0, 0, 0, &sleepytime); 149*47868Smarc if (ioctl(fd, TIOCCBRK, 0) == -1) 150*47868Smarc return (-1); 151*47868Smarc 152*47868Smarc return (0); 153*47868Smarc } 154*47868Smarc 155*47868Smarc tcdrain(fd) 156*47868Smarc int fd; 157*47868Smarc { 158*47868Smarc if (ioctl(fd, TIOCDRAIN, 0) == -1) 159*47868Smarc return (-1); 160*47868Smarc 161*47868Smarc return (0); 162*47868Smarc } 163*47868Smarc 164*47868Smarc tcflush(fd, which) 165*47868Smarc int fd, which; 166*47868Smarc { 167*47868Smarc int com; 168*47868Smarc 169*47868Smarc switch (which) { 170*47868Smarc case TCIFLUSH: 171*47868Smarc com = FREAD; 172*47868Smarc break; 173*47868Smarc case TCOFLUSH: 174*47868Smarc com = FWRITE; 175*47868Smarc break; 176*47868Smarc case TCIOFLUSH: 177*47868Smarc com = FREAD | FWRITE; 178*47868Smarc break; 179*47868Smarc default: 180*47868Smarc errno = EINVAL; 181*47868Smarc return (-1); 182*47868Smarc } 183*47868Smarc if (ioctl(fd, TIOCFLUSH, &com) == -1) 184*47868Smarc return (-1); 185*47868Smarc 186*47868Smarc return (0); 187*47868Smarc } 188*47868Smarc 189*47868Smarc tcflow(fd, action) 190*47868Smarc int fd, action; 191*47868Smarc { 192*47868Smarc switch (action) { 193*47868Smarc case TCOOFF: 194*47868Smarc return (ioctl(fd, TIOCSTOP, 0)); 195*47868Smarc break; 196*47868Smarc case TCOON: 197*47868Smarc return (ioctl(fd, TIOCSTART, 0)); 198*47868Smarc break; 199*47868Smarc case TCIOFF: 200*47868Smarc case TCION: { /* these posix functions are STUPID */ 201*47868Smarc struct termios term; 202*47868Smarc char c; 203*47868Smarc 204*47868Smarc if (tcgetattr(fd, &term) == -1); 205*47868Smarc return (-1); 206*47868Smarc c = term.c_cc[action == TCIOFF ? VSTOP : VSTART]; 207*47868Smarc if (c != _POSIX_VDISABLE && write(fd, &c, 1) == -1) 208*47868Smarc return (-1); 209*47868Smarc break; 210*47868Smarc } 211*47868Smarc default: 212*47868Smarc errno = EINVAL; 213*47868Smarc return (-1); 214*47868Smarc } 215*47868Smarc 216*47868Smarc return (0); 217*47868Smarc } 218