diff mbox

[OpenWrt-Devel] Comgt: Add option to ignore ioctl errors

Message ID 1419872045-16704-1-git-send-email-malaakso@elisanet.fi
State Changes Requested
Headers show

Commit Message

Matti Laakso Dec. 29, 2014, 4:54 p.m. UTC
Some Huawei mobile broadband sticks utilizing the NCM protocol expose
the control channel as a cdc-wdm device node instead of a virtual serial
port. This device node does not support the serial port ioctls. Add command
line option to not check whether ioctls are successful so that AT commands
can also be sent to these devices.

Signed-off-by: Matti Laakso <malaakso@elisanet.fi>
---
 .../utils/comgt/patches/004-add_force_option.patch | 66 ++++++++++++++++++++++
 1 file changed, 66 insertions(+)
 create mode 100644 package/network/utils/comgt/patches/004-add_force_option.patch

Comments

John Crispin Jan. 8, 2015, 8:30 p.m. UTC | #1
On 29/12/2014 17:54, 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 serial
> port. This device node does not support the serial port ioctls. Add command
> line option to not check whether ioctls are successful so that AT commands
> can also be sent to these devices.
> 

can you instead of calling the ioctl and then ignoring the error change
it to not call the ioctls if the device is not a tty ?



> Signed-off-by: Matti Laakso <malaakso@elisanet.fi>
> ---
>  .../utils/comgt/patches/004-add_force_option.patch | 66 ++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
>  create mode 100644 package/network/utils/comgt/patches/004-add_force_option.patch
> 
> diff --git a/package/network/utils/comgt/patches/004-add_force_option.patch b/package/network/utils/comgt/patches/004-add_force_option.patch
> new file mode 100644
> index 0000000..1690e5c
> --- /dev/null
> +++ b/package/network/utils/comgt/patches/004-add_force_option.patch
> @@ -0,0 +1,66 @@
> +--- 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 force=0;
> + 
> + 
> + //"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";
> +@@ -920,7 +921,7 @@ 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, TCSETA, &stbuf) < 0 && !force) {
> +     serror("Can't ioctl set device",1);
> +   }
> + }
> +@@ -1224,7 +1225,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, TCSETA, &svbuf) < 0 && !force) {
> +       sprintf(msg,"Can't ioctl set device %s.\n",device);
> +       serror(msg,1);
> +     }
> +@@ -1266,7 +1267,7 @@ void opengt(void) {
> +       ext(1);
> +     }
> +   }
> +-  if (ioctl (comfd, TCGETA, &svbuf) < 0) {
> ++  if (ioctl (comfd, TCGETA, &svbuf) < 0 && !force) {
> +     sprintf(msg,"Can't control %s, please try again.\n",device);
> +     serror(msg,1);
> +   }
> +@@ -1303,7 +1304,7 @@ void opendevice(void) {
> +   }
> +   else comfd=0;
> + 
> +-  if (ioctl (comfd, TCGETA, &svbuf) < 0) {
> ++  if (ioctl (comfd, TCGETA, &svbuf) < 0 && !force) {
> +     sprintf(msg,"Can't ioctl get device %s.\n",device);
> +     serror(msg,1);
> +   }
> +@@ -1567,7 +1568,7 @@ int main(int argc,char **argv) {
> +   for(a=0;a<strlen(argv[0]);a++) {
> +     if(argv[0][a]=='/') b=a+1;
> +   }
> +-  while((aa=getopt(argc,argv,"xheVvd:t:sb:"))!= -1) {
> ++  while((aa=getopt(argc,argv,"xheVvd:t:sb:f"))!= -1) {
> +     switch(aa) {
> +       case 0:
> +         ext(0);
> +@@ -1605,6 +1606,10 @@ int main(int argc,char **argv) {
> +         printf("High speed overide (115200 is now 57600).\n");
> +         high_speed =1;
> +         break;
> ++      case 'f':
> ++        force=1;
> ++        vmsg("Ignoring ioctl errors");
> ++        break;
> +       default:
> +         ext(1);
> +     }
>
diff mbox

Patch

diff --git a/package/network/utils/comgt/patches/004-add_force_option.patch b/package/network/utils/comgt/patches/004-add_force_option.patch
new file mode 100644
index 0000000..1690e5c
--- /dev/null
+++ b/package/network/utils/comgt/patches/004-add_force_option.patch
@@ -0,0 +1,66 @@ 
+--- 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 force=0;
+ 
+ 
+ //"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";
+@@ -920,7 +921,7 @@ 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, TCSETA, &stbuf) < 0 && !force) {
+     serror("Can't ioctl set device",1);
+   }
+ }
+@@ -1224,7 +1225,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, TCSETA, &svbuf) < 0 && !force) {
+       sprintf(msg,"Can't ioctl set device %s.\n",device);
+       serror(msg,1);
+     }
+@@ -1266,7 +1267,7 @@ void opengt(void) {
+       ext(1);
+     }
+   }
+-  if (ioctl (comfd, TCGETA, &svbuf) < 0) {
++  if (ioctl (comfd, TCGETA, &svbuf) < 0 && !force) {
+     sprintf(msg,"Can't control %s, please try again.\n",device);
+     serror(msg,1);
+   }
+@@ -1303,7 +1304,7 @@ void opendevice(void) {
+   }
+   else comfd=0;
+ 
+-  if (ioctl (comfd, TCGETA, &svbuf) < 0) {
++  if (ioctl (comfd, TCGETA, &svbuf) < 0 && !force) {
+     sprintf(msg,"Can't ioctl get device %s.\n",device);
+     serror(msg,1);
+   }
+@@ -1567,7 +1568,7 @@ int main(int argc,char **argv) {
+   for(a=0;a<strlen(argv[0]);a++) {
+     if(argv[0][a]=='/') b=a+1;
+   }
+-  while((aa=getopt(argc,argv,"xheVvd:t:sb:"))!= -1) {
++  while((aa=getopt(argc,argv,"xheVvd:t:sb:f"))!= -1) {
+     switch(aa) {
+       case 0:
+         ext(0);
+@@ -1605,6 +1606,10 @@ int main(int argc,char **argv) {
+         printf("High speed overide (115200 is now 57600).\n");
+         high_speed =1;
+         break;
++      case 'f':
++        force=1;
++        vmsg("Ignoring ioctl errors");
++        break;
+       default:
+         ext(1);
+     }