- tcpfwd bindaddr support against trunk. needs merging.

--HG--
extra : convert_revision : 658fd03abd21e0da7c4c89b9fff9dc693c72daae
This commit is contained in:
Matt Johnston
2010-02-27 11:51:19 +00:00
parent 8174a2f27b
commit 3b07844548
3 changed files with 80 additions and 36 deletions

View File

@@ -628,13 +628,15 @@ static void fill_own_user() {
}
#ifdef ENABLE_CLI_ANYTCPFWD
/* Turn a "listenport:remoteaddr:remoteport" string into into a forwarding
/* Turn a "[listenaddr:]listenport:remoteaddr:remoteport" string into into a forwarding
* set, and add it to the forwarding list */
static void addforward(const char* origstr, m_list *fwdlist) {
char *part1 = NULL, *part2 = NULL, *part3 = NULL, *part4 = NULL;
char * listenaddr = NULL;
char * listenport = NULL;
char * connectport = NULL;
char * connectaddr = NULL;
char * connectport = NULL;
struct TCPFwdEntry* newfwd = NULL;
char * str = NULL;
@@ -644,23 +646,43 @@ static void addforward(const char* origstr, m_list *fwdlist) {
is never free()d. */
str = m_strdup(origstr);
listenport = str;
part1 = str;
connectaddr = strchr(str, ':');
if (connectaddr == NULL) {
TRACE(("connectaddr == NULL"))
part2 = strchr(str, ':');
if (part2 == NULL) {
TRACE(("part2 == NULL"))
goto fail;
}
*connectaddr = '\0';
connectaddr++;
*part2 = '\0';
part2++;
connectport = strchr(connectaddr, ':');
if (connectport == NULL) {
TRACE(("connectport == NULL"))
part3 = strchr(part2, ':');
if (part3 == NULL) {
TRACE(("part3 == NULL"))
goto fail;
}
*connectport = '\0';
connectport++;
*part3 = '\0';
part3++;
part4 = strchr(part3, ':');
if (part4) {
*part4 = '\0';
part4++;
}
if (part4) {
listenaddr = part1;
listenport = part2;
connectaddr = part3;
connectport = part4;
} else {
listenaddr = NULL;
listenport = part1;
connectaddr = part2;
connectport = part3;
}
}
newfwd = m_malloc(sizeof(struct TCPFwdEntry));
@@ -676,6 +698,7 @@ static void addforward(const char* origstr, m_list *fwdlist) {
goto fail;
}
newfwd->listenaddr = listenaddr;
newfwd->connectaddr = connectaddr;
if (newfwd->listenport > 65535) {