Fernando Silveira writes:
authorEric Andersen <andersen@codepoet.org>
Sun, 22 Feb 2004 12:25:47 +0000 (12:25 -0000)
committerEric Andersen <andersen@codepoet.org>
Sun, 22 Feb 2004 12:25:47 +0000 (12:25 -0000)
Hi,

  Well, I made this patch a long time ago (08/2002) because it was a
  need of a project, but had no time to send it to you. It adds support
  to `autologin' option of the telnet protocol. It has been used since
  made with busybox 0.60.3 at production and I had no problems with it.
  I have ported it to the HEAD revision of the CVS server (20040211) and
  I hope you enjoy and apply it to the official sources. :)

Thanks a lot!

include/usage.h
networking/Config.in
networking/telnet.c

index 59e81c2..56650d5 100644 (file)
        "$ cat /tmp/foo\n" \
        "Hello\n"
 
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+#define telnet_trivial_usage \
+       "[-a] [-l USER] HOST [PORT]"
+#define telnet_full_usage \
+       "Telnet is used to establish interactive communication with another\n" \
+       "computer over a network using the TELNET protocol.\n\n" \
+       "Options:\n" \
+       "\t-a\t\tAttempt an automatic login with the USER variable.\n" \
+       "\t-l USER\t\tAttempt an automatic login with the USER argument.\n" \
+       "\tHOST\t\tThe official name, alias or the IP address of the\n" \
+       "\t\t\tremote host.\n" \
+       "\tPORT\t\tThe remote port number to connect to. If it is not\n" \
+       "\t\t\tspecified, the default telnet (23) port is used.\n"
+#else
 #define telnet_trivial_usage \
        "HOST [PORT]"
 #define telnet_full_usage \
        "Telnet is used to establish interactive communication with another\n"\
        "computer over a network using the TELNET protocol."
+#endif
 
 #ifdef CONFIG_FEATURE_TELNETD_INETD
 #define telnetd_trivial_usage \
index f250e78..d2916e7 100644 (file)
@@ -479,6 +479,16 @@ config CONFIG_FEATURE_TELNET_TTYPE
          remote host you are connecting to.  This is useful to make sure that
          things like ANSI colors and other control sequences behave.
 
+config CONFIG_FEATURE_TELNET_AUTOLOGIN
+       bool "  Pass USER type to remote host"
+       default y
+       depends on CONFIG_TELNET
+       help
+         Setting this option will forward the USER environment variable to the
+         remote host you are connecting to. This is useful when you need to
+         log into a machine without telling the username (autologin). This
+         option enables `-a' and `-l USER' arguments.
+
 config CONFIG_TELNETD
        bool "telnetd"
        default n
index 1b71bf2..574fe8d 100644 (file)
@@ -28,6 +28,8 @@
  * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen <andersen@codepoet.org>
  * Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan
  * <jam@ltsp.org>
+ * Modified 2004/02/11 to add ability to pass the USER variable to remote host
+ * by Fernando Silveira <swrh@gmx.net>
  *
  */
 
@@ -129,6 +131,10 @@ static int one = 1;
 static char *ttype;
 #endif
 
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+static char *autologin;
+#endif
+
 #ifdef CONFIG_FEATURE_AUTOWIDTH
 static int win_width, win_height;
 #endif
@@ -355,6 +361,34 @@ static void putiac_subopt(byte c, char *str)
 }
 #endif
 
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+static void putiac_subopt_autologin(void)
+{
+       int len = strlen(autologin) + 6;        // (2 + 1 + 1 + strlen + 2)
+       char *user = "USER";
+
+       if (G.iaclen + len > IACBUFSIZE)
+               iacflush();
+
+       putiac(IAC);
+       putiac(SB);
+       putiac(TELOPT_NEW_ENVIRON);
+       putiac(TELQUAL_IS);
+       putiac(NEW_ENV_VAR);
+
+       while(*user)
+               putiac(*user++);
+
+       putiac(NEW_ENV_VALUE);
+
+       while(*autologin)
+               putiac(*autologin++);
+
+       putiac(IAC);
+       putiac(SE);
+}
+#endif
+
 #ifdef CONFIG_FEATURE_AUTOWIDTH
 static void putiac_naws(byte c, int x, int y)
 {
@@ -495,6 +529,20 @@ static inline void to_ttype(void)
 }
 #endif
 
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+static inline void to_new_environ(void)
+{
+       /* Tell server we will (or will not) do AUTOLOGIN */
+
+       if (autologin)
+               putiac2(WILL, TELOPT_NEW_ENVIRON);
+       else
+               putiac2(WONT, TELOPT_NEW_ENVIRON);
+
+       return;
+}
+#endif
+
 #ifdef CONFIG_FEATURE_AUTOWIDTH
 static inline void to_naws(void)
 { 
@@ -513,6 +561,9 @@ static void telopt(byte c)
 #ifdef CONFIG_FEATURE_TELNET_TTYPE
                case TELOPT_TTYPE:              to_ttype();break;
 #endif
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+               case TELOPT_NEW_ENVIRON:        to_new_environ();       break;
+#endif
 #ifdef CONFIG_FEATURE_AUTOWIDTH
                case TELOPT_NAWS:               to_naws();
                                                                putiac_naws(c, win_width, win_height);
@@ -540,6 +591,11 @@ static int subneg(byte c)
                if (c == TELOPT_TTYPE)
                        putiac_subopt(TELOPT_TTYPE,ttype);
 #endif
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+               else
+               if (c == TELOPT_NEW_ENVIRON)
+                       putiac_subopt_autologin();
+#endif
                break;
        case TS_SUB2:
                if (c == SE)
@@ -579,6 +635,10 @@ extern int telnet_main(int argc, char** argv)
        int maxfd;
 #endif 
 
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+       int opt;
+#endif
+
 #ifdef CONFIG_FEATURE_AUTOWIDTH
        get_terminal_width_height(0, &win_width, &win_height);
 #endif
@@ -598,8 +658,33 @@ extern int telnet_main(int argc, char** argv)
        if (argc < 2)
                bb_show_usage();
        
+#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN
+       autologin = NULL;
+       while ((opt = getopt(argc, argv, "al:")) != EOF) {
+               switch (opt) {
+                       case 'l':
+                               autologin = bb_xstrdup(optarg);
+                               break;
+                       case 'a':
+                               autologin = getenv("USER");
+                               break;
+                       case '?':
+                               bb_show_usage();
+                               break;
+               }
+       }
+       if (optind < argc) {
+               bb_lookup_host(&s_in, argv[optind++]);
+               s_in.sin_port = bb_lookup_port((optind < argc) ? argv[optind++] :
+                               "telnet", "tcp", 23);
+               if (optind < argc)
+                       bb_show_usage();
+       } else
+               bb_show_usage();
+#else
        bb_lookup_host(&s_in, argv[1]);
        s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23);
+#endif
        
        G.netfd = xconnect(&s_in);