133685Sbostic /* 245008Skarels * Copyright (c) 1988, 1990 Regents of the University of California. 333685Sbostic * All rights reserved. 433685Sbostic * 542770Sbostic * %sccs.include.redist.c% 633685Sbostic */ 733685Sbostic 833685Sbostic #ifndef lint 933685Sbostic char copyright[] = 1045008Skarels "@(#) Copyright (c) 1988, 1990 Regents of the University of California.\n\ 1133685Sbostic All rights reserved.\n"; 1233685Sbostic #endif /* not lint */ 1333685Sbostic 1433685Sbostic #ifndef lint 15*46815Sdab static char sccsid[] = "@(#)main.c 5.3 (Berkeley) 03/01/91"; 1633685Sbostic #endif /* not lint */ 1733685Sbostic 1832381Sminshall #include <sys/types.h> 1932381Sminshall 2032381Sminshall #include "ring.h" 2132145Sminshall #include "externs.h" 2232145Sminshall #include "defines.h" 2332145Sminshall 2432145Sminshall /* 2532145Sminshall * Initialize variables. 2632145Sminshall */ 2746808Sdab void 2832145Sminshall tninit() 2932145Sminshall { 3045233Sborman init_terminal(); 3145233Sborman 3245233Sborman init_network(); 3345233Sborman 3445233Sborman init_telnet(); 3545233Sborman 3645233Sborman init_sys(); 3745233Sborman 3845233Sborman #if defined(TN3270) 3945233Sborman init_3270(); 4045233Sborman #endif 4132145Sminshall } 4232145Sminshall 4346808Sdab void 4446808Sdab usage() 4546808Sdab { 4646808Sdab fprintf(stderr, "Usage: %s %s%s%s%s\n", 4746808Sdab prompt, 4846808Sdab #ifdef AUTHENTICATE 4946808Sdab " [-8] [-E] [-K] [-L] [-X atype] [-a] [-d] [-e char] [-k realm]", 5046808Sdab "\n\t[-l user] [-n tracefile] ", 5146808Sdab #else 5246808Sdab " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]", 5346808Sdab "\n\t", 5446808Sdab #endif 5546808Sdab #if defined(TN3270) && defined(unix) 5646808Sdab # ifdef AUTHENTICATE 5746808Sdab "[-noasynch] [-noasynctty] [-noasyncnet]\n\t[-r] [-t transcom] ", 5846808Sdab # else 5946808Sdab "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t", 6046808Sdab # endif 6146808Sdab #else 6246808Sdab "[-r] ", 6346808Sdab #endif 6446808Sdab #ifdef ENCRYPT 6546808Sdab "[-x] [host-name [port]]" 6646808Sdab #else 6746808Sdab "[host-name [port]]" 6846808Sdab #endif 6946808Sdab ); 7046808Sdab exit(1); 7146808Sdab } 7232145Sminshall 7332145Sminshall /* 7432145Sminshall * main. Parse arguments, invoke the protocol or command parser. 7532145Sminshall */ 7645233Sborman 7745233Sborman 7832145Sminshall main(argc, argv) 7932145Sminshall int argc; 8032145Sminshall char *argv[]; 8132145Sminshall { 8245008Skarels extern char *optarg; 8345008Skarels extern int optind; 8445008Skarels int ch; 8545233Sborman char *user, *strrchr(); 8644361Sborman 8745008Skarels tninit(); /* Clear out things */ 8845233Sborman #if defined(CRAY) && !defined(__STDC__) 8945008Skarels _setlist_init(); /* Work around compiler bug */ 9038689Sborman #endif 9145233Sborman 9245008Skarels TerminalSaveState(); 9332145Sminshall 9445233Sborman if (prompt = strrchr(argv[0], '/')) 9545008Skarels ++prompt; 9645008Skarels else 9745008Skarels prompt = argv[0]; 9832145Sminshall 9945008Skarels user = NULL; 10046808Sdab 10146808Sdab rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE; 10246808Sdab autologin = -1; 10346808Sdab 104*46815Sdab while ((ch = getopt(argc, argv, "8EKLS:X:ade:k:l:n:rt:x")) != EOF) { 10545008Skarels switch(ch) { 10646808Sdab case '8': 10746808Sdab eight = 3; /* binary output and input */ 10846808Sdab break; 10946808Sdab case 'E': 11046808Sdab rlogin = escape = _POSIX_VDISABLE; 11146808Sdab break; 11246808Sdab case 'K': 11346808Sdab #ifdef AUTHENTICATE 11446808Sdab autologin = 0; 11546808Sdab #endif 11646808Sdab break; 11746808Sdab case 'L': 11846808Sdab eight |= 2; /* binary output only */ 11946808Sdab break; 120*46815Sdab case 'S': 121*46815Sdab { 122*46815Sdab #ifdef HAS_GETTOS 123*46815Sdab extern int tos; 124*46815Sdab 125*46815Sdab if ((tos = parsetos(optarg, "tcp")) < 0) 126*46815Sdab fprintf(stderr, "%s%s%s%s\n", 127*46815Sdab prompt, ": Bad TOS argument '", 128*46815Sdab optarg, 129*46815Sdab "; will try to use default TOS"); 130*46815Sdab #else 131*46815Sdab fprintf(stderr, 132*46815Sdab "%s: Warning: -S ignored, no parsetos() support.\n", 133*46815Sdab prompt); 134*46815Sdab #endif 135*46815Sdab } 136*46815Sdab break; 13746808Sdab case 'X': 13846808Sdab #ifdef AUTHENTICATE 13946808Sdab auth_disable_name(optarg); 14046808Sdab #endif 14146808Sdab break; 14245008Skarels case 'a': 14345008Skarels autologin = 1; 14445008Skarels break; 14545008Skarels case 'd': 14645008Skarels debug = 1; 14745008Skarels break; 14845008Skarels case 'e': 14945008Skarels set_escape_char(optarg); 15045008Skarels break; 15146808Sdab case 'k': 15246808Sdab #if defined(AUTHENTICATE) && defined(KRB4) 15346808Sdab { 15446808Sdab extern char *dest_realm, dst_realm_buf[], dst_realm_sz; 15546808Sdab dest_realm = dst_realm_buf; 15646808Sdab (void)strncpy(dest_realm, optarg, dst_realm_sz); 15746808Sdab } 15846808Sdab #else 15946808Sdab fprintf(stderr, 16046808Sdab "%s: Warning: -k ignored, no Kerberos V4 support.\n", 16146808Sdab prompt); 16246808Sdab #endif 16346808Sdab break; 16445008Skarels case 'l': 16545008Skarels autologin = 1; 16645008Skarels user = optarg; 16745008Skarels break; 16845008Skarels case 'n': 16945008Skarels #if defined(TN3270) && defined(unix) 17045008Skarels /* distinguish between "-n oasynch" and "-noasynch" */ 17145008Skarels if (argv[optind - 1][0] == '-' && argv[optind - 1][1] 17245008Skarels == 'n' && argv[optind - 1][2] == 'o') { 17345008Skarels if (!strcmp(optarg, "oasynch")) { 17445008Skarels noasynchtty = 1; 17545008Skarels noasynchnet = 1; 17645008Skarels } else if (!strcmp(optarg, "oasynchtty")) 17745008Skarels noasynchtty = 1; 17845233Sborman else if (!strcmp(optarg, "oasynchnet")) 17945008Skarels noasynchnet = 1; 18045008Skarels } else 18145008Skarels #endif /* defined(TN3270) && defined(unix) */ 18245008Skarels SetNetTrace(optarg); 18345008Skarels break; 18446808Sdab case 'r': 18546808Sdab rlogin = '~'; 18646808Sdab break; 18746808Sdab case 't': 18845008Skarels #if defined(TN3270) && defined(unix) 18945008Skarels transcom = tline; 19045008Skarels (void)strcpy(transcom, optarg); 19146808Sdab #else 19246808Sdab fprintf(stderr, 19346808Sdab "%s: Warning: -t ignored, no TN3270 support.\n", 19446808Sdab prompt); 19546808Sdab #endif 19645008Skarels break; 19746808Sdab case 'x': 19846808Sdab #ifdef ENCRYPT 19946808Sdab encrypt_auto(); 20046808Sdab #else 20146808Sdab fprintf(stderr, 20246808Sdab "%s: Warning: -x ignored, no ENCRYPT support.\n", 20346808Sdab prompt); 20445008Skarels #endif 20546808Sdab break; 20645008Skarels case '?': 20745008Skarels default: 20845008Skarels usage(); 20945008Skarels /* NOTREACHED */ 21032145Sminshall } 21145233Sborman } 21246808Sdab if (autologin == -1) 21346808Sdab autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 21446808Sdab 21545008Skarels argc -= optind; 21645008Skarels argv += optind; 21745008Skarels 21845008Skarels if (argc) { 21945008Skarels char *args[7], **argp = args; 22045008Skarels 22145008Skarels if (argc > 2) 22245008Skarels usage(); 22345008Skarels *argp++ = prompt; 22445008Skarels if (user) { 22545008Skarels *argp++ = "-l"; 22645008Skarels *argp++ = user; 22745008Skarels } 22845008Skarels *argp++ = argv[0]; /* host */ 22945008Skarels if (argc > 1) 23045008Skarels *argp++ = argv[1]; /* port */ 23145008Skarels *argp = 0; 23245008Skarels 23345008Skarels if (setjmp(toplevel) != 0) 23445008Skarels Exit(0); 23545008Skarels if (tn(argp - args, args) == 1) 23645008Skarels return (0); 23745008Skarels else 23845008Skarels return (1); 23932145Sminshall } 24045008Skarels (void)setjmp(toplevel); 24145233Sborman for (;;) { 24245008Skarels #ifdef TN3270 24345008Skarels if (shell_active) 24445008Skarels shell_continue(); 24545008Skarels else 24645008Skarels #endif 24745008Skarels command(1, 0, 0); 24845233Sborman } 24932145Sminshall } 250