Rob Wood's patch to provide standard -L and -R options for port
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 25 Nov 2001 11:36:49 +0000 (11:36 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sun, 25 Nov 2001 11:36:49 +0000 (11:36 +0000)
forwarding in Plink. Cleaned up a bit to remove segfaults and work
correctly with saved sessions.

git-svn-id: svn://svn.tartarus.org/sgt/putty@1411 cda61777-01e9-0310-a592-d414129be87e

plink.c

diff --git a/plink.c b/plink.c
index 1b742ce..fc420ef 100644 (file)
--- a/plink.c
+++ b/plink.c
@@ -346,6 +346,10 @@ static void usage(void)
     printf("  -P port   connect to specified port\n");
     printf("  -pw passw login with specified password\n");
     printf("  -m file   read remote command(s) from file\n");
+    printf("  -L listen-port:host:port   Forward local port to "
+          "remote address\n");
+    printf("  -R listen-port:host:port   Forward remote port to"
+          " local address\n");
     exit(1);
 }
 
@@ -383,6 +387,7 @@ int main(int argc, char **argv)
     SOCKET *sklist;
     int skcount, sksize;
     int connopen;
+    char extra_portfwd[sizeof(cfg.portfwd)];
 
     ssh_get_line = get_line;
 
@@ -441,6 +446,23 @@ int main(int argc, char **argv)
                --argc, username = *++argv;
                strncpy(cfg.username, username, sizeof(cfg.username));
                cfg.username[sizeof(cfg.username) - 1] = '\0';
+           } else if ((!strcmp(p, "-L") || !strcmp(p, "-R")) && argc > 1) {
+               char *fwd, *ptr;
+               int i=0;
+               --argc, fwd = *++argv;
+               ptr = extra_portfwd;
+               /* if multiple forwards, find end of list */
+               if (ptr[0]=='R' || ptr[0]=='L') {
+                   for (i = 0; i < sizeof(extra_portfwd) - 2; i++)
+                       if (ptr[i]=='\000' && ptr[i+1]=='\000')
+                           break;
+                   ptr = ptr + i + 1;  /* point to next forward slot */
+               }
+               ptr[0] = p[1];  /* insert a 'L' or 'R' at the start */
+               strncpy(ptr+1, fwd, sizeof(extra_portfwd) - i);
+               ptr[strcspn(ptr, ":")] = '\t';  /* replace first : with \t */
+               ptr[strlen(ptr)+1] = '\000';    /* append two '\000' */
+               extra_portfwd[sizeof(extra_portfwd) - 1] = '\0';
            } else if (!strcmp(p, "-m") && argc > 1) {
                char *filename, *command;
                int cmdlen, cmdsize;
@@ -640,6 +662,30 @@ int main(int argc, char **argv)
     }
 
     /*
+     * Add extra port forwardings (accumulated on command line) to
+     * cfg.
+     */
+    {
+       int i;
+       char *p;
+       p = extra_portfwd;
+       i = 0;
+       while (cfg.portfwd[i])
+           i += strlen(cfg.portfwd+i) + 1;
+       while (*p) {
+           if (strlen(p)+2 > sizeof(cfg.portfwd)-i) {
+               fprintf(stderr, "Internal fault: not enough space for all"
+                       " port forwardings\n");
+               break;
+           }
+           strncpy(cfg.portfwd+i, p, sizeof(cfg.portfwd)-i-1);
+           i += strlen(cfg.portfwd+i) + 1;
+           cfg.portfwd[i] = '\0';
+           p += strlen(p)+1;
+       }
+    }
+
+    /*
      * Select port.
      */
     if (portnumber != -1)