129088Smarkm/* 229088Smarkm * Copyright (c) 1988, 1990, 1993 329088Smarkm * The Regents of the University of California. All rights reserved. 429088Smarkm * 529088Smarkm * Redistribution and use in source and binary forms, with or without 629088Smarkm * modification, are permitted provided that the following conditions 729088Smarkm * are met: 829088Smarkm * 1. Redistributions of source code must retain the above copyright 929088Smarkm * notice, this list of conditions and the following disclaimer. 1029088Smarkm * 2. Redistributions in binary form must reproduce the above copyright 1129088Smarkm * notice, this list of conditions and the following disclaimer in the 1229088Smarkm * documentation and/or other materials provided with the distribution. 1329088Smarkm * 3. All advertising materials mentioning features or use of this software 1429088Smarkm * must display the following acknowledgement: 1529088Smarkm * This product includes software developed by the University of 1629088Smarkm * California, Berkeley and its contributors. 1729088Smarkm * 4. Neither the name of the University nor the names of its contributors 1829088Smarkm * may be used to endorse or promote products derived from this software 1929088Smarkm * without specific prior written permission. 2029088Smarkm * 2129088Smarkm * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2229088Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2329088Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2429088Smarkm * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2529088Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2629088Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2729088Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2829088Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2929088Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3029088Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3129088Smarkm * SUCH DAMAGE. 3229088Smarkm */ 3329088Smarkm 34114630Sobrien#if 0 3529088Smarkm#ifndef lint 3629181Smarkmstatic const char sccsid[] = "@(#)main.c 8.3 (Berkeley) 5/30/95"; 3787139Smarkm#endif 38114630Sobrien#endif 39114630Sobrien#include <sys/cdefs.h> 40114630Sobrien__FBSDID("$FreeBSD$"); 4129088Smarkm 42139937Smaxim#include <sys/param.h> 4356668Sshin#include <sys/socket.h> 4429181Smarkm#include <stdlib.h> 4581965Smarkm#include <string.h> 4681965Smarkm#include <unistd.h> 4729088Smarkm 4829088Smarkm#include "ring.h" 4929088Smarkm#include "externs.h" 5029088Smarkm#include "defines.h" 5129088Smarkm 5287139Smarkm#ifdef AUTHENTICATION 5329181Smarkm#include <libtelnet/auth.h> 5429181Smarkm#endif 5587139Smarkm#ifdef ENCRYPTION 5629181Smarkm#include <libtelnet/encrypt.h> 5729181Smarkm#endif 5829181Smarkm 5929088Smarkm/* These values need to be the same as defined in libtelnet/kerberos5.c */ 6029088Smarkm/* Either define them in both places, or put in some common header file. */ 6129088Smarkm#define OPTS_FORWARD_CREDS 0x00000002 6229088Smarkm#define OPTS_FORWARDABLE_CREDS 0x00000001 6329088Smarkm 6456668Sshin#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) 6556668Sshinchar *ipsec_policy_in = NULL; 6656668Sshinchar *ipsec_policy_out = NULL; 6756668Sshin#endif 6856668Sshin 69139937Smaximextern int tos; 70139937Smaxim 7156668Sshinint family = AF_UNSPEC; 7256668Sshin 7329088Smarkm/* 7429088Smarkm * Initialize variables. 7529088Smarkm */ 7687139Smarkmvoid 7787139Smarkmtninit(void) 7829088Smarkm{ 7929088Smarkm init_terminal(); 8029088Smarkm 8129088Smarkm init_network(); 8229088Smarkm 8329088Smarkm init_telnet(); 8429088Smarkm 8529088Smarkm init_sys(); 8629088Smarkm} 8729088Smarkm 8887139Smarkmstatic void 8987139Smarkmusage(void) 9029088Smarkm{ 91103955Smarkm fprintf(stderr, "usage: %s %s%s%s%s\n", 9229088Smarkm prompt, 9329088Smarkm#ifdef AUTHENTICATION 94275508Sngie "[-4] [-6] [-8] [-B baudrate] [-E] [-K] [-L] [-N] [-S tos] [-X atype]", 95275508Sngie "\n\t[-c] [-d] [-e char] [-k realm] [-l user] [-f/-F] [-n tracefile] ", 9629088Smarkm#else 97275508Sngie "[-4] [-6] [-8] [-B baudrate] [-E] [-L] [-N] [-S tos] [-c] [-d]", 9879323Sru "\n\t[-e char] [-l user] [-n tracefile] ", 9929088Smarkm#endif 10079323Sru "[-r] [-s src_addr] [-u] ", 10156668Sshin#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) 10279323Sru "[-P policy] " 10356668Sshin#endif 10429088Smarkm#ifdef ENCRYPTION 10575263Snsayer "[-y] [host-name [port]]" 10629088Smarkm#else /* ENCRYPTION */ 10729088Smarkm "[host-name [port]]" 10829088Smarkm#endif /* ENCRYPTION */ 10929088Smarkm ); 11029088Smarkm exit(1); 11129088Smarkm} 11229088Smarkm 11329088Smarkm/* 11429088Smarkm * main. Parse arguments, invoke the protocol or command parser. 11529088Smarkm */ 11629088Smarkm 11787139Smarkmint 11887139Smarkmmain(int argc, char *argv[]) 11929088Smarkm{ 120139937Smaxim u_long ultmp; 12129088Smarkm int ch; 122139937Smaxim char *ep, *user; 12347973Sru char *src_addr = NULL; 12429088Smarkm#ifdef FORWARD 12529088Smarkm extern int forward_flags; 12629088Smarkm#endif /* FORWARD */ 12729088Smarkm 12829088Smarkm tninit(); /* Clear out things */ 12929088Smarkm 13029088Smarkm TerminalSaveState(); 13129088Smarkm 13229181Smarkm if ((prompt = strrchr(argv[0], '/'))) 13329088Smarkm ++prompt; 13429088Smarkm else 13529088Smarkm prompt = argv[0]; 13629088Smarkm 13729088Smarkm user = NULL; 13829088Smarkm 13929088Smarkm rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; 14081965Smarkm#ifdef AUTHENTICATION 14175263Snsayer autologin = 1; 14281965Smarkm#else 14381965Smarkm autologin = -1; 14481965Smarkm#endif 14529088Smarkm 14687139Smarkm#ifdef ENCRYPTION 14775263Snsayer encrypt_auto(1); 14875263Snsayer decrypt_auto(1); 14975263Snsayer#endif 15075263Snsayer 15156668Sshin#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) 15256668Sshin#define IPSECOPT "P:" 15356668Sshin#else 15456668Sshin#define IPSECOPT 15556668Sshin#endif 15656668Sshin while ((ch = getopt(argc, argv, 157275508Sngie "468B:EKLNS:X:acde:fFk:l:n:rs:uxy" IPSECOPT)) != -1) 15856668Sshin#undef IPSECOPT 15956668Sshin { 16029088Smarkm switch(ch) { 16156668Sshin case '4': 16256668Sshin family = AF_INET; 16356668Sshin break; 16456668Sshin#ifdef INET6 16556668Sshin case '6': 16656668Sshin family = AF_INET6; 16756668Sshin break; 16856668Sshin#endif 16929088Smarkm case '8': 17029088Smarkm eight = 3; /* binary output and input */ 17129088Smarkm break; 172275508Sngie case 'B': 173275508Sngie DoBaudRate(optarg); 174275508Sngie break; 17529088Smarkm case 'E': 17629088Smarkm rlogin = escape = _POSIX_VDISABLE; 17729088Smarkm break; 17829088Smarkm case 'K': 17929088Smarkm#ifdef AUTHENTICATION 18029088Smarkm autologin = 0; 18129088Smarkm#endif 18229088Smarkm break; 18329088Smarkm case 'L': 18429088Smarkm eight |= 2; /* binary output only */ 18529088Smarkm break; 18647973Sru case 'N': 18747973Sru doaddrlookup = 0; 18847973Sru break; 18929088Smarkm case 'S': 19029088Smarkm#ifdef HAS_GETTOS 19129088Smarkm 19229088Smarkm if ((tos = parsetos(optarg, "tcp")) < 0) 19329088Smarkm fprintf(stderr, "%s%s%s%s\n", 19429088Smarkm prompt, ": Bad TOS argument '", 19529088Smarkm optarg, 19629088Smarkm "; will try to use default TOS"); 19729088Smarkm#else 198139937Smaxim#define MAXTOS 255 199139937Smaxim ultmp = strtoul(optarg, &ep, 0); 200139937Smaxim if (*ep || ep == optarg || ultmp > MAXTOS) 201139937Smaxim fprintf(stderr, "%s%s%s%s\n", 202139937Smaxim prompt, ": Bad TOS argument '", 203139937Smaxim optarg, 204139937Smaxim "; will try to use default TOS"); 205139937Smaxim else 206139937Smaxim tos = ultmp; 20729088Smarkm#endif 20829088Smarkm break; 20929088Smarkm case 'X': 21029088Smarkm#ifdef AUTHENTICATION 21129088Smarkm auth_disable_name(optarg); 21229088Smarkm#endif 21329088Smarkm break; 21429088Smarkm case 'a': 21581965Smarkm#ifdef AUTHENTICATION 21675263Snsayer /* It's the default now, so ignore */ 21781965Smarkm#else 21881965Smarkm autologin = 1; 21981965Smarkm#endif 22029088Smarkm break; 22129088Smarkm case 'c': 22229088Smarkm skiprc = 1; 22329088Smarkm break; 22429088Smarkm case 'd': 225114911Smarkm telnet_debug = 1; 22629088Smarkm break; 22729088Smarkm case 'e': 22829088Smarkm set_escape_char(optarg); 22929088Smarkm break; 23029088Smarkm case 'f': 23187139Smarkm#ifdef AUTHENTICATION 23287139Smarkm#if defined(KRB5) && defined(FORWARD) 23329088Smarkm if (forward_flags & OPTS_FORWARD_CREDS) { 23429088Smarkm fprintf(stderr, 23529088Smarkm "%s: Only one of -f and -F allowed.\n", 23629088Smarkm prompt); 23729088Smarkm usage(); 23829088Smarkm } 23929088Smarkm forward_flags |= OPTS_FORWARD_CREDS; 24029088Smarkm#else 24129088Smarkm fprintf(stderr, 24229088Smarkm "%s: Warning: -f ignored, no Kerberos V5 support.\n", 24329088Smarkm prompt); 24429088Smarkm#endif 24587139Smarkm#else 24687139Smarkm fprintf(stderr, 24787139Smarkm "%s: Warning: -f ignored, no Kerberos V5 support.\n", 24887139Smarkm prompt); 24987139Smarkm#endif 25029088Smarkm break; 25129088Smarkm case 'F': 25287139Smarkm#ifdef AUTHENTICATION 25387139Smarkm#if defined(KRB5) && defined(FORWARD) 25429088Smarkm if (forward_flags & OPTS_FORWARD_CREDS) { 25529088Smarkm fprintf(stderr, 25629088Smarkm "%s: Only one of -f and -F allowed.\n", 25729088Smarkm prompt); 25829088Smarkm usage(); 25929088Smarkm } 26029088Smarkm forward_flags |= OPTS_FORWARD_CREDS; 26129088Smarkm forward_flags |= OPTS_FORWARDABLE_CREDS; 26229088Smarkm#else 26329088Smarkm fprintf(stderr, 26429088Smarkm "%s: Warning: -F ignored, no Kerberos V5 support.\n", 26529088Smarkm prompt); 26629088Smarkm#endif 26787139Smarkm#else 26887139Smarkm fprintf(stderr, 26987139Smarkm "%s: Warning: -F ignored, no Kerberos V5 support.\n", 27087139Smarkm prompt); 27187139Smarkm#endif 27229088Smarkm break; 27329088Smarkm case 'k': 27487139Smarkm#ifdef AUTHENTICATION 27587139Smarkm#if defined(KRB4) 27629088Smarkm { 27729088Smarkm extern char *dest_realm, dst_realm_buf[], dst_realm_sz; 27829088Smarkm dest_realm = dst_realm_buf; 27929088Smarkm (void)strncpy(dest_realm, optarg, dst_realm_sz); 28029088Smarkm } 28129088Smarkm#else 28229088Smarkm fprintf(stderr, 28329088Smarkm "%s: Warning: -k ignored, no Kerberos V4 support.\n", 28429088Smarkm prompt); 28529088Smarkm#endif 28687139Smarkm#else 28787139Smarkm fprintf(stderr, 28887139Smarkm "%s: Warning: -k ignored, no Kerberos V4 support.\n", 28987139Smarkm prompt); 29087139Smarkm#endif 29129088Smarkm break; 29229088Smarkm case 'l': 29381965Smarkm#ifdef AUTHENTICATION 29481965Smarkm /* This is the default now, so ignore it */ 29581965Smarkm#else 29681965Smarkm autologin = 1; 29781965Smarkm#endif 29829088Smarkm user = optarg; 29929088Smarkm break; 30029088Smarkm case 'n': 30129088Smarkm SetNetTrace(optarg); 30229088Smarkm break; 30329088Smarkm case 'r': 30429088Smarkm rlogin = '~'; 30529088Smarkm break; 30647973Sru case 's': 30747973Sru src_addr = optarg; 30847973Sru break; 30979323Sru case 'u': 31079323Sru family = AF_UNIX; 31179323Sru break; 31229088Smarkm case 'x': 31387139Smarkm#ifndef ENCRYPTION 31481965Smarkm fprintf(stderr, 31581965Smarkm "%s: Warning: -x ignored, no ENCRYPT support.\n", 31681965Smarkm prompt); 31781965Smarkm#endif /* ENCRYPTION */ 31875263Snsayer break; 31975263Snsayer case 'y': 32029088Smarkm#ifdef ENCRYPTION 32175263Snsayer encrypt_auto(0); 32275263Snsayer decrypt_auto(0); 32381965Smarkm#else 32481965Smarkm fprintf(stderr, 32581965Smarkm "%s: Warning: -y ignored, no ENCRYPT support.\n", 32681965Smarkm prompt); 32729088Smarkm#endif /* ENCRYPTION */ 32829088Smarkm break; 32956668Sshin#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC) 33056668Sshin case 'P': 33156668Sshin if (!strncmp("in", optarg, 2)) 33256668Sshin ipsec_policy_in = strdup(optarg); 33356668Sshin else if (!strncmp("out", optarg, 3)) 33456668Sshin ipsec_policy_out = strdup(optarg); 33556668Sshin else 33656668Sshin usage(); 33756668Sshin break; 33856668Sshin#endif 33929088Smarkm case '?': 34029088Smarkm default: 34129088Smarkm usage(); 34229088Smarkm /* NOTREACHED */ 34329088Smarkm } 34429088Smarkm } 34581965Smarkm if (autologin == -1) 34681965Smarkm autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 34774138Sassar 34829088Smarkm argc -= optind; 34929088Smarkm argv += optind; 35029088Smarkm 35129088Smarkm if (argc) { 35247973Sru char *args[9], **argp = args; 35329088Smarkm 35429088Smarkm if (argc > 2) 35529088Smarkm usage(); 35629088Smarkm *argp++ = prompt; 35729088Smarkm if (user) { 35887139Smarkm *argp++ = strdup("-l"); 35929088Smarkm *argp++ = user; 36029088Smarkm } 36147973Sru if (src_addr) { 36287139Smarkm *argp++ = strdup("-s"); 36347973Sru *argp++ = src_addr; 36447973Sru } 36529088Smarkm *argp++ = argv[0]; /* host */ 36629088Smarkm if (argc > 1) 36729088Smarkm *argp++ = argv[1]; /* port */ 36829088Smarkm *argp = 0; 36929088Smarkm 37029088Smarkm if (setjmp(toplevel) != 0) 37129088Smarkm Exit(0); 37229088Smarkm if (tn(argp - args, args) == 1) 37329088Smarkm return (0); 37429088Smarkm else 37529088Smarkm return (1); 37629088Smarkm } 37729088Smarkm (void)setjmp(toplevel); 37829088Smarkm for (;;) { 37929088Smarkm command(1, 0, 0); 38029088Smarkm } 38129181Smarkm return 0; 38229088Smarkm} 383