RFC 2292 CMSG_FIRSTHDR macro...

George V. Neville-Neil gnn at neville-neil.com
Wed Apr 28 17:07:51 PDT 2004


Howdy,

	This should be a minor nit but, is there any reason we
	implement this this way:

#define	CMSG_FIRSTHDR(mhdr)	((struct cmsghdr *)(mhdr)->msg_control)

instead of this way:

#define CMSG_FIRSTHDR(mhdr) \
          ( (mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
           (struct cmsghdr *)(mhdr)->msg_control : \
           (struct cmsghdr *)NULL )

as suggested in RFC 2292?

A coworker of mine asked about this and then I got to wondering
myself.

The RFC says:

   (Note: Most existing implementations do not test the value of
   msg_controllen, and just return the value of msg_control.  The value
   of msg_controllen must be tested, because if the application asks
   recvmsg() to return ancillary data, by setting msg_control to point
   to the application's buffer and setting msg_controllen to the length
   of this buffer, the kernel indicates that no ancillary data is
   available by setting msg_controllen to 0 on return.  It is also
   easier to put this test into this macro, than making the application
   perform the test.)


Later,
George


More information about the freebsd-net mailing list