xref: /csrg-svn/usr.bin/telnet/main.c (revision 45233)
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*45233Sborman static char sccsid[] = "@(#)main.c	5.1 (Berkeley) 09/14/90";
1633685Sbostic #endif /* not lint */
1733685Sbostic 
1832381Sminshall #include <sys/types.h>
19*45233Sborman #if	defined(unix)
20*45233Sborman #include <strings.h>
21*45233Sborman #else	/* defined(unix) */
2245008Skarels #include <string.h>
23*45233Sborman #endif	/* defined(unix) */
2432381Sminshall 
2532381Sminshall #include "ring.h"
2632145Sminshall #include "externs.h"
2732145Sminshall #include "defines.h"
2832145Sminshall 
2932145Sminshall /*
3032145Sminshall  * Initialize variables.
3132145Sminshall  */
3232145Sminshall void
3332145Sminshall tninit()
3432145Sminshall {
35*45233Sborman     init_terminal();
36*45233Sborman 
37*45233Sborman     init_network();
38*45233Sborman 
39*45233Sborman     init_telnet();
40*45233Sborman 
41*45233Sborman     init_sys();
42*45233Sborman 
43*45233Sborman #if defined(TN3270)
44*45233Sborman     init_3270();
45*45233Sborman #endif
4632145Sminshall }
4732145Sminshall 
4845008Skarels int	autologin;
4932145Sminshall 
5032145Sminshall /*
5132145Sminshall  * main.  Parse arguments, invoke the protocol or command parser.
5232145Sminshall  */
53*45233Sborman 
54*45233Sborman 
5532145Sminshall main(argc, argv)
5632145Sminshall 	int argc;
5732145Sminshall 	char *argv[];
5832145Sminshall {
5945008Skarels 	extern char *optarg;
6045008Skarels 	extern int optind;
6145008Skarels 	int ch;
62*45233Sborman 	char *user, *strrchr();
6344361Sborman 
6445008Skarels 	tninit();		/* Clear out things */
65*45233Sborman #if	defined(CRAY) && !defined(__STDC__)
6645008Skarels 	_setlist_init();	/* Work around compiler bug */
6738689Sborman #endif
68*45233Sborman 
6945008Skarels 	TerminalSaveState();
7032145Sminshall 
71*45233Sborman 	if (prompt = strrchr(argv[0], '/'))
7245008Skarels 		++prompt;
7345008Skarels 	else
7445008Skarels 		prompt = argv[0];
7532145Sminshall 
7645008Skarels 	user = NULL;
7745008Skarels 	autologin = 0;
78*45233Sborman 	while ((ch = getopt(argc, argv, "ade:l:n:")) != EOF) {
7945008Skarels 		switch(ch) {
8045008Skarels 		case 'a':
8145008Skarels 			autologin = 1;
8245008Skarels 			break;
8345008Skarels 		case 'd':
8445008Skarels 			debug = 1;
8545008Skarels 			break;
8645008Skarels 		case 'e':
8745008Skarels 			set_escape_char(optarg);
8845008Skarels 			break;
8945008Skarels 		case 'l':
9045008Skarels 			autologin = 1;
9145008Skarels 			user = optarg;
9245008Skarels 			break;
9345008Skarels 		case 'n':
9445008Skarels #if defined(TN3270) && defined(unix)
9545008Skarels 			/* distinguish between "-n oasynch" and "-noasynch" */
9645008Skarels 			if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
9745008Skarels 			    == 'n' && argv[optind - 1][2] == 'o') {
9845008Skarels 				if (!strcmp(optarg, "oasynch")) {
9945008Skarels 					noasynchtty = 1;
10045008Skarels 					noasynchnet = 1;
10145008Skarels 				} else if (!strcmp(optarg, "oasynchtty"))
10245008Skarels 					noasynchtty = 1;
103*45233Sborman 				else if (!strcmp(optarg, "oasynchnet"))
10445008Skarels 					noasynchnet = 1;
10545008Skarels 			} else
10645008Skarels #endif	/* defined(TN3270) && defined(unix) */
10745008Skarels 				SetNetTrace(optarg);
10845008Skarels 			break;
10945008Skarels #if defined(TN3270) && defined(unix)
11045008Skarels 		case 't':
11145008Skarels 			transcom = tline;
11245008Skarels 			(void)strcpy(transcom, optarg);
11345008Skarels 			break;
11445008Skarels #endif
11545008Skarels 		case '?':
11645008Skarels 		default:
11745008Skarels 			usage();
11845008Skarels 			/* NOTREACHED */
11932145Sminshall 		}
120*45233Sborman 	}
12145008Skarels 	argc -= optind;
12245008Skarels 	argv += optind;
12345008Skarels 
12445008Skarels 	if (argc) {
12545008Skarels 		char *args[7], **argp = args;
12645008Skarels 
12745008Skarels 		if (argc > 2)
12845008Skarels 			usage();
12945008Skarels 		*argp++ = prompt;
13045008Skarels 		if (user) {
13145008Skarels 			*argp++ = "-l";
13245008Skarels 			*argp++ = user;
13345008Skarels 		}
13445008Skarels 		*argp++ = argv[0];		/* host */
13545008Skarels 		if (argc > 1)
13645008Skarels 			*argp++ = argv[1];	/* port */
13745008Skarels 		*argp = 0;
13845008Skarels 
13945008Skarels 		if (setjmp(toplevel) != 0)
14045008Skarels 			Exit(0);
14145008Skarels 		if (tn(argp - args, args) == 1)
14245008Skarels 			return (0);
14345008Skarels 		else
14445008Skarels 			return (1);
14532145Sminshall 	}
14645008Skarels 	(void)setjmp(toplevel);
147*45233Sborman 	for (;;) {
14845008Skarels #ifdef TN3270
14945008Skarels 		if (shell_active)
15045008Skarels 			shell_continue();
15145008Skarels 		else
15245008Skarels #endif
15345008Skarels 			command(1, 0, 0);
154*45233Sborman 	}
15532145Sminshall }
15645008Skarels 
15745008Skarels usage()
15845008Skarels {
15945008Skarels 	fprintf(stderr, "usage: %s [-a] [ [-l user] host-name [port] ]\n",
16045008Skarels 	    prompt);
16145008Skarels 	exit(1);
16245008Skarels }
163