summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/socket.h
blob: dcf60da6fa0b1e7370280338477477a097810255 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
/* System-specific socket constants and types.  OpenSolaris version.
   Copyright (C) 1991, 1992, 1994-2001, 2004, 2006, 2007, 2008
   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 Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#ifndef __BITS_SOCKET_H
#define __BITS_SOCKET_H

#ifndef _SYS_SOCKET_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif

#define	__need_size_t
#define __need_NULL
#include <stddef.h>

#include <limits.h>
#include <sys/types.h>

#define __SOCKADDR_IN6_EXTRA_FIELDS \
	__uint32_t __sin6_src_id;

/* Type for length arguments in socket calls.  */
#ifndef __socklen_t_defined
typedef __socklen_t socklen_t;
# define __socklen_t_defined
#endif

/* Types of sockets.  */
enum __socket_type
{
  SOCK_STREAM = 2,		/* Sequenced, reliable, connection-based
				   byte streams.  */
#define SOCK_STREAM SOCK_STREAM
  SOCK_DGRAM = 1,		/* Connectionless, unreliable datagrams
				   of fixed maximum length.  */
#define SOCK_DGRAM SOCK_DGRAM
  SOCK_RAW = 4,			/* Raw protocol interface.  */
#define SOCK_RAW SOCK_RAW
  SOCK_RDM = 5,			/* Reliably-delivered messages.  */
#define SOCK_RDM SOCK_RDM
  SOCK_SEQPACKET = 6		/* Sequenced, reliable, connection-based,
				   datagrams of fixed maximum length.  */
#define SOCK_SEQPACKET SOCK_SEQPACKET
};

/* Protocol families.  */
#define	PF_UNSPEC	0	/* Unspecified.  */
#define	PF_LOCAL	1	/* Local to host (pipes and file-domain).  */
#define	PF_UNIX		PF_LOCAL /* POSIX name for PF_LOCAL.  */
#define	PF_FILE		PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
#define	PF_INET		2	/* IP protocol family.  */
#define	PF_IMPLINK	3	/* Arpanet imp addresses.  */
#define	PF_PUP		4	/* PUP protocols: e.g. BSP.  */
#define	PF_CHAOS	5	/* MIT CHAOS protocols.  */
#define	PF_NS		6	/* XEROX NS protocols.  */
#define	PF_NBS		7	/* NBS protocols.  */
#define	PF_ECMA		8	/* European Computer Manufacturers.  */
#define	PF_DATAKIT	9	/* Datakit protocols.  */
#define	PF_CCITT	10	/* CCITT protocols, X.25 etc.  */
#define	PF_SNA		11	/* Linux SNA Project */
#define	PF_DECnet	12	/* Reserved for DECnet project.  */
#define PF_DLI		13	/* Direct data link interface.  */
#define	PF_LAT		14	/* LAT.  */
#define	PF_HYLINK	15	/* NSC Hyperchannel.  */
#define	PF_APPLETALK	16	/* Appletalk DDP.  */
#define	PF_NIT		17	/*  Network Interface Tap.  */
#define	PF_802		18	/* IEEE 802.2, also ISO 8802.  */
#define	PF_OSI		19	/* Umbrella for all families used.  */
#define	PF_X25		20	/* Reserved for X.25 project.  */
#define	PF_OSINET	21	/* AFI = 47, IDI = 4.  */
#define	PF_GOSIP	22	/* U.S. Government OSI.  */
#define	PF_IPX		23	/* Novell Internet Protocol.  */
#define	PF_ROUTE	24	/* Internal Routing Protocol.  */
#define	PF_LINK		25	/* Link-layer interface.  */
#define	PF_INET6	26	/* IP version 6.  */
#define	PF_KEY		27	/* PF_KEY key management API.  */
#define	PF_NCA		28	/* NCA socket.  */
#define	PF_POLICY	29	/* Security Policy DB socket.  */
#define	PF_INET_OFFLOAD	30	/* Sun private; do not use.  */
#define	PF_MAX		30	/* For now..  */

/* Address families.  */
#define	AF_UNSPEC	PF_UNSPEC
#define	AF_UNIX		PF_UNIX
#define	AF_LOCAL	PF_LOCAL
#define	AF_INET		PF_INET
#define	AF_IMPLINK	PF_IMPLINK
#define	AF_PUP		PF_PUP
#define	AF_CHAOS	PF_CHAOS
#define	AF_NS		PF_NBS
#define	AF_NBS		PF_NBS
#define	AF_ECMA		PF_ECMA
#define	AF_DATAKIT	PF_DATAKIT
#define	AF_CCITT	PF_CCITT
#define	AF_SNA		PF_SNA
#define	AF_DECnet	PF_DECnet
#define	AF_DLI		PF_DLI
#define	AF_LAT		PF_LAT
#define	AF_HYLINK	PF_HYLINK
#define	AF_APPLETALK	PF_APPLETALK
#define	AF_NIT		PF_NIT
#define	AF_802		PF_802
#define	AF_X25		PF_X25
#define	AF_OSINET	PF_OSINET
#define	AF_GOSIP	PF_GOSIP
#define	AF_IPX		PF_IPX
#define	AF_ROUTE	PF_ROUTE
#define	AF_LINK		PF_LINK
#define	AF_INET6	PF_INET6
#define	AF_KEY		PF_X25
#define	AF_NCA		PF_X25
#define	AF_POLICY	PF_POLICY
#define	AF_INET_OFFLOAD	PF_INET_OFFLOAD
#define	AF_MAX		PF_MAX

