remote.c revision 331722
1/*	$OpenBSD: remote.c,v 1.16 2006/06/06 23:24:52 deraadt Exp $	*/
2/*	$NetBSD: remote.c,v 1.5 1997/04/20 00:02:45 mellon Exp $	*/
3
4/*
5 * Copyright (c) 1992, 1993
6 *	The Regents of the University of California.  All rights reserved.
7 *
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. 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
34#include <sys/cdefs.h>
35__FBSDID("$FreeBSD: stable/11/usr.bin/tip/tip/remote.c 331722 2018-03-29 02:50:57Z eadler $");
36
37#ifndef lint
38static const char copyright[] =
39"@(#) Copyright (c) 1992, 1993\n\
40	The Regents of the University of California.  All rights reserved.\n";
41#endif /* not lint */
42
43#ifndef lint
44#if 0
45static char sccsid[] = "@(#)remote.c	8.1 (Berkeley) 6/6/93";
46static const char rcsid[] = "$OpenBSD: remote.c,v 1.16 2006/06/06 23:24:52 deraadt Exp $";
47#endif
48#endif /* not lint */
49
50#include <stdio.h>
51#include <stdlib.h>
52
53#include "pathnames.h"
54#include "tip.h"
55
56/*
57 * Attributes to be gleened from remote host description
58 *   data base.
59 */
60static char **caps[] = {
61	&AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI,
62	&ES, &EX, &FO, &RC, &RE, &PA
63};
64
65static char *capstrings[] = {
66	"at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr",
67	"di", "es", "ex", "fo", "rc", "re", "pa", 0
68};
69
70static char	*db_array[3] = { _PATH_REMOTE, 0, 0 };
71
72#define cgetflag(f)	(cgetcap(bp, f, ':') != NULL)
73
74static void	getremcap(char *);
75
76static void
77getremcap(char *host)
78{
79	char **p, ***q, *bp, *rempath;
80	int   stat;
81
82	rempath = getenv("REMOTE");
83	if (rempath != NULL) {
84		if (*rempath != '/')
85			/* we have an entry */
86			cgetset(rempath);
87		else {	/* we have a path */
88			db_array[1] = rempath;
89			db_array[2] = _PATH_REMOTE;
90		}
91	}
92
93	if ((stat = cgetent(&bp, db_array, host)) < 0) {
94		if ((DV != NULL) ||
95		    (host[0] == '/' && access(DV = host, R_OK | W_OK) == 0)) {
96			CU = DV;
97			HO = host;
98			HW = 1;
99			DU = 0;
100			if (!BR)
101				BR = DEFBR;
102			FS = DEFFS;
103			return;
104		}
105		switch (stat) {
106		case -1:
107			fprintf(stderr, "%s: unknown host %s\n", __progname,
108			    host);
109			break;
110		case -2:
111			fprintf(stderr,
112			    "%s: can't open host description file\n",
113			    __progname);
114			break;
115		case -3:
116			fprintf(stderr,
117			    "%s: possible reference loop in host description file\n", __progname);
118			break;
119		}
120		exit(3);
121	}
122
123	for (p = capstrings, q = caps; *p != NULL; p++, q++)
124		if (**q == NULL)
125			cgetstr(bp, *p, *q);
126	if (!BR && (cgetnum(bp, "br", &BR) == -1))
127		BR = DEFBR;
128	if (!LD && (cgetnum(bp, "ld", &LD) == -1))
129		LD = TTYDISC;
130	if (cgetnum(bp, "fs", &FS) == -1)
131		FS = DEFFS;
132	if (DU < 0)
133		DU = 0;
134	else
135		DU = cgetflag("du");
136	if (DV == NOSTR) {
137		fprintf(stderr, "%s: missing device spec\n", host);
138		exit(3);
139	}
140	if (DU && CU == NOSTR)
141		CU = DV;
142	if (DU && PN == NOSTR) {
143		fprintf(stderr, "%s: missing phone number\n", host);
144		exit(3);
145	}
146	if (DU && AT == NOSTR) {
147		fprintf(stderr, "%s: missing acu type\n", host);
148		exit(3);
149	}
150
151	HD = cgetflag("hd");
152
153	/*
154	 * This effectively eliminates the "hw" attribute
155	 *   from the description file
156	 */
157	if (!HW)
158		HW = (CU == NOSTR) || (DU && equal(DV, CU));
159	HO = host;
160	/*
161	 * see if uppercase mode should be turned on initially
162	 */
163	if (cgetflag("ra"))
164		setboolean(value(RAISE), 1);
165	if (cgetflag("ec"))
166		setboolean(value(ECHOCHECK), 1);
167	if (cgetflag("be"))
168		setboolean(value(BEAUTIFY), 1);
169	if (cgetflag("nb"))
170		setboolean(value(BEAUTIFY), 0);
171	if (cgetflag("sc"))
172		setboolean(value(SCRIPT), 1);
173	if (cgetflag("tb"))
174		setboolean(value(TABEXPAND), 1);
175	if (cgetflag("vb"))
176		setboolean(value(VERBOSE), 1);
177	if (cgetflag("nv"))
178		setboolean(value(VERBOSE), 0);
179	if (cgetflag("ta"))
180		setboolean(value(TAND), 1);
181	if (cgetflag("nt"))
182		setboolean(value(TAND), 0);
183	if (cgetflag("rw"))
184		setboolean(value(RAWFTP), 1);
185	if (cgetflag("hd"))
186		setboolean(value(HALFDUPLEX), 1);
187	if (cgetflag("dc"))
188		setboolean(value(DC), 1);
189	if (cgetflag("hf"))
190		setboolean(value(HARDWAREFLOW), 1);
191	if (RE == NOSTR)
192		RE = (char *)"tip.record";
193	if (EX == NOSTR)
194		EX = (char *)"\t\n\b\f";
195	if (ES != NOSTR)
196		vstring("es", ES);
197	if (FO != NOSTR)
198		vstring("fo", FO);
199	if (PR != NOSTR)
200		vstring("pr", PR);
201	if (RC != NOSTR)
202		vstring("rc", RC);
203	if (cgetnum(bp, "dl", &DL) == -1)
204		DL = 0;
205	if (cgetnum(bp, "cl", &CL) == -1)
206		CL = 0;
207	if (cgetnum(bp, "et", &ET) == -1)
208		ET = 10;
209}
210
211char *
212getremote(char *host)
213{
214	char *cp;
215	static char *next;
216	static int lookedup = 0;
217
218	if (!lookedup) {
219		if (host == NOSTR && (host = getenv("HOST")) == NOSTR) {
220			fprintf(stderr, "%s: no host specified\n", __progname);
221			exit(3);
222		}
223		getremcap(host);
224		next = DV;
225		lookedup++;
226	}
227	/*
228	 * We return a new device each time we're called (to allow
229	 *   a rotary action to be simulated)
230	 */
231	if (next == NOSTR)
232		return (NOSTR);
233	if ((cp = strchr(next, ',')) == NULL) {
234		DV = next;
235		next = NOSTR;
236	} else {
237		*cp++ = '\0';
238		DV = next;
239		next = cp;
240	}
241	return (DV);
242}
243