Inaky Perez-Gonzalez <[EMAIL PROTECTED]> writes:

[...]

> Here is my point: it's way easier and more maintenable to do
>
>       struct some_descriptor {
>               __le16 foo;
>               __u8 bar;
>       } __attribute__((packed));
>       ...
>       struct some_descriptor descr;
>       ...
>       read_from_wire(&descr, sizeof(descr));
>       do_something_with_values(&descr->foo, &descr->bar)

Out of curiosity, where endianness issues are handled in this code?

>
> than
>
>       u8 buffer[SOME_DESCRIPTOR_DT_SIZE], foo;
>       le16 bar;
>       read_from_wire(buffer, SOME_DESCRIPTOR_DT_SIZE);
>       bar = le16_to_cpu((__le16)buffer[1] << 8 | buffer[0]);
>       foo = buffer[2];
>       do_something_with_values(foo, bar)

This IMHO, could look, e.g., like this:

  struct some_descriptor {
    __u8 foo[2];
    __u8 bar;
  };
  ...  
  struct some_descriptor descr;
  ...
  read_from_wire(&descr, sizeof(descr));
  do_something_with_values(usb_get_uint16(descr->foo), bar);
  ...
  usb_set_uint16(descr->foo, 2385);
  
where:
  
  static inline unsigned usb_get_uint16(__u8 const *p)
  {
    return p[0] | (p[1] << 8);
  }
  
  static inline void usb_set_uint16(__u8 const *p, unsigned value)
  {
    p[0] = value;
    p[1] = value >> 8;
  }
  
Not only this avoids packed attribute, but makes it obvious that one
can't just use bare descr->foo in and endianness-safe way.

-- Sergei.


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to