xref: /csrg-svn/usr.bin/uucp/libacu/df12.c (revision 18563)
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