summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libusbmuxd/libusbmuxd.c89
1 files changed, 59 insertions, 30 deletions
diff --git a/libusbmuxd/libusbmuxd.c b/libusbmuxd/libusbmuxd.c
index db8d1d4..f5e5d1b 100644
--- a/libusbmuxd/libusbmuxd.c
+++ b/libusbmuxd/libusbmuxd.c
@@ -46,6 +46,8 @@ static usbmuxd_event_cb_t event_cb = NULL;
pthread_t devmon;
static int listenfd = -1;
+static int use_tag = 0;
+
/**
* Finds a device info record by its handle.
* if the record is not found, NULL is returned.
@@ -152,6 +154,53 @@ static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t * result)
return -EPROTO;
}
+static int send_packet(int sfd, uint32_t message, uint32_t tag, void *payload, uint32_t payload_size)
+{
+ struct usbmuxd_header header;
+
+ header.length = sizeof(struct usbmuxd_header);
+ header.version = USBMUXD_PROTOCOL_VERSION;
+ header.message = message;
+ header.tag = tag;
+ if (payload && (payload_size > 0)) {
+ header.length += payload_size;
+ }
+ int sent = send_buf(sfd, &header, sizeof(header));
+ if (sent != sizeof(header)) {
+ fprintf(stderr, "%s: ERROR: could not send packet header\n", __func__);
+ return -1;
+ }
+ if (payload && (payload_size > 0)) {
+ sent += send_buf(sfd, payload, payload_size);
+ }
+ if (sent != (int)header.length) {
+ fprintf(stderr, "%s: ERROR: could not send whole packet\n", __func__);
+ close(sfd);
+ return -1;
+ }
+ return sent;
+}
+
+static int send_listen_packet(int sfd, uint32_t tag)
+{
+ return send_packet(sfd, MESSAGE_LISTEN, tag, NULL, 0);
+}
+
+static int send_connect_packet(int sfd, uint32_t tag, uint32_t device_id, uint16_t port)
+{
+ struct {
+ uint32_t device_id;
+ uint16_t port;
+ uint16_t reserved;
+ } conninfo;
+
+ conninfo.device_id = device_id;
+ conninfo.port = htons(port);
+ conninfo.reserved = 0;
+
+ return send_packet(sfd, MESSAGE_CONNECT, tag, &conninfo, sizeof(conninfo));
+
+}
/**
* Generates an event, i.e. calls the callback function.
@@ -181,12 +230,6 @@ static int usbmuxd_listen()
{
int sfd;
uint32_t res = -1;
- struct usbmuxd_listen_request req;
-
- req.header.length = sizeof(struct usbmuxd_listen_request);
- req.header.version = USBMUXD_PROTOCOL_VERSION;
- req.header.message = MESSAGE_LISTEN;
- req.header.tag = 2;
sfd = connect_usbmuxd_socket();
if (sfd < 0) {
@@ -203,12 +246,13 @@ static int usbmuxd_listen()
return sfd;
}
- if (send_buf(sfd, &req, req.header.length) != (int)req.header.length) {
+ use_tag++;
+ if (send_listen_packet(sfd, use_tag) <= 0) {
fprintf(stderr, "%s: ERROR: could not send listen packet\n", __func__);
close(sfd);
return -1;
}
- if (usbmuxd_get_result(sfd, req.header.tag, &res) && (res != 0)) {
+ if (usbmuxd_get_result(sfd, use_tag, &res) && (res != 0)) {
close(sfd);
fprintf(stderr, "%s: ERROR: did not get OK but %d\n", __func__, res);
return -1;
@@ -343,7 +387,6 @@ int usbmuxd_unsubscribe()
int usbmuxd_get_device_list(usbmuxd_device_info_t **device_list)
{
- struct usbmuxd_listen_request s_req;
int sfd;
int listen_success = 0;
uint32_t res;
@@ -359,17 +402,11 @@ int usbmuxd_get_device_list(usbmuxd_device_info_t **device_list)
return sfd;
}
- s_req.header.length = sizeof(struct usbmuxd_listen_request);
- s_req.header.version = USBMUXD_PROTOCOL_VERSION;
- s_req.header.message = MESSAGE_LISTEN;
- s_req.header.tag = 2;
-
- // send scan request packet
- if (send_buf(sfd, &s_req, s_req.header.length) ==
- (int) s_req.header.length) {
+ use_tag++;
+ if (send_listen_packet(sfd, use_tag) > 0) {
res = -1;
// get response
- if (usbmuxd_get_result(sfd, s_req.header.tag, &res) && (res == 0)) {
+ if (usbmuxd_get_result(sfd, use_tag, &res) && (res == 0)) {
listen_success = 1;
} else {
close(sfd);
@@ -481,7 +518,6 @@ int usbmuxd_get_device_by_uuid(const char *uuid, usbmuxd_device_info_t *device)
int usbmuxd_connect(const int handle, const unsigned short port)
{
int sfd;
- struct usbmuxd_connect_request c_req;
int connected = 0;
uint32_t res = -1;
@@ -492,20 +528,13 @@ int usbmuxd_connect(const int handle, const unsigned short port)
return sfd;
}
- c_req.header.length = sizeof(c_req);
- c_req.header.version = USBMUXD_PROTOCOL_VERSION;
- c_req.header.message = MESSAGE_CONNECT;
- c_req.header.tag = 3;
- c_req.device_id = (uint32_t) handle;
- c_req.port = htons(port);
- c_req.reserved = 0;
-
- if (send_buf(sfd, &c_req, sizeof(c_req)) < 0) {
- perror("send");
+ use_tag++;
+ if (send_connect_packet(sfd, use_tag, (uint32_t)handle, (uint16_t)port) <= 0) {
+ fprintf(stderr, "%s: Error sending connect message!\n", __func__);
} else {
// read ACK
//fprintf(stderr, "%s: Reading connect result...\n", __func__);
- if (usbmuxd_get_result(sfd, c_req.header.tag, &res)) {
+ if (usbmuxd_get_result(sfd, use_tag, &res)) {
if (res == 0) {
//fprintf(stderr, "%s: Connect success!\n", __func__);
connected = 1;