diff options
| -rw-r--r-- | libusbmuxd/CMakeLists.txt | 3 | ||||
| -rw-r--r-- | libusbmuxd/libusbmuxd.c | 24 | ||||
| -rw-r--r-- | tools/iproxy.c | 32 | 
3 files changed, 57 insertions, 2 deletions
diff --git a/libusbmuxd/CMakeLists.txt b/libusbmuxd/CMakeLists.txt index a3d5fbe..737eb02 100644 --- a/libusbmuxd/CMakeLists.txt +++ b/libusbmuxd/CMakeLists.txt @@ -33,6 +33,9 @@ set_target_properties(libusbmuxd PROPERTIES SOVERSION ${LIBUSBMUXD_SOVERSION})  if(APPLE)    set_target_properties(libusbmuxd PROPERTIES INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}")  endif() +if(WIN32) +  set_target_properties(libusbmuxd PROPERTIES PREFIX "lib" IMPORT_PREFIX "lib") +endif()  install(TARGETS libusbmuxd  	RUNTIME DESTINATION bin diff --git a/libusbmuxd/libusbmuxd.c b/libusbmuxd/libusbmuxd.c index 304e8da..e06ee61 100644 --- a/libusbmuxd/libusbmuxd.c +++ b/libusbmuxd/libusbmuxd.c @@ -30,9 +30,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA  #include <windows.h>  #include <winsock2.h>  #define sleep(x) Sleep(x*1000) +#define EPROTO 71 +#define EBADMSG 77  #else  #include <sys/socket.h>  #include <arpa/inet.h> +#include <pthread.h>  #endif  #ifdef HAVE_INOTIFY @@ -45,7 +48,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA  #include <unistd.h>  #include <signal.h> -#include <pthread.h>  #ifdef HAVE_PLIST  #include <plist/plist.h> @@ -65,7 +67,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA  static struct collection devices;  static usbmuxd_event_cb_t event_cb = NULL; +#ifdef WIN32 +HANDLE devmon = NULL; +#else  pthread_t devmon; +#endif  static int listenfd = -1;  static int use_tag = 0; @@ -605,7 +611,15 @@ int usbmuxd_subscribe(usbmuxd_event_cb_t callback, void *user_data)  	}  	event_cb = callback; +#ifdef WIN32 +	res = 0; +	devmon = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)device_monitor, user_data, 0, NULL); +	if (devmon == NULL) { +		res = GetLastError(); +	} +#else  	res = pthread_create(&devmon, NULL, device_monitor, user_data); +#endif  	if (res != 0) {  		fprintf(stderr, "%s: ERROR: Could not start device watcher thread!\n", __func__);  		return res; @@ -617,12 +631,20 @@ int usbmuxd_unsubscribe()  {  	event_cb = NULL; +#ifdef WIN32 +	if (devmon != NULL) { +		close_socket(listenfd); +		listenfd = -1; +		WaitForSingleObject(devmon, INFINITE); +	} +#else  	if (pthread_kill(devmon, 0) == 0) {  		close_socket(listenfd);  		listenfd = -1;  		pthread_kill(devmon, SIGINT);  		pthread_join(devmon, NULL);  	} +#endif  	return 0;  } diff --git a/tools/iproxy.c b/tools/iproxy.c index 4469c48..0bc38fb 100644 --- a/tools/iproxy.c +++ b/tools/iproxy.c @@ -40,9 +40,9 @@ typedef unsigned int socklen_t;  #include <sys/socket.h>  #include <sys/un.h>  #include <arpa/inet.h> -#endif  #include <pthread.h>  #include <netinet/in.h> +#endif  #include "sock_stuff.h"  #include "usbmuxd.h" @@ -105,12 +105,20 @@ void *run_ctos_loop(void *arg)      int recv_len;      int sent;      char buffer[131072]; +#ifdef WIN32 +    HANDLE stoc = NULL; +#else      pthread_t stoc; +#endif      printf("%s: fd = %d\n", __func__, cdata->fd);      cdata->stop_stoc = 0; +#ifdef WIN32 +    stoc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)run_stoc_loop, cdata, 0, NULL); +#else      pthread_create(&stoc, NULL, run_stoc_loop, cdata); +#endif      while (!cdata->stop_ctos && cdata->fd>0 && cdata->sfd>0) {  	recv_len = recv_buf_timeout(cdata->fd, buffer, sizeof(buffer), 0, 5000); @@ -143,7 +151,11 @@ void *run_ctos_loop(void *arg)      cdata->fd = -1;      cdata->stop_stoc = 1; +#ifdef WIN32 +    WaitForSingleObject(stoc, INFINITE); +#else      pthread_join(stoc, NULL); +#endif      return NULL;  } @@ -152,7 +164,11 @@ void *acceptor_thread(void *arg)  {      struct client_data *cdata;      usbmuxd_device_info_t *dev_list = NULL; +#ifdef WIN32 +    HANDLE ctos = NULL; +#else      pthread_t ctos; +#endif      int count;      if (!arg) { @@ -184,8 +200,13 @@ void *acceptor_thread(void *arg)      	fprintf(stderr, "Error connecting to device!\n");      } else {  	cdata->stop_ctos = 0; +#ifdef WIN32 +	ctos = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)run_ctos_loop, cdata, 0, NULL); +	WaitForSingleObject(ctos, INFINITE); +#else  	pthread_create(&ctos, NULL, run_ctos_loop, cdata);  	pthread_join(ctos, NULL); +#endif      }      if (cdata->fd > 0) { @@ -226,7 +247,11 @@ int main(int argc, char **argv)  	fprintf(stderr, "Error creating socket: %s\n", strerror(errno));  	return -errno;      } else { +#ifdef WIN32 +	HANDLE acceptor = NULL; +#else  	pthread_t acceptor; +#endif  	struct sockaddr_in c_addr;  	socklen_t len = sizeof(struct sockaddr_in);  	struct client_data cdata; @@ -237,8 +262,13 @@ int main(int argc, char **argv)  	    if (c_sock) {  		printf("accepted connection, fd = %d\n", c_sock);  		cdata.fd = c_sock; +#ifdef WIN32 +		acceptor = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)acceptor_thread, &cdata, 0, NULL); +		WaitForSingleObject(acceptor, INFINITE); +#else  		pthread_create(&acceptor, NULL, acceptor_thread, &cdata);  		pthread_join(acceptor, NULL); +#endif  	    } else {  		break;  	    }  | 
