main.c revision 47973
118334Speter/*
290075Sobrien * Copyright (c) 1988, 1990, 1993
390075Sobrien *	The Regents of the University of California.  All rights reserved.
418334Speter *
590075Sobrien * Redistribution and use in source and binary forms, with or without
618334Speter * modification, are permitted provided that the following conditions
790075Sobrien * are met:
890075Sobrien * 1. Redistributions of source code must retain the above copyright
990075Sobrien *    notice, this list of conditions and the following disclaimer.
1090075Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1118334Speter *    notice, this list of conditions and the following disclaimer in the
1290075Sobrien *    documentation and/or other materials provided with the distribution.
1390075Sobrien * 3. All advertising materials mentioning features or use of this software
1490075Sobrien *    must display the following acknowledgement:
1590075Sobrien *	This product includes software developed by the University of
1618334Speter *	California, Berkeley and its contributors.
1718334Speter * 4. Neither the name of the University nor the names of its contributors
1890075Sobrien *    may be used to endorse or promote products derived from this software
1990075Sobrien *    without specific prior written permission.
2090075Sobrien *
2118334Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2218334Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2318334Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2418334Speter * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2518334Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2618334Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2718334Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2818334Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2918334Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3050397Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3190075Sobrien * SUCH DAMAGE.
3218334Speter */
3390075Sobrien
3490075Sobrien#ifndef lint
3518334Speterstatic const char copyright[] =
3690075Sobrien"@(#) Copyright (c) 1988, 1990, 1993\n\
3718334Speter	The Regents of the University of California.  All rights reserved.\n";
3890075Sobrien#endif /* not lint */
3918334Speter
4018334Speter#ifndef lint
4150397Sobrienstatic const char sccsid[] = "@(#)main.c	8.3 (Berkeley) 5/30/95";
4290075Sobrien#endif /* not lint */
4390075Sobrien
4450397Sobrien#include <sys/types.h>
4590075Sobrien#include <stdlib.h>
4690075Sobrien
4790075Sobrien#include "ring.h"
4890075Sobrien#include "externs.h"
4996263Sobrien#include "defines.h"
5050397Sobrien
5118334Speter#if	defined(AUTHENTICATION)
5218334Speter#include <libtelnet/auth.h>
5318334Speter#endif
5418334Speter#if	defined(ENCRYPTION)
5518334Speter#include <libtelnet/encrypt.h>
5618334Speter#endif
5796263Sobrien
5818334Speter/* These values need to be the same as defined in libtelnet/kerberos5.c */
5918334Speter/* Either define them in both places, or put in some common header file. */
6018334Speter#define OPTS_FORWARD_CREDS	0x00000002
6118334Speter#define OPTS_FORWARDABLE_CREDS	0x00000001
6218334Speter
6318334Speter#if 0
6418334Speter#define FORWARD
6518334Speter#endif
6690075Sobrien
6718334Spetervoid init_terminal(void);
6818334Spetervoid init_network(void);
6918334Spetervoid init_telnet(void);
7018334Spetervoid init_sys(void);
7118334Spetervoid init_3270(void);
7218334Speter
7318334Speter/*
7418334Speter * Initialize variables.
7518334Speter */
7618334Speter    void
7718334Spetertninit()
7818334Speter{
7918334Speter    init_terminal();
8018334Speter
8118334Speter    init_network();
8218334Speter
8318334Speter    init_telnet();
8418334Speter
8518334Speter    init_sys();
8618334Speter
8718334Speter#if defined(TN3270)
8818334Speter    init_3270();
8918334Speter#endif
9018334Speter}
9118334Speter
9218334Speter	void
9318334Speterusage()
9418334Speter{
9518334Speter	fprintf(stderr, "Usage: %s %s%s%s%s\n",
9618334Speter	    prompt,
9718334Speter#ifdef	AUTHENTICATION
9818334Speter	    "[-8] [-E] [-K] [-L] [-N] [-S tos] [-X atype] [-a] [-c] [-d]",
9918334Speter	    "\n\t[-e char] [-k realm] [-l user] [-f/-F] [-n tracefile] ",
10018334Speter#else
10118334Speter	    "[-8] [-E] [-L] [-N] [-S tos] [-a] [-c] [-d] [-e char] [-l user]",
10290075Sobrien	    "\n\t[-n tracefile] ",
10318334Speter#endif
10418334Speter#if defined(TN3270) && defined(unix)
10590075Sobrien# ifdef AUTHENTICATION
10690075Sobrien	    "[-noasynch] [-noasynctty]\n\t"
10790075Sobrien	    "[-noasyncnet] [-r] [-s src_addr] [-t transcom] ",
10890075Sobrien# else
10990075Sobrien	    "[-noasynch] [-noasynctty] [-noasyncnet] [-r]\n\t"
11090075Sobrien	    "[-s src_addr] [-t transcom]",
11190075Sobrien# endif
11290075Sobrien#else
11318334Speter	    "[-r] [-s src_addr] ",
11418334Speter#endif
11518334Speter#ifdef	ENCRYPTION
11618334Speter	    "[-x] [host-name [port]]"
11718334Speter#else	/* ENCRYPTION */
11818334Speter	    "[host-name [port]]"
11918334Speter#endif	/* ENCRYPTION */
12018334Speter	);
12118334Speter	exit(1);
12218334Speter}
12318334Speter
12418334Speter/*
12518334Speter * main.  Parse arguments, invoke the protocol or command parser.
12618334Speter */
12718334Speter
12818334Speter	int
12918334Spetermain(argc, argv)
13018334Speter	int argc;
13118334Speter	char *argv[];
13218334Speter{
13318334Speter	extern char *optarg;
13418334Speter	extern int optind;
13518334Speter	int ch;
13618334Speter	char *user, *strrchr();
13718334Speter	char *src_addr = NULL;
13896263Sobrien#ifdef	FORWARD
13996263Sobrien	extern int forward_flags;
14096263Sobrien#endif	/* FORWARD */
14196263Sobrien
14296263Sobrien	tninit();		/* Clear out things */
14318334Speter#if	defined(CRAY) && !defined(__STDC__)
14418334Speter	_setlist_init();	/* Work around compiler bug */
14518334Speter#endif
14618334Speter
14718334Speter	TerminalSaveState();
14818334Speter
14918334Speter	if ((prompt = strrchr(argv[0], '/')))
15018334Speter		++prompt;
15118334Speter	else
15218334Speter		prompt = argv[0];
15318334Speter
15418334Speter	user = NULL;
15518334Speter
15618334Speter	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
15718334Speter	autologin = -1;
15818334Speter
15918334Speter	while ((ch = getopt(argc, argv, "8EKLNS:X:acde:fFk:l:n:rs:t:x")) != EOF) {
16018334Speter		switch(ch) {
16118334Speter		case '8':
16218334Speter			eight = 3;	/* binary output and input */
16318334Speter			break;
16418334Speter		case 'E':
16518334Speter			rlogin = escape = _POSIX_VDISABLE;
16618334Speter			break;
16718334Speter		case 'K':
16818334Speter#ifdef	AUTHENTICATION
16918334Speter			autologin = 0;
17018334Speter#endif
17118334Speter			break;
17218334Speter		case 'L':
17318334Speter			eight |= 2;	/* binary output only */
17418334Speter			break;
17518334Speter		case 'N':
17618334Speter			doaddrlookup = 0;
17718334Speter			break;
17818334Speter		case 'S':
17918334Speter		    {
18018334Speter#ifdef	HAS_GETTOS
18118334Speter			extern int tos;
18218334Speter
18318334Speter			if ((tos = parsetos(optarg, "tcp")) < 0)
18418334Speter				fprintf(stderr, "%s%s%s%s\n",
18518334Speter					prompt, ": Bad TOS argument '",
18618334Speter					optarg,
18718334Speter					"; will try to use default TOS");
18818334Speter#else
18918334Speter			fprintf(stderr,
19018334Speter			   "%s: Warning: -S ignored, no parsetos() support.\n",
19118334Speter								prompt);
19218334Speter#endif
19318334Speter		    }
19418334Speter			break;
19518334Speter		case 'X':
19618334Speter#ifdef	AUTHENTICATION
19718334Speter			auth_disable_name(optarg);
19818334Speter#endif
19918334Speter			break;
20018334Speter		case 'a':
20118334Speter			autologin = 1;
20218334Speter			break;
20318334Speter		case 'c':
20418334Speter			skiprc = 1;
20518334Speter			break;
20618334Speter		case 'd':
20718334Speter			debug = 1;
20818334Speter			break;
20918334Speter		case 'e':
21018334Speter			set_escape_char(optarg);
21118334Speter			break;
21218334Speter		case 'f':
21318334Speter#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
21418334Speter			if (forward_flags & OPTS_FORWARD_CREDS) {
21518334Speter			    fprintf(stderr,
21618334Speter				    "%s: Only one of -f and -F allowed.\n",
21718334Speter				    prompt);
21818334Speter			    usage();
21990075Sobrien			}
22018334Speter			forward_flags |= OPTS_FORWARD_CREDS;
22118334Speter#else
22218334Speter			fprintf(stderr,
22318334Speter			 "%s: Warning: -f ignored, no Kerberos V5 support.\n",
22418334Speter				prompt);
22518334Speter#endif
22618334Speter			break;
22718334Speter		case 'F':
22818334Speter#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
22918334Speter			if (forward_flags & OPTS_FORWARD_CREDS) {
23090075Sobrien			    fprintf(stderr,
23118334Speter				    "%s: Only one of -f and -F allowed.\n",
23218334Speter				    prompt);
23318334Speter			    usage();
23418334Speter			}
23518334Speter			forward_flags |= OPTS_FORWARD_CREDS;
23618334Speter			forward_flags |= OPTS_FORWARDABLE_CREDS;
23718334Speter#else
23818334Speter			fprintf(stderr,
23918334Speter			 "%s: Warning: -F ignored, no Kerberos V5 support.\n",
24018334Speter				prompt);
24118334Speter#endif
24218334Speter			break;
24318334Speter		case 'k':
24418334Speter#if defined(AUTHENTICATION) && defined(KRB4)
24518334Speter		    {
24618334Speter			extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
24718334Speter			dest_realm = dst_realm_buf;
24818334Speter			(void)strncpy(dest_realm, optarg, dst_realm_sz);
24918334Speter		    }
25018334Speter#else
25118334Speter			fprintf(stderr,
25218334Speter			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
25318334Speter								prompt);
25418334Speter#endif
25518334Speter			break;
25618334Speter		case 'l':
25718334Speter			autologin = 1;
25818334Speter			user = optarg;
25990075Sobrien			break;
26018334Speter		case 'n':
26118334Speter#if defined(TN3270) && defined(unix)
26218334Speter			/* distinguish between "-n oasynch" and "-noasynch" */
26318334Speter			if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
26418334Speter			    == 'n' && argv[optind - 1][2] == 'o') {
26518334Speter				if (!strcmp(optarg, "oasynch")) {
26618334Speter					noasynchtty = 1;
26718334Speter					noasynchnet = 1;
26818334Speter				} else if (!strcmp(optarg, "oasynchtty"))
26918334Speter					noasynchtty = 1;
27018334Speter				else if (!strcmp(optarg, "oasynchnet"))
27118334Speter					noasynchnet = 1;
27218334Speter			} else
27318334Speter#endif	/* defined(TN3270) && defined(unix) */
27490075Sobrien				SetNetTrace(optarg);
27590075Sobrien			break;
27690075Sobrien		case 'r':
27790075Sobrien			rlogin = '~';
27890075Sobrien			break;
27990075Sobrien		case 's':
28090075Sobrien			src_addr = optarg;
28190075Sobrien			break;
28290075Sobrien		case 't':
28390075Sobrien#if defined(TN3270) && defined(unix)
28490075Sobrien			transcom = tline;
28596263Sobrien			(void)strcpy(transcom, optarg);
28690075Sobrien#else
28790075Sobrien			fprintf(stderr,
28890075Sobrien			   "%s: Warning: -t ignored, no TN3270 support.\n",
28990075Sobrien								prompt);
29090075Sobrien#endif
29118334Speter			break;
29218334Speter		case 'x':
29318334Speter#ifdef	ENCRYPTION
29418334Speter			encrypt_auto(1);
29590075Sobrien			decrypt_auto(1);
29618334Speter#else	/* ENCRYPTION */
29718334Speter			fprintf(stderr,
29818334Speter			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
29918334Speter								prompt);
30018334Speter#endif	/* ENCRYPTION */
30118334Speter			break;
30218334Speter		case '?':
30390075Sobrien		default:
30418334Speter			usage();
30590075Sobrien			/* NOTREACHED */
30618334Speter		}
30790075Sobrien	}
30818334Speter	if (autologin == -1)
30990075Sobrien		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
31018334Speter
31190075Sobrien	argc -= optind;
31218334Speter	argv += optind;
31390075Sobrien
31418334Speter	if (argc) {
31550397Sobrien		char *args[9], **argp = args;
31650397Sobrien
31750397Sobrien		if (argc > 2)
31850397Sobrien			usage();
31990075Sobrien		*argp++ = prompt;
32090075Sobrien		if (user) {
32190075Sobrien			*argp++ = "-l";
32290075Sobrien			*argp++ = user;
32390075Sobrien		}
32418334Speter		if (src_addr) {
32550397Sobrien			*argp++ = "-s";
32618334Speter			*argp++ = src_addr;
32718334Speter		}
32896263Sobrien		*argp++ = argv[0];		/* host */
32918334Speter		if (argc > 1)
33018334Speter			*argp++ = argv[1];	/* port */
33118334Speter		*argp = 0;
33218334Speter
33390075Sobrien		if (setjmp(toplevel) != 0)
33418334Speter			Exit(0);
33550397Sobrien		if (tn(argp - args, args) == 1)
33618334Speter			return (0);
33750397Sobrien		else
33850397Sobrien			return (1);
33950397Sobrien	}
34050397Sobrien	(void)setjmp(toplevel);
34150397Sobrien	for (;;) {
34290075Sobrien#ifdef TN3270
34350397Sobrien		if (shell_active)
34490075Sobrien			shell_continue();
34550397Sobrien		else
34618334Speter#endif
34718334Speter			command(1, 0, 0);
34818334Speter	}
34918334Speter	return 0;
35052284Sobrien}
35118334Speter