Sun Jan 29 18:33:07 2012 UTC ()
Allow using CMSG_NXTHDR with -Wcast-align.

If various checks are omitted, the CMSG_NXTHDR macro expands to
(struct cmsghdr *)((char *)(cmsg) + \
_ALIGN(((struct cmsghdr *)(cmsg))->cmsg_len))

Although there is no alignment problem (assuming cmsg is properly aligned
and _ALIGN is correct), this violates -Wcast-align on strict-alignment
architectures. Therefore an intermediate cast to void * is appropriate here.

There is no workaround other than not using -Wcast-align.

Taken from FreeBSD commit r220742 by jilles


(roy)
diff -r1.105 -r1.106 src/sys/sys/socket.h

cvs diff -r1.105 -r1.106 src/sys/sys/socket.h (switch to unified diff)

--- src/sys/sys/socket.h 2012/01/25 00:28:35 1.105
+++ src/sys/sys/socket.h 2012/01/29 18:33:07 1.106
@@ -1,635 +1,635 @@ @@ -1,635 +1,635 @@
1/* $NetBSD: socket.h,v 1.105 2012/01/25 00:28:35 christos Exp $ */ 1/* $NetBSD: socket.h,v 1.106 2012/01/29 18:33:07 roy Exp $ */
2 2
3/* 3/*
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * Redistribution and use in source and binary forms, with or without 7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions 8 * modification, are permitted provided that the following conditions
9 * are met: 9 * are met:
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors 15 * 3. Neither the name of the project nor the names of its contributors
16 * may be used to endorse or promote products derived from this software 16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission. 17 * without specific prior written permission.
18 * 18 *
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE. 29 * SUCH DAMAGE.
30 */ 30 */
31 31
32/* 32/*
33 * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994 33 * Copyright (c) 1982, 1985, 1986, 1988, 1993, 1994
34 * The Regents of the University of California. All rights reserved. 34 * The Regents of the University of California. All rights reserved.
35 * 35 *
36 * Redistribution and use in source and binary forms, with or without 36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions 37 * modification, are permitted provided that the following conditions
38 * are met: 38 * are met:
39 * 1. Redistributions of source code must retain the above copyright 39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer. 40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright 41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the 42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution. 43 * documentation and/or other materials provided with the distribution.
44 * 3. Neither the name of the University nor the names of its contributors 44 * 3. Neither the name of the University nor the names of its contributors
45 * may be used to endorse or promote products derived from this software 45 * may be used to endorse or promote products derived from this software
46 * without specific prior written permission. 46 * without specific prior written permission.
47 * 47 *
48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 48 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 51 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58 * SUCH DAMAGE. 58 * SUCH DAMAGE.
59 * 59 *
60 * @(#)socket.h 8.6 (Berkeley) 5/3/95 60 * @(#)socket.h 8.6 (Berkeley) 5/3/95
61 */ 61 */
62 62
63#ifndef _SYS_SOCKET_H_ 63#ifndef _SYS_SOCKET_H_
64#define _SYS_SOCKET_H_ 64#define _SYS_SOCKET_H_
65 65
66#include <sys/featuretest.h> 66#include <sys/featuretest.h>
67 67
68/* 68/*
69 * Definitions related to sockets: types, address families, options. 69 * Definitions related to sockets: types, address families, options.
70 */ 70 */
71 71
72/* 72/*
73 * Data types. 73 * Data types.
74 */ 74 */
75#include <sys/ansi.h> 75#include <sys/ansi.h>
76 76
77#ifndef sa_family_t 77#ifndef sa_family_t
78typedef __sa_family_t sa_family_t; 78typedef __sa_family_t sa_family_t;
79#define sa_family_t __sa_family_t 79#define sa_family_t __sa_family_t
80#endif 80#endif
81 81
82#ifndef socklen_t 82#ifndef socklen_t
83typedef __socklen_t socklen_t; 83typedef __socklen_t socklen_t;
84#define socklen_t __socklen_t 84#define socklen_t __socklen_t
85#endif 85#endif
86 86
87#include <machine/ansi.h> 87#include <machine/ansi.h>
88 88
89#ifdef _BSD_SIZE_T_ 89#ifdef _BSD_SIZE_T_
90typedef _BSD_SIZE_T_ size_t; 90typedef _BSD_SIZE_T_ size_t;
91#undef _BSD_SIZE_T_ 91#undef _BSD_SIZE_T_
92#endif 92#endif
93 93
94#ifdef _BSD_SSIZE_T_ 94#ifdef _BSD_SSIZE_T_
95typedef _BSD_SSIZE_T_ ssize_t; 95typedef _BSD_SSIZE_T_ ssize_t;
96#undef _BSD_SSIZE_T_ 96#undef _BSD_SSIZE_T_
97#endif 97#endif
98 98
99#include <sys/uio.h> 99#include <sys/uio.h>
100#include <sys/sigtypes.h> 100#include <sys/sigtypes.h>
101 101
102/* 102/*
103 * Socket types. 103 * Socket types.
104 */ 104 */
105#define SOCK_STREAM 1 /* stream socket */ 105#define SOCK_STREAM 1 /* stream socket */
106#define SOCK_DGRAM 2 /* datagram socket */ 106#define SOCK_DGRAM 2 /* datagram socket */
107#define SOCK_RAW 3 /* raw-protocol interface */ 107#define SOCK_RAW 3 /* raw-protocol interface */
108#define SOCK_RDM 4 /* reliably-delivered message */ 108#define SOCK_RDM 4 /* reliably-delivered message */
109#define SOCK_SEQPACKET 5 /* sequenced packet stream */ 109#define SOCK_SEQPACKET 5 /* sequenced packet stream */
110 110
111#define SOCK_CLOEXEC 0x10000000 /* set close on exec on socket */ 111#define SOCK_CLOEXEC 0x10000000 /* set close on exec on socket */
112#define SOCK_NONBLOCK 0x20000000 /* set non blocking i/o socket */ 112#define SOCK_NONBLOCK 0x20000000 /* set non blocking i/o socket */
113#define SOCK_NOSIGPIPE 0x40000000 /* don't send sigpipe */ 113#define SOCK_NOSIGPIPE 0x40000000 /* don't send sigpipe */
114#define SOCK_FLAGS_MASK 0xf0000000 /* flags mask */ 114#define SOCK_FLAGS_MASK 0xf0000000 /* flags mask */
115 115
116/* 116/*
117 * Option flags per-socket. 117 * Option flags per-socket.
118 */ 118 */
119#define SO_DEBUG 0x0001 /* turn on debugging info recording */ 119#define SO_DEBUG 0x0001 /* turn on debugging info recording */
120#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ 120#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
121#define SO_REUSEADDR 0x0004 /* allow local address reuse */ 121#define SO_REUSEADDR 0x0004 /* allow local address reuse */
122#define SO_KEEPALIVE 0x0008 /* keep connections alive */ 122#define SO_KEEPALIVE 0x0008 /* keep connections alive */
123#define SO_DONTROUTE 0x0010 /* just use interface addresses */ 123#define SO_DONTROUTE 0x0010 /* just use interface addresses */
124#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */ 124#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
125#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */ 125#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
126#define SO_LINGER 0x0080 /* linger on close if data present */ 126#define SO_LINGER 0x0080 /* linger on close if data present */
127#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */ 127#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
128#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */ 128#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
129/* SO_OTIMESTAMP 0x0400 */ 129/* SO_OTIMESTAMP 0x0400 */
130#define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */ 130#define SO_NOSIGPIPE 0x0800 /* no SIGPIPE from EPIPE */
131#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */ 131#define SO_ACCEPTFILTER 0x1000 /* there is an accept filter */
132#define SO_TIMESTAMP 0x2000 /* timestamp received dgram traffic */ 132#define SO_TIMESTAMP 0x2000 /* timestamp received dgram traffic */
133 133
134 134
135/* 135/*
136 * Additional options, not kept in so_options. 136 * Additional options, not kept in so_options.
137 */ 137 */
138#define SO_SNDBUF 0x1001 /* send buffer size */ 138#define SO_SNDBUF 0x1001 /* send buffer size */
139#define SO_RCVBUF 0x1002 /* receive buffer size */ 139#define SO_RCVBUF 0x1002 /* receive buffer size */
140#define SO_SNDLOWAT 0x1003 /* send low-water mark */ 140#define SO_SNDLOWAT 0x1003 /* send low-water mark */
141#define SO_RCVLOWAT 0x1004 /* receive low-water mark */ 141#define SO_RCVLOWAT 0x1004 /* receive low-water mark */
142/* SO_OSNDTIMEO 0x1005 */ 142/* SO_OSNDTIMEO 0x1005 */
143/* SO_ORCVTIMEO 0x1006 */ 143/* SO_ORCVTIMEO 0x1006 */
144#define SO_ERROR 0x1007 /* get error status and clear */ 144#define SO_ERROR 0x1007 /* get error status and clear */
145#define SO_TYPE 0x1008 /* get socket type */ 145#define SO_TYPE 0x1008 /* get socket type */
146#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */ 146#define SO_OVERFLOWED 0x1009 /* datagrams: return packets dropped */
147 147
148#define SO_NOHEADER 0x100a /* user supplies no header to kernel; 148#define SO_NOHEADER 0x100a /* user supplies no header to kernel;
149 * kernel removes header and supplies 149 * kernel removes header and supplies
150 * payload 150 * payload
151 */ 151 */
152#define SO_SNDTIMEO 0x100b /* send timeout */ 152#define SO_SNDTIMEO 0x100b /* send timeout */
153#define SO_RCVTIMEO 0x100c /* receive timeout */ 153#define SO_RCVTIMEO 0x100c /* receive timeout */
154/* 154/*
155 * Structure used for manipulating linger option. 155 * Structure used for manipulating linger option.
156 */ 156 */
157struct linger { 157struct linger {
158 int l_onoff; /* option on/off */ 158 int l_onoff; /* option on/off */
159 int l_linger; /* linger time in seconds */ 159 int l_linger; /* linger time in seconds */
160}; 160};
161 161
162struct accept_filter_arg { 162struct accept_filter_arg {
163 char af_name[16]; 163 char af_name[16];
164 char af_arg[256-16]; 164 char af_arg[256-16];
165}; 165};
166 166
167/* 167/*
168 * Level number for (get/set)sockopt() to apply to socket itself. 168 * Level number for (get/set)sockopt() to apply to socket itself.
169 */ 169 */
170#define SOL_SOCKET 0xffff /* options for socket level */ 170#define SOL_SOCKET 0xffff /* options for socket level */
171 171
172/* 172/*
173 * Address families. 173 * Address families.
174 */ 174 */
175#define AF_UNSPEC 0 /* unspecified */ 175#define AF_UNSPEC 0 /* unspecified */
176#define AF_LOCAL 1 /* local to host */ 176#define AF_LOCAL 1 /* local to host */
177#define AF_UNIX AF_LOCAL /* backward compatibility */ 177#define AF_UNIX AF_LOCAL /* backward compatibility */
178#define AF_INET 2 /* internetwork: UDP, TCP, etc. */ 178#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
179#define AF_IMPLINK 3 /* arpanet imp addresses */ 179#define AF_IMPLINK 3 /* arpanet imp addresses */
180#define AF_PUP 4 /* pup protocols: e.g. BSP */ 180#define AF_PUP 4 /* pup protocols: e.g. BSP */
181#define AF_CHAOS 5 /* mit CHAOS protocols */ 181#define AF_CHAOS 5 /* mit CHAOS protocols */
182#define AF_NS 6 /* XEROX NS protocols */ 182#define AF_NS 6 /* XEROX NS protocols */
183#define AF_ISO 7 /* ISO protocols */ 183#define AF_ISO 7 /* ISO protocols */
184#define AF_OSI AF_ISO 184#define AF_OSI AF_ISO
185#define AF_ECMA 8 /* european computer manufacturers */ 185#define AF_ECMA 8 /* european computer manufacturers */
186#define AF_DATAKIT 9 /* datakit protocols */ 186#define AF_DATAKIT 9 /* datakit protocols */
187#define AF_CCITT 10 /* CCITT protocols, X.25 etc */ 187#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
188#define AF_SNA 11 /* IBM SNA */ 188#define AF_SNA 11 /* IBM SNA */
189#define AF_DECnet 12 /* DECnet */ 189#define AF_DECnet 12 /* DECnet */
190#define AF_DLI 13 /* DEC Direct data link interface */ 190#define AF_DLI 13 /* DEC Direct data link interface */
191#define AF_LAT 14 /* LAT */ 191#define AF_LAT 14 /* LAT */
192#define AF_HYLINK 15 /* NSC Hyperchannel */ 192#define AF_HYLINK 15 /* NSC Hyperchannel */
193#define AF_APPLETALK 16 /* Apple Talk */ 193#define AF_APPLETALK 16 /* Apple Talk */
194#define AF_OROUTE 17 /* Internal Routing Protocol */ 194#define AF_OROUTE 17 /* Internal Routing Protocol */
195#define AF_LINK 18 /* Link layer interface */ 195#define AF_LINK 18 /* Link layer interface */
196#if defined(_NETBSD_SOURCE) 196#if defined(_NETBSD_SOURCE)
197#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */ 197#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
198#endif 198#endif
199#define AF_COIP 20 /* connection-oriented IP, aka ST II */ 199#define AF_COIP 20 /* connection-oriented IP, aka ST II */
200#define AF_CNT 21 /* Computer Network Technology */ 200#define AF_CNT 21 /* Computer Network Technology */
201#if defined(_NETBSD_SOURCE) 201#if defined(_NETBSD_SOURCE)
202#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */ 202#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */
203#endif 203#endif
204#define AF_IPX 23 /* Novell Internet Protocol */ 204#define AF_IPX 23 /* Novell Internet Protocol */
205#define AF_INET6 24 /* IP version 6 */ 205#define AF_INET6 24 /* IP version 6 */
206#if defined(_NETBSD_SOURCE) 206#if defined(_NETBSD_SOURCE)
207#define pseudo_AF_PIP 25 /* Help Identify PIP packets */ 207#define pseudo_AF_PIP 25 /* Help Identify PIP packets */
208#endif 208#endif
209#define AF_ISDN 26 /* Integrated Services Digital Network*/ 209#define AF_ISDN 26 /* Integrated Services Digital Network*/
210#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */ 210#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
211#define AF_NATM 27 /* native ATM access */ 211#define AF_NATM 27 /* native ATM access */
212#define AF_ARP 28 /* (rev.) addr. res. prot. (RFC 826) */ 212#define AF_ARP 28 /* (rev.) addr. res. prot. (RFC 826) */
213#if defined(_NETBSD_SOURCE) 213#if defined(_NETBSD_SOURCE)
214#define pseudo_AF_KEY 29 /* Internal key management protocol */ 214#define pseudo_AF_KEY 29 /* Internal key management protocol */
215#define pseudo_AF_HDRCMPLT 30 /* Used by BPF to not rewrite hdrs 215#define pseudo_AF_HDRCMPLT 30 /* Used by BPF to not rewrite hdrs
216 in interface output routine */ 216 in interface output routine */
217#endif 217#endif
218#define AF_BLUETOOTH 31 /* Bluetooth: HCI, SCO, L2CAP, RFCOMM */ 218#define AF_BLUETOOTH 31 /* Bluetooth: HCI, SCO, L2CAP, RFCOMM */
219#define AF_IEEE80211 32 /* IEEE80211 */ 219#define AF_IEEE80211 32 /* IEEE80211 */
220#define AF_MPLS 33 /* MultiProtocol Label Switching */ 220#define AF_MPLS 33 /* MultiProtocol Label Switching */
221#define AF_ROUTE 34 /* Internal Routing Protocol */ 221#define AF_ROUTE 34 /* Internal Routing Protocol */
222#define AF_MAX 35 222#define AF_MAX 35
223 223
224/* 224/*
225 * Structure used by kernel to store most 225 * Structure used by kernel to store most
226 * addresses. 226 * addresses.
227 */ 227 */
228struct sockaddr { 228struct sockaddr {
229 __uint8_t sa_len; /* total length */ 229 __uint8_t sa_len; /* total length */
230 sa_family_t sa_family; /* address family */ 230 sa_family_t sa_family; /* address family */
231 char sa_data[14]; /* actually longer; address value */ 231 char sa_data[14]; /* actually longer; address value */
232}; 232};
233 233
234#if defined(_KERNEL) 234#if defined(_KERNEL)
235/* 235/*
236 * Structure used by kernel to pass protocol 236 * Structure used by kernel to pass protocol
237 * information in raw sockets. 237 * information in raw sockets.
238 */ 238 */
239struct sockproto { 239struct sockproto {
240 u_short sp_family; /* address family */ 240 u_short sp_family; /* address family */
241 u_short sp_protocol; /* protocol */ 241 u_short sp_protocol; /* protocol */
242}; 242};
243#endif /* _KERNEL */ 243#endif /* _KERNEL */
244 244
245#if 1 245#if 1
246/* 246/*
247 * RFC 2553: protocol-independent placeholder for socket addresses 247 * RFC 2553: protocol-independent placeholder for socket addresses
248 */ 248 */
249#define _SS_MAXSIZE 128 249#define _SS_MAXSIZE 128
250#define _SS_ALIGNSIZE (sizeof(__int64_t)) 250#define _SS_ALIGNSIZE (sizeof(__int64_t))
251#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 2) 251#define _SS_PAD1SIZE (_SS_ALIGNSIZE - 2)
252#define _SS_PAD2SIZE (_SS_MAXSIZE - 2 - \ 252#define _SS_PAD2SIZE (_SS_MAXSIZE - 2 - \
253 _SS_PAD1SIZE - _SS_ALIGNSIZE) 253 _SS_PAD1SIZE - _SS_ALIGNSIZE)
254 254
255#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE) 255#if (_XOPEN_SOURCE - 0) >= 500 || defined(_NETBSD_SOURCE)
256struct sockaddr_storage { 256struct sockaddr_storage {
257 __uint8_t ss_len; /* address length */ 257 __uint8_t ss_len; /* address length */
258 sa_family_t ss_family; /* address family */ 258 sa_family_t ss_family; /* address family */
259 char __ss_pad1[_SS_PAD1SIZE]; 259 char __ss_pad1[_SS_PAD1SIZE];
260 __int64_t __ss_align;/* force desired structure storage alignment */ 260 __int64_t __ss_align;/* force desired structure storage alignment */
261 char __ss_pad2[_SS_PAD2SIZE]; 261 char __ss_pad2[_SS_PAD2SIZE];
262}; 262};
263#define sstosa(__ss) ((struct sockaddr *)(__ss)) 263#define sstosa(__ss) ((struct sockaddr *)(__ss))
264#define sstocsa(__ss) ((const struct sockaddr *)(__ss)) 264#define sstocsa(__ss) ((const struct sockaddr *)(__ss))
265#endif /* _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */ 265#endif /* _XOPEN_SOURCE >= 500 || _NETBSD_SOURCE */
266#endif /* 1 */ 266#endif /* 1 */
267 267
268/* 268/*
269 * Protocol families, same as address families for now. 269 * Protocol families, same as address families for now.
270 */ 270 */
271#define PF_UNSPEC AF_UNSPEC 271#define PF_UNSPEC AF_UNSPEC
272#define PF_LOCAL AF_LOCAL 272#define PF_LOCAL AF_LOCAL
273#define PF_UNIX PF_LOCAL /* backward compatibility */ 273#define PF_UNIX PF_LOCAL /* backward compatibility */
274#define PF_INET AF_INET 274#define PF_INET AF_INET
275#define PF_IMPLINK AF_IMPLINK 275#define PF_IMPLINK AF_IMPLINK
276#define PF_PUP AF_PUP 276#define PF_PUP AF_PUP
277#define PF_CHAOS AF_CHAOS 277#define PF_CHAOS AF_CHAOS
278#define PF_NS AF_NS 278#define PF_NS AF_NS
279#define PF_ISO AF_ISO 279#define PF_ISO AF_ISO
280#define PF_OSI AF_ISO 280#define PF_OSI AF_ISO
281#define PF_ECMA AF_ECMA 281#define PF_ECMA AF_ECMA
282#define PF_DATAKIT AF_DATAKIT 282#define PF_DATAKIT AF_DATAKIT
283#define PF_CCITT AF_CCITT 283#define PF_CCITT AF_CCITT
284#define PF_SNA AF_SNA 284#define PF_SNA AF_SNA
285#define PF_DECnet AF_DECnet 285#define PF_DECnet AF_DECnet
286#define PF_DLI AF_DLI 286#define PF_DLI AF_DLI
287#define PF_LAT AF_LAT 287#define PF_LAT AF_LAT
288#define PF_HYLINK AF_HYLINK 288#define PF_HYLINK AF_HYLINK
289#define PF_APPLETALK AF_APPLETALK 289#define PF_APPLETALK AF_APPLETALK
290#define PF_OROUTE AF_OROUTE 290#define PF_OROUTE AF_OROUTE
291#define PF_LINK AF_LINK 291#define PF_LINK AF_LINK
292#if defined(_NETBSD_SOURCE) 292#if defined(_NETBSD_SOURCE)
293#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */ 293#define PF_XTP pseudo_AF_XTP /* really just proto family, no AF */
294#endif 294#endif
295#define PF_COIP AF_COIP 295#define PF_COIP AF_COIP
296#define PF_CNT AF_CNT 296#define PF_CNT AF_CNT
297#define PF_INET6 AF_INET6 297#define PF_INET6 AF_INET6
298#define PF_IPX AF_IPX /* same format as AF_NS */ 298#define PF_IPX AF_IPX /* same format as AF_NS */
299#if defined(_NETBSD_SOURCE) 299#if defined(_NETBSD_SOURCE)
300#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */ 300#define PF_RTIP pseudo_AF_RTIP /* same format as AF_INET */
301#define PF_PIP pseudo_AF_PIP 301#define PF_PIP pseudo_AF_PIP
302#endif 302#endif
303#define PF_ISDN AF_ISDN /* same as E164 */ 303#define PF_ISDN AF_ISDN /* same as E164 */
304#define PF_E164 AF_E164 304#define PF_E164 AF_E164
305#define PF_NATM AF_NATM 305#define PF_NATM AF_NATM
306#define PF_ARP AF_ARP 306#define PF_ARP AF_ARP
307#if defined(_NETBSD_SOURCE) 307#if defined(_NETBSD_SOURCE)
308#define PF_KEY pseudo_AF_KEY /* like PF_ROUTE, only for key mgmt */ 308#define PF_KEY pseudo_AF_KEY /* like PF_ROUTE, only for key mgmt */
309#endif 309#endif
310#define PF_BLUETOOTH AF_BLUETOOTH 310#define PF_BLUETOOTH AF_BLUETOOTH
311#define PF_MPLS AF_MPLS 311#define PF_MPLS AF_MPLS
312#define PF_ROUTE AF_ROUTE 312#define PF_ROUTE AF_ROUTE
313 313
314#define PF_MAX AF_MAX 314#define PF_MAX AF_MAX
315 315
316#if defined(_NETBSD_SOURCE) 316#if defined(_NETBSD_SOURCE)
317 317
318#ifndef gid_t 318#ifndef gid_t
319typedef __gid_t gid_t; /* group id */ 319typedef __gid_t gid_t; /* group id */
320#define gid_t __gid_t 320#define gid_t __gid_t
321#endif 321#endif
322 322
323#ifndef uid_t 323#ifndef uid_t
324typedef __uid_t uid_t; /* user id */ 324typedef __uid_t uid_t; /* user id */
325#define uid_t __uid_t 325#define uid_t __uid_t
326#endif 326#endif
327 327
328/* 328/*
329 * Socket credentials. 329 * Socket credentials.
330 */ 330 */
331struct sockcred { 331struct sockcred {
332 uid_t sc_uid; /* real user id */ 332 uid_t sc_uid; /* real user id */
333 uid_t sc_euid; /* effective user id */ 333 uid_t sc_euid; /* effective user id */
334 gid_t sc_gid; /* real group id */ 334 gid_t sc_gid; /* real group id */
335 gid_t sc_egid; /* effective group id */ 335 gid_t sc_egid; /* effective group id */
336 int sc_ngroups; /* number of supplemental groups */ 336 int sc_ngroups; /* number of supplemental groups */
337 gid_t sc_groups[1]; /* variable length */ 337 gid_t sc_groups[1]; /* variable length */
338}; 338};
339 339
340/* 340/*
341 * Compute size of a sockcred structure with groups. 341 * Compute size of a sockcred structure with groups.
342 */ 342 */
343#define SOCKCREDSIZE(ngrps) \ 343#define SOCKCREDSIZE(ngrps) \
344 (sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1))) 344 (sizeof(struct sockcred) + (sizeof(gid_t) * ((ngrps) - 1)))
345#endif /* _NETBSD_SOURCE */ 345#endif /* _NETBSD_SOURCE */
346 346
347 347
348#if defined(_NETBSD_SOURCE) 348#if defined(_NETBSD_SOURCE)
349/* 349/*
350 * Definitions for network related sysctl, CTL_NET. 350 * Definitions for network related sysctl, CTL_NET.
351 * 351 *
352 * Second level is protocol family. 352 * Second level is protocol family.
353 * Third level is protocol number. 353 * Third level is protocol number.
354 * 354 *
355 * Further levels are defined by the individual families below. 355 * Further levels are defined by the individual families below.
356 */ 356 */
357#define NET_MAXID AF_MAX 357#define NET_MAXID AF_MAX
358 358
359#define CTL_NET_NAMES { \ 359#define CTL_NET_NAMES { \
360 { 0, 0 }, \ 360 { 0, 0 }, \
361 { "local", CTLTYPE_NODE }, \ 361 { "local", CTLTYPE_NODE }, \
362 { "inet", CTLTYPE_NODE }, \ 362 { "inet", CTLTYPE_NODE }, \
363 { "implink", CTLTYPE_NODE }, \ 363 { "implink", CTLTYPE_NODE }, \
364 { "pup", CTLTYPE_NODE }, \ 364 { "pup", CTLTYPE_NODE }, \
365 { "chaos", CTLTYPE_NODE }, \ 365 { "chaos", CTLTYPE_NODE }, \
366 { "xerox_ns", CTLTYPE_NODE }, \ 366 { "xerox_ns", CTLTYPE_NODE }, \
367 { "iso", CTLTYPE_NODE }, \ 367 { "iso", CTLTYPE_NODE }, \
368 { "emca", CTLTYPE_NODE }, \ 368 { "emca", CTLTYPE_NODE }, \
369 { "datakit", CTLTYPE_NODE }, \ 369 { "datakit", CTLTYPE_NODE }, \
370 { "ccitt", CTLTYPE_NODE }, \ 370 { "ccitt", CTLTYPE_NODE }, \
371 { "ibm_sna", CTLTYPE_NODE }, \ 371 { "ibm_sna", CTLTYPE_NODE }, \
372 { "decnet", CTLTYPE_NODE }, \ 372 { "decnet", CTLTYPE_NODE }, \
373 { "dec_dli", CTLTYPE_NODE }, \ 373 { "dec_dli", CTLTYPE_NODE }, \
374 { "lat", CTLTYPE_NODE }, \ 374 { "lat", CTLTYPE_NODE }, \
375 { "hylink", CTLTYPE_NODE }, \ 375 { "hylink", CTLTYPE_NODE }, \
376 { "appletalk", CTLTYPE_NODE }, \ 376 { "appletalk", CTLTYPE_NODE }, \
377 { "oroute", CTLTYPE_NODE }, \ 377 { "oroute", CTLTYPE_NODE }, \
378 { "link_layer", CTLTYPE_NODE }, \ 378 { "link_layer", CTLTYPE_NODE }, \
379 { "xtp", CTLTYPE_NODE }, \ 379 { "xtp", CTLTYPE_NODE }, \
380 { "coip", CTLTYPE_NODE }, \ 380 { "coip", CTLTYPE_NODE }, \
381 { "cnt", CTLTYPE_NODE }, \ 381 { "cnt", CTLTYPE_NODE }, \
382 { "rtip", CTLTYPE_NODE }, \ 382 { "rtip", CTLTYPE_NODE }, \
383 { "ipx", CTLTYPE_NODE }, \ 383 { "ipx", CTLTYPE_NODE }, \
384 { "inet6", CTLTYPE_NODE }, \ 384 { "inet6", CTLTYPE_NODE }, \
385 { "pip", CTLTYPE_NODE }, \ 385 { "pip", CTLTYPE_NODE }, \
386 { "isdn", CTLTYPE_NODE }, \ 386 { "isdn", CTLTYPE_NODE }, \
387 { "natm", CTLTYPE_NODE }, \ 387 { "natm", CTLTYPE_NODE }, \
388 { "arp", CTLTYPE_NODE }, \ 388 { "arp", CTLTYPE_NODE }, \
389 { "key", CTLTYPE_NODE }, \ 389 { "key", CTLTYPE_NODE }, \
390 { "ieee80211", CTLTYPE_NODE }, \ 390 { "ieee80211", CTLTYPE_NODE }, \
391 { "mlps", CTLTYPE_NODE }, \ 391 { "mlps", CTLTYPE_NODE }, \
392 { "route", CTLTYPE_NODE }, \ 392 { "route", CTLTYPE_NODE }, \
393} 393}
394 394
395struct kinfo_pcb { 395struct kinfo_pcb {
396 __uint64_t ki_pcbaddr; /* PTR: pcb addr */ 396 __uint64_t ki_pcbaddr; /* PTR: pcb addr */
397 __uint64_t ki_ppcbaddr; /* PTR: ppcb addr */ 397 __uint64_t ki_ppcbaddr; /* PTR: ppcb addr */
398 __uint64_t ki_sockaddr; /* PTR: socket addr */ 398 __uint64_t ki_sockaddr; /* PTR: socket addr */
399 399
400 __uint32_t ki_family; /* INT: protocol family */ 400 __uint32_t ki_family; /* INT: protocol family */
401 __uint32_t ki_type; /* INT: socket type */ 401 __uint32_t ki_type; /* INT: socket type */
402 __uint32_t ki_protocol; /* INT: protocol */ 402 __uint32_t ki_protocol; /* INT: protocol */
403 __uint32_t ki_pflags; /* INT: generic protocol flags */ 403 __uint32_t ki_pflags; /* INT: generic protocol flags */
404 404
405 __uint32_t ki_sostate; /* INT: socket state */ 405 __uint32_t ki_sostate; /* INT: socket state */
406 __uint32_t ki_prstate; /* INT: protocol state */ 406 __uint32_t ki_prstate; /* INT: protocol state */
407 __int32_t ki_tstate; /* INT: tcp state */ 407 __int32_t ki_tstate; /* INT: tcp state */
408 __uint32_t ki_tflags; /* INT: tcp flags */ 408 __uint32_t ki_tflags; /* INT: tcp flags */
409 409
410 __uint64_t ki_rcvq; /* U_LONG: receive queue len */ 410 __uint64_t ki_rcvq; /* U_LONG: receive queue len */
411 __uint64_t ki_sndq; /* U_LONG: send queue len */ 411 __uint64_t ki_sndq; /* U_LONG: send queue len */
412 412
413 union { 413 union {
414 struct sockaddr _kis_src; /* STRUCT: local address */ 414 struct sockaddr _kis_src; /* STRUCT: local address */
415 char _kis_pad[256 + 8]; /* pad to max addr length */ 415 char _kis_pad[256 + 8]; /* pad to max addr length */
416 } ki_s; 416 } ki_s;
417 union { 417 union {
418 struct sockaddr _kid_dst; /* STRUCT: remote address */ 418 struct sockaddr _kid_dst; /* STRUCT: remote address */
419 char _kid_pad[256 + 8]; /* pad to max addr length */ 419 char _kid_pad[256 + 8]; /* pad to max addr length */
420 } ki_d; 420 } ki_d;
421 421
422 __uint64_t ki_inode; /* INO_T: fake inode number */ 422 __uint64_t ki_inode; /* INO_T: fake inode number */
423 __uint64_t ki_vnode; /* PTR: if associated with file */ 423 __uint64_t ki_vnode; /* PTR: if associated with file */
424 __uint64_t ki_conn; /* PTR: control block of peer */ 424 __uint64_t ki_conn; /* PTR: control block of peer */
425 __uint64_t ki_refs; /* PTR: referencing socket */ 425 __uint64_t ki_refs; /* PTR: referencing socket */
426 __uint64_t ki_nextref; /* PTR: link in refs list */ 426 __uint64_t ki_nextref; /* PTR: link in refs list */
427}; 427};
428 428
429#define ki_src ki_s._kis_src 429#define ki_src ki_s._kis_src
430#define ki_dst ki_d._kid_dst 430#define ki_dst ki_d._kid_dst
431 431
432#define PCB_SLOP 20 432#define PCB_SLOP 20
433#define PCB_ALL 0 433#define PCB_ALL 0
434 434
435#endif /* _NETBSD_SOURCE */ 435#endif /* _NETBSD_SOURCE */
436 436
437#if defined(_NETBSD_SOURCE) 437#if defined(_NETBSD_SOURCE)
438/* 438/*
439 * PF_ROUTE - Routing table 439 * PF_ROUTE - Routing table
440 * 440 *
441 * Three additional levels are defined: 441 * Three additional levels are defined:
442 * Fourth: address family, 0 is wildcard 442 * Fourth: address family, 0 is wildcard
443 * Fifth: type of info, defined below 443 * Fifth: type of info, defined below
444 * Sixth: flag(s) to mask with for NET_RT_FLAGS 444 * Sixth: flag(s) to mask with for NET_RT_FLAGS
445 */ 445 */
446#define NET_RT_DUMP 1 /* dump; may limit to a.f. */ 446#define NET_RT_DUMP 1 /* dump; may limit to a.f. */
447#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */ 447#define NET_RT_FLAGS 2 /* by flags, e.g. RESOLVING */
448#define NET_RT_OOIFLIST 3 /* old NET_RT_IFLIST (pre 1.5) */ 448#define NET_RT_OOIFLIST 3 /* old NET_RT_IFLIST (pre 1.5) */
449#define NET_RT_OIFLIST 4 /* survey interface list */ 449#define NET_RT_OIFLIST 4 /* survey interface list */
450#define NET_RT_IFLIST 5 450#define NET_RT_IFLIST 5
451#define NET_RT_MAXID 6 451#define NET_RT_MAXID 6
452 452
453#define CTL_NET_RT_NAMES { \ 453#define CTL_NET_RT_NAMES { \
454 { 0, 0 }, \ 454 { 0, 0 }, \
455 { "dump", CTLTYPE_STRUCT }, \ 455 { "dump", CTLTYPE_STRUCT }, \
456 { "flags", CTLTYPE_STRUCT }, \ 456 { "flags", CTLTYPE_STRUCT }, \
457 { 0, 0 }, \ 457 { 0, 0 }, \
458 { 0, 0 }, \ 458 { 0, 0 }, \
459 { "iflist", CTLTYPE_STRUCT }, \ 459 { "iflist", CTLTYPE_STRUCT }, \
460} 460}
461#endif /* _NETBSD_SOURCE */ 461#endif /* _NETBSD_SOURCE */
462 462
463/* 463/*
464 * Maximum queue length specifiable by listen(2). 464 * Maximum queue length specifiable by listen(2).
465 */ 465 */
466#ifndef SOMAXCONN 466#ifndef SOMAXCONN
467#define SOMAXCONN 128 467#define SOMAXCONN 128
468#endif 468#endif
469 469
470/* 470/*
471 * Message header for recvmsg and sendmsg calls. 471 * Message header for recvmsg and sendmsg calls.
472 * Used value-result for recvmsg, value only for sendmsg. 472 * Used value-result for recvmsg, value only for sendmsg.
473 */ 473 */
474struct msghdr { 474struct msghdr {
475 void *msg_name; /* optional address */ 475 void *msg_name; /* optional address */
476 socklen_t msg_namelen; /* size of address */ 476 socklen_t msg_namelen; /* size of address */
477 struct iovec *msg_iov; /* scatter/gather array */ 477 struct iovec *msg_iov; /* scatter/gather array */
478 int msg_iovlen; /* # elements in msg_iov */ 478 int msg_iovlen; /* # elements in msg_iov */
479 void *msg_control; /* ancillary data, see below */ 479 void *msg_control; /* ancillary data, see below */
480 socklen_t msg_controllen; /* ancillary data buffer len */ 480 socklen_t msg_controllen; /* ancillary data buffer len */
481 int msg_flags; /* flags on received message */ 481 int msg_flags; /* flags on received message */
482}; 482};
483 483
484#define MSG_OOB 0x0001 /* process out-of-band data */ 484#define MSG_OOB 0x0001 /* process out-of-band data */
485#define MSG_PEEK 0x0002 /* peek at incoming message */ 485#define MSG_PEEK 0x0002 /* peek at incoming message */
486#define MSG_DONTROUTE 0x0004 /* send without using routing tables */ 486#define MSG_DONTROUTE 0x0004 /* send without using routing tables */
487#define MSG_EOR 0x0008 /* data completes record */ 487#define MSG_EOR 0x0008 /* data completes record */
488#define MSG_TRUNC 0x0010 /* data discarded before delivery */ 488#define MSG_TRUNC 0x0010 /* data discarded before delivery */
489#define MSG_CTRUNC 0x0020 /* control data lost before delivery */ 489#define MSG_CTRUNC 0x0020 /* control data lost before delivery */
490#define MSG_WAITALL 0x0040 /* wait for full request or error */ 490#define MSG_WAITALL 0x0040 /* wait for full request or error */
491#define MSG_DONTWAIT 0x0080 /* this message should be nonblocking */ 491#define MSG_DONTWAIT 0x0080 /* this message should be nonblocking */
492#define MSG_BCAST 0x0100 /* this message was rcvd using link-level brdcst */ 492#define MSG_BCAST 0x0100 /* this message was rcvd using link-level brdcst */
493#define MSG_MCAST 0x0200 /* this message was rcvd using link-level mcast */ 493#define MSG_MCAST 0x0200 /* this message was rcvd using link-level mcast */
494#define MSG_NOSIGNAL 0x0400 /* do not generate SIGPIPE on EOF */ 494#define MSG_NOSIGNAL 0x0400 /* do not generate SIGPIPE on EOF */
495#if defined(_NETBSD_SOURCE) 495#if defined(_NETBSD_SOURCE)
496#define MSG_CMSG_CLOEXEC 0x0800 /* close on exec receiving fd */ 496#define MSG_CMSG_CLOEXEC 0x0800 /* close on exec receiving fd */
497#define MSG_NBIO 0x1000 /* use non-blocking I/O */ 497#define MSG_NBIO 0x1000 /* use non-blocking I/O */
498#endif 498#endif
499 499
500/* Extra flags used internally only */ 500/* Extra flags used internally only */
501#define MSG_USERFLAGS 0x0ffffff 501#define MSG_USERFLAGS 0x0ffffff
502#define MSG_NAMEMBUF 0x1000000 /* msg_name is an mbuf */ 502#define MSG_NAMEMBUF 0x1000000 /* msg_name is an mbuf */
503#define MSG_CONTROLMBUF 0x2000000 /* msg_control is an mbuf */ 503#define MSG_CONTROLMBUF 0x2000000 /* msg_control is an mbuf */
504#define MSG_IOVUSRSPACE 0x4000000 /* msg_iov is in user space */ 504#define MSG_IOVUSRSPACE 0x4000000 /* msg_iov is in user space */
505#define MSG_LENUSRSPACE 0x8000000 /* address length is in user space */ 505#define MSG_LENUSRSPACE 0x8000000 /* address length is in user space */
506 506
507/* 507/*
508 * Header for ancillary data objects in msg_control buffer. 508 * Header for ancillary data objects in msg_control buffer.
509 * Used for additional information with/about a datagram 509 * Used for additional information with/about a datagram
510 * not expressible by flags. The format is a sequence 510 * not expressible by flags. The format is a sequence
511 * of message elements headed by cmsghdr structures. 511 * of message elements headed by cmsghdr structures.
512 */ 512 */
513struct cmsghdr { 513struct cmsghdr {
514 socklen_t cmsg_len; /* data byte count, including hdr */ 514 socklen_t cmsg_len; /* data byte count, including hdr */
515 int cmsg_level; /* originating protocol */ 515 int cmsg_level; /* originating protocol */
516 int cmsg_type; /* protocol-specific type */ 516 int cmsg_type; /* protocol-specific type */
517/* followed by u_char cmsg_data[]; */ 517/* followed by u_char cmsg_data[]; */
518}; 518};
519 519
520/* given pointer to struct cmsghdr, return pointer to data */ 520/* given pointer to struct cmsghdr, return pointer to data */
521#define CMSG_DATA(cmsg) \ 521#define CMSG_DATA(cmsg) \
522 ((u_char *)(void *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr))) 522 ((u_char *)(void *)(cmsg) + __CMSG_ALIGN(sizeof(struct cmsghdr)))
523#define CCMSG_DATA(cmsg) \ 523#define CCMSG_DATA(cmsg) \
524 ((const u_char *)(const void *)(cmsg) + \ 524 ((const u_char *)(const void *)(cmsg) + \
525 __CMSG_ALIGN(sizeof(struct cmsghdr))) 525 __CMSG_ALIGN(sizeof(struct cmsghdr)))
526 526
527/* 527/*
528 * Alignment requirement for CMSG struct manipulation. 528 * Alignment requirement for CMSG struct manipulation.
529 * This basically behaves the same as ALIGN() ARCH/include/param.h. 529 * This basically behaves the same as ALIGN() ARCH/include/param.h.
530 * We declare it separately for two reasons: 530 * We declare it separately for two reasons:
531 * (1) avoid dependency between machine/param.h, and (2) to sync with kernel's 531 * (1) avoid dependency between machine/param.h, and (2) to sync with kernel's
532 * idea of ALIGNBYTES at runtime. 532 * idea of ALIGNBYTES at runtime.
533 * without (2), we can't guarantee binary compatibility in case of future 533 * without (2), we can't guarantee binary compatibility in case of future
534 * changes in ALIGNBYTES. 534 * changes in ALIGNBYTES.
535 */ 535 */
536#define __CMSG_ALIGN(n) (((n) + __ALIGNBYTES) & ~__ALIGNBYTES) 536#define __CMSG_ALIGN(n) (((n) + __ALIGNBYTES) & ~__ALIGNBYTES)
537#ifdef _KERNEL 537#ifdef _KERNEL
538#define CMSG_ALIGN(n) __CMSG_ALIGN(n) 538#define CMSG_ALIGN(n) __CMSG_ALIGN(n)
539#endif 539#endif
540 540
541/* given pointer to struct cmsghdr, return pointer to next cmsghdr */ 541/* given pointer to struct cmsghdr, return pointer to next cmsghdr */
542#define CMSG_NXTHDR(mhdr, cmsg) \ 542#define CMSG_NXTHDR(mhdr, cmsg) \
543 (((char *)(cmsg) + __CMSG_ALIGN((cmsg)->cmsg_len) + \ 543 (((char *)(cmsg) + __CMSG_ALIGN((cmsg)->cmsg_len) + \
544 __CMSG_ALIGN(sizeof(struct cmsghdr)) > \ 544 __CMSG_ALIGN(sizeof(struct cmsghdr)) > \
545 (((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \ 545 (((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen)) ? \
546 (struct cmsghdr *)0 : \ 546 (struct cmsghdr *)0 : \
547 (struct cmsghdr *)((char *)(cmsg) + \ 547 (struct cmsghdr *)(void *)((char *)(cmsg) + \
548 __CMSG_ALIGN((cmsg)->cmsg_len))) 548 __CMSG_ALIGN((cmsg)->cmsg_len)))
549 549
550/* 550/*
551 * RFC 2292 requires to check msg_controllen, in case that the kernel returns 551 * RFC 2292 requires to check msg_controllen, in case that the kernel returns
552 * an empty list for some reasons. 552 * an empty list for some reasons.
553 */ 553 */
554#define CMSG_FIRSTHDR(mhdr) \ 554#define CMSG_FIRSTHDR(mhdr) \
555 ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \ 555 ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
556 (struct cmsghdr *)(mhdr)->msg_control : \ 556 (struct cmsghdr *)(mhdr)->msg_control : \
557 (struct cmsghdr *)0) 557 (struct cmsghdr *)0)
558 558
559#define CMSG_SPACE(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(l)) 559#define CMSG_SPACE(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + __CMSG_ALIGN(l))
560#define CMSG_LEN(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + (l)) 560#define CMSG_LEN(l) (__CMSG_ALIGN(sizeof(struct cmsghdr)) + (l))
561 561
562/* "Socket"-level control message types: */ 562/* "Socket"-level control message types: */
563#define SCM_RIGHTS 0x01 /* access rights (array of int) */ 563#define SCM_RIGHTS 0x01 /* access rights (array of int) */
564#if defined(_NETBSD_SOURCE) 564#if defined(_NETBSD_SOURCE)
565/* 0x02 timestamp (struct timeval50) */ 565/* 0x02 timestamp (struct timeval50) */
566#define SCM_CREDS 0x04 /* credentials (struct sockcred) */ 566#define SCM_CREDS 0x04 /* credentials (struct sockcred) */
567#define SCM_TIMESTAMP 0x08 /* timestamp (struct timeval) */ 567#define SCM_TIMESTAMP 0x08 /* timestamp (struct timeval) */
568#endif 568#endif
569 569
570/* 570/*
571 * Types of socket shutdown(2). 571 * Types of socket shutdown(2).
572 */ 572 */
573#define SHUT_RD 0 /* Disallow further receives. */ 573#define SHUT_RD 0 /* Disallow further receives. */
574#define SHUT_WR 1 /* Disallow further sends. */ 574#define SHUT_WR 1 /* Disallow further sends. */
575#define SHUT_RDWR 2 /* Disallow further sends/receives. */ 575#define SHUT_RDWR 2 /* Disallow further sends/receives. */
576 576
577#include <sys/cdefs.h> 577#include <sys/cdefs.h>
578 578
579#ifdef _KERNEL 579#ifdef _KERNEL
580static inline socklen_t 580static inline socklen_t
581sockaddr_getlen(const struct sockaddr *sa) 581sockaddr_getlen(const struct sockaddr *sa)
582{ 582{
583 return sa->sa_len; 583 return sa->sa_len;
584} 584}
585 585
586__BEGIN_DECLS 586__BEGIN_DECLS
587struct sockaddr *sockaddr_copy(struct sockaddr *, socklen_t, 587struct sockaddr *sockaddr_copy(struct sockaddr *, socklen_t,
588 const struct sockaddr *); 588 const struct sockaddr *);
589struct sockaddr *sockaddr_externalize(struct sockaddr *, socklen_t, 589struct sockaddr *sockaddr_externalize(struct sockaddr *, socklen_t,
590 const struct sockaddr *); 590 const struct sockaddr *);
591struct sockaddr *sockaddr_alloc(sa_family_t, socklen_t, int); 591struct sockaddr *sockaddr_alloc(sa_family_t, socklen_t, int);
592const void *sockaddr_const_addr(const struct sockaddr *, socklen_t *); 592const void *sockaddr_const_addr(const struct sockaddr *, socklen_t *);
593void *sockaddr_addr(struct sockaddr *, socklen_t *); 593void *sockaddr_addr(struct sockaddr *, socklen_t *);
594const struct sockaddr *sockaddr_any(const struct sockaddr *); 594const struct sockaddr *sockaddr_any(const struct sockaddr *);
595const struct sockaddr *sockaddr_any_by_family(int); 595const struct sockaddr *sockaddr_any_by_family(int);
596const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *); 596const void *sockaddr_anyaddr(const struct sockaddr *, socklen_t *);
597int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *); 597int sockaddr_cmp(const struct sockaddr *, const struct sockaddr *);
598struct sockaddr *sockaddr_dup(const struct sockaddr *, int); 598struct sockaddr *sockaddr_dup(const struct sockaddr *, int);
599void sockaddr_free(struct sockaddr *); 599void sockaddr_free(struct sockaddr *);
600__END_DECLS 600__END_DECLS
601#endif /* _KERNEL */ 601#endif /* _KERNEL */
602 602
603#ifndef _KERNEL 603#ifndef _KERNEL
604 604
605__BEGIN_DECLS 605__BEGIN_DECLS
606int accept(int, struct sockaddr * __restrict, socklen_t * __restrict); 606int accept(int, struct sockaddr * __restrict, socklen_t * __restrict);
607int bind(int, const struct sockaddr *, socklen_t); 607int bind(int, const struct sockaddr *, socklen_t);
608int connect(int, const struct sockaddr *, socklen_t); 608int connect(int, const struct sockaddr *, socklen_t);
609int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict); 609int getpeername(int, struct sockaddr * __restrict, socklen_t * __restrict);
610int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict); 610int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict);
611int getsockopt(int, int, int, void *__restrict, socklen_t * __restrict); 611int getsockopt(int, int, int, void *__restrict, socklen_t * __restrict);
612int listen(int, int); 612int listen(int, int);
613int paccept(int, struct sockaddr * __restrict, socklen_t * __restrict, 613int paccept(int, struct sockaddr * __restrict, socklen_t * __restrict,
614 const sigset_t * __restrict, int); 614 const sigset_t * __restrict, int);
615ssize_t recv(int, void *, size_t, int); 615ssize_t recv(int, void *, size_t, int);
616ssize_t recvfrom(int, void *__restrict, size_t, int, 616ssize_t recvfrom(int, void *__restrict, size_t, int,
617 struct sockaddr * __restrict, socklen_t * __restrict); 617 struct sockaddr * __restrict, socklen_t * __restrict);
618ssize_t recvmsg(int, struct msghdr *, int); 618ssize_t recvmsg(int, struct msghdr *, int);
619ssize_t send(int, const void *, size_t, int); 619ssize_t send(int, const void *, size_t, int);
620ssize_t sendto(int, const void *, 620ssize_t sendto(int, const void *,
621 size_t, int, const struct sockaddr *, socklen_t); 621 size_t, int, const struct sockaddr *, socklen_t);
622ssize_t sendmsg(int, const struct msghdr *, int); 622ssize_t sendmsg(int, const struct msghdr *, int);
623int setsockopt(int, int, int, const void *, socklen_t); 623int setsockopt(int, int, int, const void *, socklen_t);
624int shutdown(int, int); 624int shutdown(int, int);
625int sockatmark(int); 625int sockatmark(int);
626int socket(int, int, int) 626int socket(int, int, int)
627#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE) 627#if !defined(__LIBC12_SOURCE__) && !defined(_STANDALONE)
628__RENAME(__socket30) 628__RENAME(__socket30)
629#endif 629#endif
630 ; 630 ;
631int socketpair(int, int, int, int *); 631int socketpair(int, int, int, int *);
632__END_DECLS 632__END_DECLS
633#endif /* !_KERNEL */ 633#endif /* !_KERNEL */
634 634
635#endif /* !_SYS_SOCKET_H_ */ 635#endif /* !_SYS_SOCKET_H_ */