/* * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The OpenAirInterface Software Alliance licenses this file to You under * the OAI Public License, Version 1.1 (the "License"); you may not use this file * except in compliance with the License. * You may obtain a copy of the License at * * http://www.openairinterface.org/?page_id=698 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *------------------------------------------------------------------------------- * For more information about the OpenAirInterface (OAI) Software Alliance: * contact@openairinterface.org */ /***************************************************************************** Source stty.c Version 0.1 Date 2012/11/29 Product NAS stack Subsystem Utilities Author Frederic Maurel Description Terminal I/O device control setup *****************************************************************************/ #include "commonDef.h" #include // tcgetattr, tcsetattr #include #include // strdup, strtok, strcmp #include // free /****************************************************************************/ /**************** E X T E R N A L D E F I N I T I O N S ****************/ /****************************************************************************/ /****************************************************************************/ /******************* L O C A L D E F I N I T I O N S *******************/ /****************************************************************************/ /* Terminal I/O setting flags */ #define CFLG 0 /* control modes */ #define IFLG 1 /* input modes */ #define OFLG 2 /* output modes */ #define LFLG 3 /* local modes */ #define RFLG 4 /* control chars */ #define BFLG 5 /* baud speed modes */ /* Terminal I/O setting parameters */ typedef struct sttyset_s { char *name; int which; int mask; int value; } sttyset_t; /* Table of terminal I/O parameters */ static const sttyset_t stty_params[] = {{"0", BFLG, 0, B0}, {"50", BFLG, 0, B50}, {"75", BFLG, 0, B75}, {"110", BFLG, 0, B110}, {"134", BFLG, 0, B134}, {"150", BFLG, 0, B150}, {"200", BFLG, 0, B200}, {"300", BFLG, 0, B300}, {"600", BFLG, 0, B600}, {"1200", BFLG, 0, B1200}, {"1800", BFLG, 0, B1800}, {"2400", BFLG, 0, B2400}, {"4800", BFLG, 0, B4800}, {"9600", BFLG, 0, B9600}, {"19200", BFLG, 0, B19200}, {"38400", BFLG, 0, B38400}, #ifdef B57600 {"57600", BFLG, 0, B57600}, #endif #ifdef B115200 {"115200", BFLG, 0, B115200}, #endif #ifdef B230400 {"230400", BFLG, 0, B230400}, #endif {"cs7", CFLG, CSIZE, CS7}, {"cs8", CFLG, CSIZE, CS8}, {"cstopb", CFLG, CSTOPB, CSTOPB}, {"cread", CFLG, CREAD, CREAD}, {"parenb", CFLG, PARENB, PARENB}, {"parodd", CFLG, PARODD, PARODD}, {"hubcl", CFLG, HUPCL, HUPCL}, {"clocal", CFLG, CLOCAL, CLOCAL}, #ifdef CRTSCTS {"crtscts", CFLG, CRTSCTS, CRTSCTS}, #endif #ifdef ORTSFL {"ortsfl", CFLG, ORTSFL, ORTSFL}, #endif #ifdef CTSFLOW {"ctsflow", CFLG, CTSFLOW, CTSFLOW}, #endif #ifdef RTSFLOW {"rtsflow", CFLG, RTSFLOW, RTSFLOW}, #endif {"ignbrk", IFLG, IGNBRK, IGNBRK}, {"brkint", IFLG, BRKINT, BRKINT}, {"ignpar", IFLG, IGNPAR, IGNPAR}, {"parmrk", IFLG, PARMRK, PARMRK}, {"inpck", IFLG, INPCK, INPCK}, {"istrip", IFLG, ISTRIP, ISTRIP}, {"inlcr", IFLG, INLCR, INLCR}, {"igncr", IFLG, IGNCR, IGNCR}, {"icrnl", IFLG, ICRNL, ICRNL}, #ifdef IUCLC // Missing on OSX, FreeBSD {"iuclc", IFLG, IUCLC, IUCLC}, #endif {"ixon", IFLG, IXON, IXON}, {"ixany", IFLG, IXANY, IXANY}, {"ixoff", IFLG, IXOFF, IXOFF}, #ifdef IMAXBEL {"imaxbel", IFLG, IMAXBEL, IMAXBEL}, #endif {"opost", OFLG, OPOST, OPOST}, #ifdef ILCUC // Missing on OSX, FreeBSD {"olcuc", OFLG, OLCUC, OLCUC}, #endif {"onlcr", OFLG, ONLCR, ONLCR}, {"ocrnl", OFLG, OCRNL, OCRNL}, {"onocr", OFLG, ONOCR, ONOCR}, {"onlret", OFLG, ONLRET, ONLRET}, {"ofil", OFLG, OFILL, OFILL}, {"ofdel", OFLG, OFDEL, OFDEL}, {"nl0", OFLG, NLDLY, NL0}, {"nl1", OFLG, NLDLY, NL1}, {"cr0", OFLG, CRDLY, CR0}, {"cr1", OFLG, CRDLY, CR1}, {"cr2", OFLG, CRDLY, CR2}, {"cr3", OFLG, CRDLY, CR3}, {"tab0", OFLG, TABDLY, TAB0}, {"tab1", OFLG, TABDLY, TAB1}, {"tab2", OFLG, TABDLY, TAB2}, {"tab3", OFLG, TABDLY, TAB3}, {"bs0", OFLG, BSDLY, BS0}, {"bs1", OFLG, BSDLY, BS1}, {"vt0", OFLG, VTDLY, VT0}, {"vt1", OFLG, VTDLY, VT1}, {"ff0", OFLG, FFDLY, FF0}, {"ff1", OFLG, FFDLY, FF1}, {"isig", LFLG, ISIG, ISIG}, {"icanon", LFLG, ICANON, ICANON}, #ifdef XCASE // Missing on OSX, FreeBSD {"xcase", LFLG, XCASE, XCASE}, #endif {"echo", LFLG, ECHO, ECHO}, {"echoe", LFLG, ECHOE, ECHOE}, {"echok", LFLG, ECHOK, ECHOK}, {"echonl", LFLG, ECHONL, ECHONL}, {"noflsh", LFLG, NOFLSH, NOFLSH}, {"tostop", LFLG, TOSTOP, TOSTOP}, #ifdef ECHOCTL {"echoctl", LFLG, ECHOCTL, ECHOCTL}, #endif #ifdef ECHOPRT {"echoprt", LFLG, ECHOPRT, ECHOPRT}, #endif #ifdef ECHOKE {"echoke", LFLG, ECHOKE, ECHOKE}, #endif #ifdef FLUSHO {"flusho", LFLG, FLUSHO, FLUSHO}, #endif #ifdef PENDIN {"pendin", LFLG, PENDIN, PENDIN}, #endif {"iexten", LFLG, IEXTEN, IEXTEN}, #ifdef TOSTOP {"tostop", LFLG, TOSTOP, TOSTOP}, #endif {"raw", RFLG, 0, 0}, {NULL, 0, 0, 0}}; static int _stty_set_this(struct termios *term, const sttyset_t *p, bool turnon); /****************************************************************************/ /****************** E X P O R T E D F U N C T I O N S ******************/ /****************************************************************************/ /**************************************************************************** ** ** ** Name: stty_set() ** ** ** ** Description: Set the parameters associated with the terminal referred ** ** by the given descriptor ** ** ** ** Inputs: p: The TTY parameters ** ** turnon: Indicate whether the parameter should be ** ** turned on (true) or turned off (false) ** ** Others: None ** ** ** ** Outputs: term: The termios structure to fill ** ** Return: RETURNok, RETURNerror ** ** Others: None ** ** ** ***************************************************************************/ int stty_set(int fd, const char *params) { int rc = RETURNok; register char *p; register char *s; struct termios term; register int i; bool mode; /* Get current tty attributes */ if ( tcgetattr(fd, &term) < 0 ) { return RETURNerror; } s = strdup(params); p = strtok(s," \t\n"); while (p && (rc != RETURNerror)) { mode = true; if ( *p == '-' ) { mode = false; p++; } for ( i=0; stty_params[i].name; i++ ) { if ( !strcmp(p, stty_params[i].name) ) { rc = _stty_set_this(&term, &stty_params[i], mode); break; } } p = strtok(NULL," \t\n"); } free(s); /* Apply new tty settings immediatly */ if (rc != RETURNerror) { if ( tcsetattr(fd, TCSANOW, &term) < 0 ) { rc = RETURNerror; } } return (rc); } /****************************************************************************/ /********************* L O C A L F U N C T I O N S *********************/ /****************************************************************************/ /**************************************************************************** ** ** ** Name: _stty_set_this() ** ** ** ** Description: Fills the termios structure with the given TTY parameters ** ** ** ** Inputs: p: The TTY parameters ** ** turnon: Indicate whether the parameter should be ** ** turned on (true) or turned off (false) ** ** Others: None ** ** ** ** Outputs: term: The termios structure to fill ** ** Return: RETURNok, RETURNerror ** ** Others: None ** ** ** ***************************************************************************/ static int _stty_set_this(struct termios *term, const sttyset_t *p, bool turnon) { int rc = RETURNok; switch ( p->which ) { case CFLG: term->c_cflag &= ~(p->mask); if ( turnon ) term->c_cflag |= p->value; break; case IFLG: term->c_iflag &= ~(p->mask); if ( turnon ) term->c_iflag |= p->value; break; case OFLG: term->c_oflag &= ~(p->mask); if ( turnon ) term->c_oflag |= p->value; break; case LFLG: term->c_lflag &= ~(p->mask); if ( turnon ) term->c_lflag |= p->value; break; case RFLG: term->c_iflag = 0; term->c_oflag = 0; term->c_lflag = 0; term->c_cc[VMIN] = 1; term->c_cc[VTIME] = 0; break; case BFLG: if (cfsetispeed(term, p->value) < 0) { rc = RETURNerror; } else if (cfsetospeed(term, p->value) < 0) { rc = RETURNerror; } break; default: rc = RETURNerror; } return (rc); }