BSD 4_4 release
[unix-history] / usr / src / usr.bin / telnet / main.c
index 58c21e3..a5a3245 100644 (file)
@@ -1,34 +1,47 @@
 /*
 /*
- * Copyright (c) 1988, 1990 Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1988, 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  *
- * Redistribution and use in source and binary forms are permitted provided
- * that: (1) source distributions retain this entire copyright notice and
- * comment, and (2) distributions including binaries display the following
- * acknowledgement:  ``This product includes software developed by the
- * University of California, Berkeley and its contributors'' in the
- * documentation or other materials provided with the distribution and in
- * all advertising materials mentioning features or use of this software.
- * Neither the name of the University nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-char copyright[] =
-"@(#) Copyright (c) 1988, 1990 Regents of the University of California.\n\
- All rights reserved.\n";
+static char copyright[] =
+"@(#) Copyright (c) 1988, 1990, 1993\n\
      The Regents of the University of California.  All rights reserved.\n";
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)main.c     1.15 (Berkeley) 7/27/90";
+static char sccsid[] = "@(#)main.c     8.1 (Berkeley) 6/6/93";
 #endif /* not lint */
 
 #include <sys/types.h>
 #endif /* not lint */
 
 #include <sys/types.h>
-#include <string.h>
 
 #include "ring.h"
 #include "externs.h"
 
 #include "ring.h"
 #include "externs.h"
@@ -37,21 +50,57 @@ static char sccsid[] = "@(#)main.c  1.15 (Berkeley) 7/27/90";
 /*
  * Initialize variables.
  */
 /*
  * Initialize variables.
  */
-void
+    void
 tninit()
 {
 tninit()
 {
-       init_terminal();
-       init_network();
-       init_telnet();
-       init_sys();
-       init_3270();
+    init_terminal();
+
+    init_network();
+    
+    init_telnet();
+
+    init_sys();
+
+#if defined(TN3270)
+    init_3270();
+#endif
 }
 
 }
 
-int    autologin;
+       void
+usage()
+{
+       fprintf(stderr, "Usage: %s %s%s%s%s\n",
+           prompt,
+#ifdef AUTHENTICATION
+           "[-8] [-E] [-K] [-L] [-S tos] [-X atype] [-a] [-c] [-d] [-e char]",
+           "\n\t[-k realm] [-l user] [-n tracefile] ",
+#else
+           "[-8] [-E] [-L] [-S tos] [-a] [-c] [-d] [-e char] [-l user]",
+           "\n\t[-n tracefile]",
+#endif
+#if defined(TN3270) && defined(unix)
+# ifdef AUTHENTICATION
+           "[-noasynch] [-noasynctty]\n\t[-noasyncnet] [-r] [-t transcom] ",
+# else
+           "[-noasynch] [-noasynctty] [-noasyncnet] [-r]\n\t[-t transcom]",
+# endif
+#else
+           "[-r] ",
+#endif
+#ifdef ENCRYPTION
+           "[-x] [host-name [port]]"
+#else  /* ENCRYPTION */
+           "[host-name [port]]"
+#endif /* ENCRYPTION */
+       );
+       exit(1);
+}
 
 /*
  * main.  Parse arguments, invoke the protocol or command parser.
  */
 
 /*
  * main.  Parse arguments, invoke the protocol or command parser.
  */
+
+
 main(argc, argv)
        int argc;
        char *argv[];
 main(argc, argv)
        int argc;
        char *argv[];
@@ -59,32 +108,88 @@ main(argc, argv)
        extern char *optarg;
        extern int optind;
        int ch;
        extern char *optarg;
        extern int optind;
        int ch;
-       char *user;
+       char *user, *strrchr();
 
        tninit();               /* Clear out things */
 
        tninit();               /* Clear out things */
-#ifdef CRAY
+#if    defined(CRAY) && !defined(__STDC__)
        _setlist_init();        /* Work around compiler bug */
 #endif
        _setlist_init();        /* Work around compiler bug */
 #endif
+
        TerminalSaveState();
 
        TerminalSaveState();
 
-       if (prompt = rindex(argv[0], '/'))
+       if (prompt = strrchr(argv[0], '/'))
                ++prompt;
        else
                prompt = argv[0];
 
        user = NULL;
                ++prompt;
        else
                prompt = argv[0];
 
        user = NULL;
