diff --git a/src/Makefile.am b/src/Makefile.am
index 71f218c..4cd338e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,7 +8,7 @@
 libusbmuxd_la_LIBADD =
 libusbmuxd_la_SOURCES = \
 		collection.c collection.h \
-		sock_stuff.c sock_stuff.h \
+		socket.c socket.h \
 		libusbmuxd.c
 
 if WIN32
diff --git a/src/libusbmuxd.c b/src/libusbmuxd.c
index 1cf6dcb..97114a8 100644
--- a/src/libusbmuxd.c
+++ b/src/libusbmuxd.c
@@ -69,7 +69,7 @@
 // usbmuxd protocol
 #include "usbmuxd-proto.h"
 // socket utility functions
-#include "sock_stuff.h"
+#include "socket.h"
 // misc utility functions
 #include "collection.h"
 
@@ -111,9 +111,9 @@
 static int connect_usbmuxd_socket()
 {
 #if defined(WIN32) || defined(__CYGWIN__)
-	return connect_socket("127.0.0.1", USBMUXD_SOCKET_PORT);
+	return socket_connect("127.0.0.1", USBMUXD_SOCKET_PORT);
 #else
-	return connect_unix_socket(USBMUXD_SOCKET_FILE);
+	return socket_connect_unix(USBMUXD_SOCKET_FILE);
 #endif
 }
 
@@ -169,7 +169,7 @@
 	header->message = 0;
 	header->tag = 0;
 
