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