-static char *phone,*body,*device,*lockfile,*smsc,*chartime,*cmdtime;
+static char *phone,*body,*device,*lockfile,*smsc,*maxretry,*readtime,*chartime,*cmdtime;
- [-l|--lockfile <lock>] [-s|--smsc <smsc #>]\n\
- [-t|--chartime <msec>] [-T|--cmdtime <msec>]\n\
+ [-l|--lockfile <lock>] [-s|--smsc <smsc #>] [-m|--maxretry <#>]\n\
+ [-r|--readtime <sec>] [-t|--chartime <msec>] [-T|--cmdtime <msec>]\n\
-l, --lockfile\tLock serial port by this file, \"%%s\" is basename of device\n\
\t\t(def. \"%s\")\n\
-s, --smsc\tUse this SMS Center number (def. query from Siemens A1)\n\
-l, --lockfile\tLock serial port by this file, \"%%s\" is basename of device\n\
\t\t(def. \"%s\")\n\
-s, --smsc\tUse this SMS Center number (def. query from Siemens A1)\n\
-t, --chartime\tMilliseconds between each char on baud 19200 (def. %dms)\n\
-T, --cmdtime\tMilliseconds before each whole AT command (def. %dms)\n\
-f, --file\tRead contents of message from file instead\n\
-v, --verbose\tIncrease verbosity level, more \"-v\"s give more messages\n\
-h, --help\tPrint a summary of the options\n\
-V, --version\tPrint the version number\n\
-t, --chartime\tMilliseconds between each char on baud 19200 (def. %dms)\n\
-T, --cmdtime\tMilliseconds before each whole AT command (def. %dms)\n\
-f, --file\tRead contents of message from file instead\n\
-v, --verbose\tIncrease verbosity level, more \"-v\"s give more messages\n\
-h, --help\tPrint a summary of the options\n\
-V, --version\tPrint the version number\n\
-\n",version,DEF_LOCKFILE,DEF_CHARTIME,DEF_CMDTIME);
+\n",version,DEF_LOCKFILE,DEF_MAXRETRY,DEF_READTIME,DEF_CHARTIME,DEF_CMDTIME);
- while ((optc=getopt_long(argp,args,"c:d:l:s:t:T:fvhV",longopts,NULL))!=EOF) switch (optc) {
+ while ((optc=getopt_long(argp,args,"c:d:l:s:m:r:t:T:fvhV",longopts,NULL))!=EOF) switch (optc) {
case 'c':
if (cfgstacki>=NELEM(cfgstack)) {
error("Looping (%d) during attempt to read config file \"%s\", break-out",NELEM(cfgstack),optind);
case 'c':
if (cfgstacki>=NELEM(cfgstack)) {
error("Looping (%d) during attempt to read config file \"%s\", break-out",NELEM(cfgstack),optind);
+static void retrying(void)
+{
+static int cnt=0;
+
+ if (++cnt>maxretryn) error("!Maximum command retry count (%d) exceeded",maxretryn);
+ if (verbose>=2) error(".Retrying phase, %d out of %d..",cnt,maxretryn);
+}
+
static char *devcmd(const char *term,const char *catch,const char *send,...)
{
size_t l,bufl,terml,catchl,fragl,offs;
char buf[LINE_MAX];
ssize_t got;
static char *devcmd(const char *term,const char *catch,const char *send,...)
{
size_t l,bufl,terml,catchl,fragl,offs;
char buf[LINE_MAX];
ssize_t got;
if (bufl>=sizeof(buf)-1) error("!Command too big (%d>%d)",bufl,sizeof(buf)-1);
if (verbose>=2) error(".devcmd(send=\"%s\",term=\"%s\",catch=\"%s\")",buf,term,catch);
buf[l]='\r'; buf[l+1]='\n';
if (bufl>=sizeof(buf)-1) error("!Command too big (%d>%d)",bufl,sizeof(buf)-1);
if (verbose>=2) error(".devcmd(send=\"%s\",term=\"%s\",catch=\"%s\")",buf,term,catch);
buf[l]='\r'; buf[l+1]='\n';
for (offs=0,got=0;offs<bufl;offs++) {
alarm(MAXSENDTIME);
usleep((offs?chartimen:cmdtimen)*1000);
for (offs=0,got=0;offs<bufl;offs++) {
alarm(MAXSENDTIME);
usleep((offs?chartimen:cmdtimen)*1000);
if (!catchdatal) {
if (!catch) return(NULL);
error("Data requested on command \"%s\" but no found after term \"%s\"",send,term);
if (!catchdatal) {
if (!catch) return(NULL);
error("Data requested on command \"%s\" but no found after term \"%s\"",send,term);
+ { &maxretry,&maxretryn,"maxretry" },
+ { &readtime,&readtimen,"readtime" },
{ &chartime,&chartimen,"chartime" },
{ &cmdtime ,&cmdtimen ,"cmdtime" },
};
{ &chartime,&chartimen,"chartime" },
{ &cmdtime ,&cmdtimen ,"cmdtime" },
};
if (tcsetattr(devfd,TCSANOW,&tios))
error("!Unable to set initial termios device settings");
if (tcsetattr(devfd,TCSANOW,&tios))
error("!Unable to set initial termios device settings");
do {
devcmd("",NULL,"\r\nAT\x1A");
devcmd(NULL,NULL,"\r\nAT");
smscset();
devcmd(NULL,NULL,"\r\nAT+CMGF=0");
devcmd("\n> ",NULL,"\r\nAT+CMGS=%d",(strlen(pdusmsc)+strlen(pdudata))/2);
do {
devcmd("",NULL,"\r\nAT\x1A");
devcmd(NULL,NULL,"\r\nAT");
smscset();
devcmd(NULL,NULL,"\r\nAT+CMGF=0");
devcmd("\n> ",NULL,"\r\nAT+CMGS=%d",(strlen(pdusmsc)+strlen(pdudata))/2);
- s=devcmd(NULL,"\n+CMGS:","!%s%s\x1A",pdusmsc,pdudata);
+ if (!(s=devcmd(NULL,"\n+CMGS:","!%s%s\x1A",pdusmsc,pdudata))) retrying();