xref: /original-bsd/usr.bin/telnet/main.c (revision 02e832b2)
1 /*
2  * Copyright (c) 1988, 1990 Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  */
7 
8 #ifndef lint
9 char copyright[] =
10 "@(#) Copyright (c) 1988, 1990 Regents of the University of California.\n\
11  All rights reserved.\n";
12 #endif /* not lint */
13 
14 #ifndef lint
15 static char sccsid[] = "@(#)main.c	5.5 (Berkeley) 12/18/92";
16 #endif /* not lint */
17 
18 #include <sys/types.h>
19 
20 #include "ring.h"
21 #include "externs.h"
22 #include "defines.h"
23 
24 /*
25  * Initialize variables.
26  */
27     void
28 tninit()
29 {
30     init_terminal();
31 
32     init_network();
33 
34     init_telnet();
35 
36     init_sys();
37 
38 #if defined(TN3270)
39     init_3270();
40 #endif
41 }
42 
43 	void
44 usage()
45 {
46 	fprintf(stderr, "Usage: %s %s%s%s%s\n",
47 	    prompt,
48 #ifdef	AUTHENTICATION
49 	    " [-8] [-E] [-K] [-L] [-X atype] [-a] [-d] [-e char] [-k realm]",
50 	    "\n\t[-l user] [-n tracefile] ",
51 #else
52 	    " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]",
53 	    "\n\t",
54 #endif
55 #if defined(TN3270) && defined(unix)
56 # ifdef AUTHENTICATION
57 	    "[-noasynch] [-noasynctty] [-noasyncnet]\n\t[-r] [-t transcom] ",
58 # else
59 	    "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t",
60 # endif
61 #else
62 	    "[-r] ",
63 #endif
64 #ifdef	ENCRYPTION
65 	    "[-x] [host-name [port]]"
66 #else
67 	    "[host-name [port]]"
68 #endif
69 	);
70 	exit(1);
71 }
72 
73 /*
74  * main.  Parse arguments, invoke the protocol or command parser.
75  */
76 
77 
78 main(argc, argv)
79 	int argc;
80 	char *argv[];
81 {
82 	extern char *optarg;
83 	extern int optind;
84 	int ch;
85 	char *user, *strrchr();
86 
87 	tninit();		/* Clear out things */
88 #if	defined(CRAY) && !defined(__STDC__)
89 	_setlist_init();	/* Work around compiler bug */
90 #endif
91 
92 	TerminalSaveState();
93 
94 	if (prompt = strrchr(argv[0], '/'))
95 		++prompt;
96 	else
97 		prompt = argv[0];
98 
99 	user = NULL;
100 
101 	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
102 	autologin = -1;
103 
104 	while ((ch = getopt(argc, argv, "8EKLS:X:acde:k:l:n:rt:x")) != EOF) {
105 		switch(ch) {
106 		case '8':
107 			eight = 3;	/* binary output and input */
108 			break;
109 		case 'E':
110 			rlogin = escape = _POSIX_VDISABLE;
111 			break;
112 		case 'K':
113 #ifdef	AUTHENTICATION
114 			autologin = 0;
115 #endif
116 			break;
117 		case 'L':
118 			eight |= 2;	/* binary output only */
119 			break;
120 		case 'S':
121 		    {
122 #ifdef	HAS_GETTOS
123 			extern int tos;
124 
125 			if ((tos = parsetos(optarg, "tcp")) < 0)
126 				fprintf(stderr, "%s%s%s%s\n",
127 					prompt, ": Bad TOS argument '",
128 					optarg,
129 					"; will try to use default TOS");
130 #else
131 			fprintf(stderr,
132 			   "%s: Warning: -S ignored, no parsetos() support.\n",
133 								prompt);
134 #endif
135 		    }
136 			break;
137 		case 'X':
138 #ifdef	AUTHENTICATION
139 			auth_disable_name(optarg);
140 #endif
141 			break;
142 		case 'a':
143 			autologin = 1;
144 			break;
145 		case 'c':
146 			skiprc = 1;
147 			break;
148 		case 'd':
149 			debug = 1;
150 			break;
151 		case 'e':
152 			set_escape_char(optarg);
153 			break;
154 		case 'k':
155 #if defined(AUTHENTICATION) && defined(KRB4)
156 		    {
157 			extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
158 			dest_realm = dst_realm_buf;
159 			(void)strncpy(dest_realm, optarg, dst_realm_sz);
160 		    }
161 #else
162 			fprintf(stderr,
163 			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
164 								prompt);
165 #endif
166 			break;
167 		case 'l':
168 			autologin = 1;
169 			user = optarg;
170 			break;
171 		case 'n':
172 #if defined(TN3270) && defined(unix)
173 			/* distinguish between "-n oasynch" and "-noasynch" */
174 			if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
175 			    == 'n' && argv[optind - 1][2] == 'o') {
176 				if (!strcmp(optarg, "oasynch")) {
177 					noasynchtty = 1;
178 					noasynchnet = 1;
179 				} else if (!strcmp(optarg, "oasynchtty"))
180 					noasynchtty = 1;
181 				else if (!strcmp(optarg, "oasynchnet"))
182 					noasynchnet = 1;
183 			} else
184 #endif	/* defined(TN3270) && defined(unix) */
185 				SetNetTrace(optarg);
186 			break;
187 		case 'r':
188 			rlogin = '~';
189 			break;
190 		case 't':
191 #if defined(TN3270) && defined(unix)
192 			transcom = tline;
193 			(void)strcpy(transcom, optarg);
194 #else
195 			fprintf(stderr,
196 			   "%s: Warning: -t ignored, no TN3270 support.\n",
197 								prompt);
198 #endif
199 			break;
200 		case 'x':
201 #ifdef	ENCRYPTION
202 			encrypt_auto(1);
203 			decrypt_auto(1);
204 #else
205 			fprintf(stderr,
206 			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
207 								prompt);
208 #endif
209 			break;
210 		case '?':
211 		default:
212 			usage();
213 			/* NOTREACHED */
214 		}
215 	}
216 	if (autologin == -1)
217 		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
218 
219 	argc -= optind;
220 	argv += optind;
221 
222 	if (argc) {
223 		char *args[7], **argp = args;
224 
225 		if (argc > 2)
226 			usage();
227 		*argp++ = prompt;
228 		if (user) {
229 			*argp++ = "-l";
230 			*argp++ = user;
231 		}
232 		*argp++ = argv[0];		/* host */
233 		if (argc > 1)
234 			*argp++ = argv[1];	/* port */
235 		*argp = 0;
236 
237 		if (setjmp(toplevel) != 0)
238 			Exit(0);
239 		if (tn(argp - args, args) == 1)
240 			return (0);
241 		else
242 			return (1);
243 	}
244 	(void)setjmp(toplevel);
245 	for (;;) {
246 #ifdef TN3270
247 		if (shell_active)
248 			shell_continue();
249 		else
250 #endif
251 			command(1, 0, 0);
252 	}
253 }
254