1*26153Sbloom #ifndef lint 2*26153Sbloom static char sccsid[] = "@(#)att2224.c 1.1 (Berkeley) 02/12/86"; 3*26153Sbloom #endif 4*26153Sbloom 5*26153Sbloom #include "../condevs.h" 6*26153Sbloom 7*26153Sbloom #ifdef ATT2224 8*26153Sbloom attopn(telno, flds, dev) 9*26153Sbloom char *telno, *flds[]; 10*26153Sbloom struct Devices *dev; 11*26153Sbloom { 12*26153Sbloom char dcname[20], phone[MAXPH+10], c = 0; 13*26153Sbloom int dnf, failret = 0, timelim; 14*26153Sbloom 15*26153Sbloom sprintf(dcname, "/dev/%s", dev->D_line); 16*26153Sbloom 17*26153Sbloom if (setjmp(Sjbuf)) { 18*26153Sbloom delock(dev->D_line); 19*26153Sbloom logent("DEVICE", "NO"); 20*26153Sbloom DEBUG(4, "Open timed out %s", dcname); 21*26153Sbloom alarm (0); 22*26153Sbloom return CF_NODEV; 23*26153Sbloom } 24*26153Sbloom 25*26153Sbloom signal(SIGALRM, alarmtr); 26*26153Sbloom getnextfd(); 27*26153Sbloom alarm(10); 28*26153Sbloom 29*26153Sbloom if ((dnf = open(dcname, 2)) <= 0) { 30*26153Sbloom delock(dev->D_line); 31*26153Sbloom logent("DEVICE", "NO"); 32*26153Sbloom DEBUG(4, "Can't open %s", dcname); 33*26153Sbloom alarm (0); 34*26153Sbloom return CF_NODEV; 35*26153Sbloom } 36*26153Sbloom 37*26153Sbloom alarm(0); 38*26153Sbloom next_fd = -1; 39*26153Sbloom fixline(dnf, dev->D_speed); 40*26153Sbloom DEBUG(4, "modem port - %s\n", dcname); 41*26153Sbloom 42*26153Sbloom if (setjmp(Sjbuf)) { 43*26153Sbloom delock(dev->D_line); 44*26153Sbloom logent("ACU WRITE", "FAILED"); 45*26153Sbloom return CF_DIAL; 46*26153Sbloom } 47*26153Sbloom signal(SIGALRM, alarmtr); 48*26153Sbloom alarm(10); 49*26153Sbloom do { 50*26153Sbloom slowrite(dnf, "\r"); /* wake up modem */ 51*26153Sbloom } while (expect(":~3", dnf)); 52*26153Sbloom alarm(0); 53*26153Sbloom 54*26153Sbloom sprintf (phone, "atzt%s\r", telno); 55*26153Sbloom slowrite (dnf, phone); /* type telno string to modem */ 56*26153Sbloom 57*26153Sbloom if ((expect(phone, dnf)) != SUCCESS) { 58*26153Sbloom delock(dev->D_line); 59*26153Sbloom logent("ACU READ", "FAILED"); 60*26153Sbloom return CF_DIAL; 61*26153Sbloom } 62*26153Sbloom 63*26153Sbloom if (setjmp(Sjbuf)) { 64*26153Sbloom delock(dev->D_line); 65*26153Sbloom logent("NO ANSWER", "FAILED"); 66*26153Sbloom alarm (0); 67*26153Sbloom return CF_DIAL; 68*26153Sbloom } 69*26153Sbloom timelim = strlen(telno) * 4; 70*26153Sbloom signal(SIGALRM, alarmtr); 71*26153Sbloom alarm(timelim > 30 ? timelim : 30); 72*26153Sbloom 73*26153Sbloom readchar: 74*26153Sbloom if ((read(dnf, &c, 1)) != 1) { 75*26153Sbloom delock(dev->D_line); 76*26153Sbloom logent("ACU READ", "FAILED"); 77*26153Sbloom return CF_DIAL; 78*26153Sbloom } 79*26153Sbloom 80*26153Sbloom switch (c) { 81*26153Sbloom case 'D': /* no dial tone */ 82*26153Sbloom logent("NO DIAL TONE", "FAILED"); 83*26153Sbloom failret++; 84*26153Sbloom break; 85*26153Sbloom case 'B': /* line busy */ 86*26153Sbloom logent("LINE BUSY", "FAILED"); 87*26153Sbloom failret++; 88*26153Sbloom break; 89*26153Sbloom case 'N': /* no answer */ 90*26153Sbloom logent("NO ANSWER", "FAILED"); 91*26153Sbloom failret++; 92*26153Sbloom break; 93*26153Sbloom case 'H': /* handshake failed */ 94*26153Sbloom logent("MODEM HANDSHAKE", "FAILED"); 95*26153Sbloom failret++; 96*26153Sbloom break; 97*26153Sbloom case '3': /* 2400 baud */ 98*26153Sbloom DEBUG(4, "Baudrate set to 2400 baud", CNULL); 99*26153Sbloom fixline(dnf, 2400); 100*26153Sbloom break; 101*26153Sbloom case '2': /* 1200 baud */ 102*26153Sbloom DEBUG(4, "Baudrate set to 1200 baud", CNULL); 103*26153Sbloom fixline(dnf, 1200); 104*26153Sbloom break; 105*26153Sbloom case '1': /* 300 baud */ 106*26153Sbloom DEBUG(4, "Baudrate set to 300 baud", CNULL); 107*26153Sbloom fixline(dnf, 300); 108*26153Sbloom break; 109*26153Sbloom default: /* Not one of the above, so must be garbage */ 110*26153Sbloom goto readchar; 111*26153Sbloom } 112*26153Sbloom if (failret) { 113*26153Sbloom alarm (0); 114*26153Sbloom delock(dev->D_line); 115*26153Sbloom return CF_DIAL; 116*26153Sbloom } 117*26153Sbloom alarm (0); 118*26153Sbloom return dnf; 119*26153Sbloom } 120*26153Sbloom 121*26153Sbloom attcls(fd) 122*26153Sbloom int fd; 123*26153Sbloom { 124*26153Sbloom char dcname[20]; 125*26153Sbloom #ifdef USG 126*26153Sbloom struct termio hup, sav; 127*26153Sbloom #else !USG 128*26153Sbloom struct sgttyb hup, sav; 129*26153Sbloom #endif !USG 130*26153Sbloom 131*26153Sbloom if (fd > 0) { 132*26153Sbloom sprintf(dcname, "/dev/%s", devSel); 133*26153Sbloom DEBUG(4, "Hanging up fd = %d\n", fd); 134*26153Sbloom /* 135*26153Sbloom * code to drop DTR -- change to 0 baud then back to default. 136*26153Sbloom */ 137*26153Sbloom gtty(fd, &hup); 138*26153Sbloom gtty(fd, &sav); 139*26153Sbloom #ifdef USG 140*26153Sbloom hup.c_cflag = B0; 141*26153Sbloom #else !USG 142*26153Sbloom hup.sg_ispeed = B0; 143*26153Sbloom hup.sg_ospeed = B0; 144*26153Sbloom #endif !USG 145*26153Sbloom stty(fd, &hup); 146*26153Sbloom sleep(2); 147*26153Sbloom stty(fd, &sav); 148*26153Sbloom /* 149*26153Sbloom * now raise DTR -- close the device 150*26153Sbloom */ 151*26153Sbloom sleep(2); 152*26153Sbloom close(fd); 153*26153Sbloom delock(devSel); 154*26153Sbloom } 155*26153Sbloom } 156*26153Sbloom #endif ATT2224 157