]>
Commit | Line | Data |
---|---|---|
df4ef2ab UD |
1 | /* System-specific socket constants and types. Linux version. |
2 | Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc. | |
3 | This file is part of the GNU C Library. | |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
6 | modify it under the terms of the GNU Library General Public License as | |
7 | published by the Free Software Foundation; either version 2 of the | |
8 | License, or (at your option) any later version. | |
9 | ||
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | Library General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU Library General Public | |
16 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
17 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
18 | Boston, MA 02111-1307, USA. */ | |
19 | ||
5107cf1d UD |
20 | #ifndef _SYS_SOCKET_H |
21 | #error "Never include <bits/socket.h> directly; use <sys/socket.h> instead." | |
22 | #endif | |
23 | ||
df4ef2ab | 24 | |
df4ef2ab UD |
25 | #include <features.h> |
26 | ||
27 | #define __need_size_t | |
7cc27f44 | 28 | #define __need_NULL |
df4ef2ab UD |
29 | #include <stddef.h> |
30 | ||
3996f34b | 31 | #include <sys/types.h> |
df4ef2ab UD |
32 | |
33 | __BEGIN_DECLS | |
34 | ||
35 | /* Types of sockets. */ | |
36 | enum __socket_type | |
37 | { | |
38 | SOCK_STREAM = 1, /* Sequenced, reliable, connection-based | |
39 | byte streams. */ | |
5b826692 | 40 | #define SOCK_STREAM SOCK_STREAM |
df4ef2ab UD |
41 | SOCK_DGRAM = 2, /* Connectionless, unreliable datagrams |
42 | of fixed maximum length. */ | |
5b826692 | 43 | #define SOCK_DGRAM SOCK_DGRAM |
df4ef2ab | 44 | SOCK_RAW = 3, /* Raw protocol interface. */ |
5b826692 | 45 | #define SOCK_RAW SOCK_RAW |
df4ef2ab | 46 | SOCK_RDM = 4, /* Reliably-delivered messages. */ |
5b826692 | 47 | #define SOCK_RDM SOCK_RDM |
df4ef2ab UD |
48 | SOCK_SEQPACKET = 5, /* Sequenced, reliable, connection-based, |
49 | datagrams of fixed maximum length. */ | |
5b826692 | 50 | #define SOCK_SEQPACKET SOCK_SEQPACKET |
df4ef2ab UD |
51 | SOCK_PACKET = 10 /* Linux specific way of getting packets |
52 | at the dev level. For writing rarp and | |
53 | other similar things on the user level. */ | |
5b826692 | 54 | #define SOCK_PACKET SOCK_PACKET |
df4ef2ab UD |
55 | }; |
56 | ||
57 | /* Protocol families. */ | |
58 | #define PF_UNSPEC 0 /* Unspecified. */ | |
59 | #define PF_LOCAL 1 /* Local to host (pipes and file-domain). */ | |
60 | #define PF_UNIX PF_LOCAL /* Old BSD name for PF_LOCAL. */ | |
f166d865 | 61 | #define PF_FILE PF_LOCAL /* POSIX name for PF_LOCAL. */ |
df4ef2ab UD |
62 | #define PF_INET 2 /* IP protocol family. */ |
63 | #define PF_AX25 3 /* Amateur Radio AX.25. */ | |
64 | #define PF_IPX 4 /* Novell Internet Protocol. */ | |
65 | #define PF_APPLETALK 5 /* Don't use this. */ | |
66 | #define PF_NETROM 6 /* Amateur radio NetROM. */ | |
67 | #define PF_BRIDGE 7 /* Multiprotocol bridge. */ | |
68 | #define PF_AAL5 8 /* Reserved for Werner's ATM. */ | |
69 | #define PF_X25 9 /* Reserved for X.25 project. */ | |
70 | #define PF_INET6 10 /* IP version 6. */ | |
71 | #define PF_MAX 12 /* For now.. */ | |
72 | ||
73 | /* Address families. */ | |
74 | #define AF_UNSPEC PF_UNSPEC | |
75 | #define AF_LOCAL PF_LOCAL | |
76 | #define AF_UNIX PF_UNIX | |
f166d865 | 77 | #define AF_FILE PF_FILE |
df4ef2ab UD |
78 | #define AF_INET PF_INET |
79 | #define AF_AX25 PF_AX25 | |
80 | #define AF_IPX PF_IPX | |
81 | #define AF_APPLETALK PF_APPLETALK | |
82 | #define AF_NETROM PF_NETROM | |
83 | #define AF_BRIDGE PF_BRIDGE | |
84 | #define AF_AAL5 PF_AAL5 | |
85 | #define AF_X25 PF_X25 | |
86 | #define AF_INET6 PF_INET6 | |
87 | #define AF_MAX PF_MAX | |
88 | ||
c57abfa7 UD |
89 | /* Socket level values. Others are defined in the appropriate headers. |
90 | ||
91 | XXX These definitions also should go into the appropriate headers as | |
92 | far as they are available. */ | |
81e9dad6 UD |
93 | #define SOL_IPV6 41 |
94 | #define SOL_ICMPV6 58 | |
bdf289b2 | 95 | #define SOL_RAW 255 |
81e9dad6 UD |
96 | #define SOL_AX25 257 |
97 | #define SOL_ATALK 258 | |
98 | #define SOL_NETROM 259 | |
99 | #define SOL_ROSE 260 | |
100 | #define SOL_DECNET 261 | |
101 | #define SOL_X25 262 | |
df4ef2ab UD |
102 | |
103 | /* Maximum queue length specifiable by listen. */ | |
104 | #define SOMAXCONN 128 | |
105 | ||
106 | /* Get the definition of the macro to define the common sockaddr members. */ | |
5107cf1d | 107 | #include <bits/sockaddr.h> |
df4ef2ab UD |
108 | |
109 | /* Structure describing a generic socket address. */ | |
110 | struct sockaddr | |
111 | { | |
112 | __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ | |
113 | char sa_data[14]; /* Address data. */ | |
114 | }; | |
115 | ||
116 | ||
117 | /* Bits in the FLAGS argument to `send', `recv', et al. */ | |
118 | enum | |
119 | { | |
120 | MSG_OOB = 0x01, /* Process out-of-band data. */ | |
121 | MSG_PEEK = 0x02, /* Peek at incoming messages. */ | |
122 | MSG_DONTROUTE = 0x04, /* Don't use local routing. */ | |
123 | MSG_CTRUNC = 0x08, /* Control data lost before delivery. */ | |
124 | MSG_PROXY = 0x10 /* Supply or ask second address. */ | |
125 | }; | |
126 | ||
127 | ||
128 | /* Structure describing messages sent by | |
129 | `sendmsg' and received by `recvmsg'. */ | |
130 | struct msghdr | |
131 | { | |
132 | __ptr_t msg_name; /* Address to send to/receive from. */ | |
133 | int msg_namelen; /* Length of address data. */ | |
3996f34b | 134 | /* XXX Should be type `socklen_t' according to POSIX.1g. */ |
df4ef2ab UD |
135 | |
136 | struct iovec *msg_iov; /* Vector of data to send/receive into. */ | |
81e9dad6 | 137 | size_t msg_iovlen; /* Number of elements in the vector. */ |
df4ef2ab UD |
138 | |
139 | __ptr_t msg_control; /* Ancillary data (eg BSD filedesc passing). */ | |
3996f34b | 140 | socklen_t msg_controllen; /* Ancillary data buffer length. */ |
df4ef2ab UD |
141 | int msg_flags; /* Flags on received message. */ |
142 | }; | |
143 | ||
c0e45674 UD |
144 | /* Structure used for storage of ancillary data object information. */ |
145 | struct cmsghdr | |
146 | { | |
3996f34b | 147 | socklen_t cmsg_len; /* Length of data in cmsg_data plus length |
c0e45674 | 148 | of cmsghdr structure. */ |
c0e45674 UD |
149 | int cmsg_level; /* Originating protocol. */ |
150 | int cmsg_type; /* Protocol specific type. */ | |
7cc27f44 | 151 | #if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2 |
c0e45674 | 152 | unsigned char __cmsg_data[0]; /* Ancillary data. */ |
3996f34b | 153 | /* XXX Perhaps this should be removed. */ |
7cc27f44 | 154 | #endif |
c0e45674 UD |
155 | }; |
156 | ||
157 | /* Ancillary data object manipulation macros. */ | |
7cc27f44 UD |
158 | #if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2 |
159 | # define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data) | |
160 | #else | |
161 | # define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1)) | |
162 | #endif | |
c0e45674 | 163 | #define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg) |
7cc27f44 | 164 | #define CMSG_FIRSTHDR(mhdr) \ |
bfbc5754 | 165 | ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) \ |
c0e45674 | 166 | ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL) |
bfbc5754 UD |
167 | #define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \ |
168 | & ~(sizeof (size_t) - 1)) | |
169 | #define CMSG_SPACE(len) (CMSG_ALIGN (len) \ | |
170 | + CMSG_ALIGN (sizeof (struct cmsghdr))) | |
171 | #define CMSG_LEN(len) (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len)) | |
c0e45674 UD |
172 | |
173 | #ifndef _EXTERN_INLINE | |
174 | # define _EXTERN_INLINE extern __inline | |
175 | #endif | |
176 | extern struct cmsghdr *__cmsg_nxthdr __P ((struct msghdr *__mhdr, | |
177 | struct cmsghdr *__cmsg)); | |
178 | _EXTERN_INLINE struct cmsghdr * | |
179 | __cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg) | |
180 | { | |
181 | unsigned char *__p; | |
182 | ||
183 | if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr)) | |
184 | /* The kernel header does this so there may be a reason. */ | |
185 | return NULL; | |
186 | ||
187 | __p = (((unsigned char *) __cmsg) | |
188 | + ((__cmsg->cmsg_len + sizeof (long int) - 1) & ~sizeof (long int))); | |
189 | if (__p >= (unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen) | |
190 | /* No more entries. */ | |
191 | return NULL; | |
192 | return (struct cmsghdr *) __p; | |
193 | } | |
194 | ||
df4ef2ab UD |
195 | |
196 | /* Get socket manipulation related informations from kernel headers. */ | |
197 | #include <asm/socket.h> | |
198 | ||
199 | ||
200 | /* Structure used to manipulate the SO_LINGER option. */ | |
201 | struct linger | |
202 | { | |
203 | int l_onoff; /* Nonzero to linger on close. */ | |
204 | int l_linger; /* Time to linger. */ | |
205 | }; | |
206 | ||
207 | __END_DECLS |