117774Sralph #ifndef lint 2*23698Sbloom static char sccsid[] = "@(#)hys.c 4.2 (Berkeley) 06/23/85"; 317774Sralph #endif 417774Sralph 517774Sralph #include "../condevs.h" 617774Sralph 717774Sralph #ifdef HAYES 8*23698Sbloom /* 917774Sralph * hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call) 1017774Sralph * hystopn(telno, flds, dev) connect to hayes smartmodem (tone call) 1117774Sralph * char *flds[], *dev[]; 1217774Sralph * 1317774Sralph * return codes: 1417774Sralph * >0 - file number - ok 1517774Sralph * CF_DIAL,CF_DEVICE - failed 1617774Sralph */ 1717774Sralph 1817774Sralph hyspopn(telno, flds, dev) 1917774Sralph char *telno, *flds[]; 2017774Sralph struct Devices *dev; 2117774Sralph { 2217774Sralph return hysopn(telno, flds, dev, 0); 2317774Sralph } 2417774Sralph 2517774Sralph hystopn(telno, flds, dev) 2617774Sralph char *telno, *flds[]; 2717774Sralph struct Devices *dev; 2817774Sralph { 2917774Sralph return hysopn(telno, flds, dev, 1); 3017774Sralph } 3117774Sralph 3217774Sralph /* ARGSUSED */ 3317774Sralph hysopn(telno, flds, dev, toneflag) 3417774Sralph char *telno; 3517774Sralph char *flds[]; 3617774Sralph struct Devices *dev; 3717774Sralph int toneflag; 3817774Sralph { 3917774Sralph int dh = -1; 4017774Sralph extern errno; 4117774Sralph char dcname[20]; 4217774Sralph 4317774Sralph sprintf(dcname, "/dev/%s", dev->D_line); 4417774Sralph DEBUG(4, "dc - %s\n", dcname); 4517774Sralph if (setjmp(Sjbuf)) { 4617774Sralph logent(dcname, "TIMEOUT"); 4717774Sralph if (dh >= 0) 4817774Sralph close(dh); 4917774Sralph return CF_DIAL; 5017774Sralph } 5117774Sralph signal(SIGALRM, alarmtr); 5217774Sralph getnextfd(); 5317774Sralph alarm(10); 5417774Sralph dh = open(dcname, 2); /* read/write */ 5517774Sralph alarm(0); 5617774Sralph 5717774Sralph /* modem is open */ 5817774Sralph next_fd = -1; 5917774Sralph if (dh >= 0) { 6017774Sralph fixline(dh, dev->D_speed); 6117774Sralph if (dochat(dev, flds, dh)) { 6217774Sralph logent(dcname, "CHAT FAILED"); 6317774Sralph close(dh); 6417774Sralph return CF_DIAL; 6517774Sralph } 66*23698Sbloom write(dh, "ATV1H\r", 6); 6717774Sralph if (expect("OK\r\n", dh) != 0) { 6817774Sralph logent(dcname, "HSM seems dead"); 6917774Sralph close(dh); 7017774Sralph return CF_DIAL; 7117774Sralph } 7217774Sralph if (toneflag) 7317774Sralph write(dh, "\rATDT", 5); 7417774Sralph else 7517774Sralph write(dh, "\rATDP", 5); 7617774Sralph write(dh, telno, strlen(telno)); 7717774Sralph write(dh, "\r", 1); 7817774Sralph 7917774Sralph if (expect("CONNECT", dh) != 0) { 8017774Sralph logent("HSM no carrier", _FAILED); 8117774Sralph strcpy(devSel, dev->D_line); 8217774Sralph hyscls(dh); 8317774Sralph return CF_DIAL; 8417774Sralph } 8517774Sralph 8617774Sralph } 8717774Sralph if (dh < 0) { 8817774Sralph logent(dcname, "CAN'T OPEN"); 8917774Sralph return dh; 9017774Sralph } 9117774Sralph DEBUG(4, "hayes ok\n", CNULL); 9217774Sralph return dh; 9317774Sralph } 9417774Sralph 9517774Sralph hyscls(fd) 9617774Sralph int fd; 9717774Sralph { 9817774Sralph char dcname[20]; 9917774Sralph #ifdef DROPDTR 10017774Sralph struct sgttyb hup, sav; 10117774Sralph #endif 10217774Sralph 10317774Sralph if (fd > 0) { 10417774Sralph sprintf(dcname, "/dev/%s", devSel); 10517774Sralph DEBUG(4, "Hanging up fd = %d\n", fd); 10617774Sralph #ifdef DROPDTR 10717774Sralph /* 10817774Sralph * code to drop DTR -- change to 0 baud then back to default. 10917774Sralph */ 11017774Sralph gtty(fd, &hup); 11117774Sralph gtty(fd, &sav); 11217774Sralph hup.sg_ispeed = B0; 11317774Sralph hup.sg_ospeed = B0; 11417774Sralph stty(fd, &hup); 11517774Sralph sleep(2); 11617774Sralph stty(fd, &sav); 11717774Sralph /* 11817774Sralph * now raise DTR -- close the device & open it again. 11917774Sralph */ 12017774Sralph sleep(2); 12117774Sralph close(fd); 12217774Sralph sleep(2); 12317774Sralph fd = open(dcname, 2); 12417774Sralph /* 12517774Sralph * Since we have a getty sleeping on this line, when it wakes up it sends 12617774Sralph * all kinds of garbage to the modem. Unfortunatly, the modem likes to 12717774Sralph * execute the previous command when it sees the garbage. The previous 12817774Sralph * command was to dial the phone, so let's make the last command reset 12917774Sralph * the modem. 13017774Sralph */ 13117774Sralph #else 13217774Sralph sleep(3); 13317774Sralph write(fd, "+++", 3); 13417774Sralph #endif 13517774Sralph sleep(3); 13617774Sralph write(fd, "ATZ\r", 4); 137*23698Sbloom if (expect("OK",fd) != 0) 13817774Sralph logent(devSel, "HSM did not respond to ATZ"); 13917774Sralph sleep(1); 14017774Sralph close(fd); 14117774Sralph delock(devSel); 14217774Sralph } 14317774Sralph } 14417774Sralph 14517774Sralph #endif HAYES 146*23698Sbloom 147