xref: /386bsd/usr/src/usr.bin/telnet/main.c (revision a2142627)
1 /*
2  * Copyright (c) 1988, 1990 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *	This product includes software developed by the University of
16  *	California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #ifndef lint
35 char copyright[] =
36 "@(#) Copyright (c) 1988, 1990 Regents of the University of California.\n\
37  All rights reserved.\n";
38 #endif /* not lint */
39 
40 #ifndef lint
41 static char sccsid[] = "@(#)main.c	5.4 (Berkeley) 3/22/91";
42 #endif /* not lint */
43 
44 #include <sys/types.h>
45 
46 #include "ring.h"
47 #include "externs.h"
48 #include "defines.h"
49 
50 /*
51  * Initialize variables.
52  */
53     void
tninit()54 tninit()
55 {
56     init_terminal();
57 
58     init_network();
59 
60     init_telnet();
61 
62     init_sys();
63 
64 #if defined(TN3270)
65     init_3270();
66 #endif
67 }
68 
69 	void
usage()70 usage()
71 {
72 	fprintf(stderr, "Usage: %s %s%s%s%s\n",
73 	    prompt,
74 #ifdef	AUTHENTICATE
75 	    " [-8] [-E] [-K] [-L] [-X atype] [-a] [-d] [-e char] [-k realm]",
76 	    "\n\t[-l user] [-n tracefile] ",
77 #else
78 	    " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]",
79 	    "\n\t",
80 #endif
81 #if defined(TN3270) && defined(unix)
82 # ifdef AUTHENTICATE
83 	    "[-noasynch] [-noasynctty] [-noasyncnet]\n\t[-r] [-t transcom] ",
84 # else
85 	    "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t",
86 # endif
87 #else
88 	    "[-r] ",
89 #endif
90 #ifdef	ENCRYPT
91 	    "[-x] [host-name [port]]"
92 #else
93 	    "[host-name [port]]"
94 #endif
95 	);
96 	exit(1);
97 }
98 
99 /*
100  * main.  Parse arguments, invoke the protocol or command parser.
101  */
102 
103 
main(argc,argv)104 main(argc, argv)
105 	int argc;
106 	char *argv[];
107 {
108 	extern char *optarg;
109 	extern int optind;
110 	int ch;
111 	char *user, *strrchr();
112 
113 	tninit();		/* Clear out things */
114 #if	defined(CRAY) && !defined(__STDC__)
115 	_setlist_init();	/* Work around compiler bug */
116 #endif
117 
118 	TerminalSaveState();
119 
120 	if (prompt = strrchr(argv[0], '/'))
121 		++prompt;
122 	else
123 		prompt = argv[0];
124 
125 	user = NULL;
126 
127 	rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
128 	autologin = -1;
129 
130 	while ((ch = getopt(argc, argv, "8EKLS:X:ade:k:l:n:rt:x")) != EOF) {
131 		switch(ch) {
132 		case '8':
133 			eight = 3;	/* binary output and input */
134 			break;
135 		case 'E':
136 			rlogin = escape = _POSIX_VDISABLE;
137 			break;
138 		case 'K':
139 #ifdef	AUTHENTICATE
140 			autologin = 0;
141 #endif
142 			break;
143 		case 'L':
144 			eight |= 2;	/* binary output only */
145 			break;
146 		case 'S':
147 		    {
148 #ifdef	HAS_GETTOS
149 			extern int tos;
150 
151 			if ((tos = parsetos(optarg, "tcp")) < 0)
152 				fprintf(stderr, "%s%s%s%s\n",
153 					prompt, ": Bad TOS argument '",
154 					optarg,
155 					"; will try to use default TOS");
156 #else
157 			fprintf(stderr,
158 			   "%s: Warning: -S ignored, no parsetos() support.\n",
159 								prompt);
160 #endif
161 		    }
162 			break;
163 		case 'X':
164 #ifdef	AUTHENTICATE
165 			auth_disable_name(optarg);
166 #endif
167 			break;
168 		case 'a':
169 			autologin = 1;
170 			break;
171 		case 'c':
172 			skiprc = 1;
173 			break;
174 		case 'd':
175 			debug = 1;
176 			break;
177 		case 'e':
178 			set_escape_char(optarg);
179 			break;
180 		case 'k':
181 #if defined(AUTHENTICATE) && defined(KRB4)
182 		    {
183 			extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
184 			dest_realm = dst_realm_buf;
185 			(void)strncpy(dest_realm, optarg, dst_realm_sz);
186 		    }
187 #else
188 			fprintf(stderr,
189 			   "%s: Warning: -k ignored, no Kerberos V4 support.\n",
190 								prompt);
191 #endif
192 			break;
193 		case 'l':
194 			autologin = 1;
195 			user = optarg;
196 			break;
197 		case 'n':
198 #if defined(TN3270) && defined(unix)
199 			/* distinguish between "-n oasynch" and "-noasynch" */
200 			if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
201 			    == 'n' && argv[optind - 1][2] == 'o') {
202 				if (!strcmp(optarg, "oasynch")) {
203 					noasynchtty = 1;
204 					noasynchnet = 1;
205 				} else if (!strcmp(optarg, "oasynchtty"))
206 					noasynchtty = 1;
207 				else if (!strcmp(optarg, "oasynchnet"))
208 					noasynchnet = 1;
209 			} else
210 #endif	/* defined(TN3270) && defined(unix) */
211 				SetNetTrace(optarg);
212 			break;
213 		case 'r':
214 			rlogin = '~';
215 			break;
216 		case 't':
217 #if defined(TN3270) && defined(unix)
218 			transcom = tline;
219 			(void)strcpy(transcom, optarg);
220 #else
221 			fprintf(stderr,
222 			   "%s: Warning: -t ignored, no TN3270 support.\n",
223 								prompt);
224 #endif
225 			break;
226 		case 'x':
227 #ifdef	ENCRYPT
228 			encrypt_auto(1);
229 			decrypt_auto(1);
230 #else
231 			fprintf(stderr,
232 			    "%s: Warning: -x ignored, no ENCRYPT support.\n",
233 								prompt);
234 #endif
235 			break;
236 		case '?':
237 		default:
238 			usage();
239 			/* NOTREACHED */
240 		}
241 	}
242 	if (autologin == -1)
243 		autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
244 
245 	argc -= optind;
246 	argv += optind;
247 
248 	if (argc) {
249 		char *args[7], **argp = args;
250 
251 		if (argc > 2)
252 			usage();
253 		*argp++ = prompt;
254 		if (user) {
255 			*argp++ = "-l";
256 			*argp++ = user;
257 		}
258 		*argp++ = argv[0];		/* host */
259 		if (argc > 1)
260 			*argp++ = argv[1];	/* port */
261 		*argp = 0;
262 
263 		if (setjmp(toplevel) != 0)
264 			Exit(0);
265 		if (tn(argp - args, args) == 1)
266 			return (0);
267 		else
268 			return (1);
269 	}
270 	(void)setjmp(toplevel);
271 	for (;;) {
272 #ifdef TN3270
273 		if (shell_active)
274 			shell_continue();
275 		else
276 #endif
277 			command(1, 0, 0);
278 	}
279 }
280