[PATCH 4/6] main: Factor out a function to retrieve alternate interface names
Tormod Volden
lists.tormod at gmail.com
Wed Aug 31 23:26:23 CEST 2011
From: Tormod Volden <debian.tormod at gmail.com>
---
src/main.c | 62 +++++++++++++++++++++++++++++------------------------------
1 files changed, 30 insertions(+), 32 deletions(-)
diff --git a/src/main.c b/src/main.c
index e547a05..9146920 100644
--- a/src/main.c
+++ b/src/main.c
@@ -190,34 +190,47 @@ static int count_matching_dfu_if(struct dfu_if *dif)
#define MAX_STR_LEN 64
-static int print_dfu_if(struct dfu_if *dfu_if, void *v)
+/* Retrieves alternate interface name string.
+ * Returns string length, or negative on error */
+static int get_alt_name(struct dfu_if *dfu_if, unsigned char *name)
{
libusb_device *dev = dfu_if->dev;
struct libusb_config_descriptor *cfg;
- int if_name_str_idx;
- unsigned char name[MAX_STR_LEN+1] = "UNDEFINED";
+ int alt_name_str_idx;
+ int ret;
- libusb_get_config_descriptor_by_value(dev, dfu_if->configuration, &cfg);
+ ret = libusb_get_config_descriptor_by_value(dev, dfu_if->configuration,
+ &cfg);
+ if (ret)
+ return ret;
- if_name_str_idx = cfg->interface[dfu_if->interface]
- .altsetting[dfu_if->altsetting].iInterface;
- if (if_name_str_idx) {
+ alt_name_str_idx = cfg->interface[dfu_if->interface].
+ altsetting[dfu_if->altsetting].iInterface;
+ ret = -1;
+ if (alt_name_str_idx) {
if (!dfu_if->dev_handle)
libusb_open(dfu_if->dev, &dfu_if->dev_handle);
if (dfu_if->dev_handle)
- libusb_get_string_descriptor_ascii(dfu_if->dev_handle,
- if_name_str_idx, name,
- MAX_STR_LEN);
+ ret = libusb_get_string_descriptor_ascii(
+ dfu_if->dev_handle, alt_name_str_idx,
+ name, MAX_STR_LEN);
}
+ libusb_free_config_descriptor(cfg);
+ return ret;
+}
+
+static int print_dfu_if(struct dfu_if *dfu_if, void *v)
+{
+ unsigned char name[MAX_STR_LEN+1] = "UNDEFINED";
+
+ get_alt_name(dfu_if, name);
printf("Found %s: [0x%04x:0x%04x] devnum=%u, cfg=%u, intf=%u, "
"alt=%u, name=\"%s\"\n",
dfu_if->flags & DFU_IFF_DFU ? "DFU" : "Runtime",
dfu_if->vendor, dfu_if->product, dfu_if->devnum,
- dfu_if->configuration, dfu_if->interface,
+ dfu_if->configuration, dfu_if->interface,
dfu_if->altsetting, name);
-
- libusb_free_config_descriptor(cfg);
return 0;
}
@@ -241,25 +254,10 @@ static int list_dfu_interfaces(libusb_context *ctx)
static int alt_by_name(struct dfu_if *dfu_if, void *v)
{
- libusb_device *dev = dfu_if->dev;
- struct libusb_config_descriptor *cfg;
- int if_name_str_idx;
- unsigned char name[MAX_STR_LEN+1] = "UNDEFINED";
+ unsigned char name[MAX_STR_LEN+1];
- libusb_get_config_descriptor_by_value(dev, dfu_if->configuration, &cfg);
-
- if_name_str_idx = cfg->interface[dfu_if->interface]
- .altsetting[dfu_if->altsetting].iInterface;
- if (!if_name_str_idx)
- return 0;
- if (!dfu_if->dev_handle)
- libusb_open(dfu_if->dev, &dfu_if->dev_handle);
- if (!dfu_if->dev_handle)
+ if (get_alt_name(dfu_if, name) < 0)
return 0;
- if (libusb_get_string_descriptor_ascii(dfu_if->dev_handle,
- if_name_str_idx, name,
- MAX_STR_LEN) < 0)
- return 0; /* should we return an error here ? */
if (strcmp((char *)name, v))
return 0;
/*
--
1.7.5.4
More information about the devel
mailing list