Re: [OpenWrt-Devel] [PATCH] comgt: Allow using non-TTY devices

2015-01-16 Thread John Crispin


On 13/01/2015 18:00, Matti Laakso wrote:
 Some Huawei mobile broadband sticks utilizing the NCM protocol expose
 the control channel as a cdc-wdm device node instead of a virtual TTY.
 This device node does not support the terminal ioctls. This patch
 adds a check whether the provided device is a TTY or not and does not
 attempt to use the terminal ioctls if they are not supported.
 
 Signed-off-by: Matti Laakso malaa...@elisanet.fi
 ---
 diff --git a/package/network/utils/comgt/patches/004-check_tty.patch 
 b/package/network/utils/comgt/patches/004-check_tty.patch
 new file mode 100644
 index 000..d269bce
 --- /dev/null
 +++ b/package/network/utils/comgt/patches/004-check_tty.patch
 @@ -0,0 +1,177 @@
 +--- a/comgt.c
  b/comgt.c
 +@@ -91,6 +91,7 @@ unsigned long hstart,hset;
 + char NullString[]={  };
 + BOOL lastcharnl=1; /* Indicate that last char printed from getonebyte
 +was a nl, so no new one is needed */
 ++BOOL tty=1;
 + 
 + 
 + //open com \/dev/modem\\nset com 38400n81\nset senddelay 0.05\nsend 
 \ATi^m\\nget 2 \ ^m\ $s\nprint \Response : \,$s,\\\n\\nget 2 \ ^m\ 
 $s\nprint \Response :\,$s,\\\n\\nget 2 \ ^m\ $s\nprint \Response : 
 \,$s,\\\n\\n\n;
 +@@ -918,10 +919,12 @@ 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) {
 +-serror(Can't ioctl set device,1);
 ++  if (tty) {
 ++stbuf.c_cflag = ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB);
 ++stbuf.c_cflag |= (speed | bits | CREAD | clocal | parity | stopbits );
 ++if (ioctl(comfd, TCSETA, stbuf)  0) {
 ++  serror(Can't ioctl set device,1);
 ++}
 +   }
 + }
 + 
 +@@ -1224,9 +1227,11 @@ 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) {
 +-  sprintf(msg,Can't ioctl set device %s.\n,device);
 +-  serror(msg,1);
 ++if (tty) {
 ++  if (ioctl(comfd, TCSETA, svbuf)  0) {
 ++sprintf(msg,Can't ioctl set device %s.\n,device);
 ++serror(msg,1);
 ++  }
 + }


if (tty  (ioctl(comfd, TCSETA, svbuf)  0)) .


i think this pattern would drastically reduce the diffstat




 + close(comfd);
 + comfd= -1;
 +@@ -1266,26 +1271,32 @@ void opengt(void) {
 +   ext(1);
 + }
 +   }
 +-  if (ioctl (comfd, TCGETA, svbuf)  0) {
 +-sprintf(msg,Can't control %s, please try again.\n,device);
 +-serror(msg,1);
 ++  if (isatty (comfd))
 ++tty=1;
 ++  else
 ++tty=0;
 ++  if (tty) {
 ++if (ioctl (comfd, TCGETA, svbuf)  0) {
 ++  sprintf(msg,Can't control %s, please try again.\n,device);
 ++  serror(msg,1);
 ++}
 ++ioctl(comfd, TCGETA, stbuf);
 ++speed=stbuf.c_cflag  CBAUD;
 ++if (high_speed == 0)  strcpy(cspeed,115200);
 ++else strcpy(cspeed,57600);
 ++bits=stbuf.c_cflag  CSIZE;
 ++clocal=stbuf.c_cflag  CLOCAL;
 ++stopbits=stbuf.c_cflag  CSTOPB;
 ++parity=stbuf.c_cflag  (PARENB | PARODD);
 ++stbuf.c_iflag = ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXANY | 
 IGNPAR );
 ++stbuf.c_oflag = ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
 ++stbuf.c_lflag = ~(ICANON | ECHO | ECHOE | ECHONL);
 ++stbuf.c_lflag = ~(ECHO | ECHOE);
 ++stbuf.c_cc[VMIN] = 1;
 ++stbuf.c_cc[VTIME] = 0;
 ++stbuf.c_cc[VEOF] = 1;
 +   }
 +   setenv(COMGTDEVICE,device,1);
 +-  ioctl(comfd, TCGETA, stbuf);
 +-  speed=stbuf.c_cflag  CBAUD;
 +-  if (high_speed == 0)  strcpy(cspeed,115200);
 +-  else strcpy(cspeed,57600);
 +-  bits=stbuf.c_cflag  CSIZE;
 +-  clocal=stbuf.c_cflag  CLOCAL;
 +-  stopbits=stbuf.c_cflag  CSTOPB;
 +-  parity=stbuf.c_cflag  (PARENB | PARODD);
 +-  stbuf.c_iflag = ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXANY | IGNPAR 
 );
 +-  stbuf.c_oflag = ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
 +-  stbuf.c_lflag = ~(ICANON | ECHO | ECHOE | ECHONL);
 +-  stbuf.c_lflag = ~(ECHO | ECHOE);
 +-  stbuf.c_cc[VMIN] = 1;
 +-  stbuf.c_cc[VTIME] = 0;
 +-  stbuf.c_cc[VEOF] = 1;
 +   setcom();
 +   dormir(20); /* Wait a bit (DTR raise) */
 +   sprintf(msg,Opened %s as FD %d,device,comfd);
 +@@ -1302,45 +1313,50 @@ void opendevice(void) {
 + }
 +   }
 +   else comfd=0;
 +-
 +-  if (ioctl (comfd, TCGETA, svbuf)  0) {
 +-sprintf(msg,Can't ioctl get device %s.\n,device);
 +-serror(msg,1);
 +-  }
 +-  ioctl(comfd, TCGETA, stbuf);
 +-  speed=stbuf.c_cflag  CBAUD;
 +-  switch(speed) {
 +-case B0: strcpy(cspeed,0);break;
 +-case B50: strcpy(cspeed,50);break;
 +-case B75: strcpy(cspeed,75);break;
 +-case B110: strcpy(cspeed,110);break;
 +-case B300: strcpy(cspeed,300);break;
 +-case B600: strcpy(cspeed,600);break;
 +-case B1200: strcpy(cspeed,1200);break;
 +-case B2400: strcpy(cspeed,2400);break;
 +-case B4800: strcpy(cspeed,4800);break;
 +-case 

[OpenWrt-Devel] [PATCH] comgt: Allow using non-TTY devices

2015-01-13 Thread Matti Laakso
Some Huawei mobile broadband sticks utilizing the NCM protocol expose
the control channel as a cdc-wdm device node instead of a virtual TTY.
This device node does not support the terminal ioctls. This patch
adds a check whether the provided device is a TTY or not and does not
attempt to use the terminal ioctls if they are not supported.

Signed-off-by: Matti Laakso malaa...@elisanet.fi
---
diff --git a/package/network/utils/comgt/patches/004-check_tty.patch 
b/package/network/utils/comgt/patches/004-check_tty.patch
new file mode 100644
index 000..d269bce
--- /dev/null
+++ b/package/network/utils/comgt/patches/004-check_tty.patch
@@ -0,0 +1,177 @@
+--- a/comgt.c
 b/comgt.c
+@@ -91,6 +91,7 @@ unsigned long hstart,hset;
+ char NullString[]={  };
+ BOOL lastcharnl=1; /* Indicate that last char printed from getonebyte
+was a nl, so no new one is needed */
++BOOL tty=1;
+ 
+ 
+ //open com \/dev/modem\\nset com 38400n81\nset senddelay 0.05\nsend 
\ATi^m\\nget 2 \ ^m\ $s\nprint \Response : \,$s,\\\n\\nget 2 \ ^m\ 
$s\nprint \Response :\,$s,\\\n\\nget 2 \ ^m\ $s\nprint \Response : 
\,$s,\\\n\\n\n;
+@@ -918,10 +919,12 @@ 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) {
+-serror(Can't ioctl set device,1);
++  if (tty) {
++stbuf.c_cflag = ~(CBAUD | CSIZE | CSTOPB | CLOCAL | PARENB);
++stbuf.c_cflag |= (speed | bits | CREAD | clocal | parity | stopbits );
++if (ioctl(comfd, TCSETA, stbuf)  0) {
++  serror(Can't ioctl set device,1);
++}
+   }
+ }
+ 
+@@ -1224,9 +1227,11 @@ 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) {
+-  sprintf(msg,Can't ioctl set device %s.\n,device);
+-  serror(msg,1);
++if (tty) {
++  if (ioctl(comfd, TCSETA, svbuf)  0) {
++sprintf(msg,Can't ioctl set device %s.\n,device);
++serror(msg,1);
++  }
+ }
+ close(comfd);
+ comfd= -1;
+@@ -1266,26 +1271,32 @@ void opengt(void) {
+   ext(1);
+ }
+   }
+-  if (ioctl (comfd, TCGETA, svbuf)  0) {
+-sprintf(msg,Can't control %s, please try again.\n,device);
+-serror(msg,1);
++  if (isatty (comfd))
++tty=1;
++  else
++tty=0;
++  if (tty) {
++if (ioctl (comfd, TCGETA, svbuf)  0) {
++  sprintf(msg,Can't control %s, please try again.\n,device);
++  serror(msg,1);
++}
++ioctl(comfd, TCGETA, stbuf);
++speed=stbuf.c_cflag  CBAUD;
++if (high_speed == 0)  strcpy(cspeed,115200);
++else strcpy(cspeed,57600);
++bits=stbuf.c_cflag  CSIZE;
++clocal=stbuf.c_cflag  CLOCAL;
++stopbits=stbuf.c_cflag  CSTOPB;
++parity=stbuf.c_cflag  (PARENB | PARODD);
++stbuf.c_iflag = ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXANY | IGNPAR 
);
++stbuf.c_oflag = ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
++stbuf.c_lflag = ~(ICANON | ECHO | ECHOE | ECHONL);
++stbuf.c_lflag = ~(ECHO | ECHOE);
++stbuf.c_cc[VMIN] = 1;
++stbuf.c_cc[VTIME] = 0;
++stbuf.c_cc[VEOF] = 1;
+   }
+   setenv(COMGTDEVICE,device,1);
+-  ioctl(comfd, TCGETA, stbuf);
+-  speed=stbuf.c_cflag  CBAUD;
+-  if (high_speed == 0)  strcpy(cspeed,115200);
+-  else strcpy(cspeed,57600);
+-  bits=stbuf.c_cflag  CSIZE;
+-  clocal=stbuf.c_cflag  CLOCAL;
+-  stopbits=stbuf.c_cflag  CSTOPB;
+-  parity=stbuf.c_cflag  (PARENB | PARODD);
+-  stbuf.c_iflag = ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXANY | IGNPAR );
+-  stbuf.c_oflag = ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
+-  stbuf.c_lflag = ~(ICANON | ECHO | ECHOE | ECHONL);
+-  stbuf.c_lflag = ~(ECHO | ECHOE);
+-  stbuf.c_cc[VMIN] = 1;
+-  stbuf.c_cc[VTIME] = 0;
+-  stbuf.c_cc[VEOF] = 1;
+   setcom();
+   dormir(20); /* Wait a bit (DTR raise) */
+   sprintf(msg,Opened %s as FD %d,device,comfd);
+@@ -1302,45 +1313,50 @@ void opendevice(void) {
+ }
+   }
+   else comfd=0;
+-
+-  if (ioctl (comfd, TCGETA, svbuf)  0) {
+-sprintf(msg,Can't ioctl get device %s.\n,device);
+-serror(msg,1);
+-  }
+-  ioctl(comfd, TCGETA, stbuf);
+-  speed=stbuf.c_cflag  CBAUD;
+-  switch(speed) {
+-case B0: strcpy(cspeed,0);break;
+-case B50: strcpy(cspeed,50);break;
+-case B75: strcpy(cspeed,75);break;
+-case B110: strcpy(cspeed,110);break;
+-case B300: strcpy(cspeed,300);break;
+-case B600: strcpy(cspeed,600);break;
+-case B1200: strcpy(cspeed,1200);break;
+-case B2400: strcpy(cspeed,2400);break;
+-case B4800: strcpy(cspeed,4800);break;
+-case B9600: strcpy(cspeed,9600);break;
+-case B19200: strcpy(cspeed,19200);break;
+-case B38400: strcpy(cspeed,38400);break;
+-case B115200:
++  if (isatty (comfd))
++tty=1;
++  else
++tty=0;
++  if (tty) {
++if (ioctl (comfd, TCGETA, svbuf)  0) {
++  sprintf(msg,Can't