idevice: Add IDEVICE_E_CONNREFUSED and have idevice_connect() return meaningful error codes

This allows clients to properly detect that a connection to the requested
port failed because it is not open on the device, instead of just returning
an "unknown error"
diff --git a/include/libimobiledevice/libimobiledevice.h b/include/libimobiledevice/libimobiledevice.h
index e0aa518..40edd71 100644
--- a/include/libimobiledevice/libimobiledevice.h
+++ b/include/libimobiledevice/libimobiledevice.h
@@ -42,6 +42,7 @@
 	IDEVICE_E_UNKNOWN_ERROR   = -2,
 	IDEVICE_E_NO_DEVICE       = -3,
 	IDEVICE_E_NOT_ENOUGH_DATA = -4,
+	IDEVICE_E_CONNREFUSED     = -5,
 	IDEVICE_E_SSL_ERROR       = -6,
 	IDEVICE_E_TIMEOUT         = -7
 } idevice_error_t;
diff --git a/src/idevice.c b/src/idevice.c
index 6a03c5e..04189d6 100644
--- a/src/idevice.c
+++ b/src/idevice.c
@@ -447,7 +447,15 @@
 	if (device->conn_type == CONNECTION_USBMUXD) {
 		int sfd = usbmuxd_connect(device->mux_id, port);
 		if (sfd < 0) {
-			debug_info("ERROR: Connecting to usbmuxd failed: %d (%s)", sfd, strerror(-sfd));
+			debug_info("ERROR: Connecting to usbmux device failed: %d (%s)", sfd, strerror(-sfd));
+			switch (-sfd) {
+			case ECONNREFUSED:
+				return IDEVICE_E_CONNREFUSED;
+			case ENODEV:
+				return IDEVICE_E_NO_DEVICE;
+			default:
+				break;
+			}
 			return IDEVICE_E_UNKNOWN_ERROR;
 		}
 		idevice_connection_t new_connection = (idevice_connection_t)malloc(sizeof(struct idevice_connection_private));
@@ -494,7 +502,14 @@
 
 		int sfd = socket_connect_addr(saddr, port);
 		if (sfd < 0) {
-			debug_info("ERROR: Connecting to network device failed: %d (%s)", errno, strerror(errno));
+			int result = errno;
+			debug_info("ERROR: Connecting to network device failed: %d (%s)", result, strerror(result));
+			switch (result) {
+			case ECONNREFUSED:
+				return IDEVICE_E_CONNREFUSED;
+			default:
+				break;
+			}
 			return IDEVICE_E_NO_DEVICE;
 		}