|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)acu.c 4.10 (Berkeley) 7/16/83";
3: #endif
4:
5: #include "tip.h"
6:
7: static acu_t *acu = NOACU;
8: static int conflag;
9: static int acuabort();
10: static acu_t *acutype();
11: static jmp_buf jmpbuf;
12: /*
13: * Establish connection for tip
14: *
15: * If DU is true, we should dial an ACU whose type is AT.
16: * The phone numbers are in PN, and the call unit is in CU.
17: *
18: * If the PN is an '@', then we consult the PHONES file for
19: * the phone numbers. This file is /etc/phones, unless overriden
20: * by an exported shell variable.
21: *
22: * The data base files must be in the format:
23: * host-name[ \t]*phone-number
24: * with the possibility of multiple phone numbers
25: * for a single host acting as a rotary (in the order
26: * found in the file).
27: */
28: char *
29: connect()
30: {
31: register char *cp = PN;
32: char *phnum, string[256];
33: FILE *fd;
34: int tried = 0;
35:
36: if (!DU) { /* regular connect message */
37: if (CM != NOSTR)
38: pwrite(FD, cp, size(CM));
39: return (NOSTR);
40: }
41: /*
42: * @ =>'s use data base in PHONES environment variable
43: * otherwise, use /etc/phones
44: */
45: signal(SIGINT, acuabort);
46: signal(SIGQUIT, acuabort);
47: if (setjmp(jmpbuf)) {
48: signal(SIGINT, SIG_IGN);
49: signal(SIGQUIT, SIG_IGN);
50: printf("\ncall aborted\n");
51: logent(value(HOST), "", "", "call aborted");
52: if (acu != NOACU) {
53: boolean(value(VERBOSE)) = FALSE;
54: if (conflag)
55: disconnect();
56: else
57: (*acu->acu_abort)();
58: }
59: delock(uucplock);
60: exit(1);
61: }
62: if ((acu = acutype(AT)) == NOACU)
63: return ("unknown ACU type");
64: if (*cp != '@') {
65: while (*cp) {
66: for (phnum = cp; any(*cp, "0123456789-*=K"); cp++)
67: ;
68: if (*cp)
69: *cp++ = '\0';
70:
71: if (conflag = (*acu->acu_dialer)(phnum, CU)) {
72: logent(value(HOST), phnum, acu->acu_name,
73: "call completed");
74: return (NOSTR);
75: } else
76: logent(value(HOST), phnum, acu->acu_name,
77: "call failed");
78: tried++;
79: }
80: } else {
81: if ((fd = fopen(PH, "r")) == NOFILE) {
82: printf("%s: ", PH);
83: return ("can't open phone number file");
84: }
85: while (fgets(string, sizeof(string), fd) != NOSTR) {
86: for (cp = string; !any(*cp, " \t\n"); cp++)
87: ;
88: if (*cp == '\n') {
89: fclose(fd);
90: return ("unrecognizable host name");
91: }
92: *cp++ = '\0';
93: if (strcmp(string, value(HOST)))
94: continue;
95: while (any(*cp, " \t"))
96: cp++;
97: if (*cp == '\n') {
98: fclose(fd);
99: return ("missing phone number");
100: }
101: for (phnum = cp; any(*cp, "0123456789-*="); cp++)
102: ;
103: *cp = '\0';
104:
105: if (conflag = (*acu->acu_dialer)(phnum, CU)) {
106: fclose(fd);
107: logent(value(HOST), phnum, acu->acu_name,
108: "call completed");
109: return (NOSTR);
110: } else
111: logent(value(HOST), phnum, acu->acu_name,
112: "call failed");
113: tried++;
114: }
115: fclose(fd);
116: }
117: if (!tried)
118: logent(value(HOST), "", acu->acu_name, "missing phone number");
119: else
120: (*acu->acu_abort)();
121: return (tried ? "call failed" : "missing phone number");
122: }
123:
124: disconnect()
125: {
126: if (!conflag)
127: return;
128: logent(value(HOST), "", acu->acu_name, "call terminated");
129: if (boolean(value(VERBOSE)))
130: printf("\r\ndisconnecting...");
131: (*acu->acu_disconnect)();
132: }
133:
134: static int
135: acuabort(s)
136: {
137: signal(s, SIG_IGN);
138: longjmp(jmpbuf, 1);
139: }
140:
141: static acu_t *
142: acutype(s)
143: register char *s;
144: {
145: register acu_t *p;
146: extern acu_t acutable[];
147:
148: for (p = acutable; p->acu_name != '\0'; p++)
149: if (!strcmp(s, p->acu_name))
150: return (p);
151: return (NOACU);
152: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.