summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2011-01-08 16:15:40 +0100
committerGravatar Nikias Bassen2011-01-08 16:15:40 +0100
commit32e27781dc6e4d2ef3508a0708284f22ee16ea1c (patch)
tree507a325cc4348799ae141708454332d2d0e0d9bc
parent0ca8f1c05bea2c1f4d53aa165079588ea6519847 (diff)
downloadusbmuxd-32e27781dc6e4d2ef3508a0708284f22ee16ea1c.tar.gz
usbmuxd-32e27781dc6e4d2ef3508a0708284f22ee16ea1c.tar.bz2
libusbmuxd/iproxy: use windows threads instead of pthread for win32 build
-rw-r--r--libusbmuxd/CMakeLists.txt3
-rw-r--r--libusbmuxd/libusbmuxd.c24
-rw-r--r--tools/iproxy.c32
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;
}