xref: /illumos-gate/usr/src/cmd/tip/remote.c (revision 8d489c7a815fcac696803219572e95aa01532b0f)
1 /*
2  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*
7  * Copyright (c) 1983 Regents of the University of California.
8  * All rights reserved.  The Berkeley software License Agreement
9  * specifies the terms and conditions for redistribution.
10  */
11 
12 #pragma ident	"%Z%%M%	%I%	%E% SMI"
13 
14 #include "tip.h"
15 
16 /*
17  * Attributes to be gleened from remote host description
18  *   data base.
19  */
20 static char **caps[] = {
21 	&AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI,
22 	&ES, &EX, &FO, &RC, &RE, &PA
23 };
24 
25 static char *capstrings[] = {
26 	"at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr",
27 	"di", "es", "ex", "fo", "rc", "re", "pa", 0
28 };
29 
30 extern char *rgetstr(char *, char **);
31 
32 static void
33 getremcap(char *host)
34 {
35 	int stat;
36 	char tbuf[BUFSIZ];
37 	static char buf[BUFSIZ/2];
38 	char *bp = buf;
39 	char **p, ***q;
40 
41 	if ((stat = rgetent(tbuf, host, sizeof (tbuf))) <= 0) {
42 		if (DV ||
43 		    host[0] == '/' && access(DV = host, R_OK | W_OK) == 0) {
44 			/*
45 			 * If the user specifies a device on the commandline,
46 			 * don't trust it.
47 			 */
48 			if (host[0] == '/')
49 				trusted_device = 0;
50 			CU = DV;
51 			HO = host;
52 			HW = 1;
53 			DU = 0;
54 			if (!BR)
55 				BR = DEFBR;
56 			FS = DEFFS;
57 			RE = (char *)"tip.record";
58 			EX = (char *)"\t\n\b\f";
59 			DL = 0;
60 			CL = 0;
61 			ET = 10;
62 			return;
63 		}
64 		(void) fprintf(stderr, stat == 0 ?
65 		    "tip: unknown host %s\n" :
66 		    "tip: can't open host description file\n", host);
67 		exit(3);
68 	}
69 
70 	for (p = capstrings, q = caps; *p != NULL; p++, q++)
71 		if (**q == NULL)
72 			**q = rgetstr(*p, &bp);
73 	if (!BR && (BR = rgetnum("br")) < 0)
74 		BR = DEFBR;
75 	if ((FS = rgetnum("fs")) < 0)
76 		FS = DEFFS;
77 	if (DU < 0)
78 		DU = 0;
79 	else
80 		DU = rgetflag("du");
81 	if (DV == NOSTR) {
82 		(void) fprintf(stderr, "%s: missing device spec\n", host);
83 		exit(3);
84 	}
85 	if (DU && CU == NOSTR)
86 		CU = DV;
87 	if (DU && PN == NOSTR) {
88 		(void) fprintf(stderr, "%s: missing phone number\n", host);
89 		exit(3);
90 	}
91 	DB = rgetflag("db");
92 
93 	/*
94 	 * This effectively eliminates the "hw" attribute
95 	 *   from the description file
96 	 */
97 	if (!HW)
98 		HW = (CU == NOSTR) || (DU && equal(DV, CU));
99 	HO = host;
100 	/*
101 	 * see if uppercase mode should be turned on initially
102 	 */
103 	if (rgetflag("ra"))
104 		boolean(value(RAISE)) = 1;
105 	if (rgetflag("ec"))
106 		boolean(value(ECHOCHECK)) = 1;
107 	if (rgetflag("be"))
108 		boolean(value(BEAUTIFY)) = 1;
109 	if (rgetflag("nb"))
110 		boolean(value(BEAUTIFY)) = 0;
111 	if (rgetflag("sc"))
112 		boolean(value(SCRIPT)) = 1;
113 	if (rgetflag("tb"))
114 		boolean(value(TABEXPAND)) = 1;
115 	if (rgetflag("vb"))
116 		boolean(value(VERBOSE)) = 1;
117 	if (rgetflag("nv"))
118 		boolean(value(VERBOSE)) = 0;
119 	if (rgetflag("ta"))
120 		boolean(value(TAND)) = 1;
121 	if (rgetflag("nt"))
122 		boolean(value(TAND)) = 0;
123 	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 
149 char *
150 getremote(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