1*6562Sshannon /* ventel.c 1.1 82/04/19 */ 2*6562Sshannon 3*6562Sshannon #if VENTEL 4*6562Sshannon /* 5*6562Sshannon * Routines for calling up on a Ventel Modem 6*6562Sshannon */ 7*6562Sshannon #include "tip.h" 8*6562Sshannon #include <setjmp.h> 9*6562Sshannon #include <errno.h> 10*6562Sshannon 11*6562Sshannon #define MAXRETRY 5 12*6562Sshannon #define DISCONNECT "\03" /* ^C */ 13*6562Sshannon 14*6562Sshannon static int sigALRM(); 15*6562Sshannon static int timeout = 0; 16*6562Sshannon 17*6562Sshannon ven_dialer(num, acu) 18*6562Sshannon register char *num; 19*6562Sshannon char *acu; 20*6562Sshannon { 21*6562Sshannon register char *cp; 22*6562Sshannon register int connected = 0; 23*6562Sshannon #ifdef ACULOG 24*6562Sshannon char line[80]; 25*6562Sshannon #endif 26*6562Sshannon /* 27*6562Sshannon * Get in synch with a couple of carriage returns 28*6562Sshannon */ 29*6562Sshannon if (!vensync(FD)) { 30*6562Sshannon printf("can't synchronize with ventel\n"); 31*6562Sshannon #ifdef ACULOG 32*6562Sshannon logent(value(HOST), num, "ventel", "can't synch up"); 33*6562Sshannon #endif 34*6562Sshannon return (0); 35*6562Sshannon } 36*6562Sshannon ioctl(FD, TIOCHPCL, 0); 37*6562Sshannon echo("k$\n$D$I$A$L$:$ <"); 38*6562Sshannon for (cp = num; *cp; cp++) { 39*6562Sshannon sleep(1); 40*6562Sshannon write(FD, cp, 1); 41*6562Sshannon read(FD, cp, 1); 42*6562Sshannon } 43*6562Sshannon echo(">\r$\n"); 44*6562Sshannon if (gobble('\n')) 45*6562Sshannon connected = gobble('!'); 46*6562Sshannon ioctl(FD, TIOCFLUSH); 47*6562Sshannon #ifdef ACULOG 48*6562Sshannon if (timeout) { 49*6562Sshannon sprintf(line, "%d second dial timeout", 50*6562Sshannon number(value(DIALTIMEOUT))); 51*6562Sshannon logent(value(HOST), num, "ventel", line); 52*6562Sshannon } 53*6562Sshannon #endif 54*6562Sshannon if (timeout) 55*6562Sshannon ven_disconnect(); /* insurance */ 56*6562Sshannon return (connected); 57*6562Sshannon } 58*6562Sshannon 59*6562Sshannon ven_disconnect() 60*6562Sshannon { 61*6562Sshannon close(FD); 62*6562Sshannon } 63*6562Sshannon 64*6562Sshannon ven_abort() 65*6562Sshannon { 66*6562Sshannon write(FD, "\03", 1); 67*6562Sshannon close(FD); 68*6562Sshannon } 69*6562Sshannon 70*6562Sshannon static int 71*6562Sshannon echo(s) 72*6562Sshannon register char *s; 73*6562Sshannon { 74*6562Sshannon char c; 75*6562Sshannon 76*6562Sshannon while (c = *s++) switch (c) { 77*6562Sshannon 78*6562Sshannon case '$': 79*6562Sshannon read(FD, &c, 1); 80*6562Sshannon s++; 81*6562Sshannon break; 82*6562Sshannon 83*6562Sshannon case '#': 84*6562Sshannon c = *s++; 85*6562Sshannon write(FD, &c, 1); 86*6562Sshannon break; 87*6562Sshannon 88*6562Sshannon default: 89*6562Sshannon write(FD, &c, 1); 90*6562Sshannon read(FD, &c, 1); 91*6562Sshannon } 92*6562Sshannon } 93*6562Sshannon 94*6562Sshannon static int 95*6562Sshannon sigALRM() 96*6562Sshannon { 97*6562Sshannon signal(SIGALRM, SIG_IGN); 98*6562Sshannon printf("\07timeout waiting for reply\n"); 99*6562Sshannon timeout = 1; 100*6562Sshannon } 101*6562Sshannon 102*6562Sshannon static int 103*6562Sshannon gobble(s) 104*6562Sshannon register char s; 105*6562Sshannon { 106*6562Sshannon char c; 107*6562Sshannon 108*6562Sshannon signal(SIGALRM, sigALRM); 109*6562Sshannon timeout = 0; 110*6562Sshannon do { 111*6562Sshannon alarm(number(value(DIALTIMEOUT))); 112*6562Sshannon read(FD, &c, 1); 113*6562Sshannon c &= 0177; 114*6562Sshannon #ifdef notdef 115*6562Sshannon if (boolean(value(VERBOSE))) 116*6562Sshannon #endif 117*6562Sshannon putchar(c); 118*6562Sshannon alarm(0); 119*6562Sshannon if (timeout) 120*6562Sshannon return (0); 121*6562Sshannon } while (c != '\n' && c != s); 122*6562Sshannon signal(SIGALRM, SIG_DFL); 123*6562Sshannon return (c == s); 124*6562Sshannon } 125*6562Sshannon 126*6562Sshannon #define min(a,b) ((a)>(b)?(b):(a)) 127*6562Sshannon /* 128*6562Sshannon * This convoluted piece of code attempts to get 129*6562Sshannon * the ventel in sync. If you don't have the capacity or nread 130*6562Sshannon * call there are gory ways to simulate this. 131*6562Sshannon */ 132*6562Sshannon static int 133*6562Sshannon vensync(fd) 134*6562Sshannon { 135*6562Sshannon long nread; 136*6562Sshannon register int already = 0, nbytes; 137*6562Sshannon char buf[60]; 138*6562Sshannon 139*6562Sshannon /* 140*6562Sshannon * Toggle DTR to force anyone off that might have left 141*6562Sshannon * the modem connected, and insure a consistent state 142*6562Sshannon * to start from. 143*6562Sshannon * 144*6562Sshannon * If you don't have the ioctl calls to diddle directly 145*6562Sshannon * with DTR, you can always try setting the baud rate to 0. 146*6562Sshannon */ 147*6562Sshannon ioctl(FD, TIOCCDTR, 0); 148*6562Sshannon sleep(2); 149*6562Sshannon ioctl(FD, TIOCSDTR, 0); 150*6562Sshannon while (already < MAXRETRY) { 151*6562Sshannon /* 152*6562Sshannon * After reseting the modem, send it two \r's to 153*6562Sshannon * autobaud on. Make sure to delay between them 154*6562Sshannon * so the modem can frame the incoming characters. 155*6562Sshannon */ 156*6562Sshannon write(fd, "\r", 1); 157*6562Sshannon sleep(1); 158*6562Sshannon write(fd, "\r", 1); 159*6562Sshannon sleep(3); 160*6562Sshannon if (ioctl(fd, FIONREAD, (caddr_t)&nread) >= 0) { 161*6562Sshannon nbytes = nread; 162*6562Sshannon while (nbytes > 0) { 163*6562Sshannon read(fd, buf, min(nbytes, 60)); 164*6562Sshannon if ((buf[nbytes-1]&0177) == '$') 165*6562Sshannon return (1); 166*6562Sshannon nbytes -= min(nbytes, 60); 167*6562Sshannon } 168*6562Sshannon sleep(1); 169*6562Sshannon already++; 170*6562Sshannon } 171*6562Sshannon } 172*6562Sshannon return (0); 173*6562Sshannon } 174*6562Sshannon #endif 175