Re: Socket header file

Alan Modra (alan@spri.levels.unisa.edu.au)
Thu, 19 Dec 1996 23:03:14 +1030 (CST)


>Richard Gooch <rgooch@atnf.CSIRO.AU>
>
> Alan Modra writes:
> >
> > >root@analogic.com (Richard B. Johnson)
> > > /usr/include/linux/socket.h: unsigned char cmsg_data[0];
> > > This should probably be:
> > > unsigned char *cmsg_data;
> >
> > No, definitely not. It's correct as it is. The structure is
> > dynamically allocated with cmsg_data[] a variable length array.
>
> I have complained to Linus about this a few times before, with no
> response. The problem with the above construct is that you cannot
> compile with gcc -Wall -pedantic-errors

Glad to see that you like to have your code portable. Linus may
accept a fix rather than just a complaint. No, come to think of it,
the person you should talk to is Alan Cox, since he's the network code
maintainer.

One fix would be to zap cmsg_data[0] from struct cmsghdr, change the
CMSG_DATA define to
#define CMSG_DATA(cmsg) ((unsigned char *)(cmsg) + sizeof(struct cmsghdr))
and fix kernel code referencing cmsg_data. In fact, the CMSG_DATA
macro should be used in the kernel anyway. Shouldn't take more than
10 minutes :-)

> Note that I'm referring to compiling *user code*, not kernel
> code. Does this particular structure have to be visible outside the
> kernel? If not, can someone please put an #ifdef around it?
> If this structure needs to be visible outside the kernel, then this
> structure needs to be reconsidered. It is really *extremely annoying*
> to have to edit the file whenever I download a new kernel, just so I
> can compile my userland networking code.