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