Am Dienstag 01 April 2008 schrieb Alex Kanavin: > So here's the patch. Like I said, I don't have any hardware to test it > with (and I'm not aware if any such hardware exists), but the patch > seems pretty safe to me.
I'll comment the patch thus here it comes inlined in parts... +typedef struct { + /* Role: 0 for server, 1 for client */ + uint8_t role; + /* Service UUID */ + uint8_t uuid[16]; + /* Service version */ + uint16_t version; +} obex_usb_intf_service_t; Several things: * role should match the values for OBEX_MODE_(CLIENT|SERVER), yours is inverted OTOH, that would not meet the value in the spec but a consistent API looks better. * make that struct packed and put role at the end (see other comment below) + /* Service information, may be NULL */ + obex_usb_intf_service_t *service; Why can this be zero? Does the updated standard propose values if that descriptor is not present? Application code could be simpler if default values are filled in, I assume... + * Helper function to usbobex_find_interfaces + */ +static void find_obex_service_descriptor(unsigned char *buffer, int buflen, obex_usb_intf_service_t **service) +{ Since you used uint8_t for uuid field, why not for buffer? A len argument should be of type size_t. + int i; Not needed, see below. + if (!buffer) { + DEBUG(2,"Weird descriptor references"); + return ; + } + while (buflen > 0) { + if (buffer [1] != USB_DT_CS_INTERFACE) { + DEBUG(2,"skipping garbage"); + goto next_desc; + } + switch (buffer [2]) { Please omit the extra space (2 times) but put it into the DEBUG statement instead (after the comma, 2 times). + case CDC_OBEX_SERVICE_ID_TYPE: /* we've found it */ + if (buflen < 22) This is yet another magic number. If obex_usb_intf_service_t is packed, you can use 3+sizeof(obex_usb_intf_service_t) instead of 22. A debateable statement of mine, though... + DEBUG(2, "Invalid service id descriptor"); + else if (*service == NULL) + *service = malloc(sizeof(obex_usb_intf_service_t)); = malloc(sizeof(**service)); would be better. + if (*service != NULL) { Wrong indentation of the "else if" above is missing the curly braces. + (*service)->role = buffer[3]; What if that is not 0 or 1? + for (i=0; i<16; i++) + (*service)->uuid[i] = buffer[4+i]; memcpy() comes to my mind as replacement for such loops: memcpy((*service)->uuid, buffer+4, 16) + (*service)->version = buffer[20]*256+buffer[21]; = (buffer[20] << 8) | buffer[21] is a more common way of writing that. +next_desc: + buflen -= buffer[0]; + buffer += buffer[0]; OTOH, if buflen is of type size_t, you need a check here. Still... Have fun. HS ------------------------------------------------------------------------- Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace _______________________________________________ Openobex-users mailing list Openobex-users@lists.sourceforge.net http://lists.sourceforge.net/lists/listinfo/openobex-users