117774Sralph #ifndef lint 2*25885Sbloom static char sccsid[] = "@(#)hys.c 4.5 (Berkeley) 01/13/86"; 317774Sralph #endif 417774Sralph 517774Sralph #include "../condevs.h" 617774Sralph 717774Sralph #ifdef HAYES 825154Sbloom #define USR2400 /* U.S. Robotics Courier 2400 */ 925154Sbloom #ifdef USR2400 1025154Sbloom #define DROPDTR 11*25885Sbloom /* 12*25885Sbloom * The "correct" switch settings for a USR Courier 2400 are 13*25885Sbloom * Dialin/out: 0 0 1 1 0 0 0 1 0 0 14*25885Sbloom * Dialout only: 0 0 1 1 1 1 0 1 0 0 15*25885Sbloom * where 0 = off and 1 = on 16*25885Sbloom */ 1725154Sbloom #endif USR2400 1825154Sbloom 1923698Sbloom /* 2017774Sralph * hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call) 2117774Sralph * hystopn(telno, flds, dev) connect to hayes smartmodem (tone call) 2217774Sralph * char *flds[], *dev[]; 2317774Sralph * 2417774Sralph * return codes: 2517774Sralph * >0 - file number - ok 2617774Sralph * CF_DIAL,CF_DEVICE - failed 2717774Sralph */ 2817774Sralph 2917774Sralph hyspopn(telno, flds, dev) 3017774Sralph char *telno, *flds[]; 3117774Sralph struct Devices *dev; 3217774Sralph { 3317774Sralph return hysopn(telno, flds, dev, 0); 3417774Sralph } 3517774Sralph 3617774Sralph hystopn(telno, flds, dev) 3717774Sralph char *telno, *flds[]; 3817774Sralph struct Devices *dev; 3917774Sralph { 4017774Sralph return hysopn(telno, flds, dev, 1); 4117774Sralph } 4217774Sralph 4317774Sralph /* ARGSUSED */ 4417774Sralph hysopn(telno, flds, dev, toneflag) 4517774Sralph char *telno; 4617774Sralph char *flds[]; 4717774Sralph struct Devices *dev; 4817774Sralph int toneflag; 4917774Sralph { 5017774Sralph extern errno; 5117774Sralph char dcname[20]; 5223731Sbloom char cbuf[MAXPH]; 5323731Sbloom register char *cp; 5423731Sbloom register int i; 55*25885Sbloom int dh = -1, nrings = 0; 5617774Sralph 5717774Sralph sprintf(dcname, "/dev/%s", dev->D_line); 5817774Sralph DEBUG(4, "dc - %s\n", dcname); 5917774Sralph if (setjmp(Sjbuf)) { 6017774Sralph logent(dcname, "TIMEOUT"); 6117774Sralph if (dh >= 0) 62*25885Sbloom hyscls(dh); 6317774Sralph return CF_DIAL; 6417774Sralph } 6517774Sralph signal(SIGALRM, alarmtr); 6617774Sralph getnextfd(); 6717774Sralph alarm(10); 6817774Sralph dh = open(dcname, 2); /* read/write */ 6917774Sralph alarm(0); 7017774Sralph 7117774Sralph /* modem is open */ 7217774Sralph next_fd = -1; 7317774Sralph if (dh >= 0) { 7417774Sralph fixline(dh, dev->D_speed); 7517774Sralph if (dochat(dev, flds, dh)) { 7617774Sralph logent(dcname, "CHAT FAILED"); 77*25885Sbloom hyscls(dh); 7817774Sralph return CF_DIAL; 7917774Sralph } 8025154Sbloom write(dh, "ATV1E0H\r", 8); 8117774Sralph if (expect("OK\r\n", dh) != 0) { 8217774Sralph logent(dcname, "HSM seems dead"); 8325154Sbloom hyscls(dh); 8417774Sralph return CF_DIAL; 8517774Sralph } 8625154Sbloom #ifdef USR2400 87*25885Sbloom write(dh, "ATX6S7=44\r", 10); 8825154Sbloom if (expect("OK\r\n", dh) != 0) { 8925154Sbloom logent(dcname, "HSM seems dead"); 9025154Sbloom hyscls(dh); 9125154Sbloom return CF_DIAL; 9225154Sbloom } 9325154Sbloom #endif USR2400 9417774Sralph if (toneflag) 9517774Sralph write(dh, "\rATDT", 5); 9617774Sralph else 97*25885Sbloom #ifdef USR2400 98*25885Sbloom write(dh, "\rATD", 4); 99*25885Sbloom #else HAYES 10017774Sralph write(dh, "\rATDP", 5); 101*25885Sbloom #endif HAYES 10217774Sralph write(dh, telno, strlen(telno)); 10317774Sralph write(dh, "\r", 1); 10417774Sralph 10523731Sbloom if (setjmp(Sjbuf)) { 10623731Sbloom logent(dcname, "TIMEOUT"); 10723731Sbloom strcpy(devSel, dev->D_line); 10823731Sbloom hyscls(dh); 10923731Sbloom return CF_DIAL; 11023731Sbloom } 11123731Sbloom signal(SIGALRM, alarmtr); 112*25885Sbloom alarm(2*MAXMSGTIME); 11325154Sbloom do { 11425154Sbloom cp = cbuf; 11525154Sbloom while (read(dh, cp ,1) == 1) 11625154Sbloom if (*cp >= ' ') 11725154Sbloom break; 11825154Sbloom while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n') 11925154Sbloom ; 12025154Sbloom alarm(0); 12125154Sbloom *cp-- = '\0'; 12225154Sbloom if (*cp == '\r') 12325154Sbloom *cp = '\0'; 12425154Sbloom DEBUG(4,"\nGOT: %s", cbuf); 125*25885Sbloom alarm(MAXMSGTIME); 126*25885Sbloom } while (strncmp(cbuf, "RING", 4) == 0 && nrings++ < 5); 12723731Sbloom if (strncmp(cbuf, "CONNECT", 7) != 0) { 12825154Sbloom logent(cbuf, _FAILED); 12917774Sralph strcpy(devSel, dev->D_line); 13017774Sralph hyscls(dh); 13117774Sralph return CF_DIAL; 13217774Sralph } 13323731Sbloom i = atoi(&cbuf[8]); 13423731Sbloom if (i > 0 && i != dev->D_speed) { 13523731Sbloom DEBUG(4,"Baudrate reset to %d\n", i); 13623731Sbloom fixline(dh, i); 13723731Sbloom } 13817774Sralph 13917774Sralph } 14017774Sralph if (dh < 0) { 14117774Sralph logent(dcname, "CAN'T OPEN"); 14217774Sralph return dh; 14317774Sralph } 14417774Sralph DEBUG(4, "hayes ok\n", CNULL); 14517774Sralph return dh; 14617774Sralph } 14717774Sralph 14817774Sralph hyscls(fd) 14917774Sralph int fd; 15017774Sralph { 15117774Sralph char dcname[20]; 15217774Sralph #ifdef DROPDTR 15317774Sralph struct sgttyb hup, sav; 15417774Sralph #endif 15517774Sralph 15617774Sralph if (fd > 0) { 15717774Sralph sprintf(dcname, "/dev/%s", devSel); 15817774Sralph DEBUG(4, "Hanging up fd = %d\n", fd); 15917774Sralph #ifdef DROPDTR 16017774Sralph /* 16117774Sralph * code to drop DTR -- change to 0 baud then back to default. 16217774Sralph */ 16317774Sralph gtty(fd, &hup); 16417774Sralph gtty(fd, &sav); 16517774Sralph hup.sg_ispeed = B0; 16617774Sralph hup.sg_ospeed = B0; 16717774Sralph stty(fd, &hup); 16817774Sralph sleep(2); 16917774Sralph stty(fd, &sav); 17017774Sralph /* 17117774Sralph * now raise DTR -- close the device & open it again. 17217774Sralph */ 17317774Sralph sleep(2); 17417774Sralph close(fd); 17517774Sralph sleep(2); 17617774Sralph fd = open(dcname, 2); 17725154Sbloom stty(fd, &sav); 17817774Sralph #else 17917774Sralph sleep(3); 18017774Sralph write(fd, "+++", 3); 18117774Sralph #endif 18217774Sralph sleep(3); 18317774Sralph write(fd, "ATZ\r", 4); 18423698Sbloom if (expect("OK",fd) != 0) 18517774Sralph logent(devSel, "HSM did not respond to ATZ"); 186*25885Sbloom write(fd, "ATH\r", 4); 18717774Sralph sleep(1); 18817774Sralph close(fd); 18917774Sralph delock(devSel); 19017774Sralph } 19117774Sralph } 19217774Sralph #endif HAYES 193