xref: /csrg-svn/usr.bin/telnet/main.c (revision 69785)
133685Sbostic /*
262311Sbostic  * Copyright (c) 1988, 1990, 1993
362311Sbostic  *	The Regents of the University of California.  All rights reserved.
433685Sbostic  *
542770Sbostic  * %sccs.include.redist.c%
633685Sbostic  */
733685Sbostic 
833685Sbostic #ifndef lint
962311Sbostic static char copyright[] =
1062311Sbostic "@(#) Copyright (c) 1988, 1990, 1993\n\
1162311Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1233685Sbostic #endif /* not lint */
1333685Sbostic 
1433685Sbostic #ifndef lint
15*69785Sdab static char sccsid[] = "@(#)main.c	8.3 (Berkeley) 05/30/95";
1633685Sbostic #endif /* not lint */
1733685Sbostic 
1832381Sminshall #include <sys/types.h>
1932381Sminshall 
2032381Sminshall #include "ring.h"
2132145Sminshall #include "externs.h"
2232145Sminshall #include "defines.h"
2332145Sminshall 
2465157Sdab /* These values need to be the same as defined in libtelnet/kerberos5.c */
2565157Sdab /* Either define them in both places, or put in some common header file. */
26*69785Sdab #define OPTS_FORWARD_CREDS	0x00000002
27*69785Sdab #define OPTS_FORWARDABLE_CREDS	0x00000001
2865157Sdab 
2965157Sdab #if 0
3065157Sdab #define FORWARD
3165157Sdab #endif
3265157Sdab 
3332145Sminshall /*
3432145Sminshall  * Initialize variables.
3532145Sminshall  */
3646808Sdab     void
tninit()3732145Sminshall tninit()
3832145Sminshall {
3945233Sborman     init_terminal();
4045233Sborman 
4145233Sborman     init_network();
42*69785Sdab 
4345233Sborman     init_telnet();
4445233Sborman 
4545233Sborman     init_sys();
4645233Sborman 
4745233Sborman #if defined(TN3270)
4845233Sborman     init_3270();
4945233Sborman #endif
5032145Sminshall }
5132145Sminshall 
5246808Sdab 	void
usage()5346808Sdab usage()
5446808Sdab {
5546808Sdab 	fprintf(stderr, "Usage: %s %s%s%s%s\n",
5646808Sdab 	    prompt,
5757213Sdab #ifdef	AUTHENTICATION
5860149Sdab 	    "[-8] [-E] [-K] [-L] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]",
5965157Sdab 	    "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ",
6046808Sdab #else
6160149Sdab 	    "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]",
6260149Sdab 	    "\n\t[-n tracefile]",
6346808Sdab #endif
6446808Sdab #if defined(TN3270) && defined(unix)
6557213Sdab # ifdef AUTHENTICATION
6660149Sdab 	    "[-noasynch] [-noasynctty]\n\t[-noasyncnet] [-r] [-t transcom] ",
6746808Sdab # else
6860149Sdab 	    "[-noasynch] [-noasynctty] [-noasyncnet] [-r]\n\t[-t transcom]",
6946808Sdab # endif
7046808Sdab #else
7146808Sdab 	    "[-r] ",
7246808Sdab #endif
7357213Sdab #ifdef	ENCRYPTION
7446808Sdab 	    "[-x] [host-name [port]]"
7560149Sdab #else	/* ENCRYPTION */
7646808Sdab 	    "[host-name [port]]"
7760149Sdab #endif	/* ENCRYPTION */
7846808Sdab 	);
7946808Sdab 	exit(1);
8046808Sdab }
8132145Sminshall 
8232145Sminshall /*
8332145Sminshall  * main.  Parse arguments, invoke the protocol or command parser.
8432145Sminshall  */
8545233Sborman 
8645233Sborman 
main(argc,argv)8732145Sminshall main(argc, argv)
8832145Sminshall 	int argc;
8932145Sminshall 	char *argv[];
9032145Sminshall {
9145008Skarels 	extern char *optarg;
9245008Skarels 	extern int optind;
9345008Skarels 	int ch;
9445233Sborman 	char *user, *strrchr();
9565157Sdab #ifdef	FORWARD
9665157Sdab 	extern int forward_flags;
9765157Sdab #endif	/* FORWARD */
9844361Sborman 
9945008Skarels 	tninit();		/* Clear out things */
10045233Sborman #if	defined(CRAY) && !defined(__STDC__)
10145008Skarels 	_setlist_init();	/* Work around compiler bug */
10238689Sborman #endif
10345233Sborman 
10445008Skarels 	TerminalSaveState();
10532145Sminshall 
10645233Sborman 	if (prompt = strrchr(argv[0], '/'))
10745008Skarels 		++prompt;
10845008Skarels 	else
10945008Skarels 		prompt = argv[0];
11032145Sminshall 
11145008Skarels 	user = NULL;
11246808Sdab 
11346808Sdab 	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
11446808Sdab 	autologin = -1;
11546808Sdab 
11665157Sdab 	while ((ch = getopt(argc, argv, "8EKLS:X:acde:fFk:l:n:rt:x")) != EOF) {
11745008Skarels 		switch(ch) {
11846808Sdab 		case '8':
11946808Sdab 			eight = 3;	/* binary output and input */
12046808Sdab 			break;
12146808Sdab 		case 'E':
12246808Sdab 			rlogin = escape = _POSIX_VDISABLE;
12346808Sdab 			break;
12446808Sdab 		case 'K':
12557213Sdab #ifdef	AUTHENTICATION
12646808Sdab 			autologin = 0;
12746808Sdab #endif
12846808Sdab 			break;
12946808Sdab 		case 'L':
13046808Sdab 			eight |= 2;	/* binary output only */
13146808Sdab 			break;
13246815Sdab 		case 'S':
13346815Sdab 		    {
13446815Sdab #ifdef	HAS_GETTOS
13546815Sdab 			extern int tos;
13646815Sdab 
13746815Sdab 			if ((tos = parsetos(optarg, "tcp")) < 0)
13846815Sdab 				fprintf(stderr, "%s%s%s%s\n",
13946815Sdab 					prompt, ": Bad TOS argument '",
14046815Sdab 					optarg,
14146815Sdab 					"; will try to use default TOS");
14246815Sdab #else
14346815Sdab 			fprintf(stderr,
14446815Sdab 			   "%s: Warning: -S ignored, no parsetos() support.\n",
14546815Sdab 								prompt);
14646815Sdab #endif
14746815Sdab 		    }
14846815Sdab 			break;
14946808Sdab 		case 'X':
15057213Sdab #ifdef	AUTHENTICATION
15146808Sdab 			auth_disable_name(optarg);
15246808Sdab #endif
15346808Sdab 			break;
15445008Skarels 		case 'a':
15545008Skarels 			autologin = 1;
15645008Skarels 			break;
15747608Sdab 		case 'c':
15847608Sdab 			skiprc = 1;
15947608Sdab 			break;
16045008Skarels 		case 'd':
16145008Skarels 			debug = 1;
16245008Skarels 			break;
16345008Skarels 		case 'e':
16445008Skarels 			set_escape_char(optarg);
16545008Skarels 			break;
16665157Sdab 		case 'f':
16765157Sdab #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
16865157Sdab 			if (forward_flags & OPTS_FORWARD_CREDS) {
169*69785Sdab 			    fprintf(stderr,
17065157Sdab 				    "%s: Only one of -f and -F allowed.\n",
17165157Sdab 				    prompt);
17265157Sdab 			    usage();
17365157Sdab 			}
17465157Sdab 			forward_flags |= OPTS_FORWARD_CREDS;
17565157Sdab #else
17665157Sdab 			fprintf(stderr,
177*69785Sdab 			 "%s: Warning: -f ignored, no Kerberos V5 support.\n",
17865157Sdab 				prompt);
17965157Sdab #endif
18065157Sdab 			break;
18165157Sdab 		case 'F':
18265157Sdab #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
18365157Sdab 			if (forward_flags & OPTS_FORWARD_CREDS) {
184*69785Sdab 			    fprintf(stderr,
18565157Sdab 				    "%s: Only one of -f and -F allowed.\n",
18665157Sdab 				    prompt);
18765157Sdab 			    usage();
18865157Sdab 			}
18965157Sdab 			forward_flags |= OPTS_FORWARD_CREDS;
19065157Sdab 			forward_flags |= OPTS_FORWARDABLE_CREDS;
19165157Sdab #else
19265157Sdab 			fprintf(stderr,
193*69785Sdab 			 "%s: Warning: -F ignored, no Kerberos V5 support.\n",
19465157Sdab 				prompt);
19565157Sdab #endif
19665157Sdab 			break;
19746808Sdab 		case 'k':
19857213Sdab #if defined(AUTHENTICATION) && defined(KRB4)
19946808Sdab 		    {
20046808Sdab 			extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
20146808Sdab 			dest_realm = dst_realm_buf;
20246808Sdab 			(void)strncpy(dest_realm, optarg, dst_realm_sz);
20346808Sdab 		    }
20446808Sdab #else
20546808Sdab 			fprintf(stderr,
20646808Sdab 			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
20746808Sdab 								prompt);
20846808Sdab #endif
20946808Sdab 			break;
21045008Skarels 		case 'l':
21145008Skarels 			autologin = 1;
21245008Skarels 			user = optarg;
21345008Skarels 			break;
21445008Skarels 		case 'n':
21545008Skarels #if defined(TN3270) && defined(unix)
21645008Skarels 			/* distinguish between "-n oasynch" and "-noasynch" */
21745008Skarels 			if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
21845008Skarels 			    == 'n' && argv[optind - 1][2] == 'o') {
21945008Skarels 				if (!strcmp(optarg, "oasynch")) {
22045008Skarels 					noasynchtty = 1;
22145008Skarels 					noasynchnet = 1;
22245008Skarels 				} else if (!strcmp(optarg, "oasynchtty"))
22345008Skarels 					noasynchtty = 1;
22445233Sborman 				else if (!strcmp(optarg, "oasynchnet"))
22545008Skarels 					noasynchnet = 1;
22645008Skarels 			} else
22745008Skarels #endif	/* defined(TN3270) && defined(unix) */
22845008Skarels 				SetNetTrace(optarg);
22945008Skarels 			break;
23046808Sdab 		case 'r':
23146808Sdab 			rlogin = '~';
23246808Sdab 			break;
23346808Sdab 		case 't':
23445008Skarels #if defined(TN3270) && defined(unix)
23545008Skarels 			transcom = tline;
23645008Skarels 			(void)strcpy(transcom, optarg);
23746808Sdab #else
23846808Sdab 			fprintf(stderr,
23946808Sdab 			   "%s: Warning: -t ignored, no TN3270 support.\n",
24046808Sdab 								prompt);
24146808Sdab #endif
24245008Skarels 			break;
24346808Sdab 		case 'x':
24457213Sdab #ifdef	ENCRYPTION
24547608Sdab 			encrypt_auto(1);
24647608Sdab 			decrypt_auto(1);
24760149Sdab #else	/* ENCRYPTION */
24846808Sdab 			fprintf(stderr,
24946808Sdab 			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
25046808Sdab 								prompt);
25160149Sdab #endif	/* ENCRYPTION */
25246808Sdab 			break;
25345008Skarels 		case '?':
25445008Skarels 		default:
25545008Skarels 			usage();
25645008Skarels 			/* NOTREACHED */
25732145Sminshall 		}
25845233Sborman 	}
25946808Sdab 	if (autologin == -1)
26046808Sdab 		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
26146808Sdab 
26245008Skarels 	argc -= optind;
26345008Skarels 	argv += optind;
26445008Skarels 
26545008Skarels 	if (argc) {
26645008Skarels 		char *args[7], **argp = args;
26745008Skarels 
26845008Skarels 		if (argc > 2)
26945008Skarels 			usage();
27045008Skarels 		*argp++ = prompt;
27145008Skarels 		if (user) {
27245008Skarels 			*argp++ = "-l";
27345008Skarels 			*argp++ = user;
27445008Skarels 		}
27545008Skarels 		*argp++ = argv[0];		/* host */
27645008Skarels 		if (argc > 1)
27745008Skarels 			*argp++ = argv[1];	/* port */
27845008Skarels 		*argp = 0;
27945008Skarels 
28045008Skarels 		if (setjmp(toplevel) != 0)
28145008Skarels 			Exit(0);
28245008Skarels 		if (tn(argp - args, args) == 1)
28345008Skarels 			return (0);
28445008Skarels 		else
28545008Skarels 			return (1);
28632145Sminshall 	}
28745008Skarels 	(void)setjmp(toplevel);
28845233Sborman 	for (;;) {
28945008Skarels #ifdef TN3270
29045008Skarels 		if (shell_active)
29145008Skarels 			shell_continue();
29245008Skarels 		else
29345008Skarels #endif
29445008Skarels 			command(1, 0, 0);
29545233Sborman 	}
29632145Sminshall }
297