1*18563Sralph #ifndef lint 2*18563Sralph static char sccsid[] = "@(#)df12.c 4.1 (Berkeley) 04/03/85"; 3*18563Sralph #endif 4*18563Sralph 5*18563Sralph #include "../condevs.h" 6*18563Sralph 7*18563Sralph #ifdef DF112 8*18563Sralph /* 9*18563Sralph * df12popn(telno, flds, dev) connect to df12 modem (pulse call) 10*18563Sralph * df12topn(telno, flds, dev) connect to df12 modem (tone call) 11*18563Sralph * char *flds[], *dev[]; 12*18563Sralph * 13*18563Sralph * return codes: 14*18563Sralph * >0 - file number - ok 15*18563Sralph * CF_DIAL,CF_NODEV - failed 16*18563Sralph */ 17*18563Sralph 18*18563Sralph df12popn (telno, flds, dev) 19*18563Sralph char *telno, 20*18563Sralph *flds[]; 21*18563Sralph struct Devices *dev; 22*18563Sralph { 23*18563Sralph return df12opn (telno, flds, dev, 0); 24*18563Sralph } 25*18563Sralph 26*18563Sralph df12topn (telno, flds, dev) 27*18563Sralph char *telno, 28*18563Sralph *flds[]; 29*18563Sralph struct Devices *dev; 30*18563Sralph { 31*18563Sralph return df12opn (telno, flds, dev, 1); 32*18563Sralph } 33*18563Sralph 34*18563Sralph /* ARGSUSED */ 35*18563Sralph df12opn (telno, flds, dev, toneflag) 36*18563Sralph char *telno; 37*18563Sralph char *flds[]; 38*18563Sralph struct Devices *dev; 39*18563Sralph int toneflag; 40*18563Sralph { 41*18563Sralph int phindex, dh = -1; 42*18563Sralph extern errno; 43*18563Sralph char dcname[20], newphone[64]; 44*18563Sralph 45*18563Sralph sprintf (dcname, "/dev/%s", dev -> D_line); 46*18563Sralph DEBUG (4, "dc - %s\n", dcname); 47*18563Sralph if (setjmp (Sjbuf)) 48*18563Sralph { 49*18563Sralph logent (dcname, "TIMEOUT"); 50*18563Sralph if (dh >= 0) 51*18563Sralph close (dh); 52*18563Sralph return CF_DIAL; 53*18563Sralph } 54*18563Sralph signal (SIGALRM, alarmtr); 55*18563Sralph getnextfd (); 56*18563Sralph alarm (10); 57*18563Sralph dh = open (dcname, 2);/* read/write */ 58*18563Sralph alarm (0); 59*18563Sralph 60*18563Sralph /* modem is open */ 61*18563Sralph 62*18563Sralph /* First, adjust our phone number string. These modems don't 63*18563Sralph * like any characters but digits and "=" signs (for delay) 64*18563Sralph */ 65*18563Sralph for (phindex = 0; *telno; telno++) 66*18563Sralph { 67*18563Sralph if (*telno == '=' || (*telno >= '0' && *telno <= '9')) 68*18563Sralph newphone[phindex++] = *telno; 69*18563Sralph if (phindex == 64) 70*18563Sralph { 71*18563Sralph logent (dcname, "Phone number too long"); 72*18563Sralph close (dh); 73*18563Sralph return CF_DIAL; 74*18563Sralph } 75*18563Sralph } 76*18563Sralph newphone[phindex] = '\0'; 77*18563Sralph next_fd = -1; 78*18563Sralph if (dh >= 0) 79*18563Sralph { 80*18563Sralph fixline (dh, dev -> D_speed); 81*18563Sralph if (dochat (dev, flds, dh)) 82*18563Sralph { 83*18563Sralph logent (dcname, "CHAT FAILED"); 84*18563Sralph close (dh); 85*18563Sralph return CF_DIAL; 86*18563Sralph } 87*18563Sralph slowrite (dh, "\02"); 88*18563Sralph if (expect ("Ready\r\n", dh) != 0) 89*18563Sralph { 90*18563Sralph DEBUG (4, "Didn't get 'Ready' response.\n", NULL); 91*18563Sralph logent (dcname, "Modem not responding"); 92*18563Sralph close (dh); 93*18563Sralph return CF_DIAL; 94*18563Sralph } 95*18563Sralph DEBUG (4, "Got 'Ready' response\n", NULL); 96*18563Sralph DEBUG (7, "Writing control select flag %c\n", toneflag ? 'T' : 'P'); 97*18563Sralph slowrite (dh, toneflag ? "T" : "P"); 98*18563Sralph DEBUG (4, "Writing telephone number %s\n", newphone); 99*18563Sralph slowrite (dh, newphone); 100*18563Sralph DEBUG (7, "Telephone number written\n", NULL); 101*18563Sralph slowrite (dh, "#"); 102*18563Sralph DEBUG (7, "Writing # sign\n", NULL); 103*18563Sralph 104*18563Sralph if (expect ("Attached\r\n", dh) != 0) 105*18563Sralph { 106*18563Sralph logent (dcname, "No carrier"); 107*18563Sralph strcpy (devSel, dev -> D_line); 108*18563Sralph df12cls (dh); 109*18563Sralph return CF_DIAL; 110*18563Sralph } 111*18563Sralph 112*18563Sralph } 113*18563Sralph if (dh < 0) 114*18563Sralph { 115*18563Sralph logent (dcname, "CAN'T OPEN"); 116*18563Sralph return CF_NODEV; 117*18563Sralph } 118*18563Sralph else 119*18563Sralph { 120*18563Sralph DEBUG (4, "df12 ok\n", CNULL); 121*18563Sralph return dh; 122*18563Sralph } 123*18563Sralph } 124*18563Sralph 125*18563Sralph df12cls (fd) 126*18563Sralph int fd; 127*18563Sralph { 128*18563Sralph char dcname[20]; 129*18563Sralph struct sgttyb hup, 130*18563Sralph sav; 131*18563Sralph 132*18563Sralph if (fd > 0) 133*18563Sralph { 134*18563Sralph sprintf (dcname, "/dev/%s", devSel); 135*18563Sralph DEBUG (4, "Hanging up fd = %d\n", fd); 136*18563Sralph /* 137*18563Sralph * code to drop DTR -- change to 0 baud then back to default. 138*18563Sralph */ 139*18563Sralph gtty (fd, &hup); 140*18563Sralph gtty (fd, &sav); 141*18563Sralph hup.sg_ispeed = B0; 142*18563Sralph hup.sg_ospeed = B0; 143*18563Sralph stty (fd, &hup); 144*18563Sralph sleep (2); 145*18563Sralph stty (fd, &sav); 146*18563Sralph /* 147*18563Sralph * now raise DTR -- close the device & open it again. 148*18563Sralph */ 149*18563Sralph sleep (2); 150*18563Sralph close (fd); 151*18563Sralph sleep (2); 152*18563Sralph delock (devSel); 153*18563Sralph } 154*18563Sralph } 155*18563Sralph 156*18563Sralph #endif DF112 157