-       autologin = 0;
-       while ((ch = getopt(argc, argv, "ade:l:n:")) != EOF)
+
+       rlogin = (strncmp(prompt, "rlog", 4) == 0) ? '~' : _POSIX_VDISABLE;
+       autologin = -1;
+
+       while ((ch = getopt(argc, argv, "8EKLS:X:acde:k:l:n:rt:x")) != EOF) {
                switch(ch) {
                switch(ch) {
+               case '8':
+                       eight = 3;      /* binary output and input */
+                       break;
+               case 'E':
+                       rlogin = escape = _POSIX_VDISABLE;
+                       break;
+               case 'K':
+#ifdef AUTHENTICATION
+                       autologin = 0;
+#endif
+                       break;
+               case 'L':
+                       eight |= 2;     /* binary output only */
+                       break;
+               case 'S':
+                   {
+#ifdef HAS_GETTOS
+                       extern int tos;
+
+                       if ((tos = parsetos(optarg, "tcp")) < 0)
+                               fprintf(stderr, "%s%s%s%s\n",
+                                       prompt, ": Bad TOS argument '",
+                                       optarg,
+                                       "; will try to use default TOS");
+#else
+                       fprintf(stderr,
+                          "%s: Warning: -S ignored, no parsetos() support.\n",
+                                                               prompt);
+#endif
+                   }
+                       break;
+               case 'X':
+#ifdef AUTHENTICATION
+                       auth_disable_name(optarg);
+#endif
+                       break;
                case 'a':
                        autologin = 1;
                        break;
                case 'a':
                        autologin = 1;
                        break;
+               case 'c':
+                       skiprc = 1;
+                       break;
                case 'd':
                        debug = 1;
                        break;
                case 'e':
                        set_escape_char(optarg);
                        break;
                case 'd':
                        debug = 1;
                        break;
                case 'e':
                        set_escape_char(optarg);
                        break;
+               case 'k':
+#if defined(AUTHENTICATION) && defined(KRB4)
+                   {
+                       extern char *dest_realm, dst_realm_buf[], dst_realm_sz;
+                       dest_realm = dst_realm_buf;
+                       (void)strncpy(dest_realm, optarg, dst_realm_sz);
+                   }
+#else
+                       fprintf(stderr,
+                          "%s: Warning: -k ignored, no Kerberos V4 support.\n",
+                                                               prompt);
+#endif
+                       break;
                case 'l':
                        autologin = 1;
                        user = optarg;
                case 'l':
                        autologin = 1;
                        user = optarg;
@@ -99,24 +204,44 @@ main(argc, argv)
                                        noasynchnet = 1;
                                } else if (!strcmp(optarg, "oasynchtty"))
                                        noasynchtty = 1;
                                        noasynchnet = 1;
                                } else if (!strcmp(optarg, "oasynchtty"))
                                        noasynchtty = 1;
-                               else if (!strcmp(optarg, "oasynchnet"))
+                               else if (!strcmp(optarg, "oasynchnet"))
                                        noasynchnet = 1;
                                        noasynchnet = 1;
-                               }
                        } else
 #endif /* defined(TN3270) && defined(unix) */
                                SetNetTrace(optarg);
                        break;
                        } else
 #endif /* defined(TN3270) && defined(unix) */
                                SetNetTrace(optarg);
                        break;
-#if defined(TN3270) && defined(unix)
+               case 'r':
+                       rlogin = '~';
+                       break;
                case 't':
                case 't':
+#if defined(TN3270) && defined(unix)
                        transcom = tline;
                        (void)strcpy(transcom, optarg);
                        transcom = tline;
                        (void)strcpy(transcom, optarg);
-                       break;
+#else
+                       fprintf(stderr,
+                          "%s: Warning: -t ignored, no TN3270 support.\n",
+                                                               prompt);
 #endif
 #endif
+                       break;
+               case 'x':
+#ifdef ENCRYPTION
+                       encrypt_auto(1);
+                       decrypt_auto(1);
+#else  /* ENCRYPTION */
+                       fprintf(stderr,
+                           "%s: Warning: -x ignored, no ENCRYPT support.\n",
+                                                               prompt);
+#endif /* ENCRYPTION */
+                       break;
                case '?':
                default:
                        usage();
                        /* NOTREACHED */
                }
                case '?':
                default:
                        usage();
                        /* NOTREACHED */
                }
+       }
+       if (autologin == -1)
+               autologin = (rlogin == _POSIX_VDISABLE) ? 0 : 1;
+
        argc -= optind;
        argv += optind;
 
        argc -= optind;
        argv += optind;
 
@@ -143,18 +268,12 @@ main(argc, argv)
                        return (1);
        }
        (void)setjmp(toplevel);
                        return (1);
        }
        (void)setjmp(toplevel);
-       for (;;)
+       for (;;) {
 #ifdef TN3270
                if (shell_active)
                        shell_continue();
                else
 #endif
                        command(1, 0, 0);
 #ifdef TN3270
                if (shell_active)
                        shell_continue();
                else
 #endif
                        command(1, 0, 0);
-}
-
-usage()
-{
-       fprintf(stderr, "usage: %s [-a] [ [-l user] host-name [port] ]\n",
-           prompt);
-       exit(1);
+       }
 }
 }