1*7592Sshannon /* ventel.c 1.2 82/07/29 */ 26562Sshannon 36562Sshannon #if VENTEL 46562Sshannon /* 56562Sshannon * Routines for calling up on a Ventel Modem 66562Sshannon */ 76562Sshannon #include "tip.h" 86562Sshannon #include <setjmp.h> 96562Sshannon #include <errno.h> 106562Sshannon 116562Sshannon #define MAXRETRY 5 126562Sshannon #define DISCONNECT "\03" /* ^C */ 136562Sshannon 146562Sshannon static int sigALRM(); 156562Sshannon static int timeout = 0; 166562Sshannon 176562Sshannon ven_dialer(num, acu) 186562Sshannon register char *num; 196562Sshannon char *acu; 206562Sshannon { 216562Sshannon register char *cp; 226562Sshannon register int connected = 0; 23*7592Sshannon char c; 246562Sshannon #ifdef ACULOG 256562Sshannon char line[80]; 266562Sshannon #endif 276562Sshannon /* 286562Sshannon * Get in synch with a couple of carriage returns 296562Sshannon */ 306562Sshannon if (!vensync(FD)) { 316562Sshannon printf("can't synchronize with ventel\n"); 326562Sshannon #ifdef ACULOG 336562Sshannon logent(value(HOST), num, "ventel", "can't synch up"); 346562Sshannon #endif 356562Sshannon return (0); 366562Sshannon } 37*7592Sshannon if (boolean(value(VERBOSE))) 38*7592Sshannon printf("\ndialing..."); 39*7592Sshannon fflush(stdout); 406562Sshannon ioctl(FD, TIOCHPCL, 0); 41*7592Sshannon echo("k$\r$\n$D$I$A$L$:$ <"); 426562Sshannon for (cp = num; *cp; cp++) { 436562Sshannon sleep(1); 446562Sshannon write(FD, cp, 1); 45*7592Sshannon read(FD, &c, 1); 466562Sshannon } 476562Sshannon echo(">\r$\n"); 486562Sshannon if (gobble('\n')) 496562Sshannon connected = gobble('!'); 506562Sshannon ioctl(FD, TIOCFLUSH); 516562Sshannon #ifdef ACULOG 526562Sshannon if (timeout) { 536562Sshannon sprintf(line, "%d second dial timeout", 546562Sshannon number(value(DIALTIMEOUT))); 556562Sshannon logent(value(HOST), num, "ventel", line); 566562Sshannon } 576562Sshannon #endif 586562Sshannon if (timeout) 596562Sshannon ven_disconnect(); /* insurance */ 606562Sshannon return (connected); 616562Sshannon } 626562Sshannon 636562Sshannon ven_disconnect() 646562Sshannon { 656562Sshannon close(FD); 666562Sshannon } 676562Sshannon 686562Sshannon ven_abort() 696562Sshannon { 706562Sshannon write(FD, "\03", 1); 716562Sshannon close(FD); 726562Sshannon } 736562Sshannon 746562Sshannon static int 756562Sshannon echo(s) 766562Sshannon register char *s; 776562Sshannon { 786562Sshannon char c; 796562Sshannon 806562Sshannon while (c = *s++) switch (c) { 816562Sshannon 826562Sshannon case '$': 836562Sshannon read(FD, &c, 1); 846562Sshannon s++; 856562Sshannon break; 866562Sshannon 876562Sshannon case '#': 886562Sshannon c = *s++; 896562Sshannon write(FD, &c, 1); 906562Sshannon break; 916562Sshannon 926562Sshannon default: 936562Sshannon write(FD, &c, 1); 946562Sshannon read(FD, &c, 1); 956562Sshannon } 966562Sshannon } 976562Sshannon 986562Sshannon static int 996562Sshannon sigALRM() 1006562Sshannon { 1016562Sshannon signal(SIGALRM, SIG_IGN); 1026562Sshannon printf("\07timeout waiting for reply\n"); 1036562Sshannon timeout = 1; 1046562Sshannon } 1056562Sshannon 1066562Sshannon static int 1076562Sshannon gobble(s) 1086562Sshannon register char s; 1096562Sshannon { 1106562Sshannon char c; 1116562Sshannon 1126562Sshannon signal(SIGALRM, sigALRM); 1136562Sshannon timeout = 0; 1146562Sshannon do { 1156562Sshannon alarm(number(value(DIALTIMEOUT))); 1166562Sshannon read(FD, &c, 1); 1176562Sshannon c &= 0177; 118*7592Sshannon alarm(0); 1196562Sshannon #ifdef notdef 1206562Sshannon if (boolean(value(VERBOSE))) 121*7592Sshannon putchar(c); 1226562Sshannon #endif 1236562Sshannon if (timeout) 1246562Sshannon return (0); 1256562Sshannon } while (c != '\n' && c != s); 1266562Sshannon signal(SIGALRM, SIG_DFL); 1276562Sshannon return (c == s); 1286562Sshannon } 1296562Sshannon 1306562Sshannon #define min(a,b) ((a)>(b)?(b):(a)) 1316562Sshannon /* 1326562Sshannon * This convoluted piece of code attempts to get 1336562Sshannon * the ventel in sync. If you don't have the capacity or nread 1346562Sshannon * call there are gory ways to simulate this. 1356562Sshannon */ 1366562Sshannon static int 1376562Sshannon vensync(fd) 1386562Sshannon { 1396562Sshannon long nread; 1406562Sshannon register int already = 0, nbytes; 1416562Sshannon char buf[60]; 1426562Sshannon 1436562Sshannon /* 1446562Sshannon * Toggle DTR to force anyone off that might have left 1456562Sshannon * the modem connected, and insure a consistent state 1466562Sshannon * to start from. 1476562Sshannon * 1486562Sshannon * If you don't have the ioctl calls to diddle directly 1496562Sshannon * with DTR, you can always try setting the baud rate to 0. 1506562Sshannon */ 1516562Sshannon ioctl(FD, TIOCCDTR, 0); 1526562Sshannon sleep(2); 1536562Sshannon ioctl(FD, TIOCSDTR, 0); 1546562Sshannon while (already < MAXRETRY) { 1556562Sshannon /* 1566562Sshannon * After reseting the modem, send it two \r's to 1576562Sshannon * autobaud on. Make sure to delay between them 1586562Sshannon * so the modem can frame the incoming characters. 1596562Sshannon */ 1606562Sshannon write(fd, "\r", 1); 1616562Sshannon sleep(1); 1626562Sshannon write(fd, "\r", 1); 1636562Sshannon sleep(3); 1646562Sshannon if (ioctl(fd, FIONREAD, (caddr_t)&nread) >= 0) { 1656562Sshannon nbytes = nread; 1666562Sshannon while (nbytes > 0) { 1676562Sshannon read(fd, buf, min(nbytes, 60)); 1686562Sshannon if ((buf[nbytes-1]&0177) == '$') 1696562Sshannon return (1); 1706562Sshannon nbytes -= min(nbytes, 60); 1716562Sshannon } 1726562Sshannon sleep(1); 1736562Sshannon already++; 1746562Sshannon } 1756562Sshannon } 1766562Sshannon return (0); 1776562Sshannon } 1786562Sshannon #endif 179