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