From: Keith Packard Date: Sun, 21 Apr 2013 03:05:01 +0000 (-0500) Subject: libaltos: Try Bluetooth open 5 times on EBUSY X-Git-Tag: altosdroid_v1.2-1~5 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=02a564bbc3a23b4f90685e8b29083ddb3e4b3563;hp=6348186397dbef6da912586cea58d6663c511501 libaltos: Try Bluetooth open 5 times on EBUSY After closing Bluetooth, it can take a second before the device is up for another connection. Hang around retrying a few times. Signed-off-by: Keith Packard --- diff --git a/libaltos/libaltos.c b/libaltos/libaltos.c index ad03e638..69a6735f 100644 --- a/libaltos/libaltos.c +++ b/libaltos/libaltos.c @@ -736,30 +736,35 @@ struct altos_file * altos_bt_open(struct altos_bt_device *device) { struct sockaddr_rc addr = { 0 }; - int s, status; + int status, i; struct altos_file *file; file = calloc(1, sizeof (struct altos_file)); if (!file) goto no_file; - file->fd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); - if (file->fd < 0) { - altos_set_last_posix_error(); - goto no_sock; - } - addr.rc_family = AF_BLUETOOTH; addr.rc_channel = 1; str2ba(device->addr, &addr.rc_bdaddr); - status = connect(file->fd, - (struct sockaddr *)&addr, - sizeof(addr)); + for (i = 0; i < 5; i++) { + file->fd = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM); + if (file->fd < 0) { + altos_set_last_posix_error(); + goto no_sock; + } + + status = connect(file->fd, + (struct sockaddr *)&addr, + sizeof(addr)); + if (status >= 0 || errno != EBUSY) + break; + close(file->fd); + usleep(100 * 1000); + } if (status < 0) { altos_set_last_posix_error(); goto no_link; } - sleep(1); #ifdef USE_POLL pipe(file->pipe); @@ -768,7 +773,7 @@ altos_bt_open(struct altos_bt_device *device) #endif return file; no_link: - close(s); + close(file->fd); no_sock: free(file); no_file: