xref: /illumos-gate/usr/src/cmd/tip/remote.c (revision b8ccc4133d4adaea81b30537c9a156ae726b2146)
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 #include "tip.h"
13 
14 char *DV;	/* UNIX device(s) to open */
15 char *EL;	/* chars marking an EOL */
16 char *CM;	/* initial connection message */
17 char *IE;	/* EOT to expect on input */
18 char *OE;	/* EOT to send to complete FT */
19 char *CU;	/* call unit if making a phone call */
20 char *AT;	/* acu type */
21 char *PN;	/* phone number(s) */
22 char *DI;	/* disconnect string */
23 char *PA;	/* parity to be generated */
24 
25 char *PH;	/* phone number file */
26 char *RM;	/* remote file name */
27 char *HO;	/* host name */
28 
29 int BR;		/* line speed for conversation */
30 int FS;		/* frame size for transfers */
31 char DU;	/* this host is dialed up */
32 char HW;	/* this device is hardwired, see hunt.c */
33 char *ES;	/* escape character */
34 char *EX;	/* exceptions */
35 char *FO;	/* force (literal next) char */
36 char *RC;	/* raise character */
37 char *RE;	/* script record file */
38 char *PR;	/* remote prompt */
39 int DL;		/* line delay for file transfers to remote */
40 int CL;		/* char delay for file transfers to remote */
41 int ET;		/* echocheck timeout */
42 int DB;		/* dialback - ignore hangup */
43 
44 /*
45  * Attributes to be gleened from remote host description
46  *   data base.
47  */
48 static char **caps[] = {
49 	&AT, &DV, &CM, &CU, &EL, &IE, &OE, &PN, &PR, &DI,
50 	&ES, &EX, &FO, &RC, &RE, &PA
51 };
52 
53 static char *capstrings[] = {
54 	"at", "dv", "cm", "cu", "el", "ie", "oe", "pn", "pr",
55 	"di", "es", "ex", "fo", "rc", "re", "pa", 0
56 };
57 
58 extern char *rgetstr(char *, char **);
59 
60 static void
61 getremcap(char *host)
62 {
63 	int stat;
64 	char tbuf[BUFSIZ];
65 	static char buf[BUFSIZ/2];
66 	char *bp = buf;
67 	char **p, ***q;
68 
69 	if ((stat = rgetent(tbuf, host, sizeof (tbuf))) <= 0) {
70 		if (DV ||
71 		    host[0] == '/' && access(DV = host, R_OK | W_OK) == 0) {
72 			/*
73 			 * If the user specifies a device on the commandline,
74 			 * don't trust it.
75 			 */
76 			if (host[0] == '/')
77 				trusted_device = 0;
78 			CU = DV;
79 			HO = host;
80 			HW = 1;
81 			DU = 0;
82 			if (!BR)
83 				BR = DEFBR;
84 			FS = DEFFS;
85 			RE = (char *)"tip.record";
86 			EX = (char *)"\t\n\b\f";
87 			DL = 0;
88 			CL = 0;
89 			ET = 10;
90 			return;
91 		}
92 		(void) fprintf(stderr, stat == 0 ?
93 		    "tip: unknown host %s\n" :
94 		    "tip: can't open host description file\n", host);
95 		exit(3);
96 	}
97 
98 	for (p = capstrings, q = caps; *p != NULL; p++, q++)
99 		if (**q == NULL)
100 			**q = rgetstr(*p, &bp);
101 	if (!BR && (BR = rgetnum("br")) < 0)
102 		BR = DEFBR;
103 	if ((FS = rgetnum("fs")) < 0)
104 		FS = DEFFS;
105 	if (DU < 0)
106 		DU = 0;
107 	else
108 		DU = rgetflag("du");
109 	if (DV == NOSTR) {
110 		(void) fprintf(stderr, "%s: missing device spec\n", host);
111 		exit(3);
112 	}
113 	if (DU && CU == NOSTR)
114 		CU = DV;
115 	if (DU && PN == NOSTR) {
116 		(void) fprintf(stderr, "%s: missing phone number\n", host);
117 		exit(3);
118 	}
119 	DB = rgetflag("db");
120 
121 	/*
122 	 * This effectively eliminates the "hw" attribute
123 	 *   from the description file
124 	 */
125 	if (!HW)
126 		HW = (CU == NOSTR) || (DU && equal(DV, CU));
127 	HO = host;
128 	/*
129 	 * see if uppercase mode should be turned on initially
130 	 */
131 	if (rgetflag("ra"))
132 		boolean(value(RAISE)) = 1;
133 	if (rgetflag("ec"))
134 		boolean(value(ECHOCHECK)) = 1;
135 	if (rgetflag("be"))
136 		boolean(value(BEAUTIFY)) = 1;
137 	if (rgetflag("nb"))
138 		boolean(value(BEAUTIFY)) = 0;
139 	if (rgetflag("sc"))
140 		boolean(value(SCRIPT)) = 1;
141 	if (rgetflag("tb"))
142 		boolean(value(TABEXPAND)) = 1;
143 	if (rgetflag("vb"))
144 		boolean(value(VERBOSE)) = 1;
145 	if (rgetflag("nv"))
146 		boolean(value(VERBOSE)) = 0;
147 	if (rgetflag("ta"))
148 		boolean(value(TAND)) = 1;
149 	if (rgetflag("nt"))
150 		boolean(value(TAND)) = 0;
151 	if (rgetflag("rw"))
152 		boolean(value(RAWFTP)) = 1;
153 	if (rgetflag("hd"))
154 		boolean(value(HALFDUPLEX)) = 1;
155 	if (rgetflag("hf"))
156 		boolean(value(HARDWAREFLOW)) = 1;
157 	if (RE == NULL)
158 		RE = (char *)"tip.record";
159 	if (EX == NULL)
160 		EX = (char *)"\t\n\b\f";
161 	if (ES != NOSTR)
162 		(void) vstring("es", ES);
163 	if (FO != NOSTR)
164 		(void) vstring("fo", FO);
165 	if (PR != NOSTR)
166 		(void) vstring("pr", PR);
167 	if (RC != NOSTR)
168 		(void) vstring("rc", RC);
169 	if ((DL = rgetnum("dl")) < 0)
170 		DL = 0;
171 	if ((CL = rgetnum("cl")) < 0)
172 		CL = 0;
173 	if ((ET = rgetnum("et")) < 0)
174 		ET = 10;
175 }
176 
177 char *
178 getremote(char *host)
179 {
180 	char *cp;
181 	static char *next;
182 	static int lookedup = 0;
183 
184 	if (!lookedup) {
185 		if (host == NOSTR && (host = getenv("HOST")) == NOSTR) {
186 			(void) fprintf(stderr, "tip: no host specified\n");
187 			exit(3);
188 		}
189 		getremcap(host);
190 		next = DV;
191 		lookedup++;
192 	}
193 	/*
194 	 * We return a new device each time we're called (to allow
195 	 *   a rotary action to be simulated)
196 	 */
197 	if (next == NOSTR)
198 		return (NOSTR);
199 	if ((cp = strchr(next, ',')) == NULL) {
200 		DV = next;
201 		next = NOSTR;
202 	} else {
203 		*cp++ = '\0';
204 		DV = next;
205 		next = cp;
206 	}
207 	return (DV);
208 }
209