Hello.

On Fri, 2011-05-20 at 00:03, Tormod Volden wrote:
> From: Tormod Volden <debian.tor...@gmail.com>
> 
> Allow filtering on vendor ID or product ID alone. Examples:
>  -d 1234:        (filter on vendor ID alone)
>  -d :5678        (filter on product ID, less useful)
>  -d 1234:5678    (full ID, like before)

I like the idea. One minor point below though.

> Since there were already separate DFU_IFF_VENDOR and DFU_IF_PRODUCT
> match specifier flags, this could seem like the original intention.
> 
> This also gets rid of a struct that was only used for this function call.
> ---
> 
> (patches for dfu-util, if somebody wonders :) )
> 
> This patch series is mostly preparing for things to come. Only this
> first patch changes (adds) any functionality.
> 
> Tormod
> 
>  src/main.c |   52 ++++++++++++++++++----------------------------------
>  1 files changed, 18 insertions(+), 34 deletions(-)
> 
> diff --git a/src/main.c b/src/main.c
> index 401614d..4bea757 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -61,11 +61,6 @@ static int verbose = 0;
>  #define DFU_IFF_DEVNUM               0x2000
>  #define DFU_IFF_PATH         0x4000
>  
> -struct usb_vendprod {
> -     u_int16_t vendor;
> -     u_int16_t product;
> -};
> -
>  struct dfu_if {
>       u_int16_t vendor;
>       u_int16_t product;
> @@ -263,10 +258,11 @@ static int iterate_dfu_devices(struct dfu_if *dif,
>               dev = list[i];
>               libusb_get_device_descriptor(list[i], &desc);
>  
> -             if (dif && (dif->flags &
> -                 (DFU_IFF_VENDOR|DFU_IFF_PRODUCT)) &&
> -                 (desc.idVendor != dif->vendor ||
> -                 desc.idProduct != dif->product))
> +             if (dif && (dif->flags & DFU_IFF_VENDOR) &&
> +                 desc.idVendor != dif->vendor)
> +                     continue;
> +             if (dif && (dif->flags & DFU_IFF_PRODUCT) &&
> +                 desc.idProduct != dif->product)
>                       continue;
>               if (dif && (dif->flags & DFU_IFF_DEVNUM) &&
>                   (bnum != dif->bus || dnum != dif->devnum))
> @@ -339,25 +335,16 @@ static int list_dfu_interfaces(void)
>       return 0;
>  }
>  
> -static int parse_vendprod(struct usb_vendprod *vp, const char *str)
> +static void parse_vendprod(u_int16_t *vendor, u_int16_t *product, const char 
> *str)
>  {
> -     unsigned long vend, prod;
>       const char *colon;
>  
> +     *vendor = strtoul(str, NULL, 16);
>       colon = strchr(str, ':');
> -     if (!colon || strlen(colon) < 2)
> -             return -EINVAL;
> -
> -     vend = strtoul(str, NULL, 16);
> -     prod = strtoul(colon+1, NULL, 16);
> -
> -     if (vend > 0xffff || prod > 0xffff)
> -             return -EINVAL;

Any reason you removed the error handling here?

> -     vp->vendor = vend;
> -     vp->product = prod;
> -
> -     return 0;
> +     if (colon)
> +             *product = strtoul(colon + 1, NULL, 16);
> +     else
> +             *product = 0;
>  }
>  
>  
> @@ -485,7 +472,6 @@ enum mode {
>  
>  int main(int argc, char **argv)
>  {
> -     struct usb_vendprod vendprod;
>       struct dfu_if _rt_dif, _dif, *dif = &_dif;
>       int num_devs;
>       int num_ifs;
> @@ -543,15 +529,13 @@ int main(int argc, char **argv)
>                       exit(0);
>                       break;
>               case 'd':
> -                     /* Parse device */
> -                     if (parse_vendprod(&vendprod, optarg) < 0) {
> -                             fprintf(stderr, "unable to parse `%s' as a 
> vendor:product\n", optarg);
> -
> -                             exit(2);
> -                     }
> -                     dif->vendor = vendprod.vendor;
> -                     dif->product = vendprod.product;
> -                     dif->flags |= (DFU_IFF_VENDOR | DFU_IFF_PRODUCT);
> +                     /* Parse device ID */
> +                     parse_vendprod(&dif->vendor, &dif->product, optarg);

Please keep the error handling like the former code.

> +                     printf("Filter on vendor = 0x%04x product = 0x%04x\n", 
> dif->vendor, dif->product);
> +                     if (dif->vendor)
> +                             dif->flags |= DFU_IFF_VENDOR;
> +                     if (dif->product)
> +                             dif->flags |= DFU_IFF_PRODUCT;
>                       break;
>               case 'p':
>                       /* Parse device path */
> -- 
> 1.7.0.4

regards
Stefan Schmidt


_______________________________________________
devel mailing list
devel@lists.openmoko.org
https://lists.openmoko.org/mailman/listinfo/devel

Reply via email to