117774Sralph #ifndef lint 2*33585Srick static char sccsid[] = "@(#)hys.c 4.7 (Berkeley) 02/24/88"; 317774Sralph #endif 417774Sralph 517774Sralph #include "../condevs.h" 617774Sralph 725154Sbloom #ifdef USR2400 825154Sbloom #define DROPDTR 925885Sbloom /* 1025885Sbloom * The "correct" switch settings for a USR Courier 2400 are 1125885Sbloom * Dialin/out: 0 0 1 1 0 0 0 1 0 0 1225885Sbloom * Dialout only: 0 0 1 1 1 1 0 1 0 0 1325885Sbloom * where 0 = off and 1 = on 1425885Sbloom */ 1525154Sbloom #endif USR2400 1625154Sbloom 1723698Sbloom /* 1817774Sralph * hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call) 1917774Sralph * hystopn(telno, flds, dev) connect to hayes smartmodem (tone call) 2017774Sralph * char *flds[], *dev[]; 2117774Sralph * 2217774Sralph * return codes: 2317774Sralph * >0 - file number - ok 2417774Sralph * CF_DIAL,CF_DEVICE - failed 2517774Sralph */ 2617774Sralph 2717774Sralph hyspopn(telno, flds, dev) 2817774Sralph char *telno, *flds[]; 2917774Sralph struct Devices *dev; 3017774Sralph { 3117774Sralph return hysopn(telno, flds, dev, 0); 3217774Sralph } 3317774Sralph 3417774Sralph hystopn(telno, flds, dev) 3517774Sralph char *telno, *flds[]; 3617774Sralph struct Devices *dev; 3717774Sralph { 3817774Sralph return hysopn(telno, flds, dev, 1); 3917774Sralph } 4017774Sralph 4117774Sralph /* ARGSUSED */ 4217774Sralph hysopn(telno, flds, dev, toneflag) 4317774Sralph char *telno; 4417774Sralph char *flds[]; 4517774Sralph struct Devices *dev; 4617774Sralph int toneflag; 4717774Sralph { 4817774Sralph extern errno; 4917774Sralph char dcname[20]; 5023731Sbloom char cbuf[MAXPH]; 5123731Sbloom register char *cp; 5223731Sbloom register int i; 5325885Sbloom int dh = -1, nrings = 0; 5417774Sralph 5517774Sralph sprintf(dcname, "/dev/%s", dev->D_line); 5617774Sralph DEBUG(4, "dc - %s\n", dcname); 5717774Sralph if (setjmp(Sjbuf)) { 5817774Sralph logent(dcname, "TIMEOUT"); 5917774Sralph if (dh >= 0) 6025885Sbloom hyscls(dh); 6117774Sralph return CF_DIAL; 6217774Sralph } 6317774Sralph signal(SIGALRM, alarmtr); 6417774Sralph getnextfd(); 6517774Sralph alarm(10); 6617774Sralph dh = open(dcname, 2); /* read/write */ 6717774Sralph alarm(0); 6817774Sralph 6917774Sralph /* modem is open */ 7017774Sralph next_fd = -1; 7117774Sralph if (dh >= 0) { 7217774Sralph fixline(dh, dev->D_speed); 7317774Sralph if (dochat(dev, flds, dh)) { 7417774Sralph logent(dcname, "CHAT FAILED"); 7525885Sbloom hyscls(dh); 7617774Sralph return CF_DIAL; 7717774Sralph } 7825154Sbloom write(dh, "ATV1E0H\r", 8); 7917774Sralph if (expect("OK\r\n", dh) != 0) { 8017774Sralph logent(dcname, "HSM seems dead"); 8125154Sbloom hyscls(dh); 8217774Sralph return CF_DIAL; 8317774Sralph } 8425154Sbloom #ifdef USR2400 8525885Sbloom write(dh, "ATX6S7=44\r", 10); 8625154Sbloom if (expect("OK\r\n", dh) != 0) { 8725154Sbloom logent(dcname, "HSM seems dead"); 8825154Sbloom hyscls(dh); 8925154Sbloom return CF_DIAL; 9025154Sbloom } 9125154Sbloom #endif USR2400 9217774Sralph if (toneflag) 9317774Sralph write(dh, "\rATDT", 5); 9417774Sralph else 9525885Sbloom #ifdef USR2400 9625885Sbloom write(dh, "\rATD", 4); 9725885Sbloom #else HAYES 9817774Sralph write(dh, "\rATDP", 5); 9925885Sbloom #endif HAYES 10017774Sralph write(dh, telno, strlen(telno)); 10117774Sralph write(dh, "\r", 1); 10217774Sralph 10323731Sbloom if (setjmp(Sjbuf)) { 10423731Sbloom logent(dcname, "TIMEOUT"); 10523731Sbloom strcpy(devSel, dev->D_line); 10623731Sbloom hyscls(dh); 10723731Sbloom return CF_DIAL; 10823731Sbloom } 10923731Sbloom signal(SIGALRM, alarmtr); 11025885Sbloom alarm(2*MAXMSGTIME); 11125154Sbloom do { 11225154Sbloom cp = cbuf; 11325154Sbloom while (read(dh, cp ,1) == 1) 11425154Sbloom if (*cp >= ' ') 11525154Sbloom break; 11625154Sbloom while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n') 11725154Sbloom ; 11825154Sbloom alarm(0); 11925154Sbloom *cp-- = '\0'; 12025154Sbloom if (*cp == '\r') 12125154Sbloom *cp = '\0'; 12225154Sbloom DEBUG(4,"\nGOT: %s", cbuf); 12325885Sbloom alarm(MAXMSGTIME); 124*33585Srick } while ((strncmp(cbuf, "RING", 4) == 0 || 125*33585Srick strncmp(cbuf, "RRING", 5) == 0) && nrings++ < 5); 12623731Sbloom if (strncmp(cbuf, "CONNECT", 7) != 0) { 12725154Sbloom logent(cbuf, _FAILED); 12817774Sralph strcpy(devSel, dev->D_line); 12917774Sralph hyscls(dh); 13017774Sralph return CF_DIAL; 13117774Sralph } 132*33585Srick #undef DONTRESETBAUDRATE 133*33585Srick #ifndef DONTRESETBAUDRATE 13423731Sbloom i = atoi(&cbuf[8]); 13523731Sbloom if (i > 0 && i != dev->D_speed) { 13623731Sbloom DEBUG(4,"Baudrate reset to %d\n", i); 13723731Sbloom fixline(dh, i); 13823731Sbloom } 139*33585Srick #endif /* DONTRESETBAUDRATE */ 14017774Sralph 14117774Sralph } 14217774Sralph if (dh < 0) { 14317774Sralph logent(dcname, "CAN'T OPEN"); 14417774Sralph return dh; 14517774Sralph } 14617774Sralph DEBUG(4, "hayes ok\n", CNULL); 14717774Sralph return dh; 14817774Sralph } 14917774Sralph 15017774Sralph hyscls(fd) 15117774Sralph int fd; 15217774Sralph { 15317774Sralph char dcname[20]; 15417774Sralph #ifdef DROPDTR 15517774Sralph struct sgttyb hup, sav; 15617774Sralph #endif 15717774Sralph 15817774Sralph if (fd > 0) { 15917774Sralph sprintf(dcname, "/dev/%s", devSel); 16017774Sralph DEBUG(4, "Hanging up fd = %d\n", fd); 16117774Sralph #ifdef DROPDTR 16217774Sralph /* 16317774Sralph * code to drop DTR -- change to 0 baud then back to default. 16417774Sralph */ 16517774Sralph gtty(fd, &hup); 16617774Sralph gtty(fd, &sav); 16717774Sralph hup.sg_ispeed = B0; 16817774Sralph hup.sg_ospeed = B0; 16917774Sralph stty(fd, &hup); 17017774Sralph sleep(2); 17117774Sralph stty(fd, &sav); 17217774Sralph /* 17317774Sralph * now raise DTR -- close the device & open it again. 17417774Sralph */ 17517774Sralph sleep(2); 17617774Sralph close(fd); 17717774Sralph sleep(2); 17817774Sralph fd = open(dcname, 2); 17925154Sbloom stty(fd, &sav); 18017774Sralph #else 18117774Sralph sleep(3); 18217774Sralph write(fd, "+++", 3); 18317774Sralph #endif 18417774Sralph sleep(3); 185*33585Srick write(fd, "ATH\r", 4); 186*33585Srick /* 18723698Sbloom if (expect("OK",fd) != 0) 18817774Sralph logent(devSel, "HSM did not respond to ATZ"); 189*33585Srick */ 19017774Sralph sleep(1); 191*33585Srick write(fd, "ATZ\r", 4); 192*33585Srick sleep(1); 19317774Sralph close(fd); 19417774Sralph delock(devSel); 19517774Sralph } 19617774Sralph } 197