summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libusbmuxd/libusbmuxd.c33
1 files changed, 11 insertions, 22 deletions
diff --git a/libusbmuxd/libusbmuxd.c b/libusbmuxd/libusbmuxd.c
index f074a5d..fa0cb62 100644
--- a/libusbmuxd/libusbmuxd.c
+++ b/libusbmuxd/libusbmuxd.c
@@ -1,7 +1,7 @@
1/* 1/*
2 libusbmuxd - client library to talk to usbmuxd 2 libusbmuxd - client library to talk to usbmuxd
3 3
4Copyright (C) 2009 Nikias Bassen <nikias@gmx.li> 4Copyright (C) 2009-2010 Nikias Bassen <nikias@gmx.li>
5Copyright (C) 2009 Paul Sladen <libiphone@paul.sladen.org> 5Copyright (C) 2009 Paul Sladen <libiphone@paul.sladen.org>
6Copyright (C) 2009 Martin Szulecki <opensuse@sukimashita.com> 6Copyright (C) 2009 Martin Szulecki <opensuse@sukimashita.com>
7 7
@@ -122,8 +122,6 @@ static void generate_event(usbmuxd_event_cb_t callback, const usbmuxd_device_inf
122 ev.event = event; 122 ev.event = event;
123 memcpy(&ev.device, dev, sizeof(usbmuxd_device_info_t)); 123 memcpy(&ev.device, dev, sizeof(usbmuxd_device_info_t));
124 124
125 printf("%s: event=%d, handle=%d\n", __func__, ev.event, ev.device.handle);
126
127 callback(&ev, user_data); 125 callback(&ev, user_data);
128} 126}
129 127
@@ -146,11 +144,8 @@ static int usbmuxd_listen()
146 144
147 sfd = connect_usbmuxd_socket(); 145 sfd = connect_usbmuxd_socket();
148 if (sfd < 0) { 146 if (sfd < 0) {
149 fprintf(stderr, "DEBUG: waiting for usbmuxd to come up.\n");
150
151 while (event_cb) { 147 while (event_cb) {
152 if ((sfd = connect_usbmuxd_socket()) > 0) { 148 if ((sfd = connect_usbmuxd_socket()) > 0) {
153 fprintf(stderr, "DEBUG: usbmuxd started\n");
154 break; 149 break;
155 } 150 }
156 sleep(1); 151 sleep(1);
@@ -158,17 +153,17 @@ static int usbmuxd_listen()
158 } 153 }
159 154
160 if (sfd < 0) { 155 if (sfd < 0) {
161 fprintf(stderr, "ERROR: usbmuxd was supposed to be running here...\n"); 156 fprintf(stderr, "%s: ERROR: usbmuxd was supposed to be running here...\n", __func__);
162 return sfd; 157 return sfd;
163 } 158 }
164 159
165 if (send_buf(sfd, &req, req.header.length) != (int)req.header.length) { 160 if (send_buf(sfd, &req, req.header.length) != (int)req.header.length) {
166 fprintf(stderr, "ERROR: could not send listen packet\n"); 161 fprintf(stderr, "%s: ERROR: could not send listen packet\n", __func__);
167 close(sfd); 162 close(sfd);
168 return -1; 163 return -1;
169 } 164 }
170 if (usbmuxd_get_result(sfd, req.header.tag, &res) && (res != 0)) { 165 if (usbmuxd_get_result(sfd, req.header.tag, &res) && (res != 0)) {
171 fprintf(stderr, "ERROR: did not get OK\n"); 166 fprintf(stderr, "%s: ERROR: did not get OK\n", __func__);
172 close(sfd); 167 close(sfd);
173 return -1; 168 return -1;
174 } 169 }
@@ -190,7 +185,6 @@ int get_next_event(int sfd, usbmuxd_event_cb_t callback, void *user_data)
190 recv_len = recv_buf_timeout(sfd, &hdr, sizeof(hdr), 0, 0); 185 recv_len = recv_buf_timeout(sfd, &hdr, sizeof(hdr), 0, 0);
191 if (recv_len < 0) { 186 if (recv_len < 0) {
192 int i; 187 int i;
193 fprintf(stderr, "DEBUG: connection closed.\n");
194 // when then usbmuxd connection fails, 188 // when then usbmuxd connection fails,
195 // generate remove events for every device that 189 // generate remove events for every device that
196 // is still present so applications know about it 190 // is still present so applications know about it
@@ -204,16 +198,16 @@ int get_next_event(int sfd, usbmuxd_event_cb_t callback, void *user_data)
204 struct usbmuxd_device_record dev; 198 struct usbmuxd_device_record dev;
205 usbmuxd_device_info_t *devinfo = (usbmuxd_device_info_t*)malloc(sizeof(usbmuxd_device_info_t)); 199 usbmuxd_device_info_t *devinfo = (usbmuxd_device_info_t*)malloc(sizeof(usbmuxd_device_info_t));
206 if (!devinfo) { 200 if (!devinfo) {
207 fprintf(stderr, "Out of memory!\n"); 201 fprintf(stderr, "%s: Out of memory!\n", __func__);
208 return -1; 202 return -1;
209 } 203 }
210 204
211 if (hdr.length != sizeof(struct usbmuxd_header)+sizeof(struct usbmuxd_device_record)) { 205 if (hdr.length != sizeof(struct usbmuxd_header)+sizeof(struct usbmuxd_device_record)) {
212 fprintf(stderr, "WARNING: unexpected packet size%d for MESSAGE_DEVICE_ADD (expected %d)!\n", hdr.length, (int)(sizeof(struct usbmuxd_header)+sizeof(struct usbmuxd_device_record))); 206 fprintf(stderr, "%s: WARNING: unexpected packet size %d for MESSAGE_DEVICE_ADD (expected %d)!\n", __func__, hdr.length, (int)(sizeof(struct usbmuxd_header)+sizeof(struct usbmuxd_device_record)));
213 } 207 }
214 recv_len = recv_buf_timeout(sfd, &dev, hdr.length - sizeof(struct usbmuxd_header), 0, 5000); 208 recv_len = recv_buf_timeout(sfd, &dev, hdr.length - sizeof(struct usbmuxd_header), 0, 5000);
215 if (recv_len != (hdr.length - sizeof(struct usbmuxd_header))) { 209 if (recv_len != (hdr.length - sizeof(struct usbmuxd_header))) {
216 fprintf(stderr, "Could not receive packet\n"); 210 fprintf(stderr, "%s: ERROR: Could not receive packet\n", __func__);
217 return recv_len; 211 return recv_len;
218 } 212 }
219 213
@@ -229,17 +223,17 @@ int get_next_event(int sfd, usbmuxd_event_cb_t callback, void *user_data)
229 usbmuxd_device_info_t *dev; 223 usbmuxd_device_info_t *dev;
230 224
231 if (hdr.length != sizeof(struct usbmuxd_header)+sizeof(uint32_t)) { 225 if (hdr.length != sizeof(struct usbmuxd_header)+sizeof(uint32_t)) {
232 fprintf(stderr, "WARNING: unexpected packet size%d for MESSAGE_DEVICE_REMOVE (expected %d)!\n", hdr.length, (int)(sizeof(struct usbmuxd_header)+sizeof(uint32_t))); 226 fprintf(stderr, "%s: WARNING: unexpected packet size %d for MESSAGE_DEVICE_REMOVE (expected %d)!\n", __func__, hdr.length, (int)(sizeof(struct usbmuxd_header)+sizeof(uint32_t)));
233 } 227 }
234 recv_len = recv_buf_timeout(sfd, &handle, sizeof(uint32_t), 0, 5000); 228 recv_len = recv_buf_timeout(sfd, &handle, sizeof(uint32_t), 0, 5000);
235 if (recv_len != sizeof(uint32_t)) { 229 if (recv_len != sizeof(uint32_t)) {
236 fprintf(stderr, "Could not receive packet\n"); 230 fprintf(stderr, "%s: ERROR: Could not receive packet\n", __func__);
237 return recv_len; 231 return recv_len;
238 } 232 }
239 233
240 dev = devices_find(handle); 234 dev = devices_find(handle);
241 if (!dev) { 235 if (!dev) {
242 fprintf(stderr, "WARNING: got device remove message for handle %d, but couldn't find the corresponding handle in the device list. This event will be ignored.\n", handle); 236 fprintf(stderr, "%s: WARNING: got device remove message for handle %d, but couldn't find the corresponding handle in the device list. This event will be ignored.\n", __func__, handle);
243 } else { 237 } else {
244 generate_event(callback, dev, UE_DEVICE_REMOVE, user_data); 238 generate_event(callback, dev, UE_DEVICE_REMOVE, user_data);
245 collection_remove(&devices, dev); 239 collection_remove(&devices, dev);
@@ -266,22 +260,18 @@ static void *device_monitor(void *data)
266 260
267 listenfd = usbmuxd_listen(); 261 listenfd = usbmuxd_listen();
268 if (listenfd < 0) { 262 if (listenfd < 0) {
269 fprintf(stderr, "DEBUG: listenfd=%d\n", listenfd);
270 continue; 263 continue;
271 } 264 }
272 265
273 while (event_cb) { 266 while (event_cb) {
274 printf("waiting for events\n");
275 int res = get_next_event(listenfd, event_cb, data); 267 int res = get_next_event(listenfd, event_cb, data);
276 if (res < 0) { 268 if (res < 0) {
277 fprintf(stderr, "%s: closing connection (code %d)\n", __func__, res);
278 break; 269 break;
279 } 270 }
280 } 271 }
281 } 272 }
282 273
283 collection_free(&devices); 274 collection_free(&devices);
284 printf("%s: terminated\n", __func__);
285 275
286 return NULL; 276 return NULL;
287} 277}
@@ -297,7 +287,7 @@ int usbmuxd_subscribe(usbmuxd_event_cb_t callback, void *user_data)
297 287
298 res = pthread_create(&devmon, NULL, device_monitor, user_data); 288 res = pthread_create(&devmon, NULL, device_monitor, user_data);
299 if (res != 0) { 289 if (res != 0) {
300 fprintf(stderr, "ERROR: Could not start device watcher thread!\n"); 290 fprintf(stderr, "%s: ERROR: Could not start device watcher thread!\n", __func__);
301 return res; 291 return res;
302 } 292 }
303 return 0; 293 return 0;
@@ -308,7 +298,6 @@ int usbmuxd_unsubscribe()
308 event_cb = NULL; 298 event_cb = NULL;
309 299
310 if (pthread_kill(devmon, 0) == 0) { 300 if (pthread_kill(devmon, 0) == 0) {
311 printf("%s: unsubscribing callback\n", __func__);
312 close(listenfd); 301 close(listenfd);
313 listenfd = -1; 302 listenfd = -1;
314 pthread_kill(devmon, SIGINT); 303 pthread_kill(devmon, SIGINT);