117774Sralph #ifndef lint 2*25154Sbloom static char sccsid[] = "@(#)hys.c 4.4 (Berkeley) 10/10/85"; 317774Sralph #endif 417774Sralph 517774Sralph #include "../condevs.h" 617774Sralph 717774Sralph #ifdef HAYES 8*25154Sbloom #define USR2400 /* U.S. Robotics Courier 2400 */ 9*25154Sbloom #ifdef USR2400 10*25154Sbloom #define DROPDTR 11*25154Sbloom #endif USR2400 12*25154Sbloom 1323698Sbloom /* 1417774Sralph * hyspopn(telno, flds, dev) connect to hayes smartmodem (pulse call) 1517774Sralph * hystopn(telno, flds, dev) connect to hayes smartmodem (tone call) 1617774Sralph * char *flds[], *dev[]; 1717774Sralph * 1817774Sralph * return codes: 1917774Sralph * >0 - file number - ok 2017774Sralph * CF_DIAL,CF_DEVICE - failed 2117774Sralph */ 2217774Sralph 2317774Sralph hyspopn(telno, flds, dev) 2417774Sralph char *telno, *flds[]; 2517774Sralph struct Devices *dev; 2617774Sralph { 2717774Sralph return hysopn(telno, flds, dev, 0); 2817774Sralph } 2917774Sralph 3017774Sralph hystopn(telno, flds, dev) 3117774Sralph char *telno, *flds[]; 3217774Sralph struct Devices *dev; 3317774Sralph { 3417774Sralph return hysopn(telno, flds, dev, 1); 3517774Sralph } 3617774Sralph 3717774Sralph /* ARGSUSED */ 3817774Sralph hysopn(telno, flds, dev, toneflag) 3917774Sralph char *telno; 4017774Sralph char *flds[]; 4117774Sralph struct Devices *dev; 4217774Sralph int toneflag; 4317774Sralph { 4417774Sralph int dh = -1; 4517774Sralph extern errno; 4617774Sralph char dcname[20]; 4723731Sbloom char cbuf[MAXPH]; 4823731Sbloom register char *cp; 4923731Sbloom register int i; 5017774Sralph 5117774Sralph sprintf(dcname, "/dev/%s", dev->D_line); 5217774Sralph DEBUG(4, "dc - %s\n", dcname); 5317774Sralph if (setjmp(Sjbuf)) { 5417774Sralph logent(dcname, "TIMEOUT"); 5517774Sralph if (dh >= 0) 5617774Sralph close(dh); 5717774Sralph return CF_DIAL; 5817774Sralph } 5917774Sralph signal(SIGALRM, alarmtr); 6017774Sralph getnextfd(); 6117774Sralph alarm(10); 6217774Sralph dh = open(dcname, 2); /* read/write */ 6317774Sralph alarm(0); 6417774Sralph 6517774Sralph /* modem is open */ 6617774Sralph next_fd = -1; 6717774Sralph if (dh >= 0) { 6817774Sralph fixline(dh, dev->D_speed); 6917774Sralph if (dochat(dev, flds, dh)) { 7017774Sralph logent(dcname, "CHAT FAILED"); 7117774Sralph close(dh); 7217774Sralph return CF_DIAL; 7317774Sralph } 74*25154Sbloom write(dh, "ATV1E0H\r", 8); 7517774Sralph if (expect("OK\r\n", dh) != 0) { 7617774Sralph logent(dcname, "HSM seems dead"); 77*25154Sbloom hyscls(dh); 7817774Sralph return CF_DIAL; 7917774Sralph } 80*25154Sbloom #ifdef USR2400 81*25154Sbloom write(dh, "ATX6\r", 5); 82*25154Sbloom if (expect("OK\r\n", dh) != 0) { 83*25154Sbloom logent(dcname, "HSM seems dead"); 84*25154Sbloom hyscls(dh); 85*25154Sbloom return CF_DIAL; 86*25154Sbloom } 87*25154Sbloom #endif USR2400 8817774Sralph if (toneflag) 8917774Sralph write(dh, "\rATDT", 5); 9017774Sralph else 9117774Sralph write(dh, "\rATDP", 5); 9217774Sralph write(dh, telno, strlen(telno)); 9317774Sralph write(dh, "\r", 1); 9417774Sralph 9523731Sbloom if (setjmp(Sjbuf)) { 9623731Sbloom logent(dcname, "TIMEOUT"); 9723731Sbloom strcpy(devSel, dev->D_line); 9823731Sbloom hyscls(dh); 9923731Sbloom return CF_DIAL; 10023731Sbloom } 10123731Sbloom signal(SIGALRM, alarmtr); 102*25154Sbloom do { 103*25154Sbloom alarm(MAXMSGTIME); 104*25154Sbloom cp = cbuf; 105*25154Sbloom while (read(dh, cp ,1) == 1) 106*25154Sbloom if (*cp >= ' ') 107*25154Sbloom break; 108*25154Sbloom while (++cp < &cbuf[MAXPH] && read(dh, cp, 1) == 1 && *cp != '\n') 109*25154Sbloom ; 110*25154Sbloom alarm(0); 111*25154Sbloom *cp-- = '\0'; 112*25154Sbloom if (*cp == '\r') 113*25154Sbloom *cp = '\0'; 114*25154Sbloom DEBUG(4,"\nGOT: %s", cbuf); 115*25154Sbloom } while (strncmp(cbuf, "RING", 4) == 0); 11623731Sbloom if (strncmp(cbuf, "CONNECT", 7) != 0) { 117*25154Sbloom logent(cbuf, _FAILED); 11817774Sralph strcpy(devSel, dev->D_line); 11917774Sralph hyscls(dh); 12017774Sralph return CF_DIAL; 12117774Sralph } 12223731Sbloom i = atoi(&cbuf[8]); 12323731Sbloom if (i > 0 && i != dev->D_speed) { 12423731Sbloom DEBUG(4,"Baudrate reset to %d\n", i); 12523731Sbloom fixline(dh, i); 12623731Sbloom } 12717774Sralph 12817774Sralph } 12917774Sralph if (dh < 0) { 13017774Sralph logent(dcname, "CAN'T OPEN"); 13117774Sralph return dh; 13217774Sralph } 13317774Sralph DEBUG(4, "hayes ok\n", CNULL); 13417774Sralph return dh; 13517774Sralph } 13617774Sralph 13717774Sralph hyscls(fd) 13817774Sralph int fd; 13917774Sralph { 14017774Sralph char dcname[20]; 14117774Sralph #ifdef DROPDTR 14217774Sralph struct sgttyb hup, sav; 14317774Sralph #endif 14417774Sralph 14517774Sralph if (fd > 0) { 14617774Sralph sprintf(dcname, "/dev/%s", devSel); 14717774Sralph DEBUG(4, "Hanging up fd = %d\n", fd); 14817774Sralph #ifdef DROPDTR 14917774Sralph /* 15017774Sralph * code to drop DTR -- change to 0 baud then back to default. 15117774Sralph */ 15217774Sralph gtty(fd, &hup); 15317774Sralph gtty(fd, &sav); 15417774Sralph hup.sg_ispeed = B0; 15517774Sralph hup.sg_ospeed = B0; 15617774Sralph stty(fd, &hup); 15717774Sralph sleep(2); 15817774Sralph stty(fd, &sav); 15917774Sralph /* 16017774Sralph * now raise DTR -- close the device & open it again. 16117774Sralph */ 16217774Sralph sleep(2); 16317774Sralph close(fd); 16417774Sralph sleep(2); 16517774Sralph fd = open(dcname, 2); 166*25154Sbloom stty(fd, &sav); 16717774Sralph #else 16817774Sralph sleep(3); 16917774Sralph write(fd, "+++", 3); 17017774Sralph #endif 17117774Sralph sleep(3); 17217774Sralph write(fd, "ATZ\r", 4); 17323698Sbloom if (expect("OK",fd) != 0) 17417774Sralph logent(devSel, "HSM did not respond to ATZ"); 17517774Sralph sleep(1); 17617774Sralph close(fd); 17717774Sralph delock(devSel); 17817774Sralph } 17917774Sralph } 18017774Sralph 18117774Sralph #endif HAYES 18223698Sbloom 183