main.c revision 1.3 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 /* from: static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 12/18/92"; */
42 static char *rcsid = "$Id: main.c,v 1.3 1994/02/25 03:00:29 cgd Exp $";
43 #endif /* not lint */
44
45 #include <sys/types.h>
46
47 #include "ring.h"
48 #include "externs.h"
49 #include "defines.h"
50
51 /* These values need to be the same as defined in libtelnet/kerberos5.c */
52 /* Either define them in both places, or put in some common header file. */
53 #define OPTS_FORWARD_CREDS 0x00000002
54 #define OPTS_FORWARDABLE_CREDS 0x00000001
55
56 #if 0
57 #define FORWARD
58 #endif
59
60 /*
61 * Initialize variables.
62 */
63 void
64 tninit()
65 {
66 init_terminal();
67
68 init_network();
69
70 init_telnet();
71
72 init_sys();
73
74 #if defined(TN3270)
75 init_3270();
76 #endif
77 }
78
79 void
80 usage()
81 {
82 fprintf(stderr, "Usage: %s %s%s%s%s\n",
83 prompt,
84 #ifdef AUTHENTICATION
85 " [-8] [-E] [-K] [-L] [-X atype] [-a] [-d] [-e char] [-k realm]",
86 "\n\t[-l user] [-f/-F] [-n tracefile] ",
87 #else
88 " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]",
89 "\n\t",
90 #endif
91 #if defined(TN3270) && defined(unix)
92 # ifdef AUTHENTICATION
93 "[-noasynch] [-noasynctty] [-noasyncnet]\n\t[-r] [-t transcom] ",
94 # else
95 "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t",
96 # endif
97 #else
98 "[-r] ",
99 #endif
100 "[host-name [port]]"
101 );
102 exit(1);
103 }
104
105 /*
106 * main. Parse arguments, invoke the protocol or command parser.
107 */
108
109
110 main(argc, argv)
111 int argc;
112 char *argv[];
113 {
114 extern char *optarg;
115 extern int optind;
116 int ch;
117 char *user, *strrchr();
118 #ifdef FORWARD
119 extern int forward_flags;
120 #endif /* FORWARD */
121
122 tninit(); /* Clear out things */
123 #if defined(CRAY) && !defined(__STDC__)
124 _setlist_init(); /* Work around compiler bug */
125 #endif
126
127 TerminalSaveState();
128
129 if (prompt = strrchr(argv[0], '/'))
130 ++prompt;
131 else
132 prompt = argv[0];
133
134 user = NULL;
135
136 rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
137 autologin = -1;
138
139 while ((ch = getopt(argc, argv, "8EKLS:X:acde:fFk:l:n:rt:x")) != EOF) {
140 switch(ch) {
141 case '8':
142 eight = 3; /* binary output and input */
143 break;
144 case 'E':
145 rlogin = escape = _POSIX_VDISABLE;
146 break;
147 case 'K':
148 #ifdef AUTHENTICATION
149 autologin = 0;
150 #endif
151 break;
152 case 'L':
153 eight |= 2; /* binary output only */
154 break;
155 case 'S':
156 {
157 #ifdef HAS_GETTOS
158 extern int tos;
159
160 if ((tos = parsetos(optarg, "tcp")) < 0)
161 fprintf(stderr, "%s%s%s%s\n",
162 prompt, ": Bad TOS argument '",
163 optarg,
164 "; will try to use default TOS");
165 #else
166 fprintf(stderr,
167 "%s: Warning: -S ignored, no parsetos() support.\n",
168 prompt);
169 #endif
170 }
171 break;
172 case 'X':
173 #ifdef AUTHENTICATION
174 auth_disable_name(optarg);
175 #endif
176 break;
177 case 'a':
178 autologin = 1;
179 break;
180 case 'c':
181 skiprc = 1;
182 break;
183 case 'd':
184 debug = 1;
185 break;
186 case 'e':
187 set_escape_char(optarg);
188 break;
189 case 'f':
190 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
191 if (forward_flags & OPTS_FORWARD_CREDS) {
192 fprintf(stderr,
193 "%s: Only one of -f and -F allowed.\n",
194 prompt);
195 usage();
196 }
197 forward_flags |= OPTS_FORWARD_CREDS;
198 #else
199 fprintf(stderr,
200 "%s: Warning: -f ignored, no Kerberos V5 support.\n",
201 prompt);
202 #endif
203 break;
204 case 'F':
205 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
206 if (forward_flags & OPTS_FORWARD_CREDS) {
207 fprintf(stderr,
208 "%s: Only one of -f and -F allowed.\n",
209 prompt);
210 usage();
211 }
212 forward_flags |= OPTS_FORWARD_CREDS;
213 forward_flags |= OPTS_FORWARDABLE_CREDS;
214 #else
215 fprintf(stderr,
216 "%s: Warning: -F ignored, no Kerberos V5 support.\n",
217 prompt);
218 #endif
219 break;
220 case 'k':
221 #if defined(AUTHENTICATION) && defined(KRB4)
222 {
223 extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
224 dest_realm = dst_realm_buf;
225 (void)strncpy(dest_realm, optarg, dst_realm_sz);
226 }
227 #else
228 fprintf(stderr,
229 "%s: Warning: -k ignored, no Kerberos V4 support.\n",
230 prompt);
231 #endif
232 break;
233 case 'l':
234 autologin = 1;
235 user = optarg;
236 break;
237 case 'n':
238 #if defined(TN3270) && defined(unix)
239 /* distinguish between "-n oasynch" and "-noasynch" */
240 if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
241 == 'n' && argv[optind - 1][2] == 'o') {
242 if (!strcmp(optarg, "oasynch")) {
243 noasynchtty = 1;
244 noasynchnet = 1;
245 } else if (!strcmp(optarg, "oasynchtty"))
246 noasynchtty = 1;
247 else if (!strcmp(optarg, "oasynchnet"))
248 noasynchnet = 1;
249 } else
250 #endif /* defined(TN3270) && defined(unix) */
251 SetNetTrace(optarg);
252 break;
253 case 'r':
254 rlogin = '~';
255 break;
256 case 't':
257 #if defined(TN3270) && defined(unix)
258 transcom = tline;
259 (void)strcpy(transcom, optarg);
260 #else
261 fprintf(stderr,
262 "%s: Warning: -t ignored, no TN3270 support.\n",
263 prompt);
264 #endif
265 break;
266 case 'x':
267 fprintf(stderr,
268 "%s: Warning: -x ignored, no ENCRYPT support.\n",
269 prompt);
270 break;
271 case '?':
272 default:
273 usage();
274 /* NOTREACHED */
275 }
276 }
277 if (autologin == -1)
278 autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
279
280 argc -= optind;
281 argv += optind;
282
283 if (argc) {
284 char *args[7], **argp = args;
285
286 if (argc > 2)
287 usage();
288 *argp++ = prompt;
289 if (user) {
290 *argp++ = "-l";
291 *argp++ = user;
292 }
293 *argp++ = argv[0]; /* host */
294 if (argc > 1)
295 *argp++ = argv[1]; /* port */
296 *argp = 0;
297
298 if (setjmp(toplevel) != 0)
299 Exit(0);
300 if (tn(argp - args, args) == 1)
301 return (0);
302 else
303 return (1);
304 }
305 (void)setjmp(toplevel);
306 for (;;) {
307 #ifdef TN3270
308 if (shell_active)
309 shell_continue();
310 else
311 #endif
312 command(1, 0, 0);
313 }
314 }
315