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