2 * Copyright (c) 2017 Cisco and/or its affiliates.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at:
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
16 #ifndef included_ldp_glibc_socket_h
17 #define included_ldp_glibc_socket_h
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <sys/select.h>
22 #include <arpa/inet.h>
25 #include <sys/epoll.h>
32 * Generic glibc fd api
36 * glibc APIs from <unistd.h>
39 /* Close the file descriptor FD.
41 This function is a cancellation point and therefore not marked with
43 extern int close (int __fd);
45 /* Read NBYTES into BUF from FD. Return the
46 number read, -1 for errors or 0 for EOF.
48 This function is a cancellation point and therefore not marked with
50 extern ssize_t __wur read (int __fd, void *__buf, size_t __nbytes);
52 /* Write N bytes of BUF to FD. Return the number written, or -1.
54 This function is a cancellation point and therefore not marked with
56 extern ssize_t __wur write (int __fd, const void *__buf, size_t __n);
60 * glibc APIs from <fcntl.h>
63 /* Do the file control operation described by CMD on FD.
64 The remaining arguments are interpreted depending on CMD.
66 This function is a cancellation point and therefore not marked with
68 extern int fcntl (int __fd, int __cmd, ...);
72 * glibc APIs from <sys/select.h>
75 /* Check the first NFDS descriptors each in READFDS (if not NULL) for read
76 readiness, in WRITEFDS (if not NULL) for write readiness, and in EXCEPTFDS
77 (if not NULL) for exceptional conditions. If TIMEOUT is not NULL, time out
78 after waiting the interval specified therein. Returns the number of ready
79 descriptors, or -1 for errors.
82 This function is a cancellation point and therefore not marked with
85 select (int __nfds, fd_set * __restrict __readfds,
86 fd_set * __restrict __writefds,
87 fd_set * __restrict __exceptfds,
88 struct timeval *__restrict __timeout);
91 /* Same as above only that the TIMEOUT value is given with higher
92 resolution and a sigmask which is been set temporarily. This version
95 This function is a cancellation point and therefore not marked with
98 pselect (int __nfds, fd_set * __restrict __readfds,
99 fd_set * __restrict __writefds,
100 fd_set * __restrict __exceptfds,
101 const struct timespec *__restrict __timeout,
102 const __sigset_t * __restrict __sigmask);
108 * Socket specific glibc api
113 * glibc APIs from <sys/socket.h>
116 /* Create a new socket of type TYPE in domain DOMAIN, using
117 protocol PROTOCOL. If PROTOCOL is zero, one is chosen automatically.
118 Returns a file descriptor for the new socket, or -1 for errors. */
119 extern int __THROW socket (int __domain, int __type, int __protocol);
121 /* Create two new sockets, of type TYPE in domain DOMAIN and using
122 protocol PROTOCOL, which are connected to each other, and put file
123 descriptors for them in FDS[0] and FDS[1]. If PROTOCOL is zero,
124 one will be chosen automatically. Returns 0 on success, -1 for errors. */
126 socketpair (int __domain, int __type, int __protocol, int __fds[2]);
128 /* Give the socket FD the local address ADDR (which is LEN bytes long). */
130 bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
132 /* Put the local address of FD into *ADDR and its length in *LEN. */
134 getsockname (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __len);
136 /* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
137 For connectionless socket types, just set the default address to send to
138 and the only address from which to accept transmissions.
139 Return 0 on success, -1 for errors.
141 This function is a cancellation point and therefore not marked with
143 extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
145 /* Put the address of the peer connected to socket FD into *ADDR
146 (which is *LEN bytes long), and its actual length into *LEN. */
148 getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __len);
150 /* Send N bytes of BUF to socket FD. Returns the number sent or -1.
152 This function is a cancellation point and therefore not marked with
154 extern ssize_t send (int __fd, const void *__buf, size_t __n, int __flags);
156 extern ssize_t sendfile (int __out_fd, int __in_fd, off_t * __offset,
159 /* Read N bytes into BUF from socket FD.
160 Returns the number read or -1 for errors.
162 This function is a cancellation point and therefore not marked with
164 extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
166 /* Send N bytes of BUF on socket FD to peer at address ADDR (which is
167 ADDR_LEN bytes long). Returns the number sent, or -1 for errors.
169 This function is a cancellation point and therefore not marked with
172 sendto (int __fd, const void *__buf, size_t __n,
173 int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
175 /* Read N bytes into BUF through socket FD.
176 If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of
177 the sender, and store the actual size of the address in *ADDR_LEN.
178 Returns the number of bytes read or -1 for errors.
180 This function is a cancellation point and therefore not marked with
183 recvfrom (int __fd, void *__restrict __buf,
184 size_t __n, int __flags,
185 __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
187 /* Send a message described MESSAGE on socket FD.
188 Returns the number of bytes sent, or -1 for errors.
190 This function is a cancellation point and therefore not marked with
193 sendmsg (int __fd, const struct msghdr *__message, int __flags);
196 /* Send a VLEN messages as described by VMESSAGES to socket FD.
197 Returns the number of datagrams successfully written or -1 for errors.
199 This function is a cancellation point and therefore not marked with
202 sendmmsg (int __fd, struct mmsghdr *__vmessages,
203 unsigned int __vlen, int __flags);
206 /* Receive a message as described by MESSAGE from socket FD.
207 Returns the number of bytes read or -1 for errors.
209 This function is a cancellation point and therefore not marked with
211 extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags);
214 /* Receive up to VLEN messages as described by VMESSAGES from socket FD.
215 Returns the number of messages received or -1 for errors.
217 This function is a cancellation point and therefore not marked with
220 recvmmsg (int __fd, struct mmsghdr *__vmessages,
221 unsigned int __vlen, int __flags, struct timespec *__tmo);
225 /* Put the current value for socket FD's option OPTNAME at protocol level LEVEL
226 into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's
227 actual length. Returns 0 on success, -1 for errors. */
229 getsockopt (int __fd, int __level, int __optname,
230 void *__restrict __optval, socklen_t * __restrict __optlen);
232 /* Set socket FD's option OPTNAME at protocol level LEVEL
233 to *OPTVAL (which is OPTLEN bytes long).
234 Returns 0 on success, -1 for errors. */
236 setsockopt (int __fd, int __level, int __optname,
237 const void *__optval, socklen_t __optlen);
239 /* Prepare to accept connections on socket FD.
240 N connection requests will be queued before further requests are refused.
241 Returns 0 on success, -1 for errors. */
242 extern int __THROW listen (int __fd, int __n);
244 /* Await a connection on socket FD.
245 When a connection arrives, open a new socket to communicate with it,
246 set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
247 peer and *ADDR_LEN to the address's actual length, and return the
248 new socket's descriptor, or -1 for errors.
250 This function is a cancellation point and therefore not marked with
253 accept (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
255 /* Similar to 'accept' but takes an additional parameter to specify flags.
257 This function is a cancellation point and therefore not marked with
259 /* TBD: implemented later */
261 accept4 (int __fd, __SOCKADDR_ARG __addr,
262 socklen_t * __restrict __addr_len, int __flags);
264 /* Shut down all or part of the connection open on socket FD.
265 HOW determines what to shut down:
266 SHUT_RD = No more receptions;
267 SHUT_WR = No more transmissions;
268 SHUT_RDWR = No more receptions or transmissions.
269 Returns 0 on success, -1 for errors. */
270 extern int __THROW shutdown (int __fd, int __how);
274 * glibc APIs from <sys/epoll.h>
277 /* Creates an epoll instance. Returns an fd for the new instance.
278 The "size" parameter is a hint specifying the number of file
279 descriptors to be associated with the new instance. The fd
280 returned by epoll_create() should be closed with close(). */
281 extern int __THROW epoll_create (int __size);
283 /* Same as epoll_create but with an FLAGS parameter. The unused SIZE
284 parameter has been dropped. */
285 extern int __THROW epoll_create1 (int __flags);
287 /* Manipulate an epoll instance "epfd". Returns 0 in case of success,
288 -1 in case of error ( the "errno" variable will contain the
289 specific error code ) The "op" parameter is one of the EPOLL_CTL_*
290 constants defined above. The "fd" parameter is the target of the
291 operation. The "event" parameter describes which events the caller
292 is interested in and any associated user data. */
294 epoll_ctl (int __epfd, int __op, int __fd, struct epoll_event *__event);
296 #define EP_INT_MAX ((int)(~0U>>1))
297 #define EP_MAX_EVENTS (EP_INT_MAX / sizeof(struct epoll_event))
299 /* Wait for events on an epoll instance "epfd". Returns the number of
300 triggered events returned in "events" buffer. Or -1 in case of
301 error with the "errno" variable set to the specific error code. The
302 "events" parameter is a buffer that will contain triggered
303 events. The "maxevents" is the maximum number of events to be
304 returned ( usually size of "events" ). The "timeout" parameter
305 specifies the maximum wait time in milliseconds (-1 == infinite).
307 This function is a cancellation point and therefore not marked with
310 epoll_wait (int __epfd, struct epoll_event *__events,
311 int __maxevents, int __timeout);
313 /* Same as epoll_wait, but the thread's signal mask is temporarily
314 and atomically replaced with the one provided as parameter.
316 This function is a cancellation point and therefore not marked with
319 epoll_pwait (int __epfd, struct epoll_event *__events,
320 int __maxevents, int __timeout, const __sigset_t * __ss);
322 /* Poll the file descriptors described by the NFDS structures starting at
323 FDS. If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
324 an event to occur; if TIMEOUT is -1, block until an event occurs.
325 Returns the number of file descriptors with events, zero if timed out,
328 This function is a cancellation point and therefore not marked with
330 extern int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout);
333 /* Like poll, but before waiting the threads signal mask is replaced
334 with that specified in the fourth parameter. For better usability,
335 the timeout value is specified using a TIMESPEC object.
337 This function is a cancellation point and therefore not marked with
339 extern int ppoll (struct pollfd *__fds, nfds_t __nfds,
340 const struct timespec *__timeout, const __sigset_t * __ss);
344 #endif /* included_ldp_glibc_socket_h */
347 * fd.io coding-style-patch-verification: ON
350 * eval: (c-set-style "gnu")