diff options
Diffstat (limited to 'libusbmuxd.c')
| -rw-r--r-- | libusbmuxd.c | 138 |
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 | ||
| 17 | static int usbmuxd_get_result(int sfd, uint32_t tag, uint32_t *result) | 17 | static 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 | ||
| 47 | int usbmuxd_scan(usbmuxd_scan_result **available_devices) | 47 | int 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 | } |
