main.c revision 57416
157416Smarkm/* 257416Smarkm * Copyright (c) 1988, 1990, 1993 357416Smarkm * The Regents of the University of California. All rights reserved. 457416Smarkm * 557416Smarkm * Redistribution and use in source and binary forms, with or without 657416Smarkm * modification, are permitted provided that the following conditions 757416Smarkm * are met: 857416Smarkm * 1. Redistributions of source code must retain the above copyright 957416Smarkm * notice, this list of conditions and the following disclaimer. 1057416Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1157416Smarkm * notice, this list of conditions and the following disclaimer in the 1257416Smarkm * documentation and/or other materials provided with the distribution. 1357416Smarkm * 3. All advertising materials mentioning features or use of this software 1457416Smarkm * must display the following acknowledgement: 1557416Smarkm * This product includes software developed by the University of 1657416Smarkm * California, Berkeley and its contributors. 1757416Smarkm * 4. Neither the name of the University nor the names of its contributors 1857416Smarkm * may be used to endorse or promote products derived from this software 1957416Smarkm * without specific prior written permission. 2057416Smarkm * 2157416Smarkm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2257416Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2357416Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2457416Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2557416Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2657416Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2757416Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2857416Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2957416Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3057416Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3157416Smarkm * SUCH DAMAGE. 3257416Smarkm */ 3357416Smarkm 3457416Smarkmstatic char *copyright[] = { 3557416Smarkm "@(#) Copyright (c) 1988, 1990, 1993\n" 3657416Smarkm "\tThe Regents of the University of California. All rights reserved.\n", 3757416Smarkm (char*)copyright 3857416Smarkm}; 3957416Smarkm 4057416Smarkm#include "telnet_locl.h" 4157416SmarkmRCSID("$Id: main.c,v 1.30 1999/11/13 06:30:11 assar Exp $"); 4257416Smarkm 4357416Smarkm/* These values need to be the same as defined in libtelnet/kerberos5.c */ 4457416Smarkm/* Either define them in both places, or put in some common header file. */ 4557416Smarkm#define OPTS_FORWARD_CREDS 0x00000002 4657416Smarkm#define OPTS_FORWARDABLE_CREDS 0x00000001 4757416Smarkm 4857416Smarkm#if KRB5 4957416Smarkm#define FORWARD 5057416Smarkm#endif 5157416Smarkm 5257416Smarkm/* 5357416Smarkm * Initialize variables. 5457416Smarkm */ 5557416Smarkmvoid 5657416Smarkmtninit(void) 5757416Smarkm{ 5857416Smarkm init_terminal(); 5957416Smarkm 6057416Smarkm init_network(); 6157416Smarkm 6257416Smarkm init_telnet(); 6357416Smarkm 6457416Smarkm init_sys(); 6557416Smarkm} 6657416Smarkm 6757416Smarkmvoid 6857416Smarkmusage(void) 6957416Smarkm{ 7057416Smarkm fprintf(stderr, "Usage: %s %s%s%s%s\n", prompt, 7157416Smarkm#ifdef AUTHENTICATION 7257416Smarkm "[-8] [-E] [-K] [-L] [-G] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]", 7357416Smarkm "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ", 7457416Smarkm#else 7557416Smarkm "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", 7657416Smarkm "\n\t[-n tracefile]", 7757416Smarkm#endif 7857416Smarkm "[-r] ", 7957416Smarkm#ifdef ENCRYPTION 8057416Smarkm "[-x] [host-name [port]]" 8157416Smarkm#else 8257416Smarkm "[host-name [port]]" 8357416Smarkm#endif 8457416Smarkm ); 8557416Smarkm exit(1); 8657416Smarkm} 8757416Smarkm 8857416Smarkm/* 8957416Smarkm * main. Parse arguments, invoke the protocol or command parser. 9057416Smarkm */ 9157416Smarkm 9257416Smarkm 9357416Smarkm#ifdef FORWARD 9457416Smarkmextern int forward_flags; 9557416Smarkmstatic int default_forward=0; 9657416Smarkm#endif /* FORWARD */ 9757416Smarkm 9857416Smarkm#ifdef KRB5 9957416Smarkm/* XXX ugly hack to setup dns-proxy stuff */ 10057416Smarkm#define Authenticator asn1_Authenticator 10157416Smarkm#include <krb5.h> 10257416Smarkmstatic void 10357416Smarkmkrb5_init(void) 10457416Smarkm{ 10557416Smarkm krb5_context context; 10657416Smarkm krb5_init_context(&context); 10757416Smarkm 10857416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 10957416Smarkm if (krb5_config_get_bool (context, NULL, 11057416Smarkm "libdefaults", "forward", NULL)) { 11157416Smarkm forward_flags |= OPTS_FORWARD_CREDS; 11257416Smarkm default_forward=1; 11357416Smarkm } 11457416Smarkm if (krb5_config_get_bool (context, NULL, 11557416Smarkm "libdefaults", "forwardable", NULL)) { 11657416Smarkm forward_flags |= OPTS_FORWARDABLE_CREDS; 11757416Smarkm default_forward=1; 11857416Smarkm } 11957416Smarkm#endif 12057416Smarkm#ifdef ENCRYPTION 12157416Smarkm if (krb5_config_get_bool (context, NULL, 12257416Smarkm "libdefaults", "encrypt", NULL)) { 12357416Smarkm encrypt_auto(1); 12457416Smarkm decrypt_auto(1); 12557416Smarkm EncryptVerbose(1); 12657416Smarkm } 12757416Smarkm#endif 12857416Smarkm 12957416Smarkm krb5_free_context(context); 13057416Smarkm} 13157416Smarkm#endif 13257416Smarkm 13357416Smarkmint 13457416Smarkmmain(int argc, char **argv) 13557416Smarkm{ 13657416Smarkm int ch; 13757416Smarkm char *user; 13857416Smarkm 13957416Smarkm#ifdef KRB5 14057416Smarkm krb5_init(); 14157416Smarkm#endif 14257416Smarkm 14357416Smarkm tninit(); /* Clear out things */ 14457416Smarkm 14557416Smarkm TerminalSaveState(); 14657416Smarkm 14757416Smarkm if ((prompt = strrchr(argv[0], '/'))) 14857416Smarkm ++prompt; 14957416Smarkm else 15057416Smarkm prompt = argv[0]; 15157416Smarkm 15257416Smarkm user = NULL; 15357416Smarkm 15457416Smarkm rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; 15557416Smarkm 15657416Smarkm /* 15757416Smarkm * if AUTHENTICATION and ENCRYPTION is set autologin will be 15857416Smarkm * se to true after the getopt switch; unless the -K option is 15957416Smarkm * passed 16057416Smarkm */ 16157416Smarkm autologin = -1; 16257416Smarkm 16357416Smarkm while((ch = getopt(argc, argv, 16457416Smarkm "78DEKLS:X:abcde:fFk:l:n:rxG")) != -1) { 16557416Smarkm switch(ch) { 16657416Smarkm case '8': 16757416Smarkm eight = 3; /* binary output and input */ 16857416Smarkm break; 16957416Smarkm case '7': 17057416Smarkm eight = 0; 17157416Smarkm break; 17257416Smarkm case 'b': 17357416Smarkm binary = 3; 17457416Smarkm break; 17557416Smarkm case 'D': { 17657416Smarkm /* sometimes we don't want a mangled display */ 17757416Smarkm char *p; 17857416Smarkm if((p = getenv("DISPLAY"))) 17957416Smarkm env_define("DISPLAY", (unsigned char*)p); 18057416Smarkm break; 18157416Smarkm } 18257416Smarkm case 'E': 18357416Smarkm rlogin = escape = _POSIX_VDISABLE; 18457416Smarkm break; 18557416Smarkm case 'K': 18657416Smarkm#ifdef AUTHENTICATION 18757416Smarkm autologin = 0; 18857416Smarkm#endif 18957416Smarkm break; 19057416Smarkm case 'L': 19157416Smarkm eight |= 2; /* binary output only */ 19257416Smarkm break; 19357416Smarkm case 'S': 19457416Smarkm { 19557416Smarkm#ifdef HAVE_PARSETOS 19657416Smarkm extern int tos; 19757416Smarkm 19857416Smarkm if ((tos = parsetos(optarg, "tcp")) < 0) 19957416Smarkm fprintf(stderr, "%s%s%s%s\n", 20057416Smarkm prompt, ": Bad TOS argument '", 20157416Smarkm optarg, 20257416Smarkm "; will try to use default TOS"); 20357416Smarkm#else 20457416Smarkm fprintf(stderr, 20557416Smarkm "%s: Warning: -S ignored, no parsetos() support.\n", 20657416Smarkm prompt); 20757416Smarkm#endif 20857416Smarkm } 20957416Smarkm break; 21057416Smarkm case 'X': 21157416Smarkm#ifdef AUTHENTICATION 21257416Smarkm auth_disable_name(optarg); 21357416Smarkm#endif 21457416Smarkm break; 21557416Smarkm case 'a': 21657416Smarkm autologin = 1; 21757416Smarkm break; 21857416Smarkm case 'c': 21957416Smarkm skiprc = 1; 22057416Smarkm break; 22157416Smarkm case 'd': 22257416Smarkm debug = 1; 22357416Smarkm break; 22457416Smarkm case 'e': 22557416Smarkm set_escape_char(optarg); 22657416Smarkm break; 22757416Smarkm case 'f': 22857416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 22957416Smarkm if ((forward_flags & OPTS_FORWARD_CREDS) && 23057416Smarkm !default_forward) { 23157416Smarkm fprintf(stderr, 23257416Smarkm "%s: Only one of -f and -F allowed.\n", 23357416Smarkm prompt); 23457416Smarkm usage(); 23557416Smarkm } 23657416Smarkm forward_flags |= OPTS_FORWARD_CREDS; 23757416Smarkm#else 23857416Smarkm fprintf(stderr, 23957416Smarkm "%s: Warning: -f ignored, no Kerberos V5 support.\n", 24057416Smarkm prompt); 24157416Smarkm#endif 24257416Smarkm break; 24357416Smarkm case 'F': 24457416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 24557416Smarkm if ((forward_flags & OPTS_FORWARD_CREDS) && 24657416Smarkm !default_forward) { 24757416Smarkm fprintf(stderr, 24857416Smarkm "%s: Only one of -f and -F allowed.\n", 24957416Smarkm prompt); 25057416Smarkm usage(); 25157416Smarkm } 25257416Smarkm forward_flags |= OPTS_FORWARD_CREDS; 25357416Smarkm forward_flags |= OPTS_FORWARDABLE_CREDS; 25457416Smarkm#else 25557416Smarkm fprintf(stderr, 25657416Smarkm "%s: Warning: -F ignored, no Kerberos V5 support.\n", 25757416Smarkm prompt); 25857416Smarkm#endif 25957416Smarkm break; 26057416Smarkm case 'k': 26157416Smarkm#if defined(AUTHENTICATION) && defined(KRB4) 26257416Smarkm { 26357416Smarkm extern char *dest_realm, dst_realm_buf[]; 26457416Smarkm extern int dst_realm_sz; 26557416Smarkm dest_realm = dst_realm_buf; 26657416Smarkm strlcpy(dest_realm, optarg, dst_realm_sz); 26757416Smarkm } 26857416Smarkm#else 26957416Smarkm fprintf(stderr, 27057416Smarkm "%s: Warning: -k ignored, no Kerberos V4 support.\n", 27157416Smarkm prompt); 27257416Smarkm#endif 27357416Smarkm break; 27457416Smarkm case 'l': 27557416Smarkm if(autologin == 0){ 27657416Smarkm fprintf(stderr, "%s: Warning: -K ignored\n", prompt); 27757416Smarkm autologin = -1; 27857416Smarkm } 27957416Smarkm user = optarg; 28057416Smarkm break; 28157416Smarkm case 'n': 28257416Smarkm SetNetTrace(optarg); 28357416Smarkm break; 28457416Smarkm case 'r': 28557416Smarkm rlogin = '~'; 28657416Smarkm break; 28757416Smarkm case 'x': 28857416Smarkm#ifdef ENCRYPTION 28957416Smarkm encrypt_auto(1); 29057416Smarkm decrypt_auto(1); 29157416Smarkm EncryptVerbose(1); 29257416Smarkm#else 29357416Smarkm fprintf(stderr, 29457416Smarkm "%s: Warning: -x ignored, no ENCRYPT support.\n", 29557416Smarkm prompt); 29657416Smarkm#endif 29757416Smarkm break; 29857416Smarkm case 'G': 29957416Smarkm#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 30057416Smarkm forward_flags ^= OPTS_FORWARD_CREDS; 30157416Smarkm forward_flags ^= OPTS_FORWARDABLE_CREDS; 30257416Smarkm#else 30357416Smarkm fprintf(stderr, 30457416Smarkm "%s: Warning: -G ignored, no Kerberos V5 support.\n", 30557416Smarkm prompt); 30657416Smarkm#endif 30757416Smarkm break; 30857416Smarkm 30957416Smarkm case '?': 31057416Smarkm default: 31157416Smarkm usage(); 31257416Smarkm /* NOTREACHED */ 31357416Smarkm } 31457416Smarkm } 31557416Smarkm 31657416Smarkm if (autologin == -1) { /* esc@magic.fi; force */ 31757416Smarkm#if defined(AUTHENTICATION) 31857416Smarkm autologin = 1; 31957416Smarkm#endif 32057416Smarkm#if defined(ENCRYPTION) 32157416Smarkm encrypt_auto(1); 32257416Smarkm decrypt_auto(1); 32357416Smarkm#endif 32457416Smarkm } 32557416Smarkm 32657416Smarkm if (autologin == -1) 32757416Smarkm autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 32857416Smarkm 32957416Smarkm argc -= optind; 33057416Smarkm argv += optind; 33157416Smarkm 33257416Smarkm if (argc) { 33357416Smarkm char *args[7], **argp = args; 33457416Smarkm 33557416Smarkm if (argc > 2) 33657416Smarkm usage(); 33757416Smarkm *argp++ = prompt; 33857416Smarkm if (user) { 33957416Smarkm *argp++ = "-l"; 34057416Smarkm *argp++ = user; 34157416Smarkm } 34257416Smarkm *argp++ = argv[0]; /* host */ 34357416Smarkm if (argc > 1) 34457416Smarkm *argp++ = argv[1]; /* port */ 34557416Smarkm *argp = 0; 34657416Smarkm 34757416Smarkm if (setjmp(toplevel) != 0) 34857416Smarkm Exit(0); 34957416Smarkm if (tn(argp - args, args) == 1) 35057416Smarkm return (0); 35157416Smarkm else 35257416Smarkm return (1); 35357416Smarkm } 35457416Smarkm setjmp(toplevel); 35557416Smarkm for (;;) { 35657416Smarkm command(1, 0, 0); 35757416Smarkm } 35857416Smarkm} 359