Ignore:
Timestamp:
Nov 24, 2016, 1:14:11 PM (9 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: update vendor to version 4.4.3

File:
1 edited

Legend:

Unmodified
Added
Removed
  • vendor/current/source3/wscript

    r860 r988  
    1 #! /usr/bin/env python
    2 
    3 srcdir = '..'
    4 blddir = 'bin'
    5 
    6 APPNAME='samba'
    7 VERSION=None
     1#!/usr/bin/env python
     2
     3srcdir=".."
    84
    95import sys, os
     
    1612import samba3
    1713
     14default_prefix = Options.default_prefix = '/usr/local/samba'
     15
    1816def set_options(opt):
    19     if not os.getenv('TOPLEVEL_BUILD'):
    20         opt.BUILTIN_DEFAULT('NONE')
    21         opt.PRIVATE_EXTENSION_DEFAULT('s3')
    22         opt.RECURSE('../lib/replace')
    23         opt.RECURSE('build')
    24         opt.RECURSE('selftest')
    25         opt.RECURSE('../lib/nss_wrapper')
    26         opt.RECURSE('../lib/socket_wrapper')
    27         opt.RECURSE('../lib/tevent')
    28         opt.RECURSE('../lib/tdb')
    2917
    3018    opt.add_option('--with-static-modules',
    31                    help=("Comma-separated list of names of modules to statically link in"),
     19                   help=("Comma-separated list of names of modules to statically link in. "+
     20                         "May include !module to disable 'module'. "+
     21                         "Can be '!FORCED' to disable all non-required static only modules. "+
     22                         "Can be '!DEFAULT' to disable all modules defaulting to a static build. "+
     23                         "Can be 'ALL' to build all default shared modules static. "+
     24                         "The most specific one wins, while the order is ignored "+
     25                         "and --with-static-modules is evaluated before "+
     26                         "--with-shared-modules"),
    3227                   action="store", dest='static_modules', default=None)
    3328    opt.add_option('--with-shared-modules',
    34                    help=("Comma-separated list of names of modules to build shared"),
     29                   help=("Comma-separated list of names of modules to build shared. "+
     30                         "May include !module to disable 'module'. "+
     31                         "Can be '!FORCED' to disable all non-required shared only modules. "+
     32                         "Can be '!DEFAULT' to disable all modules defaulting to a shared build. "+
     33                         "Can be 'ALL' to build all default static modules shared. "+
     34                         "The most specific one wins, while the order is ignored "+
     35                         "and --with-static-modules is evaluated before "+
     36                         "--with-shared-modules"),
    3537                   action="store", dest='shared_modules', default=None)
    36     opt.add_option('--enable-selftest',
    37                   help=("enable options necessary for selftest"),
    38                   action="store_true", dest='enable_selftest', default=False)
    3938
    4039    opt.SAMBA3_ADD_OPTION('winbind')
    41     opt.SAMBA3_ADD_OPTION('swat')
    4240    opt.SAMBA3_ADD_OPTION('ads')
    43     opt.SAMBA3_ADD_OPTION('krb5')
    4441    opt.SAMBA3_ADD_OPTION('ldap')
    4542    opt.SAMBA3_ADD_OPTION('cups', with_name="enable", without_name="disable")
    4643    opt.SAMBA3_ADD_OPTION('iprint', with_name="enable", without_name="disable")
    47     opt.SAMBA3_ADD_OPTION('merged-build', with_name="enable", without_name="disable")
    4844    opt.SAMBA3_ADD_OPTION('pam')
    49     opt.SAMBA3_ADD_OPTION('pam_smbpass')
    5045    opt.SAMBA3_ADD_OPTION('quotas')
    51     opt.SAMBA3_ADD_OPTION('sys-quotas')
    5246    opt.SAMBA3_ADD_OPTION('sendfile-support')
    5347    opt.SAMBA3_ADD_OPTION('utmp')
    54     opt.SAMBA3_ADD_OPTION('pthreadpool', with_name="enable", without_name="disable")
     48    opt.SAMBA3_ADD_OPTION('pthreadpool', with_name="enable", without_name="disable", default=True)
    5549    opt.SAMBA3_ADD_OPTION('avahi', with_name="enable", without_name="disable")
    5650    opt.SAMBA3_ADD_OPTION('iconv')
     
    5953    opt.SAMBA3_ADD_OPTION('syslog')
    6054    opt.SAMBA3_ADD_OPTION('automount')
    61     opt.SAMBA3_ADD_OPTION('aio-support')
    62     opt.SAMBA3_ADD_OPTION('profiling-data')
    63 
    64     opt.SAMBA3_ADD_OPTION('cluster-support')
    65 
    66     opt.add_option('--with-ctdb-dir',
    67                    help=("Directory under which ctdb is installed"),
    68                    action="store", dest='ctdb_dir', default=None)
    69     opt.add_option('--enable-old-ctdb',
    70                   help=("enable building against (too) old version of ctdb (default=false)"),
    71                   action="store_true", dest='enable_old_ctdb', default=False)
    72 
    73 
     55    opt.SAMBA3_ADD_OPTION('dmapi', default=None) # None means autodetection
     56    opt.SAMBA3_ADD_OPTION('fam', default=None) # None means autodetection
     57    opt.SAMBA3_ADD_OPTION('profiling-data', default=False)
     58    opt.SAMBA3_ADD_OPTION('libarchive', default=None)
     59
     60    opt.SAMBA3_ADD_OPTION('cluster-support', default=None)
     61
     62    opt.SAMBA3_ADD_OPTION('regedit', default=None)
     63
     64    opt.SAMBA3_ADD_OPTION('fake-kaserver',
     65                          help=("Include AFS fake-kaserver support"), default=False)
     66
     67    opt.add_option('--with-libcephfs',
     68                   help=("Directory under which libcephfs is installed"),
     69                   action="store", dest='libcephfs_dir', default=None)
     70
     71    opt.SAMBA3_ADD_OPTION('glusterfs', with_name="enable", without_name="disable", default=True)
     72
     73    opt.add_option('--enable-vxfs',
     74                  help=("enable support for VxFS (default=no)"),
     75                  action="store_true", dest='enable_vxfs', default=False)
     76
     77    opt.SAMBA3_ADD_OPTION('spotlight', with_name="enable", without_name="disable", default=False)
    7478
    7579def configure(conf):
    7680    from samba_utils import TO_LIST
    7781
    78     if not conf.env.toplevel_build:
    79         version = samba_version.load_version(env=conf.env)
    80         conf.DEFINE('CONFIG_H_IS_FROM_SAMBA', 1)
    81         conf.DEFINE('_SAMBA_BUILD_', version.MAJOR, add_to_cflags=True)
    82         conf.DEFINE('HAVE_CONFIG_H', 1, add_to_cflags=True)
     82    default_static_modules = []
     83    default_shared_modules = []
     84    required_static_modules = []
     85    forced_static_modules = []
     86    forced_shared_modules = []
    8387
    8488    if Options.options.developer:
     
    8690        conf.env.developer = True
    8791
    88     if Options.options.with_swat:
    89         conf.env['build_swat'] = True
    90 
    91     if not conf.env.toplevel_build:
    92         conf.RECURSE('../lib/replace')
    93         conf.RECURSE('build')
    94         conf.RECURSE('../lib/tdb')
    95         conf.RECURSE('../lib/talloc')
    96         conf.RECURSE('../lib/tevent')
    97         conf.RECURSE('../lib/popt')
    98         conf.RECURSE('../lib/nss_wrapper')
    99         conf.RECURSE('../lib/socket_wrapper')
    100         conf.RECURSE('../lib/zlib')
    101         conf.RECURSE('../libcli/smbreadline')
    102         conf.RECURSE('../lib/util')
    103 
    104         conf.ADD_EXTRA_INCLUDES('''#source3 #source3/include #lib/replace''')
    105         if not conf.env.USING_SYSTEM_TDB:
    106             conf.ADD_EXTRA_INCLUDES('#lib/tdb/include')
    107         if not conf.env.USING_SYSTEM_TEVENT:
    108             conf.ADD_EXTRA_INCLUDES('#lib/tevent')
    109         if not conf.env.USING_SYSTEM_TALLOC:
    110             conf.ADD_EXTRA_INCLUDES('#lib/talloc')
    111         if not conf.env.USING_SYSTEM_POPT:
    112             conf.ADD_EXTRA_INCLUDES('#lib/popt')
    113 
    114     conf.ADD_LDFLAGS("-Wl,--export-dynamic", testflags=True)
     92    if sys.platform != 'openbsd5':
     93        conf.ADD_LDFLAGS("-Wl,--export-dynamic", testflags=True)
     94
     95    # We crash without vfs_default
     96    required_static_modules.extend(TO_LIST('vfs_default'))
    11597
    11698    conf.CHECK_HEADERS('execinfo.h libexc.h libunwind.h netdb.h')
    117     conf.CHECK_HEADERS('linux/falloc.h')
    118 
    119     conf.CHECK_FUNCS('getcwd fchown chmod fchmod mknod mknod64')
     99    conf.CHECK_HEADERS('linux/falloc.h linux/ioctl.h')
     100
     101    conf.CHECK_FUNCS('getcwd fchown chmod fchmod mknod')
    120102    conf.CHECK_FUNCS('strtol strchr strupr chflags')
    121103    conf.CHECK_FUNCS('getrlimit fsync fdatasync setpgid')
    122104    conf.CHECK_FUNCS('setsid glob strpbrk crypt16 getauthuid')
    123     conf.CHECK_FUNCS('sigprocmask sigblock sigaction sigset innetgr')
     105    conf.CHECK_FUNCS('innetgr')
    124106    conf.CHECK_FUNCS('initgroups select poll rdchk getgrnam getgrent pathconf')
    125     conf.CHECK_FUNCS('setpriv setgidx setuidx setgroups sysconf stat64 fstat64')
    126     conf.CHECK_FUNCS('lstat64 fopen64 atexit grantpt posix_openpt lseek64 ftruncate64 fallocate fallocate64 posix_fallocate posix_fallocate64')
    127     conf.CHECK_FUNCS('fseeko fseek64 fseeko64 ftell64 ftello64 setluid')
     107    conf.CHECK_FUNCS('setpriv setgidx setuidx setgroups syscall sysconf')
     108    conf.CHECK_FUNCS('atexit grantpt posix_openpt fallocate posix_fallocate')
     109    conf.CHECK_FUNCS('fseeko setluid')
    128110    conf.CHECK_FUNCS('getpwnam', headers='sys/types.h pwd.h')
    129     conf.CHECK_FUNCS('opendir64 readdir64 seekdir64 telldir64 rewinddir64 closedir64')
    130     conf.CHECK_FUNCS('fdopendir fdopendir64')
    131     conf.CHECK_FUNCS('getpwent_r getdents64 setenv strcasecmp fcvt fcvtl')
    132     conf.CHECK_FUNCS('syslog vsyslog timegm setlocale nl_langinfo')
     111    conf.CHECK_FUNCS('fdopendir')
     112    conf.CHECK_FUNCS('fstatat')
     113    conf.CHECK_FUNCS('getpwent_r setenv strcasecmp fcvt fcvtl')
     114    conf.CHECK_FUNCS('syslog vsyslog timegm setlocale')
    133115    conf.CHECK_FUNCS_IN('nanosleep', 'rt')
    134116    conf.CHECK_FUNCS('lutimes futimes utimensat futimens')
     
    137119    conf.CHECK_FUNCS('shmget')
    138120    conf.CHECK_FUNCS_IN('shm_open', 'rt', checklibc=True)
    139     conf.CHECK_FUNCS('gettext dgettext bindtextdomain textdomain')
    140121    #FIXME: for some reason this one still fails
    141122    conf.CHECK_FUNCS_IN('yp_get_default_domain', 'nsl')
    142123    conf.CHECK_FUNCS_IN('dn_expand _dn_expand __dn_expand', 'resolv')
     124    conf.CHECK_FUNCS_IN('dn_expand', 'inet')
    143125    conf.CHECK_DECLS('fdatasync', reverse=True)
    144126    conf.CHECK_DECLS('readahead', reverse=True, headers='fcntl.h')
    145 
    146     if conf.CONFIG_SET('HAVE_LONG_LONG'):
    147         conf.DEFINE('HAVE_LONGLONG', 1)
    148127
    149128    if conf.CHECK_CODE('''
     
    151130#include <unistd.h>
    152131#endif
    153 long ret = splice(0,0,1,0,400,0);
     132long ret = splice(0,0,1,0,400,SPLICE_F_MOVE);
    154133''',
    155134        'HAVE_LINUX_SPLICE',
     
    157136        conf.CHECK_DECLS('splice', reverse=True, headers='fcntl.h')
    158137
    159     # Check for inotify support
    160     conf.CHECK_HEADERS('linux/inotify.h asm/unistd.h sys/inotify.h')
    161     conf.CHECK_FUNCS('inotify_init')
    162     if "HAVE_INOTIFY_INIT" in conf.env:
    163         if "HAVE_LINUX_INOTIFY_H" in conf.env or "HAVE_SYS_INOTIFY_H" in conf.env:
    164             conf.DEFINE('HAVE_INOTIFY', 1)
     138    # Check for inotify support (Skip if we are SunOS)
     139    #NOTE: illumos provides sys/inotify.h but is not an exact match for linux
     140    host_os = sys.platform
     141    if host_os.rfind('sunos') == -1:
     142        conf.CHECK_HEADERS('sys/inotify.h')
     143        if "HAVE_SYS_INOTIFY_H" in conf.env:
     144           conf.DEFINE('HAVE_INOTIFY', 1)
    165145
    166146    # Check for kernel change notify support
     
    200180#include <sys/file.h>
    201181#ifndef LOCK_MAND
    202 #define LOCK_MAND       32
    203 #define LOCK_READ       64
     182#define LOCK_MAND        32
     183#define LOCK_READ        64
    204184#endif
    205185main() {
    206186        exit(flock(open("/dev/null", O_RDWR), LOCK_MAND|LOCK_READ) != 0);
    207187}''', 'HAVE_KERNEL_SHARE_MODES', addmain=False, execute=True,
    208         msg="Checking for krenel share modes")
     188        msg="Checking for kernel share modes")
     189
     190    # check for fam libs
     191    samba_fam_libs=None
     192    check_for_fam=False
     193    if Options.options.with_fam is None:
     194        check_for_fam=True
     195    elif Options.options.with_fam == True:
     196        check_for_fam=True
     197
     198    if check_for_fam and conf.CHECK_HEADERS('fam.h'):
     199        if conf.CHECK_FUNCS_IN('FAMOpen2', 'fam'):
     200            samba_fam_libs='fam'
     201        elif conf.CHECK_FUNCS_IN('FAMOpen2', 'fam C'):
     202            samba_fam_libs='fam C'
     203        conf.CHECK_TYPE('enum FAMCodes', headers='fam.h',
     204            define='HAVE_FAM_H_FAMCODES_TYPEDEF',
     205            msg='Checking whether enum FAMCodes is available')
     206        conf.CHECK_FUNCS_IN('FAMNoExists', 'fam')
     207
     208    if samba_fam_libs is not None:
     209        conf.DEFINE('SAMBA_FAM_LIBS', samba_fam_libs)
     210    else:
     211        if Options.options.with_fam == True:
     212            conf.fatal('FAM support requested, but no suitable FAM library found')
     213        elif check_for_fam:
     214            Logs.warn('no suitable FAM library found')
     215
     216    # check for libarchive (tar command in smbclient)
     217    # None means autodetect, True/False means enable/disable
     218    conf.SET_TARGET_TYPE('archive', 'EMPTY')
     219    if Options.options.with_libarchive is not False:
     220        libarchive_mandatory = Options.options.with_libarchive == True
     221        Logs.info("Checking for libarchive existence")
     222        if conf.CHECK_HEADERS('archive.h') and conf.CHECK_LIB('archive', shlib=True):
     223            conf.CHECK_FUNCS_IN('archive_read_support_filter_all archive_read_free', 'archive')
     224        elif libarchive_mandatory:
     225            conf.fatal('libarchive support requested, but not found')
     226
     227    # check for DMAPI libs
     228    if Options.options.with_dmapi == False:
     229        have_dmapi = False
     230    else:
     231        have_dmapi = True
     232        Logs.info("Checking for DMAPI library existence")
     233        samba_dmapi_lib = ''
     234        if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'dm'):
     235            samba_dmapi_lib = 'dm'
     236        else:
     237            if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'jfsdm'):
     238                samba_dmapi_lib = 'jfsdm'
     239            else:
     240                if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'dmapi'):
     241                    samba_dmapi_lib = 'dmapi'
     242                else:
     243                    if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'xdsm'):
     244                        samba_dmapi_lib = 'xdsm'
     245        # only bother to test headers and compilation when a candidate
     246        # library has been found
     247        if samba_dmapi_lib == '':
     248            have_dmapi = False
     249            broken_dmapi = "no suitable DMAPI library found"
     250
     251        if have_dmapi:
     252            conf.CHECK_HEADERS('sys/dmi.h xfs/dmapi.h sys/jfsdmapi.h sys/dmapi.h dmapi.h')
     253            conf.CHECK_CODE('''
     254#include <time.h>      /* needed by Tru64 */
     255#include <sys/types.h> /* needed by AIX */
     256#ifdef HAVE_XFS_DMAPI_H
     257#include <xfs/dmapi.h>
     258#elif defined(HAVE_SYS_DMI_H)
     259#include <sys/dmi.h>
     260#elif defined(HAVE_SYS_JFSDMAPI_H)
     261#include <sys/jfsdmapi.h>
     262#elif defined(HAVE_SYS_DMAPI_H)
     263#include <sys/dmapi.h>
     264#elif defined(HAVE_DMAPI_H)
     265#include <dmapi.h>
     266#endif
     267
     268/* This link test is designed to fail on IRI 6.4, but should
     269 * succeed on Linux, IRIX 6.5 and AIX.
     270 */
     271int main(int argc, char **argv)
     272{
     273        char * version;
     274        dm_eventset_t events;
     275        /* This doesn't take an argument on IRIX 6.4. */
     276        dm_init_service(&version);
     277        /* IRIX 6.4 expects events to be a pointer. */
     278        DMEV_ISSET(DM_EVENT_READ, events);
     279
     280        return 0;
     281}
     282''',
     283            'USEABLE_DMAPI_LIBRARY',
     284            addmain=False,
     285            execute=False,
     286            lib=samba_dmapi_lib,
     287            msg='Checking whether DMAPI lib '+samba_dmapi_lib+' can be used')
     288            if not conf.CONFIG_SET('USEABLE_DMAPI_LIBRARY'):
     289                have_dmapi = False
     290                broken_dmapi = "no usable DMAPI library found"
     291
     292    if have_dmapi:
     293        Logs.info("Building with DMAPI support.")
     294        conf.env['dmapi_lib'] = samba_dmapi_lib
     295        conf.DEFINE('USE_DMAPI', 1)
     296    else:
     297        if Options.options.with_dmapi == False:
     298            Logs.info("Building without DMAPI support (--without-dmapi).")
     299        elif Options.options.with_dmapi == True:
     300            Logs.error("DMAPI support not available: " + broken_dmapi)
     301            conf.fatal('DMAPI support requested but not found.');
     302        else:
     303            Logs.warn("Building without DMAPI support: " + broken_dmapi)
     304        conf.env['dmapi_lib'] = ''
    209305
    210306    # Check for various members of the stat structure
    211     conf.CHECK_TYPES('blksize_t blkcnt_t')
    212307    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blocks', define='HAVE_STAT_ST_BLOCKS',
    213308                                headers='sys/stat.h')
     
    215310                                headers='sys/stat.h')
    216311    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_flags', define='HAVE_STAT_ST_FLAGS',
    217                                 headers='sys/types.h sys/stat.h unistd.h')
     312                                headers='sys/types.h sys/stat.h unistd.h')
     313
     314    if "HAVE_BLKCNT_T" in conf.env:
     315        conf.CHECK_CODE('''
     316        static int test_array[1 - 2 * !(((long int)(sizeof(blkcnt_t))) <= 4)];''',
     317                'SIZEOF_BLKCNT_T_4',
     318                headers='replace.h sys/types.h sys/stat.h unistd.h',
     319                msg="Checking whether blkcnt_t is 32 bit")
     320
     321    # If sizeof is 4 it can't be 8
     322    if "HAVE_BLKCNT_T" in conf.env:
     323        if not conf.CONFIG_SET('SIZEOF_BLKCNT_T_4'):
     324            conf.CHECK_CODE('''
     325            static int test_array[1 - 2 * !(((long int)(sizeof(blkcnt_t))) <= 8)];''',
     326                    'SIZEOF_BLKCNT_T_8',
     327                    headers='replace.h sys/types.h sys/stat.h unistd.h',
     328                    msg="Checking whether blkcnt_t is 64 bit")
    218329
    219330    # Check for POSIX capability support
     
    232343                        msg="Checking whether POSIX capabilities are available")
    233344
    234     # Check for int16, uint16, int32 and uint32 in rpc/types.h included from
    235     # rpc/rpc.h. This is *really* broken but some systems (DEC OSF1) do this.
    236     # -- JRA.
    237     if conf.CONFIG_SET("HAVE_RPC_RPC_H"):
    238         conf.CHECK_TYPE('int16', headers='rpc/rpc.h',
    239                         define='HAVE_INT16_FROM_RPC_RPC_H',
    240                         msg="Checking for int16 typedef included by rpc/rpc.h")
    241         conf.CHECK_CODE('uint16 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
    242                         headers='sys/types.h rpc/rpc.h',
    243                         msg="Checking for uint16 typedef included by rpc/rpc.h")
    244         conf.CHECK_CODE('int32 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
    245                         headers='sys/types.h rpc/rpc.h',
    246                         msg="Checking for int32 typedef included by rpc/rpc.h")
    247         conf.CHECK_CODE('uint32 testvar;', 'HAVE_INT16_FROM_RPC_RPC_H',
    248                         headers='sys/types.h rpc/rpc.h',
    249                         msg="Checking for uint32 typedef included by rpc/rpc.h")
    250345    conf.CHECK_CODE('int i;', 'BROKEN_NISPLUS_INCLUDE_FILES',
    251346                    headers='sys/types.h sys/acl.h rpcsvc/nis.h',
     
    254349    # Check if the compiler will optimize out functions
    255350    conf.CHECK_CODE('''
    256 if (0) {
    257     this_function_does_not_exist();
    258 } else {
    259     return 1;
     351#include <sys/types.h>
     352size_t __unsafe_string_function_usage_here_size_t__(void);
     353#define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *))
     354static size_t push_string_check_fn(void *dest, const char *src, size_t dest_len) {
     355        return 0;
     356}
     357
     358#define push_string_check(dest, src, dest_len) \
     359    (CHECK_STRING_SIZE(dest, dest_len) \
     360    ? __unsafe_string_function_usage_here_size_t__()    \
     361    : push_string_check_fn(dest, src, dest_len))
     362
     363int main(int argc, char **argv) {
     364    char outbuf[1024];
     365    char *p = outbuf;
     366    const char *foo = "bar";
     367    p += 31 + push_string_check(p + 31, foo, sizeof(outbuf) - (p + 31 - outbuf));
     368    return 0;
    260369}''', 'HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS',
    261         msg="Checking if the compiler will optimize out functions")
     370            addmain=False,
     371            add_headers=False,
     372            msg="Checking if the compiler will optimize out functions")
    262373
    263374    # Check if the compiler supports the LL suffix on long long integers
     
    268379
    269380    conf.CHECK_FUNCS('''
    270 _acl __acl add_proplist_entry atexit attr_getf attr_list attr_listf
    271 attropen attr_remove attr_removef attr_set attr_setf backtrace_symbols
    272 bindtextdomain _chdir __chdir chflags chmod _close __close _closedir
    273 __closedir closedir64 creat64 crypt16 delproplist devnm dgettext dirfd
     381_acl __acl atexit
     382 _chdir __chdir chflags chmod _close __close _closedir
     383__closedir crypt16 devnm dirfd
    274384DNSServiceRegister _dup __dup _dup2 __dup2 endmntent execl
    275 extattr_delete_fd extattr_delete_link extattr_get_fd extattr_get_file
    276 extattr_get_link extattr_list_fd extattr_list_file extattr_list_link
    277 extattr_set_fd extattr_set_file extattr_set_link _facl __facl _fchdir
     385_facl __facl _fchdir
    278386__fchdir fchmod fchown _fcntl __fcntl fcvt fcvtl fdatasync
    279 fdelproplist fgetea fgetproplist fgetxattr flistea flistxattr fopen64
    280 _fork __fork fremoveea fremovexattr fseeko fseek64 fseeko64 fsetea
    281 fsetproplist fsetxattr _fstat __fstat fstat64 _fstat64 __fstat64 fsync
    282 ftell64 ftello64 ftruncate64 futimens futimes __fxstat getauthuid
    283 getcwd _getcwd __getcwd getdents __getdents getdents64 getdirentries
     387_fork __fork fseeko
     388fsetxattr _fstat __fstat fsync
     389futimens futimes __fxstat getauthuid
     390getcwd _getcwd __getcwd getdents __getdents getdirentries
    284391getgrent getgrnam getgrouplist getgrset getmntent getpagesize
    285 getproplist get_proplist_entry getpwanam getpwent_r getrlimit gettext
     392getpwanam getpwent_r getrlimit
    286393glob grantpt hstrerror initgroups innetgr
    287 inotify_init lgetea lgetxattr listea listxattr llistea llistxattr
    288 llseek _llseek __llseek lremoveea lremovexattr _lseek __lseek lseek64
    289 lsetea lsetxattr _lstat __lstat lstat64 _lstat64 __lstat64 lutimes
    290 __lxstat memalign mknod mknod64 mlock mlockall munlock munlockall
    291 nl_langinfo _open __open open64 _open64 __open64 _opendir __opendir
    292 opendir64 pathconf poll posix_fallocate posix_fallocate64
    293 posix_memalign prctl pread _pread __pread pread64 _pread64 __pread64
    294 pwrite _pwrite __pwrite pwrite64 _pwrite64
    295 __pwrite64 rdchk _read __read _readdir __readdir readdir64 _readdir64
    296 __readdir64 removeea removexattr rewinddir64 _seekdir __seekdir
    297 seekdir64 select setea setenv setgidx setgroups setlocale setluid
    298 setmntent setpgid setpriv setproplist setsid setuidx
    299 setxattr shmget shm_open sigaction sigblock sigprocmask sigset
    300 sizeof_proplist_entry _stat __stat stat64 _stat64 __stat64 statvfs
    301 strcasecmp strchr strpbrk strsignal strtol strupr sysconf sysctlbyname
    302 __sys_llseek syslog _telldir __telldir telldir64 textdomain timegm
     394llseek _llseek __llseek _lseek __lseek
     395_lstat __lstat lutimes
     396__lxstat memalign mknod mlock mlockall munlock munlockall
     397_open __open _opendir __opendir
     398pathconf poll posix_fallocate
     399posix_memalign pread _pread __pread
     400pwrite _pwrite __pwrite
     401rdchk _read __read _readdir __readdir
     402_seekdir __seekdir
     403select setenv setgidx setgroups setlocale setluid
     404setmntent setpgid setpriv setsid setuidx
     405shmget shm_open
     406_stat __stat statvfs
     407strcasecmp strchr strpbrk strsignal strtol strupr sysconf sysctl sysctlbyname
     408__sys_llseek syslog _telldir __telldir timegm
    303409utimensat vsyslog _write __write __xstat
    304410''')
     
    308414    # FIXME: these should be tests for features, but the old build system just
    309415    # checks for OSes.
    310     import sys
    311416    host_os = sys.platform
    312417    Logs.info("building on %s" % host_os)
     
    325430    elif (host_os.rfind('darwin') > -1):
    326431        conf.DEFINE('DARWINOS', 1)
     432        conf.ADD_CFLAGS('-fno-common')
    327433        conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
    328         conf.ADD_CFLAGS('-fno-common')
    329434    elif (host_os.rfind('freebsd') > -1):
     435        conf.DEFINE('FREEBSD', 1)
    330436        if conf.CHECK_HEADERS('sunacl.h'):
    331             conf.define('HAVE_FREEBSD_SUNACL_H', '1')
    332             conf.CHECK_FUNCS_IN('acl', 'sunacl')
     437            conf.DEFINE('HAVE_FREEBSD_SUNACL_H', '1')
     438            conf.CHECK_FUNCS_IN(['acl'], 'sunacl')
    333439        conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
    334     elif (host_os.rfind('netbsd') > -1):
     440    elif (host_os.rfind('irix') > -1):
     441        conf.DEFINE('IRIX', 1)
    335442        conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
    336     elif (host_os.rfind('openbsd') > -1):
     443    elif (host_os.rfind('aix') > -1):
     444        conf.DEFINE('AIX', 1)
     445        conf.DEFINE('STAT_ST_BLOCKSIZE', 'DEV_BSIZE')
     446    elif (host_os.rfind('hpux') > -1):
     447        conf.DEFINE('HPUX', 1)
     448        conf.DEFINE('STAT_ST_BLOCKSIZE', '8192')
     449    elif (host_os.rfind('osf') > -1):
     450        conf.DEFINE('OSF1', 1)
    337451        conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
    338     elif (host_os.rfind('sunos') > -1):
    339         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
     452
    340453    # FIXME: Add more checks here.
    341454    else:
    342         Logs.warn("Unknown host_os '%s', please report this to samba-technical@samba.org" % host_os)
    343 
    344     #FIXME: add more checks
     455        conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
     456
    345457    if Options.options.with_acl_support:
    346         if host_os.rfind('linux') > -1:
    347             conf.CHECK_FUNCS_IN('acl_get_file', 'acl')
    348             conf.CHECK_FUNCS_IN('getxattr', 'attr')
     458        if (host_os.rfind('hpux') > -1):
     459                Logs.info('Using HPUX ACLs')
     460                conf.DEFINE('HAVE_HPUX_ACLS',1)
     461                conf.DEFINE('POSIX_ACL_NEEDS_MASK',1)
     462                default_static_modules.extend(TO_LIST('vfs_hpuxacl'))
     463        elif (host_os.rfind('aix') > -1):
     464                Logs.info('Using AIX ACLs')
     465                conf.DEFINE('HAVE_AIX_ACLS',1)
     466                default_static_modules.extend(TO_LIST('vfs_aixacl vfs_aixacl2'))
     467        elif (host_os.rfind('darwin') > -1):
     468            Logs.warn('ACLs on Darwin currently not supported')
     469            conf.fatal("ACL support not available on Darwin/MacOS. "
     470                       "Use --without-acl-support for building without "
     471                       "ACL support. "
     472                       "ACL support is required to change permissions "
     473                       "from Windows clients.")
     474        else:
     475            conf.CHECK_FUNCS_IN(['acl_get_file'], 'acl')
    349476            if conf.CHECK_CODE('''
    350477acl_t acl;
     
    355482                        'HAVE_POSIX_ACLS',
    356483                        headers='sys/types.h sys/acl.h', link=False,
    357                         msg="Checking for POSIX ACL support") :
     484                        msg="Checking for POSIX ACL support") :
    358485                conf.CHECK_CODE('''
    359486acl_permset_t permset_d;
     
    364491                        headers='sys/types.h sys/acl.h', link=True,
    365492                        msg="Checking whether acl_get_perm_np() is available")
    366         else:
    367             conf.DEFINE('HAVE_NO_ACLS', 1)
    368             conf.SET_TARGET_TYPE('acl', 'EMPTY')
    369     else:
    370         conf.DEFINE('HAVE_NO_ACLS', 1)
    371         conf.SET_TARGET_TYPE('acl', 'EMPTY')
     493                # source3/lib/sysacls.c calls posixacl_sys_acl_get_file()
     494                required_static_modules.extend(TO_LIST('vfs_posixacl'))
     495                conf.CHECK_VARIABLE('ACL_EVERYONE', headers='sys/acl.h')
     496            elif conf.CHECK_FUNCS_IN(['facl'], 'sec'):
     497                Logs.info('Using solaris or UnixWare ACLs')
     498                conf.DEFINE('HAVE_SOLARIS_UNIXWARE_ACLS',1)
     499                default_static_modules.extend(TO_LIST('vfs_solarisacl'))
     500            elif conf.CHECK_FUNCS_IN(['acl_get_fd'], 'pacl'):
     501                Logs.info('Using Tru64 ACLs')
     502                conf.DEFINE('HAVE_TRU64_ACLS',1)
     503                default_static_modules.extend(TO_LIST('vfs_tru64acl'))
     504            else:
     505                conf.fatal("ACL support not found. Try installing libacl1-dev "
     506                           "or libacl-devel.  "
     507                           "Otherwise, use --without-acl-support to build "
     508                           "without ACL support. "
     509                           "ACL support is required to change permissions from "
     510                           "Windows clients.")
    372511
    373512    if conf.CHECK_FUNCS('dirfd'):
     
    376515    conf.CHECK_CODE('struct statfs fsd; fsid_t fsid = fsd.f_fsid; return statfs(".", &fsd);',
    377516                    'HAVE_STATFS_F_FSID',
    378                     msg="vfs_fileid: checking for statfs() and struct statfs.f_fsid",
     517                    msg="vfs_fileid checking for statfs() and struct statfs.f_fsid",
    379518                    headers='sys/types.h sys/statfs.h',
    380519                    execute=True)
     
    382521    if conf.CONFIG_SET('HAVE_FALLOCATE'):
    383522        conf.CHECK_CODE('''
    384                 #if defined(HAVE_UNISTD_H)
    385                 #include <unistd.h>
    386                 #endif
    387                 #include <sys/types.h>
    388                 #define _GNU_SOURCE
    389                 #include <fcntl.h>
    390                 #if defined(HAVE_LINUX_FALLOC_H)
    391                 #include <linux/falloc.h>
    392                 #endif
    393                 int ret = fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 10);''',
    394                 'HAVE_LINUX_FALLOCATE',
    395                 msg="Checking whether the Linux 'fallocate' function is available")
    396     if conf.CONFIG_SET('HAVE_FALLOCATE64'):
     523                int ret = fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 10);''',
     524                'HAVE_LINUX_FALLOCATE',
     525                msg="Checking whether the Linux 'fallocate' function is available",
     526                headers='unistd.h sys/types.h fcntl.h linux/falloc.h')
    397527        conf.CHECK_CODE('''
    398                 #if defined(HAVE_UNISTD_H)
    399                 #include <unistd.h>
    400                 #endif
    401                 #include <sys/types.h>
    402                 #define _GNU_SOURCE
    403                 #include <fcntl.h>
    404                 #if defined(HAVE_LINUX_FALLOC_H)
    405                 #include <linux/falloc.h>
    406                 #endif
    407                 int ret = fallocate64(0, FALLOC_FL_KEEP_SIZE, 0, 10);''',
    408                 'HAVE_LINUX_FALLOCATE64',
    409                 msg="Checking whether the Linux 'fallocate64' function is available")
     528                int ret = fallocate(0, FALLOC_FL_PUNCH_HOLE, 0, 10);''',
     529                'HAVE_FALLOC_FL_PUNCH_HOLE',
     530                msg="Checking whether Linux 'fallocate' supports hole-punching",
     531                headers='unistd.h sys/types.h fcntl.h linux/falloc.h')
     532
    410533    conf.CHECK_CODE('''
    411                 #if defined(HAVE_UNISTD_H)
    412                 #include <unistd.h>
    413                 #endif
    414                 #include <fcntl.h>
    415                 ssize_t err = readahead(0,0,0x80000);''',
    416                 'HAVE_LINUX_READAHEAD',
    417                 msg="Checking whether Linux readahead is available")
     534            int ret = lseek(0, 0, SEEK_HOLE);
     535            ret = lseek(0, 0, SEEK_DATA);''',
     536            'HAVE_LSEEK_HOLE_DATA',
     537            msg="Checking whether lseek supports hole/data seeking",
     538            headers='unistd.h sys/types.h')
     539
     540    conf.CHECK_CODE('''
     541                ssize_t err = readahead(0,0,0x80000);''',
     542                'HAVE_LINUX_READAHEAD',
     543                msg="Checking whether Linux readahead is available",
     544                headers='unistd.h fcntl.h')
    418545    conf.CHECK_DECLS('readahead', headers='fcntl.h', always=True)
    419546
    420     conf.CHECK_CODE('''
    421                 #include <sys/types.h>
    422                 #include <sys/socket.h>],
    423                 struct ucred cred;
    424                 socklen_t cred_len;
    425                 int ret = getsockopt(0, SOL_SOCKET, SO_PEERCRED, &cred, &cred_len);''',
    426                 'HAVE_PEERCRED',
    427                 msg="Checking whether we can use SO_PEERCRED to get socket credentials")
    428 
    429     conf.CHECK_CODE('''
    430                 #if defined(HAVE_LONGLONG) && (defined(HAVE_OFF64_T) || (defined(SIZEOF_OFF_T) && (SIZEOF_OFF_T == 8)))
    431                 #include <sys/types.h>
    432                 #else
    433                 __COMPILE_ERROR_
    434                 #endif
    435                 int i;''',
    436                 'HAVE_EXPLICIT_LARGEFILE_SUPPORT',
    437                 msg="Checking whether large file support can be enabled")
    438 
    439     if Options.options.with_aio_support:
    440         conf.CHECK_FUNCS_IN('aio_read', 'aio')
    441         conf.CHECK_FUNCS_IN('aio_read', 'rt')
    442         conf.CHECK_CODE('struct aiocb a; return aio_read(&a);',
    443                         'HAVE_AIO',
    444                         msg='Checking for asynchronous io support',
    445                         headers='sys/types.h aio.h',
    446                         lib='aio rt')
    447         conf.CHECK_CODE('struct aiocb64 a; return aio_read64(&a);',
    448                         'HAVE_AIO64',
    449                         msg='Checking for 64-bit asynchronous io support',
    450                         headers='sys/types.h aio.h',
    451                         lib='aio rt')
    452         if conf.CONFIG_SET('HAVE_AIO64'):
    453             conf.DEFINE('HAVE_AIOCB64', '1')
    454             conf.DEFINE('WITH_AIO', '1')
    455         elif conf.CONFIG_SET('HAVE_AIO'):
    456             conf.DEFINE('WITH_AIO', '1')
    457         if conf.CONFIG_SET('HAVE_AIO'):
    458             conf.CHECK_CODE('struct aiocb a; return aio_read(&a);', 'HAVE_AIO_READ', msg='Checking for aio_read', headers='aio.h', lib='aio rt')
    459             conf.CHECK_CODE('struct aiocb a; return aio_write(&a);', 'HAVE_AIO_WRITE', msg='Checking for aio_write', headers='aio.h', lib='aio rt')
    460             conf.CHECK_CODE('struct aiocb a; return aio_fsync(1, &a);', 'HAVE_AIO_FSYNC', msg='Checking for aio_fsync', headers='aio.h', lib='aio rt')
    461             conf.CHECK_CODE('struct aiocb a; return aio_return(&a);', 'HAVE_AIO_RETURN', msg='Checking for aio_return', headers='aio.h', lib='aio rt')
    462             conf.CHECK_CODE('struct aiocb a; return aio_error(&a);', 'HAVE_AIO_ERROR', msg='Checking for aio_error', headers='aio.h', lib='aio rt')
    463             conf.CHECK_CODE('struct aiocb a; return aio_cancel(1, &a);', 'HAVE_AIO_CANCEL', msg='Checking for aio_cancel', headers='aio.h', lib='aio rt')
    464             conf.CHECK_CODE('struct aiocb a; return aio_suspend(&a, 1, NULL);', 'HAVE_AIO_SUSPEND', msg='Checking for aio_suspend', headers='aio.h', lib='aio rt')
    465         if conf.CONFIG_SET('HAVE_AIO64'):
    466             conf.CHECK_CODE('struct aiocb a; return aio_read64(&a);', 'HAVE_AIO_READ64', msg='Checking for aio_read64', headers='aio.h', lib='aio rt')
    467             conf.CHECK_CODE('struct aiocb a; return aio_write64(&a);', 'HAVE_AIO_WRITE64', msg='Checking for aio_write64', headers='aio.h', lib='aio rt')
    468             conf.CHECK_CODE('struct aiocb a; return aio_fsync64(1, &a);', 'HAVE_AIO_FSYNC64', msg='Checking for aio_fsync64', headers='aio.h', lib='aio rt')
    469             conf.CHECK_CODE('struct aiocb a; return aio_return64(&a);', 'HAVE_AIO_RETURN64', msg='Checking for aio_return64', headers='aio.h', lib='aio rt')
    470             conf.CHECK_CODE('struct aiocb a; return aio_error64(&a);', 'HAVE_AIO_ERROR64', msg='Checking for aio_error64', headers='aio.h', lib='aio rt')
    471             conf.CHECK_CODE('struct aiocb a; return aio_cancel64(1, &a);', 'HAVE_AIO_CANCEL64', msg='Checking for aio_cancel64', headers='aio.h', lib='aio rt')
    472             conf.CHECK_CODE('struct aiocb a; return aio_suspend64(&a, 1, NULL);', 'HAVE_AIO_SUSPEND64', msg='Checking for aio_suspend64', headers='aio.h', lib='aio rt')
    473         if not conf.CONFIG_SET('HAVE_AIO'):
    474             conf.DEFINE('HAVE_NO_AIO', '1')
    475     else:
    476         conf.DEFINE('HAVE_NO_AIO', '1')
     547    conf.CHECK_CODE('int fd = openat(AT_FDCWD, ".", O_RDONLY);',
     548                'HAVE_OPENAT',
     549                msg='Checking for openat',
     550                headers='fcntl.h')
     551
     552    if host_os.rfind('linux') > -1:
     553        conf.CHECK_FUNCS_IN('io_submit', 'aio')
     554        conf.CHECK_CODE('''
     555struct io_event ioev;
     556struct iocb *ioc;
     557io_context_t ctx;
     558struct timespec ts;
     559int fd;
     560char *buf;
     561fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
     562io_queue_init(128,&ctx);
     563io_prep_pwrite(ioc, 1, buf, 1, 0);
     564io_prep_pread(ioc, 1, buf, 1, 0);
     565io_set_eventfd(ioc, fd);
     566io_set_callback(ioc, (io_callback_t)(0));
     567io_submit(ctx, 1, &ioc);
     568io_getevents(ctx, 1, 1, &ioev, &ts);
     569''',
     570            'HAVE_LINUX_KERNEL_AIO',
     571            msg='Checking for linux kernel asynchronous io support',
     572            headers='unistd.h stdlib.h sys/types.h fcntl.h sys/eventfd.h libaio.h',
     573            lib='aio')
    477574
    478575    conf.CHECK_CODE('''
    479576struct msghdr msg;
    480577union {
    481         struct cmsghdr cm;
     578        struct cmsghdr cm;
    482579        char control[CMSG_SPACE(sizeof(int))];
    483580} control_un;
     
    485582msg.msg_controllen = sizeof(control_un.control);
    486583''',
    487         'HAVE_MSGHDR_MSG_CONTROL',
    488         msg='Checking if we can use msg_control for passing file descriptors',
    489         headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
     584        'HAVE_STRUCT_MSGHDR_MSG_CONTROL',
     585        msg='Checking if we can use msg_control for passing file descriptors',
     586        headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
    490587    conf.CHECK_CODE('''
    491588struct msghdr msg;
    492589int fd;
    493 msg.msg_acctrights = (caddr_t) &fd;
    494 msg.msg_acctrightslen = sizeof(fd);
     590msg.msg_accrights = (caddr_t) &fd;
     591msg.msg_accrightslen = sizeof(fd);
    495592''',
    496         'HAVE_MSGHDR_MSG_ACCTRIGHTS',
    497         msg='Checking if we can use msg_acctrights for passing file descriptors',
    498         headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
     593        'HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS',
     594        msg='Checking if we can use msg_accrights for passing file descriptors',
     595        headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
    499596
    500597    if Options.options.with_winbind:
     
    503600
    504601    conf.find_program('awk', var='AWK')
    505     conf.find_program('perl', var='PERL')
    506 
    507     # Darwin has extra options to xattr-family functions
    508     conf.CHECK_CODE('getxattr(0, 0, 0, 0, 0, 0);',
    509                     'XATTR_ADD_OPT',
    510                     msg="Checking whether xattr interface takes additional options",
    511                     headers='sys/types.h attr/xattr.h sys/xattr.h')
    512602
    513603    conf.CHECK_HEADERS('asm/types.h')
     
    551641            # gssapi_krb5 and other libraries to its --libs output. That breaks the use
    552642            # of an in-tree heimdal kerberos
    553             conf.check_cfg(path=conf.env.CUPS_CONFIG, args="--cflags --ldflags",
    554                            package="", uselib_store="cups")
     643            conf.CHECK_CFG(path=conf.env.CUPS_CONFIG, args="--cflags --ldflags",
     644                           package="", uselib_store="CUPS")
    555645        conf.CHECK_HEADERS('cups/cups.h cups/language.h', lib='cups')
    556646        conf.CHECK_FUNCS_IN('httpConnect httpConnectEncrypt', 'cups')
     
    565655
    566656    if Options.options.with_iprint:
    567         if conf.CONFIG_SET('HAVE_CUPS'):
     657        if conf.CONFIG_SET('HAVE_CUPS'):
    568658            conf.DEFINE('HAVE_IPRINT', '1')
    569659        else:
     
    576666    # Check for LDAP
    577667    if Options.options.with_ldap:
    578         conf.CHECK_HEADERS('ldap.h lber.h')
     668        conf.CHECK_HEADERS('ldap.h lber.h ldap_pvt.h')
    579669        conf.CHECK_TYPE('ber_tag_t', 'unsigned int', headers='ldap.h lber.h')
    580670        conf.CHECK_FUNCS_IN('ber_scanf ber_sockbuf_add_io', 'lber')
     
    586676                            define='HAVE_LBER_LOG_PRINT_FN', headers='lber.h')
    587677
    588         conf.CHECK_FUNCS_IN('ldap_init ldap_initialize ldap_set_rebind_proc', 'ldap')
     678        conf.CHECK_FUNCS_IN('ldap_init ldap_init_fd ldap_initialize ldap_set_rebind_proc', 'ldap')
    589679        conf.CHECK_FUNCS_IN('ldap_add_result_entry', 'ldap')
    590680
     
    599689
    600690        # last but not least, if ldap_init() exists, we want to use ldap
    601         if conf.CONFIG_SET('HAVE_LDAP_INIT'):
     691        if conf.CONFIG_SET('HAVE_LDAP_INIT') and conf.CONFIG_SET('HAVE_LDAP_H'):
    602692            conf.DEFINE('HAVE_LDAP', '1')
    603693            conf.DEFINE('LDAP_DEPRECATED', '1')
     
    608698                    conf.CONFIG_SET('HAVE_LDAP_OPT_SOCKBUF'):
    609699                conf.DEFINE('HAVE_LDAP_SASL_WRAPPING', '1')
     700        else:
     701            conf.fatal("LDAP support not found. "
     702                       "Try installing libldap2-dev or openldap-devel. "
     703                       "Otherwise, use --without-ldap to build without "
     704                       "LDAP support. "
     705                       "LDAP support is required for the LDAP passdb backend, "
     706                       "LDAP idmap backends and ADS. "
     707                       "ADS support improves communication with "
     708                       "Active Directory domain controllers.")
    610709    else:
    611710        conf.SET_TARGET_TYPE('ldap', 'EMPTY')
    612711        conf.SET_TARGET_TYPE('lber', 'EMPTY')
    613712
    614     # Check for kerberos
    615     have_gssapi=False
    616     if Options.options.with_krb5 and not conf.env.toplevel_build:
    617         Logs.info("Looking for kerberos features")
    618         conf.find_program('krb5-config', var='KRB5_CONFIG')
    619         if conf.env.KRB5_CONFIG:
    620             conf.check_cfg(path="krb5-config", args="--cflags --libs",
    621                        package="gssapi", uselib_store="krb5")
    622         conf.CHECK_HEADERS('krb5.h krb5/locate_plugin.h', lib='krb5')
    623         conf.CHECK_HEADERS('gssapi.h gssapi/gssapi_generic.h gssapi/gssapi.h gssapi/gssapi_ext.h com_err.h', lib='krb5')
    624 
    625         if conf.CONFIG_SET('HAVE_KRB5_LOCATE_PLUGIN_H'):
    626             conf.env['WINBIND_KRB5_LOCATOR'] = 'bin/winbind_krb5_locator.so'
    627 
    628         conf.CHECK_FUNCS_IN('_et_list', 'com_err')
    629         conf.CHECK_FUNCS_IN('krb5_encrypt_data', 'k5crypto')
    630         conf.CHECK_FUNCS_IN('crypto', 'des_set_key')
    631         conf.CHECK_FUNCS_IN('copy_Authenticator', 'asn1')
    632         conf.CHECK_FUNCS_IN('roken_getaddrinfo_hostspec', 'roken')
    633         if conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi') or \
    634            conf.CHECK_FUNCS_IN('gss_display_status', 'gssapi_krb5'):
    635             have_gssapi=True
    636         conf.CHECK_FUNCS_IN('gss_wrap_iov', 'gssapi gssapi_krb5 krb5')
    637         conf.CHECK_FUNCS_IN('krb5_mk_req_extended krb5_kt_compare', 'krb5')
    638         conf.CHECK_FUNCS('''
    639 krb5_set_real_time krb5_set_default_in_tkt_etypes krb5_set_default_tgs_enctypes
    640 krb5_set_default_tgs_ktypes krb5_principal2salt krb5_use_enctype
    641 krb5_string_to_key krb5_get_pw_salt krb5_string_to_key_salt krb5_auth_con_setkey
    642 krb5_auth_con_setuseruserkey krb5_get_permitted_enctypes
    643 krb5_get_default_in_tkt_etypes krb5_free_data_contents
    644 krb5_principal_get_comp_string krb5_free_unparsed_name
    645 krb5_free_keytab_entry_contents krb5_kt_free_entry krb5_krbhst_init
    646 krb5_krbhst_get_addrinfo krb5_c_enctype_compare krb5_enctypes_compatible_keys
    647 krb5_crypto_init krb5_crypto_destroy krb5_decode_ap_req free_AP_REQ
    648 krb5_verify_checksum krb5_c_verify_checksum krb5_principal_compare_any_realm
    649 krb5_parse_name_norealm krb5_princ_size krb5_get_init_creds_opt_set_pac_request
    650 krb5_get_renewed_creds krb5_get_kdc_cred krb5_free_error_contents
    651 initialize_krb5_error_table krb5_get_init_creds_opt_alloc
    652 krb5_get_init_creds_opt_free krb5_get_init_creds_opt_get_error
    653 krb5_enctype_to_string krb5_fwd_tgt_creds krb5_auth_con_set_req_cksumtype
    654 krb5_get_creds_opt_alloc krb5_get_creds_opt_set_impersonate krb5_get_creds
    655 krb5_get_credentials_for_user krb5_get_host_realm krb5_free_host_realm''',
    656                          lib='krb5 k5crypto')
    657         conf.CHECK_DECLS('''krb5_get_credentials_for_user
    658                             krb5_auth_con_set_req_cksumtype''',
    659                             headers='krb5.h', always=True)
    660         conf.CHECK_VARIABLE('AP_OPTS_USE_SUBKEY', headers='krb5.h')
    661         conf.CHECK_VARIABLE('KV5M_KEYTAB', headers='krb5.h')
    662         conf.CHECK_VARIABLE('KRB5_KU_OTHER_CKSUM', headers='krb5.h')
    663         conf.CHECK_VARIABLE('KRB5_KEYUSAGE_APP_DATA_CKSUM', headers='krb5.h')
    664         conf.CHECK_VARIABLE('ENCTYPE_AES128_CTS_HMAC_SHA1_96', headers='krb5.h')
    665         conf.CHECK_VARIABLE('ENCTYPE_AES256_CTS_HMAC_SHA1_96', headers='krb5.h')
    666         conf.CHECK_STRUCTURE_MEMBER('krb5_keytab_entry', 'key', headers='krb5.h',
    667                                     define='HAVE_KRB5_KEYTAB_ENTRY_KEY')
    668         conf.CHECK_STRUCTURE_MEMBER('krb5_keytab_entry', 'keyblock', headers='krb5.h',
    669                                     define='HAVE_KRB5_KEYTAB_ENTRY_KEYBLOCK')
    670         conf.CHECK_STRUCTURE_MEMBER('krb5_address', 'magic', headers='krb5.h',
    671                                     define='HAVE_MAGIC_IN_KRB5_ADDRESS')
    672         conf.CHECK_STRUCTURE_MEMBER('krb5_address', 'addrtype', headers='krb5.h',
    673                                     define='HAVE_ADDRTYPE_IN_KRB5_ADDRESS')
    674         conf.CHECK_STRUCTURE_MEMBER('krb5_ticket', 'enc_part2', headers='krb5.h',
    675                                     define='HAVE_KRB5_TKT_ENC_PART2')
    676         conf.CHECK_STRUCTURE_MEMBER('krb5_creds', 'keyblock', headers='krb5.h',
    677                                     define='HAVE_KRB5_KEYBLOCK_IN_CREDS')
    678         conf.CHECK_STRUCTURE_MEMBER('krb5_creds', 'session', headers='krb5.h',
    679                                     define='HAVE_KRB5_SESSION_IN_CREDS')
    680         conf.CHECK_STRUCTURE_MEMBER('krb5_ap_req', 'ticket', headers='krb5.h',
    681                                     define='HAVE_TICKET_POINTER_IN_KRB5_AP_REQ')
    682 
    683         conf.CHECK_TYPE('krb5_encrypt_block', headers='krb5.h')
    684 
    685         conf.CHECK_CODE('''
    686 krb5_ticket ticket;
    687 krb5_kvno kvno;
    688 krb5_enctype enctype;
    689 enctype = ticket.enc_part.enctype;
    690 kvno = ticket.enc_part.kvno;
    691 ''',
    692                         'KRB5_TICKET_HAS_KEYINFO',
    693                         headers='krb5.h', link=False,
    694                         msg="Checking whether the krb5_ticket structure contains the kvno and enctype")
    695         conf.CHECK_CODE('''
    696 krb5_context ctx;
    697 krb5_get_init_creds_opt *opt = NULL;
    698 krb5_get_init_creds_opt_free(ctx, opt);
    699 ''',
    700                         'KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT',
    701                         headers='krb5.h', link=False,
    702                         msg="Checking whether krb5_get_init_creds_opt_free takes a context argument")
    703         conf.CHECK_CODE('krb5_mk_error(0,0,0)',
    704                         'HAVE_SHORT_KRB5_MK_ERROR_INTERFACE',
    705                         headers='krb5.h', link=False,
    706                         msg="Checking whether krb5_mk_error takes 3 arguments MIT or 9 Heimdal")
    707         conf.CHECK_CODE('''
    708 const krb5_data *pkdata;
    709 krb5_context context;
    710 krb5_principal principal;
    711 pkdata = krb5_princ_component(context, principal, 0);
    712 ''',
    713                         'HAVE_KRB5_PRINC_COMPONENT',
    714                         headers='krb5.h', lib='krb5',
    715                         msg="Checking whether krb5_princ_component is available")
    716 
    717         conf.CHECK_CODE('''
    718 int main(void) {
    719 char buf[256];
    720 krb5_enctype_to_string(1, buf, 256);
    721 return 0;
    722 }''',
    723                         'HAVE_KRB5_ENCTYPE_TO_STRING_WITH_SIZE_T_ARG',
    724                         headers='krb5.h', lib='krb5 k5crypto',
    725                         addmain=False, cflags='-Werror',
    726                         msg="Checking whether krb5_enctype_to_string takes size_t argument")
    727 
    728         conf.CHECK_CODE('''
    729 int main(void) {
    730 krb5_context context = NULL;
    731 char *str = NULL;
    732 krb5_enctype_to_string(context, 1, &str);
    733 if (str) free (str);
    734 return 0;
    735 }''',
    736                         'HAVE_KRB5_ENCTYPE_TO_STRING_WITH_KRB5_CONTEXT_ARG',
    737                         headers='krb5.h stdlib.h', lib='krb5',
    738                         addmain=False, cflags='-Werror',
    739                         msg="Checking whether krb5_enctype_to_string takes krb5_context argument")
    740         conf.CHECK_CODE('''
    741 int main(void) {
    742 krb5_context ctx = NULL;
    743 krb5_principal princ = NULL;
    744 const char *str = krb5_princ_realm(ctx, princ)->data;
    745 return 0;
    746 }''',
    747                         'HAVE_KRB5_PRINC_REALM',
    748                         headers='krb5.h', lib='krb5',
    749                         addmain=False,
    750                         msg="Checking whether the macro krb5_princ_realm is defined")
    751         conf.CHECK_CODE('''
    752 int main(void) {
    753     krb5_context context;
    754     krb5_principal principal;
    755     const char *realm; realm = krb5_principal_get_realm(context, principal);
    756     return 0;
    757 }''',
    758                         'HAVE_KRB5_PRINCIPAL_GET_REALM',
    759                         headers='krb5.h', lib='krb5',
    760                         addmain=False,
    761                         msg="Checking whether krb5_principal_get_realm is defined")
    762         if conf.CHECK_CODE('''krb5_verify_checksum(0, 0, 0, 0, 0, 0, 0);''',
    763                         'KRB5_VERIFY_CHECKSUM_ARGS',
    764                         headers='krb5.h', lib='krb5',
    765                         msg="Checking whether krb5_verify_checksum takes 7 arguments"):
    766             conf.DEFINE('KRB5_VERIFY_CHECKSUM_ARGS', '7')
    767         else:
    768             conf.DEFINE('KRB5_VERIFY_CHECKSUM_ARGS', '6')
    769 
    770         conf.CHECK_CODE('''
    771 krb5_enctype enctype;
    772 enctype = ENCTYPE_ARCFOUR_HMAC_MD5;
    773 ''',
    774             '_HAVE_ENCTYPE_ARCFOUR_HMAC_MD5',
    775             headers='krb5.h', lib='krb5',
    776             msg="Checking whether the ENCTYPE_ARCFOUR_HMAC_MD5 key type definition is available");
    777         conf.CHECK_CODE('''
    778 krb5_keytype keytype;
    779 keytype = KEYTYPE_ARCFOUR_56;
    780 ''',
    781             '_HAVE_KEYTYPE_ARCFOUR_56',
    782             headers='krb5.h', lib='krb5',
    783             msg="Checking whether the HAVE_KEYTYPE_ARCFOUR_56 key type definition is available");
    784         if conf.CONFIG_SET('_HAVE_ENCTYPE_ARCFOUR_HMAC_MD5') and conf.CONFIG_SET('_HAVE_KEYTYPE_ARCFOUR_56'):
    785             conf.DEFINE('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5', '1')
    786 
    787         conf.CHECK_CODE('''
    788 krb5_enctype enctype;
    789 enctype = ENCTYPE_ARCFOUR_HMAC;
    790 ''',
    791             'HAVE_ENCTYPE_ARCFOUR_HMAC',
    792             headers='krb5.h', lib='krb5',
    793             msg="Checking whether the ENCTYPE_ARCFOUR_HMAC key type definition is available");
    794 
    795         conf.CHECK_CODE('''
    796 krb5_context context;
    797 krb5_keytab keytab;
    798 krb5_init_context(&context);
    799 return krb5_kt_resolve(context, "WRFILE:api", &keytab);
    800 ''',
    801             'HAVE_WRFILE_KEYTAB',
    802             headers='krb5.h', lib='krb5', execute=True,
    803             msg="Checking whether the WRFILE:-keytab is supported");
    804 
    805         # Check for KRB5_DEPRECATED handling
    806         conf.CHECK_CODE('''#define KRB5_DEPRECATED 1
    807 #include <krb5.h>''',
    808         'HAVE_KRB5_DEPRECATED_WITH_IDENTIFIER', addmain=False,
    809         link=False,
    810         msg="Checking for KRB5_DEPRECATED define taking an identifier")
    811     elif conf.env.toplevel_build:
    812         # setup the right defines for a in-tree heimdal build
    813         Logs.info("Using in-tree heimdal kerberos defines")
    814         conf.define('HAVE_GSSAPI', 1)
    815         conf.define('HAVE_GSSAPI_GSSAPI_H', 1)
    816         conf.define('HAVE_AP_OPTS_USE_SUBKEY', 1)
    817         conf.define('HAVE_KRB5_ADDRESSES', 1)
    818         conf.define('HAVE_KRB5_KEYTAB_ENTRY_KEYBLOCK', 1)
    819         conf.define('HAVE_KRB5_SET_REAL_TIME', 1)
    820         conf.define('HAVE_COM_ERR_H', 1)
    821         conf.define('HAVE_ADDR_TYPE_IN_KRB5_ADDRESS', 1)
    822         conf.define('HAVE_GSS_DISPLAY_STATUS', 1)
    823         conf.define('HAVE_LIBGSSAPI', 1)
    824         conf.define('HAVE_ADDR_TYPE_IN_KRB5_ADDRESS', 1)
    825         conf.define('HAVE_CHECKSUM_IN_KRB5_CHECKSUM', 1)
    826         conf.define('HAVE_DECL_KRB5_AUTH_CON_SET_REQ_CKSUMTYPE', 0)
    827         conf.define('HAVE_DECL_KRB5_GET_CREDENTIALS_FOR_USER', 0)
    828         conf.define('HAVE_E_DATA_POINTER_IN_KRB5_ERROR', 1)
    829         conf.define('HAVE_INITIALIZE_KRB5_ERROR_TABLE', 1)
    830         conf.define('HAVE_KRB5_ADDRESSES', 1)
    831         conf.define('HAVE_KRB5_AUTH_CON_SETKEY', 1)
    832         conf.define('HAVE_KRB5_CRYPTO', 1)
    833         conf.define('HAVE_KRB5_CRYPTO_DESTROY', 1)
    834         conf.define('HAVE_KRB5_CRYPTO_INIT', 1)
    835         conf.define('HAVE_KRB5_C_ENCTYPE_COMPARE', 1)
    836         conf.define('HAVE_KRB5_C_VERIFY_CHECKSUM', 1)
    837         conf.define('HAVE_FREE_AP_REQ', 1)
    838         conf.define('HAVE_KRB5_DECODE_AP_REQ', 1)
    839         conf.define('HAVE_KRB5_ENCTYPES_COMPATIBLE_KEYS', 1)
    840         conf.define('HAVE_KRB5_ENCTYPE_TO_STRING', 1)
    841         conf.define('HAVE_KRB5_ENCTYPE_TO_STRING_WITH_KRB5_CONTEXT_ARG', 1)
    842         conf.define('HAVE_KRB5_FREE_ERROR_CONTENTS', 1)
    843         conf.define('HAVE_KRB5_FREE_HOST_REALM', 1)
    844         conf.define('HAVE_KRB5_FWD_TGT_CREDS', 1)
    845         conf.define('HAVE_KRB5_GET_CREDS', 1)
    846         conf.define('HAVE_KRB5_GET_CREDS_OPT_ALLOC', 1)
    847         conf.define('HAVE_KRB5_GET_CREDS_OPT_SET_IMPERSONATE', 1)
    848         conf.define('HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES', 1)
    849         conf.define('HAVE_KRB5_GET_HOST_REALM', 1)
    850         conf.define('HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC', 1)
    851         conf.define('HAVE_KRB5_GET_INIT_CREDS_OPT_FREE', 1)
    852         conf.define('HAVE_KRB5_GET_INIT_CREDS_OPT_GET_ERROR', 1)
    853         conf.define('HAVE_KRB5_GET_INIT_CREDS_OPT_SET_PAC_REQUEST', 1)
    854         conf.define('HAVE_KRB5_GET_KDC_CRED', 1)
    855         conf.define('HAVE_KRB5_GET_PW_SALT', 1)
    856         conf.define('HAVE_KRB5_GET_RENEWED_CREDS', 1)
    857         conf.define('HAVE_KRB5_KEYBLOCK_KEYVALUE', 1)
    858         conf.define('HAVE_KRB5_KEYTAB_ENTRY_KEYBLOCK', 1)
    859         conf.define('HAVE_KRB5_KRBHST_GET_ADDRINFO', 1)
    860         conf.define('HAVE_KRB5_KRBHST_INIT', 1)
    861         conf.define('HAVE_KRB5_KT_COMPARE', 1)
    862         conf.define('HAVE_KRB5_KT_FREE_ENTRY', 1)
    863         conf.define('HAVE_KRB5_KU_OTHER_CKSUM', 1)
    864         conf.define('HAVE_KRB5_LOCATE_PLUGIN_H', 1)
    865         conf.define('HAVE_KRB5_MK_REQ_EXTENDED', 1)
    866         conf.define('HAVE_KRB5_PRINCIPAL_COMPARE_ANY_REALM', 1)
    867         conf.define('HAVE_KRB5_PRINCIPAL_GET_COMP_STRING', 1)
    868         conf.define('HAVE_KRB5_PRINCIPAL_GET_REALM', 1)
    869         conf.define('HAVE_KRB5_REALM_TYPE', 1)
    870         conf.define('HAVE_KRB5_SESSION_IN_CREDS', 1)
    871         conf.define('HAVE_KRB5_SET_DEFAULT_IN_TKT_ETYPES', 1)
    872         conf.define('HAVE_KRB5_SET_REAL_TIME', 1)
    873         conf.define('HAVE_KRB5_STRING_TO_KEY', 1)
    874         conf.define('HAVE_KRB5_STRING_TO_KEY_SALT', 1)
    875         conf.define('HAVE_KRB5_VERIFY_CHECKSUM', 1)
    876         conf.define('HAVE_LIBKRB5', 1)
    877         conf.define('KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT', 1)
    878         conf.define('KRB5_VERIFY_CHECKSUM_ARGS', 6)
    879         conf.define('HAVE_ETYPE_IN_ENCRYPTEDDATA', 1)
    880         conf.define('KRB5_PRINC_REALM_RETURNS_REALM', 1)
    881         conf.define('HAVE_KRB5_PRINCIPAL_GET_REALM', 1)
    882         conf.define('HAVE_KRB5_H', 1)
    883         conf.define('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5', 1)
    884         conf.define('HAVE_AP_OPTS_USE_SUBKEY', 1)
    885         conf.define('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5', 1)
    886         conf.define('HAVE_ENCTYPE_ARCFOUR_HMAC', 1)
     713    if Options.options.with_ads == False:
     714        use_ads = False
     715        use_ads_krb5 = False
     716        use_ads_ldap = False
    887717    else:
    888         conf.SET_TARGET_TYPE('krb5', 'EMPTY')
    889         conf.SET_TARGET_TYPE('gssapi', 'EMPTY')
    890         conf.SET_TARGET_TYPE('gssapi_krb5', 'EMPTY')
    891         conf.SET_TARGET_TYPE('com_err', 'EMPTY')
    892         conf.SET_TARGET_TYPE('k5crypto', 'EMPTY')
    893 
    894     if Options.options.with_ads:
    895         use_ads=True
     718        use_ads = True
     719        use_ads_krb5 = True
     720        use_ads_ldap = True
    896721        if not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5') and \
    897722           not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC'):
    898723            Logs.warn("arcfour-hmac-md5 encryption type not found in -lkrb5")
    899             use_ads=False
     724            use_ads_krb5 = False
    900725        if not conf.CONFIG_SET('HAVE_KRB5_MK_REQ_EXTENDED'):
    901726            Logs.warn("krb5_mk_req_extended not found in -lkrb5")
    902             use_ads=False
     727            use_ads_krb5 = False
     728        if not conf.CONFIG_SET('HAVE_KRB5_GET_HOST_REALM'):
     729            Logs.warn("krb5_get_host_realm not found in -lkrb5")
     730            use_ads_krb5 = False
     731        if not conf.CONFIG_SET('HAVE_KRB5_FREE_HOST_REALM'):
     732            Logs.warn("krb5_free_host_realm not found in -lkrb5")
     733            use_ads_krb5 = False
     734        if not conf.CONFIG_SET('HAVE_KRB5_FWD_TGT_CREDS'):
     735            Logs.warn("krb5_fwd_tgt_creds found in -lkrb5")
     736            use_ads_krb5 = False
     737        if not conf.CONFIG_SET('HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC'):
     738            Logs.warn("krb5_get_init_creds_opt_alloc not found in -lkrb5")
     739            use_ads_krb5 = False
     740        if not conf.CONFIG_SET('KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT'):
     741            Logs.warn("krb5_get_init_creds_opt_free was not found or was too old in -lkrb5")
     742            use_ads_krb5 = False
     743        if not conf.CONFIG_SET('HAVE_KRB5_GET_RENEWED_CREDS'):
     744            Logs.warn("krb5_get_renewed_creds not found in -lkrb5")
     745            use_ads_krb5 = False
     746        if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL_COMPARE_ANY_REALM'):
     747            Logs.warn("krb5_principal_compare_any_realm not found in -lkrb5")
     748            use_ads_krb5 = False
     749        if not conf.CONFIG_SET('HAVE_KRB5_C_STRING_TO_KEY') and \
     750           not conf.CONFIG_SET('HAVE_KRB5_STRING_TO_KEY_SALT'):
     751            Logs.warn("krb5_c_string_to_key not found in -lkrb5")
     752            use_ads_krb5 = False
    903753        if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL2SALT') and \
    904754           not conf.CONFIG_SET('HAVE_KRB5_GET_PW_SALT'):
    905755            Logs.warn("no CREATE_KEY_FUNCTIONS detected")
    906             use_ads=False
     756            use_ads_krb5 = False
    907757        if not conf.CONFIG_SET('HAVE_KRB5_GET_PERMITTED_ENCTYPES') and \
    908758           not conf.CONFIG_SET('HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES'):
    909759            Logs.warn("no GET_ENCTYPES_FUNCTIONS detected")
    910             use_ads=False
     760            use_ads_krb5 = False
    911761        if not conf.CONFIG_SET('HAVE_KRB5_KT_FREE_ENTRY') and \
    912762           not conf.CONFIG_SET('HAVE_KRB5_FREE_KEYTAB_ENTRY_CONTENTS'):
    913763            Logs.warn("no KT_FREE_FUNCTION detected")
    914             use_ads=False
    915         if not conf.CONFIG_SET('HAVE_KRB5_C_VERIFY_CHECKSUM') and \
    916            not conf.CONFIG_SET('HAVE_KRB5_VERIFY_CHECKSUM'):
    917             Logs.warn("no KRB5_VERIFY_CHECKSUM_FUNCTION detected")
    918             use_ads=False
    919         if not conf.CONFIG_SET('KRB5_TICKET_HAS_KEYINFO'):
    920             # We only need the following functions if we can't get the enctype
    921             # and kvno out of the ticket directly (ie. on Heimdal).
    922             if not conf.CONFIG_SET('HAVE_FREE_AP_REQ'):
    923                 Logs.warn("no KRB5_AP_REQ_FREE_FUNCTION detected")
    924                 use_ads=False
    925             if not conf.CONFIG_SET('HAVE_KRB5_DECODE_AP_REQ'):
    926                 Logs.warn("no KRB5_AP_REQ_DECODING_FUNCTION detected")
    927                 use_ads=False
    928         if use_ads:
    929             conf.DEFINE('WITH_ADS', '1')
     764            use_ads_krb5 = False
     765        if not conf.CONFIG_SET('HAVE_KRB5_C_VERIFY_CHECKSUM'):
     766            Logs.warn("krb5_c_verify_checksum_compare not found in -lkrb5")
     767            use_ads_krb5 = False
     768
     769        # We don't actually use
     770        # gsskrb5_extract_authz_data_from_sec_context, but it is a
     771        # clue that this Heimdal, which does the PAC processing we
     772        # need on the standard gss_inquire_sec_context_by_oid
     773        if not conf.CONFIG_SET('HAVE_GSS_GET_NAME_ATTRIBUTE') and \
     774            not (conf.CONFIG_SET('HAVE_GSSKRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT') and \
     775                     conf.CONFIG_SET('HAVE_GSS_INQUIRE_SEC_CONTEXT_BY_OID')):
     776            Logs.warn("need either gss_get_name_attribute or gsskrb5_extract_authz_data_from_sec_context and gss_inquire_sec_context_by_oid in -lgssapi for PAC support")
     777            use_ads_krb5 = False
     778
     779        if not conf.CONFIG_SET('HAVE_GSS_KRB5_EXPORT_LUCID_SEC_CONTEXT'):
     780            Logs.warn("need gss_krb5_export_lucid_sec_context for SPNEGO and gss_wrap support")
     781            use_ads_krb5 = False
     782
     783        if use_ads_krb5:
    930784            conf.DEFINE('HAVE_KRB5', '1')
    931             if have_gssapi:
    932                 conf.DEFINE('HAVE_GSSAPI', '1')
    933             if conf.CONFIG_SET('HAVE_LDAP'):
    934                 conf.env['HAVE_ADS'] = '1'
     785            conf.env['HAVE_KRB5'] = '1'
    935786        else:
    936             Logs.warn("krb5 libs don't have all features required for Active Directory support")
    937787            conf.undefine('HAVE_KRB5_H')
    938788            conf.undefine('HAVE_GSSAPI_H')
    939789            conf.undefine('HAVE_GSSAPI_GSSAPI_GENERIC_H')
    940790            conf.undefine('HAVE_GSSAPI_GSSAPI_H')
     791            use_ads = False
     792
     793        if not conf.CONFIG_SET('HAVE_LDAP'):
     794            use_ads = False
     795            use_ads_ldap = False
     796
     797    if use_ads:
     798        conf.DEFINE('WITH_ADS', '1')
     799        conf.env['HAVE_ADS'] = '1'
     800        Logs.info("Building with Active Directory support.")
     801        # these have broken dependencies
     802        forced_shared_modules.extend(TO_LIST('idmap_ad idmap_rfc2307'))
     803    elif Options.options.with_ads == False:
     804        Logs.info("Building without Active Directory support (--without-ads).")
     805    else:
     806        if not use_ads_krb5:
     807            Logs.warn("Active Directory support not available: krb5 libs don't have all required features")
     808        if not use_ads_ldap:
     809            Logs.warn("Active Directory support not available: LDAP support is not available.")
     810        if Options.options.with_ads:
     811            conf.fatal("Active Directory support not found. Use --without-ads "
     812                       "for building without Active Directory support. "
     813                       "ADS support improves communication with "
     814                       "Active Directory domain controllers.")
     815        else:
     816            # this is the auto-mode case
     817            Logs.warn("Building without Active Directory support.")
     818
    941819
    942820    if Options.options.with_utmp:
     821        conf.env.with_utmp = True
     822        if not conf.CHECK_HEADERS('utmp.h'): conf.env.with_utmp = False
    943823        conf.CHECK_FUNCS('pututline pututxline updwtmp updwtmpx getutmpx getutxent')
    944824        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_name', headers='utmp.h',
     
    960840        conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_exit.e_exit', headers='utmp.h',
    961841                                    define='HAVE_UT_UT_EXIT')
    962         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_addr_v6', headers='utmp.h',
    963                                     define='HAVE_UT_UT_ADDR_V6')
    964         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_addr', headers='utmp.h',
    965                                     define='HAVE_UT_UT_ADDR')
    966842        conf.CHECK_STRUCTURE_MEMBER('struct utmpx', 'ut_syslen', headers='utmpx.h',
    967843                                    define='HAVE_UX_UT_SYSLEN')
     
    969845                        'PUTUTLINE_RETURNS_UTMP', headers='utmp.h',
    970846                        msg="Checking whether pututline returns pointer")
    971         conf.DEFINE('WITH_UTMP', 1)
     847        conf.CHECK_SIZEOF(['((struct utmp *)NULL)->ut_line'], headers='utmp.h',
     848                          define='SIZEOF_UTMP_UT_LINE', critical=False)
     849        if not conf.CONFIG_SET('SIZEOF_UTMP_UT_LINE'):
     850            conf.env.with_utmp = False
     851        elif int(conf.env.SIZEOF_UTMP_UT_LINE) < 15:
     852            conf.env.with_utmp = False
     853        if conf.env.with_utmp:
     854            conf.DEFINE('WITH_UTMP', 1)
     855        else:
     856            Logs.warn("--with-utmp but utmp support not sufficient")
    972857
    973858    if Options.options.with_avahi:
     
    1003888        conf.CHECK_HEADERS('pam/pam_ext.h pam/_pam_macros.h')
    1004889        conf.CHECK_FUNCS_IN('pam_vsyslog', 'pam')
    1005         conf.CHECK_CODE('''
     890        conf.CHECK_CODE('''
    1006891#if defined(HAVE_SECURITY_PAM_APPL_H)
    1007892#include <security/pam_appl.h>
     
    1014899            lib='pam',
    1015900            msg="Checking whether PAM_RHOST is available");
    1016         conf.CHECK_CODE('''
     901        conf.CHECK_CODE('''
    1017902#if defined(HAVE_SECURITY_PAM_APPL_H)
    1018903#include <security/pam_appl.h>
     
    1025910            lib='pam',
    1026911            msg="Checking whether PAM_TTY is available");
    1027         conf.CHECK_CODE('''
     912        conf.CHECK_CODE('''
    1028913#if (!defined(LINUX))
    1029914
     
    1063948
    1064949    seteuid = False
     950
     951#
     952# Ensure we select the correct set of system calls on Linux.
     953#
     954    if (host_os.rfind('linux') > -1):
     955        conf.CHECK_CODE('''
     956#if defined(HAVE_UNISTD_H)
     957#include <unistd.h>
     958#endif
     959#include <stdlib.h>
     960#include <stdio.h>
     961#include <sys/types.h>
     962#include <errno.h>
     963
     964#ifdef HAVE_SYS_PRIV_H
     965#include <sys/priv.h>
     966#endif
     967#ifdef HAVE_SYS_ID_H
     968#include <sys/id.h>
     969#endif
     970
     971#if defined(HAVE_SYSCALL_H)
     972#include <syscall.h>
     973#endif
     974
     975#if defined(HAVE_SYS_SYSCALL_H)
     976#include <sys/syscall.h>
     977#endif
     978
     979syscall(SYS_setresuid32, -1, -1, -1);
     980syscall(SYS_setresgid32, -1, -1, -1);
     981syscall(SYS_setreuid32, -1, -1);
     982syscall(SYS_setregid32, -1, -1);
     983syscall(SYS_setuid32, -1);
     984syscall(SYS_setgid32, -1);
     985syscall(SYS_setgroups32, 0, NULL);
     986''',
     987            'USE_LINUX_32BIT_SYSCALLS',
     988            msg="Checking whether Linux should use 32-bit credential calls");
     989
     990        if (conf.CONFIG_SET('USE_LINUX_32BIT_SYSCALLS')):
     991            seteuid = conf.CHECK_CODE('''
     992                                #define AUTOCONF_TEST 1
     993                                #define USE_LINUX_THREAD_CREDENTIALS 1
     994                                #define USE_LINUX_32BIT_SYSCALLS 1
     995                                #include "../lib/util/setid.c"
     996                                #include "./lib/util_sec.c"
     997                                ''',
     998                                'USE_LINUX_THREAD_CREDENTIALS',
     999                                addmain=False,
     1000                                execute=True,
     1001                                msg="Checking whether we can use Linux thread-specific credentials with 32-bit system calls")
     1002        else:
     1003            seteuid = conf.CHECK_CODE('''
     1004                                #define AUTOCONF_TEST 1
     1005                                #define USE_LINUX_THREAD_CREDENTIALS 1
     1006                                #include "../lib/util/setid.c"
     1007                                #include "./lib/util_sec.c"
     1008                                ''',
     1009                                'USE_LINUX_THREAD_CREDENTIALS',
     1010                                addmain=False,
     1011                                execute=True,
     1012                                msg="Checking whether we can use Linux thread-specific credentials")
    10651013    if not seteuid:
    10661014        seteuid = conf.CHECK_CODE('''
    1067                                 #define AUTOCONF_TEST 1
    1068                                 #define USE_SETREUID 1
    1069                                 #include "./lib/util_sec.c"
    1070                                 ''',
    1071                                 'USE_SETREUID',
    1072                                 addmain=False,
    1073                                 execute=True,
    1074                                 msg="Checking whether setreuid is available")
     1015                                #define AUTOCONF_TEST 1
     1016                                #define USE_SETREUID 1
     1017                                #include "../lib/util/setid.c"
     1018                                #include "./lib/util_sec.c"
     1019                                ''',
     1020                                'USE_SETREUID',
     1021                                addmain=False,
     1022                                execute=True,
     1023                                msg="Checking whether setreuid is available")
    10751024    if not seteuid:
    10761025        seteuid = conf.CHECK_CODE('''
    1077                                 #define AUTOCONF_TEST 1
    1078                                 #define USE_SETRESUID 1
    1079                                 #include "./lib/util_sec.c"
    1080                                 ''',
    1081                                 'USE_SETRESUID',
    1082                                 addmain=False,
    1083                                 execute=True,
    1084                                 msg="Checking whether setresuid is available")
     1026                                #define AUTOCONF_TEST 1
     1027                                #define USE_SETRESUID 1
     1028                                #include "../lib/util/setid.c"
     1029                                #include "./lib/util_sec.c"
     1030                                ''',
     1031                                'USE_SETRESUID',
     1032                                addmain=False,
     1033                                execute=True,
     1034                                msg="Checking whether setresuid is available")
    10851035    if not seteuid:
    10861036        seteuid = conf.CHECK_CODE('''
    1087                                 #define AUTOCONF_TEST 1
    1088                                 #define USE_SETEUID 1
    1089                                 #include "./lib/util_sec.c"
    1090                                 ''',
    1091                                 'USE_SETEUID',
    1092                                 addmain=False,
    1093                                 execute=True,
    1094                                 msg="Checking whether seteuid is available")
     1037                                #define AUTOCONF_TEST 1
     1038                                #define USE_SETEUID 1
     1039                                #include "../lib/util/setid.c"
     1040                                #include "./lib/util_sec.c"
     1041                                ''',
     1042                                'USE_SETEUID',
     1043                                addmain=False,
     1044                                execute=True,
     1045                                msg="Checking whether seteuid is available")
    10951046    if not seteuid:
    10961047        seteuid = conf.CHECK_CODE('''
    1097                                 #define AUTOCONF_TEST 1
    1098                                 #define USE_SETUIDX 1
    1099                                 #include "./lib/util_sec.c"
    1100                                 ''',
    1101                                 'USE_SETUIDX',
    1102                                 addmain=False,
    1103                                 execute=True,
    1104                                 mandatory=True,
    1105                                 msg="Checking whether setuidx is available")
     1048                                #define AUTOCONF_TEST 1
     1049                                #define USE_SETUIDX 1
     1050                                #include "../lib/util/setid.c"
     1051                                #include "./lib/util_sec.c"
     1052                                ''',
     1053                                'USE_SETUIDX',
     1054                                addmain=False,
     1055                                execute=True,
     1056                                mandatory=True,
     1057                                msg="Checking whether setuidx is available")
    11061058    if Options.options.with_dnsupdate:
    1107         conf.CHECK_HEADERS('uuid/uuid.h')
    1108         conf.CHECK_FUNCS_IN('uuid_generate', 'uuid')
    1109         if not conf.CONFIG_SET('HAVE_UUID_UUID_H') and not conf.CONFIG_SET('HAVE_UUID_GENERATE'):
    1110             Logs.warn("--with-dnsupdate=yes but uuid support not sufficient")
    1111         elif not conf.CONFIG_SET('HAVE_GSSAPI'):
     1059        if not conf.CONFIG_SET('HAVE_KRB5'):
    11121060            Logs.warn("--with-dnsupdate=yes but gssapi support not sufficient")
    11131061        else:
    11141062            conf.DEFINE('WITH_DNS_UPDATES', 1)
    1115     else:
    1116         conf.SET_TARGET_TYPE('uuid', 'EMPTY')
    11171063    conf.CHECK_HEADERS('valgrind.h valgrind/valgrind.h valgrind/memcheck.h')
    11181064    if Options.options.developer:
     
    11241070#include <linux/netlink.h>
    11251071''',
    1126                 'HAVE_LINUX_NETLINK_H',
     1072                'HAVE_LINUX_NETLINK_H',
    11271073                msg="Checking whether Linux netlink is available"):
     1074
    11281075        conf.CHECK_CODE('''
    11291076#include <bits/sockaddr.h>
     
    11311078#include <linux/rtnetlink.h>
    11321079''',
    1133                 'HAVE_LINUX_RTNETLINK_H',
    1134                 msg='Checking whether Linux rtnetlink is available')
    1135     if conf.CHECK_TYPE('struct dirent64', headers='sys/types.h dirent.h') and conf.CONFIG_SET('HAVE_READDIR64'):
    1136         conf.DEFINE('HAVE_STRUCT_DIRENT64', '1')
    1137     else:
    1138         conf.undefine('HAVE_STRUCT_DIRENT64')
     1080                'HAVE_LINUX_RTNETLINK_H',
     1081                msg='Checking whether Linux rtnetlink is available')
    11391082
    11401083    conf.CHECK_CODE('''
    11411084#include "../tests/fcntl_lock.c"
    11421085''',
    1143                 'HAVE_FCNTL_LOCK',
    1144                 addmain=False,
    1145                 execute=True,
    1146                 msg='Checking whether fcntl locking is available')
    1147 
    1148     conf.CHECK_CODE('''
    1149 #include "../tests/fcntl_lock64.c"
     1086                'HAVE_FCNTL_LOCK',
     1087                addmain=False,
     1088                execute=True,
     1089                msg='Checking whether fcntl locking is available')
     1090
     1091# glibc up to 2.3.6 had dangerously broken posix_fallocate(). DON'T USE IT.
     1092    if not conf.CHECK_CODE('''
     1093#define _XOPEN_SOURCE 600
     1094#include <stdlib.h>
     1095#if defined(__GLIBC__) && ((__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 4))
     1096#error probably broken posix_fallocate
     1097#endif
    11501098''',
    1151                 'HAVE_BROKEN_FCNTL64_LOCKS',
    1152                 addmain=False,
    1153                 execute=True,
    1154                 msg='Checking whether fcntl64 locks are broken')
    1155 
    1156     if not conf.CONFIG_SET('HAVE_BROKEN_FCNTL64_LOCKS'):
    1157         conf.CHECK_CODE('''
    1158 #if defined(HAVE_UNISTD_H)
    1159 #include <unistd.h>
    1160 #endif
    1161 #include <stdio.h>
    1162 #include <stdlib.h>
    1163 
    1164 #ifdef HAVE_FCNTL_H
    1165 #include <fcntl.h>
    1166 #endif
    1167 
    1168 #ifdef HAVE_SYS_FCNTL_H
    1169 #include <sys/fcntl.h>
    1170 #endif
    1171 main() { struct flock64 fl64;
    1172 #if defined(F_SETLKW64) && defined(F_SETLK64) && defined(F_GETLK64)
    1173 exit(0);
    1174 #else
    1175 exit(1);
    1176 #endif
    1177 }
    1178 ''',
    1179                 'HAVE_STRUCT_FLOCK64',
    1180                 addmain=False,
    1181                 execute=True,
    1182                 msg="Checking whether the flock64 struct is available")
     1099                           '_HAVE_UNBROKEN_POSIX_FALLOCATE',
     1100                           msg='Checking for broken posix_fallocate'):
     1101        conf.DEFINE('HAVE_BROKEN_POSIX_FALLOCATE', '1')
     1102
    11831103
    11841104    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtim.tv_nsec',
    1185                                 define='HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') # Linux, Solaris
     1105                                define='HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') # Linux, Solaris
    11861106    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimensec',
    1187                                 define='HAVE_STRUCT_STAT_ST_MTIMENSEC') # BSD, if defined _POSIX_SOURCE
     1107                                define='HAVE_STRUCT_STAT_ST_MTIMENSEC') # BSD, if defined _POSIX_SOURCE
    11881108    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimespec.tv_nsec',
    1189                                 define='HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') # BSD, if not defined _POSIX_SOURCE
     1109                                define='HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') # BSD, if not defined _POSIX_SOURCE
    11901110    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtime_n',
    1191                                 define='HAVE_STRUCT_STAT_ST_MTIME_N') # AIX
     1111                                define='HAVE_STRUCT_STAT_ST_MTIME_N') # AIX
    11921112    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_umtime',
    1193                                 define='HAVE_STRUCT_STAT_ST_UMTIME') # Tru64
     1113                                define='HAVE_STRUCT_STAT_ST_UMTIME') # Tru64
    11941114    if conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') or \
    11951115       conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMENSEC') or \
     
    12011121    # recent FreeBSD, NetBSD have creation timestamps called birthtime:
    12021122    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtime',
    1203                                 define='HAVE_STRUCT_STAT_ST_BIRTHTIME')
     1123                                define='HAVE_STRUCT_STAT_ST_BIRTHTIME')
    12041124    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimespec.tv_nsec',
    1205                                 define='HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC')
     1125                                define='HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC')
    12061126    conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimensec',
    1207                                 define='HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC')
     1127                                define='HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC')
    12081128
    12091129    conf.CHECK_CODE('''
    1210 #if defined(HAVE_UNISTD_H)
    1211 #include <unistd.h>
    1212 #endif
    1213 #include <fcntl.h>],
    12141130ssize_t err = posix_fadvise(0,0,0x80000,POSIX_FADV_WILLNEED);
    12151131''',
    1216                 'HAVE_POSIX_FADVISE',
    1217                 msg='Checking whether posix_fadvise is available')
     1132                'HAVE_POSIX_FADVISE',
     1133                msg='Checking whether posix_fadvise is available',
     1134                headers='unistd.h fcntl.h')
    12181135
    12191136    for v in ['_SC_NGROUPS_MAX', '_SC_NPROC_ONLN', '_SC_NPROCESSORS_ONLN', '_SC_PAGESIZE' ]:
    12201137        conf.CHECK_CODE('''
    1221                         #include <unistd.h>
    1222                         return sysconf(%s) == -1 ? 1 : 0;
    1223                         ''' % v,
    1224                         'SYSCONF%s' % v,
    1225                         msg='Checking whether sysconf(%s) is available' % v)
    1226 
    1227     conf.CHECK_DECLS('__NR_inotify_init', reverse=True, headers='asm/unistd.h')
     1138                        #include <unistd.h>
     1139                        return sysconf(%s) == -1 ? 1 : 0;
     1140                        ''' % v,
     1141                        'SYSCONF%s' % v,
     1142                        msg='Checking whether sysconf(%s) is available' % v)
    12281143
    12291144    conf.CHECK_CODE('''
     
    12311146#include <unistd.h>
    12321147syscall(SYS_initgroups, 16, NULL, NULL, 0);
    1233                     ''',
    1234                     'HAVE_DARWIN_INITGROUPS',
    1235                     msg='Checking whether to use the Darwin-specific initgroups system call')
     1148                    ''',
     1149                    'HAVE_DARWIN_INITGROUPS',
     1150                    msg='Checking whether to use the Darwin-specific initgroups system call')
    12361151
    12371152    conf.CHECK_CODE('''struct utimbuf tbuf;  tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));''',
    1238                     'HAVE_UTIMBUF',
    1239                     headers='sys/types.h utime.h',
    1240                     msg='Checking whether struct utimbuf is available')
     1153                    'HAVE_UTIMBUF',
     1154                    headers='sys/types.h utime.h',
     1155                    msg='Checking whether struct utimbuf is available')
    12411156
    12421157    if conf.CHECK_CODE('''struct sigevent s;''',
    1243                     'HAVE_STRUCT_SIGEVENT',
    1244                     headers='sys/types.h stdlib.h stddef.h signal.h',
    1245                     msg='Checking whether we have the struct sigevent'):
     1158                    'HAVE_STRUCT_SIGEVENT',
     1159                    headers='sys/types.h stdlib.h stddef.h signal.h',
     1160                    msg='Checking whether we have the struct sigevent'):
    12461161        conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sival_ptr',
    1247                                     define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR',
    1248                                     headers='signal.h');
     1162                                    define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR',
     1163                                    headers='signal.h');
    12491164        conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sigval_ptr',
    1250                                     define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR',
    1251                                     headers='signal.h');
     1165                                    define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR',
     1166                                    headers='signal.h');
    12521167
    12531168    if os.path.exists('/proc/sys/kernel/core_pattern'):
     
    12571172#include <time.h>
    12581173main() {
    1259         struct tm *tm;
    1260         if (sizeof(time_t) == 8) {
    1261                 time_t max_time = 0x7fffffffffffffffll;
    1262                 tm = gmtime(&max_time);
    1263                 /* This should fail with 32-bit tm_year. */
    1264                 if (tm == NULL) {
    1265                         /* Max time_t that works with 32-bit int tm_year in struct tm. */
    1266                         max_time = 67768036191676799ll;
    1267                         tm = gmtime(&max_time);
    1268                         if (tm) {
    1269                                 exit(0);
    1270                         }
    1271                 }
    1272         }
    1273         exit(1);
     1174        struct tm *tm;
     1175        if (sizeof(time_t) == 8) {
     1176                time_t max_time = 0x7fffffffffffffffll;
     1177                tm = gmtime(&max_time);
     1178                /* This should fail with 32-bit tm_year. */
     1179                if (tm == NULL) {
     1180                        /* Max time_t that works with 32-bit int tm_year in struct tm. */
     1181                        max_time = 67768036191676799ll;
     1182                        tm = gmtime(&max_time);
     1183                        if (tm) {
     1184                                exit(0);
     1185                        }
     1186                }
     1187        }
     1188        exit(1);
    12741189}''',
    1275         '__TIME_T_MAX',
    1276         addmain=False,
    1277         execute=True,
    1278         msg="Checking for the maximum value of the 'time_t' type"):
     1190        '__TIME_T_MAX',
     1191        addmain=False,
     1192        execute=True,
     1193        msg="Checking for the maximum value of the 'time_t' type"):
    12791194            conf.DEFINE('TIME_T_MAX', '67768036191676799ll')
    12801195
     
    12861201main() { dev_t dev = makedev(1,2); return 0; }
    12871202''',
    1288         'HAVE_MAKEDEV',
    1289         addmain=False,
    1290         msg='Checking whether the macro for makedev is available')
     1203        'HAVE_MAKEDEV',
     1204        addmain=False,
     1205        msg='Checking whether the macro for makedev is available')
    12911206
    12921207    conf.CHECK_CODE('''
     
    12961211
    12971212void exit_on_core(int ignored) {
    1298         exit(1);
     1213        exit(1);
    12991214}
    13001215
    13011216main() {
    1302         char *newpath;
    1303         signal(SIGSEGV, exit_on_core);
    1304         newpath = realpath("/tmp", NULL);
    1305         exit((newpath != NULL) ? 0 : 1);
     1217        char *newpath;
     1218        signal(SIGSEGV, exit_on_core);
     1219        newpath = realpath("/tmp", NULL);
     1220        exit((newpath != NULL) ? 0 : 1);
    13061221}
    13071222''',
    1308         'REALPATH_TAKES_NULL',
    1309         addmain=False,
    1310         execute=True,
    1311         msg='Checking whether the realpath function allows a NULL argument')
     1223        'REALPATH_TAKES_NULL',
     1224        addmain=False,
     1225        execute=True,
     1226        msg='Checking whether the realpath function allows a NULL argument')
    13121227
    13131228    conf.CHECK_CODE('''#include "../tests/ftruncate.c"''',
    1314                     'HAVE_FTRUNCATE_EXTEND',
    1315                     msg='Checking for ftruncate extend',
    1316                     addmain=False,
    1317                     execute=True)
    1318     if os.getenv('RUN_FROM_BUILD_FARM'):
    1319         Logs.info("enabling buildfarm hacks")
    1320         conf.DEFINE('ENABLE_BUILD_FARM_HACKS', '1')
     1229                    'HAVE_FTRUNCATE_EXTEND',
     1230                    msg='Checking for ftruncate extend',
     1231                    addmain=False,
     1232                    execute=True)
    13211233
    13221234    if Options.options.with_sendfile_support:
    13231235        if (host_os.rfind('linux') > -1) or (host_os.rfind('gnu') > -1) or (host_os.rfind('k*bsd*-gnu') > -1) or (host_os.rfind('kopensolaris*-gnu') > -1):
    13241236            conf.CHECK_CODE('''
    1325                             int tofd, fromfd;
    1326                             off64_t offset;
    1327                             size_t total;
    1328                             ssize_t nwritten = sendfile64(tofd, fromfd, &offset, total);
    1329                             ''',
    1330                             '_HAVE_SENDFILE64',
    1331                             headers='sys/sendfile',
    1332                             msg='Checking for linux sendfile64 support')
    1333             conf.CHECK_CODE('''
    1334                             int tofd, fromfd;
    1335                             off_t offset;
    1336                             size_t total;
    1337                             ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
    1338                             ''',
    1339                             '_HAVE_SENDFILE',
    1340                             headers='sys/sendfile',
    1341                             msg='Checking for linux sendfile support')
    1342 
    1343             # Try and cope with broken Linux sendfile....
    1344             conf.CHECK_CODE('''#if defined(_FILE_OFFSET_BITS) && (_FILE_OFFSET_BITS == 64)
    1345                             #undef _FILE_OFFSET_BITS
    1346                             #endif
    1347                             #include <sys/sendfile.h>
    1348                             int tofd, fromfd;
    1349                             off_t offset;
    1350                             size_t total;
    1351                             ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
    1352                             ''',
    1353                             '_HAVE_BROKEN_LINUX_SENDFILE',
    1354                             msg='Checking for broken linux sendfile support')
    1355             if conf.CONFIG_SET('_HAVE_SENDFILE64'):
    1356                 conf.DEFINE('HAVE_SENDFILE64', '1')
    1357                 conf.DEFINE('LINUX_SENDFILE_API', '1')
    1358                 conf.DEFINE('WITH_SENDFILE', '1')
    1359             elif conf.CONFIG_SET('_HAVE_SENDFILE'):
     1237                            int tofd, fromfd;
     1238                            off_t offset;
     1239                            size_t total;
     1240                            ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
     1241                            ''',
     1242                            '_HAVE_SENDFILE',
     1243                            headers='sys/sendfile.h',
     1244                            msg='Checking for linux sendfile support')
     1245
     1246            if conf.CONFIG_SET('_HAVE_SENDFILE'):
    13601247                conf.DEFINE('HAVE_SENDFILE', '1')
    13611248                conf.DEFINE('LINUX_SENDFILE_API', '1')
    13621249                conf.DEFINE('WITH_SENDFILE', '1')
    1363             elif conf.CONFIG_SET('_HAVE_BROKEN_LINUX_SENDFILE'):
    1364                 conf.DEFINE('LINUX_BROKEN_SENDFILE_API', '1')
    1365                 conf.DEFINE('WITH_SENDFILE', '1')
    1366         elif (host_os.rfind('freebsd') > -1) or (host_os.rfind('dragonfly') > -1):
     1250        elif (host_os.rfind('freebsd') > -1) or (host_os.rfind('dragonfly') > -1):
    13671251            conf.CHECK_CODE('''
    1368                             #include <sys/types.h>
    1369                             #include <unistd.h>
    1370                             #include <sys/socket.h>
    1371                             #include <sys/uio.h>
    1372                             int fromfd, tofd, ret, total=0;
    1373                             off_t offset, nwritten;
    1374                             struct sf_hdtr hdr;
    1375                             struct iovec hdtrl;
    1376                             hdr.headers = &hdtrl;
    1377                             hdr.hdr_cnt = 1;
    1378                             hdr.trailers = NULL;
    1379                             hdr.trl_cnt = 0;
    1380                             hdtrl.iov_base = NULL;
    1381                             hdtrl.iov_len = 0;
    1382                             ret = sendfile(fromfd, tofd, offset, total, &hdr, &nwritten, 0)
    1383                             ''',
    1384                             '_HAVE_SENDFILE',
    1385                             msg='Checking for freebsd sendfile support')
     1252                            #include <sys/types.h>
     1253                            #include <unistd.h>
     1254                            #include <sys/socket.h>
     1255                            #include <sys/uio.h>
     1256                            int fromfd, tofd, ret, total=0;
     1257                            off_t offset, nwritten;
     1258                            struct sf_hdtr hdr;
     1259                            struct iovec hdtrl;
     1260                            hdr.headers = &hdtrl;
     1261                            hdr.hdr_cnt = 1;
     1262                            hdr.trailers = NULL;
     1263                            hdr.trl_cnt = 0;
     1264                            hdtrl.iov_base = NULL;
     1265                            hdtrl.iov_len = 0;
     1266                            ret = sendfile(fromfd, tofd, offset, total, &hdr, &nwritten, 0)
     1267                            ''',
     1268                            '_HAVE_SENDFILE',
     1269                            msg='Checking for freebsd sendfile support')
    13861270            if conf.CONFIG_SET('_HAVE_SENDFILE'):
    13871271                conf.DEFINE('HAVE_SENDFILE', '1')
    13881272                conf.DEFINE('FREEBSD_SENDFILE_API', '1')
    13891273                conf.DEFINE('WITH_SENDFILE', '1')
    1390         elif (host_os.rfind('hpux') > -1):
     1274        elif (host_os.rfind('darwin') > -1):
    13911275            conf.CHECK_CODE('''
    1392                             #include <sys/socket.h>
    1393                             #include <sys/uio.h>
    1394                             int fromfd, tofd;
    1395                             size_t total=0;
    1396                             struct iovec hdtrl[2];
    1397                             ssize_t nwritten;
    1398                             off64_t offset;
    1399                             hdtrl[0].iov_base = 0;
    1400                             hdtrl[0].iov_len = 0;
    1401                             nwritten = sendfile64(tofd, fromfd, offset, total, &hdtrl[0], 0);
    1402                             ''',
    1403                             '_HAVE_SENDFILE64',
    1404                             msg='Checking for hpux sendfile64 support')
     1276                            #include <sys/types.h>
     1277                            #include <sys/socket.h>
     1278                            #include <sys/uio.h>
     1279                            int fromfd, tofd, ret;
     1280                            off_t offset, nwritten;
     1281                            struct sf_hdtr hdr;
     1282                            struct iovec hdtrl;
     1283                            hdr.headers = &hdtrl;
     1284                            hdr.hdr_cnt = 1;
     1285                            hdr.trailers = (void *)0;
     1286                            hdr.trl_cnt = 0;
     1287                            hdtrl.iov_base = (void *)0;
     1288                            hdtrl.iov_len = 0;
     1289                            ret = sendfile(fromfd, tofd, offset, &nwritten, &hdr, 0);
     1290                            ''',
     1291                            '_HAVE_SENDFILE',
     1292                            msg='Checking for darwin sendfile support')
     1293            if conf.CONFIG_SET('_HAVE_SENDFILE'):
     1294                conf.DEFINE('HAVE_SENDFILE', '1')
     1295                conf.DEFINE('DARWIN_SENDFILE_API', '1')
     1296                conf.DEFINE('WITH_SENDFILE', '1')
     1297        elif (host_os.rfind('hpux') > -1) or (host_os.rfind('osf') > -1):
    14051298            conf.CHECK_CODE('''
    1406                             #include <sys/socket.h>
    1407                             #include <sys/uio.h>
    1408                             int fromfd, tofd;
    1409                             size_t total=0;
    1410                             struct iovec hdtrl[2];
    1411                             ssize_t nwritten;
    1412                             off_t offset;
    1413                             hdtrl[0].iov_base = 0;
    1414                             hdtrl[0].iov_len = 0;
    1415                             nwritten = sendfile(tofd, fromfd, offset, total, &hdtrl[0], 0);
    1416                             ''',
    1417                             '_HAVE_SENDFILE',
    1418                             msg='Checking for hpux sendfile support')
    1419             if conf.CONFIG_SET('_HAVE_SENDFILE64'):
    1420                 conf.DEFINE('HAVE_SENDFILE64', '1')
    1421                 conf.DEFINE('HPUX_SENDFILE_API', '1')
    1422                 conf.DEFINE('WITH_SENDFILE', '1')
    1423             elif conf.CONFIG_SET('_HAVE_SENDFILE'):
     1299                            #include <sys/socket.h>
     1300                            #include <sys/uio.h>
     1301                            int fromfd, tofd;
     1302                            size_t total=0;
     1303                            struct iovec hdtrl[2];
     1304                            ssize_t nwritten;
     1305                            off_t offset;
     1306                            hdtrl[0].iov_base = 0;
     1307                            hdtrl[0].iov_len = 0;
     1308                            nwritten = sendfile(tofd, fromfd, offset, total, &hdtrl[0], 0);
     1309                            ''',
     1310                            '_HAVE_SENDFILE',
     1311                            msg='Checking for osf/hpux sendfile support')
     1312            if conf.CONFIG_SET('_HAVE_SENDFILE'):
    14241313                conf.DEFINE('HAVE_SENDFILE', '1')
    14251314                conf.DEFINE('HPUX_SENDFILE_API', '1')
    14261315                conf.DEFINE('WITH_SENDFILE', '1')
    1427         elif (host_os.rfind('solaris') > -1):
     1316        elif (host_os.rfind('solaris') > -1):
    14281317            conf.CHECK_FUNCS_IN('sendfile', 'sendfilev')
    14291318            conf.CHECK_CODE('''
    1430                             #include <sys/sendfile.h>
    1431                             int sfvcnt;
    1432                             size_t xferred;
    1433                             struct sendfilevec vec[2];
    1434                             ssize_t nwritten;
    1435                             int tofd;
    1436                             sfvcnt = 2;
    1437                             vec[0].sfv_fd = SFV_FD_SELF;
    1438                             vec[0].sfv_flag = 0;
    1439                             vec[0].sfv_off = 0;
    1440                             vec[0].sfv_len = 0;
    1441                             vec[1].sfv_fd = 0;
    1442                             vec[1].sfv_flag = 0;
    1443                             vec[1].sfv_off = 0;
    1444                             vec[1].sfv_len = 0;
    1445                             nwritten = sendfilev64(tofd, vec, sfvcnt, &xferred);
    1446                             ''',
    1447                             '_HAVE_SENDFILEV64',
    1448                             msg='Checking for solaris sendfilev64 support')
    1449             conf.CHECK_CODE('''
    1450                             #include <sys/sendfile.h>,
    1451                             int sfvcnt;
    1452                             size_t xferred;
    1453                             struct sendfilevec vec[2];
    1454                             ssize_t nwritten;
    1455                             int tofd;
    1456                             sfvcnt = 2;
    1457                             vec[0].sfv_fd = SFV_FD_SELF;
    1458                             vec[0].sfv_flag = 0;
    1459                             vec[0].sfv_off = 0;
    1460                             vec[0].sfv_len = 0;
    1461                             vec[1].sfv_fd = 0;
    1462                             vec[1].sfv_flag = 0;
    1463                             vec[1].sfv_off = 0;
    1464                             vec[1].sfv_len = 0;
    1465                             nwritten = sendfilev(tofd, vec, sfvcnt, &xferred);
    1466                             ''',
    1467                             '_HAVE_SENDFILEV',
    1468                             msg='Checking for solaris sendfilev support')
    1469             if conf.CONFIG_SET('_HAVE_SENDFILEV64'):
    1470                 conf.DEFINE('HAVE_SENDFILEV64', '1')
    1471                 conf.DEFINE('SOLARIS_SENDFILE_API', '1')
    1472                 conf.DEFINE('WITH_SENDFILE', '1')
    1473             elif conf.CONFIG_SET('_HAVE_SENDFILEV'):
     1319                            #include <sys/sendfile.h>,
     1320                            int sfvcnt;
     1321                            size_t xferred;
     1322                            struct sendfilevec vec[2];
     1323                            ssize_t nwritten;
     1324                            int tofd;
     1325                            sfvcnt = 2;
     1326                            vec[0].sfv_fd = SFV_FD_SELF;
     1327                            vec[0].sfv_flag = 0;
     1328                            vec[0].sfv_off = 0;
     1329                            vec[0].sfv_len = 0;
     1330                            vec[1].sfv_fd = 0;
     1331                            vec[1].sfv_flag = 0;
     1332                            vec[1].sfv_off = 0;
     1333                            vec[1].sfv_len = 0;
     1334                            nwritten = sendfilev(tofd, vec, sfvcnt, &xferred);
     1335                            ''',
     1336                            '_HAVE_SENDFILEV',
     1337                            msg='Checking for solaris sendfilev support')
     1338            if conf.CONFIG_SET('_HAVE_SENDFILEV'):
    14741339                conf.DEFINE('HAVE_SENDFILEV', '1')
    14751340                conf.DEFINE('SOLARIS_SENDFILE_API', '1')
    14761341                conf.DEFINE('WITH_SENDFILE', '1')
    1477         elif (host_os.rfind('aix') > -1):
     1342        elif (host_os.rfind('aix') > -1):
    14781343            conf.CHECK_CODE('''
    1479                             #include <sys/socket.h>
    1480                             int fromfd, tofd;
    1481                             size_t total=0;
    1482                             struct sf_parms hdtrl;
    1483                             ssize_t nwritten;
    1484                             off64_t offset;
    1485                             hdtrl.header_data = 0;
    1486                             hdtrl.header_length = 0;
    1487                             hdtrl.file_descriptor = fromfd;
    1488                             hdtrl.file_offset = 0;
    1489                             hdtrl.file_bytes = 0;
    1490                             hdtrl.trailer_data = 0;
    1491                             hdtrl.trailer_length = 0;
    1492                             nwritten = send_file(&tofd, &hdtrl, 0);
    1493                             ''',
    1494                             '_HAVE_SENDFILE',
    1495                             msg='Checking for AIX send_file support')
     1344                            #include <sys/socket.h>
     1345                            int fromfd, tofd;
     1346                            size_t total=0;
     1347                            struct sf_parms hdtrl;
     1348                            ssize_t nwritten;
     1349                            hdtrl.header_data = 0;
     1350                            hdtrl.header_length = 0;
     1351                            hdtrl.file_descriptor = fromfd;
     1352                            hdtrl.file_offset = 0;
     1353                            hdtrl.file_bytes = 0;
     1354                            hdtrl.trailer_data = 0;
     1355                            hdtrl.trailer_length = 0;
     1356                            nwritten = send_file(&tofd, &hdtrl, 0);
     1357                            ''',
     1358                            '_HAVE_SENDFILE',
     1359                            msg='Checking for AIX send_file support')
    14961360            if conf.CONFIG_SET('_HAVE_SENDFILE'):
    14971361                conf.DEFINE('HAVE_SENDFILE', '1')
     
    14991363                conf.DEFINE('WITH_SENDFILE', '1')
    15001364
    1501     conf.CHECK_CODE('''enum TDB_ERROR err = TDB_ERR_NESTING''',
    1502                     'HAVE_TDB_ERR_NESTING',
    1503                     headers='tdb.h',
    1504                     msg='Checking whether we have TDB_ERR_NESTING')
     1365    # Check for getcwd allowing a NULL arg.
     1366    conf.CHECK_CODE('''
     1367#include <unistd.h>
     1368main() {
     1369        char *s = getcwd(NULL,0);
     1370        exit(s != NULL ?  0 : 1);
     1371}''', 'GETCWD_TAKES_NULL', addmain=False, execute=True,
     1372        msg="getcwd takes a NULL argument")
     1373
    15051374
    15061375    # UnixWare 7.x has its getspnam in -lgen
     
    15091378    conf.CHECK_FUNCS_IN('getspnam', 'sec')
    15101379
     1380    legacy_quota_libs = ''
    15111381    if Options.options.with_quotas:
    15121382        # For quotas on Veritas VxFS filesystems
    15131383        conf.CHECK_HEADERS('sys/fs/vx_quota.h')
    1514         # For quotas on Linux XFS filesystems
    1515         conf.CHECK_HEADERS('linux/dqblk_xfs.h')
    15161384        # For sys/quota.h and linux/quota.h
    15171385        conf.CHECK_HEADERS('sys/quota.h')
    1518 
     1386        # For quotas on BSD systems
     1387        conf.CHECK_HEADERS('ufs/ufs/quota.h')
     1388        # For quotas on Linux XFS filesystems
     1389        if conf.CHECK_HEADERS('xfs/xqm.h'):
     1390            conf.DEFINE('HAVE_XFS_QUOTAS', '1')
     1391        else:
     1392            # For Irix XFS
     1393            conf.CHECK_CODE('''
     1394                #include "confdefs.h"
     1395                #ifdef HAVE_SYS_TYPES_H
     1396                #include <sys/types.h>
     1397                #endif
     1398                #ifdef HAVE_ASM_TYPES_H
     1399                #include <asm/types.h>
     1400                #endif
     1401                #include <sys/quota.h>
     1402                int i = Q_XGETQUOTA;''',
     1403                define='HAVE_XFS_QUOTAS',
     1404                msg='for XFS QUOTA in <sys/quota.h>',
     1405                execute=False,
     1406                local_include=False)
     1407
     1408        # For IRIX like dqb_isoftlimit instead of dqb_fsoftlimit in struc dqblk
     1409        conf.CHECK_STRUCTURE_MEMBER('struct dqblk', 'dqb_fsoftlimit', define='HAVE_DQB_FSOFTLIMIT',
     1410                                headers='sys/quota.h')
     1411        #darwin style quota bytecount
     1412        conf.CHECK_STRUCTURE_MEMBER('struct dqblk', 'dqb_curbytes', define='HAVE_STRUCT_DQBLK_DQB_CURBYTES',
     1413                                headers='sys/quota.h')
     1414        if conf.CHECK_HEADERS('rpcsvc/rquota.h'):
     1415            conf.DEFINE('HAVE_NFS_QUOTAS', '1')
     1416            conf.CHECK_STRUCTURE_MEMBER('struct getquota_rslt', 'getquota_rslt_u',
     1417                                        define='HAVE_GETQUOTA_RSLT_GETQUOTA_RSLT_U',
     1418                                        headers='rpcsvc/rquota.h')
     1419
     1420        if (host_os.rfind('linux') > -1):
     1421            conf.DEFINE('HAVE_QUOTACTL_LINUX', '1')
     1422        elif not conf.CONFIG_SET("HAVE_XFS_QUOTAS"):
     1423            if not conf.CHECK_CODE('''
     1424                #define HAVE_QUOTACTL_4A 1
     1425                #define AUTOCONF_TEST 1
     1426                #include "../tests/sysquotas.c"
     1427                ''',
     1428                                   cflags=conf.env['WERROR_CFLAGS'],
     1429                                   define='HAVE_QUOTACTL_4A',
     1430                                   msg='for QUOTACTL_4A: long quotactl(int cmd, char *special, qid_t id, caddr_t addr)',
     1431                                   execute=True,
     1432                                   addmain=False):
     1433
     1434                conf.CHECK_CODE('''
     1435                #define HAVE_QUOTACTL_4B 1
     1436                #define AUTOCONF_TEST 1
     1437                #include "../tests/sysquotas.c"
     1438                ''',
     1439                                cflags=conf.env['WERROR_CFLAGS'],
     1440                                define='HAVE_QUOTACTL_4B',
     1441                                msg='for QUOTACTL_4B:  int quotactl(const char *path, int cmd, int id, char *addr)',
     1442                                execute=True,
     1443                                addmain=False)
     1444
     1445        conf.CHECK_CODE('''
     1446                     clnt_create("", RQUOTAPROG, RQUOTAVERS, "udp");
     1447''',
     1448                        headers="rpc/rpc.h rpc/types.h rpcsvc/rquota.h rpc/nettype.h rpc/xdr.h",
     1449                        define='HAVE_NFS_QUOTAS',
     1450                        msg='for NFS QUOTAS',
     1451                        execute=True,
     1452                        local_include=False)
     1453
     1454        if conf.CONFIG_SET('HAVE_QUOTACTL_LINUX') or \
     1455           conf.CONFIG_SET('HAVE_QUOTACTL_4A') or \
     1456           conf.CONFIG_SET('HAVE_QUOTACTL_4B') or \
     1457           conf.CONFIG_SET('HAVE_XFS_QUOTAS'):
     1458            conf.DEFINE('HAVE_SYS_QUOTAS', '1')
     1459            conf.DEFINE('WITH_QUOTAS', '1')
     1460
     1461        #
     1462        # check if Legacy quota code can be brought in
     1463        # if standard interfaces are not supported
     1464        #
     1465        if not conf.CONFIG_SET('WITH_QUOTAS'):
     1466            if host_os.rfind('sunos5') > -1:
     1467                conf.DEFINE('SUNOS5', '1')
     1468                legacy_quota_libs = 'nsl'
     1469            conf.CHECK_CODE('''
     1470            #define WITH_QUOTAS 1
     1471            #define AUTOCONF_TEST 1
     1472            #include "../tests/oldquotas.c"
     1473            ''',
     1474                            cflags=conf.env['WERROR_CFLAGS'],
     1475                            define='WITH_QUOTAS',
     1476                            lib=legacy_quota_libs,
     1477                            msg='Checking whether legacy quota code can be used',
     1478                            execute=False,
     1479                            addmain=False)
     1480            if not conf.CONFIG_SET('WITH_QUOTAS'):
     1481                legacy_quota_libs = ''
     1482    conf.env['legacy_quota_libs'] = legacy_quota_libs
    15191483
    15201484    #
    1521     # checking for clustering extensions (CTDB)
     1485    # cluster support (CTDB)
    15221486    #
    15231487    if not Options.options.with_cluster_support:
    1524         have_cluster_support = False
    1525 
     1488        Logs.info("building without cluster support (--without-cluster-support)")
     1489        conf.env.with_ctdb = False
    15261490    else:
    1527 
    1528         if Options.options.ctdb_dir:
    1529             conf.ADD_EXTRA_INCLUDES(Options.options.ctdb_dir + '/include')
    1530 
    1531         srcdir = os.path.realpath(conf.srcdir)
    1532         if 'EXTRA_INCLUDES' in conf.env:
    1533             includes = ' '.join(conf.env['EXTRA_INCLUDES']).replace('#', srcdir + '/')
    1534         else:
    1535             includes = ''
    1536 
    1537         have_cluster_support = True
    1538         ctdb_broken = ""
    1539 
    1540         conf.CHECK_CODE('''
    1541             #define NO_CONFIG_H
    1542             #include "replace.h"
    1543             #include "system/wait.h"
    1544             #include "system/network.h"
    1545             #define private #error __USED_RESERVED_WORD_private__
    1546             #include <talloc.h>
    1547             #include <tdb.h>
    1548             #include <ctdb.h>
    1549 
    1550             int main(void)
    1551             {
    1552                 return 0;
    1553             }
    1554             ''',
    1555             'HAVE_CTDB_H',
    1556             addmain=False,
    1557             includes=includes,
    1558             msg='Checking for header ctdb.h')
    1559 
    1560         if not conf.CONFIG_SET('HAVE_CTDB_H'):
    1561             have_cluster_support = False
    1562             ctdb_broken = "ctdb.h is required for cluster support"
    1563 
    1564         if have_cluster_support:
    1565             conf.CHECK_CODE('''
    1566                 #define NO_CONFIG_H
    1567                 #include "replace.h"
    1568                 #include "system/wait.h"
    1569                 #include "system/network.h"
    1570                 #define private #error __USED_RESERVED_WORD_private__
    1571                 #include <talloc.h>
    1572                 #include <tdb.h>
    1573                 #include <ctdb.h>
    1574                 #include <ctdb_private.h>
    1575 
    1576                 int main(void)
    1577                 {
    1578                     return 0;
    1579                 }
    1580                 ''',
    1581                 'HAVE_CTDB_PRIVATE_H',
    1582                 addmain=False,
    1583                 includes=includes,
    1584                 msg='Checking for header ctdb_private.h')
    1585 
    1586             if not conf.CONFIG_SET('HAVE_CTDB_PRIVATE_H'):
    1587                 have_cluster_support = False
    1588                 ctdb_broken = "ctdb_private.h is required for cluster support"
    1589 
    1590         if have_cluster_support:
    1591             conf.CHECK_CODE('''
    1592                 #define NO_CONFIG_H
    1593                 #include "replace.h"
    1594                 #include "system/wait.h"
    1595                 #include "system/network.h"
    1596                 #include <talloc.h>
    1597                 #include <tdb.h>
    1598                 #include <ctdb.h>
    1599                 #include <ctdb_private.h>
    1600 
    1601                 int main(void)
    1602                 {
    1603                    int i = (int)CTDB_CONTROL_TRANS3_COMMIT;
    1604                    return 0;
    1605                 }
    1606                 ''',
    1607                 'HAVE_CTDB_CONTROL_TRANS3_COMMIT_DECL',
    1608                 addmain=False,
    1609                 includes=includes,
    1610                 msg='Checking for transaction support (TRANS3_COMMIT control)')
    1611 
    1612             if not conf.CONFIG_SET('HAVE_CTDB_CONTROL_TRANS3_COMMIT_DECL'):
    1613                 have_cluster_support = False
    1614                 ctdb_broken = "ctdb transaction support missing or too old"
    1615 
    1616         if have_cluster_support:
    1617             conf.CHECK_CODE('''
    1618                 #define NO_CONFIG_H
    1619                 #include "replace.h"
    1620                 #include "system/wait.h"
    1621                 #include "system/network.h"
    1622                 #include <talloc.h>
    1623                 #include <tdb.h>
    1624                 #include <ctdb.h>
    1625                 #include <ctdb_private.h>
    1626 
    1627                 int main(void)
    1628                 {
    1629                     int i = (int)CTDB_CONTROL_SCHEDULE_FOR_DELETION;
    1630                     return 0;
    1631                 }
    1632                 ''',
    1633                 'HAVE_CTDB_CONTROL_SCHEDULE_FOR_DELETION_DECL',
    1634                 addmain=False,
    1635                 includes=includes,
    1636                 msg='Checking for SCHEDULE_FOR_DELETION control')
    1637 
    1638             if not conf.CONFIG_SET('HAVE_CTDB_CONTROL_SCHEDULE_FOR_DELETION_DECL'):
    1639                 if not Options.options.enable_old_ctdb:
    1640                     have_cluster_support = False
    1641                     ctdb_broken = "SCHEDULE_FOR_DELETION control missing"
    1642                 else:
    1643                     Logs.warn("ignoring missing SCHEDULE_FOR_DELETION control (--enable-old-ctdb)")
    1644 
    1645         if have_cluster_support:
    1646             conf.CHECK_CODE('''
    1647                 #define NO_CONFIG_H
    1648                 #include "replace.h"
    1649                 #include "system/wait.h"
    1650                 #include "system/network.h"
    1651                 #include <talloc.h>
    1652                 #include <tdb.h>
    1653                 #include <ctdb.h>
    1654                 #include <ctdb_private.h>
    1655 
    1656                 int main(void)
    1657                 {
    1658                     struct ctdb_control_tcp _x;
    1659                     return 0;
    1660                 }
    1661                 ''',
    1662                 'HAVE_STRUCT_CTDB_CONTROL_TCP',
    1663                 addmain=False,
    1664                 includes=includes,
    1665                 msg='Checking for ctdb ipv4 support')
    1666 
    1667             if not conf.CONFIG_SET('HAVE_STRUCT_CTDB_CONTROL_TCP'):
    1668                 have_cluster_support = False
    1669                 ctdb_broken = "missing struct ctdb_control_tcp"
    1670 
    1671         if have_cluster_support:
    1672             conf.CHECK_CODE('''
    1673                 #define NO_CONFIG_H
    1674                 #include "replace.h"
    1675                 #include "system/wait.h"
    1676                 #include "system/network.h"
    1677                 #include <talloc.h>
    1678                 #include <tdb.h>
    1679                 #include <ctdb.h>
    1680                 #include <ctdb_private.h>
    1681 
    1682                 int main(void)
    1683                 {
    1684                     struct ctdb_control_tcp_addr _x;
    1685                     return 0;
    1686                 }
    1687                 ''',
    1688                 'HAVE_STRUCT_CTDB_CONTROL_TCP_ADDR',
    1689                 addmain=False,
    1690                 includes=includes,
    1691                 msg='Checking for ctdb ipv6 support')
    1692 
    1693     if have_cluster_support:
    16941491        Logs.info("building with cluster support")
    1695         conf.DEFINE('CLUSTER_SUPPORT', 1);
    1696     else:
    1697         if not Options.options.with_cluster_support:
    1698             Logs.info("building without cluster support")
    1699         else:
    1700             Logs.warn("building without cluster support: " + ctdb_broken)
    1701         conf.undefine('CLUSTER_SUPPORT')
    1702 
    1703 
    1704 
    1705     conf.CHECK_CODE('__attribute__((destructor)) static void cleanup(void) { }',
    1706                     'HAVE_FUNCTION_ATTRIBUTE_DESTRUCTOR',
    1707                     addmain=False,
    1708                     link=False,
    1709                     msg='Checking whether we can compile with __attribute__((destructor))')
     1492        conf.env.with_ctdb = True
     1493        conf.DEFINE('CLUSTER_SUPPORT', 1)
    17101494
    17111495    conf.CHECK_CODE('void seekdir(DIR *d, long loc) { return; }',
    1712                     'SEEKDIR_RETURNS_VOID',
    1713                     headers='sys/types.h dirent.h',
    1714                     msg='Checking whether seekdir returns void')
     1496                    'SEEKDIR_RETURNS_VOID',
     1497                    headers='sys/types.h dirent.h',
     1498                    msg='Checking whether seekdir returns void')
    17151499
    17161500    if Options.options.with_profiling_data:
    17171501        conf.DEFINE('WITH_PROFILE', 1);
    1718 
    1719     PTHREAD_CFLAGS='error'
    1720     PTHREAD_LDFLAGS='error'
    1721 
    1722     if PTHREAD_LDFLAGS == 'error':
    1723         if conf.CHECK_FUNCS_IN('pthread_attr_init', 'pthread'):
    1724             PTHREAD_CFLAGS='-D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS'
    1725             PTHREAD_LDFLAGS='-lpthread'
    1726     if PTHREAD_LDFLAGS == 'error':
    1727         if conf.CHECK_FUNCS_IN('pthread_attr_init', 'pthreads'):
    1728             PTHREAD_CFLAGS='-D_THREAD_SAFE'
    1729             PTHREAD_LDFLAGS='-lpthreads'
    1730     if PTHREAD_LDFLAGS == 'error':
    1731         if conf.CHECK_FUNCS_IN('pthread_attr_init', 'c_r'):
    1732             PTHREAD_CFLAGS='-D_THREAD_SAFE -pthread'
    1733             PTHREAD_LDFLAGS='-pthread'
    1734     if PTHREAD_LDFLAGS == 'error':
    1735         if conf.CHECK_FUNC('pthread_attr_init'):
    1736             PTHREAD_CFLAGS='-D_REENTRANT'
    1737             PTHREAD_LDFLAGS='-lpthread'
    1738     # especially for HP-UX, where the CHECK_FUNC macro fails to test for
    1739     # pthread_attr_init. On pthread_mutex_lock it works there...
    1740     if PTHREAD_LDFLAGS == 'error':
    1741         if conf.CHECK_FUNCS_IN('pthread_mutex_lock', 'pthread'):
    1742             PTHREAD_CFLAGS='-D_REENTRANT'
    1743             PTHREAD_LDFLAGS='-lpthread'
    1744 
    1745     if PTHREAD_CFLAGS != 'error' and PTHREAD_LDFLAGS != 'error':
    1746         conf.ADD_CFLAGS(PTHREAD_CFLAGS)
    1747         conf.ADD_LDFLAGS(PTHREAD_LDFLAGS)
    1748         conf.CHECK_HEADERS('pthread.h')
    1749         conf.DEFINE('HAVE_PTHREAD', '1')
    1750 
    1751     if conf.CHECK_HEADERS('gpfs_gpl.h'):
    1752         conf.DEFINE('HAVE_GPFS', '1')
    1753 
    1754     default_static_modules=TO_LIST('''pdb_smbpasswd pdb_tdbsam pdb_wbc_sam
    1755                                       auth_sam auth_unix auth_winbind auth_wbc auth_server
    1756                                       auth_domain auth_builtin vfs_default
     1502        conf.CHECK_FUNCS('getrusage', headers="sys/time.h sys/resource.h")
     1503
     1504    if Options.options.with_pthreadpool:
     1505        if conf.CONFIG_SET('HAVE_PTHREAD'):
     1506            conf.DEFINE('WITH_PTHREADPOOL', '1')
     1507        else:
     1508            Logs.warn("pthreadpool support cannot be enabled when pthread support was not found")
     1509            conf.undefine('WITH_PTHREADPOOL')
     1510
     1511    if (conf.CHECK_HEADERS('linux/ioctl.h sys/ioctl.h linux/fs.h') and
     1512        conf.CHECK_DECLS('FS_IOC_GETFLAGS FS_COMPR_FL', headers='linux/fs.h')):
     1513            conf.DEFINE('HAVE_LINUX_IOCTL', '1')
     1514
     1515    conf.env['CCFLAGS_CEPHFS'] = "-D_FILE_OFFSET_BITS=64"
     1516    if Options.options.libcephfs_dir:
     1517        conf.env['CPPPATH_CEPHFS'] = Options.options.libcephfs_dir + '/include'
     1518        conf.env['LIBPATH_CEPHFS'] = Options.options.libcephfs_dir + '/lib'
     1519
     1520    if conf.CHECK_HEADERS('cephfs/libcephfs.h', False, False, 'cephfs') and conf.CHECK_LIB('cephfs'):
     1521        conf.DEFINE('HAVE_CEPH', '1')
     1522
     1523    if Options.options.with_glusterfs:
     1524        conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 4" --cflags --libs',
     1525                       msg='Checking for glusterfs-api >= 4', uselib_store="GFAPI")
     1526        conf.CHECK_HEADERS('api/glfs.h', lib='gfapi')
     1527        conf.CHECK_LIB('gfapi', shlib=True)
     1528
     1529        if conf.CONFIG_SET('HAVE_API_GLFS_H'):
     1530            conf.DEFINE('HAVE_GLUSTERFS', '1')
     1531        else:
     1532            conf.SET_TARGET_TYPE('gfapi', 'EMPTY')
     1533            conf.undefine('HAVE_GLUSTERFS')
     1534    else:
     1535        conf.SET_TARGET_TYPE('gfapi', 'EMPTY')
     1536        conf.undefine('HAVE_GLUSTERFS')
     1537
     1538    if Options.options.enable_vxfs:
     1539        conf.DEFINE('HAVE_VXFS', '1')
     1540
     1541    if conf.CHECK_CFG(package='dbus-1', args='--cflags --libs',
     1542                      msg='Checking for dbus', uselib_store="DBUS-1"):
     1543        if (conf.CHECK_HEADERS('dbus/dbus.h', lib='dbus-1')
     1544                                      and conf.CHECK_LIB('dbus-1', shlib=True)):
     1545            conf.DEFINE('HAVE_DBUS', '1')
     1546
     1547    conf.env.build_regedit = False
     1548    if not Options.options.with_regedit == False:
     1549        conf.PROCESS_SEPARATE_RULE('system_ncurses')
     1550        if conf.CONFIG_SET('HAVE_NCURSES'):
     1551            conf.env.build_regedit = True
     1552
     1553    if conf.env.build_regedit:
     1554        Logs.info("building regedit")
     1555    else:
     1556        if Options.options.with_regedit == False:
     1557            Logs.info("not building regedit (--without-regedit)")
     1558        elif Options.options.with_regedit == True:
     1559            Logs.error("ncurses not available, cannot build regedit")
     1560            conf.fatal("ncurses not available, but --with-regedit was specified")
     1561        else:
     1562            Logs.info("ncurses not available, not building regedit")
     1563
     1564    conf.CHECK_FUNCS_IN('DES_pcbc_encrypt', 'crypto')
     1565    if Options.options.with_fake_kaserver == True:
     1566        conf.CHECK_HEADERS('afs/param.h afs/stds.h', together=True)
     1567        conf.CHECK_HEADERS('afs/param.h afs/stds.h', together=True)
     1568        if (conf.CONFIG_SET('HAVE_AFS_PARAM_H') and conf.CONFIG_SET('HAVE_AFS_STDS_H') and conf.CONFIG_SET('HAVE_DES_PCBC_ENCRYPT')):
     1569            conf.DEFINE('WITH_FAKE_KASERVER', '1')
     1570        else:
     1571            conf.fatal('AFS headers not available, but --with-fake-kaserver was specified')
     1572
     1573    conf.env['libtracker']=''
     1574    conf.env.with_spotlight = False
     1575    if Options.options.with_spotlight:
     1576        versions = ['1.0', '0.16', '0.14']
     1577        for version in versions:
     1578            testlib = 'tracker-sparql-' + version
     1579            if conf.CHECK_CFG(package=testlib,
     1580                              args='--cflags --libs',
     1581                              mandatory=False):
     1582                conf.SET_TARGET_TYPE(testlib, 'SYSLIB')
     1583                conf.env['libtracker'] = testlib
     1584                conf.env.with_spotlight = True
     1585                conf.DEFINE('WITH_SPOTLIGHT', '1')
     1586                break
     1587
     1588        if not conf.env.with_spotlight:
     1589            conf.fatal("Spotlight support requested but tracker-sparql library missing")
     1590        Logs.info("building with Spotlight support")
     1591
     1592    forced_static_modules.extend(TO_LIST('auth_domain auth_builtin auth_sam auth_winbind'))
     1593    default_static_modules.extend(TO_LIST('''pdb_smbpasswd pdb_tdbsam pdb_wbc_sam
     1594                                      auth_unix auth_wbc
    17571595                                      nss_info_template idmap_tdb idmap_passdb
    1758                                       idmap_nss''')
    1759 
    1760     default_shared_modules=TO_LIST('''vfs_recycle vfs_audit vfs_extd_audit vfs_full_audit vfs_netatalk
     1596                                      idmap_nss'''))
     1597
     1598    default_shared_modules.extend(TO_LIST('''
     1599                                      vfs_recycle vfs_audit vfs_extd_audit vfs_full_audit vfs_netatalk
    17611600                                      vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap
    1762                                       vfs_expand_msdfs vfs_shadow_copy vfs_shadow_copy2 charset_CP850
    1763                                       charset_CP437 auth_script vfs_readahead vfs_xattr_tdb
     1601                                      vfs_expand_msdfs vfs_shadow_copy vfs_shadow_copy2
     1602                                      vfs_readahead vfs_xattr_tdb vfs_posix_eadb
    17641603                                      vfs_streams_xattr vfs_streams_depot vfs_acl_xattr vfs_acl_tdb
    1765                                       vfs_smb_traffic_analyzer vfs_preopen vfs_catia vfs_scannedonly
    1766                                       vfs_crossrename vfs_linux_xfs_sgid
    1767                                       vfs_time_audit idmap_autorid''')
     1604                                      vfs_preopen vfs_catia
     1605                                      vfs_media_harmony vfs_unityed_media vfs_fruit vfs_shell_snap
     1606                                      vfs_commit vfs_worm vfs_crossrename vfs_linux_xfs_sgid
     1607                                      vfs_time_audit vfs_offline
     1608                                  '''))
     1609    default_shared_modules.extend(TO_LIST('auth_script idmap_tdb2 idmap_script'))
     1610    # these have broken dependencies
     1611    forced_shared_modules.extend(TO_LIST('idmap_autorid idmap_rid idmap_hash'))
    17681612
    17691613    if Options.options.developer:
    1770         default_static_modules.extend(TO_LIST('pdb_ads auth_netlogond'))
    1771         default_shared_modules.extend(TO_LIST('charset_weird perfcount_test'))
    1772 
    1773     if Options.options.with_acl_support and conf.CONFIG_SET('HAVE_POSIX_ACLS'):
    1774         default_static_modules.extend(TO_LIST('vfs_posixacl'))
     1614        default_static_modules.extend(TO_LIST('charset_weird'))
     1615        default_shared_modules.extend(TO_LIST('perfcount_test'))
     1616        default_shared_modules.extend(TO_LIST('vfs_skel_opaque vfs_skel_transparent vfs_shadow_copy_test'))
     1617        default_shared_modules.extend(TO_LIST('auth_skel pdb_test'))
     1618        default_shared_modules.extend(TO_LIST('vfs_fake_dfq'))
     1619
     1620    if Options.options.enable_selftest or Options.options.developer:
     1621        default_shared_modules.extend(TO_LIST('vfs_fake_acls vfs_nfs4acl_xattr'))
     1622
     1623    if conf.CONFIG_SET('AD_DC_BUILD_IS_ENABLED'):
     1624        default_static_modules.extend(TO_LIST('pdb_samba_dsdb auth_samba4 vfs_dfs_samba4'))
    17751625
    17761626    if conf.CONFIG_SET('HAVE_FREEBSD_SUNACL_H'):
    1777         default_shared_modules.extend(TO_LIST('vfs_zfsacl'))
     1627        default_shared_modules.extend(TO_LIST('vfs_zfsacl'))
    17781628
    17791629    if conf.CONFIG_SET('HAVE_DIRFD_DECL'):
    1780         default_shared_modules.extend(TO_LIST('vfs_syncops vfs_dirsort'))
     1630        default_shared_modules.extend(TO_LIST('vfs_syncops vfs_dirsort'))
    17811631
    17821632    if conf.CONFIG_SET('HAVE_STATFS_F_FSID'):
    1783         default_shared_modules.extend(TO_LIST('vfs_fileid'))
    1784 
    1785     if conf.CONFIG_SET('HAVE_AIO') and (conf.CONFIG_SET('HAVE_MSGHDR_MSG_CONTROL') or conf.CONFIG_SET('HAVE_MSGHDR_MSG_ACCTRIGHTS')):
    1786         default_shared_modules.extend(TO_LIST('vfs_aio_fork'))
     1633        default_shared_modules.extend(TO_LIST('vfs_fileid'))
     1634
     1635    if (conf.CONFIG_SET('HAVE_STRUCT_MSGHDR_MSG_CONTROL') or conf.CONFIG_SET('HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS')):
     1636        default_shared_modules.extend(TO_LIST('vfs_aio_fork'))
     1637
     1638    if Options.options.with_pthreadpool:
     1639        default_shared_modules.extend(TO_LIST('vfs_aio_pthread'))
     1640
     1641    if conf.CONFIG_SET('HAVE_LINUX_KERNEL_AIO'):
     1642        default_shared_modules.extend(TO_LIST('vfs_aio_linux'))
    17871643
    17881644    if conf.CONFIG_SET('HAVE_LDAP'):
    1789         default_static_modules.extend(TO_LIST('pdb_ldap idmap_ldap'))
     1645        default_static_modules.extend(TO_LIST('pdb_ldapsam idmap_ldap'))
    17901646
    17911647    if conf.CONFIG_SET('DARWINOS'):
    1792         default_shared_modules.extend(TO_LIST('charset_macosxfs'))
     1648        default_static_modules.extend(TO_LIST('charset_macosxfs'))
    17931649
    17941650    if conf.CONFIG_SET('HAVE_GPFS'):
    1795         default_shared_modules.extend(TO_LIST('vfs_gpfs vfs_gpfs_hsm_notify'))
     1651        default_shared_modules.extend(TO_LIST('vfs_gpfs'))
     1652
     1653    if (conf.CONFIG_SET('HAVE_LINUX_IOCTL')
     1654      and conf.CONFIG_SET('HAVE_BASENAME') and conf.CONFIG_SET('HAVE_DIRNAME')):
     1655        default_shared_modules.extend(TO_LIST('vfs_btrfs'))
     1656
     1657    if conf.CONFIG_SET("HAVE_CEPH"):
     1658        default_shared_modules.extend(TO_LIST('vfs_ceph'))
     1659
     1660    if conf.CONFIG_SET('HAVE_GLUSTERFS'):
     1661        default_shared_modules.extend(TO_LIST('vfs_glusterfs'))
     1662
     1663    if conf.CONFIG_SET('HAVE_VXFS'):
     1664        default_shared_modules.extend(TO_LIST('vfs_vxfs'))
     1665
     1666    if conf.CONFIG_SET('HAVE_DBUS'):
     1667        default_shared_modules.extend(TO_LIST('vfs_snapper'))
    17961668
    17971669    explicit_shared_modules = TO_LIST(Options.options.shared_modules, delimiter=',')
    17981670    explicit_static_modules = TO_LIST(Options.options.static_modules, delimiter=',')
    17991671
    1800     final_static_modules = default_static_modules
    1801     final_shared_modules = default_shared_modules
     1672    def replace_list_item(lst, item, value):
     1673        try:
     1674            idx = lst.index(item)
     1675            lst[idx] = value
     1676        except:
     1677            pass
     1678    # PDB module file name should have the same name as module registers itself
     1679    # In Autoconf build we export LDAP passdb module as ldapsam but WAF build
     1680    # was always exporting pdb_ldap. In order to support existing packages
     1681    # allow referring to pdb_ldapsam as pdb_ldap but use proper name internally.
     1682    replace_list_item(explicit_shared_modules, 'pdb_ldap', 'pdb_ldapsam')
     1683    replace_list_item(explicit_static_modules, 'pdb_ldap', 'pdb_ldapsam')
     1684
     1685    final_static_modules = []
     1686    final_static_modules.extend(TO_LIST(required_static_modules))
     1687    final_shared_modules = []
     1688
     1689    if '!FORCED' not in explicit_static_modules:
     1690        final_static_modules.extend(TO_LIST(forced_static_modules))
     1691    if '!FORCED' not in explicit_shared_modules:
     1692        final_shared_modules.extend(TO_LIST(forced_shared_modules))
     1693    if '!DEFAULT' not in explicit_static_modules:
     1694        final_static_modules.extend(TO_LIST(default_static_modules))
     1695    if '!DEFAULT' not in explicit_shared_modules:
     1696        final_shared_modules.extend(TO_LIST(default_shared_modules))
     1697
     1698    if 'ALL' in explicit_static_modules:
     1699        for m in default_shared_modules:
     1700            if m in final_shared_modules:
     1701                final_shared_modules.remove(m)
     1702            final_static_modules.append(m)
     1703    if 'ALL' in explicit_shared_modules:
     1704        for m in default_static_modules:
     1705            if m in final_static_modules:
     1706                final_static_modules.remove(m)
     1707            final_shared_modules.append(m)
    18021708
    18031709    for m in explicit_static_modules:
     1710        if m in ['ALL','!DEFAULT','!FORCED']:
     1711            continue
     1712        if m.startswith('!'):
     1713            m = m[1:]
     1714            if m in required_static_modules:
     1715                raise Utils.WafError('These modules are REQUIRED as static modules: %s' %
     1716                                     ' '.join(required_static_modules))
     1717            if m in final_static_modules:
     1718                final_static_modules.remove(m)
     1719            continue
     1720        if m in forced_shared_modules:
     1721            raise Utils.WafError('These modules MUST be configured as shared modules: %s' %
     1722                                 ' '.join(forced_shared_modules))
    18041723        if m in final_shared_modules:
    18051724            final_shared_modules.remove(m)
    1806         final_static_modules.append(m)
     1725        if m not in final_static_modules:
     1726            final_static_modules.append(m)
    18071727    for m in explicit_shared_modules:
     1728        if m in ['ALL','!DEFAULT','!FORCED']:
     1729            continue
     1730        if m.startswith('!'):
     1731            m = m[1:]
     1732            if m in final_shared_modules:
     1733                final_shared_modules.remove(m)
     1734            continue
     1735        if m in required_static_modules:
     1736            raise Utils.WafError('These modules are REQUIRED as static modules: %s' %
     1737                                 ' '.join(required_static_modules))
     1738        if m in forced_static_modules:
     1739            raise Utils.WafError('These module MUST be configured as static modules: %s' %
     1740                                 ' '.join(forced_static_modules))
    18081741        if m in final_static_modules:
    18091742            final_static_modules.remove(m)
    1810         final_shared_modules.append(m)
     1743        if m not in final_shared_modules:
     1744            final_shared_modules.append(m)
    18111745
    18121746    conf.env['static_modules'] = final_static_modules
     
    18501784        if p in shared_list:
    18511785            for entry in shared_list[p]:
    1852                 conf.DEFINE('%s_init' % entry, 'init_samba_module')
     1786                conf.DEFINE('%s_init' % entry, 'samba_init_module')
    18531787                conf.env[shared_env].append('%s' % entry)
     1788        Logs.info("%s: %s" % (static_env, ','.join(conf.env[static_env])))
     1789        Logs.info("%s: %s" % (shared_env, ','.join(conf.env[shared_env])))
    18541790
    18551791    conf.SAMBA_CONFIG_H('include/config.h')
     
    18631799    os.system(cmd)
    18641800
    1865 if not os.getenv('TOPLEVEL_BUILD'):
    1866     def wildcard_cmd(cmd):
    1867         '''called on a unknown command'''
    1868         from samba_wildcard import run_named_build_task
    1869         run_named_build_task(cmd)
    1870     def main():
    1871         from samba_wildcard import wildcard_main
    1872         wildcard_main(wildcard_cmd)
    1873     Scripting.main = main
Note: See TracChangeset for help on using the changeset viewer.