|
|
1.1 root 1: /*
2: * Copyright (c) 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)acu.c 5.7 (Berkeley) 6/1/90";
22: #endif /* not lint */
23:
24: #include "tip.h"
25:
26: static acu_t *acu = NOACU;
27: static int conflag;
28: static int acuabort();
29: static acu_t *acutype();
30: static jmp_buf jmpbuf;
31: /*
32: * Establish connection for tip
33: *
34: * If DU is true, we should dial an ACU whose type is AT.
35: * The phone numbers are in PN, and the call unit is in CU.
36: *
37: * If the PN is an '@', then we consult the PHONES file for
38: * the phone numbers. This file is /etc/phones, unless overriden
39: * by an exported shell variable.
40: *
41: * The data base files must be in the format:
42: * host-name[ \t]*phone-number
43: * with the possibility of multiple phone numbers
44: * for a single host acting as a rotary (in the order
45: * found in the file).
46: */
47: char *
48: connect()
49: {
50: register char *cp = PN;
51: char *phnum, string[256];
52: FILE *fd;
53: int tried = 0;
54:
55: if (!DU) { /* regular connect message */
56: if (CM != NOSTR)
57: pwrite(FD, CM, size(CM));
58: logent(value(HOST), "", DV, "call completed");
59: return (NOSTR);
60: }
61: /*
62: * @ =>'s use data base in PHONES environment variable
63: * otherwise, use /etc/phones
64: */
65: signal(SIGINT, acuabort);
66: signal(SIGQUIT, acuabort);
67: if (setjmp(jmpbuf)) {
68: signal(SIGINT, SIG_IGN);
69: signal(SIGQUIT, SIG_IGN);
70: printf("\ncall aborted\n");
71: logent(value(HOST), "", "", "call aborted");
72: if (acu != NOACU) {
73: boolean(value(VERBOSE)) = FALSE;
74: if (conflag)
75: disconnect(NOSTR);
76: else
77: (*acu->acu_abort)();
78: }
79: return ("interrupt");
80: }
81: if ((acu = acutype(AT)) == NOACU)
82: return ("unknown ACU type");
83: if (*cp != '@') {
84: while (*cp) {
85: for (phnum = cp; *cp && *cp != ','; cp++)
86: ;
87: if (*cp)
88: *cp++ = '\0';
89:
90: if (conflag = (*acu->acu_dialer)(phnum, CU)) {
91: logent(value(HOST), phnum, acu->acu_name,
92: "call completed");
93: return (NOSTR);
94: } else
95: logent(value(HOST), phnum, acu->acu_name,
96: "call failed");
97: tried++;
98: }
99: } else {
100: if ((fd = fopen(PH, "r")) == NOFILE) {
101: printf("%s: ", PH);
102: return ("can't open phone number file");
103: }
104: while (fgets(string, sizeof(string), fd) != NOSTR) {
105: for (cp = string; !any(*cp, " \t\n"); cp++)
106: ;
107: if (*cp == '\n') {
108: fclose(fd);
109: return ("unrecognizable host name");
110: }
111: *cp++ = '\0';
112: if (strcmp(string, value(HOST)))
113: continue;
114: while (any(*cp, " \t"))
115: cp++;
116: if (*cp == '\n') {
117: fclose(fd);
118: return ("missing phone number");
119: }
120: for (phnum = cp; *cp && *cp != ',' && *cp != '\n'; cp++)
121: ;
122: if (*cp)
123: *cp++ = '\0';
124:
125: if (conflag = (*acu->acu_dialer)(phnum, CU)) {
126: fclose(fd);
127: logent(value(HOST), phnum, acu->acu_name,
128: "call completed");
129: return (NOSTR);
130: } else
131: logent(value(HOST), phnum, acu->acu_name,
132: "call failed");
133: tried++;
134: }
135: fclose(fd);
136: }
137: if (!tried)
138: logent(value(HOST), "", acu->acu_name, "missing phone number");
139: else
140: (*acu->acu_abort)();
141: return (tried ? "call failed" : "missing phone number");
142: }
143:
144: disconnect(reason)
145: char *reason;
146: {
147: if (!conflag) {
148: logent(value(HOST), "", DV, "call terminated");
149: return;
150: }
151: if (reason == NOSTR) {
152: logent(value(HOST), "", acu->acu_name, "call terminated");
153: if (boolean(value(VERBOSE)))
154: printf("\r\ndisconnecting...");
155: } else
156: logent(value(HOST), "", acu->acu_name, reason);
157: (*acu->acu_disconnect)();
158: }
159:
160: static int
161: acuabort(s)
162: {
163: signal(s, SIG_IGN);
164: longjmp(jmpbuf, 1);
165: }
166:
167: static acu_t *
168: acutype(s)
169: register char *s;
170: {
171: register acu_t *p;
172: extern acu_t acutable[];
173:
174: for (p = acutable; p->acu_name != '\0'; p++)
175: if (!strcmp(s, p->acu_name))
176: return (p);
177: return (NOACU);
178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.