-	recv_len = recv_buf_timeout(sfd, &hdr, sizeof(hdr), 0, timeout);
+	recv_len = socket_receive_timeout(sfd, &hdr, sizeof(hdr), 0, timeout);
 	if (recv_len < 0) {
 		return recv_len;
 	} else if ((size_t)recv_len < sizeof(hdr)) {
@@ -179,7 +179,7 @@
 	uint32_t payload_size = hdr.length - sizeof(hdr);
 	if (payload_size > 0) {
 		payload_loc = (char*)malloc(payload_size);
-		if (recv_buf_timeout(sfd, payload_loc, payload_size, 0, 5000) != (int)payload_size) {
+		if (socket_receive_timeout(sfd, payload_loc, payload_size, 0, 5000) != (int)payload_size) {
 			DEBUG(1, "%s: Error receiving payload of size %d\n", __func__, payload_size);
 			free(payload_loc);
 			return -EBADMSG;
@@ -204,7 +204,7 @@
 			memcpy(header, &hdr, sizeof(hdr));
 			return hdr.length;
 		}
-		
+
 		plist_get_string_val(node, &message);
 		if (message) {
 			uint64_t val = 0;
@@ -338,17 +338,17 @@
 	if (payload && (payload_size > 0)) {
 		header.length += payload_size;
 	}
-	int sent = send_buf(sfd, &header, sizeof(header));
+	int sent = socket_send(sfd, &header, sizeof(header));
 	if (sent != sizeof(header)) {
 		DEBUG(1, "%s: ERROR: could not send packet header\n", __func__);
 		return -1;
 	}
 	if (payload && (payload_size > 0)) {
-		sent += send_buf(sfd, payload, payload_size);
+		sent += socket_send(sfd, payload, payload_size);
 	}
 	if (sent != (int)header.length) {
 		DEBUG(1, "%s: ERROR: could not send whole packet\n", __func__);
-		close_socket(sfd);
+		socket_close(sfd);
 		return -1;
 	}
 	return sent;
@@ -591,11 +591,11 @@
 	tag = ++use_tag;
 	if (send_listen_packet(sfd, tag) <= 0) {
 		DEBUG(1, "%s: ERROR: could not send listen packet\n", __func__);
-		close_socket(sfd);
+		socket_close(sfd);
 		return -1;
 	}
 	if (usbmuxd_get_result(sfd, tag, &res, NULL) && (res != 0)) {
-		close_socket(sfd);
+		socket_close(sfd);
 		if ((res == RESULT_BADVERSION) && (proto_version == 1)) {
 			proto_version = 0;
 			goto retry;
@@ -685,7 +685,7 @@
 	} ENDFOREACH
 	collection_free(&devices);
 
-	close_socket(listenfd);
+	socket_close(listenfd);
 	listenfd = -1;
 }
 
@@ -753,7 +753,7 @@
 {
 	event_cb = NULL;
 
-	shutdown_socket(listenfd, SHUT_RDWR);
+	socket_shutdown(listenfd, SHUT_RDWR);
 
 #ifdef WIN32
 	if (devmon != NULL) {
@@ -842,7 +842,7 @@
 				if (res == RESULT_BADVERSION) {
 					proto_version = 0;
 				}
-				close_socket(sfd);
+				socket_close(sfd);
 				try_list_devices = 0;
 				goto retry;
 			}
@@ -856,7 +856,7 @@
 		if (usbmuxd_get_result(sfd, tag, &res, NULL) && (res == 0)) {
 			listen_success = 1;
 		} else {
-			close_socket(sfd);
+			socket_close(sfd);
 			if ((res == RESULT_BADVERSION) && (proto_version == 1)) {
 				proto_version = 0;
 				goto retry;
@@ -918,7 +918,7 @@
 got_device_list:
 
 	// explicitly close connection
-	close_socket(sfd);
+	socket_close(sfd);
 
 	// create copy of device info entries from collection
 	newlist = (usbmuxd_device_info_t*)malloc(sizeof(usbmuxd_device_info_t) * (collection_count(&tmpdevs) + 1));
@@ -1009,7 +1009,7 @@
 			} else {
 				if ((res == RESULT_BADVERSION) && (proto_version == 1)) {
 					proto_version = 0;
-					close_socket(sfd);
+					socket_close(sfd);
 					goto retry;
 				}
 				DEBUG(1, "%s: Connect failed, Error code=%d\n", __func__, res);
@@ -1021,14 +1021,14 @@
 		return sfd;
 	}
 
-	close_socket(sfd);
+	socket_close(sfd);
 
 	return -1;
 }
 
 int usbmuxd_disconnect(int sfd)
 {
-	return close_socket(sfd);
+	return socket_close(sfd);
 }
 
 int usbmuxd_send(int sfd, const char *data, uint32_t len, uint32_t *sent_bytes)
@@ -1056,7 +1056,7 @@
 
 int usbmuxd_recv_timeout(int sfd, char *data, uint32_t len, uint32_t *recv_bytes, unsigned int timeout)
 {
-	int num_recv = recv_buf_timeout(sfd, (void*)data, len, 0, timeout);
+	int num_recv = socket_receive_timeout(sfd, (void*)data, len, 0, timeout);
 	if (num_recv < 0) {
 		*recv_bytes = 0;
 		return num_recv;
@@ -1241,5 +1241,5 @@
 void libusbmuxd_set_debug_level(int level)
 {
 	libusbmuxd_debug = level;
-	sock_stuff_set_verbose(level);
+	socket_set_verbose(level);
 }
diff --git a/src/sock_stuff.h b/src/sock_stuff.h
deleted file mode 100644
index 5efcd27..0000000
--- a/src/sock_stuff.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
-	libusbmuxd - client library to talk to usbmuxd
-
-Copyright (C) 2009	Nikias Bassen <nikias@gmx.li>
-Copyright (C) 2009	Paul Sladen <libiphone@paul.sladen.org>
-Copyright (C) 2009	Martin Szulecki <opensuse@sukimashita.com>
-
-This library is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as
-published by the Free Software Foundation, either version 2.1 of the
-License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-*/
-
-#ifndef __SOCK_STUFF_H
-#define __SOCK_STUFF_H
-
-#include <stdint.h>
-
-enum fd_mode {
-	FDM_READ,
-	FDM_WRITE,
-	FDM_EXCEPT
-};
-typedef enum fd_mode fd_mode;
-
-#ifdef WIN32
-#include <winsock2.h>
-#define SHUT_RD SD_READ
-#define SHUT_WR SD_WRITE
-#define SHUT_RDWR SD_BOTH
-#endif
-
-#ifndef WIN32
-int create_unix_socket(const char *filename);
-int connect_unix_socket(const char *filename);
-#endif
-int create_socket(uint16_t port);
-#if defined(WIN32) || defined(__CYGWIN__)
-int connect_socket(const char *addr, uint16_t port);
-#endif
-int check_fd(int fd, fd_mode fdm, unsigned int timeout);
-
-int shutdown_socket(int fd, int how);
-int close_socket(int fd);
-
-int recv_buf(int fd, void *data, size_t size);
-int peek_buf(int fd, void *data, size_t size);
-int recv_buf_timeout(int fd, void *data, size_t size, int flags,
-					 unsigned int timeout);
-
-int send_buf(int fd, void *data, size_t size);
-
-void sock_stuff_set_verbose(int level);
-
-#endif							/* __SOCK_STUFF_H */
diff --git a/src/sock_stuff.c b/src/socket.c
similarity index 73%
rename from src/sock_stuff.c
rename to src/socket.c
index 609c8ad..c35de33 100644
--- a/src/sock_stuff.c
+++ b/src/socket.c
@@ -1,25 +1,23 @@
 /*
-	libusbmuxd - client library to talk to usbmuxd
-
-Copyright (C) 2009	Nikias Bassen <nikias@gmx.li>
-Copyright (C) 2009	Paul Sladen <libiphone@paul.sladen.org>
-Copyright (C) 2009	Martin Szulecki <opensuse@sukimashita.com>
-
-This library is free software; you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as
-published by the Free Software Foundation, either version 2.1 of the
-License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-*/
+ * socket.c
+ *
+ * Copyright (c) 2012 Martin Szulecki All Rights Reserved.
+ * Copyright (c) 2012 Nikias Bassen All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA 
+ */
 
 #include <stdio.h>
 #include <stddef.h>
@@ -30,8 +28,8 @@
 #include <sys/time.h>
 #include <sys/stat.h>
 #ifdef WIN32
-#include <windows.h>
 #include <winsock2.h>
+#include <windows.h>
 static int wsa_init = 0;
 #else
 #include <sys/socket.h>
@@ -40,19 +38,19 @@
 #include <netdb.h>
 #include <arpa/inet.h>
 #endif
-#include "sock_stuff.h"
+#include "socket.h"
 
 #define RECV_TIMEOUT 20000
 
 static int verbose = 0;
 
-void sock_stuff_set_verbose(int level)
+void socket_set_verbose(int level)
 {
 	verbose = level;
 }
 
 #ifndef WIN32
-int create_unix_socket(const char *filename)
+int socket_create_unix(const char *filename)
 {
 	struct sockaddr_un name;
 	int sock;
@@ -85,20 +83,20 @@
 
 	if (bind(sock, (struct sockaddr *) &name, size) < 0) {
 		perror("bind");
-		close_socket(sock);
+		socket_close(sock);
 		return -1;
 	}
 
 	if (listen(sock, 10) < 0) {
 		perror("listen");
-		close_socket(sock);
+		socket_close(sock);
 		return -1;
 	}
 
 	return sock;
 }
 
-int connect_unix_socket(const char *filename)
+int socket_connect_unix(const char *filename)
 {
 	struct sockaddr_un name;
 	int sfd = -1;
@@ -134,7 +132,7 @@
 			+ strlen(name.sun_path) + 1);
 
 	if (connect(sfd, (struct sockaddr *) &name, size) < 0) {
-		close_socket(sfd);
+		socket_close(sfd);
 		if (verbose >= 2)
 			fprintf(stderr, "%s: connect: %s\n", __func__,
 					strerror(errno));
@@ -145,7 +143,7 @@
 }
 #endif
 
-int create_socket(uint16_t port)
+int socket_create(uint16_t port)
 {
 	int sfd = -1;
 	int yes = 1;
@@ -168,7 +166,7 @@
 
 	if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) {
 		perror("setsockopt()");
-		close_socket(sfd);
+		socket_close(sfd);
 		return -1;
 	}
 
@@ -179,21 +177,20 @@
 
 	if (0 > bind(sfd, (struct sockaddr *) &saddr, sizeof(saddr))) {
 		perror("bind()");
-		close_socket(sfd);
+		socket_close(sfd);
 		return -1;
 	}
 
 	if (listen(sfd, 1) == -1) {
 		perror("listen()");
-		close_socket(sfd);
+		socket_close(sfd);
 		return -1;
 	}
 
 	return sfd;
 }
 
-#if defined(WIN32) || defined(__CYGWIN__)
-int connect_socket(const char *addr, uint16_t port)
+int socket_connect(const char *addr, uint16_t port)
 {
 	int sfd = -1;
 	int yes = 1;
@@ -235,7 +232,7 @@
 
 	if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, (void*)&yes, sizeof(int)) == -1) {
 		perror("setsockopt()");
-		close_socket(sfd);
+		socket_close(sfd);
 		return -1;
 	}
 
@@ -246,15 +243,14 @@
 
 	if (connect(sfd, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) {
 		perror("connect");
-		close_socket(sfd);
+		socket_close(sfd);
 		return -2;
 	}
 
 	return sfd;
 }
-#endif /* WIN32 || __CYGWIN__ */
 
-int check_fd(int fd, fd_mode fdm, unsigned int timeout)
+int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout)
 {
 	fd_set fds;
 	int sret;
@@ -321,12 +317,33 @@
 	return sret;
 }
 
-int shutdown_socket(int fd, int how)
+int socket_accept(int fd, uint16_t port)
+{
+#ifdef WIN32
+	int addr_len;
+#else
+	socklen_t addr_len;
+#endif
+	int result;
+	struct sockaddr_in addr;
+
+	memset(&addr, 0, sizeof(addr));
+	addr.sin_family = AF_INET;
+	addr.sin_addr.s_addr = htonl(INADDR_ANY);
+	addr.sin_port = htons(port);
+
+	addr_len = sizeof(addr);
+	result = accept(fd, (struct sockaddr*)&addr, &addr_len);
+
+	return result;
+}
+
+int socket_shutdown(int fd, int how)
 {
 	return shutdown(fd, how);
 }
 
-int close_socket(int fd) {
+int socket_close(int fd) {
 #ifdef WIN32
 	return closesocket(fd);
 #else
@@ -334,24 +351,24 @@
 #endif
 }
 
-int recv_buf(int fd, void *data, size_t length)
+int socket_receive(int fd, void *data, size_t length)
 {
-	return recv_buf_timeout(fd, data, length, 0, RECV_TIMEOUT);
+	return socket_receive_timeout(fd, data, length, 0, RECV_TIMEOUT);
 }
 
-int peek_buf(int fd, void *data, size_t length)
+int socket_peek(int fd, void *data, size_t length)
 {
-	return recv_buf_timeout(fd, data, length, MSG_PEEK, RECV_TIMEOUT);
+	return socket_receive_timeout(fd, data, length, MSG_PEEK, RECV_TIMEOUT);
 }
 
-int recv_buf_timeout(int fd, void *data, size_t length, int flags,
+int socket_receive_timeout(int fd, void *data, size_t length, int flags,
 					 unsigned int timeout)
 {
 	int res;
 	int result;
 
 	// check if data is available
-	res = check_fd(fd, FDM_READ, timeout);
+	res = socket_check_fd(fd, FDM_READ, timeout);
 	if (res <= 0) {
 		return res;
 	}
@@ -369,7 +386,7 @@
 	return result;
 }
 
-int send_buf(int fd, void *data, size_t length)
+int socket_send(int fd, void *data, size_t length)
 {
 	return send(fd, data, length, 0);
 }
diff --git a/src/socket.h b/src/socket.h
new file mode 100644
index 0000000..c2b2599
--- /dev/null
+++ b/src/socket.h
@@ -0,0 +1,65 @@
+/*
+ * socket.h
+ *
+ * Copyright (c) 2012 Martin Szulecki All Rights Reserved.
+ * Copyright (c) 2012 Nikias Bassen All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ * 
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA 
+ */
+
+#ifndef __SOCKET_SOCKET_H
+#define __SOCKET_SOCKET_H
+
+#include <stdlib.h>
+#include <stdint.h>
+
+enum fd_mode {
+	FDM_READ,
+	FDM_WRITE,
+	FDM_EXCEPT
+};
+typedef enum fd_mode fd_mode;
+
+#ifdef WIN32
+#include <winsock2.h>
+#define SHUT_RD SD_READ
+#define SHUT_WR SD_WRITE
+#define SHUT_RDWR SD_BOTH
+#else
+#include <sys/socket.h>
+#endif
+
+#ifndef WIN32
+int socket_create_unix(const char *filename);
+int socket_connect_unix(const char *filename);
+#endif
+int socket_create(uint16_t port);
+int socket_connect(const char *addr, uint16_t port);
+int socket_check_fd(int fd, fd_mode fdm, unsigned int timeout);
+int socket_accept(int fd, uint16_t port);
+
+int socket_shutdown(int fd, int how);
+int socket_close(int fd);
+
+int socket_receive(int fd, void *data, size_t size);
+int socket_peek(int fd, void *data, size_t size);
+int socket_receive_timeout(int fd, void *data, size_t size, int flags,
+					 unsigned int timeout);
+
+int socket_send(int fd, void *data, size_t size);
+
+void socket_set_verbose(int level);
+
+#endif	/* __SOCKET_SOCKET_H */
diff --git a/tools/iproxy.c b/tools/iproxy.c
index f7c0827..abda951 100644
--- a/tools/iproxy.c
+++ b/tools/iproxy.c
@@ -1,29 +1,27 @@
 /*
-	iproxy -- proxy that enables tcp service access to iPhone/iPod
-
-Copyright (C) 2009	Nikias Bassen <nikias@gmx.li>
-Copyright (C) 2009	Paul Sladen <libiphone@paul.sladen.org>
-
-Based upon iTunnel source code, Copyright (c) 2008 Jing Su.
-http://www.cs.toronto.edu/~jingsu/itunnel/
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
-
-TODO: improve code...
-
-*/
+ * iproxy.c -- proxy that enables tcp service access to iOS devices
+ * 
+ * Copyright (C) 2014	Martin Szulecki <m.szulecki@libimobiledevice.org>
+ * Copyright (C) 2009	Nikias Bassen <nikias@gmx.li>
+ * Copyright (C) 2009	Paul Sladen <libiphone@paul.sladen.org>
+ * 
+ * Based upon iTunnel source code, Copyright (c) 2008 Jing Su.
+ * http://www.cs.toronto.edu/~jingsu/itunnel/
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -43,239 +41,236 @@
 #include <pthread.h>
 #include <netinet/in.h>
 #endif
-#include "sock_stuff.h"
+#include "socket.h"
 #include "usbmuxd.h"
 
 static uint16_t listen_port = 0;
 static uint16_t device_port = 0;
 
 struct client_data {
-    int fd;
-    int sfd;
-    volatile int stop_ctos;
-    volatile int stop_stoc;
+	int fd;
+	int sfd;
+	volatile int stop_ctos;
+	volatile int stop_stoc;
 };
 
 static void *run_stoc_loop(void *arg)
 {
-    struct client_data *cdata = (struct client_data*)arg;
-    int recv_len;
-    int sent;
-    char buffer[131072];
+	struct client_data *cdata = (struct client_data*)arg;
+	int recv_len;
+	int sent;
+	char buffer[131072];
 
-    printf("%s: fd = %d\n", __func__, cdata->fd);
+	printf("%s: fd = %d\n", __func__, cdata->fd);
 
-    while (!cdata->stop_stoc && cdata->fd>0 && cdata->sfd>0) {
-	recv_len = recv_buf_timeout(cdata->sfd, buffer, sizeof(buffer), 0, 5000);
-	if (recv_len <= 0) {
-	    if (recv_len == 0) {
-		// try again
-		continue;
-	    } else {
-		fprintf(stderr, "recv failed: %s\n", strerror(errno));
-		break;
-	    }
-	} else {
-//	    printf("received %d bytes from server\n", recv_len);
-	    // send to socket
-	    sent = send_buf(cdata->fd, buffer, recv_len);
-	    if (sent < recv_len) {
-		if (sent <= 0) {
-		    fprintf(stderr, "send failed: %s\n", strerror(errno));
-		    break;
+	while (!cdata->stop_stoc && cdata->fd > 0 && cdata->sfd > 0) {
+		recv_len = socket_receive_timeout(cdata->sfd, buffer, sizeof(buffer), 0, 5000);
+		if (recv_len <= 0) {
+			if (recv_len == 0) {
+				// try again
+				continue;
+			} else {
+				fprintf(stderr, "recv failed: %s\n", strerror(errno));
+				break;
+			}
 		} else {
-		    fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len);
+			// send to socket
+			sent = socket_send(cdata->fd, buffer, recv_len);
+			if (sent < recv_len) {
+				if (sent <= 0) {
+					fprintf(stderr, "send failed: %s\n", strerror(errno));
+					break;
+				} else {
+					fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len);
+				}
+			}
 		}
-	    } else {
-		// sending succeeded, receive from device
-//		printf("pushed %d bytes to client\n", sent);
-	    }
 	}
-    }
-    close(cdata->fd);
-    cdata->fd = -1;
-    cdata->stop_ctos = 1;
 
-    return NULL;
+	close(cdata->fd);
+
+	cdata->fd = -1;
+	cdata->stop_ctos = 1;
+
+	return NULL;
 }
 
 static void *run_ctos_loop(void *arg)
 {
-    struct client_data *cdata = (struct client_data*)arg;
-    int recv_len;
-    int sent;
-    char buffer[131072];
+	struct client_data *cdata = (struct client_data*)arg;
+	int recv_len;
+	int sent;
+	char buffer[131072];
 #ifdef WIN32
-    HANDLE stoc = NULL;
+	HANDLE stoc = NULL;
 #else
-    pthread_t stoc;
+	pthread_t stoc;
 #endif
 
-    printf("%s: fd = %d\n", __func__, cdata->fd);
+	printf("%s: fd = %d\n", __func__, cdata->fd);
 
-    cdata->stop_stoc = 0;
+	cdata->stop_stoc = 0;
 #ifdef WIN32
-    stoc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)run_stoc_loop, cdata, 0, NULL);
+	stoc = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)run_stoc_loop, cdata, 0, NULL);
 #else
-    pthread_create(&stoc, NULL, run_stoc_loop, cdata);
+	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);
-	if (recv_len <= 0) {
-	    if (recv_len == 0) {
-		// try again
-		continue;
-	    } else {
-		fprintf(stderr, "recv failed: %s\n", strerror(errno));
-		break;
-	    }
-	} else {
-//	    printf("pulled %d bytes from client\n", recv_len);
-	    // send to local socket
-	    sent = send_buf(cdata->sfd, buffer, recv_len);
-	    if (sent < recv_len) {
-		if (sent <= 0) {
-		    fprintf(stderr, "send failed: %s\n", strerror(errno));
-		    break;
+	while (!cdata->stop_ctos && cdata->fd>0 && cdata->sfd>0) {
+		recv_len = socket_receive_timeout(cdata->fd, buffer, sizeof(buffer), 0, 5000);
+		if (recv_len <= 0) {
+			if (recv_len == 0) {
+				// try again
+				continue;
+			} else {
+			fprintf(stderr, "recv failed: %s\n", strerror(errno));
+				break;
+			}
 		} else {
-		    fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len);
+			// send to local socket
+			sent = socket_send(cdata->sfd, buffer, recv_len);
+			if (sent < recv_len) {
+				if (sent <= 0) {
+					fprintf(stderr, "send failed: %s\n", strerror(errno));
+					break;
+				} else {
+					fprintf(stderr, "only sent %d from %d bytes\n", sent, recv_len);
+				}
+			}
 		}
-	    } else {
-		// sending succeeded, receive from device
-//		printf("sent %d bytes to server\n", sent);
-	    }
 	}
-    }
-    close(cdata->fd);
-    cdata->fd = -1;
-    cdata->stop_stoc = 1;
+
+	close(cdata->fd);
+
+	cdata->fd = -1;
+	cdata->stop_stoc = 1;
 
 #ifdef WIN32
-    WaitForSingleObject(stoc, INFINITE);
+	WaitForSingleObject(stoc, INFINITE);
 #else
-    pthread_join(stoc, NULL);
+	pthread_join(stoc, NULL);
 #endif
 
-    return NULL;
+	return NULL;
 }
 
 static void *acceptor_thread(void *arg)
 {
-    struct client_data *cdata;
-    usbmuxd_device_info_t *dev_list = NULL;
+	struct client_data *cdata;
+	usbmuxd_device_info_t *dev_list = NULL;
 #ifdef WIN32
-    HANDLE ctos = NULL;
+	HANDLE ctos = NULL;
 #else
-    pthread_t ctos;
+	pthread_t ctos;
 #endif
-    int count;
+	int count;
 
-    if (!arg) {
-	fprintf(stderr, "invalid client_data provided!\n");
-	return NULL;
-    }
+	if (!arg) {
+		fprintf(stderr, "invalid client_data provided!\n");
+		return NULL;
+	}
 
-    cdata = (struct client_data*)arg;
+	cdata = (struct client_data*)arg;
 
-    if ((count = usbmuxd_get_device_list(&dev_list)) < 0) {
-	printf("Connecting to usbmuxd failed, terminating.\n");
+	if ((count = usbmuxd_get_device_list(&dev_list)) < 0) {
+		printf("Connecting to usbmuxd failed, terminating.\n");
+		free(dev_list);
+		return NULL;
+	}
+
+	fprintf(stdout, "Number of available devices == %d\n", count);
+
+	if (dev_list == NULL || dev_list[0].handle == 0) {
+		printf("No connected device found, terminating.\n");
+		free(dev_list);
+		return NULL;
+	}
+
+	fprintf(stdout, "Requesting connecion to device handle == %d (serial: %s), port %d\n", dev_list[0].handle, dev_list[0].udid, device_port);
+
+	cdata->sfd = usbmuxd_connect(dev_list[0].handle, device_port);
 	free(dev_list);
-	return NULL;
-    }
+	if (cdata->sfd < 0) {
+		fprintf(stderr, "Error connecting to device!\n");
+	} else {
+		cdata->stop_ctos = 0;
 
-    fprintf(stdout, "Number of available devices == %d\n", count);
-
-    if (dev_list == NULL || dev_list[0].handle == 0) {
-	printf("No connected device found, terminating.\n");
-	free(dev_list);
-	return NULL;
-    }
-
-    fprintf(stdout, "Requesting connecion to device handle == %d (serial: %s), port %d\n", dev_list[0].handle, dev_list[0].udid, device_port);
-
-    cdata->sfd = usbmuxd_connect(dev_list[0].handle, device_port);
-    free(dev_list);
-    if (cdata->sfd < 0) {
-    	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);
+		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);
+		pthread_create(&ctos, NULL, run_ctos_loop, cdata);
+		pthread_join(ctos, NULL);
 #endif
-    }
+	}
 
