From d07406055a4d12b63b61ed192dd4a28b93060bb1 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sun, 22 Feb 2015 08:29:26 +0000 Subject: [PATCH] comgt: Use TCGETS and TCSETS ioctls for struct termios When passing struct termios to ioctl TCGETS and TCSETS should be used instead of TCGETA and TCSETA, which are meant for the older struct termio. Should fix https://dev.openwrt.org/ticket/19012 Signed-off-by: Matti Laakso SVN-Revision: 44506 --- package/network/utils/comgt/Makefile | 2 +- .../utils/comgt/patches/002-termios.patch | 78 ++++++++++++++++++- .../utils/comgt/patches/004-check_tty.patch | 24 +++--- 3 files changed, 90 insertions(+), 14 deletions(-) diff --git a/package/network/utils/comgt/Makefile b/package/network/utils/comgt/Makefile index 500365aaab..8fcf54e3a4 100644 --- a/package/network/utils/comgt/Makefile +++ b/package/network/utils/comgt/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=comgt PKG_VERSION:=0.32 -PKG_RELEASE:=24 +PKG_RELEASE:=25 PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz PKG_SOURCE_URL:=@SF/comgt diff --git a/package/network/utils/comgt/patches/002-termios.patch b/package/network/utils/comgt/patches/002-termios.patch index 3649f3cf09..08f22d15d9 100644 --- a/package/network/utils/comgt/patches/002-termios.patch +++ b/package/network/utils/comgt/patches/002-termios.patch @@ -18,7 +18,23 @@ int comfd=0; /* Communication file descriptor. Defaults to stdin. */ char msg[STRINGL]; /* Massage messages here */ int preturn,returns[MAXGOSUBS]; -@@ -926,7 +926,7 @@ void setcom(void) { +@@ -172,7 +172,7 @@ void dotestkey(void) { + + /* Exit after resetting terminal settings */ + void ext(long xtc) { +- ioctl(1, TCSETA, &cons); ++ ioctl(1, TCSETS, &cons); + exit(xtc); + } + +@@ -920,24 +920,24 @@ BOOL getonoroff(void) { + void setcom(void) { + stbuf.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB); + stbuf.c_cflag |= (speed | bits | CREAD | clocal | parity | stopbits ); +- if (ioctl(comfd, TCSETA, &stbuf) < 0) { ++ if (ioctl(comfd, TCSETS, &stbuf) < 0) { + serror("Can't ioctl set device",1); + } } void doset(void) { @@ -27,3 +43,63 @@ int a,b; gettoken(); if(strcmp(token,"echo")==0) { + a=0; + if(getonoroff()) a=ECHO|ECHOE; +- if(ioctl(0, TCGETA, &console)<0) { ++ if(ioctl(0, TCGETS, &console)<0) { + serror("Can't ioctl FD zero!\n",2); + } + console.c_lflag &= ~(ECHO | ECHOE); + console.c_lflag |= a; +- ioctl(0, TCSETA, &console); ++ ioctl(0, TCSETS, &console); + } + else if(strcmp(token,"senddelay")==0) { + senddelay=10000L*getdvalue(); +@@ -1224,7 +1224,7 @@ void doclose(void) { + if(strcmp(token,"hardcom")==0) { + if(comfd== -1) serror("Com device not open",1); + vmsg("Closing device"); +- if (ioctl(comfd, TCSETA, &svbuf) < 0) { ++ if (ioctl(comfd, TCSETS, &svbuf) < 0) { + sprintf(msg,"Can't ioctl set device %s.\n",device); + serror(msg,1); + } +@@ -1266,12 +1266,12 @@ void opengt(void) { + ext(1); + } + } +- if (ioctl (comfd, TCGETA, &svbuf) < 0) { ++ if (ioctl (comfd, TCGETS, &svbuf) < 0) { + sprintf(msg,"Can't control %s, please try again.\n",device); + serror(msg,1); + } + setenv("COMGTDEVICE",device,1); +- ioctl(comfd, TCGETA, &stbuf); ++ ioctl(comfd, TCGETS, &stbuf); + speed=stbuf.c_cflag & CBAUD; + if (high_speed == 0) strcpy(cspeed,"115200"); + else strcpy(cspeed,"57600"); +@@ -1303,11 +1303,11 @@ void opendevice(void) { + } + else comfd=0; + +- if (ioctl (comfd, TCGETA, &svbuf) < 0) { ++ if (ioctl (comfd, TCGETS, &svbuf) < 0) { + sprintf(msg,"Can't ioctl get device %s.\n",device); + serror(msg,1); + } +- ioctl(comfd, TCGETA, &stbuf); ++ ioctl(comfd, TCGETS, &stbuf); + speed=stbuf.c_cflag & CBAUD; + switch(speed) { + case B0: strcpy(cspeed,"0");break; +@@ -1553,7 +1553,7 @@ int main(int argc,char **argv) { + skip_default=0; + filep=NULL; + scriptspace=4096; +- ioctl(1, TCGETA, &cons); ++ ioctl(1, TCGETS, &cons); + if((script=( char *)malloc(scriptspace))==NULL) { + serror("Could not malloc()",3); + } diff --git a/package/network/utils/comgt/patches/004-check_tty.patch b/package/network/utils/comgt/patches/004-check_tty.patch index b81b0514c8..fb1d9af4bb 100644 --- a/package/network/utils/comgt/patches/004-check_tty.patch +++ b/package/network/utils/comgt/patches/004-check_tty.patch @@ -12,8 +12,8 @@ void setcom(void) { stbuf.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB); stbuf.c_cflag |= (speed | bits | CREAD | clocal | parity | stopbits ); -- if (ioctl(comfd, TCSETA, &stbuf) < 0) { -+ if (tty && ioctl(comfd, TCSETA, &stbuf) < 0) { +- if (ioctl(comfd, TCSETS, &stbuf) < 0) { ++ if (tty && ioctl(comfd, TCSETS, &stbuf) < 0) { serror("Can't ioctl set device",1); } } @@ -21,8 +21,8 @@ if(strcmp(token,"hardcom")==0) { if(comfd== -1) serror("Com device not open",1); vmsg("Closing device"); -- if (ioctl(comfd, TCSETA, &svbuf) < 0) { -+ if (tty && ioctl(comfd, TCSETA, &svbuf) < 0) { +- if (ioctl(comfd, TCSETS, &svbuf) < 0) { ++ if (tty && ioctl(comfd, TCSETS, &svbuf) < 0) { sprintf(msg,"Can't ioctl set device %s.\n",device); serror(msg,1); } @@ -30,19 +30,19 @@ ext(1); } } -- if (ioctl (comfd, TCGETA, &svbuf) < 0) { +- if (ioctl (comfd, TCGETS, &svbuf) < 0) { + if (isatty (comfd)) + tty=1; + else + tty=0; -+ if (tty && ioctl (comfd, TCGETA, &svbuf) < 0) { ++ if (tty && ioctl (comfd, TCGETS, &svbuf) < 0) { sprintf(msg,"Can't control %s, please try again.\n",device); serror(msg,1); } setenv("COMGTDEVICE",device,1); -- ioctl(comfd, TCGETA, &stbuf); +- ioctl(comfd, TCGETS, &stbuf); + if (tty) -+ ioctl(comfd, TCGETA, &stbuf); ++ ioctl(comfd, TCGETS, &stbuf); speed=stbuf.c_cflag & CBAUD; if (high_speed == 0) strcpy(cspeed,"115200"); else strcpy(cspeed,"57600"); @@ -51,18 +51,18 @@ } else comfd=0; - -- if (ioctl (comfd, TCGETA, &svbuf) < 0) { +- if (ioctl (comfd, TCGETS, &svbuf) < 0) { + if (isatty (comfd)) + tty=1; + else + tty=0; -+ if (tty && ioctl (comfd, TCGETA, &svbuf) < 0) { ++ if (tty && ioctl (comfd, TCGETS, &svbuf) < 0) { sprintf(msg,"Can't ioctl get device %s.\n",device); serror(msg,1); } -- ioctl(comfd, TCGETA, &stbuf); +- ioctl(comfd, TCGETS, &stbuf); + if (tty) -+ ioctl(comfd, TCGETA, &stbuf); ++ ioctl(comfd, TCGETS, &stbuf); speed=stbuf.c_cflag & CBAUD; switch(speed) { case B0: strcpy(cspeed,"0");break; -- 2.30.2