133685Sbostic /* 262311Sbostic * Copyright (c) 1988, 1990, 1993 362311Sbostic * The Regents of the University of California. All rights reserved. 433685Sbostic * 542770Sbostic * %sccs.include.redist.c% 633685Sbostic */ 733685Sbostic 833685Sbostic #ifndef lint 962311Sbostic static char copyright[] = 1062311Sbostic "@(#) Copyright (c) 1988, 1990, 1993\n\ 1162311Sbostic The Regents of the University of California. All rights reserved.\n"; 1233685Sbostic #endif /* not lint */ 1333685Sbostic 1433685Sbostic #ifndef lint 15*65157Sdab static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 12/15/93"; 1633685Sbostic #endif /* not lint */ 1733685Sbostic 1832381Sminshall #include <sys/types.h> 1932381Sminshall 2032381Sminshall #include "ring.h" 2132145Sminshall #include "externs.h" 2232145Sminshall #include "defines.h" 2332145Sminshall 24*65157Sdab /* These values need to be the same as defined in libtelnet/kerberos5.c */ 25*65157Sdab /* Either define them in both places, or put in some common header file. */ 26*65157Sdab #define OPTS_FORWARD_CREDS 0x00000002 27*65157Sdab #define OPTS_FORWARDABLE_CREDS 0x00000001 28*65157Sdab 29*65157Sdab #if 0 30*65157Sdab #define FORWARD 31*65157Sdab #endif 32*65157Sdab 3332145Sminshall /* 3432145Sminshall * Initialize variables. 3532145Sminshall */ 3646808Sdab void 3732145Sminshall tninit() 3832145Sminshall { 3945233Sborman init_terminal(); 4045233Sborman 4145233Sborman init_network(); 4245233Sborman 4345233Sborman init_telnet(); 4445233Sborman 4545233Sborman init_sys(); 4645233Sborman 4745233Sborman #if defined(TN3270) 4845233Sborman init_3270(); 4945233Sborman #endif 5032145Sminshall } 5132145Sminshall 5246808Sdab void 5346808Sdab usage() 5446808Sdab { 5546808Sdab fprintf(stderr, "Usage: %s %s%s%s%s\n", 5646808Sdab prompt, 5757213Sdab #ifdef AUTHENTICATION 5860149Sdab "[-8] [-E] [-K] [-L] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]", 59*65157Sdab "\n\t[-k realm] [-l user] [-f/-F] [-n tracefile] ", 6046808Sdab #else 6160149Sdab "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", 6260149Sdab "\n\t[-n tracefile]", 6346808Sdab #endif 6446808Sdab #if defined(TN3270) && defined(unix) 6557213Sdab # ifdef AUTHENTICATION 6660149Sdab "[-noasynch] [-noasynctty]\n\t[-noasyncnet] [-r] [-t transcom] ", 6746808Sdab # else 6860149Sdab "[-noasynch] [-noasynctty] [-noasyncnet] [-r]\n\t[-t transcom]", 6946808Sdab # endif 7046808Sdab #else 7146808Sdab "[-r] ", 7246808Sdab #endif 7357213Sdab #ifdef ENCRYPTION 7446808Sdab "[-x] [host-name [port]]" 7560149Sdab #else /* ENCRYPTION */ 7646808Sdab "[host-name [port]]" 7760149Sdab #endif /* ENCRYPTION */ 7846808Sdab ); 7946808Sdab exit(1); 8046808Sdab } 8132145Sminshall 8232145Sminshall /* 8332145Sminshall * main. Parse arguments, invoke the protocol or command parser. 8432145Sminshall */ 8545233Sborman 8645233Sborman 8732145Sminshall main(argc, argv) 8832145Sminshall int argc; 8932145Sminshall char *argv[]; 9032145Sminshall { 9145008Skarels extern char *optarg; 9245008Skarels extern int optind; 9345008Skarels int ch; 9445233Sborman char *user, *strrchr(); 95*65157Sdab #ifdef FORWARD 96*65157Sdab extern int forward_flags; 97*65157Sdab #endif /* FORWARD */ 9844361Sborman 9945008Skarels tninit(); /* Clear out things */ 10045233Sborman #if defined(CRAY) && !defined(__STDC__) 10145008Skarels _setlist_init(); /* Work around compiler bug */ 10238689Sborman #endif 10345233Sborman 10445008Skarels TerminalSaveState(); 10532145Sminshall 10645233Sborman if (prompt = strrchr(argv[0], '/')) 10745008Skarels ++prompt; 10845008Skarels else 10945008Skarels prompt = argv[0]; 11032145Sminshall 11145008Skarels user = NULL; 11246808Sdab 11346808Sdab rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; 11446808Sdab autologin = -1; 11546808Sdab 116*65157Sdab while ((ch = getopt(argc, argv, "8EKLS:X:acde:fFk:l:n:rt:x")) != EOF) { 11745008Skarels switch(ch) { 11846808Sdab case '8': 11946808Sdab eight = 3; /* binary output and input */ 12046808Sdab break; 12146808Sdab case 'E': 12246808Sdab rlogin = escape = _POSIX_VDISABLE; 12346808Sdab break; 12446808Sdab case 'K': 12557213Sdab #ifdef AUTHENTICATION 12646808Sdab autologin = 0; 12746808Sdab #endif 12846808Sdab break; 12946808Sdab case 'L': 13046808Sdab eight |= 2; /* binary output only */ 13146808Sdab break; 13246815Sdab case 'S': 13346815Sdab { 13446815Sdab #ifdef HAS_GETTOS 13546815Sdab extern int tos; 13646815Sdab 13746815Sdab if ((tos = parsetos(optarg, "tcp")) < 0) 13846815Sdab fprintf(stderr, "%s%s%s%s\n", 13946815Sdab prompt, ": Bad TOS argument '", 14046815Sdab optarg, 14146815Sdab "; will try to use default TOS"); 14246815Sdab #else 14346815Sdab fprintf(stderr, 14446815Sdab "%s: Warning: -S ignored, no parsetos() support.\n", 14546815Sdab prompt); 14646815Sdab #endif 14746815Sdab } 14846815Sdab break; 14946808Sdab case 'X': 15057213Sdab #ifdef AUTHENTICATION 15146808Sdab auth_disable_name(optarg); 15246808Sdab #endif 15346808Sdab break; 15445008Skarels case 'a': 15545008Skarels autologin = 1; 15645008Skarels break; 15747608Sdab case 'c': 15847608Sdab skiprc = 1; 15947608Sdab break; 16045008Skarels case 'd': 16145008Skarels debug = 1; 16245008Skarels break; 16345008Skarels case 'e': 16445008Skarels set_escape_char(optarg); 16545008Skarels break; 166*65157Sdab case 'f': 167*65157Sdab #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 168*65157Sdab if (forward_flags & OPTS_FORWARD_CREDS) { 169*65157Sdab fprintf(stderr, 170*65157Sdab "%s: Only one of -f and -F allowed.\n", 171*65157Sdab prompt); 172*65157Sdab usage(); 173*65157Sdab } 174*65157Sdab forward_flags |= OPTS_FORWARD_CREDS; 175*65157Sdab #else 176*65157Sdab fprintf(stderr, 177*65157Sdab "%s: Warning: -f ignored, no Kerberos V5 support.\n", 178*65157Sdab prompt); 179*65157Sdab #endif 180*65157Sdab break; 181*65157Sdab case 'F': 182*65157Sdab #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD) 183*65157Sdab if (forward_flags & OPTS_FORWARD_CREDS) { 184*65157Sdab fprintf(stderr, 185*65157Sdab "%s: Only one of -f and -F allowed.\n", 186*65157Sdab prompt); 187*65157Sdab usage(); 188*65157Sdab } 189*65157Sdab forward_flags |= OPTS_FORWARD_CREDS; 190*65157Sdab forward_flags |= OPTS_FORWARDABLE_CREDS; 191*65157Sdab #else 192*65157Sdab fprintf(stderr, 193*65157Sdab "%s: Warning: -F ignored, no Kerberos V5 support.\n", 194*65157Sdab prompt); 195*65157Sdab #endif 196*65157Sdab break; 19746808Sdab case 'k': 19857213Sdab #if defined(AUTHENTICATION) && defined(KRB4) 19946808Sdab { 20046808Sdab extern char *dest_realm, dst_realm_buf[], dst_realm_sz; 20146808Sdab dest_realm = dst_realm_buf; 20246808Sdab (void)strncpy(dest_realm, optarg, dst_realm_sz); 20346808Sdab } 20446808Sdab #else 20546808Sdab fprintf(stderr, 20646808Sdab "%s: Warning: -k ignored, no Kerberos V4 support.\n", 20746808Sdab prompt); 20846808Sdab #endif 20946808Sdab break; 21045008Skarels case 'l': 21145008Skarels autologin = 1; 21245008Skarels user = optarg; 21345008Skarels break; 21445008Skarels case 'n': 21545008Skarels #if defined(TN3270) && defined(unix) 21645008Skarels /* distinguish between "-n oasynch" and "-noasynch" */ 21745008Skarels if (argv[optind - 1][0] == '-' && argv[optind - 1][1] 21845008Skarels == 'n' && argv[optind - 1][2] == 'o') { 21945008Skarels if (!strcmp(optarg, "oasynch")) { 22045008Skarels noasynchtty = 1; 22145008Skarels noasynchnet = 1; 22245008Skarels } else if (!strcmp(optarg, "oasynchtty")) 22345008Skarels noasynchtty = 1; 22445233Sborman else if (!strcmp(optarg, "oasynchnet")) 22545008Skarels noasynchnet = 1; 22645008Skarels } else 22745008Skarels #endif /* defined(TN3270) && defined(unix) */ 22845008Skarels SetNetTrace(optarg); 22945008Skarels break; 23046808Sdab case 'r': 23146808Sdab rlogin = '~'; 23246808Sdab break; 23346808Sdab case 't': 23445008Skarels #if defined(TN3270) && defined(unix) 23545008Skarels transcom = tline; 23645008Skarels (void)strcpy(transcom, optarg); 23746808Sdab #else 23846808Sdab fprintf(stderr, 23946808Sdab "%s: Warning: -t ignored, no TN3270 support.\n", 24046808Sdab prompt); 24146808Sdab #endif 24245008Skarels break; 24346808Sdab case 'x': 24457213Sdab #ifdef ENCRYPTION 24547608Sdab encrypt_auto(1); 24647608Sdab decrypt_auto(1); 24760149Sdab #else /* ENCRYPTION */ 24846808Sdab fprintf(stderr, 24946808Sdab "%s: Warning: -x ignored, no ENCRYPT support.\n", 25046808Sdab prompt); 25160149Sdab #endif /* ENCRYPTION */ 25246808Sdab break; 25345008Skarels case '?': 25445008Skarels default: 25545008Skarels usage(); 25645008Skarels /* NOTREACHED */ 25732145Sminshall } 25845233Sborman } 25946808Sdab if (autologin == -1) 26046808Sdab autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 26146808Sdab 26245008Skarels argc -= optind; 26345008Skarels argv += optind; 26445008Skarels 26545008Skarels if (argc) { 26645008Skarels char *args[7], **argp = args; 26745008Skarels 26845008Skarels if (argc > 2) 26945008Skarels usage(); 27045008Skarels *argp++ = prompt; 27145008Skarels if (user) { 27245008Skarels *argp++ = "-l"; 27345008Skarels *argp++ = user; 27445008Skarels } 27545008Skarels *argp++ = argv[0]; /* host */ 27645008Skarels if (argc > 1) 27745008Skarels *argp++ = argv[1]; /* port */ 27845008Skarels *argp = 0; 27945008Skarels 28045008Skarels if (setjmp(toplevel) != 0) 28145008Skarels Exit(0); 28245008Skarels if (tn(argp - args, args) == 1) 28345008Skarels return (0); 28445008Skarels else 28545008Skarels return (1); 28632145Sminshall } 28745008Skarels (void)setjmp(toplevel); 28845233Sborman for (;;) { 28945008Skarels #ifdef TN3270 29045008Skarels if (shell_active) 29145008Skarels shell_continue(); 29245008Skarels else 29345008Skarels #endif 29445008Skarels command(1, 0, 0); 29545233Sborman } 29632145Sminshall } 297