Phone numbers in the phones file end in ',' or '\n'.
[unix-history] / usr / src / usr.bin / tip / acu.c
CommitLineData
d0aeaf5a
DF
1/*
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
05862919 7#ifndef lint
5c8b4e1e 8static char sccsid[] = "@(#)acu.c 5.3 (Berkeley) %G%";
d0aeaf5a 9#endif not lint
05862919 10
f6a65350 11#include "tip.h"
f6a65350
BJ
12
13static acu_t *acu = NOACU;
14static int conflag;
15static int acuabort();
16static acu_t *acutype();
17static jmp_buf jmpbuf;
18/*
19 * Establish connection for tip
20 *
21 * If DU is true, we should dial an ACU whose type is AT.
22 * The phone numbers are in PN, and the call unit is in CU.
23 *
24 * If the PN is an '@', then we consult the PHONES file for
25 * the phone numbers. This file is /etc/phones, unless overriden
26 * by an exported shell variable.
27 *
28 * The data base files must be in the format:
29 * host-name[ \t]*phone-number
30 * with the possibility of multiple phone numbers
31 * for a single host acting as a rotary (in the order
32 * found in the file).
33 */
34char *
35connect()
36{
37 register char *cp = PN;
38 char *phnum, string[256];
39 FILE *fd;
40 int tried = 0;
41
42 if (!DU) { /* regular connect message */
43 if (CM != NOSTR)
8a0ce7f1 44 pwrite(FD, CM, size(CM));
3f48242d 45 return (NOSTR);
f6a65350
BJ
46 }
47 /*
48 * @ =>'s use data base in PHONES environment variable
49 * otherwise, use /etc/phones
50 */
51 signal(SIGINT, acuabort);
52 signal(SIGQUIT, acuabort);
53 if (setjmp(jmpbuf)) {
54 signal(SIGINT, SIG_IGN);
55 signal(SIGQUIT, SIG_IGN);
56 printf("\ncall aborted\n");
57 logent(value(HOST), "", "", "call aborted");
58 if (acu != NOACU) {
59 boolean(value(VERBOSE)) = FALSE;
60 if (conflag)
e2326c44 61 disconnect(NOSTR);
f6a65350
BJ
62 else
63 (*acu->acu_abort)();
64 }
65 delock(uucplock);
66 exit(1);
67 }
68 if ((acu = acutype(AT)) == NOACU)
3f48242d 69 return ("unknown ACU type");
f6a65350
BJ
70 if (*cp != '@') {
71 while (*cp) {
8a0ce7f1 72 for (phnum = cp; *cp && *cp != ','; cp++)
f6a65350 73 ;
51f98017
BS
74 if (*cp)
75 *cp++ = '\0';
f6a65350
BJ
76
77 if (conflag = (*acu->acu_dialer)(phnum, CU)) {
78 logent(value(HOST), phnum, acu->acu_name,
79 "call completed");
3f48242d 80 return (NOSTR);
f6a65350
BJ
81 } else
82 logent(value(HOST), phnum, acu->acu_name,
03bdc5a9 83 "call failed");
f6a65350
BJ
84 tried++;
85 }
86 } else {
87 if ((fd = fopen(PH, "r")) == NOFILE) {
88 printf("%s: ", PH);
3f48242d 89 return ("can't open phone number file");
f6a65350
BJ
90 }
91 while (fgets(string, sizeof(string), fd) != NOSTR) {
92 for (cp = string; !any(*cp, " \t\n"); cp++)
93 ;
94 if (*cp == '\n') {
95 fclose(fd);
3f48242d 96 return ("unrecognizable host name");
f6a65350
BJ
97 }
98 *cp++ = '\0';
99 if (strcmp(string, value(HOST)))
100 continue;
101 while (any(*cp, " \t"))
102 cp++;
103 if (*cp == '\n') {
104 fclose(fd);
3f48242d 105 return ("missing phone number");
f6a65350 106 }
5c8b4e1e 107 for (phnum = cp; *cp && *cp != ',' && *cp != '\n'; cp++)
f6a65350 108 ;
5c8b4e1e
DS
109 if (*cp)
110 *cp++ = '\0';
f6a65350 111
bc6f2b39 112 if (conflag = (*acu->acu_dialer)(phnum, CU)) {
f6a65350
BJ
113 fclose(fd);
114 logent(value(HOST), phnum, acu->acu_name,
115 "call completed");
3f48242d 116 return (NOSTR);
f6a65350
BJ
117 } else
118 logent(value(HOST), phnum, acu->acu_name,
03bdc5a9 119 "call failed");
f6a65350
BJ
120 tried++;
121 }
122 fclose(fd);
123 }
124 if (!tried)
125 logent(value(HOST), "", acu->acu_name, "missing phone number");
92ee31b0
RC
126 else
127 (*acu->acu_abort)();
03bdc5a9 128 return (tried ? "call failed" : "missing phone number");
f6a65350
BJ
129}
130
e2326c44
SL
131disconnect(reason)
132 char *reason;
f6a65350
BJ
133{
134 if (!conflag)
135 return;
631a2290 136 if (reason == NOSTR) {
e2326c44
SL
137 logent(value(HOST), "", acu->acu_name, "call terminated");
138 if (boolean(value(VERBOSE)))
139 printf("\r\ndisconnecting...");
140 } else
141 logent(value(HOST), "", acu->acu_name, reason);
f6a65350
BJ
142 (*acu->acu_disconnect)();
143}
144
145static int
146acuabort(s)
147{
148 signal(s, SIG_IGN);
3a779b68 149 longjmp(jmpbuf, 1);
f6a65350
BJ
150}
151
152static acu_t *
153acutype(s)
d8feebc2 154 register char *s;
f6a65350
BJ
155{
156 register acu_t *p;
157 extern acu_t acutable[];
158
159 for (p = acutable; p->acu_name != '\0'; p++)
160 if (!strcmp(s, p->acu_name))
3f48242d
SL
161 return (p);
162 return (NOACU);
f6a65350 163}