tools: Add --version command line switch
diff --git a/tools/idevice_id.c b/tools/idevice_id.c
index 7987705..7c1b3b4 100644
--- a/tools/idevice_id.c
+++ b/tools/idevice_id.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevice_id"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -51,6 +53,7 @@
 		"  -n, --network   list UDIDs of all devices available via network\n" \
 		"  -d, --debug     enable communication debugging\n" \
 		"  -h, --help      prints usage information\n" \
+		"  -v, --version   prints version information\n" \
 		"\n" \
 		"Homepage:    <" PACKAGE_URL ">\n" \
 		"Bug Reports: <" PACKAGE_BUGREPORT ">\n"
@@ -76,10 +79,11 @@
 		{ "help",  no_argument, NULL, 'h' },
 		{ "list",  no_argument, NULL, 'l' },
 		{ "network", no_argument, NULL, 'n' },
+		{ "version", no_argument, NULL, 'v' },
 		{ NULL, 0, NULL, 0}
 	};
 
-	while ((c = getopt_long(argc, argv, "dhln", longopts, NULL)) != -1) {
+	while ((c = getopt_long(argc, argv, "dhlnv", longopts, NULL)) != -1) {
 		switch (c) {
 		case 'd':
 			idevice_set_debug_level(1);
@@ -95,6 +99,9 @@
 			mode = MODE_LIST_DEVICES;
 			include_network = 1;
 			break;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
 		default:
 			print_usage(argc, argv, 1);
 			exit(EXIT_FAILURE);
@@ -117,7 +124,7 @@
 			return -2;
 		}
 
-		if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(device, &client, "idevice_id")) {
+		if (LOCKDOWN_E_SUCCESS != lockdownd_client_new(device, &client, TOOL_NAME)) {
 			idevice_free(device);
 			fprintf(stderr, "ERROR: Connecting to device failed!\n");
 			return -2;
diff --git a/tools/idevicebackup.c b/tools/idevicebackup.c
index c55301c..171ab7e 100644
--- a/tools/idevicebackup.c
+++ b/tools/idevicebackup.c
@@ -24,6 +24,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicebackup"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -606,7 +608,7 @@
 	np_client_t np;
 
 	if (!client) {
-		if (lockdownd_client_new_with_handshake(device, &client, "idevicebackup") != LOCKDOWN_E_SUCCESS) {
+		if (lockdownd_client_new_with_handshake(device, &client, TOOL_NAME) != LOCKDOWN_E_SUCCESS) {
 			return;
 		}
 	}
@@ -673,9 +675,10 @@
 	printf("  restore\tRestores a device backup from DIRECTORY.\n");
 	printf("\n");
 	printf("OPTIONS:\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -730,6 +733,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 		else if (!strcmp(argv[i], "backup")) {
 			cmd = CMD_BACKUP;
 		}
@@ -792,7 +799,7 @@
 		}
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &client, "idevicebackup"))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &client, TOOL_NAME))) {
 		printf("ERROR: Could not connect to lockdownd, error code %d\n", ldret);
 		idevice_free(device);
 		return -1;
diff --git a/tools/idevicebackup2.c b/tools/idevicebackup2.c
index 382efc6..61302cc 100644
--- a/tools/idevicebackup2.c
+++ b/tools/idevicebackup2.c
@@ -24,6 +24,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicebackup2"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -346,7 +348,7 @@
 	char *udid_uppercase = NULL;
 
 	lockdownd_client_t lockdown = NULL;
-	if (lockdownd_client_new_with_handshake(device, &lockdown, "idevicebackup2") != LOCKDOWN_E_SUCCESS) {
+	if (lockdownd_client_new_with_handshake(device, &lockdown, TOOL_NAME) != LOCKDOWN_E_SUCCESS) {
 		return NULL;
 	}
 
@@ -367,7 +369,7 @@
 	plist_t app_dict = plist_new_dict();
 	plist_t installed_apps = plist_new_array();
 	instproxy_client_t ip = NULL;
-	if (instproxy_client_start_service(device, &ip, "idevicebackup2") == INSTPROXY_E_SUCCESS) {
+	if (instproxy_client_start_service(device, &ip, TOOL_NAME) == INSTPROXY_E_SUCCESS) {
 		plist_t client_opts = instproxy_client_options_new();
 		instproxy_client_options_add(client_opts, "ApplicationType", "User", NULL);
 		instproxy_client_options_set_return_attributes(client_opts, "CFBundleIdentifier", "ApplicationSINF", "iTunesMetadata", NULL);
@@ -376,7 +378,7 @@
 		instproxy_browse(ip, client_opts, &apps);
 
 		sbservices_client_t sbs = NULL;
-		if (sbservices_client_start_service(device, &sbs, "idevicebackup2") != SBSERVICES_E_SUCCESS) {
+		if (sbservices_client_start_service(device, &sbs, TOOL_NAME) != SBSERVICES_E_SUCCESS) {
 			printf("Couldn't establish sbservices connection. Continuing anyway.\n");
 		}
 
@@ -627,7 +629,7 @@
 
 	lockdownd_client_t lockdown = NULL;
 
-	if (lockdownd_client_new_with_handshake(device, &lockdown, "idevicebackup2") != LOCKDOWN_E_SUCCESS) {
+	if (lockdownd_client_new_with_handshake(device, &lockdown, TOOL_NAME) != LOCKDOWN_E_SUCCESS) {
 		return;
 	}
 
@@ -1427,11 +1429,12 @@
 	printf("  cloud on|off\tenable or disable cloud use (requires iCloud account)\n");
 	printf("\n");
 	printf("OPTIONS:\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
 	printf("  -s, --source UDID\tuse backup data from device specified by UDID\n");
 	printf("  -i, --interactive\trequest passwords interactively\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -1501,6 +1504,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 		else if (!strcmp(argv[i], "backup")) {
 			cmd = CMD_BACKUP;
 		}
@@ -1746,7 +1753,7 @@
 	}
 
 	lockdownd_client_t lockdown = NULL;
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lockdown, "idevicebackup2"))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lockdown, TOOL_NAME))) {
 		printf("ERROR: Could not connect to lockdownd, error code %d\n", ldret);
 		idevice_free(device);
 		return -1;
@@ -2136,7 +2143,7 @@
 				uint8_t passcode_hint = 0;
 				if (device_version >= DEVICE_VERSION(13,0,0)) {
 					diagnostics_relay_client_t diag = NULL;
-					if (diagnostics_relay_client_start_service(device, &diag, "idevicebackup2") == DIAGNOSTICS_RELAY_E_SUCCESS) {
+					if (diagnostics_relay_client_start_service(device, &diag, TOOL_NAME) == DIAGNOSTICS_RELAY_E_SUCCESS) {
 						plist_t dict = NULL;
 						plist_t keys = plist_new_array();
 						plist_array_append_item(keys, plist_new_string("PasswordConfigured"));
diff --git a/tools/idevicecrashreport.c b/tools/idevicecrashreport.c
index 8600ad1..0fc40c6 100644
--- a/tools/idevicecrashreport.c
+++ b/tools/idevicecrashreport.c
@@ -24,6 +24,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicecrashreport"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -306,11 +308,12 @@
 	printf("Move crash reports from device to a local DIRECTORY.\n");
 	printf("\n");
 	printf("OPTIONS:\n");
+	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
 	printf("  -e, --extract\t\textract raw crash report into separate '.crash' file\n");
 	printf("  -k, --keep\t\tcopy but do not remove crash reports from device\n");
 	printf("  -d, --debug\t\tenable communication debugging\n");
-	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -351,6 +354,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 		else if (!strcmp(argv[i], "-e") || !strcmp(argv[i], "--extract")) {
 			extract_raw_crash_reports = 1;
 			continue;
@@ -392,7 +399,7 @@
 		return -1;
 	}
 
-	lockdownd_error = lockdownd_client_new_with_handshake(device, &lockdownd, "idevicecrashreport");
+	lockdownd_error = lockdownd_client_new_with_handshake(device, &lockdownd, TOOL_NAME);
 	if (lockdownd_error != LOCKDOWN_E_SUCCESS) {
 		fprintf(stderr, "ERROR: Could not connect to lockdownd, error code %d\n", lockdownd_error);
 		idevice_free(device);
diff --git a/tools/idevicedate.c b/tools/idevicedate.c
index 9c14fdf..e1fbc20 100644
--- a/tools/idevicedate.c
+++ b/tools/idevicedate.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicedate"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -56,11 +58,12 @@
 	printf("      in the setup wizard screens before device activation.\n");
 	printf("\n");
 	printf("OPTIONS:\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
 	printf("  -s, --set TIMESTAMP\tset UTC time described by TIMESTAMP\n");
 	printf("  -c, --sync\t\tset time of device to current system time\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -129,6 +132,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 		else {
 			print_usage(argc, argv);
 			return 0;
@@ -145,7 +152,7 @@
 		return -1;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &client, "idevicedate"))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &client, TOOL_NAME))) {
 		fprintf(stderr, "ERROR: Could not connect to lockdownd, error code %d\n", ldret);
 		result = -1;
 		goto cleanup;
diff --git a/tools/idevicedebug.c b/tools/idevicedebug.c
index b946d2c..66e997d 100644
--- a/tools/idevicedebug.c
+++ b/tools/idevicedebug.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicedebug"
+
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -193,10 +195,11 @@
 	printf("  run BUNDLEID [ARGS...]\trun app with BUNDLEID and optional ARGS on device.\n");
 	printf("\n");
 	printf("The following OPTIONS are accepted:\n");
-	printf("  -e, --env NAME=VALUE\tset environment variable NAME to VALUE\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
+	printf("  -e, --env NAME=VALUE\tset environment variable NAME to VALUE\n");
 	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -265,6 +268,10 @@
 			print_usage(argc, argv);
 			res = 0;
 			goto cleanup;
+		} else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			res = 0;
+			goto cleanup;
 		} else if (!strcmp(argv[i], "run")) {
 			cmd = CMD_RUN;
 
@@ -313,7 +320,7 @@
 		case CMD_RUN:
 		default:
 			/* get the path to the app and it's working directory */
-			if (instproxy_client_start_service(device, &instproxy_client, "idevicerun") != INSTPROXY_E_SUCCESS) {
+			if (instproxy_client_start_service(device, &instproxy_client, TOOL_NAME) != INSTPROXY_E_SUCCESS) {
 				fprintf(stderr, "Could not start installation proxy service.\n");
 				goto cleanup;
 			}
@@ -334,7 +341,7 @@
 			}
 
 			/* start and connect to debugserver */
-			if (debugserver_client_start_service(device, &debugserver_client, "idevicerun") != DEBUGSERVER_E_SUCCESS) {
+			if (debugserver_client_start_service(device, &debugserver_client, TOOL_NAME) != DEBUGSERVER_E_SUCCESS) {
 				fprintf(stderr,
 					"Could not start com.apple.debugserver!\n"
 					"Please make sure to mount the developer disk image first:\n"
diff --git a/tools/idevicedebugserverproxy.c b/tools/idevicedebugserverproxy.c
index 338a3c0..c0a0eff 100644
--- a/tools/idevicedebugserverproxy.c
+++ b/tools/idevicedebugserverproxy.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicedebugserverproxy"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -73,9 +75,10 @@
 	printf("Proxy debugserver connection from device to a local socket at PORT.\n");
 	printf("\n");
 	printf("OPTIONS:\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -213,7 +216,7 @@
 
 	debug("%s: client_fd = %d\n", __func__, socket_info->client_fd);
 
-	derr = debugserver_client_start_service(socket_info->device, &socket_info->debugserver_client, "idevicedebugserverproxy");
+	derr = debugserver_client_start_service(socket_info->device, &socket_info->debugserver_client, TOOL_NAME);
 	if (derr != DEBUGSERVER_E_SUCCESS) {
 		fprintf(stderr, "Could not start debugserver on device!\nPlease make sure to mount a developer disk image first.\n");
 		return NULL;
@@ -295,6 +298,10 @@
 			print_usage(argc, argv);
 			return EXIT_SUCCESS;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return EXIT_SUCCESS;
+		}
 		else if (atoi(argv[i]) > 0) {
 			local_port = atoi(argv[i]);
 			continue;
diff --git a/tools/idevicediagnostics.c b/tools/idevicediagnostics.c
index 052bbed..153f9ac 100644
--- a/tools/idevicediagnostics.c
+++ b/tools/idevicediagnostics.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicediagnostics"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -98,6 +100,11 @@
 			result = EXIT_SUCCESS;
 			goto cleanup;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			result = EXIT_SUCCESS;
+			goto cleanup;
+		}
 		else if (!strcmp(argv[i], "sleep")) {
 			cmd = CMD_SLEEP;
 		}
@@ -193,7 +200,7 @@
 		goto cleanup;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ret = lockdownd_client_new_with_handshake(device, &lockdown_client, "idevicediagnostics"))) {
+	if (LOCKDOWN_E_SUCCESS != (ret = lockdownd_client_new_with_handshake(device, &lockdown_client, TOOL_NAME))) {
 		idevice_free(device);
 		printf("ERROR: Could not connect to lockdownd, error code %d\n", ret);
 		goto cleanup;
@@ -327,9 +334,10 @@
 	printf("  sleep\t\t\t\tput device into sleep mode (disconnects from host)\n");
 	printf("\n");
 	printf("The following OPTIONS are accepted:\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
diff --git a/tools/ideviceenterrecovery.c b/tools/ideviceenterrecovery.c
index 868ee7d..8d82929 100644
--- a/tools/ideviceenterrecovery.c
+++ b/tools/ideviceenterrecovery.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "ideviceenterrecovery"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -46,6 +48,7 @@
 	printf("OPTIONS:\n");
 	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -73,6 +76,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 	}
 
 	i--;
@@ -88,7 +95,7 @@
 		return -1;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new(device, &client, "ideviceenterrecovery"))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new(device, &client, TOOL_NAME))) {
 		printf("ERROR: Could not connect to lockdownd, error code %d\n", ldret);
 		idevice_free(device);
 		return -1;
diff --git a/tools/ideviceimagemounter.c b/tools/ideviceimagemounter.c
index 3f6f42e..df43d5a 100644
--- a/tools/ideviceimagemounter.c
+++ b/tools/ideviceimagemounter.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "ideviceimagemounter"
+
 #include <stdlib.h>
 #define _GNU_SOURCE 1
 #define __USE_GNU 1
@@ -75,6 +77,7 @@
 	printf("  -x, --xml\t\tUse XML output\n");
 	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -83,18 +86,19 @@
 static void parse_opts(int argc, char **argv)
 {
 	static struct option longopts[] = {
-		{"help", no_argument, NULL, 'h'},
-		{"udid", required_argument, NULL, 'u'},
-		{"list", no_argument, NULL, 'l'},
-		{"imagetype", required_argument, NULL, 't'},
-		{"xml", no_argument, NULL, 'x'},
-		{"debug", no_argument, NULL, 'd'},
-		{NULL, 0, NULL, 0}
+		{ "help",      no_argument,       NULL, 'h'},
+		{ "udid",      required_argument, NULL, 'u'},
+		{ "list",      no_argument,       NULL, 'l'},
+		{ "imagetype", required_argument, NULL, 't'},
+		{ "xml",       no_argument,       NULL, 'x'},
+		{ "debug",     no_argument,       NULL, 'd'},
+		{ "version",   no_argument,       NULL, 'v' },
+		{ NULL, 0, NULL, 0 }
 	};
 	int c;
 
 	while (1) {
-		c = getopt_long(argc, argv, "hu:lt:xd", longopts, NULL);
+		c = getopt_long(argc, argv, "hu:lt:xdv", longopts, NULL);
 		if (c == -1) {
 			break;
 		}
@@ -126,6 +130,9 @@
 		case 'd':
 			idevice_set_debug_level(1);
 			break;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			exit(0);
 		default:
 			print_usage(argc, argv);
 			exit(2);
@@ -189,7 +196,7 @@
 		return -1;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lckd, "ideviceimagemounter"))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lckd, TOOL_NAME))) {
 		printf("ERROR: Could not connect to lockdown, error code %d.\n", ldret);
 		goto leave;
 	}
diff --git a/tools/ideviceinfo.c b/tools/ideviceinfo.c
index 0697990..9b13ab8 100644
--- a/tools/ideviceinfo.c
+++ b/tools/ideviceinfo.c
@@ -24,6 +24,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "ideviceinfo"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -97,14 +99,15 @@
 		"Show information about a connected device.\n" \
 		"\n" \
 		"OPTIONS:\n" \
-		"  -s, --simple       use a simple connection to avoid auto-pairing with the device\n" \
 		"  -u, --udid UDID    target specific device by UDID\n" \
 		"  -n, --network      connect to network device even if available via USB\n" \
+		"  -s, --simple       use a simple connection to avoid auto-pairing with the device\n" \
 		"  -q, --domain NAME  set domain of query to NAME. Default: None\n" \
 		"  -k, --key NAME     only query key specified by NAME. Default: All keys.\n" \
 		"  -x, --xml          output information as xml plist instead of key/value pairs\n" \
 		"  -h, --help         prints usage information\n" \
 		"  -d, --debug        enable communication debugging\n" \
+		"  -v, --version      prints version information\n" \
 		"\n"
 	);
 	fprintf(is_error ? stderr : stdout, "Known domains are:\n\n");
@@ -144,6 +147,7 @@
 		{ "key", required_argument, NULL, 'k' },
 		{ "simple", no_argument, NULL, 's' },
 		{ "xml", no_argument, NULL, 'x' },
+		{ "version", no_argument, NULL, 'v' },
 		{ NULL, 0, NULL, 0}
 	};
 
@@ -151,7 +155,7 @@
 	signal(SIGPIPE, SIG_IGN);
 #endif
 
-	while ((c = getopt_long(argc, argv, "dhu:nq:k:sx", longopts, NULL)) != -1) {
+	while ((c = getopt_long(argc, argv, "dhu:nq:k:sxv", longopts, NULL)) != -1) {
 		switch (c) {
 		case 'd':
 			idevice_set_debug_level(1);
@@ -195,6 +199,9 @@
 		case 'h':
 			print_usage(argc, argv, 0);
 			return 0;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
 		default:
 			print_usage(argc, argv, 1);
 			return 2;
@@ -215,8 +222,8 @@
 	}
 
 	if (LOCKDOWN_E_SUCCESS != (ldret = simple ?
-			lockdownd_client_new(device, &client, "ideviceinfo"):
-			lockdownd_client_new_with_handshake(device, &client, "ideviceinfo"))) {
+			lockdownd_client_new(device, &client, TOOL_NAME):
+			lockdownd_client_new_with_handshake(device, &client, TOOL_NAME))) {
 		fprintf(stderr, "ERROR: Could not connect to lockdownd: %s (%d)\n", lockdownd_strerror(ldret), ldret);
 		idevice_free(device);
 		return -1;
diff --git a/tools/idevicename.c b/tools/idevicename.c
index af80dcc..5a34ea0 100644
--- a/tools/idevicename.c
+++ b/tools/idevicename.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicename"
+
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
@@ -45,6 +47,7 @@
 	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
 	printf("  -h, --help\t\tprint usage information\n");
+	printf("  -v, --version\t\tprint version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -52,22 +55,22 @@
 
 int main(int argc, char** argv)
 {
-	int res = -1;
-	char* udid = NULL;
-
 	int c = 0;
-	int optidx = 0;
 	const struct option longopts[] = {
-		{ "udid", required_argument, NULL, 'u' },
-		{ "help", no_argument, NULL, 'h' },
+		{ "udid",    required_argument, NULL, 'u' },
+		{ "debug",   no_argument,       NULL, 'd' },
+		{ "help",    no_argument,       NULL, 'h' },
+		{ "version", no_argument,       NULL, 'v' },
 		{ NULL, 0, NULL, 0}
 	};
+	int res = -1;
+	char* udid = NULL;
 
 #ifndef WIN32
 	signal(SIGPIPE, SIG_IGN);
 #endif
 
-	while ((c = getopt_long(argc, argv, "du:h", longopts, &optidx)) != -1) {
+	while ((c = getopt_long(argc, argv, "du:hv", longopts, NULL)) != -1) {
 		switch (c) {
 		case 'u':
 			if (!*optarg) {
@@ -84,9 +87,12 @@
 		case 'd':
 			idevice_set_debug_level(1);
 			break;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
 		default:
 			print_usage();
-			return -1;
+			return 2;
 		}
 	}
 
@@ -105,7 +111,7 @@
 	}
 
 	lockdownd_client_t lockdown = NULL;
-	lockdownd_error_t lerr = lockdownd_client_new_with_handshake(device, &lockdown, "idevicename");
+	lockdownd_error_t lerr = lockdownd_client_new_with_handshake(device, &lockdown, TOOL_NAME);
 	if (lerr != LOCKDOWN_E_SUCCESS) {
 		idevice_free(device);
 		fprintf(stderr, "ERROR: Could not connect to lockdownd, error code %d\n", lerr);
diff --git a/tools/idevicenotificationproxy.c b/tools/idevicenotificationproxy.c
index 45744bc..15b63a3 100644
--- a/tools/idevicenotificationproxy.c
+++ b/tools/idevicenotificationproxy.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicenotificationproxy"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -71,9 +73,10 @@
 	printf("  observe ID [...]\tobserve notification IDs in the foreground until CTRL+C or signal is received\n");
 	printf("\n");
 	printf("The following OPTIONS are accepted:\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -130,6 +133,11 @@
 			result = 0;
 			goto cleanup;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			result = 0;
+			goto cleanup;
+		}
 		else if (!strcmp(argv[i], "post") || !strcmp(argv[i], "observe")) {
 			cmd = CMD_POST;
 			if (!strcmp(argv[i], "observe")) {
@@ -186,7 +194,7 @@
 		goto cleanup;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ret = lockdownd_client_new_with_handshake(device, &client, "idevicenotificationproxy"))) {
+	if (LOCKDOWN_E_SUCCESS != (ret = lockdownd_client_new_with_handshake(device, &client, TOOL_NAME))) {
 		fprintf(stderr, "ERROR: Could not connect to lockdownd, error code %d\n", ret);
 		goto cleanup;
 	}
diff --git a/tools/idevicepair.c b/tools/idevicepair.c
index 99c7b7c..de631a0 100644
--- a/tools/idevicepair.c
+++ b/tools/idevicepair.c
@@ -24,6 +24,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicepair"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -78,9 +80,10 @@
 	printf("  list         list devices paired with this host\n");
 	printf("\n");
 	printf("The following OPTIONS are accepted:\n");
-	printf("  -d, --debug      enable communication debugging\n");
 	printf("  -u, --udid UDID  target specific device by UDID\n");
+	printf("  -d, --debug      enable communication debugging\n");
 	printf("  -h, --help       prints usage information\n");
+	printf("  -v, --version    prints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -88,20 +91,16 @@
 
 static void parse_opts(int argc, char **argv)
 {
+	int c = 0;
 	static struct option longopts[] = {
-		{"help", no_argument, NULL, 'h'},
-		{"udid", required_argument, NULL, 'u'},
-		{"debug", no_argument, NULL, 'd'},
-		{NULL, 0, NULL, 0}
+		{ "help",    no_argument,       NULL, 'h' },
+		{ "udid",    required_argument, NULL, 'u' },
+		{ "debug",   no_argument,       NULL, 'd' },
+		{ "version", no_argument,       NULL, 'v' },
+		{ NULL, 0, NULL, 0}
 	};
-	int c;
 
-	while (1) {
-		c = getopt_long(argc, argv, "hu:d", longopts, (int*)0);
-		if (c == -1) {
-			break;
-		}
-
+	while ((c = getopt_long(argc, argv, "hu:dv", longopts, NULL)) != -1) {
 		switch (c) {
 		case 'h':
 			print_usage(argc, argv);
@@ -119,6 +118,9 @@
 		case 'd':
 			idevice_set_debug_level(1);
 			break;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			exit(EXIT_SUCCESS);
 		default:
 			print_usage(argc, argv);
 			exit(EXIT_SUCCESS);
@@ -280,7 +282,7 @@
 		case OP_VALIDATE:
 		lockdownd_client_free(client);
 		client = NULL;
-		lerr = lockdownd_client_new_with_handshake(device, &client, "idevicepair");
+		lerr = lockdownd_client_new_with_handshake(device, &client, TOOL_NAME);
 		if (lerr == LOCKDOWN_E_SUCCESS) {
 			printf("SUCCESS: Validated pairing with device %s\n", udid);
 		} else {
diff --git a/tools/ideviceprovision.c b/tools/ideviceprovision.c
index 4b96821..8cf3de6 100644
--- a/tools/ideviceprovision.c
+++ b/tools/ideviceprovision.c
@@ -24,6 +24,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "ideviceprovision"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -69,10 +71,11 @@
 	printf("           \tspecified by FILE.\n");
 	printf("\n");
 	printf("The following OPTIONS are accepted:\n");
-	printf("  -d, --debug      enable communication debugging\n");
 	printf("  -u, --udid UDID  target specific device by UDID\n");
 	printf("  -x, --xml        print XML output when using the 'dump' command\n");
+	printf("  -d, --debug      enable communication debugging\n");
 	printf("  -h, --help       prints usage information\n");
+	printf("  -v, --version    prints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
@@ -376,6 +379,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 		else {
 			print_usage(argc, argv);
 			return 0;
@@ -440,7 +447,7 @@
 		return -1;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &client, "ideviceprovision"))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &client, TOOL_NAME))) {
 		fprintf(stderr, "ERROR: Could not connect to lockdownd, error code %d\n", ldret);
 		idevice_free(device);
 		return -1;
diff --git a/tools/idevicescreenshot.c b/tools/idevicescreenshot.c
index d91e8f4..c9dc0ef 100644
--- a/tools/idevicescreenshot.c
+++ b/tools/idevicescreenshot.c
@@ -23,6 +23,8 @@
 #include <config.h>
 #endif
 
+#define TOOL_NAME "idevicescreenshot"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -72,6 +74,10 @@
 			print_usage(argc, argv);
 			return 0;
 		}
+		else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) {
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
+		}
 		else if (argv[i][0] != '-' && !filename) {
 			filename = strdup(argv[i]);
 			continue;
@@ -91,7 +97,7 @@
 		return -1;
 	}
 
-	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lckd, NULL))) {
+	if (LOCKDOWN_E_SUCCESS != (ldret = lockdownd_client_new_with_handshake(device, &lckd, TOOL_NAME))) {
 		idevice_free(device);
 		printf("ERROR: Could not connect to lockdownd, error code %d\n", ldret);
 		return -1;
@@ -167,9 +173,10 @@
 	printf("NOTE: A mounted developer disk image is required on the device, otherwise\n");
 	printf("the screenshotr service is not available.\n");
 	printf("\n");
-	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -u, --udid UDID\ttarget specific device by UDID\n");
+	printf("  -d, --debug\t\tenable communication debugging\n");
 	printf("  -h, --help\t\tprints usage information\n");
+	printf("  -v, --version\t\tprints version information\n");
 	printf("\n");
 	printf("Homepage:    <" PACKAGE_URL ">\n");
 	printf("Bug Reports: <" PACKAGE_BUGREPORT ">\n");
diff --git a/tools/idevicesetlocation.c b/tools/idevicesetlocation.c
index 47fc7da..47f15ca 100644
--- a/tools/idevicesetlocation.c
+++ b/tools/idevicesetlocation.c
@@ -21,6 +21,9 @@
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+
+#define TOOL_NAME "idevicesetlocation"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
@@ -52,8 +55,9 @@
 		"OPTIONS:\n" \
 		"  -u, --udid UDID    target specific device by UDID\n" \
 		"  -n, --network      connect to network device even if available via USB\n" \
-		"  -h, --help         prints usage information\n" \
 		"  -d, --debug        enable communication debugging\n" \
+		"  -h, --help         prints usage information\n" \
+		"  -v, --version      prints version information\n" \
 		"\n" \
 		"Homepage:    <" PACKAGE_URL ">\n" \
 		"Bug Reports: <" PACKAGE_BUGREPORT ">\n"
@@ -62,19 +66,20 @@
 
 int main(int argc, char **argv)
 {
+	int c = 0;
 	const struct option longopts[] = {
-		{ "help", no_argument, NULL, 'h' },
-		{ "udid", required_argument, NULL, 'u' },
-		{ "debug", no_argument, NULL, 'd' },
-		{ "network", no_argument, NULL, 'n' },
+		{ "help",    no_argument,       NULL, 'h' },
+		{ "udid",    required_argument, NULL, 'u' },
+		{ "debug",   no_argument,       NULL, 'd' },
+		{ "network", no_argument,       NULL, 'n' },
+		{ "version", no_argument,       NULL, 'v' },
 		{ NULL, 0, NULL, 0}
 	};
 	uint32_t mode = 0;
 	char *udid = NULL;
 	enum idevice_options lookup_opts = IDEVICE_LOOKUP_USBMUX | IDEVICE_LOOKUP_NETWORK;
 
-	int c = 0;
-	while ((c = getopt_long(argc, argv, "dhu:n", longopts, NULL)) != -1) {
+	while ((c = getopt_long(argc, argv, "dhu:nv", longopts, NULL)) != -1) {
 		switch (c) {
 		case 'd':
 			idevice_set_debug_level(1);
@@ -94,6 +99,9 @@
 		case 'h':
 			print_usage(argc, argv, 0);
 			return 0;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
 		default:
 			print_usage(argc, argv, 1);
 			return 2;
@@ -131,7 +139,7 @@
 	}
 
 	lockdownd_client_t lockdown;
-	lockdownd_client_new_with_handshake(device, &lockdown, NULL);
+	lockdownd_client_new_with_handshake(device, &lockdown, TOOL_NAME);
 
 	lockdownd_service_descriptor_t svc = NULL;
 	if (lockdownd_start_service(lockdown, DT_SIMULATELOCATION_SERVICE, &svc) != LOCKDOWN_E_SUCCESS) {
diff --git a/tools/idevicesyslog.c b/tools/idevicesyslog.c
index 54699a0..acbcd74 100644
--- a/tools/idevicesyslog.c
+++ b/tools/idevicesyslog.c
@@ -24,6 +24,8 @@
 #include "config.h"
 #endif
 
+#define TOOL_NAME "idevicesyslog"
+
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
@@ -408,7 +410,7 @@
 	}
 
 	lockdownd_client_t lockdown = NULL;
-	lockdownd_error_t lerr = lockdownd_client_new_with_handshake(device, &lockdown, "idevicesyslog");
+	lockdownd_error_t lerr = lockdownd_client_new_with_handshake(device, &lockdown, TOOL_NAME);
 	if (lerr != LOCKDOWN_E_SUCCESS) {
 		fprintf(stderr, "ERROR: Could not connect to lockdownd: %d\n", lerr);
 		idevice_free(device);
@@ -528,6 +530,7 @@
 		"  -x, --exit       exit when device disconnects\n" \
 		"  -h, --help       prints usage information\n" \
 		"  -d, --debug      enable communication debugging\n" \
+		"  -v, --version    prints version information\n" \
 		" --no-colors       disable colored output\n" \
 		"\n" \
 		"FILTER OPTIONS:\n" \
@@ -581,6 +584,7 @@
 		{ "no-kernel", no_argument, NULL, 'K' },
 		{ "quiet-list", no_argument, NULL, 1 },
 		{ "no-colors", no_argument, NULL, 2 },
+		{ "version", no_argument, NULL, 'v' },
 		{ NULL, 0, NULL, 0}
 	};
 
@@ -591,7 +595,7 @@
 	signal(SIGPIPE, SIG_IGN);
 #endif
 
-	while ((c = getopt_long(argc, argv, "dhu:nxt:T:m:e:p:qkK", longopts, NULL)) != -1) {
+	while ((c = getopt_long(argc, argv, "dhu:nxt:T:m:e:p:qkKv", longopts, NULL)) != -1) {
 		switch (c) {
 		case 'd':
 			idevice_set_debug_level(1);
@@ -693,6 +697,9 @@
 		case 2:
 			no_colors = 1;
 			break;
+		case 'v':
+			printf("%s %s\n", TOOL_NAME, PACKAGE_VERSION);
+			return 0;
 		default:
 			print_usage(argc, argv, 1);
 			return 2;