static const char *config_file = DEFAULT_CONFIG;
static struct blob_buf conf;
-struct blob_attr **messages = NULL;
+char **messages = NULL;
+int *message_len;
int n_messages = 0;
static struct avl_tree devices;
-static struct libusb_context *usb;
+struct libusb_context *usb;
static struct libusb_device **usbdevs;
static int n_usbdevs;
return 0;
}
-static bool convert_message(struct blob_attr *attr)
+static int convert_message(struct blob_attr *attr)
{
char *data;
int len;
- if (!attr)
- return true;
-
data = blobmsg_data(attr);
len = strlen(data);
if (len % 2)
- return false;
+ return -1;
+
+ if (hexstr2bin(data, data, len / 2))
+ return -1;
- return !hexstr2bin(data, data, len / 2);
+ return len / 2;
}
static int parse_config(void)
n_messages++;
messages = calloc(n_messages, sizeof(*messages));
+ message_len = calloc(n_messages, sizeof(*message_len));
n_messages = 0;
blobmsg_for_each_attr(cur, tb[CONF_MESSAGES], rem) {
- if (!convert_message(cur)) {
+ int len = convert_message(cur);
+
+ if (len < 0) {
fprintf(stderr, "Invalid data in message %d\n", n_messages);
return -1;
}
- messages[n_messages++] = cur;
+
+ message_len[n_messages] = len;
+ messages[n_messages++] = blobmsg_data(cur);
}
blobmsg_for_each_attr(cur, tb[CONF_DEVICES], rem) {
if (libusb_open(usbdevs[i], &data.devh))
continue;
+ data.dev = usbdevs[i];
+
libusb_get_string_descriptor_ascii(
data.devh, data.desc.iManufacturer,
(void *) data.mfg, sizeof(data.mfg));
if (data.config)
libusb_free_config_descriptor(data.config);
- libusb_close(data.devh);
+ if (data.devh)
+ libusb_close(data.devh);
}
}