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