Lots of changes
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / bits / socket.h
1 /* System-specific socket constants and types.  OpenSolaris version.
2    Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 #ifndef __BITS_SOCKET_H
22 #define __BITS_SOCKET_H
23
24 #ifndef _SYS_SOCKET_H
25 # error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
26 #endif
27
28 #define __need_size_t
29 #define __need_NULL
30 #include <stddef.h>
31
32 #include <limits.h>
33 #include <sys/types.h>
34
35 /* Type for length arguments in socket calls.  */
36 #ifndef __socklen_t_defined
37 typedef __socklen_t socklen_t;
38 # define __socklen_t_defined
39 #endif
40
41 /* Types of sockets.  */
42 enum __socket_type
43 {
44   SOCK_STREAM = 2,              /* Sequenced, reliable, connection-based
45                                    byte streams.  */
46 #define SOCK_STREAM SOCK_STREAM
47   SOCK_DGRAM = 1,               /* Connectionless, unreliable datagrams
48                                    of fixed maximum length.  */
49 #define SOCK_DGRAM SOCK_DGRAM
50   SOCK_RAW = 4,                 /* Raw protocol interface.  */
51 #define SOCK_RAW SOCK_RAW
52   SOCK_RDM = 5,                 /* Reliably-delivered messages.  */
53 #define SOCK_RDM SOCK_RDM
54   SOCK_SEQPACKET = 6            /* Sequenced, reliable, connection-based,
55                                    datagrams of fixed maximum length.  */
56 #define SOCK_SEQPACKET SOCK_SEQPACKET
57 };
58
59 /* Protocol families.  */
60 #define PF_UNSPEC       0       /* Unspecified.  */
61 #define PF_LOCAL        1       /* Local to host (pipes and file-domain).  */
62 #define PF_UNIX         PF_LOCAL /* POSIX name for PF_LOCAL.  */
63 #define PF_FILE         PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
64 #define PF_INET         2       /* IP protocol family.  */
65 #define PF_IMPLINK      3       /* Arpanet imp addresses.  */
66 #define PF_PUP          4       /* PUP protocols: e.g. BSP.  */
67 #define PF_CHAOS        5       /* MIT CHAOS protocols.  */
68 #define PF_NS           6       /* XEROX NS protocols.  */
69 #define PF_NBS          7       /* NBS protocols.  */
70 #define PF_ECMA         8       /* European Computer Manufacturers.  */
71 #define PF_DATAKIT      9       /* Datakit protocols.  */
72 #define PF_CCITT        10      /* CCITT protocols, X.25 etc.  */
73 #define PF_SNA          11      /* Linux SNA Project */
74 #define PF_DECnet       12      /* Reserved for DECnet project.  */
75 #define PF_DLI          13      /* Direct data link interface.  */
76 #define PF_LAT          14      /* LAT.  */
77 #define PF_HYLINK       15      /* NSC Hyperchannel.  */
78 #define PF_APPLETALK    16      /* Appletalk DDP.  */
79 #define PF_NIT          17      /*  Network Interface Tap.  */
80 #define PF_802          18      /* IEEE 802.2, also ISO 8802.  */
81 #define PF_OSI          19      /* Umbrella for all families used.  */
82 #define PF_X25          20      /* Reserved for X.25 project.  */
83 #define PF_OSINET       21      /* AFI = 47, IDI = 4.  */
84 #define PF_GOSIP        22      /* U.S. Government OSI.  */
85 #define PF_IPX          23      /* Novell Internet Protocol.  */
86 #define PF_ROUTE        24      /* Internal Routing Protocol.  */
87 #define PF_LINK         25      /* Link-layer interface.  */
88 #define PF_INET6        26      /* IP version 6.  */
89 #define PF_KEY          27      /* PF_KEY key management API.  */
90 #define PF_NCA          28      /* NCA socket.  */
91 #define PF_POLICY       29      /* Security Policy DB socket.  */
92 #define PF_INET_OFFLOAD 30      /* Sun private; do not use.  */
93 #define PF_MAX          30      /* For now..  */
94
95 /* Address families.  */
96 #define AF_UNSPEC       PF_UNSPEC
97 #define AF_UNIX         PF_UNIX
98 #define AF_LOCAL        PF_LOCAL
99 #define AF_INET         PF_INET
100 #define AF_IMPLINK      PF_IMPLINK
101 #define AF_PUP          PF_PUP
102 #define AF_CHAOS        PF_CHAOS
103 #define AF_NS           PF_NBS
104 #define AF_NBS          PF_NBS
105 #define AF_ECMA         PF_ECMA
106 #define AF_DATAKIT      PF_DATAKIT
107 #define AF_CCITT        PF_CCITT
108 #define AF_SNA          PF_SNA
109 #define AF_DECnet       PF_DECnet
110 #define AF_DLI          PF_DLI
111 #define AF_LAT          PF_LAT
112 #define AF_HYLINK       PF_HYLINK
113 #define AF_APPLETALK    PF_APPLETALK
114 #define AF_NIT          PF_NIT
115 #define AF_802          PF_802
116 #define AF_X25          PF_X25
117 #define AF_OSINET       PF_OSINET
118 #define AF_GOSIP        PF_GOSIP
119 #define AF_IPX          PF_IPX
120 #define AF_ROUTE        PF_ROUTE
121 #define AF_LINK         PF_LINK
122 #define AF_INET6        PF_INET6
123 #define AF_KEY          PF_X25
124 #define AF_NCA          PF_X25
125 #define AF_POLICY       PF_POLICY
126 #define AF_INET_OFFLOAD PF_INET_OFFLOAD
127 #define AF_MAX          PF_MAX
128
129 /* Socket level values.  */
130 #define SOL_SOCKET              0xFFFF
131 #define SOL_IP                  0 /* IPPROTO_IP */
132 #define SOL_ICMP        1 /* IPPROTO_ICMP */
133 #define SOL_TCP                 6 /* IPPROTO_TCP */
134 #define SOL_UDP                 17 /* IPPROTO_UDP */
135 #define SOL_IPV6                41 /* IPPROTO_IPV6 */
136 #define SOL_ICMPV6              58 /* IPPROTO_ICMPV6 */
137 #define SOL_SCTP                132 /* IPPROTO_SCTP */
138 #define SOL_RAW                 255 /* IPPROTO_RAW */
139
140 /* Maximum queue length specifiable by listen.  */
141 #define SOMAXCONN       128
142
143 /* Get the definition of the macro to define the common sockaddr members.  */
144 #include <bits/sockaddr.h>
145
146 /* Structure describing a generic socket address.  */
147 struct sockaddr
148   {
149     __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
150     char sa_data[14];           /* Address data.  */
151   };
152
153
154 /* Structure large enough to hold any socket address (with the historical
155    exception of AF_UNIX).  We reserve 128 bytes.  */
156 #define _SS_MAXSIZE             256
157 #define _SS_ALIGNSIZE   (sizeof (sockaddr_maxalign_t))
158 typedef double sockaddr_maxalign_t;
159 #define _SS_PAD1SIZE    (_SS_ALIGNSIZE - sizeof (sa_family_t))
160 #define _SS_PAD2SIZE    (_SS_MAXSIZE - (sizeof (sa_family_t) + \
161         _SS_PAD1SIZE + _SS_ALIGNSIZE))
162
163 struct sockaddr_storage
164   {
165     __SOCKADDR_COMMON (ss_);    /* Address family, etc.  */
166     char _ss_pad1[_SS_PAD1SIZE];
167     sockaddr_maxalign_t __ss_align;     /* Force desired alignment.  */
168     char _ss_pad2[_SS_PAD2SIZE];
169   };
170
171
172 /* Bits in the FLAGS argument to `send', `recv', et al.  */
173 enum
174   {
175     MSG_OOB             = 0x01, /* Process out-of-band data.  */
176 #define MSG_OOB         MSG_OOB
177     MSG_PEEK            = 0x02, /* Peek at incoming messages.  */
178 #define MSG_PEEK        MSG_PEEK
179     MSG_DONTROUTE       = 0x04, /* Don't use local routing.  */
180 #define MSG_DONTROUTE   MSG_DONTROUTE
181 #ifdef __USE_GNU
182     /* DECnet uses a different name.  */
183     MSG_TRYHARD         = MSG_DONTROUTE,
184 # define MSG_TRYHARD    MSG_DONTROUTE
185 #endif
186     MSG_EOR             = 0x08, /* End of record.  */
187 #define MSG_EOR         MSG_EOR
188     MSG_CTRUNC          = 0x10, /* Control data lost before delivery.  */
189 #define MSG_CTRUNC      MSG_CTRUNC
190     MSG_TRUNC           = 0x20,
191 #define MSG_TRUNC       MSG_TRUNC
192     MSG_WAITALL         = 0x40, /* Wait for a full request.  */
193 #define MSG_WAITALL     MSG_WAITALL
194     MSG_DONTWAIT        = 0x80, /* Nonblocking IO.  */
195 #define MSG_DONTWAIT    MSG_DONTWAIT
196     MSG_NOTIFICATION    = 0x100, /* Notification, not data.  */
197 #define MSG_NOTIFICATION        MSG_NOTIFICICATION
198     MSG_XPG4_2          = 0x8000, /* Private: XPG4.2 flag.  */
199 #define MSG_XPG4_2      MSG_XPG4_2
200
201 /* The following are not supported by the OpenSolaris kernel.  */
202     MSG_NOSIGNAL        = 0x4000, /* Do not generate SIGPIPE.  */
203 #define MSG_NOSIGNAL    MSG_NOSIGNAL
204   };
205
206
207 /* Structure describing messages sent by
208    `sendmsg' and received by `recvmsg'.  */
209 struct msghdr
210   {
211     void *msg_name;             /* Address to send to/receive from.  */
212     socklen_t msg_namelen;      /* Length of address data.  */
213
214     struct iovec *msg_iov;      /* Vector of data to send/receive into.  */
215     size_t msg_iovlen;          /* Number of elements in the vector.  */
216
217     void *msg_control;          /* Ancillary data (eg BSD filedesc passing). */
218     socklen_t msg_controllen;   /* Ancillary data buffer length.  */
219
220     int msg_flags;              /* Flags on received message.  */
221   };
222
223 /* Structure used for storage of ancillary data object information.  */
224 struct cmsghdr
225   {
226     socklen_t cmsg_len;         /* Length of data in cmsg_data plus length
227                                    of cmsghdr structure.  */
228     int cmsg_level;             /* Originating protocol.  */
229     int cmsg_type;              /* Protocol specific type.  */
230   };
231
232 /* Ancillary data object manipulation macros.  */
233 #if defined(__sparc__)
234 # define _CMSG_HDR_ALIGNMENT 8
235 #else
236 # define _CMSG_HDR_ALIGNMENT 4
237 #endif
238 #define CMSG_ALIGN(len) (((uintptr_t)(len) + _CMSG_HDR_ALIGNMENT - 1) \
239                         & ~(_CMSG_HDR_ALIGNMENT - 1))
240 #define CMSG_DATA(cmsg) ((unsigned char *) CMSG_ALIGN((struct cmsghdr *) (cmsg) + 1))
241 #define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
242 #define CMSG_FIRSTHDR(mhdr) \
243   ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr)                 \
244    ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
245 #define CMSG_SPACE(len) (CMSG_ALIGN (len) \
246                          + CMSG_ALIGN (sizeof (struct cmsghdr)))
247 #define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))
248
249 extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
250                                       struct cmsghdr *__cmsg) __THROW;
251 #ifdef __USE_EXTERN_INLINES
252 # ifndef _EXTERN_INLINE
253 #  define _EXTERN_INLINE __extern_inline
254 # endif
255 _EXTERN_INLINE struct cmsghdr *
256 __NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg))
257 {
258   if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
259     /* The kernel header does this so there may be a reason.  */
260     return 0;
261
262   __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
263                                + CMSG_ALIGN (__cmsg->cmsg_len));
264   if ((unsigned char *) (__cmsg + 1) > ((unsigned char *) __mhdr->msg_control
265                                         + __mhdr->msg_controllen)
266       || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len)
267           > ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)))
268     /* No more entries.  */
269     return 0;
270   return __cmsg;
271 }
272 #endif  /* Use `extern inline'.  */
273
274 /* Socket options.  */
275 #define SO_DEBUG                0x0001 /* Turn on debugging info recording.  */
276 #define SO_ACCEPTCONN   0x0002 /* Socket has had listen().  */
277 #define SO_REUSEADDR    0x0004 /* Allow local address reuse.  */
278 #define SO_KEEPALIVE    0x0008 /* Keep connections alive.  */
279 #define SO_DONTROUTE    0x0010 /* Just use interface addresses.  */
280 #define SO_BROADCAST    0x0020 /* Permit sending of broadcast msgs.  */
281 #define SO_USELOOPBACK  0x0040 /* Bypass hardware when possible.  */
282 #define SO_LINGER               0x0080 /* Linger on close if data present.  */
283 #define SO_OOBINLINE    0x0100 /* Leave received OOB data in line.  */
284 #define SO_DGRAM_ERRIND 0x0200 /* Application wants delayed error.  */
285 #define SO_RECVUCRED    0x0400 /* Application wants ucred of sender.  */
286
287 /* Socket options not kept in so_options.  */
288 #define SO_SNDBUF               0x1001 /* Send buffer size.  */
289 #define SO_RCVBUF               0x1002 /* Receive buffer size.  */
290 #define SO_SNDLOWAT             0x1003 /* Send low-water mark.  */
291 #define SO_RCVLOWAT             0x1004 /* Receive low-water mark.  */
292 #define SO_SNDTIMEO             0x1005 /* Send timeout.  */
293 #define SO_RCVTIMEO             0x1006 /* Receive timeout.  */
294 #define SO_ERROR                0x1007 /* Get error status and clear.  */
295 #define SO_TYPE                 0x1008 /* Get socket type.  */
296 #define SO_PROTOTYPE    0x1009 /* Get/set protocol type.  */
297 #define SO_ANON_MLP             0x100a /* Create MLP on anonymous bind.  */
298 #define SO_MAC_EXEMPT   0x100b /* Allow dominated unlabeled peers.  */
299 #define SO_DOMAIN               0x100c /* Get socket domain. */
300 /* SCM_RIGHTS = 0x1010 */
301 #define SO_SECATTR              0x1011 /* Socket's security attributes.  */
302 /* SCM_UCRED = 0x1012 */
303 #define SO_TIMESTAMP    0x1013 /* Sender's ucred.  */
304 #define SO_ALLZONES             0x1014 /* Bind in all zones.  */
305 #define SO_EXCLBIND             0x1015 /* Exclusive binding.  */
306
307 /* Socket level message types.  */
308 enum
309   {
310     SCM_RIGHTS = 0x1010,        /* Transfer file descriptors.  */
311 #define SCM_RIGHTS SCM_RIGHTS
312     SCM_UCRED = 0x1012,
313 #define SCM_UCRED SCM_UCRED
314     SCM_TIMESTAMP = SO_TIMESTAMP
315 #define SCM_TIMESTAMP SCM_TIMESTAMP
316   };
317
318 /* Structure used to manipulate the SO_LINGER option.  */
319 struct linger
320   {
321     int l_onoff;                /* Nonzero to linger on close.  */
322     int l_linger;               /* Time to linger.  */
323   };
324
325 /* Socket versions.  */
326 #define SOV_STREAM              0 /* Not a socket - just a stream.  */
327 #define SOV_DEFAULT             1 /* Select based on so_default_version.  */
328 #define SOV_SOCKSTREAM  2 /* Socket plus streams operations.  */
329 #define SOV_SOCKBSD             3 /* Socket with no streams operations.  */
330 #define SOV_XPG4_2          4 /* Xnet socket.  */
331
332 #endif  /* bits/socket.h */