mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-21 14:18:38 -05: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(" -P port connect to specified port\n");
|
||||||
printf(" -pw passw login with specified password\n");
|
printf(" -pw passw login with specified password\n");
|
||||||
printf(" -m file read remote command(s) from file\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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,6 +387,7 @@ int main(int argc, char **argv)
|
|||||||
SOCKET *sklist;
|
SOCKET *sklist;
|
||||||
int skcount, sksize;
|
int skcount, sksize;
|
||||||
int connopen;
|
int connopen;
|
||||||
|
char extra_portfwd[sizeof(cfg.portfwd)];
|
||||||
|
|
||||||
ssh_get_line = get_line;
|
ssh_get_line = get_line;
|
||||||
|
|
||||||
@ -441,6 +446,23 @@ int main(int argc, char **argv)
|
|||||||
--argc, username = *++argv;
|
--argc, username = *++argv;
|
||||||
strncpy(cfg.username, username, sizeof(cfg.username));
|
strncpy(cfg.username, username, sizeof(cfg.username));
|
||||||
cfg.username[sizeof(cfg.username) - 1] = '\0';
|
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) {
|
} else if (!strcmp(p, "-m") && argc > 1) {
|
||||||
char *filename, *command;
|
char *filename, *command;
|
||||||
int cmdlen, cmdsize;
|
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.
|
* Select port.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user