xref: /dflybsd-src/usr.bin/tip/acu.c (revision 44e4a0619b988dddeb18754d7cd2705cf6f7950c)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * @(#)acu.c	8.1 (Berkeley) 6/6/93
34  * $FreeBSD: src/usr.bin/tip/tip/acu.c,v 1.5 1999/08/28 01:06:31 peter Exp $
35  */
36 
37 #include "tip.h"
38 
39 acu_t* unidialer_getmodem (const char *modem_name);
40 
41 static acu_t *acu = NULL;
42 static int conflag;
43 static void acuabort(int);
44 static acu_t *acutype(char *);
45 static jmp_buf jmpbuf;
46 /*
47  * Establish connection for tip
48  *
49  * If DU is true, we should dial an ACU whose type is AT.
50  * The phone numbers are in PN, and the call unit is in CU.
51  *
52  * If the PN is an '@', then we consult the PHONES file for
53  *   the phone numbers.  This file is /etc/phones, unless overriden
54  *   by an exported shell variable.
55  *
56  * The data base files must be in the format:
57  *	host-name[ \t]*phone-number
58  *   with the possibility of multiple phone numbers
59  *   for a single host acting as a rotary (in the order
60  *   found in the file).
61  */
62 char *
63 connect(void)
64 {
65 	char *cp = PN;
66 	char *phnum, string[256];
67 	FILE *fd;
68 	int tried = 0;
69 
70 	if (!DU) {		/* regular connect message */
71 		if (CM != NULL)
72 			xpwrite(FD, CM, size(CM));
73 		logent(value(HOST), "", DV, "call completed");
74 		return (NULL);
75 	}
76 	/*
77 	 * @ =>'s use data base in PHONES environment variable
78 	 *        otherwise, use /etc/phones
79 	 */
80 	signal(SIGINT, acuabort);
81 	signal(SIGQUIT, acuabort);
82 	if (setjmp(jmpbuf)) {
83 		signal(SIGINT, SIG_IGN);
84 		signal(SIGQUIT, SIG_IGN);
85 		printf("\ncall aborted\n");
86 		logent(value(HOST), "", "", "call aborted");
87 		if (acu != NULL) {
88 			boolean(value(VERBOSE)) = FALSE;
89 			if (conflag)
90 				disconnect(NULL);
91 			else
92 				(*acu->acu_abort)();
93 		}
94 		return ("interrupt");
95 	}
96 	if ((acu = acutype(AT)) == NULL)
97 		return ("unknown ACU type");
98 	if (*cp != '@') {
99 		while (*cp) {
100 			for (phnum = cp; *cp && *cp != ','; cp++)
101 				;
102 			if (*cp)
103 				*cp++ = '\0';
104 
105 			if ((conflag = (*acu->acu_dialer)(phnum, CU))) {
106 				if (CM != NULL)
107 					xpwrite(FD, CM, size(CM));
108 				logent(value(HOST), phnum, acu->acu_name,
109 					"call completed");
110 				return (NULL);
111 			} else
112 				logent(value(HOST), phnum, acu->acu_name,
113 					"call failed");
114 			tried++;
115 		}
116 	} else {
117 		if ((fd = fopen(PH, "r")) == NULL) {
118 			printf("%s: ", PH);
119 			return ("can't open phone number file");
120 		}
121 		while (fgets(string, sizeof(string), fd) != NULL) {
122 			for (cp = string; !any(*cp, " \t\n"); cp++)
123 				;
124 			if (*cp == '\n') {
125 				fclose(fd);
126 				return ("unrecognizable host name");
127 			}
128 			*cp++ = '\0';
129 			if (strcmp(string, value(HOST)))
130 				continue;
131 			while (any(*cp, " \t"))
132 				cp++;
133 			if (*cp == '\n') {
134 				fclose(fd);
135 				return ("missing phone number");
136 			}
137 			for (phnum = cp; *cp && *cp != ',' && *cp != '\n'; cp++)
138 				;
139 			if (*cp)
140 				*cp++ = '\0';
141 
142 			if ((conflag = (*acu->acu_dialer)(phnum, CU))) {
143 				fclose(fd);
144 				if (CM != NULL)
145 					xpwrite(FD, CM, size(CM));
146 				logent(value(HOST), phnum, acu->acu_name,
147 					"call completed");
148 				return (NULL);
149 			} else
150 				logent(value(HOST), phnum, acu->acu_name,
151 					"call failed");
152 			tried++;
153 		}
154 		fclose(fd);
155 	}
156 	if (!tried)
157 		logent(value(HOST), "", acu->acu_name, "missing phone number");
158 	else
159 		(*acu->acu_abort)();
160 	return (tried ? "call failed" : "missing phone number");
161 }
162 
163 void
164 disconnect(char *reason)
165 {
166 	if (!conflag) {
167 		logent(value(HOST), "", DV, "call terminated");
168 		return;
169 	}
170 	if (reason == NULL) {
171 		logent(value(HOST), "", acu->acu_name, "call terminated");
172 		if (boolean(value(VERBOSE)))
173 			printf("\r\ndisconnecting...");
174 	} else
175 		logent(value(HOST), "", acu->acu_name, reason);
176 	(*acu->acu_disconnect)();
177 }
178 
179 static void
180 acuabort(int s)
181 {
182 	signal(s, SIG_IGN);
183 	longjmp(jmpbuf, 1);
184 }
185 
186 static acu_t *
187 acutype(char *s)
188 {
189 	return unidialer_getmodem (s);
190 }
191