Le 25 avril 2012 04:12, Xiaofan Chen <xiaof...@gmail.com> a écrit :
> On Fri, Apr 20, 2012 at 8:27 PM, Pete Batard <p...@akeo.ie> wrote:
>> On 2012.04.20 12:37, Xiaofan Chen wrote:

>>> Not so sure who want to take on this task.
>>> Samples: replace lisdevs with a testlibusb like sample
>>
>> In terms of priority, I see it as fairly low, so not having it assigned
>> to anybody is fine, as I don't think we should really try to divert
>> resources for it if none come forward right now.
>> The way I see it, it's one of these "when we have nothing better to do"
>> items, that hopefully someone will pick up (which may very well be me).
>> And as most "when we have nothing better to do", you tend to find out if
>> resources are actually available for it close to the release date, when
>> the more important items have been dealt with.
>
> Let me try as a C coding exercise and I will post my draft for
> your guys to review.

I started to work on that. But it is not finished. It does compile and run.
file attached + patch for the Makefile.am
I will let you finish the work :-)

As is it an sample of code it should be perfect (or near perfection)
regarding error management.

Bye

-- 
 Dr. Ludovic Rousseau
--- /var/folders/bk/g1s_r1js6wsgfk7940ms8jmr0000gn/T//dCi2Ve_Makefile.am        
2012-04-25 09:53:05.000000000 +0200
+++ examples/Makefile.am        2012-04-22 20:43:34.000000000 +0200
@@ -1,5 +1,7 @@
 INCLUDES = -I$(top_srcdir)/libusb
-noinst_PROGRAMS = listdevs xusb
+noinst_PROGRAMS = listdevs xusb testlibusb
+
+LDADD = ../libusb/libusb-1.0.la
 
 listdevs_SOURCES = listdevs.c
 listdevs_LDADD = ../libusb/libusb-1.0.la
/*
 * testlibusb.c
 *
 *  Test suite program
 */

#include <stdio.h>
#include <string.h>
#include <libusb-1.0/libusb.h>

int verbose = 0;

static void print_endpoint(const struct libusb_endpoint_descriptor *endpoint)
{
	printf("      bEndpointAddress: %02xh\n", endpoint->bEndpointAddress);
	printf("      bmAttributes:     %02xh\n", endpoint->bmAttributes);
	printf("      wMaxPacketSize:   %d\n", endpoint->wMaxPacketSize);
	printf("      bInterval:        %d\n", endpoint->bInterval);
	printf("      bRefresh:         %d\n", endpoint->bRefresh);
	printf("      bSynchAddress:    %d\n", endpoint->bSynchAddress);
}

static void print_altsetting(const struct libusb_interface_descriptor *interface)
{
	int i;

	printf("    bInterfaceNumber:   %d\n", interface->bInterfaceNumber);
	printf("    bAlternateSetting:  %d\n", interface->bAlternateSetting);
	printf("    bNumEndpoints:      %d\n", interface->bNumEndpoints);
	printf("    bInterfaceClass:    %d\n", interface->bInterfaceClass);
	printf("    bInterfaceSubClass: %d\n", interface->bInterfaceSubClass);
	printf("    bInterfaceProtocol: %d\n", interface->bInterfaceProtocol);
	printf("    iInterface:         %d\n", interface->iInterface);

	for (i = 0; i < interface->bNumEndpoints; i++)
		print_endpoint(&interface->endpoint[i]);
}

static void print_interface(const struct libusb_interface *interface)
{
	int i;

	for (i = 0; i < interface->num_altsetting; i++)
		print_altsetting(&interface->altsetting[i]);
}

static void print_configuration(struct libusb_config_descriptor *config)
{
	int i;

	printf("  wTotalLength:         %d\n", config->wTotalLength);
	printf("  bNumInterfaces:       %d\n", config->bNumInterfaces);
	printf("  bConfigurationValue:  %d\n", config->bConfigurationValue);
	printf("  iConfiguration:       %d\n", config->iConfiguration);
	printf("  bmAttributes:         %02xh\n", config->bmAttributes);
	printf("  MaxPower:             %d\n", config->MaxPower);

	for (i = 0; i < config->bNumInterfaces; i++)
		print_interface(&config->interface[i]);
}

static int print_device(struct libusb_device *dev, int level)
{
	struct libusb_device_handle *handle = NULL;
	char description[256];
	char string[256];
	int ret, i;

	ret = libusb_open(dev, &handle);
	if (ret >= 0) {
		struct libusb_device_descriptor descriptor;
		ret = libusb_get_device_descriptor(dev, &descriptor);

		if (verbose && ret < 0) {
			printf("  Couldn't retrieve descriptors\n");
			return 0;
		}

		if (descriptor.iManufacturer) {
			ret = libusb_get_string_descriptor_ascii(handle,
				descriptor.iManufacturer, string, sizeof(string));
			if (ret > 0)
				snprintf(description, sizeof(description), "%s - ", string);
			else
				snprintf(description, sizeof(description), "%04X - ",
					descriptor.idVendor);
		} else
			snprintf(description, sizeof(description), "%04X - ",
				descriptor.idVendor);

		if (descriptor.iProduct) {
			ret = libusb_get_string_descriptor_ascii(handle,
				descriptor.iProduct, string, sizeof(string));
			if (ret > 0)
				snprintf(description + strlen(description),
					sizeof(description) - strlen(description), "%s", string);
			else
				snprintf(description + strlen(description),
					sizeof(description) - strlen(description), "%04X",
					descriptor.idProduct);
		} else
			snprintf(description + strlen(description), sizeof(description) -
				strlen(description), "%04X", descriptor.idProduct);

		if (handle && verbose) {
			if (descriptor.iSerialNumber) {
				ret = libusb_get_string_descriptor_ascii(handle,
					descriptor.iSerialNumber, string, sizeof(string));
				if (ret > 0)
					printf("%.*s  - Serial Number: %s\n", level * 2,
						"                    ", string);
			}
		}

		/*
		if (verbose) {
			for (i = 0; i < descriptor.bNumConfigurations; i++)
				print_configuration(&dev->config[i]);
		} else {
			for (i = 0; i < dev->num_children; i++)
				print_device(dev->children[i], level + 1);
		}
		*/
	}
	/*
	   else
	   snprintf(description, sizeof(description), "%04X - %04X",
	   descriptor.idVendor, descriptor.idProduct);
	   */

	/*
	printf("%.*sDev #%d: %s\n", level * 2, "                    ", dev->devnum,
	description);
	*/

	if (handle)
		libusb_close(handle);

	return 0;
}

int main(int argc, char *argv[])
{
	ssize_t cnt;
	libusb_device **devs, *dev;
	int i, ret;

	if (argc > 1 && !strcmp(argv[1], "-v"))
		verbose = 1;

	ret = libusb_init(NULL);

	cnt = libusb_get_device_list(NULL, &devs);
	if (cnt < 0)
	{
		goto end;
	}

	/* for every device */
	i = 0;
	while ((dev = devs[i++]) != NULL)
		print_device(dev, 0);

end:
	libusb_exit(NULL);

	return 0;
}

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
libusbx-devel mailing list
libusbx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libusbx-devel

Reply via email to