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
df12popn(telno,flds,dev)24 df12popn (telno, flds, dev)
25 char *telno,
26 *flds[];
27 struct Devices *dev;
28 {
29 return df12opn (telno, flds, dev, 0);
30 }
31
df12topn(telno,flds,dev)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 */
df12opn(telno,flds,dev,toneflag)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
df12cls(fd)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