mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 01:02:24 +00:00
Rob Wood's patch to provide standard -L and -R options for port
forwarding in Plink. Cleaned up a bit to remove segfaults and work correctly with saved sessions. [originally from svn r1411]
This commit is contained in:
parent
92eb0710e3
commit
14ab514528
46
plink.c
46
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;
|
||||
@ -639,6 +661,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.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user