From 174a9f39da1f09c6ffd9c6f0b3a6a42da5ec4163 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sun, 28 Nov 2010 22:55:24 +0000 Subject: source address to connect from can now be specified git-svn-id: https://svn.spreadspace.org/tcpproxy/trunk@13 e61f0598-a718-4e21-a8f0-0aadfa62ad6b --- src/listener.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'src/listener.c') diff --git a/src/listener.c b/src/listener.c index e649bf8..5e34c3d 100644 --- a/src/listener.c +++ b/src/listener.c @@ -66,7 +66,7 @@ void listener_clear(listeners_t* list) slist_clear(list); } -int listener_add(listeners_t* list, const char* laddr, const char* lport, const char* raddr, const char* rport) +int listener_add(listeners_t* list, const char* laddr, const char* lport, const char* raddr, const char* rport, const char* saddr) { if(!list) return -1; @@ -76,9 +76,20 @@ int listener_add(listeners_t* list, const char* laddr, const char* lport, const if(!re) return -1; + struct addrinfo* se = NULL; + if(saddr) { + se = tcp_resolve_endpoint(saddr, NULL, ANY); + if(!se) { + freeaddrinfo(re); + return -1; + } + } + struct addrinfo* le = tcp_resolve_endpoint(laddr, lport, ANY); if(!le) { freeaddrinfo(re); + if(se) + freeaddrinfo(se); return -1; } @@ -93,6 +104,10 @@ int listener_add(listeners_t* list, const char* laddr, const char* lport, const memset(&(element->remote_end_), 0, sizeof(element->remote_end_)); memcpy(&(element->remote_end_), re->ai_addr, re->ai_addrlen); + memset(&(element->source_end_), 0, sizeof(element->source_end_)); + if(se) memcpy(&(element->source_end_), se->ai_addr, se->ai_addrlen); + else element->source_end_.ss_family = AF_UNSPEC; + memset(&(element->local_end_), 0, sizeof(element->local_end_)); memcpy(&(element->local_end_), l->ai_addr, l->ai_addrlen); @@ -135,9 +150,11 @@ int listener_add(listeners_t* list, const char* laddr, const char* lport, const char* ls = tcp_endpoint_to_string(element->local_end_); char* rs = tcp_endpoint_to_string(element->remote_end_); - log_printf(NOTICE, "listening on: %s (remote: %s)", ls ? ls:"(null)", rs ? rs:"(null)"); + char* ss = tcp_endpoint_to_string(element->source_end_); + log_printf(NOTICE, "listening on: %s (remote: %s%s%s)", ls ? ls:"(null)", rs ? rs:"(null)", ss ? " with source " : "", ss ? ss : ""); if(ls) free(ls); if(rs) free(rs); + if(ss) free(ss); if(slist_add(list, element) == NULL) { close(element->fd_); @@ -149,6 +166,7 @@ int listener_add(listeners_t* list, const char* laddr, const char* lport, const l = l->ai_next; } freeaddrinfo(re); + if(se) freeaddrinfo(se); freeaddrinfo(le); return ret; @@ -231,7 +249,7 @@ int listener_handle_accept(listeners_t* list, clients_t* clients, fd_set* set) if(rs) free(rs); FD_CLR(l->fd_, set); - clients_add(clients, new_client, &(l->remote_end_)); + clients_add(clients, new_client, &(l->remote_end_), &(l->source_end_)); } tmp = tmp->next_; } -- cgit v1.2.3