-    if (cdata->fd > 0) {
-	close(cdata->fd);
-    }
-    if (cdata->sfd > 0) {
-	close(cdata->sfd);
-    }
+	if (cdata->fd > 0) {
+		close(cdata->fd);
+	}
+	if (cdata->sfd > 0) {
+		close(cdata->sfd);
+	}
 
-    return NULL;
+	return NULL;
 }
 
 int main(int argc, char **argv)
 {
-    int mysock = -1;
+	int mysock = -1;
 
-    if (argc != 3) {
-	printf("usage: %s LOCAL_TCP_PORT DEVICE_TCP_PORT\n", argv[0]);
-	return 0;
-    }
-
-    listen_port = atoi(argv[1]);
-    device_port = atoi(argv[2]);
-
-    if (!listen_port) {
-	fprintf(stderr, "Invalid listen_port specified!\n");
-	return -EINVAL;
-    }
-
-    if (!device_port) {
-	fprintf(stderr, "Invalid device_port specified!\n");
-	return -EINVAL;
-    }
-
-    // first create the listening socket endpoint waiting for connections.
-    mysock = create_socket(listen_port);
-    if (mysock < 0) {
-	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;
-	int c_sock;
-	while (1) {
-	    printf("waiting for connection\n");
-	    c_sock = accept(mysock, (struct sockaddr*)&c_addr, &len);
-	    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;
-	    }
+	if (argc != 3) {
+		printf("usage: %s LOCAL_TCP_PORT DEVICE_TCP_PORT\n", argv[0]);
+		return 0;
 	}
-	close(c_sock);
-	close(mysock);
-    }
 
-    return 0;
+	listen_port = atoi(argv[1]);
+	device_port = atoi(argv[2]);
+
+	if (!listen_port) {
+		fprintf(stderr, "Invalid listen_port specified!\n");
+		return -EINVAL;
+	}
+
+	if (!device_port) {
+		fprintf(stderr, "Invalid device_port specified!\n");
+		return -EINVAL;
+	}
+
+	// first create the listening socket endpoint waiting for connections.
+	mysock = socket_create(listen_port);
+	if (mysock < 0) {
+		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;
+		int c_sock;
+		while (1) {
+			printf("waiting for connection\n");
+			c_sock = accept(mysock, (struct sockaddr*)&c_addr, &len);
+			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;
+			}
+		}
+		close(c_sock);
+		close(mysock);
+	}
+
+	return 0;
 }
