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:
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.
17 * Copyright (c) 2005-2008 Jelmer Vernooij <jelmer@samba.org>
18 * Copyright (C) 2006-2014 Stefan Metzmacher <metze@samba.org>
19 * Copyright (C) 2013-2014 Andreas Schneider <asn@samba.org>
21 * All rights reserved.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
27 * 1. Redistributions of source code must retain the above copyright
28 * notice, this list of conditions and the following disclaimer.
30 * 2. Redistributions in binary form must reproduce the above copyright
31 * notice, this list of conditions and the following disclaimer in the
32 * documentation and/or other materials provided with the distribution.
34 * 3. Neither the name of the author nor the names of its contributors
35 * may be used to endorse or promote products derived from this software
36 * without specific prior written permission.
38 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
39 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
41 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
42 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
43 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
44 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
45 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
46 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
47 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53 Socket wrapper library. Passes all socket communication over
54 unix domain sockets if the environment variable SOCKET_WRAPPER_DIR
58 #ifndef included_ldp_socket_wrapper_h
59 #define included_ldp_socket_wrapper_h
61 #include <sys/types.h>
62 #include <sys/socket.h>
63 #include <sys/ioctl.h>
64 #include <sys/select.h>
65 #include <sys/epoll.h>
72 /* GCC have printf type attribute check. */
73 #ifdef HAVE_FUNCTION_ATTRIBUTE_FORMAT
74 #define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))
76 #define PRINTF_ATTRIBUTE(a,b)
77 #endif /* HAVE_FUNCTION_ATTRIBUTE_FORMAT */
79 #define HAVE_CONSTRUCTOR_ATTRIBUTE
80 #ifdef HAVE_CONSTRUCTOR_ATTRIBUTE
81 #define CONSTRUCTOR_ATTRIBUTE __attribute__ ((constructor))
83 #define CONSTRUCTOR_ATTRIBUTE
84 #endif /* HAVE_CONSTRUCTOR_ATTRIBUTE */
86 #define HAVE_DESTRUCTOR_ATTRIBUTE
87 #ifdef HAVE_DESTRUCTOR_ATTRIBUTE
88 #define DESTRUCTOR_ATTRIBUTE __attribute__ ((destructor))
90 #define DESTRUCTOR_ATTRIBUTE
93 #define HAVE_ADDRESS_SANITIZER_ATTRIBUTE
94 #ifdef HAVE_ADDRESS_SANITIZER_ATTRIBUTE
95 #define DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE __attribute__((no_sanitize_address))
97 #define DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE
103 * Functions especially from libc need to be loaded individually, you can't load
104 * all at once or gdb will segfault at startup. The same applies to valgrind and
105 * has probably something todo with with the linker.
106 * So we need load each function at the point it is called the first time.
108 int libc_accept4 (int sockfd, struct sockaddr *addr, socklen_t * addrlen,
111 int libc_accept (int sockfd, struct sockaddr *addr, socklen_t * addrlen);
113 int libc_bind (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
115 int libc_close (int fd);
117 int libc_connect (int sockfd, const struct sockaddr *addr, socklen_t addrlen);
120 /* TBD: dup and dup2 to be implemented later */
121 int libc_dup (int fd);
123 int libc_dup2 (int oldfd, int newfd);
127 int libc_eventfd (int count, int flags);
130 DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
131 libc_vfcntl (int fd, int cmd, va_list ap);
133 DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
134 libc_vfcntl64 (int fd, int cmd, va_list ap);
136 DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
137 libc_vioctl (int fd, int cmd, va_list ap);
139 int libc_getpeername (int sockfd, struct sockaddr *addr, socklen_t * addrlen);
141 int libc_getsockname (int sockfd, struct sockaddr *addr, socklen_t * addrlen);
144 libc_getsockopt (int sockfd,
145 int level, int optname, void *optval, socklen_t * optlen);
147 int libc_listen (int sockfd, int backlog);
149 int libc_read (int fd, void *buf, size_t count);
151 ssize_t libc_readv (int fd, const struct iovec *iov, int iovcnt);
153 int libc_recv (int sockfd, void *buf, size_t len, int flags);
156 libc_recvfrom (int sockfd,
159 int flags, struct sockaddr *src_addr, socklen_t * addrlen);
161 int libc_recvmsg (int sockfd, struct msghdr *msg, int flags);
163 int libc_send (int sockfd, const void *buf, size_t len, int flags);
165 ssize_t libc_sendfile (int out_fd, int in_fd, off_t * offset, size_t len);
167 int libc_sendmsg (int sockfd, const struct msghdr *msg, int flags);
170 libc_sendto (int sockfd,
173 int flags, const struct sockaddr *dst_addr, socklen_t addrlen);
176 libc_setsockopt (int sockfd,
177 int level, int optname, const void *optval,
180 int libc_socket (int domain, int type, int protocol);
182 int libc_socketpair (int domain, int type, int protocol, int sv[2]);
184 ssize_t libc_write (int fd, const void *buf, size_t count);
186 ssize_t libc_writev (int fd, const struct iovec *iov, int iovcnt);
188 int libc_shutdown (int fd, int how);
191 libc_select (int __nfds, fd_set * __restrict __readfds,
192 fd_set * __restrict __writefds,
193 fd_set * __restrict __exceptfds,
194 struct timeval *__restrict __timeout);
198 libc_pselect (int __nfds, fd_set * __restrict __readfds,
199 fd_set * __restrict __writefds,
200 fd_set * __restrict __exceptfds,
201 const struct timespec *__restrict __timeout,
202 const __sigset_t * __restrict __sigmask);
205 int libc_epoll_create (int __size);
207 int libc_epoll_create1 (int __flags);
209 int libc_epoll_ctl (int __epfd, int __op, int __fd,
210 struct epoll_event *__event);
212 int libc_epoll_wait (int __epfd, struct epoll_event *__events,
213 int __maxevents, int __timeout);
215 int libc_epoll_pwait (int __epfd, struct epoll_event *__events,
216 int __maxevents, int __timeout,
217 const __sigset_t * __ss);
219 int libc_poll (struct pollfd *__fds, nfds_t __nfds, int __timeout);
222 int libc_ppoll (struct pollfd *__fds, nfds_t __nfds,
223 const struct timespec *__timeout, const __sigset_t * __ss);
226 void swrap_constructor (void);
228 void swrap_destructor (void);
230 #endif /* included_ldp_socket_wrapper_h */
233 * fd.io coding-style-patch-verification: ON
236 * eval: (c-set-style "gnu")