mirror of
https://github.com/samba-team/samba.git
synced 2025-01-18 06:04:06 +03:00
lib: Change socket_wrapper to preloadable version.
This imports socket_wrapper 1.0.1. Signed-off-by: Andreas Schneider <asn@samba.org> Reviewed-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
parent
d407446ddc
commit
00288191bf
@ -1,5 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
`dirname $0`/configure -C \
|
`dirname $0`/configure -C \
|
||||||
--enable-developer \
|
--enable-developer \
|
||||||
--enable-socket-wrapper \
|
|
||||||
"$@"
|
"$@"
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,177 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) Jelmer Vernooij 2005 <jelmer@samba.org>
|
|
||||||
* Copyright (C) Stefan Metzmacher 2006 <metze@samba.org>
|
|
||||||
*
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* 1. Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* 3. Neither the name of the author nor the names of its contributors
|
|
||||||
* may be used to endorse or promote products derived from this software
|
|
||||||
* without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
||||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
||||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
||||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
||||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
||||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
||||||
* SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __SOCKET_WRAPPER_H__
|
|
||||||
#define __SOCKET_WRAPPER_H__
|
|
||||||
|
|
||||||
const char *socket_wrapper_dir(void);
|
|
||||||
unsigned int socket_wrapper_default_iface(void);
|
|
||||||
int swrap_socket(int family, int type, int protocol);
|
|
||||||
int swrap_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
|
|
||||||
int swrap_connect(int s, const struct sockaddr *serv_addr, socklen_t addrlen);
|
|
||||||
int swrap_bind(int s, const struct sockaddr *myaddr, socklen_t addrlen);
|
|
||||||
int swrap_listen(int s, int backlog);
|
|
||||||
int swrap_getpeername(int s, struct sockaddr *name, socklen_t *addrlen);
|
|
||||||
int swrap_getsockname(int s, struct sockaddr *name, socklen_t *addrlen);
|
|
||||||
int swrap_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
|
|
||||||
int swrap_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
|
|
||||||
ssize_t swrap_recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
|
|
||||||
ssize_t swrap_sendto(int s, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
|
|
||||||
ssize_t swrap_sendmsg(int s, const struct msghdr *msg, int flags);
|
|
||||||
ssize_t swrap_recvmsg(int s, struct msghdr *msg, int flags);
|
|
||||||
int swrap_ioctl(int s, int req, void *ptr);
|
|
||||||
ssize_t swrap_recv(int s, void *buf, size_t len, int flags);
|
|
||||||
ssize_t swrap_read(int s, void *buf, size_t len);
|
|
||||||
ssize_t swrap_send(int s, const void *buf, size_t len, int flags);
|
|
||||||
int swrap_readv(int s, const struct iovec *vector, size_t count);
|
|
||||||
ssize_t swrap_writev(int s, const struct iovec *vector, size_t count);
|
|
||||||
int swrap_close(int);
|
|
||||||
int swrap_dup(int oldfd);
|
|
||||||
int swrap_dup2(int oldfd, int newfd);
|
|
||||||
|
|
||||||
#ifdef SOCKET_WRAPPER_REPLACE
|
|
||||||
|
|
||||||
#ifdef accept
|
|
||||||
#undef accept
|
|
||||||
#endif
|
|
||||||
#define accept(s,addr,addrlen) swrap_accept(s,addr,addrlen)
|
|
||||||
|
|
||||||
#ifdef connect
|
|
||||||
#undef connect
|
|
||||||
#endif
|
|
||||||
#define connect(s,serv_addr,addrlen) swrap_connect(s,serv_addr,addrlen)
|
|
||||||
|
|
||||||
#ifdef bind
|
|
||||||
#undef bind
|
|
||||||
#endif
|
|
||||||
#define bind(s,myaddr,addrlen) swrap_bind(s,myaddr,addrlen)
|
|
||||||
|
|
||||||
#ifdef listen
|
|
||||||
#undef listen
|
|
||||||
#endif
|
|
||||||
#define listen(s,blog) swrap_listen(s,blog)
|
|
||||||
|
|
||||||
#ifdef getpeername
|
|
||||||
#undef getpeername
|
|
||||||
#endif
|
|
||||||
#define getpeername(s,name,addrlen) swrap_getpeername(s,name,addrlen)
|
|
||||||
|
|
||||||
#ifdef getsockname
|
|
||||||
#undef getsockname
|
|
||||||
#endif
|
|
||||||
#define getsockname(s,name,addrlen) swrap_getsockname(s,name,addrlen)
|
|
||||||
|
|
||||||
#ifdef getsockopt
|
|
||||||
#undef getsockopt
|
|
||||||
#endif
|
|
||||||
#define getsockopt(s,level,optname,optval,optlen) swrap_getsockopt(s,level,optname,optval,optlen)
|
|
||||||
|
|
||||||
#ifdef setsockopt
|
|
||||||
#undef setsockopt
|
|
||||||
#endif
|
|
||||||
#define setsockopt(s,level,optname,optval,optlen) swrap_setsockopt(s,level,optname,optval,optlen)
|
|
||||||
|
|
||||||
#ifdef recvfrom
|
|
||||||
#undef recvfrom
|
|
||||||
#endif
|
|
||||||
#define recvfrom(s,buf,len,flags,from,fromlen) swrap_recvfrom(s,buf,len,flags,from,fromlen)
|
|
||||||
|
|
||||||
#ifdef sendto
|
|
||||||
#undef sendto
|
|
||||||
#endif
|
|
||||||
#define sendto(s,buf,len,flags,to,tolen) swrap_sendto(s,buf,len,flags,to,tolen)
|
|
||||||
|
|
||||||
#ifdef sendmsg
|
|
||||||
#undef sendmsg
|
|
||||||
#endif
|
|
||||||
#define sendmsg(s,msg,flags) swrap_sendmsg(s,msg,flags)
|
|
||||||
|
|
||||||
#ifdef recvmsg
|
|
||||||
#undef recvmsg
|
|
||||||
#endif
|
|
||||||
#define recvmsg(s,msg,flags) swrap_recvmsg(s,msg,flags)
|
|
||||||
|
|
||||||
#ifdef ioctl
|
|
||||||
#undef ioctl
|
|
||||||
#endif
|
|
||||||
#define ioctl(s,req,ptr) swrap_ioctl(s,req,ptr)
|
|
||||||
|
|
||||||
#ifdef recv
|
|
||||||
#undef recv
|
|
||||||
#endif
|
|
||||||
#define recv(s,buf,len,flags) swrap_recv(s,buf,len,flags)
|
|
||||||
|
|
||||||
#ifdef read
|
|
||||||
#undef read
|
|
||||||
#endif
|
|
||||||
#define read(s,buf,len) swrap_read(s,buf,len)
|
|
||||||
|
|
||||||
#ifdef send
|
|
||||||
#undef send
|
|
||||||
#endif
|
|
||||||
#define send(s,buf,len,flags) swrap_send(s,buf,len,flags)
|
|
||||||
|
|
||||||
#ifdef readv
|
|
||||||
#undef readv
|
|
||||||
#endif
|
|
||||||
#define readv(s, vector, count) swrap_readv(s,vector, count)
|
|
||||||
|
|
||||||
#ifdef writev
|
|
||||||
#undef writev
|
|
||||||
#endif
|
|
||||||
#define writev(s, vector, count) swrap_writev(s,vector, count)
|
|
||||||
|
|
||||||
#ifdef socket
|
|
||||||
#undef socket
|
|
||||||
#endif
|
|
||||||
#define socket(domain,type,protocol) swrap_socket(domain,type,protocol)
|
|
||||||
|
|
||||||
#ifdef close
|
|
||||||
#undef close
|
|
||||||
#endif
|
|
||||||
#define close(s) swrap_close(s)
|
|
||||||
|
|
||||||
#ifdef dup
|
|
||||||
#undef dup
|
|
||||||
#endif
|
|
||||||
#define dup(s) swrap_dup(s)
|
|
||||||
|
|
||||||
#ifdef dup2
|
|
||||||
#undef dup2
|
|
||||||
#endif
|
|
||||||
#define dup2(s, s2) swrap_dup2(s, s2)
|
|
||||||
|
|
||||||
#endif /* SOCKET_WRAPPER_REPLACE */
|
|
||||||
#endif /* __SOCKET_WRAPPER_H__ */
|
|
@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
Unix SMB/CIFS implementation.
|
|
||||||
|
|
||||||
local testing of the socket wrapper
|
|
||||||
|
|
||||||
Copyright (C) Jelmer Vernooij 2007
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "includes.h"
|
|
||||||
#include "system/network.h"
|
|
||||||
#include "../socket_wrapper/socket_wrapper.h"
|
|
||||||
#include "torture/torture.h"
|
|
||||||
#include "torture/local/proto.h"
|
|
||||||
|
|
||||||
static char *old_dir = NULL;
|
|
||||||
static char *old_iface = NULL;
|
|
||||||
|
|
||||||
static void backup_env(void)
|
|
||||||
{
|
|
||||||
old_dir = getenv("SOCKET_WRAPPER_DIR");
|
|
||||||
old_iface = getenv("SOCKET_WRAPPER_DEFAULT_IFACE");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void restore_env(void)
|
|
||||||
{
|
|
||||||
if (old_dir == NULL)
|
|
||||||
unsetenv("SOCKET_WRAPPER_DIR");
|
|
||||||
else
|
|
||||||
setenv("SOCKET_WRAPPER_DIR", old_dir, 1);
|
|
||||||
if (old_iface == NULL)
|
|
||||||
unsetenv("SOCKET_WRAPPER_DEFAULT_IFACE");
|
|
||||||
else
|
|
||||||
setenv("SOCKET_WRAPPER_DEFAULT_IFACE", old_iface, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool test_socket_wrapper_dir(struct torture_context *tctx)
|
|
||||||
{
|
|
||||||
backup_env();
|
|
||||||
|
|
||||||
setenv("SOCKET_WRAPPER_DIR", "foo", 1);
|
|
||||||
torture_assert_str_equal(tctx, socket_wrapper_dir(), "foo", "setting failed");
|
|
||||||
setenv("SOCKET_WRAPPER_DIR", "./foo", 1);
|
|
||||||
torture_assert_str_equal(tctx, socket_wrapper_dir(), "foo", "setting failed");
|
|
||||||
unsetenv("SOCKET_WRAPPER_DIR");
|
|
||||||
torture_assert_str_equal(tctx, socket_wrapper_dir(), NULL, "resetting failed");
|
|
||||||
|
|
||||||
restore_env();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool test_swrap_socket(struct torture_context *tctx)
|
|
||||||
{
|
|
||||||
backup_env();
|
|
||||||
setenv("SOCKET_WRAPPER_DIR", "foo", 1);
|
|
||||||
|
|
||||||
torture_assert_int_equal(tctx, swrap_socket(1337, 1337, 0), -1, "unknown address family fails");
|
|
||||||
torture_assert_int_equal(tctx, errno, EAFNOSUPPORT, "correct errno set");
|
|
||||||
torture_assert_int_equal(tctx, swrap_socket(AF_INET, 1337, 0), -1, "unknown type fails");
|
|
||||||
torture_assert_int_equal(tctx, errno, EPROTONOSUPPORT, "correct errno set");
|
|
||||||
torture_assert_int_equal(tctx, swrap_socket(AF_INET, SOCK_DGRAM, 10), -1, "unknown protocol fails");
|
|
||||||
torture_assert_int_equal(tctx, errno, EPROTONOSUPPORT, "correct errno set");
|
|
||||||
|
|
||||||
restore_env();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int socket_wrapper_default_iface(void);
|
|
||||||
static bool test_socket_wrapper_default_iface(struct torture_context *tctx)
|
|
||||||
{
|
|
||||||
backup_env();
|
|
||||||
unsetenv("SOCKET_WRAPPER_DEFAULT_IFACE");
|
|
||||||
torture_assert_int_equal(tctx, socket_wrapper_default_iface(), 1, "unset");
|
|
||||||
setenv("SOCKET_WRAPPER_DEFAULT_IFACE", "2", 1);
|
|
||||||
torture_assert_int_equal(tctx, socket_wrapper_default_iface(), 2, "unset");
|
|
||||||
setenv("SOCKET_WRAPPER_DEFAULT_IFACE", "bla", 1);
|
|
||||||
torture_assert_int_equal(tctx, socket_wrapper_default_iface(), 1, "unset");
|
|
||||||
restore_env();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct torture_suite *torture_local_socket_wrapper(TALLOC_CTX *mem_ctx)
|
|
||||||
{
|
|
||||||
struct torture_suite *suite = torture_suite_create(mem_ctx,
|
|
||||||
"socket-wrapper");
|
|
||||||
|
|
||||||
torture_suite_add_simple_test(suite, "socket_wrapper_dir", test_socket_wrapper_dir);
|
|
||||||
torture_suite_add_simple_test(suite, "socket", test_swrap_socket);
|
|
||||||
torture_suite_add_simple_test(suite, "socket_wrapper_default_iface", test_socket_wrapper_default_iface);
|
|
||||||
|
|
||||||
return suite;
|
|
||||||
}
|
|
@ -1,15 +1,83 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
import Options
|
import os
|
||||||
|
|
||||||
def set_options(opt):
|
VERSION="1.0.0"
|
||||||
gr = opt.option_group('developer options')
|
|
||||||
gr.add_option('--enable-socket-wrapper',
|
|
||||||
help=("Turn on socket wrapper library (default=no)"),
|
|
||||||
action="store_true", dest='enable_socket_wrapper', default=False)
|
|
||||||
|
|
||||||
def configure(conf):
|
def configure(conf):
|
||||||
if (Options.options.enable_socket_wrapper or Options.options.developer or Options.options.enable_selftest):
|
if conf.CHECK_BUNDLED_SYSTEM('socket_wrapper', minversion=VERSION, set_target=False):
|
||||||
conf.DEFINE('SOCKET_WRAPPER', 1)
|
conf.DEFINE('USING_SYSTEM_SOCKET_WRAPPER', 1)
|
||||||
conf.ADD_GLOBAL_DEPENDENCY('socket_wrapper')
|
libsocket_wrapper_so_path = 'libsocket_wrapper.so'
|
||||||
|
else:
|
||||||
|
# check HAVE_GCC_THREAD_LOCAL_STORAGE
|
||||||
|
conf.CHECK_CODE('''
|
||||||
|
__thread int tls;
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
''',
|
||||||
|
'HAVE_GCC_THREAD_LOCAL_STORAGE',
|
||||||
|
addmain=False,
|
||||||
|
msg='Checking for thread local storage')
|
||||||
|
|
||||||
|
# check HAVE_DESTRUCTOR_ATTRIBUTE
|
||||||
|
conf.CHECK_CODE('''
|
||||||
|
void test_destructor_attribute(void) __attribute__ ((destructor));
|
||||||
|
|
||||||
|
void test_destructor_attribute(void)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
''',
|
||||||
|
'HAVE_DESTRUCTOR_ATTRIBUTE',
|
||||||
|
addmain=False,
|
||||||
|
msg='Checking for library destructor support')
|
||||||
|
|
||||||
|
conf.CHECK_HEADERS('sys/signalfd.h')
|
||||||
|
conf.CHECK_HEADERS('sys/eventfd.h')
|
||||||
|
conf.CHECK_HEADERS('sys/timerfd.h')
|
||||||
|
|
||||||
|
conf.CHECK_STRUCTURE_MEMBER('struct msghdr',
|
||||||
|
'msg_control',
|
||||||
|
headers='sys/types.h sys/socket.h',
|
||||||
|
define='HAVE_STRUCT_MSGHDR_MSG_CONTROL')
|
||||||
|
|
||||||
|
conf.CHECK_FUNCS('getaddrinfo')
|
||||||
|
conf.CHECK_FUNCS('signalfd eventfd timerfd_create')
|
||||||
|
|
||||||
|
conf.CHECK_FUNCS_IN('bind',
|
||||||
|
'socket',
|
||||||
|
checklibc=True,
|
||||||
|
headers='sys/types.h sys/socket.h')
|
||||||
|
|
||||||
|
conf.CHECK_C_PROTOTYPE('accept',
|
||||||
|
'int accept(int s, struct sockaddr *addr, Psocklen_t addrlen)',
|
||||||
|
define='HAVE_ACCEPT_PSOCKLEN_T', headers='sys/types.h sys/socket.h')
|
||||||
|
|
||||||
|
conf.CHECK_C_PROTOTYPE('ioctl',
|
||||||
|
'int ioctl(int s, int r, ...)',
|
||||||
|
define='HAVE_IOCTL_INT', headers='unistd.h sys/ioctl.h')
|
||||||
|
|
||||||
|
# Create full path to socket_wrapper
|
||||||
|
srcdir = os.path.realpath(conf.srcdir)
|
||||||
|
libsocket_wrapper_so_path = srcdir + '/bin/default/lib/socket_wrapper/libsocket-wrapper.so'
|
||||||
|
|
||||||
|
conf.DEFINE('LIBSOCKET_WRAPPER_SO_PATH', libsocket_wrapper_so_path)
|
||||||
|
conf.DEFINE('SOCKET_WRAPPER', 1)
|
||||||
|
|
||||||
|
def build(bld):
|
||||||
|
if not bld.CONFIG_SET("USING_SYSTEM_SOCKET_WRAPPER"):
|
||||||
|
# We need to do it this way or the library wont work.
|
||||||
|
# Using private_library=True will add symbol version which
|
||||||
|
# breaks preloading!
|
||||||
|
bld.SAMBA_LIBRARY('socket_wrapper',
|
||||||
|
source='socket_wrapper.c',
|
||||||
|
cflags='-DNDEBUG',
|
||||||
|
deps='dl',
|
||||||
|
install=False,
|
||||||
|
realname='libsocket-wrapper.so')
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
bld.SAMBA_LIBRARY('socket_wrapper',
|
|
||||||
source='socket_wrapper.c',
|
|
||||||
group='base_libraries',
|
|
||||||
private_library=True,
|
|
||||||
allow_warnings=True,
|
|
||||||
enabled=bld.CONFIG_SET('SOCKET_WRAPPER'),
|
|
||||||
deps='replace')
|
|
||||||
|
|
||||||
bld.SAMBA_PYTHON('py_socket_wrapper',
|
|
||||||
source='py_socket_wrapper.c',
|
|
||||||
deps='socket_wrapper',
|
|
||||||
enabled=bld.CONFIG_SET('SOCKET_WRAPPER'),
|
|
||||||
public_deps='talloc pytalloc-util',
|
|
||||||
realname='samba/socket_wrapper.so')
|
|
||||||
|
|
||||||
if bld.CONFIG_SET('SOCKET_WRAPPER'):
|
|
||||||
bld.SAMBA_SCRIPT('python_socket',
|
|
||||||
pattern='socket.py',
|
|
||||||
installdir='python',
|
|
||||||
installname='samba/socket.py')
|
|
1
wscript
1
wscript
@ -40,7 +40,6 @@ def set_options(opt):
|
|||||||
opt.RECURSE('lib/ntdb')
|
opt.RECURSE('lib/ntdb')
|
||||||
opt.RECURSE('selftest')
|
opt.RECURSE('selftest')
|
||||||
opt.RECURSE('source4/lib/tls')
|
opt.RECURSE('source4/lib/tls')
|
||||||
opt.RECURSE('lib/socket_wrapper')
|
|
||||||
opt.RECURSE('pidl')
|
opt.RECURSE('pidl')
|
||||||
opt.RECURSE('source3')
|
opt.RECURSE('source3')
|
||||||
opt.RECURSE('lib/util')
|
opt.RECURSE('lib/util')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user