mirror of
https://github.com/haad/proxychains
synced 2026-06-08 14:30:41 +00:00
Add new thread-safe getsrvbyname for MacOS X
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
+30
-4
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user