|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)hys.c 4.6 (Berkeley) 2/12/86"; ! 3: #endif ! 4: ! 5: #include "../condevs.h" ! 6: ! 7: #ifdef HAYES ! 8: #ifdef USR2400 ! 9: #define DROPDTR ! 10: /* ! 11: * The "correct" switch settings for a USR Courier 2400 are ! 12: * Dialin/out: 0 0 1 1 0 0 0 1 0 0 ! 13: * Dialout only: 0 0 1 1 1 1 0 1 0 0 ! 14: * where 0 = off and 1 = on ! 15: */ ! 16: #endif USR2400 ! 17: ! 18: /* ! 19: * hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call) ! 20: * hystopn(telno, flds, dev) connect to hayes smartmodem (tone call) ! 21: * char *flds[], *dev[]; ! 22: * ! 23: * return codes: ! 24: * >0 - file number - ok ! 25: * CF_DIAL,CF_DEVICE - failed ! 26: */ ! 27: ! 28: hyspopn(telno, flds, dev) ! 29: char *telno, *flds[]; ! 30: struct Devices *dev; ! 31: { ! 32: return hysopn(telno, flds, dev, 0); ! 33: } ! 34: ! 35: hystopn(telno, flds, dev) ! 36: char *telno, *flds[]; ! 37: struct Devices *dev; ! 38: { ! 39: return hysopn(telno, flds, dev, 1); ! 40: } ! 41: ! 42: /* ARGSUSED */ ! 43: hysopn(telno, flds, dev, toneflag) ! 44: char *telno; ! 45: char *flds[]; ! 46: struct Devices *dev; ! 47: int toneflag; ! 48: { ! 49: extern errno; ! 50: char dcname[20]; ! 51: char cbuf[MAXPH]; ! 52: register char *cp; ! 53: register int i; ! 54: int dh = -1, nrings = 0; ! 55: ! 56: sprintf(dcname, "/dev/%s", dev->D_line); ! 57: DEBUG(4, "dc - %s\n", dcname); ! 58: if (setjmp(Sjbuf)) { ! 59: logent(dcname, "TIMEOUT"); ! 60: if (dh >= 0) ! 61: hyscls(dh); ! 62: return CF_DIAL; ! 63: } ! 64: signal(SIGALRM, alarmtr); ! 65: getnextfd(); ! 66: alarm(10); ! 67: dh = open(dcname, 2); /* read/write */ ! 68: alarm(0); ! 69: ! 70: /* modem is open */ ! 71: next_fd = -1; ! 72: if (dh >= 0) { ! 73: fixline(dh, dev->D_speed); ! 74: if (dochat(dev, flds, dh)) { ! 75: logent(dcname, "CHAT FAILED"); ! 76: hyscls(dh); ! 77: return CF_DIAL; ! 78: } ! 79: write(dh, "ATV1E0H\r", 8); ! 80: if (expect("OK\r\n", dh) != 0) { ! 81: logent(dcname, "HSM seems dead"); ! 82: hyscls(dh); ! 83: return CF_DIAL; ! 84: } ! 85: #ifdef USR2400 ! 86: write(dh, "ATX6S7=44\r", 10); ! 87: if (expect("OK\r\n", dh) != 0) { ! 88: logent(dcname, "HSM seems dead"); ! 89: hyscls(dh); ! 90: return CF_DIAL; ! 91: } ! 92: #endif USR2400 ! 93: if (toneflag) ! 94: write(dh, "\rATDT", 5); ! 95: else ! 96: #ifdef USR2400 ! 97: write(dh, "\rATD", 4); ! 98: #else HAYES ! 99: write(dh, "\rATDP", 5); ! 100: #endif HAYES ! 101: write(dh, telno, strlen(telno)); ! 102: write(dh, "\r", 1); ! 103: ! 104: if (setjmp(Sjbuf)) { ! 105: logent(dcname, "TIMEOUT"); ! 106: strcpy(devSel, dev->D_line); ! 107: hyscls(dh); ! 108: return CF_DIAL; ! 109: } ! 110: signal(SIGALRM, alarmtr); ! 111: alarm(2*MAXMSGTIME); ! 112: do { ! 113: cp = cbuf; ! 114: while (read(dh, cp ,1) == 1) ! 115: if (*cp >= ' ') ! 116: break; ! 117: while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n') ! 118: ; ! 119: alarm(0); ! 120: *cp-- = '\0'; ! 121: if (*cp == '\r') ! 122: *cp = '\0'; ! 123: DEBUG(4,"\nGOT: %s", cbuf); ! 124: alarm(MAXMSGTIME); ! 125: } while (strncmp(cbuf, "RING", 4) == 0 && nrings++ < 5); ! 126: if (strncmp(cbuf, "CONNECT", 7) != 0) { ! 127: logent(cbuf, _FAILED); ! 128: strcpy(devSel, dev->D_line); ! 129: hyscls(dh); ! 130: return CF_DIAL; ! 131: } ! 132: i = atoi(&cbuf[8]); ! 133: if (i > 0 && i != dev->D_speed) { ! 134: DEBUG(4,"Baudrate reset to %d\n", i); ! 135: fixline(dh, i); ! 136: } ! 137: ! 138: } ! 139: if (dh < 0) { ! 140: logent(dcname, "CAN'T OPEN"); ! 141: return dh; ! 142: } ! 143: DEBUG(4, "hayes ok\n", CNULL); ! 144: return dh; ! 145: } ! 146: ! 147: hyscls(fd) ! 148: int fd; ! 149: { ! 150: char dcname[20]; ! 151: #ifdef DROPDTR ! 152: struct sgttyb hup, sav; ! 153: #endif ! 154: ! 155: if (fd > 0) { ! 156: sprintf(dcname, "/dev/%s", devSel); ! 157: DEBUG(4, "Hanging up fd = %d\n", fd); ! 158: #ifdef DROPDTR ! 159: /* ! 160: * code to drop DTR -- change to 0 baud then back to default. ! 161: */ ! 162: gtty(fd, &hup); ! 163: gtty(fd, &sav); ! 164: hup.sg_ispeed = B0; ! 165: hup.sg_ospeed = B0; ! 166: stty(fd, &hup); ! 167: sleep(2); ! 168: stty(fd, &sav); ! 169: /* ! 170: * now raise DTR -- close the device & open it again. ! 171: */ ! 172: sleep(2); ! 173: close(fd); ! 174: sleep(2); ! 175: fd = open(dcname, 2); ! 176: stty(fd, &sav); ! 177: #else ! 178: sleep(3); ! 179: write(fd, "+++", 3); ! 180: #endif ! 181: sleep(3); ! 182: write(fd, "ATZ\r", 4); ! 183: if (expect("OK",fd) != 0) ! 184: logent(devSel, "HSM did not respond to ATZ"); ! 185: write(fd, "ATH\r", 4); ! 186: sleep(1); ! 187: close(fd); ! 188: delock(devSel); ! 189: } ! 190: } ! 191: #endif HAYES
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.