main.c revision 47973
118334Speter/* 290075Sobrien * Copyright (c) 1988, 1990, 1993 390075Sobrien * The Regents of the University of California. All rights reserved. 418334Speter * 590075Sobrien * Redistribution and use in source and binary forms, with or without 618334Speter * modification, are permitted provided that the following conditions 790075Sobrien * are met: 890075Sobrien * 1. Redistributions of source code must retain the above copyright 990075Sobrien * notice, this list of conditions and the following disclaimer. 1090075Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1118334Speter * notice, this list of conditions and the following disclaimer in the 1290075Sobrien * documentation and/or other materials provided with the distribution. 1390075Sobrien * 3. All advertising materials mentioning features or use of this software 1490075Sobrien * must display the following acknowledgement: 1590075Sobrien * This product includes software developed by the University of 1618334Speter * California, Berkeley and its contributors. 1718334Speter * 4. Neither the name of the University nor the names of its contributors 1890075Sobrien * may be used to endorse or promote products derived from this software 1990075Sobrien * without specific prior written permission. 2090075Sobrien * 2118334Speter * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2218334Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2318334Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2418334Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2518334Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2618334Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2718334Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2818334Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2918334Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3050397Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3190075Sobrien * SUCH DAMAGE. 3218334Speter */ 3390075Sobrien 3490075Sobrien#ifndef lint 3518334Speterstatic const char copyright[] = 3690075Sobrien"@(#) Copyright (c) 1988, 1990, 1993\n\ 3718334Speter The Regents of the University of California. All rights reserved.\n"; 3890075Sobrien#endif /* not lint */ 3918334Speter 4018334Speter#ifndef lint 4150397Sobrienstatic const char sccsid[] = "@(#)main.c 8.3 (Berkeley) 5/30/95"; 4290075Sobrien#endif /* not lint */ 4390075Sobrien 4450397Sobrien#include <sys/types.h> 4590075Sobrien#include <stdlib.h> 4690075Sobrien 4790075Sobrien#include "ring.h" 4890075Sobrien#include "externs.h" 4996263Sobrien#include "defines.h" 5050397Sobrien 5118334Speter#if defined(AUTHENTICATION) 5218334Speter#include <libtelnet/auth.h> 5318334Speter#endif 5418334Speter#if defined(ENCRYPTION) 5518334Speter#include <libtelnet/encrypt.h> 5618334Speter#endif 5796263Sobrien 5818334Speter/* These values need to be the same as defined in libtelnet/kerberos5.c */ 5918334Speter/* Either define them in both places, or put in some common header file. */ 6018334Speter#define OPTS_FORWARD_CREDS 0x00000002 6118334Speter#define OPTS_FORWARDABLE_CREDS 0x00000001 6218334Speter 6318334Speter#if 0 6418334Speter#define FORWARD 6518334Speter#endif 6690075Sobrien 6718334Spetervoid init_terminal(void); 6818334Spetervoid init_network(void); 6918334Spetervoid init_telnet(void); 7018334Spetervoid init_sys(void); 7118334Spetervoid init_3270(void); 7218334Speter 7318334Speter/* 7418334Speter * Initialize variables. 7518334Speter */ 7618334Speter void 7718334Spetertninit() 7818334Speter{ 7918334Speter init_terminal(); 8018334Speter 8118334Speter init_network(); 8218334Speter 8318334Speter init_telnet(); 8418334Speter 8518334Speter init_sys(); 8618334Speter 8718334Speter#if defined(TN3270) 8818334Speter init_3270(); 8918334Speter#endif 9018334Speter} 9118334Speter 9218334Speter void 9318334Speterusage() 9418334Speter{ 9518334Speter fprintf(stderr, "Usage: %s %s%s%s%s\n", 9618334Speter prompt, 9718334Speter#ifdef AUTHENTICATION 9818334Speter "[-8] [-E] [-K] [-L] [-N] [-S tos] [-X atype] [-a] [-c] [-d]", 9918334Speter "\n\t[-e char] [-k realm] [-l user] [-f/-F] [-n tracefile] ", 10018334Speter#else 10118334Speter "[-8] [-E] [-L] [-N] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", 10290075Sobrien "\n\t[-n tracefile] ", 10318334Speter#endif 10418334Speter#if defined(TN3270) && defined(unix) 10590075Sobrien# ifdef AUTHENTICATION 10690075Sobrien "[-noasynch] [-noasynctty]\n\t" 10790075Sobrien "[-noasyncnet] [-r] [-s src_addr] [-t transcom] ", 10890075Sobrien# else 10990075Sobrien "[-noasynch] [-noasynctty] [-noasyncnet] [-r]\n\t" 11090075Sobrien "[-s src_addr] [-t transcom]", 11190075Sobrien# endif 11290075Sobrien#else 11318334Speter "[-r] [-s src_addr] ", 11418334Speter#endif 11518334Speter#ifdef ENCRYPTION 11618334Speter "[-x] [host-name [port]]" 11718334Speter#else /* ENCRYPTION */ 11818334Speter "[host-name [port]]" 11918334Speter#endif /* ENCRYPTION */ 12018334Speter ); 12118334Speter exit(1); 12218334Speter} 12318334Speter 12418334Speter/* 12518334Speter * main. Parse arguments, invoke the protocol or command parser. 12618334Speter */ 12718334Speter 12818334Speter int 12918334Spetermain(argc, argv) 13018334Speter int argc; 13118334Speter char *argv[]; 13218334Speter{ 13318334Speter extern char *optarg; 13418334Speter extern int optind; 13518334Speter int ch; 13618334Speter char *user, *strrchr(); 13718334Speter char *src_addr = NULL; 13896263Sobrien#ifdef FORWARD 13996263Sobrien extern int forward_flags; 14096263Sobrien#endif /* FORWARD */ 14196263Sobrien 14296263Sobrien tninit(); /* Clear out things */ 14318334Speter#if defined(CRAY) && !defined(__STDC__) 14418334Speter _setlist_init(); /* Work around compiler bug */ 14518334Speter#endif 14618334Speter 14718334Speter TerminalSaveState(); 14818334Speter 14918334Speter if ((prompt = strrchr(argv[0], '/'))) 15018334Speter ++prompt; 15118334Speter else 15218334Speter prompt = argv[0]; 15318334Speter 15418334Speter user = NULL; 15518334Speter 15618334Speter rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; 15718334Speter autologin = -1; 15818334Speter 15918334Speter while ((ch = getopt(argc, argv, "8EKLNS:X:acde:fFk:l:n:rs:t:x")) != EOF) { 16018334Speter switch(ch) { 16118334Speter case '8': 16218334Speter eight = 3; /* binary output and input */ 16318334Speter break; 16418334Speter case 'E': 16518334Speter rlogin = escape = _POSIX_VDISABLE; 16618334Speter break; 16718334Speter case 'K': 16818334Speter#ifdef AUTHENTICATION 16918334Speter autologin = 0; 17018334Speter#endif 17118334Speter break; 17218334Speter case 'L': 17318334Speter eight |= 2; /* binary output only */ 17418334Speter break; 17518334Speter case 'N': 17618334Speter doaddrlookup = 0; 17718334Speter break; 17818334Speter case 'S': 17918334Speter { 18018334Speter#ifdef HAS_GETTOS 18118334Speter extern int tos; 18218334Speter 18318334Speter if ((tos = parsetos(optarg, "tcp")) < 0) 18418334Speter fprintf(stderr, "%s%s%s%s\n", 18518334Speter prompt, ": Bad TOS argument '", 18618334Speter optarg, 18718334Speter "; will try to use default TOS"); 18818334Speter#else 18918334Speter fprintf(stderr, 19018334Speter "%s: Warning: -S ignored, no parsetos() support.\n", 19118334Speter prompt); 19218334Speter#endif 19318334Speter } 19418334Speter break; 19518334Speter case 'X': 19618334Speter#ifdef AUTHENTICATION 19718334Speter auth_disable_name(optarg); 19818334Speter#endif 19918334Speter break; 20018334Speter case 'a': 20118334Speter autologin = 1; 20218334Speter break; 20318334Speter case 'c': 20418334Speter skiprc = 1; 20518334Speter break; 20618334Speter case 'd': 20718334Speter debug = 1; 20818334Speter break; 20918334Speter case 'e': 21018334Speter set_escape_char(optarg); 21118334Speter break; 21218334Speter case 'f': 21318334Speter#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 21418334Speter if (forward_flags & OPTS_FORWARD_CREDS) { 21518334Speter fprintf(stderr, 21618334Speter "%s: Only one of -f and -F allowed.\n", 21718334Speter prompt); 21818334Speter usage(); 21990075Sobrien } 22018334Speter forward_flags |= OPTS_FORWARD_CREDS; 22118334Speter#else 22218334Speter fprintf(stderr, 22318334Speter "%s: Warning: -f ignored, no Kerberos V5 support.\n", 22418334Speter prompt); 22518334Speter#endif 22618334Speter break; 22718334Speter case 'F': 22818334Speter#if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 22918334Speter if (forward_flags & OPTS_FORWARD_CREDS) { 23090075Sobrien fprintf(stderr, 23118334Speter "%s: Only one of -f and -F allowed.\n", 23218334Speter prompt); 23318334Speter usage(); 23418334Speter } 23518334Speter forward_flags |= OPTS_FORWARD_CREDS; 23618334Speter forward_flags |= OPTS_FORWARDABLE_CREDS; 23718334Speter#else 23818334Speter fprintf(stderr, 23918334Speter "%s: Warning: -F ignored, no Kerberos V5 support.\n", 24018334Speter prompt); 24118334Speter#endif 24218334Speter break; 24318334Speter case 'k': 24418334Speter#if defined(AUTHENTICATION) && defined(KRB4) 24518334Speter { 24618334Speter extern char *dest_realm, dst_realm_buf[], dst_realm_sz; 24718334Speter dest_realm = dst_realm_buf; 24818334Speter (void)strncpy(dest_realm, optarg, dst_realm_sz); 24918334Speter } 25018334Speter#else 25118334Speter fprintf(stderr, 25218334Speter "%s: Warning: -k ignored, no Kerberos V4 support.\n", 25318334Speter prompt); 25418334Speter#endif 25518334Speter break; 25618334Speter case 'l': 25718334Speter autologin = 1; 25818334Speter user = optarg; 25990075Sobrien break; 26018334Speter case 'n': 26118334Speter#if defined(TN3270) && defined(unix) 26218334Speter /* distinguish between "-n oasynch" and "-noasynch" */ 26318334Speter if (argv[optind - 1][0] == '-' && argv[optind - 1][1] 26418334Speter == 'n' && argv[optind - 1][2] == 'o') { 26518334Speter if (!strcmp(optarg, "oasynch")) { 26618334Speter noasynchtty = 1; 26718334Speter noasynchnet = 1; 26818334Speter } else if (!strcmp(optarg, "oasynchtty")) 26918334Speter noasynchtty = 1; 27018334Speter else if (!strcmp(optarg, "oasynchnet")) 27118334Speter noasynchnet = 1; 27218334Speter } else 27318334Speter#endif /* defined(TN3270) && defined(unix) */ 27490075Sobrien SetNetTrace(optarg); 27590075Sobrien break; 27690075Sobrien case 'r': 27790075Sobrien rlogin = '~'; 27890075Sobrien break; 27990075Sobrien case 's': 28090075Sobrien src_addr = optarg; 28190075Sobrien break; 28290075Sobrien case 't': 28390075Sobrien#if defined(TN3270) && defined(unix) 28490075Sobrien transcom = tline; 28596263Sobrien (void)strcpy(transcom, optarg); 28690075Sobrien#else 28790075Sobrien fprintf(stderr, 28890075Sobrien "%s: Warning: -t ignored, no TN3270 support.\n", 28990075Sobrien prompt); 29090075Sobrien#endif 29118334Speter break; 29218334Speter case 'x': 29318334Speter#ifdef ENCRYPTION 29418334Speter encrypt_auto(1); 29590075Sobrien decrypt_auto(1); 29618334Speter#else /* ENCRYPTION */ 29718334Speter fprintf(stderr, 29818334Speter "%s: Warning: -x ignored, no ENCRYPT support.\n", 29918334Speter prompt); 30018334Speter#endif /* ENCRYPTION */ 30118334Speter break; 30218334Speter case '?': 30390075Sobrien default: 30418334Speter usage(); 30590075Sobrien /* NOTREACHED */ 30618334Speter } 30790075Sobrien } 30818334Speter if (autologin == -1) 30990075Sobrien autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 31018334Speter 31190075Sobrien argc -= optind; 31218334Speter argv += optind; 31390075Sobrien 31418334Speter if (argc) { 31550397Sobrien char *args[9], **argp = args; 31650397Sobrien 31750397Sobrien if (argc > 2) 31850397Sobrien usage(); 31990075Sobrien *argp++ = prompt; 32090075Sobrien if (user) { 32190075Sobrien *argp++ = "-l"; 32290075Sobrien *argp++ = user; 32390075Sobrien } 32418334Speter if (src_addr) { 32550397Sobrien *argp++ = "-s"; 32618334Speter *argp++ = src_addr; 32718334Speter } 32896263Sobrien *argp++ = argv[0]; /* host */ 32918334Speter if (argc > 1) 33018334Speter *argp++ = argv[1]; /* port */ 33118334Speter *argp = 0; 33218334Speter 33390075Sobrien if (setjmp(toplevel) != 0) 33418334Speter Exit(0); 33550397Sobrien if (tn(argp - args, args) == 1) 33618334Speter return (0); 33750397Sobrien else 33850397Sobrien return (1); 33950397Sobrien } 34050397Sobrien (void)setjmp(toplevel); 34150397Sobrien for (;;) { 34290075Sobrien#ifdef TN3270 34350397Sobrien if (shell_active) 34490075Sobrien shell_continue(); 34550397Sobrien else 34618334Speter#endif 34718334Speter command(1, 0, 0); 34818334Speter } 34918334Speter return 0; 35052284Sobrien} 35118334Speter