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