make 'use_tag' usage thread safe and ignore tag mismatch errors
diff --git a/src/libusbmuxd.c b/src/libusbmuxd.c
index 2bea51a..613fd1c 100644
--- a/src/libusbmuxd.c
+++ b/src/libusbmuxd.c
@@ -74,7 +74,7 @@
 #include "collection.h"
 
 static int libusbmuxd_debug = 0;
-#define DEBUG(x, y, ...) if (x <= libusbmuxd_debug) fprintf(stderr, (y), __VA_ARGS__);
+#define DEBUG(x, y, ...) if (x <= libusbmuxd_debug) fprintf(stderr, (y), __VA_ARGS__); fflush(stderr);
 
 static struct collection devices;
 static usbmuxd_event_cb_t event_cb = NULL;
@@ -92,9 +92,9 @@
 #endif
 static int listenfd = -1;
 
-static int use_tag = 0;
-static int proto_version = 1;
-static int try_list_devices = 1;
+static volatile int use_tag = 0;
+static volatile int proto_version = 1;
+static volatile int try_list_devices = 1;
 
 /**
  * Finds a device info record by its handle.
@@ -308,7 +308,10 @@
 
 	if (hdr.message == MESSAGE_RESULT) {
 		int ret = 0;
-		if (res && (hdr.tag == tag)) {
+		if (hdr.tag != tag) {
+			DEBUG(1, "%s: WARNING: tag mismatch (%d != %d). Proceeding anyway.\n", __func__, hdr.tag, tag);
+		}
+		if (res) {
 			memcpy(result, res, sizeof(uint32_t));
 			ret = 1;
 		}
@@ -575,6 +578,7 @@
 {
 	int sfd;
 	uint32_t res = -1;
+	int tag;
 
 retry:
 
@@ -591,15 +595,15 @@
 		return sfd;
 	}
 
-	use_tag++;
+	tag = ++use_tag;
 	LOCK;
-	if (send_listen_packet(sfd, use_tag) <= 0) {
+	if (send_listen_packet(sfd, tag) <= 0) {
 		UNLOCK;
 		DEBUG(1, "%s: ERROR: could not send listen packet\n", __func__);
 		close_socket(sfd);
 		return -1;
 	}
-	if (usbmuxd_get_result(sfd, use_tag, &res, NULL) && (res != 0)) {
+	if (usbmuxd_get_result(sfd, tag, &res, NULL) && (res != 0)) {
 		UNLOCK;
 		close_socket(sfd);
 		if ((res == RESULT_BADVERSION) && (proto_version == 1)) {
@@ -802,6 +806,7 @@
 int usbmuxd_get_device_list(usbmuxd_device_info_t **device_list)
 {
 	int sfd;
+	int tag;
 	int listen_success = 0;
 	uint32_t res;
 	struct collection tmpdevs;
@@ -820,12 +825,12 @@
 		return sfd;
 	}
 
-	use_tag++;
+	tag = ++use_tag;
 	LOCK;
 	if ((proto_version == 1) && (try_list_devices)) {
-		if (send_list_devices_packet(sfd, use_tag) > 0) {
+		if (send_list_devices_packet(sfd, tag) > 0) {
 			plist_t list = NULL;
-			if (usbmuxd_get_result(sfd, use_tag, &res, &list) && (res == 0)) {
+			if (usbmuxd_get_result(sfd, tag, &res, &list) && (res == 0)) {
 				plist_t devlist = plist_dict_get_item(list, "DeviceList");
 				if (devlist && plist_get_node_type(devlist) == PLIST_ARRAY) {
 					collection_init(&tmpdevs);
@@ -858,10 +863,11 @@
 		}
 	}
 
-	if (send_listen_packet(sfd, use_tag) > 0) {
+	tag = ++use_tag;
+	if (send_listen_packet(sfd, tag) > 0) {
 		res = -1;
 		// get response
-		if (usbmuxd_get_result(sfd, use_tag, &res, NULL) && (res == 0)) {
+		if (usbmuxd_get_result(sfd, tag, &res, NULL) && (res == 0)) {
 			listen_success = 1;
 		} else {
 			UNLOCK;
@@ -996,6 +1002,7 @@
 int usbmuxd_connect(const int handle, const unsigned short port)
 {
 	int sfd;
+	int tag;
 	int connected = 0;
 	uint32_t res = -1;
 
@@ -1007,13 +1014,13 @@
 		return sfd;
 	}
 
-	use_tag++;
-	if (send_connect_packet(sfd, use_tag, (uint32_t)handle, (uint16_t)port) <= 0) {
+	tag = ++use_tag;
+	if (send_connect_packet(sfd, tag, (uint32_t)handle, (uint16_t)port) <= 0) {
 		DEBUG(1, "%s: Error sending connect message!\n", __func__);
 	} else {
 		// read ACK
 		DEBUG(2, "%s: Reading connect result...\n", __func__);
-		if (usbmuxd_get_result(sfd, use_tag, &res, NULL)) {
+		if (usbmuxd_get_result(sfd, tag, &res, NULL)) {
 			if (res == 0) {
 				DEBUG(2, "%s: Connect success!\n", __func__);
 				connected = 1;
@@ -1085,6 +1092,7 @@
 int usbmuxd_read_buid(char **buid)
 {
 	int sfd;
+	int tag;
 	int ret = 0;
 
 	if (!buid) {
@@ -1099,13 +1107,13 @@
 	}
 
 	proto_version = 1;
-	use_tag++;
-	if (send_read_buid_packet(sfd, use_tag) <= 0) {
+	tag = ++use_tag;
+	if (send_read_buid_packet(sfd, tag) <= 0) {
 		DEBUG(1, "%s: Error sending ReadBUID message!\n", __func__);
 	} else {
 		uint32_t rc = 0;
 		plist_t pl = NULL;
-		if (usbmuxd_get_result(sfd, use_tag, &rc, &pl) && (rc == 0)) {
+		if (usbmuxd_get_result(sfd, tag, &rc, &pl) && (rc == 0)) {
 			plist_t node = plist_dict_get_item(pl, "BUID");
 			if (node && plist_get_node_type(node) == PLIST_STRING) {
 				plist_get_string_val(node, buid);
@@ -1123,6 +1131,7 @@
 int usbmuxd_read_pair_record(const char* record_id, char **record_data, uint32_t *record_size)
 {
 	int sfd;
+	int tag;
 	int ret = -1;
 
 	if (!record_id || !record_data || !record_size) {
@@ -1139,14 +1148,14 @@
 	}
 
 	proto_version = 1;
-	use_tag++;
+	tag = ++use_tag;
 
-	if (send_pair_record_packet(sfd, use_tag, "ReadPairRecord", record_id, NULL) <= 0) {
+	if (send_pair_record_packet(sfd, tag, "ReadPairRecord", record_id, NULL) <= 0) {
 		DEBUG(1, "%s: Error sending ReadPairRecord message!\n", __func__);
 	} else {
 		uint32_t rc = 0;
 		plist_t pl = NULL;
-		if (usbmuxd_get_result(sfd, use_tag, &rc, &pl) && (rc == 0)) {
+		if (usbmuxd_get_result(sfd, tag, &rc, &pl) && (rc == 0)) {
 			plist_t node = plist_dict_get_item(pl, "PairRecordData");
 			if (node && plist_get_node_type(node) == PLIST_DATA) {
 				uint64_t int64val = 0;
@@ -1169,6 +1178,7 @@
 int usbmuxd_save_pair_record(const char* record_id, const char *record_data, uint32_t record_size)
 {
 	int sfd;
+	int tag;
 	int ret = -1;
 
 	if (!record_id || !record_data || !record_size) {
@@ -1183,14 +1193,14 @@
 	}
 
 	proto_version = 1;
-	use_tag++;
+	tag = ++use_tag;
 
 	plist_t data = plist_new_data(record_data, record_size);
-	if (send_pair_record_packet(sfd, use_tag, "SavePairRecord", record_id, data) <= 0) {
+	if (send_pair_record_packet(sfd, tag, "SavePairRecord", record_id, data) <= 0) {
 		DEBUG(1, "%s: Error sending SavePairRecord message!\n", __func__);
 	} else {
 		uint32_t rc = 0;
-		if (usbmuxd_get_result(sfd, use_tag, &rc, NULL) && (rc == 0)) {
+		if (usbmuxd_get_result(sfd, tag, &rc, NULL) && (rc == 0)) {
 			ret = 0;
 		} else {
 			ret = -(int)rc;
@@ -1205,6 +1215,7 @@
 int usbmuxd_delete_pair_record(const char* record_id)
 {
 	int sfd;
+	int tag;
 	int ret = -1;
 
 	if (!record_id) {
@@ -1219,13 +1230,13 @@
 	}
 
 	proto_version = 1;
-	use_tag++;
+	tag = ++use_tag;
 
-	if (send_pair_record_packet(sfd, use_tag, "DeletePairRecord", record_id, NULL) <= 0) {
+	if (send_pair_record_packet(sfd, tag, "DeletePairRecord", record_id, NULL) <= 0) {
 		DEBUG(1, "%s: Error sending DeletePairRecord message!\n", __func__);
 	} else {
 		uint32_t rc = 0;
-		if (usbmuxd_get_result(sfd, use_tag, &rc, NULL) && (rc == 0)) {
+		if (usbmuxd_get_result(sfd, tag, &rc, NULL) && (rc == 0)) {
 			ret = 0;
 		} else {
 			ret = -(int)rc;