117774Sralph #ifndef lint 2*23731Sbloom static char sccsid[] = "@(#)hys.c 4.3 (Berkeley) 06/24/85"; 317774Sralph #endif 417774Sralph 517774Sralph #include "../condevs.h" 617774Sralph 717774Sralph #ifdef HAYES 823698Sbloom /* 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]; 42*23731Sbloom char cbuf[MAXPH]; 43*23731Sbloom register char *cp; 44*23731Sbloom register int i; 4517774Sralph 4617774Sralph sprintf(dcname, "/dev/%s", dev->D_line); 4717774Sralph DEBUG(4, "dc - %s\n", dcname); 4817774Sralph if (setjmp(Sjbuf)) { 4917774Sralph logent(dcname, "TIMEOUT"); 5017774Sralph if (dh >= 0) 5117774Sralph close(dh); 5217774Sralph return CF_DIAL; 5317774Sralph } 5417774Sralph signal(SIGALRM, alarmtr); 5517774Sralph getnextfd(); 5617774Sralph alarm(10); 5717774Sralph dh = open(dcname, 2); /* read/write */ 5817774Sralph alarm(0); 5917774Sralph 6017774Sralph /* modem is open */ 6117774Sralph next_fd = -1; 6217774Sralph if (dh >= 0) { 6317774Sralph fixline(dh, dev->D_speed); 6417774Sralph if (dochat(dev, flds, dh)) { 6517774Sralph logent(dcname, "CHAT FAILED"); 6617774Sralph close(dh); 6717774Sralph return CF_DIAL; 6817774Sralph } 6923698Sbloom write(dh, "ATV1H\r", 6); 7017774Sralph if (expect("OK\r\n", dh) != 0) { 7117774Sralph logent(dcname, "HSM seems dead"); 7217774Sralph close(dh); 7317774Sralph return CF_DIAL; 7417774Sralph } 7517774Sralph if (toneflag) 7617774Sralph write(dh, "\rATDT", 5); 7717774Sralph else 7817774Sralph write(dh, "\rATDP", 5); 7917774Sralph write(dh, telno, strlen(telno)); 8017774Sralph write(dh, "\r", 1); 8117774Sralph 82*23731Sbloom if (setjmp(Sjbuf)) { 83*23731Sbloom logent(dcname, "TIMEOUT"); 84*23731Sbloom strcpy(devSel, dev->D_line); 85*23731Sbloom hyscls(dh); 86*23731Sbloom return CF_DIAL; 87*23731Sbloom } 88*23731Sbloom signal(SIGALRM, alarmtr); 89*23731Sbloom alarm(MAXMSGTIME); 90*23731Sbloom cp = cbuf; 91*23731Sbloom while (read(dh, cp ,1) == 1) 92*23731Sbloom if (*cp >= ' ') 93*23731Sbloom break; 94*23731Sbloom cp++; 95*23731Sbloom while (cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp++ != '\n') 96*23731Sbloom ; 97*23731Sbloom alarm(0); 98*23731Sbloom *cp = '\0'; 99*23731Sbloom if (strncmp(cbuf, "CONNECT", 7) != 0) { 10017774Sralph logent("HSM no carrier", _FAILED); 10117774Sralph strcpy(devSel, dev->D_line); 10217774Sralph hyscls(dh); 10317774Sralph return CF_DIAL; 10417774Sralph } 105*23731Sbloom DEBUG(4,"\nGOT: %s", cbuf); 106*23731Sbloom i = atoi(&cbuf[8]); 107*23731Sbloom if (i > 0 && i != dev->D_speed) { 108*23731Sbloom DEBUG(4,"Baudrate reset to %d\n", i); 109*23731Sbloom fixline(dh, i); 110*23731Sbloom } 11117774Sralph 11217774Sralph } 11317774Sralph if (dh < 0) { 11417774Sralph logent(dcname, "CAN'T OPEN"); 11517774Sralph return dh; 11617774Sralph } 11717774Sralph DEBUG(4, "hayes ok\n", CNULL); 11817774Sralph return dh; 11917774Sralph } 12017774Sralph 12117774Sralph hyscls(fd) 12217774Sralph int fd; 12317774Sralph { 12417774Sralph char dcname[20]; 12517774Sralph #ifdef DROPDTR 12617774Sralph struct sgttyb hup, sav; 12717774Sralph #endif 12817774Sralph 12917774Sralph if (fd > 0) { 13017774Sralph sprintf(dcname, "/dev/%s", devSel); 13117774Sralph DEBUG(4, "Hanging up fd = %d\n", fd); 13217774Sralph #ifdef DROPDTR 13317774Sralph /* 13417774Sralph * code to drop DTR -- change to 0 baud then back to default. 13517774Sralph */ 13617774Sralph gtty(fd, &hup); 13717774Sralph gtty(fd, &sav); 13817774Sralph hup.sg_ispeed = B0; 13917774Sralph hup.sg_ospeed = B0; 14017774Sralph stty(fd, &hup); 14117774Sralph sleep(2); 14217774Sralph stty(fd, &sav); 14317774Sralph /* 14417774Sralph * now raise DTR -- close the device & open it again. 14517774Sralph */ 14617774Sralph sleep(2); 14717774Sralph close(fd); 14817774Sralph sleep(2); 14917774Sralph fd = open(dcname, 2); 15017774Sralph /* 15117774Sralph * Since we have a getty sleeping on this line, when it wakes up it sends 15217774Sralph * all kinds of garbage to the modem. Unfortunatly, the modem likes to 15317774Sralph * execute the previous command when it sees the garbage. The previous 15417774Sralph * command was to dial the phone, so let's make the last command reset 15517774Sralph * the modem. 15617774Sralph */ 15717774Sralph #else 15817774Sralph sleep(3); 15917774Sralph write(fd, "+++", 3); 16017774Sralph #endif 16117774Sralph sleep(3); 16217774Sralph write(fd, "ATZ\r", 4); 16323698Sbloom if (expect("OK",fd) != 0) 16417774Sralph logent(devSel, "HSM did not respond to ATZ"); 16517774Sralph sleep(1); 16617774Sralph close(fd); 16717774Sralph delock(devSel); 16817774Sralph } 16917774Sralph } 17017774Sralph 17117774Sralph #endif HAYES 17223698Sbloom 173