diff options
author | Adam Hamsik <adam.hamsik@chilisys.com> | 2012-07-24 16:37:20 +0400 |
---|---|---|
committer | Adam Hamsik <adam.hamsik@chilisys.com> | 2012-07-24 16:37:20 +0400 |
commit | 5b7270d75b181cd0fb59e4e6983ec606e48c275a (patch) | |
tree | b751293705f07ad8391d54cd7847e0a050862cbc | |
parent | e6b5f245f7c9a3a527648ca897e92daf81784353 (diff) |
Add new thread-safe getsrvbyname for MacOS Xproxychains-4.1.0
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | src/core.c | 34 | ||||
-rw-r--r-- | src/core.h | 5 | ||||
-rw-r--r-- | src/libproxychains.c | 5 |
4 files changed, 41 insertions, 6 deletions
@@ -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) @@ -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); @@ -42,6 +42,11 @@ extern internal_ip_lookup_table internal_ips; #ifdef THREAD_SAFE #include <pthread.h> 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); |