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