support Quanta and Blackberry modes
[project/usbmode.git] / main.c
diff --git a/main.c b/main.c
index b7461ad..6cfe3b2 100644 (file)
--- a/main.c
+++ b/main.c
@@ -19,12 +19,13 @@ static int verbose = 0;
 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;
 
@@ -73,20 +74,20 @@ static int hexstr2bin(const char *hex, char *buffer, int len)
        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)
@@ -115,13 +116,18 @@ 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) {
@@ -209,6 +215,7 @@ parse_interface_config(libusb_device *dev, struct usbdev_data *data)
 
        alt = &iface->altsetting[0];
        data->interface = alt->bInterfaceNumber;
+       data->dev_class = alt->bInterfaceClass;
 
        for (i = 0; i < alt->bNumEndpoints; i++) {
                const struct libusb_endpoint_descriptor *ep = &alt->endpoint[i];
@@ -255,6 +262,8 @@ static void iterate_devs(cmd_cb_t cb)
                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));
@@ -274,7 +283,8 @@ static void iterate_devs(cmd_cb_t cb)
                if (data.config)
                        libusb_free_config_descriptor(data.config);
 
-               libusb_close(data.devh);
+               if (data.devh)
+                       libusb_close(data.devh);
        }
 }