diff --git a/.gitignore b/.gitignore index adebe60..1bc2154 100644 --- a/.gitignore +++ b/.gitignore @@ -259,3 +259,11 @@ pip-log.txt .mr.developer.cfg CLAUDE.md bin/3proxy_crypt +bin/3proxy_ftppr +bin/3proxy_pop3p +bin/3proxy_proxy +bin/3proxy_smtpp +bin/3proxy_socks +bin/3proxy_tcppm +bin/3proxy_tlspr +bin/3proxy_udppm diff --git a/src/3proxy.c b/src/3proxy.c index 6942795..19a8367 100644 --- a/src/3proxy.c +++ b/src/3proxy.c @@ -521,13 +521,14 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int pthread_mutex_init(&rad_mutex, NULL); #endif #ifdef _WIN32 - if(!CreatePipe(&conf.threadinit[0], &conf.threadinit[1], NULL, 1)){ -#else - if(pipe(conf.threadinit)) { -#endif - fprintf(stderr, "CreatePipe failed\n"); + conf.threadinit = CreateSemaphore(NULL, 0, 1, NULL); + if(!conf.threadinit){ + fprintf(stderr, "semaphore init failed\n"); return 1; - }; + } +#else + pthread_mutex_init(&conf.threadinit, NULL); +#endif freeconf(&conf); res = readconfig(fp); diff --git a/src/Makefile.inc b/src/Makefile.inc index 8f1da07..272b7dd 100644 --- a/src/Makefile.inc +++ b/src/Makefile.inc @@ -2,14 +2,8 @@ # 3 proxy common Makefile # -# PREFIX: prefix for standalone module binaries (default: 3proxy_) -# CRYPT_PREFIX: prefix for crypt binary (default: same as PREFIX) -PREFIX ?= 3proxy_ -CRYPT_PREFIX ?= $(PREFIX) - all: $(BUILDDIR)3proxy$(EXESUFFICS) $(BUILDDIR)$(CRYPT_PREFIX)crypt$(EXESUFFICS) $(BUILDDIR)$(PREFIX)pop3p$(EXESUFFICS) $(BUILDDIR)$(PREFIX)smtpp$(EXESUFFICS) $(BUILDDIR)$(PREFIX)ftppr$(EXESUFFICS) $(BUILDDIR)$(PREFIX)tcppm$(EXESUFFICS) $(BUILDDIR)$(PREFIX)udppm$(EXESUFFICS) $(BUILDDIR)$(PREFIX)tlspr$(EXESUFFICS) $(BUILDDIR)$(PREFIX)socks$(EXESUFFICS) $(BUILDDIR)$(PREFIX)proxy$(EXESUFFICS) allplugins - sockmap$(OBJSUFFICS): sockmap.c proxy.h structures.h $(CC) $(CFLAGS) sockmap.c diff --git a/src/common.c b/src/common.c index cb1b88d..6c56184 100644 --- a/src/common.c +++ b/src/common.c @@ -144,7 +144,11 @@ int timeouts[12] = { }; struct extparam conf = { - .threadinit = {0, 0}, +#ifdef _WIN32 + .threadinit = NULL, +#else + .threadinit = 0, +#endif .timeouts = timeouts, .acl = NULL, .conffile = NULL, diff --git a/src/conf.c b/src/conf.c index 8c1ac66..cd635ce 100644 --- a/src/conf.c +++ b/src/conf.c @@ -151,9 +151,7 @@ int start_proxy_thread(struct child * chp){ pthread_t thread; #ifdef _WIN32 HANDLE h; - DWORD num; #endif - char r[1]; #ifdef _WIN32 #ifndef _WINCE @@ -166,16 +164,15 @@ int start_proxy_thread(struct child * chp){ pthread_attr_init(&pa); pthread_attr_setstacksize(&pa,PTHREAD_STACK_MIN + (32768+conf.stacksize)); pthread_attr_setdetachstate(&pa,PTHREAD_CREATE_DETACHED); + pthread_mutex_lock(&conf.threadinit); pthread_create(&thread, &pa, startsrv, (void *)chp); pthread_attr_destroy(&pa); #endif #ifdef _WIN32 - ReadFile(conf.threadinit[0], r, 1, &num, NULL); + WaitForSingleObject(conf.threadinit, INFINITE); #else - while(read(conf.threadinit[0], r, 1) !=1) if(errno != EINTR) { - fprintf(stderr, "pipe failed\n"); - return 40; - } + pthread_mutex_lock(&conf.threadinit); + pthread_mutex_unlock(&conf.threadinit); #endif if(haveerror) { fprintf(stderr, "Service not started on line: %d%s\n", linenum, haveerror == 2? ": insufficient memory":""); diff --git a/src/proxymain.c b/src/proxymain.c index b6c35fa..60649ea 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -117,10 +117,10 @@ void * threadfunc (void *p) { int pushthreadinit(){ #ifdef _WIN32 - DWORD n; - return WriteFile(conf.threadinit[1], "1", 1, &n, NULL); + return ReleaseSemaphore(conf.threadinit, 1, NULL) ? 1 : 0; #else - return write(conf.threadinit[1], "1", 1); + pthread_mutex_unlock(&conf.threadinit); + return 1; #endif } diff --git a/src/structures.h b/src/structures.h index 969ca07..81abbe2 100644 --- a/src/structures.h +++ b/src/structures.h @@ -673,9 +673,9 @@ struct filemon { struct extparam { #ifdef _WIN32 - HANDLE threadinit[2]; + HANDLE threadinit; #else - int threadinit[2]; + pthread_mutex_t threadinit; #endif int *timeouts; struct ace * acl;