From 92fbf5821f465452031bfb05559632992f92e424 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Fri, 2 Nov 2007 23:23:25 +0000 Subject: [PATCH] * Divert connect() so that -p/--ports now works with outbound connections. --- src/lib-fd.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/src/lib-fd.c b/src/lib-fd.c index 2502760..dc20be9 100644 --- a/src/lib-fd.c +++ b/src/lib-fd.c @@ -89,6 +89,10 @@ static int (*ORIG(accept)) (int sockfd, struct sockaddr *addr, static int (*ORIG(bind)) (int sockfd, const struct sockaddr *my_addr, SOCKLEN_T addrlen); #endif +#if defined HAVE_CONNECT +static int (*ORIG(connect)) (int sockfd, const struct sockaddr *serv_addr, + SOCKLEN_T addrlen); +#endif #if defined HAVE_SOCKET static int (*ORIG(socket)) (int domain, int type, int protocol); #endif @@ -230,6 +234,48 @@ int NEW(bind)(int sockfd, const struct sockaddr *my_addr, SOCKLEN_T addrlen) } #endif +#if defined HAVE_CONNECT +int NEW(connect)(int sockfd, const struct sockaddr *serv_addr, + SOCKLEN_T addrlen) +{ + int ret; + + LOADSYM(connect); + ret = ORIG(connect)(sockfd, serv_addr, addrlen); + if(!_zz_ready || _zz_islocked(-1) || !_zz_network) + return ret; + + if(ret >= 0) + { + const struct sockaddr_in* in = (const struct sockaddr_in *)serv_addr; + long int port; + + switch(serv_addr->sa_family) + { + case AF_INET: +#if defined AF_INET6 + case AF_INET6: +#endif + case AF_UNSPEC: + port = ntohs(in->sin_port); + if(!_zz_portwatched(port)) + { + _zz_unregister(sockfd); + return ret; + } + break; + default: + break; + } + + debug("%s(%i, %p, %i) = %i", __func__, + sockfd, serv_addr, (int)addrlen, ret); + } + + return ret; +} +#endif + #if defined HAVE_SOCKET int NEW(socket)(int domain, int type, int protocol) {