xref: /csrg-svn/usr.bin/telnet/main.c (revision 46808)
133685Sbostic /*
245008Skarels  * Copyright (c) 1988, 1990 Regents of the University of California.
333685Sbostic  * All rights reserved.
433685Sbostic  *
542770Sbostic  * %sccs.include.redist.c%
633685Sbostic  */
733685Sbostic 
833685Sbostic #ifndef lint
933685Sbostic char copyright[] =
1045008Skarels "@(#) Copyright (c) 1988, 1990 Regents of the University of California.\n\
1133685Sbostic  All rights reserved.\n";
1233685Sbostic #endif /* not lint */
1333685Sbostic 
1433685Sbostic #ifndef lint
15*46808Sdab static char sccsid[] = "@(#)main.c	5.2 (Berkeley) 03/01/91";
1633685Sbostic #endif /* not lint */
1733685Sbostic 
1832381Sminshall #include <sys/types.h>
1932381Sminshall 
2032381Sminshall #include "ring.h"
2132145Sminshall #include "externs.h"
2232145Sminshall #include "defines.h"
2332145Sminshall 
2432145Sminshall /*
2532145Sminshall  * Initialize variables.
2632145Sminshall  */
27*46808Sdab     void
2832145Sminshall tninit()
2932145Sminshall {
3045233Sborman     init_terminal();
3145233Sborman 
3245233Sborman     init_network();
3345233Sborman 
3445233Sborman     init_telnet();
3545233Sborman 
3645233Sborman     init_sys();
3745233Sborman 
3845233Sborman #if defined(TN3270)
3945233Sborman     init_3270();
4045233Sborman #endif
4132145Sminshall }
4232145Sminshall 
43*46808Sdab 	void
44*46808Sdab usage()
45*46808Sdab {
46*46808Sdab 	fprintf(stderr, "Usage: %s %s%s%s%s\n",
47*46808Sdab 	    prompt,
48*46808Sdab #ifdef	AUTHENTICATE
49*46808Sdab 	    " [-8] [-E] [-K] [-L] [-X atype] [-a] [-d] [-e char] [-k realm]",
50*46808Sdab 	    "\n\t[-l user] [-n tracefile] ",
51*46808Sdab #else
52*46808Sdab 	    " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]",
53*46808Sdab 	    "\n\t",
54*46808Sdab #endif
55*46808Sdab #if defined(TN3270) && defined(unix)
56*46808Sdab # ifdef AUTHENTICATE
57*46808Sdab 	    "[-noasynch] [-noasynctty] [-noasyncnet]\n\t[-r] [-t transcom] ",
58*46808Sdab # else
59*46808Sdab 	    "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t",
60*46808Sdab # endif
61*46808Sdab #else
62*46808Sdab 	    "[-r] ",
63*46808Sdab #endif
64*46808Sdab #ifdef	ENCRYPT
65*46808Sdab 	    "[-x] [host-name [port]]"
66*46808Sdab #else
67*46808Sdab 	    "[host-name [port]]"
68*46808Sdab #endif
69*46808Sdab 	);
70*46808Sdab 	exit(1);
71*46808Sdab }
7232145Sminshall 
7332145Sminshall /*
7432145Sminshall  * main.  Parse arguments, invoke the protocol or command parser.
7532145Sminshall  */
7645233Sborman 
7745233Sborman 
7832145Sminshall main(argc, argv)
7932145Sminshall 	int argc;
8032145Sminshall 	char *argv[];
8132145Sminshall {
8245008Skarels 	extern char *optarg;
8345008Skarels 	extern int optind;
8445008Skarels 	int ch;
8545233Sborman 	char *user, *strrchr();
8644361Sborman 
8745008Skarels 	tninit();		/* Clear out things */
8845233Sborman #if	defined(CRAY) && !defined(__STDC__)
8945008Skarels 	_setlist_init();	/* Work around compiler bug */
9038689Sborman #endif
9145233Sborman 
9245008Skarels 	TerminalSaveState();
9332145Sminshall 
9445233Sborman 	if (prompt = strrchr(argv[0], '/'))
9545008Skarels 		++prompt;
9645008Skarels 	else
9745008Skarels 		prompt = argv[0];
9832145Sminshall 
9945008Skarels 	user = NULL;
100*46808Sdab 
101*46808Sdab 	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
102*46808Sdab 	autologin = -1;
103*46808Sdab 
104*46808Sdab 	while ((ch = getopt(argc, argv, "8EKLX:ade:k:l:n:rt:x")) != EOF) {
10545008Skarels 		switch(ch) {
106*46808Sdab 		case '8':
107*46808Sdab 			eight = 3;	/* binary output and input */
108*46808Sdab 			break;
109*46808Sdab 		case 'E':
110*46808Sdab 			rlogin = escape = _POSIX_VDISABLE;
111*46808Sdab 			break;
112*46808Sdab 		case 'K':
113*46808Sdab #ifdef	AUTHENTICATE
114*46808Sdab 			autologin = 0;
115*46808Sdab #endif
116*46808Sdab 			break;
117*46808Sdab 		case 'L':
118*46808Sdab 			eight |= 2;	/* binary output only */
119*46808Sdab 			break;
120*46808Sdab 		case 'X':
121*46808Sdab #ifdef	AUTHENTICATE
122*46808Sdab 			auth_disable_name(optarg);
123*46808Sdab #endif
124*46808Sdab 			break;
12545008Skarels 		case 'a':
12645008Skarels 			autologin = 1;
12745008Skarels 			break;
12845008Skarels 		case 'd':
12945008Skarels 			debug = 1;
13045008Skarels 			break;
13145008Skarels 		case 'e':
13245008Skarels 			set_escape_char(optarg);
13345008Skarels 			break;
134*46808Sdab 		case 'k':
135*46808Sdab #if defined(AUTHENTICATE) && defined(KRB4)
136*46808Sdab 		    {
137*46808Sdab 			extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
138*46808Sdab 			dest_realm = dst_realm_buf;
139*46808Sdab 			(void)strncpy(dest_realm, optarg, dst_realm_sz);
140*46808Sdab 		    }
141*46808Sdab #else
142*46808Sdab 			fprintf(stderr,
143*46808Sdab 			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
144*46808Sdab 								prompt);
145*46808Sdab #endif
146*46808Sdab 			break;
14745008Skarels 		case 'l':
14845008Skarels 			autologin = 1;
14945008Skarels 			user = optarg;
15045008Skarels 			break;
15145008Skarels 		case 'n':
15245008Skarels #if defined(TN3270) && defined(unix)
15345008Skarels 			/* distinguish between "-n oasynch" and "-noasynch" */
15445008Skarels 			if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
15545008Skarels 			    == 'n' && argv[optind - 1][2] == 'o') {
15645008Skarels 				if (!strcmp(optarg, "oasynch")) {
15745008Skarels 					noasynchtty = 1;
15845008Skarels 					noasynchnet = 1;
15945008Skarels 				} else if (!strcmp(optarg, "oasynchtty"))
16045008Skarels 					noasynchtty = 1;
16145233Sborman 				else if (!strcmp(optarg, "oasynchnet"))
16245008Skarels 					noasynchnet = 1;
16345008Skarels 			} else
16445008Skarels #endif	/* defined(TN3270) && defined(unix) */
16545008Skarels 				SetNetTrace(optarg);
16645008Skarels 			break;
167*46808Sdab 		case 'r':
168*46808Sdab 			rlogin = '~';
169*46808Sdab 			break;
170*46808Sdab 		case 't':
17145008Skarels #if defined(TN3270) && defined(unix)
17245008Skarels 			transcom = tline;
17345008Skarels 			(void)strcpy(transcom, optarg);
174*46808Sdab #else
175*46808Sdab 			fprintf(stderr,
176*46808Sdab 			   "%s: Warning: -t ignored, no TN3270 support.\n",
177*46808Sdab 								prompt);
178*46808Sdab #endif
17945008Skarels 			break;
180*46808Sdab 		case 'x':
181*46808Sdab #ifdef	ENCRYPT
182*46808Sdab 			encrypt_auto();
183*46808Sdab #else
184*46808Sdab 			fprintf(stderr,
185*46808Sdab 			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
186*46808Sdab 								prompt);
18745008Skarels #endif
188*46808Sdab 			break;
18945008Skarels 		case '?':
19045008Skarels 		default:
19145008Skarels 			usage();
19245008Skarels 			/* NOTREACHED */
19332145Sminshall 		}
19445233Sborman 	}
195*46808Sdab 	if (autologin == -1)
196*46808Sdab 		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
197*46808Sdab 
19845008Skarels 	argc -= optind;
19945008Skarels 	argv += optind;
20045008Skarels 
20145008Skarels 	if (argc) {
20245008Skarels 		char *args[7], **argp = args;
20345008Skarels 
20445008Skarels 		if (argc > 2)
20545008Skarels 			usage();
20645008Skarels 		*argp++ = prompt;
20745008Skarels 		if (user) {
20845008Skarels 			*argp++ = "-l";
20945008Skarels 			*argp++ = user;
21045008Skarels 		}
21145008Skarels 		*argp++ = argv[0];		/* host */
21245008Skarels 		if (argc > 1)
21345008Skarels 			*argp++ = argv[1];	/* port */
21445008Skarels 		*argp = 0;
21545008Skarels 
21645008Skarels 		if (setjmp(toplevel) != 0)
21745008Skarels 			Exit(0);
21845008Skarels 		if (tn(argp - args, args) == 1)
21945008Skarels 			return (0);
22045008Skarels 		else
22145008Skarels 			return (1);
22232145Sminshall 	}
22345008Skarels 	(void)setjmp(toplevel);
22445233Sborman 	for (;;) {
22545008Skarels #ifdef TN3270
22645008Skarels 		if (shell_active)
22745008Skarels 			shell_continue();
22845008Skarels 		else
22945008Skarels #endif
23045008Skarels 			command(1, 0, 0);
23145233Sborman 	}
23232145Sminshall }
233