Files
Laurent THOMAS 206aa36a47 Make read-only globals const, additional fixes
- Global variables that are never written to are marked const
- Remove some EXTERN declaration
- Remove unused `log_mem_multi` from logging module
2023-08-18 14:20:37 +02:00

345 lines
13 KiB
C

/*
* 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 <termios.h> // tcgetattr, tcsetattr
#include <unistd.h>
#include <string.h> // strdup, strtok, strcmp
#include <stdlib.h> // 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);
}