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*69785Sdab static char sccsid[] = "@(#)main.c 8.3 (Berkeley) 05/30/95";
1633685Sbostic #endif /* not lint */
1733685Sbostic
1832381Sminshall #include <sys/types.h>
1932381Sminshall
2032381Sminshall #include "ring.h"
2132145Sminshall #include "externs.h"
2232145Sminshall #include "defines.h"
2332145Sminshall
2465157Sdab /* These values need to be the same as defined in libtelnet/kerberos5.c */
2565157Sdab /* Either define them in both places, or put in some common header file. */
26*69785Sdab #define OPTS_FORWARD_CREDS 0x00000002
27*69785Sdab #define OPTS_FORWARDABLE_CREDS 0x00000001
2865157Sdab
2965157Sdab #if 0
3065157Sdab #define FORWARD
3165157Sdab #endif
3265157Sdab
3332145Sminshall /*
3432145Sminshall * Initialize variables.
3532145Sminshall */
3646808Sdab void
tninit()3732145Sminshall tninit()
3832145Sminshall {
3945233Sborman init_terminal();
4045233Sborman
4145233Sborman init_network();
42*69785Sdab
4345233Sborman init_telnet();
4445233Sborman
4545233Sborman init_sys();
4645233Sborman
4745233Sborman #if defined(TN3270)
4845233Sborman init_3270();
4945233Sborman #endif
5032145Sminshall }
5132145Sminshall
5246808Sdab void
usage()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]",
5965157Sdab "\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
main(argc,argv)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();
9565157Sdab #ifdef FORWARD
9665157Sdab extern int forward_flags;
9765157Sdab #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
11665157Sdab 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;
16665157Sdab case 'f':
16765157Sdab #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
16865157Sdab if (forward_flags & OPTS_FORWARD_CREDS) {
169*69785Sdab fprintf(stderr,
17065157Sdab "%s: Only one of -f and -F allowed.\n",
17165157Sdab prompt);
17265157Sdab usage();
17365157Sdab }
17465157Sdab forward_flags |= OPTS_FORWARD_CREDS;
17565157Sdab #else
17665157Sdab fprintf(stderr,
177*69785Sdab "%s: Warning: -f ignored, no Kerberos V5 support.\n",
17865157Sdab prompt);
17965157Sdab #endif
18065157Sdab break;
18165157Sdab case 'F':
18265157Sdab #if defined(AUTHENTICATION) && defined(KRB5) && defined(FORWARD)
18365157Sdab if (forward_flags & OPTS_FORWARD_CREDS) {
184*69785Sdab fprintf(stderr,
18565157Sdab "%s: Only one of -f and -F allowed.\n",
18665157Sdab prompt);
18765157Sdab usage();
18865157Sdab }
18965157Sdab forward_flags |= OPTS_FORWARD_CREDS;
19065157Sdab forward_flags |= OPTS_FORWARDABLE_CREDS;
19165157Sdab #else
19265157Sdab fprintf(stderr,
193*69785Sdab "%s: Warning: -F ignored, no Kerberos V5 support.\n",
19465157Sdab prompt);
19565157Sdab #endif
19665157Sdab 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