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