Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/haad/proxychains.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Hamsik <adam.hamsik@chilisys.com>2012-07-24 16:37:20 +0400
committerAdam Hamsik <adam.hamsik@chilisys.com>2012-07-24 16:37:20 +0400
commit5b7270d75b181cd0fb59e4e6983ec606e48c275a (patch)
treeb751293705f07ad8391d54cd7847e0a050862cbc
parente6b5f245f7c9a3a527648ca897e92daf81784353 (diff)
Add new thread-safe getsrvbyname for MacOS Xproxychains-4.1.0
-rw-r--r--Makefile3
-rw-r--r--src/core.c34
-rw-r--r--src/core.h5
-rw-r--r--src/libproxychains.c5
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.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);