From 5b7270d75b181cd0fb59e4e6983ec606e48c275a Mon Sep 17 00:00:00 2001 From: Adam Hamsik Date: Tue, 24 Jul 2012 14:37:20 +0200 Subject: Add new thread-safe getsrvbyname for MacOS X --- Makefile | 3 +-- src/core.c | 34 ++++++++++++++++++++++++++++++---- src/core.h | 5 +++++ src/libproxychains.c | 5 +++++ 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 6e9f122..a5072a0 100644 --- a/Makefile +++ b/Makefile @@ -37,11 +37,10 @@ ALL_LIBS = $(SHARED_LIBS) PXCHAINS = proxychains4 ALL_TOOLS = $(PXCHAINS) - CCFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS) LDFLAGS+=$(USER_LDFLAGS) $(MAC_LDFLAGS) CXXFLAGS+=$(CCFLAGS) $(USER_CFLAGS) $(MAC_CFLAGS) -CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DINSTALL_PREFIX=\"$(prefix)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" +CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DINSTALL_PREFIX=\"$(prefix)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" -DSYSCONFDIR=\"$(confdir)\" all: $(ALL_LIBS) $(ALL_TOOLS) diff --git a/src/core.c b/src/core.c index c818cf9..25e8fdf 100644 --- a/src/core.c +++ b/src/core.c @@ -819,6 +819,31 @@ void proxy_freeaddrinfo(struct addrinfo *res) { free(res); } +void proxy_getserverbyname(const char * service, struct servent *se_buf, + char * buf, size_t buf_len, struct servent **se_result) +{ + +#ifdef __linux__ + getservbyname_r(service, NULL, se_buf, buf, buf_len, se_result); +#endif + +#ifdef __APPLE__ + struct servent *se; +#ifdef THREAD_SAFE + MUTEX_LOCK(&internal_getsrvbyname_lock); +#endif + if(service) + se = getservbyname(service, NULL); + if (!se) + memcpy(se_buf, se, buf_len); + *se_result = se_buf; +#ifdef THREAD_SAFE + MUTEX_UNLOCK(&internal_getsrvbyname_lock); +#endif + +#endif +} + int proxy_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct gethostbyname_data ghdata; @@ -833,7 +858,7 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin // printf("proxy_getaddrinfo node %s service %s\n",node,service); space = calloc(1, sizeof(struct addrinfo_data)); if(!space) goto err1; - + if(node && !inet_aton(node, &((struct sockaddr_in *) &space->sockaddr_space)->sin_addr)) { hp = proxy_gethostbyname(node, &ghdata); if(hp) @@ -842,14 +867,15 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin else goto err2; } - if(service) getservbyname_r(service, NULL, &se_buf, buf, sizeof(buf), &se); + if(service) + proxy_getserverbyname(service, &se_buf, buf, sizeof(buf), &se); port = se ? se->s_port : htons(atoi(service ? service : "0")); ((struct sockaddr_in *) &space->sockaddr_space)->sin_port = port; *res = p = &space->addrinfo_space; assert((size_t)p == (size_t) space); - + p->ai_addr = &space->sockaddr_space; if(node) strncpy(space->addr_name, node, sizeof(space->addr_name)); @@ -865,7 +891,7 @@ int proxy_getaddrinfo(const char *node, const char *service, const struct addrin } else { p->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); } - + goto out; err2: free(space); diff --git a/src/core.h b/src/core.h index 7fcf597..8b28e7f 100644 --- a/src/core.h +++ b/src/core.h @@ -42,6 +42,11 @@ extern internal_ip_lookup_table internal_ips; #ifdef THREAD_SAFE #include pthread_mutex_t internal_ips_lock; + +#ifdef __APPLE__ +pthread_mutex_t internal_getsrvbyname_lock; +#endif + # define MUTEX_LOCK(x) pthread_mutex_lock(x) # define MUTEX_UNLOCK(x) pthread_mutex_unlock(x) # define MUTEX_INIT(x,y) pthread_mutex_init(x, y) diff --git a/src/libproxychains.c b/src/libproxychains.c index 51b34d1..848c278 100644 --- a/src/libproxychains.c +++ b/src/libproxychains.c @@ -96,6 +96,11 @@ static void* load_sym(char* symname, void* proxyfunc) { static void do_init(void) { MUTEX_INIT(&internal_ips_lock, NULL); + +#ifdef __APPLE__ + MUTEX_INIT(&internal_getsrvbyname_lock, NULL); +#endif + /* read the config file */ get_chain_data(proxychains_pd, &proxychains_proxy_count, &proxychains_ct); -- cgit v1.2.3