95fb7c810943d494771dd6d5a004dc4a3039acf9
[vpp.git] / src / vcl / ldp_glibc_socket.h
1 /*
2  * Copyright (c) 2017-2019 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:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
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.
14  */
15
16 #ifndef included_ldp_glibc_socket_h
17 #define included_ldp_glibc_socket_h
18
19 #include <sys/types.h>
20 #include <sys/socket.h>
21 #include <sys/select.h>
22 #include <arpa/inet.h>
23 #include <fcntl.h>
24
25 #include <sys/epoll.h>
26
27 #include <signal.h>
28 #include <poll.h>
29
30 /*
31  *
32  * Generic glibc fd api
33  *
34  */
35 /*
36  * glibc APIs from <unistd.h>
37  */
38
39 /* Close the file descriptor FD.
40
41    This function is a cancellation point and therefore not marked with
42    __THROW.  */
43 extern int close (int __fd);
44
45 /* Read NBYTES into BUF from FD.  Return the
46    number read, -1 for errors or 0 for EOF.
47
48    This function is a cancellation point and therefore not marked with
49    __THROW.  */
50 extern ssize_t __wur read (int __fd, void *__buf, size_t __nbytes);
51
52 /* Write N bytes of BUF to FD.  Return the number written, or -1.
53
54    This function is a cancellation point and therefore not marked with
55    __THROW.  */
56 extern ssize_t __wur write (int __fd, const void *__buf, size_t __n);
57
58
59 /*
60  * glibc APIs from <fcntl.h>
61  */
62
63 /* Do the file control operation described by CMD on FD.
64    The remaining arguments are interpreted depending on CMD.
65
66    This function is a cancellation point and therefore not marked with
67    __THROW.  */
68 extern int fcntl (int __fd, int __cmd, ...);
69
70
71 /*
72  * glibc APIs from <sys/select.h>
73  */
74
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.
80
81
82    This function is a cancellation point and therefore not marked with
83    __THROW.  */
84 extern int
85 select (int __nfds, fd_set * __restrict __readfds,
86         fd_set * __restrict __writefds,
87         fd_set * __restrict __exceptfds,
88         struct timeval *__restrict __timeout);
89
90 #ifdef __USE_XOPEN2K
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
93    should be used.
94
95    This function is a cancellation point and therefore not marked with
96    __THROW.  */
97 extern int
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);
103 #endif
104
105
106 /*
107  *
108  * Socket specific glibc api
109  *
110  */
111
112 /*
113  * glibc APIs from <sys/socket.h>
114  */
115
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);
120
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.  */
125 extern int __THROW
126 socketpair (int __domain, int __type, int __protocol, int __fds[2]);
127
128 /* Give the socket FD the local address ADDR (which is LEN bytes long).  */
129 extern int __THROW
130 bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
131
132 /* Put the local address of FD into *ADDR and its length in *LEN.  */
133 extern int __THROW
134 getsockname (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __len);
135
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.
140
141    This function is a cancellation point and therefore not marked with
142    __THROW.  */
143 extern int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);
144
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.  */
147 extern int __THROW
148 getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __len);
149
150 /* Send N bytes of BUF to socket FD.  Returns the number sent or -1.
151
152    This function is a cancellation point and therefore not marked with
153    __THROW.  */
154 extern ssize_t send (int __fd, const void *__buf, size_t __n, int __flags);
155
156 extern ssize_t sendfile (int __out_fd, int __in_fd, off_t * __offset,
157                          size_t __len);
158
159 /* Read N bytes into BUF from socket FD.
160    Returns the number read or -1 for errors.
161
162    This function is a cancellation point and therefore not marked with
163    __THROW.  */
164 extern ssize_t recv (int __fd, void *__buf, size_t __n, int __flags);
165
166 /* Read N bytes into BUF from socket FD with buffer overflow checking.
167    Returns the number read or -1 for errors.
168
169    This function is a cancellation point and therefore not marked with
170    __THROW.  */
171 extern ssize_t __recv_chk (int fd, void *buf, size_t n, size_t buflen,
172                            int flags);
173
174 /* Send N bytes of BUF on socket FD to peer at address ADDR (which is
175    ADDR_LEN bytes long).  Returns the number sent, or -1 for errors.
176
177    This function is a cancellation point and therefore not marked with
178    __THROW.  */
179 extern ssize_t
180 sendto (int __fd, const void *__buf, size_t __n,
181         int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len);
182
183 /* Read N bytes into BUF through socket FD.
184    If ADDR is not NULL, fill in *ADDR_LEN bytes of it with tha address of
185    the sender, and store the actual size of the address in *ADDR_LEN.
186    Returns the number of bytes read or -1 for errors.
187
188    This function is a cancellation point and therefore not marked with
189    __THROW.  */
190 extern ssize_t
191 recvfrom (int __fd, void *__restrict __buf,
192           size_t __n, int __flags,
193           __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
194
195 /* Send a message described MESSAGE on socket FD.
196    Returns the number of bytes sent, or -1 for errors.
197
198    This function is a cancellation point and therefore not marked with
199    __THROW.  */
200 extern ssize_t
201 sendmsg (int __fd, const struct msghdr *__message, int __flags);
202
203 #ifdef __USE_GNU
204 /* Send a VLEN messages as described by VMESSAGES to socket FD.
205    Returns the number of datagrams successfully written or -1 for errors.
206
207    This function is a cancellation point and therefore not marked with
208    __THROW.  */
209 extern int
210 sendmmsg (int __fd, struct mmsghdr *__vmessages,
211           unsigned int __vlen, int __flags);
212 #endif
213
214 /* Receive a message as described by MESSAGE from socket FD.
215    Returns the number of bytes read or -1 for errors.
216
217    This function is a cancellation point and therefore not marked with
218    __THROW.  */
219 extern ssize_t recvmsg (int __fd, struct msghdr *__message, int __flags);
220
221 #ifdef __USE_GNU
222 /* Receive up to VLEN messages as described by VMESSAGES from socket FD.
223    Returns the number of messages received or -1 for errors.
224
225    This function is a cancellation point and therefore not marked with
226    __THROW.  */
227 extern int
228 recvmmsg (int __fd, struct mmsghdr *__vmessages,
229           unsigned int __vlen, int __flags, struct timespec *__tmo);
230 #endif
231
232
233 /* Put the current value for socket FD's option OPTNAME at protocol level LEVEL
234    into OPTVAL (which is *OPTLEN bytes long), and set *OPTLEN to the value's
235    actual length.  Returns 0 on success, -1 for errors.  */
236 extern int __THROW
237 getsockopt (int __fd, int __level, int __optname,
238             void *__restrict __optval, socklen_t * __restrict __optlen);
239
240 /* Set socket FD's option OPTNAME at protocol level LEVEL
241    to *OPTVAL (which is OPTLEN bytes long).
242    Returns 0 on success, -1 for errors.  */
243 extern int __THROW
244 setsockopt (int __fd, int __level, int __optname,
245             const void *__optval, socklen_t __optlen);
246
247 /* Prepare to accept connections on socket FD.
248    N connection requests will be queued before further requests are refused.
249    Returns 0 on success, -1 for errors.  */
250 extern int __THROW listen (int __fd, int __n);
251
252 /* Await a connection on socket FD.
253    When a connection arrives, open a new socket to communicate with it,
254    set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
255    peer and *ADDR_LEN to the address's actual length, and return the
256    new socket's descriptor, or -1 for errors.
257
258    This function is a cancellation point and therefore not marked with
259    __THROW.  */
260 extern int
261 accept (int __fd, __SOCKADDR_ARG __addr, socklen_t * __restrict __addr_len);
262
263 /* Similar to 'accept' but takes an additional parameter to specify flags.
264
265    This function is a cancellation point and therefore not marked with
266    __THROW.  */
267      /* TBD: implemented later */
268 extern int
269 accept4 (int __fd, __SOCKADDR_ARG __addr,
270          socklen_t * __restrict __addr_len, int __flags);
271
272 /* Shut down all or part of the connection open on socket FD.
273    HOW determines what to shut down:
274      SHUT_RD   = No more receptions;
275      SHUT_WR   = No more transmissions;
276      SHUT_RDWR = No more receptions or transmissions.
277    Returns 0 on success, -1 for errors.  */
278 extern int __THROW shutdown (int __fd, int __how);
279
280
281 /*
282  * glibc APIs from <sys/epoll.h>
283  */
284
285 /* Creates an epoll instance.  Returns an fd for the new instance.
286    The "size" parameter is a hint specifying the number of file
287    descriptors to be associated with the new instance.  The fd
288    returned by epoll_create() should be closed with close().  */
289 extern int __THROW epoll_create (int __size);
290
291 /* Same as epoll_create but with an FLAGS parameter.  The unused SIZE
292    parameter has been dropped.  */
293 extern int __THROW epoll_create1 (int __flags);
294
295 /* Manipulate an epoll instance "epfd". Returns 0 in case of success,
296    -1 in case of error ( the "errno" variable will contain the
297    specific error code ) The "op" parameter is one of the EPOLL_CTL_*
298    constants defined above. The "fd" parameter is the target of the
299    operation. The "event" parameter describes which events the caller
300    is interested in and any associated user data.  */
301 extern int __THROW
302 epoll_ctl (int __epfd, int __op, int __fd, struct epoll_event *__event);
303
304 #define EP_INT_MAX ((int)(~0U>>1))
305 #define EP_MAX_EVENTS (EP_INT_MAX / sizeof(struct epoll_event))
306
307 /* Wait for events on an epoll instance "epfd". Returns the number of
308    triggered events returned in "events" buffer. Or -1 in case of
309    error with the "errno" variable set to the specific error code. The
310    "events" parameter is a buffer that will contain triggered
311    events. The "maxevents" is the maximum number of events to be
312    returned ( usually size of "events" ). The "timeout" parameter
313    specifies the maximum wait time in milliseconds (-1 == infinite).
314
315    This function is a cancellation point and therefore not marked with
316    __THROW.  */
317 extern int
318 epoll_wait (int __epfd, struct epoll_event *__events,
319             int __maxevents, int __timeout);
320
321 /* Same as epoll_wait, but the thread's signal mask is temporarily
322    and atomically replaced with the one provided as parameter.
323
324    This function is a cancellation point and therefore not marked with
325    __THROW.  */
326 extern int
327 epoll_pwait (int __epfd, struct epoll_event *__events,
328              int __maxevents, int __timeout, const __sigset_t * __ss);
329
330 /* Poll the file descriptors described by the NFDS structures starting at
331    FDS.  If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
332    an event to occur; if TIMEOUT is -1, block until an event occurs.
333    Returns the number of file descriptors with events, zero if timed out,
334    or -1 for errors.
335
336    This function is a cancellation point and therefore not marked with
337    __THROW.  */
338 extern int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout);
339
340 #ifdef __USE_GNU
341 /* Like poll, but before waiting the threads signal mask is replaced
342    with that specified in the fourth parameter.  For better usability,
343    the timeout value is specified using a TIMESPEC object.
344
345    This function is a cancellation point and therefore not marked with
346    __THROW.  */
347 extern int ppoll (struct pollfd *__fds, nfds_t __nfds,
348                   const struct timespec *__timeout, const __sigset_t * __ss);
349 #endif
350
351
352 #endif /* included_ldp_glibc_socket_h */
353
354 /*
355  * fd.io coding-style-patch-verification: ON
356  *
357  * Local Variables:
358  * eval: (c-set-style "gnu")
359  * End:
360  */