summaryrefslogtreecommitdiff
path: root/sysdeps/unix
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix')
-rw-r--r--sysdeps/unix/sysv/linux/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/Makefile1
-rw-r--r--sysdeps/unix/sysv/linux/cmsg_nxthdr.c38
-rw-r--r--sysdeps/unix/sysv/linux/netinet/in.h24
-rw-r--r--sysdeps/unix/sysv/linux/socketbits.h41
5 files changed, 94 insertions, 11 deletions
diff --git a/sysdeps/unix/sysv/linux/Dist b/sysdeps/unix/sysv/linux/Dist
index c5a2f179ee..b757562124 100644
--- a/sysdeps/unix/sysv/linux/Dist
+++ b/sysdeps/unix/sysv/linux/Dist
@@ -1,3 +1,4 @@
+cmsg_nxthdr.c
init-first.h
kernel_sigaction.h
llseek.c
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index ae2e294785..e02ee8cfe4 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -35,6 +35,7 @@ endif
ifeq ($(subdir),socket)
sysdep_headers += sys/socketcall.h net/if.h net/if_ppp.h net/ppp-comp.h \
net/ppp_defs.h net/if_arp.h net/route.h
+sysdep_routines += cmsg_nxthdr
endif
ifeq ($(subdir),sunrpc)
diff --git a/sysdeps/unix/sysv/linux/cmsg_nxthdr.c b/sysdeps/unix/sysv/linux/cmsg_nxthdr.c
new file mode 100644
index 0000000000..2245db7f25
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/cmsg_nxthdr.c
@@ -0,0 +1,38 @@
+/* Return point to next ancillary data entry in message header.
+ Copyright (C) 1997 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)
+{
+ unsigned char *p;
+
+ if ((size_t) cmsg->cmsg_len < sizeof (struct cmsghdr))
+ /* The kernel header does this so there may be a reason. */
+ return NULL;
+
+ p = (((unsigned char *) cmsg)
+ + ((cmsg->cmsg_len + sizeof (long int) - 1) & ~sizeof (long int)));
+ if (p >= (unsigned char *) mhdr->msg_control + mhdr->msg_controllen)
+ /* No more entries. */
+ return NULL;
+ return (struct cmsghdr *) p;
+}
diff --git a/sysdeps/unix/sysv/linux/netinet/in.h b/sysdeps/unix/sysv/linux/netinet/in.h
index c1df8250c0..0fec8ce3dd 100644
--- a/sysdeps/unix/sysv/linux/netinet/in.h
+++ b/sysdeps/unix/sysv/linux/netinet/in.h
@@ -27,17 +27,19 @@
/* Standard well-defined IP protocols. */
enum
{
- IPPROTO_IP = 0, /* Dummy protocol for TCP. */
- IPPROTO_ICMP = 1, /* Internet Control Message Protocol. */
- IPPROTO_IGMP = 2, /* Internet Group Management Protocol. */
- IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94). */
- IPPROTO_TCP = 6, /* Transmission Control Protocol. */
- IPPROTO_EGP = 8, /* Exterior Gateway Protocol. */
- IPPROTO_PUP = 12, /* PUP protocol. */
- IPPROTO_UDP = 17, /* User Datagram Protocol. */
- IPPROTO_IDP = 22, /* XNS IDP protocol. */
-
- IPPROTO_RAW = 255, /* Raw IP packets. */
+ IPPROTO_IP = 0, /* Dummy protocol for TCP. */
+ IPPROTO_ICMP = 1, /* Internet Control Message Protocol. */
+ IPPROTO_IGMP = 2, /* Internet Group Management Protocol. */
+ IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94). */
+ IPPROTO_TCP = 6, /* Transmission Control Protocol. */
+ IPPROTO_EGP = 8, /* Exterior Gateway Protocol. */
+ IPPROTO_PUP = 12, /* PUP protocol. */
+ IPPROTO_UDP = 17, /* User Datagram Protocol. */
+ IPPROTO_IDP = 22, /* XNS IDP protocol. */
+ IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling. */
+ IPPROTO_ICMPV6 = 58, /* ICMPv6. */
+
+ IPPROTO_RAW = 255, /* Raw IP packets. */
IPPROTO_MAX
};
diff --git a/sysdeps/unix/sysv/linux/socketbits.h b/sysdeps/unix/sysv/linux/socketbits.h
index 1cf44b4347..91deb6c815 100644
--- a/sysdeps/unix/sysv/linux/socketbits.h
+++ b/sysdeps/unix/sysv/linux/socketbits.h
@@ -126,6 +126,47 @@ struct msghdr
int msg_flags; /* Flags on received message. */
};
+/* Structure used for storage of ancillary data object information. */
+struct cmsghdr
+ {
+ int cmsg_len; /* Length of data in cmsg_data plus length
+ of cmsghdr structure. */
+ /* XXX Should be type `size_t' according to POSIX.1g. */
+ int cmsg_level; /* Originating protocol. */
+ int cmsg_type; /* Protocol specific type. */
+ unsigned char __cmsg_data[0]; /* Ancillary data. */
+ };
+
+/* Ancillary data object manipulation macros. */
+#define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
+#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
+#define CMSG_FIRSTHDR(mhdr) (mhdr) \
+ ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) \
+ ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
+
+
+#ifndef _EXTERN_INLINE
+# define _EXTERN_INLINE extern __inline
+#endif
+extern struct cmsghdr *__cmsg_nxthdr __P ((struct msghdr *__mhdr,
+ struct cmsghdr *__cmsg));
+_EXTERN_INLINE struct cmsghdr *
+__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg)
+{
+ unsigned char *__p;
+
+ if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
+ /* The kernel header does this so there may be a reason. */
+ return NULL;
+
+ __p = (((unsigned char *) __cmsg)
+ + ((__cmsg->cmsg_len + sizeof (long int) - 1) & ~sizeof (long int)));
+ if (__p >= (unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)
+ /* No more entries. */
+ return NULL;
+ return (struct cmsghdr *) __p;
+}
+
/* Get socket manipulation related informations from kernel headers. */
#include <asm/socket.h>