Fixes for 9110 functionality.
authorshort <>
Mon, 1 Nov 1999 12:34:14 +0000 (12:34 +0000)
committershort <>
Mon, 1 Nov 1999 12:34:14 +0000 (12:34 +0000)
-lefence autochecking implemented for maintainer-mode.

configure.in
mdsms.c

index 0777284..d750ae6 100644 (file)
@@ -29,14 +29,16 @@ AC_MSG_RESULT($with_lock_directory)
 dnl Checks for programs.
 AC_PROG_CC
 if test "$USE_MAINTAINER_MODE" = yes;then
-  if test "$GCC" = yes;then
-               CFLAGS="-Wall -ansi -pedantic -ggdb"
-               LDFLAGS="$LDFLAGS -lefence"
+       if test "$GCC" = yes;then
+               CFLAGS="$CFLAGS -Wall -ansi -pedantic -ggdb"
+               if test x$efence != xno;then
+                       AC_CHECK_LIB(efence, EF_Exit)
                fi
+       fi
 else
        LDFLAGS="-s"
-  AC_DEFINE(NDEBUG)
-       fi
+       AC_DEFINE(NDEBUG)
+fi
 
 AC_PROG_CPP
 
diff --git a/mdsms.c b/mdsms.c
index 849035d..bb64c69 100644 (file)
--- a/mdsms.c
+++ b/mdsms.c
@@ -808,17 +808,15 @@ static const char *record;
 static char *catchdata;
 static size_t catchdatal,catchdatasiz;
 
-static void catched(const char *end)
+static void catched(const char *end,char edata)
 {
 size_t len;
-const char *p1,*p2;
+const char *p;
 
        if (!record) return;
        assert(end>=record);
-       p1=memchr(record,'\n',end-record);
-       p2=memchr(record,'\r',end-record);
-       if (!p1 || (p1 && p2 && p2<p1)) p1=p2;
-       if ((len=(p1?p1:end)-record)) {
+       p=memchr(record,edata,end-record);
+       if ((len=(p?p:end)-record)) {
                if (!catchdata)
                        chk(catchdata=malloc((catchdatasiz=LINE_MAX)));
                if (catchdatal+len>catchdatasiz)
@@ -827,7 +825,7 @@ const char *p1,*p2;
                memcpy(catchdata+catchdatal,record,len);
                catchdatal+=len;
                }
-       record=(p1?NULL:end);
+       record=(p?NULL:end);
        assert(catchdatal<=catchdatasiz);
 }
 
@@ -884,21 +882,21 @@ static size_t bufl;
 ssize_t got;
 char *hit,*s;
 va_list ap;
-char errout,extend,convcr;
+char errout,extend,noconvcr,edata;
 long alarmtime;
 const char *osend;
 static const char emptystring[]="";
 
        if (!term) term="\nOK\n";
-       convcr=!strchr(term,'\r');
        if (!strcmp(send," ")) send=NULL; /* GCC formatstring-check workaround */
        if (!(osend=send)) send="";
+       if ((noconvcr=(catch && *catch=='@'))) catch++;
        if ((errout=(*send=='!'))) send++;
        errout|=(maxretryn==-1);
        if ((extend=(*send=='~'))) send++;
        alarmtime=readtimen*(extend?EXT_READTIME:1);
-       d8("devcmd(), alarmtime=%ld, errout=%d, extend=%d, convcr=%d, osend=%p, bufl=%d, buf: %s\n",
-               alarmtime,errout,extend,convcr,osend,bufl,reform(buf,0));
+       d8("devcmd(), alarmtime=%ld, errout=%d, extend=%d, noconvcr=%d, osend=%p, bufl=%d, buf: %s\n",
+               alarmtime,errout,extend,noconvcr,osend,bufl,reform(buf,0));
        if (0) {
 err:
                alarm(0);
@@ -946,6 +944,7 @@ err:
        record=NULL;
        wasalarm=0;
        alarm(alarmtime);
+       edata=(noconvcr?'\r':'\n');
        if (!osend) {
                got=bufl;
                bufl=0;
@@ -972,12 +971,12 @@ skipread:
                while (buf+bufl2>s && (s=memchr(s,'\0',buf+bufl2-s))) *s++=REPL_NULLCHAR;
                if (verbose>=3)
                        error("\nGot chunk of data from device: %s",reform(buf+bufl,0));
-               if (convcr) {
+               if (!noconvcr) {
                        s=buf+bufl;
                        while (buf+bufl2>s && (s=memchr(s,'\r',buf+bufl2-s))) *s++='\n';
                        }
                bufl=bufl2;
-               catched(buf+bufl); assert(!record || record==buf+bufl);
+               catched(buf+bufl,edata); assert(!record || record==buf+bufl);
                assert(bufl<sizeof(buf)-1);
                buf[bufl]='\0';
                assert(strlen(buf)==bufl);
@@ -986,9 +985,9 @@ skipread:
                        error("Found ERROR response on command %s",reform(send,0));
                        goto err;
                        }
-               if (catch && bufl>=catchl && (hit=strstr(buf,catch))) {
+               if (catch && !record && bufl>=catchl && (hit=strstr(buf,catch))) {
                        record=hit+catchl;
-                       catched(buf+bufl); assert(!record || record==buf+bufl);
+                       catched(buf+bufl,edata); assert(!record || record==buf+bufl);
                        }
                if (         bufl>= terml && (hit=strstr(buf,term))) {
                        memmove(buf,hit+terml,(bufl2=(buf+bufl)-(hit+terml))); bufl=bufl2;
@@ -996,7 +995,7 @@ skipread:
                        }
                if (bufl<fragl) continue;
                memmove(buf,buf+bufl-(fragl-1),(bufl2=fragl-1)); bufl=bufl2;
-               if (record) record=buf+bufl;
+               if (record) record=buf+fragl-1;
                }
        alarm(0);
        if (!catchdatal) {
@@ -1006,7 +1005,7 @@ skipread:
                }
        assert(!!catch);
        record=emptystring;
-       catched(record+1);
+       catched(record+1,edata);
        if (verbose>=2) error(".Returning data %s for cmd %s",reform(catchdata,0),reform(send,1));
        return(catchdata);
 }
@@ -1838,11 +1837,11 @@ struct hexdata *hd;
                                d1("Lock-device succeeded\n");
                                do {
                                        d1("Reading a message for us...\n");
-                                       if (!(s=devcmd("\r","+CMT:"," ")))
+                                       if (!(s=devcmd("\r","@+CMT:"," ")))
                                                goto retryall;
                                        if (!(i=receive_headerparse(s)))
                                                error("Receive-header parsing failed on: %s",s);
-                                       if (!(s=devcmd("\r","\n"," ")))
+                                       if (!(s=devcmd("\r","@\n"," ")))
                                                goto retryall;
                                        if (i) receive_accept(s);
                                        if (!devcmd("\n",NULL," ")) /* eat last '\n' */