main.c revision 57416
157416Smarkm/*
257416Smarkm * Copyright (c) 1988, 1990, 1993
357416Smarkm *	The Regents of the University of California.  All rights reserved.
457416Smarkm *
557416Smarkm * Redistribution and use in source and binary forms, with or without
657416Smarkm * modification, are permitted provided that the following conditions
757416Smarkm * are met:
857416Smarkm * 1. Redistributions of source code must retain the above copyright
957416Smarkm *    notice, this list of conditions and the following disclaimer.
1057416Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1157416Smarkm *    notice, this list of conditions and the following disclaimer in the
1257416Smarkm *    documentation and/or other materials provided with the distribution.
1357416Smarkm * 3. All advertising materials mentioning features or use of this software
1457416Smarkm *    must display the following acknowledgement:
1557416Smarkm *	This product includes software developed by the University of
1657416Smarkm *	California, Berkeley and its contributors.
1757416Smarkm * 4. Neither the name of the University nor the names of its contributors
1857416Smarkm *    may be used to endorse or promote products derived from this software
1957416Smarkm *    without specific prior written permission.
2057416Smarkm *
2157416Smarkm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2257416Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2357416Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2457416Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2557416Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2657416Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2757416Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2857416Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2957416Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3057416Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3157416Smarkm * SUCH DAMAGE.
3257416Smarkm */
3357416Smarkm
3457416Smarkmstatic char *copyright[] = {
3557416Smarkm    "@(#) Copyright (c) 1988, 1990, 1993\n"
3657416Smarkm    "\tThe Regents of the University of California.  All rights reserved.\n",
3757416Smarkm    (char*)copyright
3857416Smarkm};
3957416Smarkm
4057416Smarkm#include "telnet_locl.h"
4157416SmarkmRCSID("$Id: main.c,v 1.30 1999/11/13 06:30:11 assar Exp $");
4257416Smarkm
4357416Smarkm/* These values need to be the same as defined in libtelnet/kerberos5.c */
4457416Smarkm/* Either define them in both places, or put in some common header file. */
4557416Smarkm#define OPTS_FORWARD_CREDS	0x00000002
4657416Smarkm#define OPTS_FORWARDABLE_CREDS	0x00000001
4757416Smarkm
4857416Smarkm#if KRB5
4957416Smarkm#define FORWARD
5057416Smarkm#endif
5157416Smarkm
5257416Smarkm/*
5357416Smarkm * Initialize variables.
5457416Smarkm */
5557416Smarkmvoid
5657416Smarkmtninit(void)
5757416Smarkm{
5857416Smarkm    init_terminal();
5957416Smarkm
6057416Smarkm    init_network();
6157416Smarkm
6257416Smarkm    init_telnet();
6357416Smarkm
6457416Smarkm    init_sys();
6557416Smarkm}
6657416Smarkm
6757416Smarkmvoid
6857416Smarkmusage(void)
6957416Smarkm{
7057416Smarkm  fprintf(stderr, "Usage: %s %s%s%s%s\n", prompt,
7157416Smarkm#ifdef	AUTHENTICATION
7257416Smarkm	  "[-8] [-E] [-K] [-L] [-G] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]",
7357416Smarkm	  "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ",
7457416Smarkm#else
7557416Smarkm	  "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]",
7657416Smarkm	  "\n\t[-n tracefile]",
7757416Smarkm#endif
7857416Smarkm	  "[-r] ",
7957416Smarkm#ifdef	ENCRYPTION
8057416Smarkm	  "[-x] [host-name [port]]"
8157416Smarkm#else
8257416Smarkm	  "[host-name [port]]"
8357416Smarkm#endif
8457416Smarkm    );
8557416Smarkm  exit(1);
8657416Smarkm}
8757416Smarkm
8857416Smarkm/*
8957416Smarkm * main.  Parse arguments, invoke the protocol or command parser.
9057416Smarkm */
9157416Smarkm
9257416Smarkm
9357416Smarkm#ifdef	FORWARD
9457416Smarkmextern int forward_flags;
9557416Smarkmstatic int default_forward=0;
9657416Smarkm#endif	/* FORWARD */
9757416Smarkm
9857416Smarkm#ifdef KRB5
9957416Smarkm/* XXX ugly hack to setup dns-proxy stuff */
10057416Smarkm#define Authenticator asn1_Authenticator
10157416Smarkm#include <krb5.h>
10257416Smarkmstatic void
10357416Smarkmkrb5_init(void)
10457416Smarkm{
10557416Smarkm    krb5_context context;
10657416Smarkm    krb5_init_context(&context);
10757416Smarkm
10857416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
10957416Smarkm    if (krb5_config_get_bool (context, NULL,
11057416Smarkm         "libdefaults", "forward", NULL)) {
11157416Smarkm           forward_flags |= OPTS_FORWARD_CREDS;
11257416Smarkm           default_forward=1;
11357416Smarkm    }
11457416Smarkm    if (krb5_config_get_bool (context, NULL,
11557416Smarkm         "libdefaults", "forwardable", NULL)) {
11657416Smarkm           forward_flags |= OPTS_FORWARDABLE_CREDS;
11757416Smarkm           default_forward=1;
11857416Smarkm    }
11957416Smarkm#endif
12057416Smarkm#ifdef  ENCRYPTION
12157416Smarkm    if (krb5_config_get_bool (context, NULL,
12257416Smarkm        "libdefaults", "encrypt", NULL)) {
12357416Smarkm          encrypt_auto(1);
12457416Smarkm          decrypt_auto(1);
12557416Smarkm          EncryptVerbose(1);
12657416Smarkm        }
12757416Smarkm#endif
12857416Smarkm
12957416Smarkm    krb5_free_context(context);
13057416Smarkm}
13157416Smarkm#endif
13257416Smarkm
13357416Smarkmint
13457416Smarkmmain(int argc, char **argv)
13557416Smarkm{
13657416Smarkm	int ch;
13757416Smarkm	char *user;
13857416Smarkm
13957416Smarkm#ifdef KRB5
14057416Smarkm	krb5_init();
14157416Smarkm#endif
14257416Smarkm
14357416Smarkm	tninit();		/* Clear out things */
14457416Smarkm
14557416Smarkm	TerminalSaveState();
14657416Smarkm
14757416Smarkm	if ((prompt = strrchr(argv[0], '/')))
14857416Smarkm		++prompt;
14957416Smarkm	else
15057416Smarkm		prompt = argv[0];
15157416Smarkm
15257416Smarkm	user = NULL;
15357416Smarkm
15457416Smarkm	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
15557416Smarkm
15657416Smarkm	/*
15757416Smarkm	 * if AUTHENTICATION and ENCRYPTION is set autologin will be
15857416Smarkm	 * se to true after the getopt switch; unless the -K option is
15957416Smarkm	 * passed
16057416Smarkm	 */
16157416Smarkm	autologin = -1;
16257416Smarkm
16357416Smarkm	while((ch = getopt(argc, argv,
16457416Smarkm			   "78DEKLS:X:abcde:fFk:l:n:rxG")) != -1) {
16557416Smarkm		switch(ch) {
16657416Smarkm		case '8':
16757416Smarkm			eight = 3;	/* binary output and input */
16857416Smarkm			break;
16957416Smarkm		case '7':
17057416Smarkm			eight = 0;
17157416Smarkm			break;
17257416Smarkm		case 'b':
17357416Smarkm		    binary = 3;
17457416Smarkm		    break;
17557416Smarkm		case 'D': {
17657416Smarkm		    /* sometimes we don't want a mangled display */
17757416Smarkm		    char *p;
17857416Smarkm		    if((p = getenv("DISPLAY")))
17957416Smarkm			env_define("DISPLAY", (unsigned char*)p);
18057416Smarkm		    break;
18157416Smarkm		}
18257416Smarkm		case 'E':
18357416Smarkm			rlogin = escape = _POSIX_VDISABLE;
18457416Smarkm			break;
18557416Smarkm		case 'K':
18657416Smarkm#ifdef	AUTHENTICATION
18757416Smarkm			autologin = 0;
18857416Smarkm#endif
18957416Smarkm			break;
19057416Smarkm		case 'L':
19157416Smarkm			eight |= 2;	/* binary output only */
19257416Smarkm			break;
19357416Smarkm		case 'S':
19457416Smarkm		    {
19557416Smarkm#ifdef	HAVE_PARSETOS
19657416Smarkm			extern int tos;
19757416Smarkm
19857416Smarkm			if ((tos = parsetos(optarg, "tcp")) < 0)
19957416Smarkm				fprintf(stderr, "%s%s%s%s\n",
20057416Smarkm					prompt, ": Bad TOS argument '",
20157416Smarkm					optarg,
20257416Smarkm					"; will try to use default TOS");
20357416Smarkm#else
20457416Smarkm			fprintf(stderr,
20557416Smarkm			   "%s: Warning: -S ignored, no parsetos() support.\n",
20657416Smarkm								prompt);
20757416Smarkm#endif
20857416Smarkm		    }
20957416Smarkm			break;
21057416Smarkm		case 'X':
21157416Smarkm#ifdef	AUTHENTICATION
21257416Smarkm			auth_disable_name(optarg);
21357416Smarkm#endif
21457416Smarkm			break;
21557416Smarkm		case 'a':
21657416Smarkm			autologin = 1;
21757416Smarkm			break;
21857416Smarkm		case 'c':
21957416Smarkm			skiprc = 1;
22057416Smarkm			break;
22157416Smarkm		case 'd':
22257416Smarkm			debug = 1;
22357416Smarkm			break;
22457416Smarkm		case 'e':
22557416Smarkm			set_escape_char(optarg);
22657416Smarkm			break;
22757416Smarkm		case 'f':
22857416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
22957416Smarkm			if ((forward_flags & OPTS_FORWARD_CREDS) &&
23057416Smarkm			    !default_forward) {
23157416Smarkm			    fprintf(stderr,
23257416Smarkm				    "%s: Only one of -f and -F allowed.\n",
23357416Smarkm				    prompt);
23457416Smarkm			    usage();
23557416Smarkm			}
23657416Smarkm			forward_flags |= OPTS_FORWARD_CREDS;
23757416Smarkm#else
23857416Smarkm			fprintf(stderr,
23957416Smarkm			 "%s: Warning: -f ignored, no Kerberos V5 support.\n",
24057416Smarkm				prompt);
24157416Smarkm#endif
24257416Smarkm			break;
24357416Smarkm		case 'F':
24457416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
24557416Smarkm			if ((forward_flags & OPTS_FORWARD_CREDS) &&
24657416Smarkm			    !default_forward) {
24757416Smarkm			    fprintf(stderr,
24857416Smarkm				    "%s: Only one of -f and -F allowed.\n",
24957416Smarkm				    prompt);
25057416Smarkm			    usage();
25157416Smarkm			}
25257416Smarkm			forward_flags |= OPTS_FORWARD_CREDS;
25357416Smarkm			forward_flags |= OPTS_FORWARDABLE_CREDS;
25457416Smarkm#else
25557416Smarkm			fprintf(stderr,
25657416Smarkm			 "%s: Warning: -F ignored, no Kerberos V5 support.\n",
25757416Smarkm				prompt);
25857416Smarkm#endif
25957416Smarkm			break;
26057416Smarkm		case 'k':
26157416Smarkm#if defined(AUTHENTICATION) && defined(KRB4)
26257416Smarkm		    {
26357416Smarkm			extern char *dest_realm, dst_realm_buf[];
26457416Smarkm			extern int dst_realm_sz;
26557416Smarkm			dest_realm = dst_realm_buf;
26657416Smarkm			strlcpy(dest_realm, optarg, dst_realm_sz);
26757416Smarkm		    }
26857416Smarkm#else
26957416Smarkm			fprintf(stderr,
27057416Smarkm			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
27157416Smarkm								prompt);
27257416Smarkm#endif
27357416Smarkm			break;
27457416Smarkm		case 'l':
27557416Smarkm		  if(autologin == 0){
27657416Smarkm		    fprintf(stderr, "%s: Warning: -K ignored\n", prompt);
27757416Smarkm		    autologin = -1;
27857416Smarkm		  }
27957416Smarkm			user = optarg;
28057416Smarkm			break;
28157416Smarkm		case 'n':
28257416Smarkm				SetNetTrace(optarg);
28357416Smarkm			break;
28457416Smarkm		case 'r':
28557416Smarkm			rlogin = '~';
28657416Smarkm			break;
28757416Smarkm		case 'x':
28857416Smarkm#ifdef	ENCRYPTION
28957416Smarkm			encrypt_auto(1);
29057416Smarkm			decrypt_auto(1);
29157416Smarkm			EncryptVerbose(1);
29257416Smarkm#else
29357416Smarkm			fprintf(stderr,
29457416Smarkm			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
29557416Smarkm								prompt);
29657416Smarkm#endif
29757416Smarkm			break;
29857416Smarkm		case 'G':
29957416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
30057416Smarkm                        forward_flags ^= OPTS_FORWARD_CREDS;
30157416Smarkm                        forward_flags ^= OPTS_FORWARDABLE_CREDS;
30257416Smarkm#else
30357416Smarkm                        fprintf(stderr,
30457416Smarkm                         "%s: Warning: -G ignored, no Kerberos V5 support.\n",
30557416Smarkm                                prompt);
30657416Smarkm#endif
30757416Smarkm                        break;
30857416Smarkm
30957416Smarkm		case '?':
31057416Smarkm		default:
31157416Smarkm			usage();
31257416Smarkm			/* NOTREACHED */
31357416Smarkm		}
31457416Smarkm	}
31557416Smarkm
31657416Smarkm	if (autologin == -1) {		/* esc@magic.fi; force  */
31757416Smarkm#if defined(AUTHENTICATION)
31857416Smarkm		autologin = 1;
31957416Smarkm#endif
32057416Smarkm#if defined(ENCRYPTION)
32157416Smarkm		encrypt_auto(1);
32257416Smarkm		decrypt_auto(1);
32357416Smarkm#endif
32457416Smarkm	}
32557416Smarkm
32657416Smarkm	if (autologin == -1)
32757416Smarkm		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
32857416Smarkm
32957416Smarkm	argc -= optind;
33057416Smarkm	argv += optind;
33157416Smarkm
33257416Smarkm	if (argc) {
33357416Smarkm		char *args[7], **argp = args;
33457416Smarkm
33557416Smarkm		if (argc > 2)
33657416Smarkm			usage();
33757416Smarkm		*argp++ = prompt;
33857416Smarkm		if (user) {
33957416Smarkm			*argp++ = "-l";
34057416Smarkm			*argp++ = user;
34157416Smarkm		}
34257416Smarkm		*argp++ = argv[0];		/* host */
34357416Smarkm		if (argc > 1)
34457416Smarkm			*argp++ = argv[1];	/* port */
34557416Smarkm		*argp = 0;
34657416Smarkm
34757416Smarkm		if (setjmp(toplevel) != 0)
34857416Smarkm			Exit(0);
34957416Smarkm		if (tn(argp - args, args) == 1)
35057416Smarkm			return (0);
35157416Smarkm		else
35257416Smarkm			return (1);
35357416Smarkm	}
35457416Smarkm	setjmp(toplevel);
35557416Smarkm	for (;;) {
35657416Smarkm			command(1, 0, 0);
35757416Smarkm	}
35857416Smarkm}
359