diff options
Diffstat (limited to 'libc/sysdeps/linux/common')
-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; +} |