summaryrefslogtreecommitdiffstats
path: root/libusbmuxd.c
diff options
context:
space:
mode:
Diffstat (limited to 'libusbmuxd.c')
-rw-r--r--libusbmuxd.c138
1 files changed, 81 insertions, 57 deletions
diff --git a/libusbmuxd.c b/libusbmuxd.c
index edd585c..c8acbf8 100644
--- a/libusbmuxd.c
+++ b/libusbmuxd.c
@@ -14,37 +14,37 @@
14// socket utility functions 14// socket utility functions
15#include "sock_stuff.h" 15#include "sock_stuff.h"
16 16
17static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result) 17static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t * result)
18{ 18{
19 struct usbmuxd_result res; 19 struct usbmuxd_result res;
20 int recv_len; 20 int recv_len;
21 21
22 if (!result) { 22 if (!result) {
23 return -EINVAL; 23 return -EINVAL;
24 } 24 }
25 25
26 if ((recv_len = recv_buf(sfd, &res, sizeof(res))) <= 0) { 26 if ((recv_len = recv_buf(sfd, &res, sizeof(res))) <= 0) {
27 perror("recv"); 27 perror("recv");
28 return -errno; 28 return -errno;
29 } else { 29 } else {
30 if ((recv_len == sizeof(res)) 30 if ((recv_len == sizeof(res))
31 && (res.header.length == (uint32_t)recv_len) 31 && (res.header.length == (uint32_t) recv_len)
32 && (res.header.reserved == 0) 32 && (res.header.reserved == 0)
33 && (res.header.type == USBMUXD_RESULT) 33 && (res.header.type == USBMUXD_RESULT)
34 ) { 34 ) {
35 *result = res.result; 35 *result = res.result;
36 if (res.header.tag == tag) { 36 if (res.header.tag == tag) {
37 return 1; 37 return 1;
38 } else { 38 } else {
39 return 0; 39 return 0;
40 } 40 }
41 } 41 }
42 } 42 }
43 43
44 return -1; 44 return -1;
45} 45}
46 46
47int usbmuxd_scan(usbmuxd_scan_result **available_devices) 47int usbmuxd_scan(usbmuxd_scan_result ** available_devices)
48{ 48{
49 struct usbmuxd_scan_request s_req; 49 struct usbmuxd_scan_request s_req;
50 int sfd; 50 int sfd;
@@ -68,13 +68,16 @@ int usbmuxd_scan(usbmuxd_scan_result **available_devices)
68 s_req.header.tag = 2; 68 s_req.header.tag = 2;
69 69
70 // send scan request packet 70 // send scan request packet
71 if (send_buf(sfd, &s_req, s_req.header.length) == (int)s_req.header.length) { 71 if (send_buf(sfd, &s_req, s_req.header.length) ==
72 (int) s_req.header.length) {
72 res = -1; 73 res = -1;
73 // get response 74 // get response
74 if (usbmuxd_get_result(sfd, s_req.header.tag, &res) && (res == 0)) { 75 if (usbmuxd_get_result(sfd, s_req.header.tag, &res) && (res == 0)) {
75 scan_success = 1; 76 scan_success = 1;
76 } else { 77 } else {
77 fprintf(stderr, "%s: Did not get response to scan request (with result=0)...\n", __func__); 78 fprintf(stderr,
79 "%s: Did not get response to scan request (with result=0)...\n",
80 __func__);
78 close(sfd); 81 close(sfd);
79 return res; 82 return res;
80 } 83 }
@@ -91,29 +94,45 @@ int usbmuxd_scan(usbmuxd_scan_result **available_devices)
91 if (recv_buf_timeout(sfd, &pktlen, 4, MSG_PEEK, 1000) == 4) { 94 if (recv_buf_timeout(sfd, &pktlen, 4, MSG_PEEK, 1000) == 4) {
92 if (pktlen != sizeof(dev_info_pkt)) { 95 if (pktlen != sizeof(dev_info_pkt)) {
93 // invalid packet size received! 96 // invalid packet size received!
94 fprintf(stderr, "%s: Invalid packet size (%d) received when expecting a device info record.\n", __func__, pktlen); 97 fprintf(stderr,
98 "%s: Invalid packet size (%d) received when expecting a device info record.\n",
99 __func__, pktlen);
95 break; 100 break;
96 } 101 }
97 102
98 recv_len = recv_buf(sfd, &dev_info_pkt, pktlen); 103 recv_len = recv_buf(sfd, &dev_info_pkt, pktlen);
99 if (recv_len <= 0) { 104 if (recv_len <= 0) {
100 fprintf(stderr, "%s: Error when receiving device info record\n", __func__); 105 fprintf(stderr,
106 "%s: Error when receiving device info record\n",
107 __func__);
101 break; 108 break;
102 } else if ((uint32_t)recv_len < pktlen) { 109 } else if ((uint32_t) recv_len < pktlen) {
103 fprintf(stderr, "%s: received less data than specified in header!\n", __func__); 110 fprintf(stderr,
111 "%s: received less data than specified in header!\n",
112 __func__);
104 } else { 113 } else {
105 //fprintf(stderr, "%s: got device record with id %d, UUID=%s\n", __func__, dev_info_pkt.device_info.device_id, dev_info_pkt.device_info.serial_number); 114 //fprintf(stderr, "%s: got device record with id %d, UUID=%s\n", __func__, dev_info_pkt.device_info.device_id, dev_info_pkt.device_info.serial_number);
106 newlist = (usbmuxd_scan_result *)realloc(*available_devices, sizeof(usbmuxd_scan_result) * (dev_cnt+1)); 115 newlist =
116 (usbmuxd_scan_result *) realloc(*available_devices,
117 sizeof
118 (usbmuxd_scan_result) *
119 (dev_cnt + 1));
107 if (newlist) { 120 if (newlist) {
108 newlist[dev_cnt].handle = (int)dev_info_pkt.device.device_id; 121 newlist[dev_cnt].handle =
109 newlist[dev_cnt].product_id = dev_info_pkt.device.product_id; 122 (int) dev_info_pkt.device.device_id;
110 memset(newlist[dev_cnt].serial_number, '\0', sizeof(newlist[dev_cnt].serial_number)); 123 newlist[dev_cnt].product_id =
111 memcpy(newlist[dev_cnt].serial_number, dev_info_pkt.device.serial_number, 124 dev_info_pkt.device.product_id;
112 sizeof(dev_info_pkt.device.serial_number)); 125 memset(newlist[dev_cnt].serial_number, '\0',
126 sizeof(newlist[dev_cnt].serial_number));
127 memcpy(newlist[dev_cnt].serial_number,
128 dev_info_pkt.device.serial_number,
129 sizeof(dev_info_pkt.device.serial_number));
113 *available_devices = newlist; 130 *available_devices = newlist;
114 dev_cnt++; 131 dev_cnt++;
115 } else { 132 } else {
116 fprintf(stderr, "%s: ERROR: out of memory when trying to realloc!\n", __func__); 133 fprintf(stderr,
134 "%s: ERROR: out of memory when trying to realloc!\n",
135 __func__);
117 break; 136 break;
118 } 137 }
119 } 138 }
@@ -125,8 +144,11 @@ int usbmuxd_scan(usbmuxd_scan_result **available_devices)
125 } 144 }
126 145
127 // terminating zero record 146 // terminating zero record
128 newlist = (usbmuxd_scan_result *)realloc(*available_devices, sizeof(usbmuxd_scan_result) * (dev_cnt+1)); 147 newlist =
129 memset(newlist+dev_cnt, 0, sizeof(usbmuxd_scan_result)); 148 (usbmuxd_scan_result *) realloc(*available_devices,
149 sizeof(usbmuxd_scan_result) *
150 (dev_cnt + 1));
151 memset(newlist + dev_cnt, 0, sizeof(usbmuxd_scan_result));
130 *available_devices = newlist; 152 *available_devices = newlist;
131 153
132 return dev_cnt; 154 return dev_cnt;
@@ -141,31 +163,33 @@ int usbmuxd_connect(const int handle, const unsigned short tcp_port)
141 163
142 sfd = connect_unix_socket(USBMUXD_SOCKET_FILE); 164 sfd = connect_unix_socket(USBMUXD_SOCKET_FILE);
143 if (sfd < 0) { 165 if (sfd < 0) {
144 fprintf(stderr, "%s: Error: Connection to usbmuxd failed: %s\n", __func__, strerror(errno)); 166 fprintf(stderr, "%s: Error: Connection to usbmuxd failed: %s\n",
145 return sfd; 167 __func__, strerror(errno));
168 return sfd;
146 } 169 }
147 170
148 c_req.header.length = sizeof(c_req); 171 c_req.header.length = sizeof(c_req);
149 c_req.header.reserved = 0; 172 c_req.header.reserved = 0;
150 c_req.header.type = USBMUXD_CONNECT; 173 c_req.header.type = USBMUXD_CONNECT;
151 c_req.header.tag = 3; 174 c_req.header.tag = 3;
152 c_req.device_id = (uint32_t)handle; 175 c_req.device_id = (uint32_t) handle;
153 c_req.tcp_dport = htons(tcp_port); 176 c_req.tcp_dport = htons(tcp_port);
154 c_req.reserved = 0; 177 c_req.reserved = 0;
155 178
156 if (send_buf(sfd, &c_req, sizeof(c_req)) < 0) { 179 if (send_buf(sfd, &c_req, sizeof(c_req)) < 0) {
157 perror("send"); 180 perror("send");
158 } else { 181 } else {
159 // read ACK 182 // read ACK
160 //fprintf(stderr, "%s: Reading connect result...\n", __func__); 183 //fprintf(stderr, "%s: Reading connect result...\n", __func__);
161 if (usbmuxd_get_result(sfd, c_req.header.tag, &res)) { 184 if (usbmuxd_get_result(sfd, c_req.header.tag, &res)) {
162 if (res == 0) { 185 if (res == 0) {
163 //fprintf(stderr, "%s: Connect success!\n", __func__); 186 //fprintf(stderr, "%s: Connect success!\n", __func__);
164 connected = 1; 187 connected = 1;
165 } else { 188 } else {
166 fprintf(stderr, "%s: Connect failed, Error code=%d\n", __func__, res); 189 fprintf(stderr, "%s: Connect failed, Error code=%d\n",
190 __func__, res);
191 }
167 } 192 }
168 }
169 } 193 }
170 194
171 if (connected) { 195 if (connected) {
@@ -173,6 +197,6 @@ int usbmuxd_connect(const int handle, const unsigned short tcp_port)
173 } 197 }
174 198
175 close(sfd); 199 close(sfd);
176 200
177 return -1; 201 return -1;
178} 202}