/* Socket level values.  */
#define SOL_SOCKET		0xFFFF
#define SOL_IP			0 /* IPPROTO_IP */
#define SOL_ICMP        1 /* IPPROTO_ICMP */
#define SOL_TCP			6 /* IPPROTO_TCP */
#define SOL_UDP			17 /* IPPROTO_UDP */
#define SOL_IPV6		41 /* IPPROTO_IPV6 */
#define SOL_ICMPV6		58 /* IPPROTO_ICMPV6 */
#define SOL_SCTP		132 /* IPPROTO_SCTP */
#define SOL_RAW			255 /* IPPROTO_RAW */

/* Maximum queue length specifiable by listen.  */
#define SOMAXCONN	128

/* Get the definition of the macro to define the common sockaddr members.  */
#include <bits/sockaddr.h>

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);	/* Common data: address family and length.  */
    char sa_data[14];		/* Address data.  */
  };


/* Structure large enough to hold any socket address (with the historical
   exception of AF_UNIX).  We reserve 128 bytes.  */
#define _SS_MAXSIZE		256
#define _SS_ALIGNSIZE	(sizeof (sockaddr_maxalign_t))
typedef double sockaddr_maxalign_t;
#define _SS_PAD1SIZE	(_SS_ALIGNSIZE - sizeof (sa_family_t))
#define _SS_PAD2SIZE	(_SS_MAXSIZE - (sizeof (sa_family_t) + \
	_SS_PAD1SIZE + _SS_ALIGNSIZE))

struct sockaddr_storage
  {
    __SOCKADDR_COMMON (ss_);	/* Address family, etc.  */
    char _ss_pad1[_SS_PAD1SIZE];
    sockaddr_maxalign_t __ss_align;	/* Force desired alignment.  */
    char _ss_pad2[_SS_PAD2SIZE];
  };


/* Bits in the FLAGS argument to `send', `recv', et al.  */
enum
  {
    MSG_OOB		= 0x01,	/* Process out-of-band data.  */
#define MSG_OOB		MSG_OOB
    MSG_PEEK		= 0x02,	/* Peek at incoming messages.  */
#define MSG_PEEK	MSG_PEEK
    MSG_DONTROUTE	= 0x04,	/* Don't use local routing.  */
#define MSG_DONTROUTE	MSG_DONTROUTE
#ifdef __USE_GNU
    /* DECnet uses a different name.  */
    MSG_TRYHARD		= MSG_DONTROUTE,
# define MSG_TRYHARD	MSG_DONTROUTE
#endif
    MSG_EOR		= 0x08, /* End of record.  */
#define	MSG_EOR		MSG_EOR
    MSG_CTRUNC		= 0x10,	/* Control data lost before delivery.  */
#define MSG_CTRUNC	MSG_CTRUNC
    MSG_TRUNC		= 0x20,
#define	MSG_TRUNC	MSG_TRUNC
    MSG_WAITALL		= 0x40, /* Wait for a full request.  */
#define	MSG_WAITALL	MSG_WAITALL
    MSG_DONTWAIT	= 0x80, /* Nonblocking IO.  */
#define	MSG_DONTWAIT	MSG_DONTWAIT
    MSG_NOTIFICATION	= 0x100, /* Notification, not data.  */
#define	MSG_NOTIFICATION	MSG_NOTIFICICATION
    MSG_XPG4_2		= 0x8000, /* Private: XPG4.2 flag.  */
#define	MSG_XPG4_2	MSG_XPG4_2

/* The following are not supported by the OpenSolaris kernel.  */
    MSG_NOSIGNAL	= 0x4000, /* Do not generate SIGPIPE.  */
#define	MSG_NOSIGNAL	MSG_NOSIGNAL
  };


/* Structure describing messages sent by
   `sendmsg' and received by `recvmsg'.  */
struct msghdr
  {
    void *msg_name;		/* Address to send to/receive from.  */
    socklen_t msg_namelen;	/* Length of address data.  */

    struct iovec *msg_iov;	/* Vector of data to send/receive into.  */
    size_t msg_iovlen;		/* Number of elements in the vector.  */

    void *msg_control;		/* Ancillary data (eg BSD filedesc passing). */
    socklen_t msg_controllen;	/* Ancillary data buffer length.  */

    int msg_flags;		/* Flags on received message.  */
  };

