4.4BSD snapshot (revision 8.1); add 1993 to copyright
[unix-history] / usr / src / usr.bin / uucp / libacu / dn.c
CommitLineData
f49909f5 1/*-
17e8cbca
KB
2 * Copyright (c) 1985, 1993
3 * The Regents of the University of California. All rights reserved.
f49909f5
KB
4 *
5 * %sccs.include.proprietary.c%
6 */
7
f76694db 8#ifndef lint
17e8cbca 9static char sccsid[] = "@(#)dn.c 8.1 (Berkeley) %G%";
f49909f5 10#endif /* not lint */
f76694db 11
ddf4e66c 12#include "condevs.h"
de465ec0 13#define ACULAST "-<"
f76694db
RC
14
15/***
16 * dnopn(ph, flds, dev) dial remote machine
17 *
18 * return codes:
19 * file descriptor - succeeded
20 * FAIL - failed
21 */
22dnopn(ph, flds, dev)
23char *ph;
24char *flds[];
25struct Devices *dev;
26{
27 char dcname[20], dnname[20], phone[MAXPH+2], c = 0;
de465ec0 28#ifdef USG
f76694db 29 struct termio ttbuf;
de465ec0 30#endif USG
f76694db
RC
31 int dnf, dcf;
32 int nw, lt, pid, status;
33 unsigned timelim;
de465ec0
JB
34#ifdef TIOCFLUSH
35 int zero = 0;
36#endif TIOCFLUSH
f76694db
RC
37
38 sprintf(dnname, "/dev/%s", dev->D_calldev);
39 errno = 0;
40
41 if (setjmp(Sjbuf)) {
42 logent(dnname, "CAN'T OPEN");
43 DEBUG(4, "%s Open timed out\n", dnname);
44 return(CF_NODEV);
45 }
46 signal(SIGALRM, alarmtr);
47 getnextfd();
48 alarm(10);
49 dnf = open(dnname, 1);
50 alarm(0);
51 next_fd = -1;
52 if (dnf < 0 && errno == EACCES) {
53 logent(dnname, "CAN'T OPEN");
54 logent("DEVICE", "NO");
55 return CF_NODEV;
56 }
57 fioclex(dnf);
58
59 sprintf(dcname, "/dev/%s", dev->D_line);
60 sprintf(phone, "%s%s", ph, ACULAST);
61 DEBUG(4, "dc - %s, ", dcname);
62 DEBUG(4, "acu - %s\n", dnname);
63 pid = 0;
64 if (setjmp(Sjbuf)) {
65 logent("DIALUP DN write", "TIMEOUT");
66 if (pid)
67 kill(pid, 9);
68 delock(dev->D_line);
69 if (dnf)
70 close(dnf);
71 return CF_DIAL;
72 }
73 signal(SIGALRM, alarmtr);
74 timelim = 5 * strlen(phone);
75 alarm(timelim < 30 ? 30 : timelim);
76 if ((pid = fork()) == 0) {
77 sleep(2);
78 fclose(stdin);
79 fclose(stdout);
80#ifdef TIOCFLUSH
de465ec0
JB
81 ioctl(dnf, TIOCFLUSH, &zero);
82#endif TIOCFLUSH
f76694db
RC
83 nw = write(dnf, phone, lt = strlen(phone));
84 if (nw != lt) {
85 logent("DIALUP ACU write", _FAILED);
86 exit(1);
87 }
88 DEBUG(4, "ACU write ok\n", CNULL);
89 exit(0);
90 }
91 /* open line - will return on carrier */
92 /* RT needs a sleep here because it returns immediately from open */
93
94#if RT
95 sleep(15);
96#endif
97
98 getnextfd();
99 errno = 0;
100 dcf = open(dcname, 2);
101 next_fd = -1;
102 if (dcf < 0 && errno == EACCES)
103 logent(dcname, "CAN'T OPEN");
104 DEBUG(4, "dcf is %d\n", dcf);
105 if (dcf < 0) {
106 logent("DIALUP LINE open", _FAILED);
107 alarm(0);
108 kill(pid, 9);
109 close(dnf);
110 delock(dev->D_line);
111 return CF_DIAL;
112 }
113 while ((nw = wait(&lt)) != pid && nw != -1)
114 ;
de465ec0 115#ifdef USG
f76694db
RC
116 ioctl(dcf, TCGETA, &ttbuf);
117 if(!(ttbuf.c_cflag & HUPCL)) {
118 ttbuf.c_cflag |= HUPCL;
119 ioctl(dcf, TCSETA, &ttbuf);
120 }
de465ec0 121#endif USG
f76694db
RC
122 alarm(0);
123 fflush(stdout);
124 fixline(dcf, dev->D_speed);
125 DEBUG(4, "Fork Stat %o\n", lt);
126 if (lt != 0) {
127 close(dcf);
128 if (dnf)
129 close(dnf);
130 delock(dev->D_line);
131 return CF_DIAL;
132 }
133 return dcf;
134}
135
136/***
137 * dncls() close dn type call unit
138 *
139 * return codes: None
140 */
141dncls(fd)
142register int fd;
143{
144 if (fd > 0) {
145 close(fd);
146 sleep(5);
147 delock(devSel);
148 }
149}