xref: /freebsd/crypto/heimdal/appl/telnet/telnet/main.c (revision 5521ff5a4d1929056e7ffc982fac3341ca54df7c)
1 /*
2  * Copyright (c) 1988, 1990, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. 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 static char *copyright[] = {
35     "@(#) Copyright (c) 1988, 1990, 1993\n"
36     "\tThe Regents of the University of California.  All rights reserved.\n",
37     (char*)copyright
38 };
39 
40 #include "telnet_locl.h"
41 RCSID("$Id: main.c,v 1.31 2000/12/31 07:40:17 assar Exp $");
42 
43 /* These values need to be the same as defined in libtelnet/kerberos5.c */
44 /* Either define them in both places, or put in some common header file. */
45 #define OPTS_FORWARD_CREDS	0x00000002
46 #define OPTS_FORWARDABLE_CREDS	0x00000001
47 
48 #if KRB5
49 #define FORWARD
50 #endif
51 
52 /*
53  * Initialize variables.
54  */
55 void
56 tninit(void)
57 {
58     init_terminal();
59 
60     init_network();
61 
62     init_telnet();
63 
64     init_sys();
65 }
66 
67 void
68 usage(void)
69 {
70   fprintf(stderr, "Usage: %s %s%s%s%s\n", prompt,
71 #ifdef	AUTHENTICATION
72 	  "[-8] [-E] [-K] [-L] [-G] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]",
73 	  "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ",
74 #else
75 	  "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]",
76 	  "\n\t[-n tracefile]",
77 #endif
78 	  "[-r] ",
79 #ifdef	ENCRYPTION
80 	  "[-x] [host-name [port]]"
81 #else
82 	  "[host-name [port]]"
83 #endif
84     );
85   exit(1);
86 }
87 
88 /*
89  * main.  Parse arguments, invoke the protocol or command parser.
90  */
91 
92 
93 #ifdef	FORWARD
94 extern int forward_flags;
95 static int default_forward=0;
96 #endif	/* FORWARD */
97 
98 #ifdef KRB5
99 /* XXX ugly hack to setup dns-proxy stuff */
100 #define Authenticator asn1_Authenticator
101 #include <krb5.h>
102 static void
103 krb5_init(void)
104 {
105     krb5_context context;
106     krb5_error_code ret;
107 
108     ret = krb5_init_context(&context);
109     if (ret)
110 	return;
111 
112 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
113     if (krb5_config_get_bool (context, NULL,
114          "libdefaults", "forward", NULL)) {
115            forward_flags |= OPTS_FORWARD_CREDS;
116            default_forward=1;
117     }
118     if (krb5_config_get_bool (context, NULL,
119          "libdefaults", "forwardable", NULL)) {
120            forward_flags |= OPTS_FORWARDABLE_CREDS;
121            default_forward=1;
122     }
123 #endif
124 #ifdef  ENCRYPTION
125     if (krb5_config_get_bool (context, NULL,
126         "libdefaults", "encrypt", NULL)) {
127           encrypt_auto(1);
128           decrypt_auto(1);
129           EncryptVerbose(1);
130         }
131 #endif
132 
133     krb5_free_context(context);
134 }
135 #endif
136 
137 int
138 main(int argc, char **argv)
139 {
140 	int ch;
141 	char *user;
142 
143 #ifdef KRB5
144 	krb5_init();
145 #endif
146 
147 	tninit();		/* Clear out things */
148 
149 	TerminalSaveState();
150 
151 	if ((prompt = strrchr(argv[0], '/')))
152 		++prompt;
153 	else
154 		prompt = argv[0];
155 
156 	user = NULL;
157 
158 	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
159 
160 	/*
161 	 * if AUTHENTICATION and ENCRYPTION is set autologin will be
162 	 * se to true after the getopt switch; unless the -K option is
163 	 * passed
164 	 */
165 	autologin = -1;
166 
167 	while((ch = getopt(argc, argv,
168 			   "78DEKLS:X:abcde:fFk:l:n:rxG")) != -1) {
169 		switch(ch) {
170 		case '8':
171 			eight = 3;	/* binary output and input */
172 			break;
173 		case '7':
174 			eight = 0;
175 			break;
176 		case 'b':
177 		    binary = 3;
178 		    break;
179 		case 'D': {
180 		    /* sometimes we don't want a mangled display */
181 		    char *p;
182 		    if((p = getenv("DISPLAY")))
183 			env_define("DISPLAY", (unsigned char*)p);
184 		    break;
185 		}
186 		case 'E':
187 			rlogin = escape = _POSIX_VDISABLE;
188 			break;
189 		case 'K':
190 #ifdef	AUTHENTICATION
191 			autologin = 0;
192 #endif
193 			break;
194 		case 'L':
195 			eight |= 2;	/* binary output only */
196 			break;
197 		case 'S':
198 		    {
199 #ifdef	HAVE_PARSETOS
200 			extern int tos;
201 
202 			if ((tos = parsetos(optarg, "tcp")) < 0)
203 				fprintf(stderr, "%s%s%s%s\n",
204 					prompt, ": Bad TOS argument '",
205 					optarg,
206 					"; will try to use default TOS");
207 #else
208 			fprintf(stderr,
209 			   "%s: Warning: -S ignored, no parsetos() support.\n",
210 								prompt);
211 #endif
212 		    }
213 			break;
214 		case 'X':
215 #ifdef	AUTHENTICATION
216 			auth_disable_name(optarg);
217 #endif
218 			break;
219 		case 'a':
220 			autologin = 1;
221 			break;
222 		case 'c':
223 			skiprc = 1;
224 			break;
225 		case 'd':
226 			debug = 1;
227 			break;
228 		case 'e':
229 			set_escape_char(optarg);
230 			break;
231 		case 'f':
232 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
233 			if ((forward_flags & OPTS_FORWARD_CREDS) &&
234 			    !default_forward) {
235 			    fprintf(stderr,
236 				    "%s: Only one of -f and -F allowed.\n",
237 				    prompt);
238 			    usage();
239 			}
240 			forward_flags |= OPTS_FORWARD_CREDS;
241 #else
242 			fprintf(stderr,
243 			 "%s: Warning: -f ignored, no Kerberos V5 support.\n",
244 				prompt);
245 #endif
246 			break;
247 		case 'F':
248 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
249 			if ((forward_flags & OPTS_FORWARD_CREDS) &&
250 			    !default_forward) {
251 			    fprintf(stderr,
252 				    "%s: Only one of -f and -F allowed.\n",
253 				    prompt);
254 			    usage();
255 			}
256 			forward_flags |= OPTS_FORWARD_CREDS;
257 			forward_flags |= OPTS_FORWARDABLE_CREDS;
258 #else
259 			fprintf(stderr,
260 			 "%s: Warning: -F ignored, no Kerberos V5 support.\n",
261 				prompt);
262 #endif
263 			break;
264 		case 'k':
265 #if defined(AUTHENTICATION) && defined(KRB4)
266 		    {
267 			extern char *dest_realm, dst_realm_buf[];
268 			extern int dst_realm_sz;
269 			dest_realm = dst_realm_buf;
270 			strlcpy(dest_realm, optarg, dst_realm_sz);
271 		    }
272 #else
273 			fprintf(stderr,
274 			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
275 								prompt);
276 #endif
277 			break;
278 		case 'l':
279 		  if(autologin == 0){
280 		    fprintf(stderr, "%s: Warning: -K ignored\n", prompt);
281 		    autologin = -1;
282 		  }
283 			user = optarg;
284 			break;
285 		case 'n':
286 				SetNetTrace(optarg);
287 			break;
288 		case 'r':
289 			rlogin = '~';
290 			break;
291 		case 'x':
292 #ifdef	ENCRYPTION
293 			encrypt_auto(1);
294 			decrypt_auto(1);
295 			EncryptVerbose(1);
296 #else
297 			fprintf(stderr,
298 			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
299 								prompt);
300 #endif
301 			break;
302 		case 'G':
303 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
304                         forward_flags ^= OPTS_FORWARD_CREDS;
305                         forward_flags ^= OPTS_FORWARDABLE_CREDS;
306 #else
307                         fprintf(stderr,
308                          "%s: Warning: -G ignored, no Kerberos V5 support.\n",
309                                 prompt);
310 #endif
311                         break;
312 
313 		case '?':
314 		default:
315 			usage();
316 			/* NOTREACHED */
317 		}
318 	}
319 
320 	if (autologin == -1) {		/* esc@magic.fi; force  */
321 #if defined(AUTHENTICATION)
322 		autologin = 1;
323 #endif
324 #if defined(ENCRYPTION)
325 		encrypt_auto(1);
326 		decrypt_auto(1);
327 #endif
328 	}
329 
330 	if (autologin == -1)
331 		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
332 
333 	argc -= optind;
334 	argv += optind;
335 
336 	if (argc) {
337 		char *args[7], **argp = args;
338 
339 		if (argc > 2)
340 			usage();
341 		*argp++ = prompt;
342 		if (user) {
343 			*argp++ = "-l";
344 			*argp++ = user;
345 		}
346 		*argp++ = argv[0];		/* host */
347 		if (argc > 1)
348 			*argp++ = argv[1];	/* port */
349 		*argp = 0;
350 
351 		if (setjmp(toplevel) != 0)
352 			Exit(0);
353 		if (tn(argp - args, args) == 1)
354 			return (0);
355 		else
356 			return (1);
357 	}
358 	setjmp(toplevel);
359 	for (;;) {
360 			command(1, 0, 0);
361 	}
362 }
363