/* Structure used for storage of ancillary data object information.  */
struct cmsghdr
  {
    socklen_t cmsg_len;		/* Length of data in cmsg_data plus length
				   of cmsghdr structure.  */
    int cmsg_level;		/* Originating protocol.  */
    int cmsg_type;		/* Protocol specific type.  */
  };

/* Ancillary data object manipulation macros.  */
#if defined(__sparc__)
# define _CMSG_HDR_ALIGNMENT 8
#else
# define _CMSG_HDR_ALIGNMENT 4
#endif
#define CMSG_ALIGN(len)	(((uintptr_t)(len) + _CMSG_HDR_ALIGNMENT - 1) \
			& ~(_CMSG_HDR_ALIGNMENT - 1))
#define _CMSG_HDR_ALIGN(x)	CMSG_ALIGN(x)
#define CMSG_DATA(cmsg) ((unsigned char *) CMSG_ALIGN((struct cmsghdr *) (cmsg) + 1))
#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
#define CMSG_FIRSTHDR(mhdr) \
  ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr)		      \
   ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
#define CMSG_SPACE(len) (CMSG_ALIGN (len) \
			 + CMSG_ALIGN (sizeof (struct cmsghdr)))
#define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))

extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
				      struct cmsghdr *__cmsg) __THROW;
#ifdef __USE_EXTERN_INLINES
# ifndef _EXTERN_INLINE
#  define _EXTERN_INLINE __extern_inline
# endif
_EXTERN_INLINE struct cmsghdr *
__NTH (__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 0;

  __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 0;
  return __cmsg;
}
#endif	/* Use `extern inline'.  */

/* Socket options.  */
#define SO_DEBUG		0x0001 /* Turn on debugging info recording.  */
#define SO_ACCEPTCONN	0x0002 /* Socket has had listen().  */
#define SO_REUSEADDR	0x0004 /* Allow local address reuse.  */
#define SO_KEEPALIVE	0x0008 /* Keep connections alive.  */
#define SO_DONTROUTE	0x0010 /* Just use interface addresses.  */
#define SO_BROADCAST	0x0020 /* Permit sending of broadcast msgs.  */
#define SO_USELOOPBACK	0x0040 /* Bypass hardware when possible.  */
#define SO_LINGER		0x0080 /* Linger on close if data present.  */
#define SO_OOBINLINE	0x0100 /* Leave received OOB data in line.  */
#define SO_DGRAM_ERRIND	0x0200 /* Application wants delayed error.  */
#define SO_RECVUCRED	0x0400 /* Application wants ucred of sender.  */

/* Socket options not kept in so_options.  */
#define SO_SNDBUF		0x1001 /* Send buffer size.  */
#define SO_RCVBUF		0x1002 /* Receive buffer size.  */
#define SO_SNDLOWAT		0x1003 /* Send low-water mark.  */
#define SO_RCVLOWAT		0x1004 /* Receive low-water mark.  */
#define SO_SNDTIMEO		0x1005 /* Send timeout.  */
#define SO_RCVTIMEO		0x1006 /* Receive timeout.  */
#define SO_ERROR		0x1007 /* Get error status and clear.  */
#define SO_TYPE			0x1008 /* Get socket type.  */
#define SO_PROTOTYPE	0x1009 /* Get/set protocol type.  */
#define SO_ANON_MLP		0x100a /* Create MLP on anonymous bind.  */
#define SO_MAC_EXEMPT	0x100b /* Allow dominated unlabeled peers.  */
#define SO_DOMAIN		0x100c /* Get socket domain. */
/* SCM_RIGHTS = 0x1010 */
#define SO_SECATTR		0x1011 /* Socket's security attributes.  */
/* SCM_UCRED = 0x1012 */
#define SO_TIMESTAMP	0x1013 /* Sender's ucred.  */
#define SO_ALLZONES		0x1014 /* Bind in all zones.  */
#define SO_EXCLBIND		0x1015 /* Exclusive binding.  */

/* Socket level message types.  */
enum
  {
    SCM_RIGHTS = 0x1010,	/* Transfer file descriptors.  */
#define SCM_RIGHTS SCM_RIGHTS
    SCM_UCRED = 0x1012,
#define SCM_UCRED SCM_UCRED
    SCM_TIMESTAMP = SO_TIMESTAMP
#define SCM_TIMESTAMP SCM_TIMESTAMP
  };

/* Structure used to manipulate the SO_LINGER option.  */
struct linger
  {
    int l_onoff;		/* Nonzero to linger on close.  */
    int l_linger;		/* Time to linger.  */
  };

/* Socket versions.  */
#define SOV_STREAM		0 /* Not a socket - just a stream.  */
#define SOV_DEFAULT		1 /* Select based on so_default_version.  */
#define SOV_SOCKSTREAM	2 /* Socket plus streams operations.  */
#define SOV_SOCKBSD		3 /* Socket with no streams operations.  */
#define SOV_XPG4_2	    4 /* Xnet socket.  */

#endif	/* bits/socket.h */