remote.c revision 549:9e644232f978
1314564Sdim/*
2303241Sdim * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3353358Sdim * Use is subject to license terms.
4353358Sdim */
5353358Sdim
6303241Sdim/*
7314564Sdim * Copyright (c) 1983 Regents of the University of California.
8303241Sdim * All rights reserved.  The Berkeley software License Agreement
9314564Sdim * specifies the terms and conditions for redistribution.
10314564Sdim */
11314564Sdim
12314564Sdim#pragma ident	"%Z%%M%	%I%	%E% SMI"
13314564Sdim
14303241Sdim#include "tip.h"
15303241Sdim
16303241Sdim/*
17303241Sdim * Attributes to be gleened from remote host description
18303241Sdim *   data base.
19303241Sdim */
20314564Sdimstatic char **caps[] = {
21314564Sdim	&AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI,
22314564Sdim	&ES, &EX, &FO, &RC, &RE, &PA
23314564Sdim};
24314564Sdim
25314564Sdimstatic char *capstrings[] = {
26314564Sdim	"at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr",
27314564Sdim	"di", "es", "ex", "fo", "rc", "re", "pa", 0
28314564Sdim};
29314564Sdim
30314564Sdimextern char *rgetstr(char *, char **);
31314564Sdim
32314564Sdimstatic void
33314564Sdimgetremcap(char *host)
34314564Sdim{
35314564Sdim	int stat;
36314564Sdim	char tbuf[BUFSIZ];
37314564Sdim	static char buf[BUFSIZ/2];
38314564Sdim	char *bp = buf;
39314564Sdim	char **p, ***q;
40314564Sdim
41314564Sdim	if ((stat = rgetent(tbuf, host, sizeof (tbuf))) <= 0) {
42314564Sdim		if (DV ||
43314564Sdim		    host[0] == '/' && access(DV = host, R_OK | W_OK) == 0) {
44314564Sdim			/*
45314564Sdim			 * If the user specifies a device on the commandline,
46314564Sdim			 * don't trust it.
47303241Sdim			 */
48303241Sdim			if (host[0] == '/')
49321369Sdim				trusted_device = 0;
50321369Sdim			CU = DV;
51321369Sdim			HO = host;
52321369Sdim			HW = 1;
53321369Sdim			DU = 0;
54321369Sdim			if (!BR)
55321369Sdim				BR = DEFBR;
56321369Sdim			FS = DEFFS;
57303241Sdim			RE = (char *)"tip.record";
58303241Sdim			EX = (char *)"\t\n\b\f";
59303241Sdim			DL = 0;
60303241Sdim			CL = 0;
61303241Sdim			ET = 10;
62303241Sdim			return;
63303241Sdim		}
64303241Sdim		(void) fprintf(stderr, stat == 0 ?
65303241Sdim		    "tip: unknown host %s\n" :
66303241Sdim		    "tip: can't open host description file\n", host);
67303241Sdim		exit(3);
68303241Sdim	}
69314564Sdim
70314564Sdim	for (p = capstrings, q = caps; *p != NULL; p++, q++)
71314564Sdim		if (**q == NULL)
72321369Sdim			**q = rgetstr(*p, &bp);
73303241Sdim	if (!BR && (BR = rgetnum("br")) < 0)
74303241Sdim		BR = DEFBR;
75321369Sdim	if ((FS = rgetnum("fs")) < 0)
76321369Sdim		FS = DEFFS;
77321369Sdim	if (DU < 0)
78303241Sdim		DU = 0;
79303241Sdim	else
80321369Sdim		DU = rgetflag("du");
81321369Sdim	if (DV == NOSTR) {
82321369Sdim		(void) fprintf(stderr, "%s: missing device spec\n", host);
83321369Sdim		exit(3);
84321369Sdim	}
85303241Sdim	if (DU && CU == NOSTR)
86303241Sdim		CU = DV;
87314564Sdim	if (DU && PN == NOSTR) {
88314564Sdim		(void) fprintf(stderr, "%s: missing phone number\n", host);
89314564Sdim		exit(3);
90314564Sdim	}
91314564Sdim	DB = rgetflag("db");
92314564Sdim
93314564Sdim	/*
94314564Sdim	 * This effectively eliminates the "hw" attribute
95303241Sdim	 *   from the description file
96303241Sdim	 */
97303241Sdim	if (!HW)
98314564Sdim		HW = (CU == NOSTR) || (DU && equal(DV, CU));
99314564Sdim	HO = host;
100314564Sdim	/*
101314564Sdim	 * see if uppercase mode should be turned on initially
102314564Sdim	 */
103314564Sdim	if (rgetflag("ra"))
104314564Sdim		boolean(value(RAISE)) = 1;
105314564Sdim	if (rgetflag("ec"))
106314564Sdim		boolean(value(ECHOCHECK)) = 1;
107303241Sdim	if (rgetflag("be"))
108303241Sdim		boolean(value(BEAUTIFY)) = 1;
109314564Sdim	if (rgetflag("nb"))
110314564Sdim		boolean(value(BEAUTIFY)) = 0;
111314564Sdim	if (rgetflag("sc"))
112314564Sdim		boolean(value(SCRIPT)) = 1;
113314564Sdim	if (rgetflag("tb"))
114303241Sdim		boolean(value(TABEXPAND)) = 1;
115314564Sdim	if (rgetflag("vb"))
116303241Sdim		boolean(value(VERBOSE)) = 1;
117314564Sdim	if (rgetflag("nv"))
118314564Sdim		boolean(value(VERBOSE)) = 0;
119303241Sdim	if (rgetflag("ta"))
120303241Sdim		boolean(value(TAND)) = 1;
121314564Sdim	if (rgetflag("nt"))
122314564Sdim		boolean(value(TAND)) = 0;
123303241Sdim	if (rgetflag("rw"))
124		boolean(value(RAWFTP)) = 1;
125	if (rgetflag("hd"))
126		boolean(value(HALFDUPLEX)) = 1;
127	if (rgetflag("hf"))
128		boolean(value(HARDWAREFLOW)) = 1;
129	if (RE == NULL)
130		RE = (char *)"tip.record";
131	if (EX == NULL)
132		EX = (char *)"\t\n\b\f";
133	if (ES != NOSTR)
134		(void) vstring("es", ES);
135	if (FO != NOSTR)
136		(void) vstring("fo", FO);
137	if (PR != NOSTR)
138		(void) vstring("pr", PR);
139	if (RC != NOSTR)
140		(void) vstring("rc", RC);
141	if ((DL = rgetnum("dl")) < 0)
142		DL = 0;
143	if ((CL = rgetnum("cl")) < 0)
144		CL = 0;
145	if ((ET = rgetnum("et")) < 0)
146		ET = 10;
147}
148
149char *
150getremote(char *host)
151{
152	char *cp;
153	static char *next;
154	static int lookedup = 0;
155
156	if (!lookedup) {
157		if (host == NOSTR && (host = getenv("HOST")) == NOSTR) {
158			(void) fprintf(stderr, "tip: no host specified\n");
159			exit(3);
160		}
161		getremcap(host);
162		next = DV;
163		lookedup++;
164	}
165	/*
166	 * We return a new device each time we're called (to allow
167	 *   a rotary action to be simulated)
168	 */
169	if (next == NOSTR)
170		return (NOSTR);
171	if ((cp = strchr(next, ',')) == NULL) {
172		DV = next;
173		next = NOSTR;
174	} else {
175		*cp++ = '\0';
176		DV = next;
177		next = cp;
178	}
179	return (DV);
180}
181