1*25882Sbloom #ifndef lint 2*25882Sbloom static char sccsid[] = "@(#)hys24.c 1.1 (Berkeley) 01/13/86"; 3*25882Sbloom #endif !lint 4*25882Sbloom 5*25882Sbloom #include "../condevs.h" 6*25882Sbloom 7*25882Sbloom #ifdef HAYES2400 8*25882Sbloom /* 9*25882Sbloom * hyspopn24(telno, flds, dev) connect to hayes smartmodem (pulse call) 10*25882Sbloom * hystopn24(telno, flds, dev) connect to hayes smartmodem (tone call) 11*25882Sbloom * char *flds[], *dev[]; 12*25882Sbloom * 13*25882Sbloom * return codes: 14*25882Sbloom * >0 - file number - ok 15*25882Sbloom * CF_DIAL,CF_DEVICE - failed 16*25882Sbloom */ 17*25882Sbloom 18*25882Sbloom hyspopn24(telno, flds, dev) 19*25882Sbloom char *telno, *flds[]; 20*25882Sbloom struct Devices *dev; 21*25882Sbloom { 22*25882Sbloom return hysopn24(telno, flds, dev, 0); 23*25882Sbloom } 24*25882Sbloom 25*25882Sbloom hystopn24(telno, flds, dev) 26*25882Sbloom char *telno, *flds[]; 27*25882Sbloom struct Devices *dev; 28*25882Sbloom { 29*25882Sbloom return hysopn24(telno, flds, dev, 1); 30*25882Sbloom } 31*25882Sbloom 32*25882Sbloom /* ARGSUSED */ 33*25882Sbloom hysopn24(telno, flds, dev, toneflag) 34*25882Sbloom char *telno; 35*25882Sbloom char *flds[]; 36*25882Sbloom struct Devices *dev; 37*25882Sbloom int toneflag; 38*25882Sbloom { 39*25882Sbloom int dh = -1; 40*25882Sbloom char *ii; 41*25882Sbloom extern errno; 42*25882Sbloom char dcname[20]; 43*25882Sbloom 44*25882Sbloom sprintf(dcname, "/dev/%s", dev->D_line); 45*25882Sbloom DEBUG(4, "dc - %s\n", dcname); 46*25882Sbloom if (setjmp(Sjbuf)) { 47*25882Sbloom logent(dcname, "TIMEOUT"); 48*25882Sbloom if (dh >= 0) 49*25882Sbloom hyscls24(dh); 50*25882Sbloom return CF_DIAL; 51*25882Sbloom } 52*25882Sbloom signal(SIGALRM, alarmtr); 53*25882Sbloom getnextfd(); 54*25882Sbloom alarm(10); 55*25882Sbloom dh = open(dcname, 2); /* read/write */ 56*25882Sbloom alarm(0); 57*25882Sbloom 58*25882Sbloom for (ii = telno; *ii; ii++) 59*25882Sbloom if (*ii == '=') 60*25882Sbloom *ii = ','; 61*25882Sbloom 62*25882Sbloom /* modem is open */ 63*25882Sbloom next_fd = -1; 64*25882Sbloom if (dh >= 0) { 65*25882Sbloom fixline(dh, dev->D_speed); 66*25882Sbloom write(dh, "\rATZH\r", 6); 67*25882Sbloom sleep(2); 68*25882Sbloom if (dochat(dev, flds, dh)) { 69*25882Sbloom logent(dcname, "CHAT FAILED"); 70*25882Sbloom hyscls24(dh); 71*25882Sbloom return CF_DIAL; 72*25882Sbloom } 73*25882Sbloom write(dh, "AT&F&D3&C1E0X1\r", 15); 74*25882Sbloom if (expect("OK\r\n", dh) != 0) { 75*25882Sbloom logent(dcname, "HSM not responding OK"); 76*25882Sbloom hyscls24(dh); 77*25882Sbloom return CF_DIAL; 78*25882Sbloom } 79*25882Sbloom if (toneflag) 80*25882Sbloom write(dh, "\rATDT", 5); 81*25882Sbloom else 82*25882Sbloom write(dh, "\rATDP", 5); 83*25882Sbloom write(dh, telno, strlen(telno)); 84*25882Sbloom write(dh, "\r", 1); 85*25882Sbloom 86*25882Sbloom if (expect("CONNECT", dh) != 0) { 87*25882Sbloom logent("HSM no carrier", _FAILED); 88*25882Sbloom strcpy(devSel, dev->D_line); 89*25882Sbloom hyscls24(dh); 90*25882Sbloom return CF_DIAL; 91*25882Sbloom } 92*25882Sbloom 93*25882Sbloom } 94*25882Sbloom if (dh < 0) { 95*25882Sbloom logent(dcname, "CAN'T OPEN"); 96*25882Sbloom return dh; 97*25882Sbloom } 98*25882Sbloom DEBUG(4, "hayes ok\n", CNULL); 99*25882Sbloom return dh; 100*25882Sbloom } 101*25882Sbloom 102*25882Sbloom hyscls24(fd) 103*25882Sbloom int fd; 104*25882Sbloom { 105*25882Sbloom char dcname[20]; 106*25882Sbloom 107*25882Sbloom if (fd > 0) { 108*25882Sbloom sprintf(dcname, "/dev/%s", devSel); 109*25882Sbloom DEBUG(4, "Hanging up fd = %d\n", fd); 110*25882Sbloom sleep(1); 111*25882Sbloom /* 112*25882Sbloom * Since we have a getty sleeping on this line, when it wakes up it sends 113*25882Sbloom * all kinds of garbage to the modem. Unfortunatly, the modem likes to 114*25882Sbloom * execute the previous command when it sees the garbage. The previous 115*25882Sbloom * command was to dial the phone, so let's make the last command reset 116*25882Sbloom * the modem. 117*25882Sbloom */ 118*25882Sbloom write(fd, "\r+++", 4); 119*25882Sbloom sleep(2); 120*25882Sbloom write(fd, "\rATH\rATZ\r", 9); 121*25882Sbloom sleep(2); 122*25882Sbloom close(fd); 123*25882Sbloom delock(devSel); 124*25882Sbloom } 125*25882Sbloom } 126*25882Sbloom #endif HAYES2400 127