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 <malaa...@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); > + } > _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel