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