diff options
author | Keith Packard <keithp@keithp.com> | 2013-04-20 22:05:01 -0500 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-04-20 22:22:08 -0500 |
commit | 02a564bbc3a23b4f90685e8b29083ddb3e4b3563 (patch) | |
tree | 10d84e9a3dfe088750753c182c0e294bc82f4598 /libaltos/libaltos.c | |
parent | 6348186397dbef6da912586cea58d6663c511501 (diff) |
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 <keithp@keithp.com>
Diffstat (limited to 'libaltos/libaltos.c')
-rw-r--r-- | libaltos/libaltos.c | 29 |
1 files changed, 17 insertions, 12 deletions
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: |