125882Sbloom #ifndef lint 2*46875Sbostic static char sccsid[] = "@(#)hys24.c 1.7 (Berkeley) 03/02/91"; 325882Sbloom #endif !lint 425882Sbloom 5*46875Sbostic #include "condevs.h" 625882Sbloom 725882Sbloom /* 834193Srick * hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call) 934193Srick * hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call) 1025882Sbloom * 1134193Srick * return codes: >0 - file number - ok CF_DIAL,CF_DEVICE - failed 1225882Sbloom */ 1325882Sbloom 1434193Srick #include <sys/file.h> 1534193Srick #include <sys/ioctl.h> 1634193Srick 1725882Sbloom hyspopn24(telno, flds, dev) 1825882Sbloom char *telno, *flds[]; 1925882Sbloom struct Devices *dev; 2025882Sbloom { 2125882Sbloom return hysopn24(telno, flds, dev, 0); 2225882Sbloom } 2325882Sbloom 2425882Sbloom hystopn24(telno, flds, dev) 2525882Sbloom char *telno, *flds[]; 2625882Sbloom struct Devices *dev; 2725882Sbloom { 2825882Sbloom return hysopn24(telno, flds, dev, 1); 2925882Sbloom } 3025882Sbloom 3125882Sbloom /* ARGSUSED */ 3225882Sbloom hysopn24(telno, flds, dev, toneflag) 3325882Sbloom char *telno; 3425882Sbloom char *flds[]; 3525882Sbloom struct Devices *dev; 3625882Sbloom int toneflag; 3725882Sbloom { 3834193Srick int dh = -1; 3934193Srick int result, ix, speed; 4025882Sbloom char *ii; 4125882Sbloom extern errno; 4225882Sbloom char dcname[20]; 4334193Srick char resultbuf[16]; 4425882Sbloom 4525882Sbloom sprintf(dcname, "/dev/%s", dev->D_line); 4625882Sbloom DEBUG(4, "dc - %s\n", dcname); 4725882Sbloom if (setjmp(Sjbuf)) { 4825882Sbloom logent(dcname, "TIMEOUT"); 4925882Sbloom if (dh >= 0) 5034193Srick hyscls24(dh, 0); 5125882Sbloom return CF_DIAL; 5225882Sbloom } 5325882Sbloom signal(SIGALRM, alarmtr); 5425882Sbloom getnextfd(); 5525882Sbloom alarm(10); 5634193Srick dh = open(dcname, 2); /* read/write */ 5725882Sbloom alarm(0); 5825882Sbloom 5925882Sbloom for (ii = telno; *ii; ii++) 6025882Sbloom if (*ii == '=') 6134193Srick *ii = ','; 6225882Sbloom 6325882Sbloom /* modem is open */ 6425882Sbloom next_fd = -1; 6525882Sbloom if (dh >= 0) { 6634193Srick ioctl(dh, TIOCHPCL, 0); 6725882Sbloom fixline(dh, dev->D_speed); 6825882Sbloom if (dochat(dev, flds, dh)) { 6925882Sbloom logent(dcname, "CHAT FAILED"); 7034193Srick hyscls24(dh, 0); 7125882Sbloom return CF_DIAL; 7225882Sbloom } 7334193Srick hyscls24(dh, 1);/* make sure the line is reset */ 7434193Srick write(dh, "AT&F&D3&C1E0M0X3QV0Y\r", 21); 7534193Srick if (expect("0\r", dh) != 0) { 7625882Sbloom logent(dcname, "HSM not responding OK"); 7734193Srick hyscls24(dh, 0); 7825882Sbloom return CF_DIAL; 7925882Sbloom } 8025882Sbloom if (toneflag) 8125882Sbloom write(dh, "\rATDT", 5); 8225882Sbloom else 8325882Sbloom write(dh, "\rATDP", 5); 8425882Sbloom write(dh, telno, strlen(telno)); 8525882Sbloom write(dh, "\r", 1); 8625882Sbloom 8734193Srick if (setjmp(Sjbuf)) { 8834193Srick logent(dcname, "Modem Hung"); 8934193Srick if (dh >= 0) 9034193Srick hyscls24(dh, 0); 9134193Srick return CF_DIAL; 9234193Srick } 9334193Srick signal(SIGALRM, alarmtr); 9434193Srick alarm(120); 9534193Srick do { 9634193Srick for (ix = 0; ix < 16; ix++) { 9734193Srick read(dh, resultbuf + ix, 1); 9834193Srick DEBUG(6, "character read = 0x%X \n", resultbuf[ix]); 9934193Srick if ((0x7f & resultbuf[ix]) == 0xd) 10034193Srick break; 10134193Srick } 10234193Srick 10334193Srick result = atol(resultbuf); 10434193Srick switch (result) { 10534193Srick case 0: 10634193Srick logent("HSM Spurious OK response", _FAILED); 10734193Srick speed = 0; 10834193Srick break; 10934193Srick case 1: 11034193Srick logent("HSM connected at 300 baud!", _FAILED); 11134193Srick speed = -1; 11234193Srick break; 11334193Srick case 2: 11434193Srick speed = 0; 11534193Srick DEBUG(4, "Ringing", 0); 11634193Srick break; 11734193Srick case 3: 11834193Srick logent("HSM No Carrier", _FAILED); 11934193Srick speed = -1; 12034193Srick break; 12134193Srick case 4: 12234193Srick logent("HSM Error", _FAILED); 12334193Srick speed = -1; 12434193Srick break; 12534193Srick case 5: 12634193Srick speed = 1200; 12734193Srick break; 12834193Srick case 6: 12934193Srick logent("HSM No dialtone", _FAILED); 13034193Srick speed = -1; 13134193Srick break; 13234193Srick case 7: 13334193Srick logent("HSM detected BUSY", _FAILED); 13434193Srick speed = -1; 13534193Srick break; 13634193Srick case 8: 13734193Srick logent("HSM No quiet answer", _FAILED); 13834193Srick speed = -1; 13934193Srick break; 14034193Srick case 10: 14134193Srick speed = 2400; 14234193Srick break; 14334193Srick default: 14434193Srick logent("HSM Unknown response", _FAILED); 14534193Srick speed = -1; 14634193Srick break; 14734193Srick } 14834193Srick 14934193Srick } while (speed == 0); 15034193Srick 15134193Srick alarm(0); 15234193Srick 15334193Srick if (speed < 0) { 15425882Sbloom strcpy(devSel, dev->D_line); 15534193Srick hyscls24(dh, 0); 15625882Sbloom return CF_DIAL; 15734193Srick } else if (speed != dev->D_speed) { 15834193Srick DEBUG(4, "changing line speed to %d baud\n", speed); 15934193Srick fixline(dh, speed); 16025882Sbloom } 16125882Sbloom } 16225882Sbloom if (dh < 0) { 16325882Sbloom logent(dcname, "CAN'T OPEN"); 16425882Sbloom return dh; 16525882Sbloom } 16625882Sbloom DEBUG(4, "hayes ok\n", CNULL); 16725882Sbloom return dh; 16825882Sbloom } 16925882Sbloom 17034193Srick hyscls24(fd, flag) 17134193Srick int fd, flag; 17225882Sbloom { 17325882Sbloom char dcname[20]; 17444321Sbostic int fff = 1; 17525882Sbloom 17625882Sbloom if (fd > 0) { 17725882Sbloom sprintf(dcname, "/dev/%s", devSel); 17834193Srick if (flag) 17934193Srick DEBUG(4, "Resetting fd = %d\n", fd); 18034193Srick else 18134193Srick DEBUG(4, "Hanging up fd = %d\n", fd); 18234193Srick /* 18334193Srick * Since we have a getty sleeping on this line, when it wakes 18434193Srick * up it sends all kinds of garbage to the modem. 18534193Srick * Unfortunatly, the modem likes to execute the previous 18634193Srick * command when it sees the garbage. The previous command 18734193Srick * was to dial the phone, so let's make the last command 18834193Srick * reset the modem. 18934193Srick */ 19034193Srick if (!flag) 19134193Srick fixline(fd, 2400); 19234193Srick write(fd, "\r", 1); 19325882Sbloom sleep(2); 19434193Srick write(fd, "+++", 3); 19534193Srick sleep(3); 19625882Sbloom write(fd, "\rATH\rATZ\r", 9); 19725882Sbloom sleep(2); 19834193Srick ioctl(fd, TIOCFLUSH, &fff); 19934193Srick 20034193Srick if (!flag) { 20134193Srick close(fd); 20234193Srick delock(devSel); 20334193Srick } 20425882Sbloom } 20525882Sbloom } 206