1 /*
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 *
6 * %sccs.include.redist.c%
7 */
8
9 #ifndef lint
10 static char copyright[] =
11 "@(#) Copyright (c) 1992, 1993\n\
12 The Regents of the University of California. All rights reserved.\n";
13 #endif /* not lint */
14
15 #ifndef lint
16 static char sccsid[] = "@(#)remote.c 8.1 (Berkeley) 06/06/93";
17 #endif /* not lint */
18
19 #include <stdio.h>
20 #include <stdlib.h>
21
22 #include "pathnames.h"
23 #include "tip.h"
24
25 /*
26 * Attributes to be gleened from remote host description
27 * data base.
28 */
29 static char **caps[] = {
30 &AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI,
31 &ES, &EX, &FO, &RC, &RE, &PA
32 };
33
34 static char *capstrings[] = {
35 "at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr",
36 "di", "es", "ex", "fo", "rc", "re", "pa", 0
37 };
38
39 static char *db_array[3] = { _PATH_REMOTE, 0, 0 };
40
41 #define cgetflag(f) (cgetcap(bp, f, ':') != NULL)
42
43 static
getremcap(host)44 getremcap(host)
45 register char *host;
46 {
47 register char **p, ***q;
48 char *bp;
49 char *rempath;
50 int stat;
51
52 rempath = getenv("REMOTE");
53 if (rempath != NULL)
54 if (*rempath != '/')
55 /* we have an entry */
56 cgetset(rempath);
57 else { /* we have a path */
58 db_array[1] = rempath;
59 db_array[2] = _PATH_REMOTE;
60 }
61
62 if ((stat = cgetent(&bp, db_array, host)) < 0) {
63 if (DV ||
64 host[0] == '/' && access(DV = host, R_OK | W_OK) == 0) {
65 CU = DV;
66 HO = host;
67 HW = 1;
68 DU = 0;
69 if (!BR)
70 BR = DEFBR;
71 FS = DEFFS;
72 return;
73 }
74 switch(stat) {
75 case -1:
76 fprintf(stderr, "tip: unknown host %s\n", host);
77 break;
78 case -2:
79 fprintf(stderr,
80 "tip: can't open host description file\n");
81 break;
82 case -3:
83 fprintf(stderr,
84 "tip: possible reference loop in host description file\n");
85 break;
86 }
87 exit(3);
88 }
89
90 for (p = capstrings, q = caps; *p != NULL; p++, q++)
91 if (**q == NULL)
92 cgetstr(bp, *p, *q);
93 if (!BR && (cgetnum(bp, "br", &BR) == -1))
94 BR = DEFBR;
95 if (cgetnum(bp, "fs", &FS) == -1)
96 FS = DEFFS;
97 if (DU < 0)
98 DU = 0;
99 else
100 DU = cgetflag("du");
101 if (DV == NOSTR) {
102 fprintf(stderr, "%s: missing device spec\n", host);
103 exit(3);
104 }
105 if (DU && CU == NOSTR)
106 CU = DV;
107 if (DU && PN == NOSTR) {
108 fprintf(stderr, "%s: missing phone number\n", host);
109 exit(3);
110 }
111
112 HD = cgetflag("hd");
113
114 /*
115 * This effectively eliminates the "hw" attribute
116 * from the description file
117 */
118 if (!HW)
119 HW = (CU == NOSTR) || (DU && equal(DV, CU));
120 HO = host;
121 /*
122 * see if uppercase mode should be turned on initially
123 */
124 if (cgetflag("ra"))
125 boolean(value(RAISE)) = 1;
126 if (cgetflag("ec"))
127 boolean(value(ECHOCHECK)) = 1;
128 if (cgetflag("be"))
129 boolean(value(BEAUTIFY)) = 1;
130 if (cgetflag("nb"))
131 boolean(value(BEAUTIFY)) = 0;
132 if (cgetflag("sc"))
133 boolean(value(SCRIPT)) = 1;
134 if (cgetflag("tb"))
135 boolean(value(TABEXPAND)) = 1;
136 if (cgetflag("vb"))
137 boolean(value(VERBOSE)) = 1;
138 if (cgetflag("nv"))
139 boolean(value(VERBOSE)) = 0;
140 if (cgetflag("ta"))
141 boolean(value(TAND)) = 1;
142 if (cgetflag("nt"))
143 boolean(value(TAND)) = 0;
144 if (cgetflag("rw"))
145 boolean(value(RAWFTP)) = 1;
146 if (cgetflag("hd"))
147 boolean(value(HALFDUPLEX)) = 1;
148 if (RE == NOSTR)
149 RE = (char *)"tip.record";
150 if (EX == NOSTR)
151 EX = (char *)"\t\n\b\f";
152 if (ES != NOSTR)
153 vstring("es", ES);
154 if (FO != NOSTR)
155 vstring("fo", FO);
156 if (PR != NOSTR)
157 vstring("pr", PR);
158 if (RC != NOSTR)
159 vstring("rc", RC);
160 if (cgetnum(bp, "dl", &DL) == -1)
161 DL = 0;
162 if (cgetnum(bp, "cl", &CL) == -1)
163 CL = 0;
164 if (cgetnum(bp, "et", &ET) == -1)
165 ET = 10;
166 }
167
168 char *
getremote(host)169 getremote(host)
170 char *host;
171 {
172 register char *cp;
173 static char *next;
174 static int lookedup = 0;
175
176 if (!lookedup) {
177 if (host == NOSTR && (host = getenv("HOST")) == NOSTR) {
178 fprintf(stderr, "tip: no host specified\n");
179 exit(3);
180 }
181 getremcap(host);
182 next = DV;
183 lookedup++;
184 }
185 /*
186 * We return a new device each time we're called (to allow
187 * a rotary action to be simulated)
188 */
189 if (next == NOSTR)
190 return (NOSTR);
191 if ((cp = index(next, ',')) == NULL) {
192 DV = next;
193 next = NOSTR;
194 } else {
195 *cp++ = '\0';
196 DV = next;
197 next = cp;
198 }
199 return (DV);
200 }
201