home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / usr.bin / telnet / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-18  |  6.3 KB  |  280 lines

  1. /*
  2.  * Copyright (c) 1988, 1990 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. char copyright[] =
  36. "@(#) Copyright (c) 1988, 1990 Regents of the University of California.\n\
  37.  All rights reserved.\n";
  38. #endif /* not lint */
  39.  
  40. #ifndef lint
  41. static char sccsid[] = "@(#)main.c    5.4 (Berkeley) 3/22/91";
  42. #endif /* not lint */
  43.  
  44. #include <sys/types.h>
  45.  
  46. #include "ring.h"
  47. #include "externs.h"
  48. #include "defines.h"
  49.  
  50. /*
  51.  * Initialize variables.
  52.  */
  53.     void
  54. tninit()
  55. {
  56.     init_terminal();
  57.  
  58.     init_network();
  59.     
  60.     init_telnet();
  61.  
  62.     init_sys();
  63.  
  64. #if defined(TN3270)
  65.     init_3270();
  66. #endif
  67. }
  68.  
  69.     void
  70. usage()
  71. {
  72.     fprintf(stderr, "Usage: %s %s%s%s%s\n",
  73.         prompt,
  74. #ifdef    AUTHENTICATE
  75.         " [-8] [-E] [-K] [-L] [-X atype] [-a] [-d] [-e char] [-k realm]",
  76.         "\n\t[-l user] [-n tracefile] ",
  77. #else
  78.         " [-8] [-E] [-L] [-a] [-d] [-e char] [-l user] [-n tracefile]",
  79.         "\n\t",
  80. #endif
  81. #if defined(TN3270) && defined(unix)
  82. # ifdef AUTHENTICATE
  83.         "[-noasynch] [-noasynctty] [-noasyncnet]\n\t[-r] [-t transcom] ",
  84. # else
  85.         "[-noasynch] [-noasynctty] [-noasyncnet] [-r] [-t transcom]\n\t",
  86. # endif
  87. #else
  88.         "[-r] ",
  89. #endif
  90. #ifdef    ENCRYPT
  91.         "[-x] [host-name [port]]"
  92. #else
  93.         "[host-name [port]]"
  94. #endif
  95.     );
  96.     exit(1);
  97. }
  98.  
  99. /*
  100.  * main.  Parse arguments, invoke the protocol or command parser.
  101.  */
  102.  
  103.  
  104. main(argc, argv)
  105.     int argc;
  106.     char *argv[];
  107. {
  108.     extern char *optarg;
  109.     extern int optind;
  110.     int ch;
  111.     char *user, *strrchr();
  112.  
  113.     tninit();        /* Clear out things */
  114. #if    defined(CRAY) && !defined(__STDC__)
  115.     _setlist_init();    /* Work around compiler bug */
  116. #endif
  117.  
  118.     TerminalSaveState();
  119.  
  120.     if (prompt = strrchr(argv[0], '/'))
  121.         ++prompt;
  122.     else
  123.         prompt = argv[0];
  124.  
  125.     user = NULL;
  126.  
  127.     rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
  128.     autologin = -1;
  129.  
  130.     while ((ch = getopt(argc, argv, "8EKLS:X:ade:k:l:n:rt:x")) != EOF) {
  131.         switch(ch) {
  132.         case '8':
  133.             eight = 3;    /* binary output and input */
  134.             break;
  135.         case 'E':
  136.             rlogin = escape = _POSIX_VDISABLE;
  137.             break;
  138.         case 'K':
  139. #ifdef    AUTHENTICATE
  140.             autologin = 0;
  141. #endif
  142.             break;
  143.         case 'L':
  144.             eight |= 2;    /* binary output only */
  145.             break;
  146.         case 'S':
  147.             {
  148. #ifdef    HAS_GETTOS
  149.             extern int tos;
  150.  
  151.             if ((tos = parsetos(optarg, "tcp")) < 0)
  152.                 fprintf(stderr, "%s%s%s%s\n",
  153.                     prompt, ": Bad TOS argument '",
  154.                     optarg,
  155.                     "; will try to use default TOS");
  156. #else
  157.             fprintf(stderr,
  158.                "%s: Warning: -S ignored, no parsetos() support.\n",
  159.                                 prompt);
  160. #endif
  161.             }
  162.             break;
  163.         case 'X':
  164. #ifdef    AUTHENTICATE
  165.             auth_disable_name(optarg);
  166. #endif
  167.             break;
  168.         case 'a':
  169.             autologin = 1;
  170.             break;
  171.         case 'c':
  172.             skiprc = 1;
  173.             break;
  174.         case 'd':
  175.             debug = 1;
  176.             break;
  177.         case 'e':
  178.             set_escape_char(optarg);
  179.             break;
  180.         case 'k':
  181. #if defined(AUTHENTICATE) && defined(KRB4)
  182.             {
  183.             extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
  184.             dest_realm = dst_realm_buf;
  185.             (void)strncpy(dest_realm, optarg, dst_realm_sz);
  186.             }
  187. #else
  188.             fprintf(stderr,
  189.                "%s: Warning: -k ignored, no Kerberos V4 support.\n",
  190.                                 prompt);
  191. #endif
  192.             break;
  193.         case 'l':
  194.             autologin = 1;
  195.             user = optarg;
  196.             break;
  197.         case 'n':
  198. #if defined(TN3270) && defined(unix)
  199.             /* distinguish between "-n oasynch" and "-noasynch" */
  200.             if (argv[optind - 1][0] == '-' && argv[optind - 1][1]
  201.                 == 'n' && argv[optind - 1][2] == 'o') {
  202.                 if (!strcmp(optarg, "oasynch")) {
  203.                     noasynchtty = 1;
  204.                     noasynchnet = 1;
  205.                 } else if (!strcmp(optarg, "oasynchtty"))
  206.                     noasynchtty = 1;
  207.                 else if (!strcmp(optarg, "oasynchnet"))
  208.                     noasynchnet = 1;
  209.             } else
  210. #endif    /* defined(TN3270) && defined(unix) */
  211.                 SetNetTrace(optarg);
  212.             break;
  213.         case 'r':
  214.             rlogin = '~';
  215.             break;
  216.         case 't':
  217. #if defined(TN3270) && defined(unix)
  218.             transcom = tline;
  219.             (void)strcpy(transcom, optarg);
  220. #else
  221.             fprintf(stderr,
  222.                "%s: Warning: -t ignored, no TN3270 support.\n",
  223.                                 prompt);
  224. #endif
  225.             break;
  226.         case 'x':
  227. #ifdef    ENCRYPT
  228.             encrypt_auto(1);
  229.             decrypt_auto(1);
  230. #else
  231.             fprintf(stderr,
  232.                 "%s: Warning: -x ignored, no ENCRYPT support.\n",
  233.                                 prompt);
  234. #endif
  235.             break;
  236.         case '?':
  237.         default:
  238.             usage();
  239.             /* NOTREACHED */
  240.         }
  241.     }
  242.     if (autologin == -1)
  243.         autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
  244.  
  245.     argc -= optind;
  246.     argv += optind;
  247.  
  248.     if (argc) {
  249.         char *args[7], **argp = args;
  250.  
  251.         if (argc > 2)
  252.             usage();
  253.         *argp++ = prompt;
  254.         if (user) {
  255.             *argp++ = "-l";
  256.             *argp++ = user;
  257.         }
  258.         *argp++ = argv[0];        /* host */
  259.         if (argc > 1)
  260.             *argp++ = argv[1];    /* port */
  261.         *argp = 0;
  262.  
  263.         if (setjmp(toplevel) != 0)
  264.             Exit(0);
  265.         if (tn(argp - args, args) == 1)
  266.             return (0);
  267.         else
  268.             return (1);
  269.     }
  270.     (void)setjmp(toplevel);
  271.     for (;;) {
  272. #ifdef TN3270
  273.         if (shell_active)
  274.             shell_continue();
  275.         else
  276. #endif
  277.             command(1, 0, 0);
  278.     }
  279. }
  280.