1 /* 2 * Copyright (c) 1988, 1990, 1993 3 * The Regents of the University of California. 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 static char *copyright[] = { 35 "@(#) Copyright (c) 1988, 1990, 1993\n" 36 "\tThe Regents of the University of California. All rights reserved.\n", 37 (char*)copyright 38 }; 39 40 #include "telnet_locl.h" 41 RCSID("$Id: main.c,v 1.31 2000/12/31 07:40:17 assar Exp $"); 42 43 /* These values need to be the same as defined in libtelnet/kerberos5.c */ 44 /* Either define them in both places, or put in some common header file. */ 45 #define OPTS_FORWARD_CREDS 0x00000002 46 #define OPTS_FORWARDABLE_CREDS 0x00000001 47 48 #if KRB5 49 #define FORWARD 50 #endif 51 52 /* 53 * Initialize variables. 54 */ 55 void 56 tninit(void) 57 { 58 init_terminal(); 59 60 init_network(); 61 62 init_telnet(); 63 64 init_sys(); 65 } 66 67 void 68 usage(void) 69 { 70 fprintf(stderr, "Usage: %s %s%s%s%s\n", prompt, 71 #ifdef AUTHENTICATION 72 "[-8] [-E] [-K] [-L] [-G] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]", 73 "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ", 74 #else 75 "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", 76 "\n\t[-n tracefile]", 77 #endif 78 "[-r] ", 79 #ifdef ENCRYPTION 80 "[-x] [host-name [port]]" 81 #else 82 "[host-name [port]]" 83 #endif 84 ); 85 exit(1); 86 } 87 88 /* 89 * main. Parse arguments, invoke the protocol or command parser. 90 */ 91 92 93 #ifdef FORWARD 94 extern int forward_flags; 95 static int default_forward=0; 96 #endif /* FORWARD */ 97 98 #ifdef KRB5 99 /* XXX ugly hack to setup dns-proxy stuff */ 100 #define Authenticator asn1_Authenticator 101 #include <krb5.h> 102 static void 103 krb5_init(void) 104 { 105 krb5_context context; 106 krb5_error_code ret; 107 108 ret = krb5_init_context(&context); 109 if (ret) 110 return; 111 112 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 113 if (krb5_config_get_bool (context, NULL, 114 "libdefaults", "forward", NULL)) { 115 forward_flags |= OPTS_FORWARD_CREDS; 116 default_forward=1; 117 } 118 if (krb5_config_get_bool (context, NULL, 119 "libdefaults", "forwardable", NULL)) { 120 forward_flags |= OPTS_FORWARDABLE_CREDS; 121 default_forward=1; 122 } 123 #endif 124 #ifdef ENCRYPTION 125 if (krb5_config_get_bool (context, NULL, 126 "libdefaults", "encrypt", NULL)) { 127 encrypt_auto(1); 128 decrypt_auto(1); 129 EncryptVerbose(1); 130 } 131 #endif 132 133 krb5_free_context(context); 134 } 135 #endif 136 137 int 138 main(int argc, char **argv) 139 { 140 int ch; 141 char *user; 142 143 #ifdef KRB5 144 krb5_init(); 145 #endif 146 147 tninit(); /* Clear out things */ 148 149 TerminalSaveState(); 150 151 if ((prompt = strrchr(argv[0], '/'))) 152 ++prompt; 153 else 154 prompt = argv[0]; 155 156 user = NULL; 157 158 rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; 159 160 /* 161 * if AUTHENTICATION and ENCRYPTION is set autologin will be 162 * se to true after the getopt switch; unless the -K option is 163 * passed 164 */ 165 autologin = -1; 166 167 while((ch = getopt(argc, argv, 168 "78DEKLS:X:abcde:fFk:l:n:rxG")) != -1) { 169 switch(ch) { 170 case '8': 171 eight = 3; /* binary output and input */ 172 break; 173 case '7': 174 eight = 0; 175 break; 176 case 'b': 177 binary = 3; 178 break; 179 case 'D': { 180 /* sometimes we don't want a mangled display */ 181 char *p; 182 if((p = getenv("DISPLAY"))) 183 env_define("DISPLAY", (unsigned char*)p); 184 break; 185 } 186 case 'E': 187 rlogin = escape = _POSIX_VDISABLE; 188 break; 189 case 'K': 190 #ifdef AUTHENTICATION 191 autologin = 0; 192 #endif 193 break; 194 case 'L': 195 eight |= 2; /* binary output only */ 196 break; 197 case 'S': 198 { 199 #ifdef HAVE_PARSETOS 200 extern int tos; 201 202 if ((tos = parsetos(optarg, "tcp")) < 0) 203 fprintf(stderr, "%s%s%s%s\n", 204 prompt, ": Bad TOS argument '", 205 optarg, 206 "; will try to use default TOS"); 207 #else 208 fprintf(stderr, 209 "%s: Warning: -S ignored, no parsetos() support.\n", 210 prompt); 211 #endif 212 } 213 break; 214 case 'X': 215 #ifdef AUTHENTICATION 216 auth_disable_name(optarg); 217 #endif 218 break; 219 case 'a': 220 autologin = 1; 221 break; 222 case 'c': 223 skiprc = 1; 224 break; 225 case 'd': 226 debug = 1; 227 break; 228 case 'e': 229 set_escape_char(optarg); 230 break; 231 case 'f': 232 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 233 if ((forward_flags & OPTS_FORWARD_CREDS) && 234 !default_forward) { 235 fprintf(stderr, 236 "%s: Only one of -f and -F allowed.\n", 237 prompt); 238 usage(); 239 } 240 forward_flags |= OPTS_FORWARD_CREDS; 241 #else 242 fprintf(stderr, 243 "%s: Warning: -f ignored, no Kerberos V5 support.\n", 244 prompt); 245 #endif 246 break; 247 case 'F': 248 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 249 if ((forward_flags & OPTS_FORWARD_CREDS) && 250 !default_forward) { 251 fprintf(stderr, 252 "%s: Only one of -f and -F allowed.\n", 253 prompt); 254 usage(); 255 } 256 forward_flags |= OPTS_FORWARD_CREDS; 257 forward_flags |= OPTS_FORWARDABLE_CREDS; 258 #else 259 fprintf(stderr, 260 "%s: Warning: -F ignored, no Kerberos V5 support.\n", 261 prompt); 262 #endif 263 break; 264 case 'k': 265 #if defined(AUTHENTICATION) && defined(KRB4) 266 { 267 extern char *dest_realm, dst_realm_buf[]; 268 extern int dst_realm_sz; 269 dest_realm = dst_realm_buf; 270 strlcpy(dest_realm, optarg, dst_realm_sz); 271 } 272 #else 273 fprintf(stderr, 274 "%s: Warning: -k ignored, no Kerberos V4 support.\n", 275 prompt); 276 #endif 277 break; 278 case 'l': 279 if(autologin == 0){ 280 fprintf(stderr, "%s: Warning: -K ignored\n", prompt); 281 autologin = -1; 282 } 283 user = optarg; 284 break; 285 case 'n': 286 SetNetTrace(optarg); 287 break; 288 case 'r': 289 rlogin = '~'; 290 break; 291 case 'x': 292 #ifdef ENCRYPTION 293 encrypt_auto(1); 294 decrypt_auto(1); 295 EncryptVerbose(1); 296 #else 297 fprintf(stderr, 298 "%s: Warning: -x ignored, no ENCRYPT support.\n", 299 prompt); 300 #endif 301 break; 302 case 'G': 303 #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 304 forward_flags ^= OPTS_FORWARD_CREDS; 305 forward_flags ^= OPTS_FORWARDABLE_CREDS; 306 #else 307 fprintf(stderr, 308 "%s: Warning: -G ignored, no Kerberos V5 support.\n", 309 prompt); 310 #endif 311 break; 312 313 case '?': 314 default: 315 usage(); 316 /* NOTREACHED */ 317 } 318 } 319 320 if (autologin == -1) { /* esc@magic.fi; force */ 321 #if defined(AUTHENTICATION) 322 autologin = 1; 323 #endif 324 #if defined(ENCRYPTION) 325 encrypt_auto(1); 326 decrypt_auto(1); 327 #endif 328 } 329 330 if (autologin == -1) 331 autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 332 333 argc -= optind; 334 argv += optind; 335 336 if (argc) { 337 char *args[7], **argp = args; 338 339 if (argc > 2) 340 usage(); 341 *argp++ = prompt; 342 if (user) { 343 *argp++ = "-l"; 344 *argp++ = user; 345 } 346 *argp++ = argv[0]; /* host */ 347 if (argc > 1) 348 *argp++ = argv[1]; /* port */ 349 *argp = 0; 350 351 if (setjmp(toplevel) != 0) 352 Exit(0); 353 if (tn(argp - args, args) == 1) 354 return (0); 355 else 356 return (1); 357 } 358 setjmp(toplevel); 359 for (;;) { 360 command(1, 0, 0); 361 } 362 } 363