#include <stdio.h> #include <setjmp.h> #include <time.h> extern jmp_buf Sjbuf; extern int Debug; extern char tty[]; /* terminal we're talking at */ extern long ttycspeed; /* speed it's at */ extern char ttyprefix[]; /* dial prefix */ extern char ttysuffix[]; /* dial suffix */ extern char ttyinit[]; /* init string */ extern long ttyispeed; /* init speed */ extern char ttybusy[]; extern char ttyfail[]; extern int (*cdf)(); /* * eXaMiNe() matches some reply string against a list of oopsie commands */ static eXaMiNe(list, reply, rx, rsize) register char *list, *reply; register rsize; { register lsize; register i; register rb; for (; *list; list += (1+lsize)) { lsize = strlen(list); rb = (rx-lsize) % rsize; for (i=0; i<lsize; i++) if (reply[(rb+i)%rsize] != list[i]) goto next; return 1; next: ; } return 0; } /* eXaMiNe */ /* * dial() - call someone on the telephone. */ dial(address, retries) char *address; { register time_t tick; char reply[40]; register rx; int status=1; enable(); ttyspeed(ttyispeed); slowputs(ttyinit); ttyspeed(ttycspeed); do { memset(reply, 0, sizeof reply); slowputs(ttyprefix); slowputs(address); slowputs(ttysuffix); for (tick=clock()+(45L*(long)CLK_TCK); tick>clock(); ) { if ((*cdf)()) return 0; else while (ttystat()) { reply[rx] = ttyin(); rx = (1+rx) % sizeof reply; if (eXaMiNe(ttybusy, reply, rx, sizeof reply)) goto disable; else if (eXaMiNe(ttyfail, reply, rx, sizeof reply)) { status=2; goto disable; } } sleep(1); } disable:slowputs("\r"); disable(); sleep(2); enable(); slowputs("\r"); } while (status <= 1 && retries-- > 0); return status; }