1: #ifndef lint 2: static char sccsid[] = "@(#)hysq.c 4.1 (Berkeley) 1/22/85"; 3: #endif 4: 5: #include "../condevs.h" 6: 7: #ifdef HAYESQ 8: /* 9: * New dialout routine to work with Hayes' SMART MODEM 10: * 13-JUL-82, Mike Mitchell 11: * Modified 23-MAR-83 to work with Tom Truscott's (rti!trt) 12: * version of UUCP (ncsu!mcm) 13: * 14: * The modem should be set to NOT send any result codes to 15: * the system (switch 3 up, 4 down). This end will figure out 16: * what is wrong. 17: * 18: * I had lots of problems with the modem sending 19: * result codes since I am using the same modem for both incomming and 20: * outgoing calls. I'd occasionally miss the result code (getty would 21: * grab it), and the connect would fail. Worse yet, the getty would 22: * think the result code was a user name, and send garbage to it while 23: * it was in the command state. I turned off ALL result codes, and hope 24: * for the best. 99% of the time the modem is in the correct state. 25: * Occassionally it doesn't connect, or the phone was busy, etc., and 26: * uucico sits there trying to log in. It eventually times out, calling 27: * clsacu() in the process, so it resets itself for the next attempt. 28: */ 29: 30: /* 31: * NOTE: this version is not for the faint-hearted. 32: * Someday it would be nice to have a single version of hayes dialer 33: * with a way to specify the switch settings that are on the dialer 34: * as well as tone/pulse. 35: * In the meantime, using HAYES rather than HAYESQ is probably best. 36: */ 37: 38: hysqpopn(telno, flds, dev) 39: char *telno, *flds[]; 40: struct Devices *dev; 41: { 42: return hysqopn(telno, flds, dev, 0); 43: } 44: 45: hysqtopn(telno, flds, dev) 46: char *telno, *flds[]; 47: struct Devices *dev; 48: { 49: return hysqopn(telno, flds, dev, 1); 50: } 51: 52: hysqopn(telno, flds, dev, toneflag) 53: char *telno, *flds[]; 54: struct Devices *dev; 55: int toneflag; 56: { 57: char dcname[20], phone[MAXPH+10], c = 0; 58: #ifdef USG 59: struct termio ttbuf; 60: #endif USG 61: int status, dnf; 62: unsigned timelim; 63: 64: signal(SIGALRM, alarmtr); 65: sprintf(dcname, "/dev/%s", dev->D_line); 66: 67: getnextfd(); 68: if (setjmp(Sjbuf)) { 69: logent("DEVICE", "NO"); 70: DEBUG(4, "Open timed out %s", dcname); 71: return CF_NODEV; 72: } 73: alarm(10); 74: 75: if ((dnf = open(dcname, 2)) <= 0) { 76: logent("DEVICE", "NO"); 77: DEBUG(4, "Can't open %s", dcname); 78: return CF_NODEV; 79: } 80: 81: alarm(0); 82: next_fd = -1; 83: fixline(dnf, dev->D_speed); 84: DEBUG(4, "Hayes port - %s, ", dcname); 85: 86: if (toneflag) 87: sprintf(phone, "\rATDT%s\r", telno); 88: else 89: sprintf(phone, "\rATDP%s\r", telno); 90: 91: write(dnf, phone, strlen(phone)); 92: 93: /* calculate delay time for the other system to answer the phone. 94: * Default is 15 seconds, add 2 seconds for each comma in the phone 95: * number. 96: */ 97: timelim = 150; 98: while(*telno) { 99: c = *telno++; 100: if (c == ',') 101: timelim += 20; 102: else if (toneflag) 103: timelim += 2; /* .2 seconds per tone */ 104: else { 105: if (c == '0') timelim += 10; /* .1 sec per digit */ 106: else if (c > '0' && c <= '9') 107: timelim += (c - '0'); 108: } 109: } 110: alarm(timelim/10 + 1); 111: if (setjmp(Sjbuf) == 0) { 112: read(dnf, &c, 1); 113: alarm(0); 114: } 115: 116: return dnf; 117: } 118: 119: hysqcls(fd) 120: int fd; 121: { 122: char dcname[20]; 123: struct sgttyb hup, sav; 124: 125: if (fd > 0) { 126: sprintf(dcname, "/dev/%s", devSel); 127: DEBUG(4, "Hanging up fd = %d\n", fd); 128: /* 129: * code to drop DTR -- change to 0 baud then back to default. 130: */ 131: gtty(fd, &hup); 132: gtty(fd, &sav); 133: hup.sg_ispeed = B0; 134: hup.sg_ospeed = B0; 135: stty(fd, &hup); 136: sleep(2); 137: stty(fd, &sav); 138: /* 139: * now raise DTR -- close the device & open it again. 140: */ 141: sleep(2); 142: close(fd); 143: sleep(2); 144: fd = open(dcname, 2); 145: /* 146: * Since we have a getty sleeping on this line, when it wakes up it sends 147: * all kinds of garbage to the modem. Unfortunatly, the modem likes to 148: * execute the previous command when it sees the garbage. The previous 149: * command was to dial the phone, so let's make the last command reset 150: * the modem. 151: */ 152: sleep(2); 153: write(fd, "\rATZ\r", 5); 154: close(fd); 155: delock(devSel); 156: } 157: } 158: 159: #endif HAYESQ