126153Sbloom #ifndef lint 2*46875Sbostic static char sccsid[] = "@(#)att2224.c 1.3 (Berkeley) 03/02/91"; 326153Sbloom #endif 426153Sbloom 5*46875Sbostic #include "condevs.h" 626153Sbloom 726153Sbloom attopn(telno, flds, dev) 826153Sbloom char *telno, *flds[]; 926153Sbloom struct Devices *dev; 1026153Sbloom { 1126153Sbloom char dcname[20], phone[MAXPH+10], c = 0; 1226153Sbloom int dnf, failret = 0, timelim; 1326153Sbloom 1426153Sbloom sprintf(dcname, "/dev/%s", dev->D_line); 1526153Sbloom 1626153Sbloom if (setjmp(Sjbuf)) { 1726153Sbloom delock(dev->D_line); 1826153Sbloom logent("DEVICE", "NO"); 1926153Sbloom DEBUG(4, "Open timed out %s", dcname); 2026153Sbloom alarm (0); 2126153Sbloom return CF_NODEV; 2226153Sbloom } 2326153Sbloom 2426153Sbloom signal(SIGALRM, alarmtr); 2526153Sbloom getnextfd(); 2626153Sbloom alarm(10); 2726153Sbloom 2826153Sbloom if ((dnf = open(dcname, 2)) <= 0) { 2926153Sbloom delock(dev->D_line); 3026153Sbloom logent("DEVICE", "NO"); 3126153Sbloom DEBUG(4, "Can't open %s", dcname); 3226153Sbloom alarm (0); 3326153Sbloom return CF_NODEV; 3426153Sbloom } 3526153Sbloom 3626153Sbloom alarm(0); 3726153Sbloom next_fd = -1; 3826153Sbloom fixline(dnf, dev->D_speed); 3926153Sbloom DEBUG(4, "modem port - %s\n", dcname); 4026153Sbloom 4126153Sbloom if (setjmp(Sjbuf)) { 4226153Sbloom delock(dev->D_line); 4326153Sbloom logent("ACU WRITE", "FAILED"); 4426153Sbloom return CF_DIAL; 4526153Sbloom } 4626153Sbloom signal(SIGALRM, alarmtr); 4726153Sbloom alarm(10); 4826153Sbloom do { 4926153Sbloom slowrite(dnf, "\r"); /* wake up modem */ 5026153Sbloom } while (expect(":~3", dnf)); 5126153Sbloom alarm(0); 5226153Sbloom 5326153Sbloom sprintf (phone, "atzt%s\r", telno); 5426153Sbloom slowrite (dnf, phone); /* type telno string to modem */ 5526153Sbloom 5626153Sbloom if ((expect(phone, dnf)) != SUCCESS) { 5726153Sbloom delock(dev->D_line); 5826153Sbloom logent("ACU READ", "FAILED"); 5926153Sbloom return CF_DIAL; 6026153Sbloom } 6126153Sbloom 6226153Sbloom if (setjmp(Sjbuf)) { 6326153Sbloom delock(dev->D_line); 6426153Sbloom logent("NO ANSWER", "FAILED"); 6526153Sbloom alarm (0); 6626153Sbloom return CF_DIAL; 6726153Sbloom } 6826153Sbloom timelim = strlen(telno) * 4; 6926153Sbloom signal(SIGALRM, alarmtr); 7026153Sbloom alarm(timelim > 30 ? timelim : 30); 7126153Sbloom 7226153Sbloom readchar: 7326153Sbloom if ((read(dnf, &c, 1)) != 1) { 7426153Sbloom delock(dev->D_line); 7526153Sbloom logent("ACU READ", "FAILED"); 7626153Sbloom return CF_DIAL; 7726153Sbloom } 7826153Sbloom 7926153Sbloom switch (c) { 8026153Sbloom case 'D': /* no dial tone */ 8126153Sbloom logent("NO DIAL TONE", "FAILED"); 8226153Sbloom failret++; 8326153Sbloom break; 8426153Sbloom case 'B': /* line busy */ 8526153Sbloom logent("LINE BUSY", "FAILED"); 8626153Sbloom failret++; 8726153Sbloom break; 8826153Sbloom case 'N': /* no answer */ 8926153Sbloom logent("NO ANSWER", "FAILED"); 9026153Sbloom failret++; 9126153Sbloom break; 9226153Sbloom case 'H': /* handshake failed */ 9326153Sbloom logent("MODEM HANDSHAKE", "FAILED"); 9426153Sbloom failret++; 9526153Sbloom break; 9626153Sbloom case '3': /* 2400 baud */ 9726153Sbloom DEBUG(4, "Baudrate set to 2400 baud", CNULL); 9826153Sbloom fixline(dnf, 2400); 9926153Sbloom break; 10026153Sbloom case '2': /* 1200 baud */ 10126153Sbloom DEBUG(4, "Baudrate set to 1200 baud", CNULL); 10226153Sbloom fixline(dnf, 1200); 10326153Sbloom break; 10426153Sbloom case '1': /* 300 baud */ 10526153Sbloom DEBUG(4, "Baudrate set to 300 baud", CNULL); 10626153Sbloom fixline(dnf, 300); 10726153Sbloom break; 10826153Sbloom default: /* Not one of the above, so must be garbage */ 10926153Sbloom goto readchar; 11026153Sbloom } 11126153Sbloom if (failret) { 11226153Sbloom alarm (0); 11326153Sbloom delock(dev->D_line); 11426153Sbloom return CF_DIAL; 11526153Sbloom } 11626153Sbloom alarm (0); 11726153Sbloom return dnf; 11826153Sbloom } 11926153Sbloom 12026153Sbloom attcls(fd) 12126153Sbloom int fd; 12226153Sbloom { 12326153Sbloom char dcname[20]; 12426153Sbloom #ifdef USG 12526153Sbloom struct termio hup, sav; 12626153Sbloom #else !USG 12726153Sbloom struct sgttyb hup, sav; 12826153Sbloom #endif !USG 12926153Sbloom 13026153Sbloom if (fd > 0) { 13126153Sbloom sprintf(dcname, "/dev/%s", devSel); 13226153Sbloom DEBUG(4, "Hanging up fd = %d\n", fd); 13326153Sbloom /* 13426153Sbloom * code to drop DTR -- change to 0 baud then back to default. 13526153Sbloom */ 13626153Sbloom gtty(fd, &hup); 13726153Sbloom gtty(fd, &sav); 13826153Sbloom #ifdef USG 13926153Sbloom hup.c_cflag = B0; 14026153Sbloom #else !USG 14126153Sbloom hup.sg_ispeed = B0; 14226153Sbloom hup.sg_ospeed = B0; 14326153Sbloom #endif !USG 14426153Sbloom stty(fd, &hup); 14526153Sbloom sleep(2); 14626153Sbloom stty(fd, &sav); 14726153Sbloom /* 14826153Sbloom * now raise DTR -- close the device 14926153Sbloom */ 15026153Sbloom sleep(2); 15126153Sbloom close(fd); 15226153Sbloom delock(devSel); 15326153Sbloom } 15426153Sbloom } 155