diff options
| -rw-r--r-- | libc/sysdeps/linux/common/Makefile | 3 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/cmsg_nxthdr.c | 39 | 
2 files changed, 41 insertions, 1 deletions
| diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile index 0b387587d..34e4de015 100644 --- a/libc/sysdeps/linux/common/Makefile +++ b/libc/sysdeps/linux/common/Makefile @@ -26,7 +26,8 @@ include $(TOPDIR)Rules.mak  CSRC=	waitpid.c kernel_version.c statfix.c getdnnm.c gethstnm.c \  	mkfifo.c setegid.c wait.c errno.c getpagesize.c seteuid.c \ -	wait3.c setpgrp.c getdtablesize.c create_module.c ptrace.c +	wait3.c setpgrp.c getdtablesize.c create_module.c ptrace.c \ +	cmsg_nxthdr.c  COBJS=$(patsubst %.c,%.o, $(CSRC))  MSRC=syscalls.c diff --git a/libc/sysdeps/linux/common/cmsg_nxthdr.c b/libc/sysdeps/linux/common/cmsg_nxthdr.c new file mode 100644 index 000000000..fda37f37a --- /dev/null +++ b/libc/sysdeps/linux/common/cmsg_nxthdr.c @@ -0,0 +1,39 @@ +/* Return point to next ancillary data entry in message header. +   Copyright (C) 1997, 1998 Free Software Foundation, Inc. +   This file is part of the GNU C Library. + +   The GNU C Library is free software; you can redistribute it and/or +   modify it under the terms of the GNU Library General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   The GNU C Library is distributed in the hope that it will be useful, +   but WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   Library General Public License for more details. + +   You should have received a copy of the GNU Library General Public +   License along with the GNU C Library; see the file COPYING.LIB.  If not, +   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +   Boston, MA 02111-1307, USA.  */ + +#include <sys/socket.h> + + +struct cmsghdr * +__cmsg_nxthdr (struct msghdr *mhdr, struct cmsghdr *cmsg) +{ +  if ((size_t) cmsg->cmsg_len < sizeof (struct cmsghdr)) +    /* The kernel header does this so there may be a reason.  */ +    return NULL; + +  cmsg = (struct cmsghdr *) ((unsigned char *) cmsg +			     + CMSG_ALIGN (cmsg->cmsg_len)); +  if ((unsigned char *) (cmsg + 1) >= ((unsigned char *) mhdr->msg_control +				       + mhdr->msg_controllen) +      || ((unsigned char *) cmsg + CMSG_ALIGN (cmsg->cmsg_len) +	  >= ((unsigned char *) mhdr->msg_control + mhdr->msg_controllen))) +    /* No more entries.  */ +    return NULL; +  return cmsg; +} | 
