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