Implement ABORT strings.

This commit is contained in:
Brian Somers 1998-02-26 17:54:43 +00:00
parent 4bc1da96a9
commit 486f40c95c
2 changed files with 105 additions and 41 deletions

View file

@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: chat.c,v 1.44.2.10 1998/02/18 00:28:06 brian Exp $
* $Id: chat.c,v 1.44.2.11 1998/02/23 00:38:20 brian Exp $
*/
#include <sys/param.h>
@ -201,10 +201,26 @@ chat_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n)
chat_ExpandString(c, c->argptr, c->exp + 2, sizeof c->exp - 2, needcr);
if (gotabort) {
if (c->numaborts < sizeof c->AbortStrings / sizeof c->AbortStrings[0])
c->AbortStrings[c->numaborts++] = strdup(c->exp+2);
else
LogPrintf(LogERROR, "chat_UpdateSet: AbortStrings overflow\n");
if (c->abort.num < MAXABORTS) {
int len, n;
len = strlen(c->exp+2);
for (n = 0; n < c->abort.num; n++)
if (len > c->abort.string[n].len) {
int last;
for (last = c->abort.num; last > n; last--) {
c->abort.string[last].data = c->abort.string[last-1].data;
c->abort.string[last].len = c->abort.string[last-1].len;
}
break;
}
c->abort.string[n].len = len;
c->abort.string[n].data = (char *)malloc(len+1);
memcpy(c->abort.string[n].data, c->exp+2, len+1);
c->abort.num++;
} else
LogPrintf(LogERROR, "chat_UpdateSet: too many abort strings\n");
gotabort = 0;
} else if (gottimeout) {
c->TimeoutSec = atoi(c->exp + 2);
@ -294,27 +310,33 @@ chat_UpdateLog(struct chat *c, int in)
* buffer, output from there, all the way back to the last linefeed.
* This is called for every read of `in' bytes.
*/
char *ptr, *end, *stop;
char *ptr, *end, *stop, ch;
int level;
level = LogIsKept(LogCHAT) ? LogCHAT : LogCONNECT;
ptr = c->bufend - in;
for (end = c->bufend - 1; end >= ptr; end--)
if (*end == '\n')
break;
if (in == -1)
end = ptr = c->bufend;
else {
ptr = c->bufend - in;
for (end = c->bufend - 1; end >= ptr; end--)
if (*end == '\n')
break;
}
if (end >= ptr) {
for (ptr = c->bufend - in - 1; ptr >= c->bufstart; ptr--)
for (ptr = c->bufend - (in == -1 ? 1 : in + 1); ptr >= c->bufstart; ptr--)
if (*ptr == '\n')
break;
ptr++;
stop = NULL;
while (stop != end && (stop = strchr(ptr, '\n'))) {
while (stop < end) {
if ((stop = memchr(ptr, '\n', end - ptr)) == NULL)
stop = end;
ch = *stop;
*stop = '\0';
if (level == LogCHAT || strstr(ptr, "CONNECT"))
LogPrintf(level, "Received: %s\n", ptr);
*stop = '\n';
*stop = ch;
ptr = stop + 1;
}
}
@ -328,7 +350,8 @@ chat_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
if (c->state == CHAT_EXPECT) {
ssize_t in;
char *begin, *end;
char *abegin, *ebegin, *begin, *aend, *eend, *end;
int n;
/*
* XXX - should this read only 1 byte to guarantee that we don't
@ -343,10 +366,23 @@ chat_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
return;
/* `begin' and `end' delimit where we're going to strncmp() from */
begin = c->bufend - c->arglen + 1;
end = begin + in;
if (begin < c->bufstart)
begin = c->bufstart;
ebegin = c->bufend - c->arglen + 1;
eend = ebegin + in;
if (ebegin < c->bufstart)
ebegin = c->bufstart;
if (c->abort.num) {
abegin = c->bufend - c->abort.string[0].len + 1;
aend = c->bufend - c->abort.string[c->abort.num-1].len + in + 1;
if (abegin < c->bufstart)
abegin = c->bufstart;
} else {
abegin = ebegin;
aend = eend;
}
begin = abegin < ebegin ? abegin : ebegin;
end = aend < eend ? eend : aend;
c->bufend += in;
chat_UpdateLog(c, in);
@ -359,9 +395,10 @@ chat_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
if (c->buf[chop] == '\n')
/* found some already-logged garbage to remove :-) */
break;
if (!chop) {
if (!chop)
chop = begin - c->buf;
}
if (chop) {
char *from, *to;
@ -373,28 +410,48 @@ chat_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset)
c->bufend -= chop;
begin -= chop;
end -= chop;
abegin -= chop;
aend -= chop;
ebegin -= chop;
eend -= chop;
}
}
for (; begin < end; begin++)
if (!strncmp(begin, c->argptr, c->arglen)) {
if (begin >= ebegin && begin < eend &&
!strncmp(begin, c->argptr, c->arglen)) {
/* Got it ! */
if (begin[c->arglen - 1] != '\n') {
/* Now coerce chat_UpdateLog() into logging it.... */
char ch;
if (memchr(begin + c->arglen - 1, '\n',
c->bufend - begin - c->arglen + 1) == NULL) {
/* force it into the log */
end = c->bufend;
c->bufend = begin + c->arglen;
ch = *c->bufend;
*c->bufend++ = '\n';
chat_UpdateLog(c, 1);
*--c->bufend = ch;
chat_UpdateLog(c, -1);
c->bufend = end;
}
c->bufstart = begin + c->arglen;
c->argptr += c->arglen;
c->arglen = 0;
break;
} else if (begin >= abegin && begin < aend) {
for (n = c->abort.num - 1; n >= 0; n--) {
if (begin + c->abort.string[n].len > c->bufend)
break;
if (!strncmp(begin, c->abort.string[n].data,
c->abort.string[n].len)) {
if (memchr(begin + c->abort.string[n].len - 1, '\n',
c->bufend - begin - c->abort.string[n].len + 1) == NULL) {
/* force it into the log */
end = c->bufend;
c->bufend = begin + c->abort.string[n].len;
chat_UpdateLog(c, -1);
c->bufend = end;
}
c->bufstart = begin + c->abort.string[n].len;
c->state = CHAT_FAILED;
return;
}
}
}
}
}
@ -475,7 +532,7 @@ chat_Init(struct chat *c, struct physical *p, const char *data, int emptybuf)
c->TimeoutSec = 30;
c->TimedOut = 0;
c->numaborts = 0;
c->abort.num = 0;
StopTimer(&c->pause);
c->pause.state = TIMER_STOPPED;
@ -487,8 +544,8 @@ chat_Init(struct chat *c, struct physical *p, const char *data, int emptybuf)
void
chat_Destroy(struct chat *c)
{
while (c->numaborts)
free(c->AbortStrings[--c->numaborts]);
while (c->abort.num)
free(c->abort.string[--c->abort.num].data);
}
static char *
@ -619,7 +676,6 @@ chat_ExpandString(struct chat *c, const char *str, char *result, int reslen,
strncpy(result, phone, reslen);
reslen -= strlen(result);
result += strlen(result);
prompt_Printf(&prompt, "Phone: %s\n", phone);
LogPrintf(LogPHASE, "Phone: %s\n", phone);
break;
case 'U':

View file

@ -23,13 +23,15 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id$
* $Id: chat.h,v 1.9.2.2 1998/02/13 05:10:08 brian Exp $
*/
#define CHAT_EXPECT 0
#define CHAT_SEND 1
#define CHAT_DONE 2
#define CHAT_FAILED 3
#define CHAT_EXPECT 0
#define CHAT_SEND 1
#define CHAT_DONE 2
#define CHAT_FAILED 3
#define MAXABORTS 50
struct chat {
struct descriptor desc;
@ -53,8 +55,14 @@ struct chat {
int TimeoutSec; /* Expect timeout value */
int TimedOut; /* We timed out */
char *AbortStrings[50]; /* Abort the dial if we get one */
int numaborts; /* How many AbortStrings */
struct {
struct {
char *data; /* Abort the dial if we get one */
int len;
} string[MAXABORTS];
int num; /* How many AbortStrings */
} abort;
struct pppTimer pause; /* Inactivity timer */
struct pppTimer timeout; /* TimeoutSec timer */