118563Sralph #ifndef lint 2*46875Sbostic static char sccsid[] = "@(#)df12.c 4.3 (Berkeley) 03/02/91"; 318563Sralph #endif 418563Sralph 5*46875Sbostic #include "condevs.h" 618563Sralph 718563Sralph /* 818563Sralph * df12popn(telno, flds, dev) connect to df12 modem (pulse call) 918563Sralph * df12topn(telno, flds, dev) connect to df12 modem (tone call) 1018563Sralph * char *flds[], *dev[]; 1118563Sralph * 1218563Sralph * return codes: 1318563Sralph * >0 - file number - ok 1418563Sralph * CF_DIAL,CF_NODEV - failed 1518563Sralph */ 1618563Sralph 1718563Sralph df12popn (telno, flds, dev) 1818563Sralph char *telno, 1918563Sralph *flds[]; 2018563Sralph struct Devices *dev; 2118563Sralph { 2218563Sralph return df12opn (telno, flds, dev, 0); 2318563Sralph } 2418563Sralph 2518563Sralph df12topn (telno, flds, dev) 2618563Sralph char *telno, 2718563Sralph *flds[]; 2818563Sralph struct Devices *dev; 2918563Sralph { 3018563Sralph return df12opn (telno, flds, dev, 1); 3118563Sralph } 3218563Sralph 3318563Sralph /* ARGSUSED */ 3418563Sralph df12opn (telno, flds, dev, toneflag) 3518563Sralph char *telno; 3618563Sralph char *flds[]; 3718563Sralph struct Devices *dev; 3818563Sralph int toneflag; 3918563Sralph { 4018563Sralph int phindex, dh = -1; 4118563Sralph extern errno; 4218563Sralph char dcname[20], newphone[64]; 4318563Sralph 4418563Sralph sprintf (dcname, "/dev/%s", dev -> D_line); 4518563Sralph DEBUG (4, "dc - %s\n", dcname); 4618563Sralph if (setjmp (Sjbuf)) 4718563Sralph { 4818563Sralph logent (dcname, "TIMEOUT"); 4918563Sralph if (dh >= 0) 5018563Sralph close (dh); 5118563Sralph return CF_DIAL; 5218563Sralph } 5318563Sralph signal (SIGALRM, alarmtr); 5418563Sralph getnextfd (); 5518563Sralph alarm (10); 5618563Sralph dh = open (dcname, 2);/* read/write */ 5718563Sralph alarm (0); 5818563Sralph 5918563Sralph /* modem is open */ 6018563Sralph 6118563Sralph /* First, adjust our phone number string. These modems don't 6218563Sralph * like any characters but digits and "=" signs (for delay) 6318563Sralph */ 6418563Sralph for (phindex = 0; *telno; telno++) 6518563Sralph { 6618563Sralph if (*telno == '=' || (*telno >= '0' && *telno <= '9')) 6718563Sralph newphone[phindex++] = *telno; 6818563Sralph if (phindex == 64) 6918563Sralph { 7018563Sralph logent (dcname, "Phone number too long"); 7118563Sralph close (dh); 7218563Sralph return CF_DIAL; 7318563Sralph } 7418563Sralph } 7518563Sralph newphone[phindex] = '\0'; 7618563Sralph next_fd = -1; 7718563Sralph if (dh >= 0) 7818563Sralph { 7918563Sralph fixline (dh, dev -> D_speed); 8018563Sralph if (dochat (dev, flds, dh)) 8118563Sralph { 8218563Sralph logent (dcname, "CHAT FAILED"); 8318563Sralph close (dh); 8418563Sralph return CF_DIAL; 8518563Sralph } 8618563Sralph slowrite (dh, "\02"); 8718563Sralph if (expect ("Ready\r\n", dh) != 0) 8818563Sralph { 8918563Sralph DEBUG (4, "Didn't get 'Ready' response.\n", NULL); 9018563Sralph logent (dcname, "Modem not responding"); 9118563Sralph close (dh); 9218563Sralph return CF_DIAL; 9318563Sralph } 9418563Sralph DEBUG (4, "Got 'Ready' response\n", NULL); 9518563Sralph DEBUG (7, "Writing control select flag %c\n", toneflag ? 'T' : 'P'); 9618563Sralph slowrite (dh, toneflag ? "T" : "P"); 9718563Sralph DEBUG (4, "Writing telephone number %s\n", newphone); 9818563Sralph slowrite (dh, newphone); 9918563Sralph DEBUG (7, "Telephone number written\n", NULL); 10018563Sralph slowrite (dh, "#"); 10118563Sralph DEBUG (7, "Writing # sign\n", NULL); 10218563Sralph 10318563Sralph if (expect ("Attached\r\n", dh) != 0) 10418563Sralph { 10518563Sralph logent (dcname, "No carrier"); 10618563Sralph strcpy (devSel, dev -> D_line); 10718563Sralph df12cls (dh); 10818563Sralph return CF_DIAL; 10918563Sralph } 11018563Sralph 11118563Sralph } 11218563Sralph if (dh < 0) 11318563Sralph { 11418563Sralph logent (dcname, "CAN'T OPEN"); 11518563Sralph return CF_NODEV; 11618563Sralph } 11718563Sralph else 11818563Sralph { 11918563Sralph DEBUG (4, "df12 ok\n", CNULL); 12018563Sralph return dh; 12118563Sralph } 12218563Sralph } 12318563Sralph 12418563Sralph df12cls (fd) 12518563Sralph int fd; 12618563Sralph { 12718563Sralph char dcname[20]; 12818563Sralph struct sgttyb hup, 12918563Sralph sav; 13018563Sralph 13118563Sralph if (fd > 0) 13218563Sralph { 13318563Sralph sprintf (dcname, "/dev/%s", devSel); 13418563Sralph DEBUG (4, "Hanging up fd = %d\n", fd); 13518563Sralph /* 13618563Sralph * code to drop DTR -- change to 0 baud then back to default. 13718563Sralph */ 13818563Sralph gtty (fd, &hup); 13918563Sralph gtty (fd, &sav); 14018563Sralph hup.sg_ispeed = B0; 14118563Sralph hup.sg_ospeed = B0; 14218563Sralph stty (fd, &hup); 14318563Sralph sleep (2); 14418563Sralph stty (fd, &sav); 14518563Sralph /* 14618563Sralph * now raise DTR -- close the device & open it again. 14718563Sralph */ 14818563Sralph sleep (2); 14918563Sralph close (fd); 15018563Sralph sleep (2); 15118563Sralph delock (devSel); 15218563Sralph } 15318563Sralph } 154