2010-03-28 01:48:49 +03:00
#!/usr/bin/env python
2010-04-04 05:00:42 +04:00
APPNAME = 'libreplace'
VERSION = '1.2.1'
2018-02-02 17:34:31 +03:00
import sys
import os
2010-04-04 05:00:42 +04:00
# find the buildtools directory
2018-02-02 17:34:31 +03:00
top = '.'
while not os.path.exists(top+'/buildtools') and len(top.split('/')) < 5:
top = top + '/..'
sys.path.insert(0, top + '/buildtools/wafsamba')
out = 'bin'
2010-04-04 05:00:42 +04:00
2018-02-02 17:34:31 +03:00
import wafsamba
from wafsamba import samba_dist
from waflib import Options, Utils, Logs, Context
2010-02-20 08:25:37 +03:00
2015-03-25 14:13:40 +03:00
samba_dist.DIST_DIRS('lib/replace buildtools:buildtools third_party/waf:third_party/waf')
2010-04-04 05:00:42 +04:00
2018-02-02 17:34:31 +03:00
def options(opt):
2010-03-28 08:42:28 +04:00
opt.BUILTIN_DEFAULT('NONE')
2010-10-24 01:26:43 +04:00
opt.PRIVATE_EXTENSION_DEFAULT('')
2010-04-04 07:08:05 +04:00
opt.RECURSE('buildtools/wafsamba')
2010-02-20 08:25:37 +03:00
2015-11-05 04:06:42 +03:00
@Utils.run_once
2010-02-20 08:25:37 +03:00
def configure(conf):
2010-04-04 07:08:05 +04:00
conf.RECURSE('buildtools/wafsamba')
2010-03-19 11:56:08 +03:00
2010-10-30 17:59:14 +04:00
conf.env.standalone_replace = conf.IN_LAUNCH_DIR()
2022-08-02 08:55:46 +03:00
if sys.platform.rfind('linux') > -1:
conf.DEFINE('LINUX', '1')
2020-10-18 17:24:08 +03:00
conf.DEFINE('BOOL_DEFINED', 1)
2011-10-13 07:07:52 +04:00
conf.DEFINE('HAVE_LIBREPLACE', 1)
2010-02-24 09:38:12 +03:00
conf.DEFINE('LIBREPLACE_NETWORK_CHECKS', 1)
2010-02-20 08:25:37 +03:00
2011-02-02 12:40:06 +03:00
conf.CHECK_HEADERS('linux/types.h crypt.h locale.h acl/libacl.h compat.h')
2010-02-23 03:54:31 +03:00
conf.CHECK_HEADERS('acl/libacl.h attr/xattr.h compat.h ctype.h dustat.h')
2010-04-12 10:40:54 +04:00
conf.CHECK_HEADERS('fcntl.h fnmatch.h glob.h history.h krb5.h langinfo.h')
2019-10-04 11:40:18 +03:00
conf.CHECK_HEADERS('locale.h ndir.h pwd.h')
2010-03-23 01:29:51 +03:00
conf.CHECK_HEADERS('shadow.h sys/acl.h')
2012-06-16 17:37:52 +04:00
conf.CHECK_HEADERS('sys/attributes.h attr/attributes.h sys/capability.h sys/dir.h sys/epoll.h')
2013-07-23 01:23:33 +04:00
conf.CHECK_HEADERS('port.h')
2019-02-07 00:53:00 +03:00
conf.CHECK_HEADERS('sys/fcntl.h sys/filio.h sys/filsys.h sys/fs/s5param.h')
2010-02-23 03:54:31 +03:00
conf.CHECK_HEADERS('sys/id.h sys/ioctl.h sys/ipc.h sys/mman.h sys/mode.h sys/ndir.h sys/priv.h')
conf.CHECK_HEADERS('sys/resource.h sys/security.h sys/shm.h sys/statfs.h sys/statvfs.h sys/termio.h')
2010-05-30 23:44:14 +04:00
conf.CHECK_HEADERS('sys/vfs.h sys/xattr.h termio.h termios.h sys/file.h')
2014-06-30 17:15:37 +04:00
conf.CHECK_HEADERS('sys/ucontext.h sys/wait.h sys/stat.h')
2014-06-30 17:46:21 +04:00
if not conf.CHECK_DECLS('malloc', headers='stdlib.h'):
conf.CHECK_HEADERS('malloc.h')
2014-06-30 17:15:37 +04:00
conf.CHECK_HEADERS('grp.h')
2010-02-20 08:25:37 +03:00
conf.CHECK_HEADERS('sys/select.h setjmp.h utime.h sys/syslog.h syslog.h')
2010-03-24 04:56:30 +03:00
conf.CHECK_HEADERS('stdarg.h vararg.h sys/mount.h mntent.h')
2010-02-20 08:25:37 +03:00
conf.CHECK_HEADERS('stropts.h unix.h string.h strings.h sys/param.h limits.h')
2010-03-23 20:48:32 +03:00
conf.CHECK_HEADERS('''sys/socket.h netinet/in.h netdb.h arpa/inet.h netinet/in_systm.h
netinet/ip.h netinet/tcp.h netinet/in_ip.h
sys/sockio.h sys/un.h''', together=True)
2010-02-20 08:25:37 +03:00
conf.CHECK_HEADERS('sys/uio.h ifaddrs.h direct.h dirent.h')
conf.CHECK_HEADERS('windows.h winsock2.h ws2tcpip.h')
2013-08-02 00:28:05 +04:00
conf.CHECK_HEADERS('errno.h')
2015-03-13 00:12:43 +03:00
conf.CHECK_HEADERS('getopt.h iconv.h')
2013-12-17 18:32:01 +04:00
conf.CHECK_HEADERS('memory.h nss.h sasl/sasl.h')
2022-08-08 16:23:29 +03:00
conf.CHECK_HEADERS('linux/openat2.h')
2013-12-17 18:32:01 +04:00
conf.CHECK_FUNCS_IN('inotify_init', 'inotify', checklibc=True,
headers='sys/inotify.h')
2012-09-11 14:49:14 +04:00
conf.CHECK_HEADERS('security/pam_appl.h zlib.h asm/unistd.h')
2020-02-07 13:02:18 +03:00
conf.CHECK_HEADERS('sys/unistd.h alloca.h float.h')
2018-01-16 19:48:10 +03:00
conf.SET_TARGET_TYPE('tirpc', 'EMPTY')
2018-03-15 19:46:39 +03:00
if conf.CHECK_CODE(
'\n#ifndef _TIRPC_RPC_H\n#error "no tirpc headers in system path"\n#endif\n',
'HAVE_RPC_RPC_HEADERS',
headers=['rpc/rpc.h', 'rpc/nettype.h'],
msg='Checking for tirpc rpc headers in default system path'):
if conf.CONFIG_SET('HAVE_RPC_RPC_H'):
conf.undefine('HAVE_RPC_RPC_H')
2018-01-16 19:48:10 +03:00
if not conf.CONFIG_SET('HAVE_RPC_RPC_H'):
2018-01-19 16:30:20 +03:00
if conf.CHECK_CFG(package='libtirpc', args='--cflags --libs',
2018-01-16 19:48:10 +03:00
msg='Checking for libtirpc headers',
uselib_store='TIRPC'):
conf.CHECK_HEADERS('rpc/rpc.h rpc/nettype.h', lib='tirpc', together=True)
conf.SET_TARGET_TYPE('tirpc', 'SYSLIB')
if not conf.CONFIG_SET('HAVE_RPC_RPC_H'):
if conf.CHECK_CFG(package='libntirpc', args='--cflags',
msg='Checking for libntirpc headers',
uselib_store='TIRPC'):
conf.CHECK_HEADERS('rpc/rpc.h rpc/nettype.h', lib='tirpc', together=True)
conf.SET_TARGET_TYPE('tirpc', 'SYSLIB')
if not conf.CONFIG_SET('HAVE_RPC_RPC_H'):
2018-02-26 16:07:28 +03:00
Logs.warn('No rpc/rpc.h header found, tirpc or libntirpc missing?')
2018-01-16 19:48:10 +03:00
2019-10-02 15:27:41 +03:00
# This file is decprecated with glibc >= 2.30 so we need to check if it
# includes a deprecation warning:
# #warning "The <sys/sysctl.h> header is deprecated and will be removed."
conf.CHECK_CODE('''
#include <sys/sysctl.h>
int main(void) { return 0; }
''',
define='HAVE_SYS_SYSCTL_H',
cflags=['-Werror=cpp'],
addmain=False,
msg='Checking for header sys/sysctl.h')
2010-03-23 23:58:44 +03:00
conf.CHECK_HEADERS('sys/fileio.h sys/filesys.h sys/dustat.h sys/sysmacros.h')
2012-10-23 10:14:43 +04:00
conf.CHECK_HEADERS('xfs/libxfs.h netgroup.h')
2018-06-21 13:46:48 +03:00
conf.CHECK_HEADERS('valgrind.h valgrind/valgrind.h')
conf.CHECK_HEADERS('valgrind/memcheck.h valgrind/helgrind.h')
2010-03-23 23:58:44 +03:00
conf.CHECK_HEADERS('nss_common.h nsswitch.h ns_api.h')
conf.CHECK_HEADERS('sys/extattr.h sys/ea.h sys/proplist.h sys/cdefs.h')
2014-06-30 15:52:02 +04:00
conf.CHECK_HEADERS('utmp.h utmpx.h lastlog.h')
2010-03-23 23:58:44 +03:00
conf.CHECK_HEADERS('syscall.h sys/syscall.h inttypes.h')
2018-06-21 15:17:35 +03:00
conf.CHECK_HEADERS('sys/atomic.h stdatomic.h')
2015-03-23 21:37:05 +03:00
conf.CHECK_HEADERS('libgen.h')
2010-02-20 08:25:37 +03:00
2017-06-22 17:07:27 +03:00
if conf.CHECK_CFLAGS('-Wno-format-truncation'):
conf.define('HAVE_WNO_FORMAT_TRUNCATION', '1')
2017-11-19 14:33:03 +03:00
if conf.CHECK_CFLAGS('-Wno-unused-function'):
conf.define('HAVE_WNO_UNUSED_FUNCTION', '1')
2018-03-23 18:27:00 +03:00
if conf.CHECK_CFLAGS('-Wno-strict-overflow'):
conf.define('HAVE_WNO_STRICT_OVERFLOW', '1')
2022-06-01 12:56:19 +03:00
if conf.CHECK_CFLAGS('-Wuse-after-free=1'):
conf.define('HAVE_WUSE_AFTER_FREE_1', '1')
2013-02-25 13:02:35 +04:00
# Check for process set name support
conf.CHECK_CODE('''
#include <sys/prctl.h>
int main(void) {
prctl(0);
return 0;
}
''',
'HAVE_PRCTL',
2019-09-06 07:37:33 +03:00
addmain=False,
2013-02-25 13:02:35 +04:00
headers='sys/prctl.h',
msg='Checking for prctl syscall')
2013-01-12 19:08:07 +04:00
conf.CHECK_CODE('''
#include <unistd.h>
#ifdef HAVE_FCNTL_H
#include <fcntl.h>
#endif
int main(void) { int fd = open("/dev/null", O_DIRECT); }
''',
define='HAVE_OPEN_O_DIRECT',
addmain=False,
msg='Checking for O_DIRECT flag to open(2)')
2010-09-11 10:42:10 +04:00
conf.CHECK_TYPES('"long long" intptr_t uintptr_t ptrdiff_t comparison_fn_t')
2022-10-27 09:32:20 +03:00
if not conf.CHECK_TYPE('bool', define='HAVE_BOOL', headers='stdbool.h'):
2022-03-22 06:12:00 +03:00
raise Errors.WafError('Samba requires a genuine boolean type')
2010-02-20 08:25:37 +03:00
conf.CHECK_TYPE('int8_t', 'char')
2010-11-03 19:34:35 +03:00
conf.CHECK_TYPE('uint8_t', 'unsigned char')
2010-02-20 08:25:37 +03:00
conf.CHECK_TYPE('int16_t', 'short')
conf.CHECK_TYPE('uint16_t', 'unsigned short')
conf.CHECK_TYPE('int32_t', 'int')
conf.CHECK_TYPE('uint32_t', 'unsigned')
conf.CHECK_TYPE('int64_t', 'long long')
conf.CHECK_TYPE('uint64_t', 'unsigned long long')
conf.CHECK_TYPE('size_t', 'unsigned int')
conf.CHECK_TYPE('ssize_t', 'int')
conf.CHECK_TYPE('ino_t', 'unsigned')
conf.CHECK_TYPE('loff_t', 'off_t')
2010-03-07 07:31:04 +03:00
conf.CHECK_TYPE('offset_t', 'loff_t')
2010-03-07 07:52:45 +03:00
conf.CHECK_TYPE('volatile int', define='HAVE_VOLATILE')
2010-03-21 14:12:27 +03:00
conf.CHECK_TYPE('uint_t', 'unsigned int')
2012-04-10 02:31:23 +04:00
conf.CHECK_TYPE('blksize_t', 'long', headers='sys/types.h sys/stat.h unistd.h')
conf.CHECK_TYPE('blkcnt_t', 'long', headers='sys/types.h sys/stat.h unistd.h')
2010-02-20 08:25:37 +03:00
2010-11-28 16:55:28 +03:00
conf.CHECK_SIZEOF('bool char int "long long" long short size_t ssize_t')
2010-11-03 19:40:39 +03:00
conf.CHECK_SIZEOF('int8_t uint8_t int16_t uint16_t int32_t uint32_t int64_t uint64_t')
2010-11-03 19:40:12 +03:00
conf.CHECK_SIZEOF('void*', define='SIZEOF_VOID_P')
conf.CHECK_SIZEOF('off_t dev_t ino_t time_t')
2010-03-23 04:20:11 +03:00
conf.CHECK_TYPES('socklen_t', headers='sys/socket.h')
2010-02-20 08:25:37 +03:00
conf.CHECK_TYPE_IN('struct ifaddrs', 'ifaddrs.h')
conf.CHECK_TYPE_IN('struct addrinfo', 'netdb.h')
conf.CHECK_TYPE_IN('struct sockaddr', 'sys/socket.h')
2010-03-23 01:29:51 +03:00
conf.CHECK_CODE('struct sockaddr_in6 x', define='HAVE_STRUCT_SOCKADDR_IN6',
headers='sys/socket.h netdb.h netinet/in.h')
2010-03-07 14:52:58 +03:00
conf.CHECK_TYPE_IN('struct sockaddr_storage', 'sys/socket.h')
conf.CHECK_TYPE_IN('sa_family_t', 'sys/socket.h')
conf.CHECK_TYPE_IN('sig_atomic_t', 'signal.h', define='HAVE_SIG_ATOMIC_T_TYPE')
2015-06-10 15:33:35 +03:00
conf.CHECK_FUNCS('sigsetmask siggetmask sigprocmask sigblock sigaction sigset')
2010-03-07 14:52:58 +03:00
2019-10-21 18:08:08 +03:00
# Those functions are normally available in libc
if not conf.CHECK_FUNCS('''
inet_ntoa
inet_aton
inet_ntop
inet_pton
connect
gethostbyname
getaddrinfo
getnameinfo
freeaddrinfo
gai_strerror
socketpair''',
headers='sys/socket.h netinet/in.h arpa/inet.h netdb.h'):
conf.CHECK_FUNCS_IN('''
inet_ntoa
inet_aton
inet_ntop
inet_pton
connect
gethostbyname
getaddrinfo
getnameinfo
freeaddrinfo
gai_strerror
socketpair''',
'socket nsl',
headers='sys/socket.h netinet/in.h arpa/inet.h netdb.h')
conf.DEFINE('REPLACE_REQUIRES_LIBSOCKET_LIBNSL', 1)
2010-03-20 09:51:55 +03:00
2018-10-10 17:05:46 +03:00
conf.CHECK_FUNCS('memset_s memset_explicit')
conf.CHECK_CODE('''
#include <string.h>
int main(void)
{
char buf[] = "This is some content";
memset(buf, '\0', sizeof(buf)); __asm__ volatile("" : : "g"(&buf) : "memory");
return 0;
}
''',
define='HAVE_GCC_VOLATILE_MEMORY_PROTECTION',
addmain=False,
msg='Checking for volatile memory protection',
local_include=False)
2010-04-24 21:28:48 +04:00
# Some old Linux systems have broken header files and
# miss the IPV6_V6ONLY define in netinet/in.h,
# but have it in linux/in6.h.
# We can't include both files so we just check if the value
# if defined and do the replacement in system/network.h
if not conf.CHECK_VARIABLE('IPV6_V6ONLY',
headers='sys/socket.h netdb.h netinet/in.h'):
conf.CHECK_CODE('''
#include <linux/in6.h>
#if (IPV6_V6ONLY != 26)
#error no IPV6_V6ONLY support on linux
#endif
int main(void) { return IPV6_V6ONLY; }
''',
define='HAVE_LINUX_IPV6_V6ONLY_26',
addmain=False,
msg='Checking for IPV6_V6ONLY in linux/in6.h',
local_include=False)
2010-03-07 15:31:48 +03:00
conf.CHECK_CODE('''
struct sockaddr_storage sa_store;
struct addrinfo *ai = NULL;
struct in6_addr in6addr;
int idx = if_nametoindex("iface1");
int s = socket(AF_INET6, SOCK_STREAM, 0);
int ret = getaddrinfo(NULL, NULL, NULL, &ai);
if (ret != 0) {
2010-10-30 19:43:48 +04:00
const char *es = gai_strerror(ret);
2010-03-07 15:31:48 +03:00
}
freeaddrinfo(ai);
2010-04-24 15:07:50 +04:00
{
int val = 1;
#ifdef HAVE_LINUX_IPV6_V6ONLY_26
#define IPV6_V6ONLY 26
#endif
ret = setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,
(const void *)&val, sizeof(val));
}
2010-03-07 15:31:48 +03:00
''',
2010-03-23 01:29:51 +03:00
define='HAVE_IPV6',
2010-03-23 16:32:23 +03:00
lib='nsl socket',
2016-12-06 20:07:50 +03:00
headers='sys/socket.h netdb.h netinet/in.h net/if.h')
2010-03-07 15:31:48 +03:00
2013-01-15 03:21:12 +04:00
if conf.CONFIG_SET('HAVE_SYS_UCONTEXT_H') and conf.CONFIG_SET('HAVE_SIGNAL_H'):
conf.CHECK_CODE('''
ucontext_t uc;
sigaddset(&uc.uc_sigmask, SIGUSR1);
''',
'HAVE_UCONTEXT_T',
msg="Checking whether we have ucontext_t",
headers='signal.h sys/ucontext.h')
2014-06-03 21:44:19 +04:00
# Check for atomic builtins. */
conf.CHECK_CODE('''
2016-04-25 17:10:03 +03:00
int i;
(void)__sync_fetch_and_add(&i, 1);
2014-06-03 21:44:19 +04:00
''',
'HAVE___SYNC_FETCH_AND_ADD',
msg='Checking for __sync_fetch_and_add compiler builtin')
2021-07-06 03:26:44 +03:00
conf.CHECK_CODE('''
int i;
(void)__sync_add_and_fetch(&i, 1);
''',
'HAVE___SYNC_ADD_AND_FETCH',
msg='Checking for __sync_add_and_fetch compiler builtin')
2014-06-03 21:44:19 +04:00
conf.CHECK_CODE('''
2016-04-25 17:10:03 +03:00
int32_t i;
atomic_add_32(&i, 1);
2014-06-03 21:44:19 +04:00
''',
'HAVE_ATOMIC_ADD_32',
headers='stdint.h sys/atomic.h',
msg='Checking for atomic_add_32 compiler builtin')
2021-12-13 19:40:52 +03:00
conf.CHECK_CODE('''
uint32_t i,j;
j = __atomic_add_fetch(&i,1,__ATOMIC_SEQ_CST)
''',
'HAVE___ATOMIC_ADD_FETCH',
headers='stdint.h',
msg='Checking for __atomic_add_fetch compiler builtin')
conf.CHECK_CODE('''
uint32_t i,j;
__atomic_load(&i,&j,__ATOMIC_SEQ_CST)
''',
'HAVE___ATOMIC_ADD_LOAD',
headers='stdint.h',
msg='Checking for __atomic_load compiler builtin')
2018-06-21 15:17:35 +03:00
# Check for thread fence. */
tf = conf.CHECK_CODE('atomic_thread_fence(memory_order_seq_cst);',
'HAVE_ATOMIC_THREAD_FENCE',
headers='stdatomic.h',
msg='Checking for atomic_thread_fence(memory_order_seq_cst) in stdatomic.h')
if not tf:
tf = conf.CHECK_CODE('__atomic_thread_fence(__ATOMIC_SEQ_CST);',
'HAVE___ATOMIC_THREAD_FENCE',
msg='Checking for __atomic_thread_fence(__ATOMIC_SEQ_CST)')
if not tf:
# __sync_synchronize() is available since 2005 in gcc.
tf = conf.CHECK_CODE('__sync_synchronize();',
'HAVE___SYNC_SYNCHRONIZE',
msg='Checking for __sync_synchronize')
if tf:
conf.DEFINE('HAVE_ATOMIC_THREAD_FENCE_SUPPORT', 1)
2017-07-26 17:33:10 +03:00
conf.CHECK_CODE('''
#define FALL_THROUGH __attribute__((fallthrough))
enum direction_e {
UP = 0,
DOWN,
};
int main(void) {
enum direction_e key = UP;
int i = 10;
int j = 0;
switch (key) {
case UP:
i = 5;
FALL_THROUGH;
case DOWN:
j = i * 2;
break;
default:
break;
}
if (j < i) {
return 1;
}
return 0;
}
''',
'HAVE_FALLTHROUGH_ATTRIBUTE',
addmain=False,
2018-07-03 07:36:33 +03:00
strict=True,
2018-09-06 12:50:58 +03:00
cflags=['-Werror=missing-declarations'],
2017-07-26 17:33:10 +03:00
msg='Checking for fallthrough attribute')
2010-03-23 01:29:51 +03:00
# these may be builtins, so we need the link=False strategy
conf.CHECK_FUNCS('strdup memmem printf memset memcpy memmove strcpy strncpy bzero', link=False)
2013-05-22 11:23:30 +04:00
# See https://bugzilla.samba.org/show_bug.cgi?id=1097
#
# Ported in from autoconf where it was added with this commit:
# commit 804cfb20a067b4b687089dc72a8271b3abf20f31
# Author: Simo Sorce <idra@samba.org>
# Date: Wed Aug 25 14:24:16 2004 +0000
# r2070: Let's try to overload srnlen and strndup for AIX where they are natly broken.
host_os = sys.platform
if host_os.rfind('aix') > -1:
conf.DEFINE('BROKEN_STRNLEN', 1)
conf.DEFINE('BROKEN_STRNDUP', 1)
2010-02-20 08:25:37 +03:00
conf.CHECK_FUNCS('shl_load shl_unload shl_findsym')
conf.CHECK_FUNCS('pipe strftime srandom random srand rand usleep setbuffer')
2012-06-29 00:41:19 +04:00
conf.CHECK_FUNCS('lstat getpgrp utime utimes setuid seteuid setreuid setresuid setgid setegid')
2011-10-08 12:47:57 +04:00
conf.CHECK_FUNCS('setregid setresgid chroot strerror vsyslog setlinebuf mktime')
2012-01-31 14:10:18 +04:00
conf.CHECK_FUNCS('ftruncate chsize rename waitpid wait4')
2015-07-15 20:43:56 +03:00
conf.CHECK_FUNCS('initgroups pread pwrite strndup strcasestr strsep')
2010-02-20 08:25:37 +03:00
conf.CHECK_FUNCS('strtok_r mkdtemp dup2 dprintf vdprintf isatty chown lchown')
2010-03-26 09:17:38 +03:00
conf.CHECK_FUNCS('link readlink symlink realpath snprintf vsnprintf')
2010-02-20 08:25:37 +03:00
conf.CHECK_FUNCS('asprintf vasprintf setenv unsetenv strnlen strtoull __strtoull')
2012-03-24 17:43:21 +04:00
conf.CHECK_FUNCS('strtouq strtoll __strtoll strtoq memalign posix_memalign')
2019-05-23 12:11:11 +03:00
conf.CHECK_FUNCS('fmemopen')
2014-06-30 17:46:21 +04:00
if conf.CONFIG_SET('HAVE_MEMALIGN'):
conf.CHECK_DECLS('memalign', headers='malloc.h')
2017-08-22 18:09:01 +03:00
# glibc up to 2.3.6 had dangerously broken posix_fallocate(). DON'T USE IT.
if conf.CHECK_CODE('''
#define _XOPEN_SOURCE 600
#include <stdlib.h>
#if defined(__GLIBC__) && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 4))
#error probably broken posix_fallocate
#endif
''',
'_POSIX_FALLOCATE_CAPABLE_LIBC',
msg='Checking for posix_fallocate-capable libc'):
conf.CHECK_FUNCS('posix_fallocate')
2015-03-23 21:37:05 +03:00
conf.CHECK_FUNCS('prctl dirname basename')
2012-01-31 14:10:18 +04:00
2017-10-14 12:38:18 +03:00
strlcpy_in_bsd = False
2012-01-31 14:10:18 +04:00
# libbsd on some platforms provides strlcpy and strlcat
if not conf.CHECK_FUNCS('strlcpy strlcat'):
2017-10-14 12:38:18 +03:00
if conf.CHECK_FUNCS_IN('strlcpy strlcat', 'bsd', headers='bsd/string.h',
checklibc=True):
strlcpy_in_bsd = True
2012-03-24 19:00:36 +04:00
if not conf.CHECK_FUNCS('getpeereid'):
conf.CHECK_FUNCS_IN('getpeereid', 'bsd', headers='sys/types.h bsd/unistd.h')
2014-08-30 03:54:44 +04:00
if not conf.CHECK_FUNCS_IN('setproctitle', 'setproctitle', headers='setproctitle.h'):
conf.CHECK_FUNCS_IN('setproctitle', 'bsd', headers='sys/types.h bsd/unistd.h')
2017-09-14 00:36:21 +03:00
if not conf.CHECK_FUNCS('setproctitle_init'):
conf.CHECK_FUNCS_IN('setproctitle_init', 'bsd', headers='sys/types.h bsd/unistd.h')
2012-03-24 19:00:36 +04:00
2016-06-09 22:27:09 +03:00
if not conf.CHECK_FUNCS('closefrom'):
conf.CHECK_FUNCS_IN('closefrom', 'bsd', headers='bsd/unistd.h')
2012-03-24 19:00:36 +04:00
conf.CHECK_CODE('''
struct ucred cred;
socklen_t cred_len;
int ret = getsockopt(0, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len);''',
'HAVE_PEERCRED',
msg="Checking whether we can use SO_PEERCRED to get socket credentials",
headers='sys/types.h sys/socket.h')
2012-01-31 14:10:18 +04:00
2019-08-29 22:31:07 +03:00
#Some OS (ie. freebsd) return EINVAL if the conversion could not be done, it's not what we expect
2010-10-21 00:13:54 +04:00
#Let's detect those cases
if conf.CONFIG_SET('HAVE_STRTOLL'):
conf.CHECK_CODE('''
long long nb = strtoll("Text", NULL, 0);
if (errno == EINVAL) {
return 0;
} else {
return 1;
}
''',
msg="Checking correct behavior of strtoll",
headers = 'errno.h',
execute = True,
define = 'HAVE_BSD_STRTOLL',
)
2022-07-21 04:25:37 +03:00
conf.CHECK_FUNCS('if_nameindex if_nametoindex strerror_r')
2019-09-05 22:39:09 +03:00
conf.CHECK_FUNCS('syslog')
2010-03-07 09:00:49 +03:00
conf.CHECK_FUNCS('gai_strerror get_current_dir_name')
2012-06-29 00:41:19 +04:00
conf.CHECK_FUNCS('timegm getifaddrs freeifaddrs mmap setgroups syscall setsid')
2010-03-07 07:31:04 +03:00
conf.CHECK_FUNCS('getgrent_r getgrgid_r getgrnam_r getgrouplist getpagesize')
2010-03-07 07:38:32 +03:00
conf.CHECK_FUNCS('getpwent_r getpwnam_r getpwuid_r epoll_create')
2013-07-23 01:23:33 +04:00
conf.CHECK_FUNCS('port_create')
2018-11-02 20:04:28 +03:00
conf.CHECK_FUNCS('getprogname')
2021-06-24 15:13:50 +03:00
if not conf.CHECK_FUNCS('copy_file_range'):
conf.CHECK_CODE('''
2021-09-05 16:09:12 +03:00
syscall(SYS_copy_file_range,0,NULL,0,NULL,0,0);
2021-06-24 15:13:50 +03:00
''',
'HAVE_SYSCALL_COPY_FILE_RANGE',
2021-09-05 16:09:12 +03:00
headers='sys/syscall.h unistd.h',
2021-06-24 15:13:50 +03:00
msg='Checking whether we have copy_file_range system call')
2010-03-07 07:31:04 +03:00
2012-06-01 07:29:38 +04:00
conf.SET_TARGET_TYPE('attr', 'EMPTY')
2012-06-01 09:01:09 +04:00
xattr_headers='sys/attributes.h attr/xattr.h sys/xattr.h'
2018-03-12 20:44:38 +03:00
# default to 1, we set it to 0 if we don't find any EA implementation below:
conf.DEFINE('HAVE_XATTR_SUPPORT', 1)
if conf.CHECK_FUNCS_IN('getxattr', 'attr', checklibc=True, headers=xattr_headers):
conf.DEFINE('HAVE_XATTR_XATTR', 1)
# Darwin has extra options to xattr-family functions
conf.CHECK_CODE('getxattr(NULL, NULL, NULL, 0, 0, 0)',
headers=xattr_headers, local_include=False,
define='XATTR_ADDITIONAL_OPTIONS',
msg="Checking whether xattr interface takes additional options")
elif conf.CHECK_FUNCS_IN('attr_listf', 'attr', checklibc=True, headers=xattr_headers):
conf.DEFINE('HAVE_XATTR_ATTR', 1)
elif conf.CHECK_FUNCS('extattr_list_fd'):
conf.DEFINE('HAVE_XATTR_EXTATTR', 1)
elif conf.CHECK_FUNCS('flistea'):
conf.DEFINE('HAVE_XATTR_EA', 1)
elif not conf.CHECK_FUNCS('attropen'):
conf.DEFINE('HAVE_XATTR_SUPPORT', 0)
2012-06-01 07:29:38 +04:00
2010-03-23 20:48:32 +03:00
conf.CHECK_FUNCS_IN('dlopen dlsym dlerror dlclose', 'dl',
checklibc=True, headers='dlfcn.h dl.h')
2010-03-30 06:14:01 +04:00
conf.CHECK_C_PROTOTYPE('dlopen', 'void *dlopen(const char* filename, unsigned int flags)',
define='DLOPEN_TAKES_UNSIGNED_FLAGS', headers='dlfcn.h dl.h')
2019-09-23 16:14:24 +03:00
#
# Check for clock_gettime and fdatasync
#
# First check libc to avoid linking libreplace against librt.
#
if conf.CHECK_FUNCS('fdatasync'):
2010-10-16 12:53:17 +04:00
# some systems are missing the declaration
conf.CHECK_DECLS('fdatasync')
2019-09-23 16:14:24 +03:00
else:
if conf.CHECK_FUNCS_IN('fdatasync', 'rt'):
# some systems are missing the declaration
conf.CHECK_DECLS('fdatasync')
has_clock_gettime = False
if conf.CHECK_FUNCS('clock_gettime'):
has_clock_gettime = True
if not has_clock_gettime:
if conf.CHECK_FUNCS_IN('clock_gettime', 'rt', checklibc=True):
has_clock_gettime = True
2010-10-16 12:53:17 +04:00
2019-09-23 16:14:24 +03:00
if has_clock_gettime:
2011-02-07 15:12:17 +03:00
for c in ['CLOCK_MONOTONIC', 'CLOCK_PROCESS_CPUTIME_ID', 'CLOCK_REALTIME']:
conf.CHECK_CODE('''
2012-01-31 14:10:18 +04:00
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
clockid_t clk = %s''' % c,
'HAVE_%s' % c,
msg='Checking whether the clock_gettime clock ID %s is available' % c)
2011-02-07 15:12:17 +03:00
2011-03-03 18:26:48 +03:00
conf.CHECK_TYPE('struct timespec', headers='sys/time.h time.h')
2010-03-26 09:17:38 +03:00
2010-03-23 20:48:32 +03:00
# these headers need to be tested as a group on freebsd
conf.CHECK_HEADERS(headers='sys/socket.h net/if.h', together=True)
conf.CHECK_HEADERS(headers='netinet/in.h arpa/nameser.h resolv.h', together=True)
2010-03-23 01:29:51 +03:00
conf.CHECK_FUNCS_IN('res_search', 'resolv', checklibc=True,
headers='netinet/in.h arpa/nameser.h resolv.h')
2010-03-23 20:48:32 +03:00
2010-12-11 18:50:51 +03:00
2013-12-13 01:12:07 +04:00
# try to find libintl (if --without-gettext is not given)
2013-08-02 00:28:05 +04:00
conf.env.intl_libs=''
if not Options.options.disable_gettext:
conf.CHECK_HEADERS('libintl.h')
conf.CHECK_LIB('intl')
2014-01-03 01:23:16 +04:00
conf.CHECK_DECLS('dgettext gettext bindtextdomain textdomain bind_textdomain_codeset', headers="libintl.h")
2013-08-02 00:28:05 +04:00
# *textdomain functions are not strictly necessary
conf.CHECK_FUNCS_IN('bindtextdomain textdomain bind_textdomain_codeset',
'', checklibc=True, headers='libintl.h')
# gettext and dgettext must exist
# on some systems (the ones with glibc, those are in libc)
if conf.CHECK_FUNCS_IN('dgettext gettext', '', checklibc=True, headers='libintl.h'):
# save for dependency definitions
conf.env.intl_libs=''
2017-02-17 22:57:55 +03:00
# others (e.g. FreeBSD) have separate libintl
2013-08-02 00:28:05 +04:00
elif conf.CHECK_FUNCS_IN('dgettext gettext', 'intl', checklibc=False, headers='libintl.h'):
# save for dependency definitions
conf.env.intl_libs='intl'
# recheck with libintl
conf.CHECK_FUNCS_IN('bindtextdomain textdomain bind_textdomain_codeset',
'intl', checklibc=False, headers='libintl.h')
2010-12-11 18:50:51 +03:00
else:
2013-08-02 00:28:05 +04:00
# Some hosts need lib iconv for linking with lib intl
# So we try with flags just in case it helps.
2014-01-29 23:48:38 +04:00
oldflags = list(conf.env['EXTRA_LDFLAGS']);
2014-01-03 02:28:20 +04:00
conf.env['EXTRA_LDFLAGS'].extend(["-liconv"])
2013-08-02 00:28:05 +04:00
conf.CHECK_FUNCS_IN('dgettext gettext bindtextdomain textdomain bind_textdomain_codeset',
'intl', checklibc=False, headers='libintl.h')
conf.env['EXTRA_LDFLAGS'] = oldflags
if conf.env['HAVE_GETTEXT'] and conf.env['HAVE_DGETTEXT']:
# save for dependency definitions
conf.env.intl_libs='iconv intl'
2013-12-13 01:12:07 +04:00
2013-07-25 21:41:02 +04:00
# did we find both prototypes and a library to link against?
# if not, unset the detected values (see Bug #9911)
if not (conf.env['HAVE_GETTEXT'] and conf.env['HAVE_DECL_GETTEXT']):
conf.undefine('HAVE_GETTEXT')
conf.undefine('HAVE_DECL_GETTEXT')
if not (conf.env['HAVE_DGETTEXT'] and conf.env['HAVE_DECL_DGETTEXT']):
conf.undefine('HAVE_DGETTEXT')
conf.undefine('HAVE_DECL_DGETTEXT')
2010-03-23 01:29:51 +03:00
conf.CHECK_FUNCS_IN('pthread_create', 'pthread', checklibc=True, headers='pthread.h')
2010-02-20 08:25:37 +03:00
2013-01-14 17:56:25 +04:00
PTHREAD_CFLAGS='error'
PTHREAD_LDFLAGS='error'
2019-09-23 17:53:12 +03:00
if PTHREAD_LDFLAGS == 'error':
# Check if pthread_attr_init() is provided by libc first!
if conf.CHECK_FUNCS('pthread_attr_init'):
PTHREAD_CFLAGS='-D_REENTRANT'
PTHREAD_LDFLAGS=''
2013-01-14 17:56:25 +04:00
if PTHREAD_LDFLAGS == 'error':
if conf.CHECK_FUNCS_IN('pthread_attr_init', 'pthread'):
PTHREAD_CFLAGS='-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS'
PTHREAD_LDFLAGS='-lpthread'
if PTHREAD_LDFLAGS == 'error':
if conf.CHECK_FUNCS_IN('pthread_attr_init', 'pthreads'):
PTHREAD_CFLAGS='-D_THREAD_SAFE'
PTHREAD_LDFLAGS='-lpthreads'
if PTHREAD_LDFLAGS == 'error':
if conf.CHECK_FUNCS_IN('pthread_attr_init', 'c_r'):
PTHREAD_CFLAGS='-D_THREAD_SAFE -pthread'
PTHREAD_LDFLAGS='-pthread'
2019-09-23 17:53:12 +03:00
2013-01-14 17:56:25 +04:00
# especially for HP-UX, where the CHECK_FUNC macro fails to test for
# pthread_attr_init. On pthread_mutex_lock it works there...
if PTHREAD_LDFLAGS == 'error':
if conf.CHECK_FUNCS_IN('pthread_mutex_lock', 'pthread'):
PTHREAD_CFLAGS='-D_REENTRANT'
PTHREAD_LDFLAGS='-lpthread'
if PTHREAD_CFLAGS != 'error' and PTHREAD_LDFLAGS != 'error':
2013-05-16 13:50:38 +04:00
if conf.CONFIG_SET('replace_add_global_pthread'):
conf.ADD_CFLAGS(PTHREAD_CFLAGS)
conf.ADD_LDFLAGS(PTHREAD_LDFLAGS)
2013-01-14 17:56:25 +04:00
conf.CHECK_HEADERS('pthread.h')
conf.DEFINE('HAVE_PTHREAD', '1')
2012-12-22 11:42:48 +04:00
if conf.CONFIG_SET('HAVE_PTHREAD'):
2013-02-06 15:15:41 +04:00
conf.CHECK_FUNCS_IN('pthread_mutexattr_setrobust', 'pthread',
2012-12-22 11:42:48 +04:00
checklibc=True, headers='pthread.h')
2013-02-06 15:15:41 +04:00
if not conf.CONFIG_SET('HAVE_PTHREAD_MUTEXATTR_SETROBUST'):
conf.CHECK_FUNCS_IN('pthread_mutexattr_setrobust_np', 'pthread',
checklibc=True, headers='pthread.h')
2012-12-22 11:42:48 +04:00
2015-06-12 12:01:21 +03:00
conf.CHECK_DECLS('PTHREAD_MUTEX_ROBUST', headers='pthread.h')
if not conf.CONFIG_SET('HAVE_DECL_PTHREAD_MUTEX_ROBUST'):
conf.CHECK_DECLS('PTHREAD_MUTEX_ROBUST_NP', headers='pthread.h')
2013-02-06 15:15:41 +04:00
conf.CHECK_FUNCS_IN('pthread_mutex_consistent', 'pthread',
2013-02-04 15:26:47 +04:00
checklibc=True, headers='pthread.h')
2013-02-06 15:15:41 +04:00
if not conf.CONFIG_SET('HAVE_PTHREAD_MUTEX_CONSISTENT'):
conf.CHECK_FUNCS_IN('pthread_mutex_consistent_np', 'pthread',
checklibc=True, headers='pthread.h')
2013-02-04 15:26:47 +04:00
if ((conf.CONFIG_SET('HAVE_PTHREAD_MUTEXATTR_SETROBUST') or
conf.CONFIG_SET('HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP')) and
2015-06-12 12:01:21 +03:00
(conf.CONFIG_SET('HAVE_DECL_PTHREAD_MUTEX_ROBUST') or
conf.CONFIG_SET('HAVE_DECL_PTHREAD_MUTEX_ROBUST_NP')) and
2013-02-04 15:26:47 +04:00
(conf.CONFIG_SET('HAVE_PTHREAD_MUTEX_CONSISTENT') or
conf.CONFIG_SET('HAVE_PTHREAD_MUTEX_CONSISTENT_NP'))):
2012-12-22 11:42:48 +04:00
conf.DEFINE('HAVE_ROBUST_MUTEXES', 1)
2022-10-27 08:51:49 +03:00
# __thread is available in Solaris Studio, IBM XL,
# gcc, Clang and Intel C Compiler
2018-07-18 09:44:48 +03:00
conf.CHECK_CODE('''
__thread int tls;
int main(void) {
return 0;
}
''',
'HAVE___THREAD',
addmain=False,
msg='Checking for __thread local storage')
2010-03-07 06:28:33 +03:00
conf.CHECK_FUNCS_IN('crypt', 'crypt', checklibc=True)
2017-05-31 01:35:25 +03:00
conf.CHECK_FUNCS_IN('crypt_r', 'crypt', checklibc=True)
2020-07-01 05:35:39 +03:00
conf.CHECK_FUNCS_IN('crypt_rn', 'crypt', checklibc=True)
2010-03-07 06:28:33 +03:00
2010-03-23 01:29:51 +03:00
conf.CHECK_VARIABLE('rl_event_hook', define='HAVE_DECL_RL_EVENT_HOOK', always=True,
headers='readline.h readline/readline.h readline/history.h')
2018-11-13 02:05:21 +03:00
conf.CHECK_VARIABLE('program_invocation_short_name', headers='errno.h')
2010-03-07 05:48:49 +03:00
2010-03-07 06:32:27 +03:00
conf.CHECK_DECLS('snprintf vsnprintf asprintf vasprintf')
2010-03-23 01:29:51 +03:00
conf.CHECK_DECLS('errno', headers='errno.h', reverse=True)
2014-09-16 21:44:57 +04:00
conf.CHECK_DECLS('EWOULDBLOCK', headers='errno.h')
2018-11-29 10:12:06 +03:00
conf.CHECK_DECLS('environ', reverse=True, headers='unistd.h')
conf.CHECK_DECLS('getgrent_r getpwent_r', reverse=True, headers='pwd.h grp.h')
2010-03-17 12:40:03 +03:00
conf.CHECK_DECLS('pread pwrite setenv setresgid setresuid', reverse=True)
2010-03-07 07:38:32 +03:00
if conf.CONFIG_SET('HAVE_EPOLL_CREATE') and conf.CONFIG_SET('HAVE_SYS_EPOLL_H'):
2010-03-07 15:27:50 +03:00
conf.DEFINE('HAVE_EPOLL', 1)
2013-07-23 01:23:33 +04:00
if conf.CONFIG_SET('HAVE_PORT_CREATE') and conf.CONFIG_SET('HAVE_PORT_H'):
conf.DEFINE('HAVE_SOLARIS_PORTS', 1)
2016-08-12 17:40:05 +03:00
if conf.CHECK_FUNCS('eventfd', headers='sys/eventfd.h'):
conf.DEFINE('HAVE_EVENTFD', 1)
2011-02-09 21:22:25 +03:00
conf.CHECK_HEADERS('poll.h')
conf.CHECK_FUNCS('poll')
2012-06-11 11:11:17 +04:00
conf.CHECK_FUNCS('strptime')
conf.CHECK_DECLS('strptime', headers='time.h')
conf.CHECK_CODE('''#define LIBREPLACE_CONFIGURE_TEST_STRPTIME
2019-05-06 01:23:49 +03:00
#include "tests/strptime.c"''',
2012-06-11 11:11:17 +04:00
define='HAVE_WORKING_STRPTIME',
execute=True,
addmain=False,
msg='Checking for working strptime')
2010-03-23 16:32:23 +03:00
2015-09-09 14:47:42 +03:00
conf.CHECK_C_PROTOTYPE('gettimeofday',
'int gettimeofday(struct timeval *tv, struct timezone *tz)',
define='HAVE_GETTIMEOFDAY_TZ', headers='sys/time.h')
2010-03-17 12:31:46 +03:00
2015-09-27 01:57:50 +03:00
conf.CHECK_C_PROTOTYPE('gettimeofday',
'int gettimeofday(struct timeval *tv, void *tz)',
define='HAVE_GETTIMEOFDAY_TZ_VOID',
headers='sys/time.h')
2019-05-06 01:23:49 +03:00
conf.CHECK_CODE('#include "tests/snprintf.c"',
2010-03-07 09:00:49 +03:00
define="HAVE_C99_VSNPRINTF",
2012-06-13 15:17:13 +04:00
execute=True,
2010-03-07 09:00:49 +03:00
addmain=False,
msg="Checking for C99 vsnprintf")
2010-02-20 08:25:37 +03:00
2019-05-06 01:23:49 +03:00
conf.CHECK_CODE('#include "tests/shared_mmap.c"',
2012-06-02 08:13:14 +04:00
addmain=False, add_headers=False, execute=True,
define='HAVE_SHARED_MMAP',
msg="Checking for HAVE_SHARED_MMAP")
2019-05-06 01:23:49 +03:00
conf.CHECK_CODE('#include "tests/shared_mremap.c"',
2012-06-02 08:13:14 +04:00
addmain=False, add_headers=False, execute=True,
define='HAVE_MREMAP',
msg="Checking for HAVE_MREMAP")
2012-03-22 04:17:24 +04:00
# OpenBSD (and I've heard HPUX) doesn't sync between mmap and write.
# FIXME: Anything other than a 0 or 1 exit code should abort configure!
2019-05-06 01:23:49 +03:00
conf.CHECK_CODE('#include "tests/incoherent_mmap.c"',
2018-09-10 11:22:13 +03:00
addmain=False, add_headers=False, execute=True,
2012-03-22 04:17:24 +04:00
define='HAVE_INCOHERENT_MMAP',
msg="Checking for HAVE_INCOHERENT_MMAP")
2010-02-22 03:59:23 +03:00
conf.SAMBA_BUILD_ENV()
2010-02-20 08:25:37 +03:00
2010-03-07 09:20:22 +03:00
conf.CHECK_CODE('''
2010-10-30 19:43:48 +04:00
typedef struct {unsigned x;} FOOBAR;
2010-03-07 09:20:22 +03:00
#define X_FOOBAR(x) ((FOOBAR) { x })
#define FOO_ONE X_FOOBAR(1)
FOOBAR f = FOO_ONE;
static const struct {
FOOBAR y;
} f2[] = {
{FOO_ONE}
};
static const FOOBAR f3[] = {FOO_ONE};
''',
define='HAVE_IMMEDIATE_STRUCTURES')
2010-03-23 01:29:51 +03:00
conf.CHECK_CODE('mkdir("foo",0777)', define='HAVE_MKDIR_MODE', headers='sys/stat.h')
2010-03-07 14:52:58 +03:00
# we need the st_rdev test under two names
2010-03-23 20:48:32 +03:00
conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_rdev',
define='HAVE_STRUCT_STAT_ST_RDEV',
headers='sys/stat.h')
conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_rdev', define='HAVE_ST_RDEV',
2010-03-23 01:29:51 +03:00
headers='sys/stat.h')
2010-03-23 20:48:32 +03:00
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_storage', 'ss_family',
headers='sys/socket.h netinet/in.h')
2010-12-12 21:14:28 +03:00
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_storage', '__ss_family',
2010-12-12 12:05:43 +03:00
headers='sys/socket.h netinet/in.h')
2010-03-23 20:48:32 +03:00
if conf.CHECK_STRUCTURE_MEMBER('struct sockaddr', 'sa_len',
headers='sys/socket.h netinet/in.h',
define='HAVE_SOCKADDR_SA_LEN'):
# the old build system produced both defines
conf.DEFINE('HAVE_STRUCT_SOCKADDR_SA_LEN', 1)
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_in', 'sin_len',
headers='sys/socket.h netinet/in.h',
define='HAVE_SOCK_SIN_LEN')
2010-03-07 14:52:58 +03:00
2018-06-27 06:41:10 +03:00
conf.CHECK_STRUCTURE_MEMBER('struct sockaddr_in6', 'sin6_len',
headers='sys/socket.h netinet/in.h',
define='HAVE_SOCK_SIN6_LEN')
2010-03-07 14:52:58 +03:00
conf.CHECK_CODE('struct sockaddr_un sunaddr; sunaddr.sun_family = AF_UNIX;',
2010-03-23 01:29:51 +03:00
define='HAVE_UNIXSOCKET', headers='sys/socket.h sys/un.h')
2010-03-07 14:52:58 +03:00
conf.CHECK_CODE('''
struct stat st;
char tpl[20]="/tmp/test.XXXXXX";
2012-09-24 00:03:31 +04:00
char tpl2[20]="/tmp/test.XXXXXX";
2010-03-07 14:52:58 +03:00
int fd = mkstemp(tpl);
2012-09-24 00:03:31 +04:00
int fd2 = mkstemp(tpl2);
if (fd == -1) {
if (fd2 != -1) {
unlink(tpl2);
}
exit(1);
}
if (fd2 == -1) exit(1);
2010-03-07 14:52:58 +03:00
unlink(tpl);
2012-09-24 00:03:31 +04:00
unlink(tpl2);
2010-03-07 14:52:58 +03:00
if (fstat(fd, &st) != 0) exit(1);
if ((st.st_mode & 0777) != 0600) exit(1);
2012-09-24 00:03:31 +04:00
if (strcmp(tpl, "/tmp/test.XXXXXX") == 0) {
exit(1);
}
if (strcmp(tpl, tpl2) == 0) {
exit(1);
}
2010-03-07 14:52:58 +03:00
exit(0);
''',
define='HAVE_SECURE_MKSTEMP',
execute=True,
mandatory=True) # lets see if we get a mandatory failure for this one
2010-03-24 04:56:30 +03:00
# look for a method of finding the list of network interfaces
for method in ['HAVE_IFACE_GETIFADDRS', 'HAVE_IFACE_AIX', 'HAVE_IFACE_IFCONF', 'HAVE_IFACE_IFREQ']:
2017-10-14 12:38:18 +03:00
bsd_for_strlcpy = ''
if strlcpy_in_bsd:
bsd_for_strlcpy = ' bsd'
2010-03-24 04:56:30 +03:00
if conf.CHECK_CODE('''
#define %s 1
#define NO_CONFIG_H 1
#define AUTOCONF_TEST 1
#include "replace.c"
#include "inet_ntop.c"
#include "snprintf.c"
#include "getifaddrs.c"
#define getifaddrs_test main
2019-05-06 01:23:49 +03:00
#include "tests/getifaddrs.c"
2010-03-24 04:56:30 +03:00
''' % method,
method,
2017-10-14 12:38:18 +03:00
lib='nsl socket' + bsd_for_strlcpy,
2010-03-24 04:56:30 +03:00
addmain=False,
execute=True):
break
2010-04-04 07:08:05 +04:00
conf.RECURSE('system')
2010-03-24 04:56:30 +03:00
conf.SAMBA_CONFIG_H()
2017-06-01 04:26:38 +03:00
if conf.CHECK_FUNCS('strerror_r'):
# Check if strerror_r is XSI-Compatable, the default GNU implementation
# is not
conf.CHECK_CODE('int strerror_r(int errnum, char *buf, size_t buflen);',
'STRERROR_R_XSI_NOT_GNU',
headers='string.h', addmain=False, link=False,
msg="Checking for XSI (rather than GNU) prototype for strerror_r")
2010-03-22 10:38:54 +03:00
2012-01-31 14:25:17 +04:00
REPLACEMENT_FUNCTIONS = {
'replace.c': ['ftruncate', 'strlcpy', 'strlcat', 'mktime', 'initgroups',
'memmove', 'strdup', 'setlinebuf', 'vsyslog', 'strnlen',
'strndup', 'waitpid', 'seteuid', 'setegid', 'chroot',
'mkstemp', 'mkdtemp', 'pread', 'pwrite', 'strcasestr',
2015-07-15 20:43:56 +03:00
'strsep', 'strtok_r', 'strtoll', 'strtoull', 'setenv', 'unsetenv',
2012-01-31 14:25:17 +04:00
'utime', 'utimes', 'dup2', 'chown', 'link', 'readlink',
'symlink', 'lchown', 'realpath', 'memmem', 'vdprintf',
2021-06-24 15:13:50 +03:00
'dprintf', 'get_current_dir_name', 'copy_file_range',
2018-12-11 20:09:14 +03:00
'strerror_r', 'clock_gettime', 'memset_s'],
2012-01-31 14:25:17 +04:00
'timegm.c': ['timegm'],
2012-06-11 11:07:06 +04:00
# Note: C99_VSNPRINTF is not a function, but a special condition
# for replacement
'snprintf.c': ['C99_VSNPRINTF', 'snprintf', 'vsnprintf', 'asprintf', 'vasprintf'],
2012-06-11 11:11:17 +04:00
# Note: WORKING_STRPTIME is not a function, but a special condition
# for replacement
'strptime.c': ['WORKING_STRPTIME', 'strptime'],
2012-01-31 14:25:17 +04:00
}
2010-02-20 08:25:37 +03:00
def build(bld):
2010-04-04 07:08:05 +04:00
bld.RECURSE('buildtools/wafsamba')
2010-03-17 13:53:29 +03:00
2012-01-31 14:25:17 +04:00
REPLACE_HOSTCC_SOURCE = ''
2010-04-10 11:51:28 +04:00
2018-07-31 20:04:30 +03:00
for filename in REPLACEMENT_FUNCTIONS.keys():
for function in REPLACEMENT_FUNCTIONS[filename]:
2012-01-31 14:25:17 +04:00
if not bld.CONFIG_SET('HAVE_%s' % function.upper()):
REPLACE_HOSTCC_SOURCE += ' %s' % filename
break
2010-04-10 11:51:28 +04:00
2012-02-20 04:26:15 +04:00
extra_libs = ''
if bld.CONFIG_SET('HAVE_LIBBSD'): extra_libs += ' bsd'
2019-09-23 16:14:24 +03:00
if bld.CONFIG_SET('HAVE_LIBRT'): extra_libs += ' rt'
2019-10-21 18:08:08 +03:00
if bld.CONFIG_SET('REPLACE_REQUIRES_LIBSOCKET_LIBNSL'): extra_libs += ' socket nsl'
2012-02-20 04:26:15 +04:00
2020-09-08 13:13:20 +03:00
if not bld.CONFIG_SET('HAVE_CLOSEFROM'):
REPLACE_HOSTCC_SOURCE += ' closefrom.c'
2010-04-12 11:33:42 +04:00
bld.SAMBA_SUBSYSTEM('LIBREPLACE_HOSTCC',
2010-04-12 11:12:29 +04:00
REPLACE_HOSTCC_SOURCE,
2010-04-12 11:33:42 +04:00
use_hostcc=True,
2010-04-12 12:55:02 +04:00
use_global_deps=False,
2021-06-15 04:50:48 +03:00
group='hostcc_base_build_main',
2012-02-20 04:26:15 +04:00
deps = extra_libs
2010-04-10 11:51:28 +04:00
)
2010-04-12 11:12:29 +04:00
REPLACE_SOURCE = REPLACE_HOSTCC_SOURCE
2010-02-20 08:25:37 +03:00
2010-03-23 17:36:45 +03:00
if not bld.CONFIG_SET('HAVE_DLOPEN'): REPLACE_SOURCE += ' dlfcn.c'
2011-02-09 21:22:25 +03:00
if not bld.CONFIG_SET('HAVE_POLL'): REPLACE_SOURCE += ' poll.c'
2010-04-11 21:24:46 +04:00
2010-03-23 17:36:45 +03:00
if not bld.CONFIG_SET('HAVE_SOCKETPAIR'): REPLACE_SOURCE += ' socketpair.c'
if not bld.CONFIG_SET('HAVE_CONNECT'): REPLACE_SOURCE += ' socket.c'
2010-04-11 21:24:46 +04:00
if not bld.CONFIG_SET('HAVE_GETIFADDRS'): REPLACE_SOURCE += ' getifaddrs.c'
if not bld.CONFIG_SET('HAVE_GETADDRINFO'): REPLACE_SOURCE += ' getaddrinfo.c'
if not bld.CONFIG_SET('HAVE_INET_NTOA'): REPLACE_SOURCE += ' inet_ntoa.c'
if not bld.CONFIG_SET('HAVE_INET_ATON'): REPLACE_SOURCE += ' inet_aton.c'
if not bld.CONFIG_SET('HAVE_INET_NTOP'): REPLACE_SOURCE += ' inet_ntop.c'
if not bld.CONFIG_SET('HAVE_INET_PTON'): REPLACE_SOURCE += ' inet_pton.c'
2012-06-04 02:47:03 +04:00
if not bld.CONFIG_SET('HAVE_GETXATTR') or bld.CONFIG_SET('XATTR_ADDITIONAL_OPTIONS'):
2012-06-01 07:29:38 +04:00
REPLACE_SOURCE += ' xattr.c'
2010-03-23 16:32:23 +03:00
2016-06-09 22:27:09 +03:00
if not bld.CONFIG_SET('HAVE_CLOSEFROM'):
REPLACE_SOURCE += ' closefrom.c'
2010-02-20 16:24:28 +03:00
bld.SAMBA_LIBRARY('replace',
2010-03-17 13:53:29 +03:00
source=REPLACE_SOURCE,
2010-03-17 12:12:16 +03:00
group='base_libraries',
2022-10-27 11:45:40 +03:00
# FIXME: Ideally symbols should be hidden here so they
# don't appear in the global namespace when Samba
# libraries are loaded, but this doesn't appear to work
2010-10-30 19:43:48 +04:00
# at the moment:
# hide_symbols=bld.BUILTIN_LIBRARY('replace'),
2010-10-21 01:30:15 +04:00
private_library=True,
nsswitch: reduce dependecies to private libraries and link static/builtin if possible
Over the last month I got more and more reports,
that it's not possible to use a custom Samba version
on systems with sssd being installed, which depends on some
specific samba libraries installed in the system.
One major problem is that the custom libnss_winbind.so.2
depends on the libreplace-samba4.so of the custom build
and also injects an RPATH into the running process.
When sssd uses any nss library call it will get this,
when it then tries to load some of its plugins via dlopen(),
e.g.
ldd /usr/lib64/sssd/libsss_ad.so| grep samba
libsamba-util.so.0 => /lib64/libsamba-util.so.0
libreplace-samba4.so => /usr/lib64/samba/libreplace-samba4.so
libsamba-security-samba4.so => /usr/lib64/samba/libsamba-security-samba4.so
libsamba-errors.so.1 => /lib64/libsamba-errors.so.1
libsamba-debug-samba4.so => /usr/lib64/samba/libsamba-debug-samba4.so
libgenrand-samba4.so => /usr/lib64/samba/libgenrand-samba4.so
libsocket-blocking-samba4.so => /usr/lib64/samba/libsocket-blocking-samba4.so
libtime-basic-samba4.so => /usr/lib64/samba/libtime-basic-samba4.so
libsys-rw-samba4.so => /usr/lib64/samba/libsys-rw-samba4.so
libiov-buf-samba4.so => /usr/lib64/samba/libiov-buf-samba4.so
When that loads dlopen() will fail as a soname libreplace-samba4.so is
already loaded, but the symbol version within the other one don't match, as the
contain the exact version, e.g. replace_dummy@@SAMBA_4.13.3.
This is just an example and similar things can happen in all situations
where we provide libraries, which are potentially injected into every
process of the running system. These should only depend on libc.so and
related basic system libraries in order to avoid the problem.
We have the following libraries, which are in the that category:
- libnss_winbind.so.2
- libnss_wins.so.2
- pam_winbind.so
- winbind_krb5_locator.so
- async_dns_krb5_locator.so
The rules of library loading are really complex and symbol versioning
is not enough to solve it, only the combination of unique soname and
unique symbol version suffix seem to solve the problem, but injecting
an RPATH is still a problem.
In order to solve the problem I experimented with adding SAMBA_SUBSYSTEM()
definitions with 'hide_symbols=True' in order to do some static linking
of selected components, e.g.
bld.SAMBA_SUBSYSTEM('replace-hidden',
source=REPLACE_SOURCE,
group='base_libraries',
hide_symbols=True,
deps='dl attr' + extra_libs)
It's relatively simple to get to the point where the following are
completely static:
- libnss_winbind.so.2
- libnss_wins.so.2
- pam_winbind.so
- winbind_krb5_locator.so
But 'async_dns_krb5_locator.so' links in almost everything!
It seems we install the krb5 plugins into our own $MODULESDIR/krb5/,
so it may not be so critical, as long it's the admin who created
the desired symlinks into the location the kerberos libraries search
for plugins. Note the at least the locator plugins are always loaded
without any configuration, every .so in a special path are loaded with dlopen().
This is done by every application using kerberos, so we load a lot of samba libraries
into them.
Packagers should not put async_dns_krb5_locator.so (nor a symlink) into
the path that's reachable by libkrb5.so.
As a longterm solution we may want to change async_dns_krb5_locator.so
to use a helper process with posix_spawn() instead of doing everything
within the process.
Note I added hiden_symbols=True to the nss modules for Linux and
FreeBSD only, because these are the only platforms I'm able to test
on. We most likely should do the same on other platforms, but some
with access to the platform should provide a tested patch.
In order to avoid manual definitions of SAMBA_SUBSYSTEMS() with
'-hidden', I added the 'provide_builtin_linking=True' option,
as the logic is very similar to what we already have with the
'--builtin-libraries=BUILTIN_LIBRARIES' configure option.
SAMBA_PLUGIN() is used in order to use SAMBA_LIBRARY() in order
to make it more strict that these plugins can't be used as
normal depedency by other subsystems and libraries.
While being there it was easy enough to make libwbclient.so
also standalone without dependecies to other samba libraries.
BUG: https://bugzilla.samba.org/show_bug.cgi?id=14780
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
2021-07-01 13:08:16 +03:00
provide_builtin_linking=True,
2019-11-06 05:44:45 +03:00
deps='dl attr' + extra_libs)
2010-02-20 16:24:28 +03:00
2019-01-06 22:41:32 +03:00
replace_test_cflags = ''
2017-06-22 17:07:27 +03:00
if bld.CONFIG_SET('HAVE_WNO_FORMAT_TRUNCATION'):
replace_test_cflags += " -Wno-format-truncation"
2010-10-30 17:59:14 +04:00
bld.SAMBA_SUBSYSTEM('replace-test',
2019-05-06 01:23:49 +03:00
source='''tests/testsuite.c tests/strptime.c
tests/os2_delete.c tests/getifaddrs.c''',
2016-11-01 03:26:11 +03:00
deps='replace',
2017-06-22 17:07:27 +03:00
cflags=replace_test_cflags)
2010-03-23 16:32:23 +03:00
2019-05-06 06:32:12 +03:00
bld.SAMBA_BINARY('replace_testsuite',
2019-05-06 01:23:49 +03:00
source='tests/main.c',
2019-05-06 06:32:12 +03:00
deps='replace replace-test',
install=False)
2010-02-23 08:48:23 +03:00
2010-03-25 06:32:58 +03:00
# build replacements for stdint.h and stdbool.h if needed
bld.SAMBA_GENERATOR('replace_stdint_h',
rule='cp ${SRC} ${TGT}',
source='hdr_replace.h',
target='stdint.h',
enabled = not bld.CONFIG_SET('HAVE_STDINT_H'))
bld.SAMBA_GENERATOR('replace_stdbool_h',
rule='cp ${SRC} ${TGT}',
source='hdr_replace.h',
target='stdbool.h',
enabled = not bld.CONFIG_SET('HAVE_STDBOOL_H'))
2010-04-05 03:58:23 +04:00
2013-08-02 00:28:05 +04:00
bld.SAMBA_SUBSYSTEM('samba_intl', source='', use_global_deps=False,deps=bld.env.intl_libs)
2019-05-06 01:23:49 +03:00
def testonly(ctx):
'''run talloc testsuite'''
import samba_utils
samba_utils.ADD_LD_LIBRARY_PATH('bin/shared')
samba_utils.ADD_LD_LIBRARY_PATH('bin/shared/private')
cmd = os.path.join(Context.g_module.out, 'replace_testsuite')
ret = samba_utils.RUN_COMMAND(cmd)
print("testsuite returned %d" % ret)
sys.exit(ret)
# WAF doesn't build the unit tests for this, maybe because they don't link with talloc?
# This forces it
def test(ctx):
Options.commands.append('build')
Options.commands.append('testonly')
2010-04-05 03:58:23 +04:00
def dist():
'''makes a tarball for distribution'''
samba_dist.dist()