133685Sbostic /* 2*62311Sbostic * Copyright (c) 1988, 1990, 1993 3*62311Sbostic * The Regents of the University of California. All rights reserved. 433685Sbostic * 542770Sbostic * %sccs.include.redist.c% 633685Sbostic */ 733685Sbostic 833685Sbostic #ifndef lint 9*62311Sbostic static char copyright[] = 10*62311Sbostic "@(#) Copyright (c) 1988, 1990, 1993\n\ 11*62311Sbostic The Regents of the University of California. All rights reserved.\n"; 1233685Sbostic #endif /* not lint */ 1333685Sbostic 1433685Sbostic #ifndef lint 15*62311Sbostic static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 06/06/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 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, 4857213Sdab #ifdef AUTHENTICATION 4960149Sdab "[-8] [-E] [-K] [-L] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]", 5060149Sdab "\n\t[-k realm] [-l user] [-n tracefile] ", 5146808Sdab #else 5260149Sdab "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]", 5360149Sdab "\n\t[-n tracefile]", 5446808Sdab #endif 5546808Sdab #if defined(TN3270) && defined(unix) 5657213Sdab # ifdef AUTHENTICATION 5760149Sdab "[-noasynch] [-noasynctty]\n\t[-noasyncnet] [-r] [-t transcom] ", 5846808Sdab # else 5960149Sdab "[-noasynch] [-noasynctty] [-noasyncnet] [-r]\n\t[-t transcom]", 6046808Sdab # endif 6146808Sdab #else 6246808Sdab "[-r] ", 6346808Sdab #endif 6457213Sdab #ifdef ENCRYPTION 6546808Sdab "[-x] [host-name [port]]" 6660149Sdab #else /* ENCRYPTION */ 6746808Sdab "[host-name [port]]" 6860149Sdab #endif /* ENCRYPTION */ 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 10457213Sdab while ((ch = getopt(argc, argv, "8EKLS:X:acde: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': 11357213Sdab #ifdef AUTHENTICATION 11446808Sdab autologin = 0; 11546808Sdab #endif 11646808Sdab break; 11746808Sdab case 'L': 11846808Sdab eight |= 2; /* binary output only */ 11946808Sdab break; 12046815Sdab case 'S': 12146815Sdab { 12246815Sdab #ifdef HAS_GETTOS 12346815Sdab extern int tos; 12446815Sdab 12546815Sdab if ((tos = parsetos(optarg, "tcp")) < 0) 12646815Sdab fprintf(stderr, "%s%s%s%s\n", 12746815Sdab prompt, ": Bad TOS argument '", 12846815Sdab optarg, 12946815Sdab "; will try to use default TOS"); 13046815Sdab #else 13146815Sdab fprintf(stderr, 13246815Sdab "%s: Warning: -S ignored, no parsetos() support.\n", 13346815Sdab prompt); 13446815Sdab #endif 13546815Sdab } 13646815Sdab break; 13746808Sdab case 'X': 13857213Sdab #ifdef AUTHENTICATION 13946808Sdab auth_disable_name(optarg); 14046808Sdab #endif 14146808Sdab break; 14245008Skarels case 'a': 14345008Skarels autologin = 1; 14445008Skarels break; 14547608Sdab case 'c': 14647608Sdab skiprc = 1; 14747608Sdab break; 14845008Skarels case 'd': 14945008Skarels debug = 1; 15045008Skarels break; 15145008Skarels case 'e': 15245008Skarels set_escape_char(optarg); 15345008Skarels break; 15446808Sdab case 'k': 15557213Sdab #if defined(AUTHENTICATION) && defined(KRB4) 15646808Sdab { 15746808Sdab extern char *dest_realm, dst_realm_buf[], dst_realm_sz; 15846808Sdab dest_realm = dst_realm_buf; 15946808Sdab (void)strncpy(dest_realm, optarg, dst_realm_sz); 16046808Sdab } 16146808Sdab #else 16246808Sdab fprintf(stderr, 16346808Sdab "%s: Warning: -k ignored, no Kerberos V4 support.\n", 16446808Sdab prompt); 16546808Sdab #endif 16646808Sdab break; 16745008Skarels case 'l': 16845008Skarels autologin = 1; 16945008Skarels user = optarg; 17045008Skarels break; 17145008Skarels case 'n': 17245008Skarels #if defined(TN3270) && defined(unix) 17345008Skarels /* distinguish between "-n oasynch" and "-noasynch" */ 17445008Skarels if (argv[optind - 1][0] == '-' && argv[optind - 1][1] 17545008Skarels == 'n' && argv[optind - 1][2] == 'o') { 17645008Skarels if (!strcmp(optarg, "oasynch")) { 17745008Skarels noasynchtty = 1; 17845008Skarels noasynchnet = 1; 17945008Skarels } else if (!strcmp(optarg, "oasynchtty")) 18045008Skarels noasynchtty = 1; 18145233Sborman else if (!strcmp(optarg, "oasynchnet")) 18245008Skarels noasynchnet = 1; 18345008Skarels } else 18445008Skarels #endif /* defined(TN3270) && defined(unix) */ 18545008Skarels SetNetTrace(optarg); 18645008Skarels break; 18746808Sdab case 'r': 18846808Sdab rlogin = '~'; 18946808Sdab break; 19046808Sdab case 't': 19145008Skarels #if defined(TN3270) && defined(unix) 19245008Skarels transcom = tline; 19345008Skarels (void)strcpy(transcom, optarg); 19446808Sdab #else 19546808Sdab fprintf(stderr, 19646808Sdab "%s: Warning: -t ignored, no TN3270 support.\n", 19746808Sdab prompt); 19846808Sdab #endif 19945008Skarels break; 20046808Sdab case 'x': 20157213Sdab #ifdef ENCRYPTION 20247608Sdab encrypt_auto(1); 20347608Sdab decrypt_auto(1); 20460149Sdab #else /* ENCRYPTION */ 20546808Sdab fprintf(stderr, 20646808Sdab "%s: Warning: -x ignored, no ENCRYPT support.\n", 20746808Sdab prompt); 20860149Sdab #endif /* ENCRYPTION */ 20946808Sdab break; 21045008Skarels case '?': 21145008Skarels default: 21245008Skarels usage(); 21345008Skarels /* NOTREACHED */ 21432145Sminshall } 21545233Sborman } 21646808Sdab if (autologin == -1) 21746808Sdab autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1; 21846808Sdab 21945008Skarels argc -= optind; 22045008Skarels argv += optind; 22145008Skarels 22245008Skarels if (argc) { 22345008Skarels char *args[7], **argp = args; 22445008Skarels 22545008Skarels if (argc > 2) 22645008Skarels usage(); 22745008Skarels *argp++ = prompt; 22845008Skarels if (user) { 22945008Skarels *argp++ = "-l"; 23045008Skarels *argp++ = user; 23145008Skarels } 23245008Skarels *argp++ = argv[0]; /* host */ 23345008Skarels if (argc > 1) 23445008Skarels *argp++ = argv[1]; /* port */ 23545008Skarels *argp = 0; 23645008Skarels 23745008Skarels if (setjmp(toplevel) != 0) 23845008Skarels Exit(0); 23945008Skarels if (tn(argp - args, args) == 1) 24045008Skarels return (0); 24145008Skarels else 24245008Skarels return (1); 24332145Sminshall } 24445008Skarels (void)setjmp(toplevel); 24545233Sborman for (;;) { 24645008Skarels #ifdef TN3270 24745008Skarels if (shell_active) 24845008Skarels shell_continue(); 24945008Skarels else 25045008Skarels #endif 25145008Skarels command(1, 0, 0); 25245233Sborman } 25332145Sminshall } 254