/* $USAGI: socket_cmsg.h,v 1.5 2000/11/02 11:59:25 yoshfuji Exp $ */

#ifndef __SYS_SOCKET_CMSG_H
#define __SYS_SOCKET_CMSG_H

#undef	CMSG_FIRSTHDR
#undef	CMSG_NXTHDR
#undef	CMSG_DATA
#undef	CMSG_SPACE
#undef	CMSG_LEN

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

#define CMSG_NXTHDR(mhdr, cmsg) \
  (((cmsg) == NULL) ? CMSG_FIRSTHDR(mhdr) : ((cmsg)->cmsg_len == 0 ? NULL : (\
   (((u_char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len) \
                      + CMSG_ALIGN(sizeof(struct cmsghdr)) > \
     (u_char *)((mhdr)->msg_control) + (mhdr)->msg_controllen) ? \
    (struct cmsghdr *)NULL : \
    (struct cmsghdr *)((u_char *)(cmsg) + CMSG_ALIGN((cmsg)->cmsg_len))))))

#define CMSG_DATA(cmsg) ( (u_char *)(cmsg) + \
                          CMSG_ALIGN(sizeof(struct cmsghdr)) )
#define CMSG_SPACE(length) ( CMSG_ALIGN(sizeof(struct cmsghdr)) + \
                             CMSG_ALIGN(length) )
#define CMSG_LEN(length) ( CMSG_ALIGN(sizeof(struct cmsghdr)) + length )

#endif
