summaryrefslogtreecommitdiff
path: root/ao-tools
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2014-04-04 23:38:40 -0700
committerKeith Packard <keithp@keithp.com>2014-04-05 00:22:30 -0700
commitca4b20f9781b1dc6974d26952973dfe0d607478c (patch)
tree434d89d5a3dd5124718807038829469c193efcba /ao-tools
parent2424c0e6fe53789dc83d1e96439dcdc13e847b07 (diff)
ao-tools: Wait for device to become ready instead of failing
For some reason, USB devices take 'a while' to become usable; instead of bailing immediately, sit around waiting to see if the device becomes usable if we get an EBUSY or EACCES error. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'ao-tools')
-rw-r--r--ao-tools/lib/cc-usb.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/ao-tools/lib/cc-usb.c b/ao-tools/lib/cc-usb.c
index d7ac138c..a3a19d5c 100644
--- a/ao-tools/lib/cc-usb.c
+++ b/ao-tools/lib/cc-usb.c
@@ -412,19 +412,35 @@ cc_usb_close_remote(struct cc_usb *cc)
static struct termios save_termios;
+#include <errno.h>
+
struct cc_usb *
cc_usb_open(char *tty)
{
struct cc_usb *cc;
struct termios termios;
+ int i;
if (!tty)
tty = DEFAULT_TTY;
cc = calloc (sizeof (struct cc_usb), 1);
if (!cc)
return NULL;
- cc->fd = open(tty, O_RDWR | O_NONBLOCK);
- if (cc->fd < 0) {
+ i = 0;
+ for (;;) {
+ cc->fd = open(tty, O_RDWR | O_NONBLOCK);
+ if (cc->fd >= 0)
+ break;
+ i++;
+ if (errno == EBUSY || errno == EPERM || errno == EACCES) {
+ fprintf(stderr, "open failed, pausing");
+ perror(tty);
+ if (i < 20) {
+ sleep(3);
+ continue;
+ }
+ }
+
perror(tty);
free (cc);
return NULL;