Revert "HACK quic support"
[metze/samba/wip.git] / source3 / wscript
1 #!/usr/bin/env python
2
3 srcdir = ".."
4
5 import sys, os
6 from optparse import SUPPRESS_HELP
7 sys.path.insert(0, srcdir + "/buildtools/wafsamba")
8 sys.path.insert(0, "source3")
9
10 from waflib import Options, Logs, Errors
11 import wafsamba
12 import build.charset
13 from wafsamba import samba_utils
14 from samba_utils import TO_LIST
15 import samba3
16
17 default_prefix = Options.default_prefix = '/usr/local/samba'
18
19 def options(opt):
20
21     opt.add_option('--with-static-modules',
22                    help=("Comma-separated list of names of modules to statically link in. "+
23                          "May include !module to disable 'module'. "+
24                          "Can be '!FORCED' to disable all non-required static only modules. "+
25                          "Can be '!DEFAULT' to disable all modules defaulting to a static build. "+
26                          "Can be 'ALL' to build all default shared modules static. "+
27                          "The most specific one wins, while the order is ignored "+
28                          "and --with-static-modules is evaluated before "+
29                          "--with-shared-modules"),
30                    action="store", dest='static_modules', default=None)
31     opt.add_option('--with-shared-modules',
32                    help=("Comma-separated list of names of modules to build shared. "+
33                          "May include !module to disable 'module'. "+
34                          "Can be '!FORCED' to disable all non-required shared only modules. "+
35                          "Can be '!DEFAULT' to disable all modules defaulting to a shared build. "+
36                          "Can be 'ALL' to build all default static modules shared. "+
37                          "The most specific one wins, while the order is ignored "+
38                          "and --with-static-modules is evaluated before "+
39                          "--with-shared-modules"),
40                    action="store", dest='shared_modules', default=None)
41
42 # Optional Libraries
43 # ------------------
44 #
45 # Most of the calls to opt.samba_add_onoff_option() implicitly
46 # or explicitly use default=True
47 #
48 # To assist users and distributors to build Samba with the full feature
49 # set, the build system will abort if our dependent libraries and their
50 # header files are not found on the target system.  This will mean for
51 # example, that xattr, acl and ldap headers must be installed for the
52 # default build to complete.  The configure system will check for these
53 # headers, and the error message will indicate the option (such as
54 # --without-acl-support) that can be specified to skip this requirement.
55 #
56 # This will assist users and in particular distributors in building fully
57 # functional packages, while allowing those on systems truly without these
58 # facilities to continue to build Samba after careful consideration.
59 #
60 # It also ensures our container image generation in bootstrap/ is correct
61 # as otherwise a missing package there would just silently work
62
63     opt.samba_add_onoff_option('winbind')
64     opt.samba_add_onoff_option('ads')
65     opt.samba_add_onoff_option('ldap')
66     opt.samba_add_onoff_option('cups', with_name="enable", without_name="disable")
67     opt.samba_add_onoff_option('iprint', with_name="enable", without_name="disable")
68     opt.samba_add_onoff_option('pam')
69     opt.samba_add_onoff_option('quotas', default=None)
70     opt.samba_add_onoff_option('sendfile-support', default=None)
71     opt.samba_add_onoff_option('utmp')
72     opt.samba_add_onoff_option('avahi', with_name="enable", without_name="disable")
73     opt.samba_add_onoff_option('iconv')
74     opt.samba_add_onoff_option('acl-support')
75     opt.samba_add_onoff_option('syslog')
76     opt.samba_add_onoff_option('automount')
77     opt.samba_add_onoff_option('dmapi', default=None) # None means autodetection
78     opt.samba_add_onoff_option('fam', default=None) # None means autodetection
79     opt.samba_add_onoff_option('profiling-data', default=False)
80     opt.samba_add_onoff_option('libarchive', default=True)
81
82     opt.samba_add_onoff_option('cluster-support', default=False)
83
84     opt.samba_add_onoff_option('regedit', default=None)
85     opt.samba_add_onoff_option('winexe', default=None)
86
87     opt.samba_add_onoff_option('fake-kaserver',
88                           help=("Include AFS fake-kaserver support"), default=False)
89
90     opt.add_option('--with-libcephfs',
91                    help=("Directory under which libcephfs is installed"),
92                    action="store", dest='libcephfs_dir', default=None)
93
94     opt.samba_add_onoff_option('glusterfs', with_name="enable", without_name="disable", default=True)
95     opt.samba_add_onoff_option('cephfs', with_name="enable", without_name="disable", default=True)
96
97     opt.add_option('--enable-vxfs',
98                   help=("enable support for VxFS (default=no)"),
99                   action="store_true", dest='enable_vxfs', default=False)
100
101     # default = None means autodetection
102     opt.samba_add_onoff_option('spotlight', with_name="enable", without_name="disable", default=None)
103
104 def configure(conf):
105     default_static_modules = []
106     default_shared_modules = []
107     required_static_modules = []
108     forced_static_modules = []
109     forced_shared_modules = []
110
111     if sys.platform != 'openbsd5':
112         conf.ADD_LDFLAGS("-Wl,--export-dynamic", testflags=True)
113
114     # We crash without vfs_default
115     # and vfs_not_implemented provides helper function
116     # for other modules
117     required_static_modules.extend(['vfs_default', 'vfs_not_implemented'])
118
119     conf.CHECK_HEADERS('netdb.h')
120     conf.CHECK_HEADERS('linux/falloc.h linux/ioctl.h')
121
122     conf.CHECK_FUNCS('getcwd fchown chmod fchmod mknod mknodat')
123     conf.CHECK_FUNCS('strtol strchr strupr chflags fchflags')
124     conf.CHECK_FUNCS('getrlimit fsync setpgid')
125     conf.CHECK_FUNCS('setsid glob strpbrk crypt16 getauthuid')
126     conf.CHECK_FUNCS('innetgr')
127     conf.CHECK_FUNCS('initgroups select poll rdchk getgrnam getgrent pathconf')
128     conf.CHECK_FUNCS('setpriv setgidx setuidx setgroups syscall sysconf')
129     conf.CHECK_FUNCS('atexit grantpt posix_openpt fallocate')
130     conf.CHECK_FUNCS('fseeko setluid')
131     conf.CHECK_FUNCS('getpwnam', headers='sys/types.h pwd.h')
132     conf.CHECK_FUNCS('fdopendir')
133     conf.CHECK_FUNCS('getpwent_r setenv clearenv strcasecmp')
134     conf.CHECK_FUNCS('syslog vsyslog timegm setlocale')
135     conf.CHECK_FUNCS('lutimes utimensat futimens')
136     conf.CHECK_FUNCS('mlock munlock mlockall munlockall')
137     conf.CHECK_FUNCS('memalign posix_memalign hstrerror')
138     conf.CHECK_FUNCS('getdomainname')
139     conf.CHECK_FUNCS_IN('dn_expand _dn_expand __dn_expand', 'resolv')
140     conf.CHECK_FUNCS_IN('dn_expand', 'inet')
141     conf.CHECK_DECLS('readahead', reverse=True, headers='fcntl.h')
142
143     if conf.CHECK_CODE('''
144 #if defined(HAVE_UNISTD_H)
145 #include <unistd.h>
146 #endif
147 long ret = splice(0,0,1,0,400,SPLICE_F_MOVE);
148 ''',
149         'HAVE_LINUX_SPLICE',
150         headers='fcntl.h'):
151         conf.CHECK_DECLS('splice', reverse=True, headers='fcntl.h')
152
153     # Check for inotify support (Skip if we are SunOS)
154     #NOTE: illumos provides sys/inotify.h but is not an exact match for linux
155     host_os = sys.platform
156     if host_os.rfind('sunos') == -1:
157         conf.CHECK_HEADERS('sys/inotify.h')
158         if conf.env.HAVE_SYS_INOTIFY_H:
159            conf.DEFINE('HAVE_INOTIFY', 1)
160
161     # Check for Linux kernel oplocks
162     if conf.CHECK_DECLS('F_SETLEASE', headers='linux/fcntl.h', reverse=True):
163         conf.DEFINE('HAVE_KERNEL_OPLOCKS_LINUX', 1)
164
165     # check for fam libs
166     samba_fam_libs=None
167     check_for_fam=False
168     if Options.options.with_fam is None:
169         check_for_fam=True
170     elif Options.options.with_fam == True:
171         check_for_fam=True
172
173     if check_for_fam and conf.CHECK_HEADERS('fam.h'):
174         if conf.CHECK_FUNCS_IN('FAMOpen2', 'fam'):
175             samba_fam_libs='fam'
176         elif conf.CHECK_FUNCS_IN('FAMOpen2', 'fam C'):
177             samba_fam_libs='fam C'
178         conf.CHECK_TYPE('enum FAMCodes', headers='fam.h',
179             define='HAVE_FAM_H_FAMCODES_TYPEDEF',
180             msg='Checking whether enum FAMCodes is available')
181         conf.CHECK_FUNCS_IN('FAMNoExists', 'fam')
182
183     if samba_fam_libs is not None:
184         conf.DEFINE('SAMBA_FAM_LIBS', samba_fam_libs)
185         conf.DEFINE('HAVE_FAM', 1)
186     else:
187         if Options.options.with_fam == True:
188             conf.fatal('FAM support requested, but no suitable FAM library found')
189         elif check_for_fam:
190             Logs.warn('no suitable FAM library found')
191
192     # check for libarchive (tar command in smbclient)
193     # None means autodetect, True/False means enable/disable
194     conf.SET_TARGET_TYPE('archive', 'EMPTY')
195     if Options.options.with_libarchive is not False:
196         Logs.info("Checking for libarchive existence")
197         if conf.CHECK_HEADERS('archive.h') and conf.CHECK_LIB('archive', shlib=True):
198             conf.CHECK_FUNCS_IN('archive_read_support_filter_all archive_read_free', 'archive')
199         else:
200             conf.fatal("libarchive support not found. "
201                        "Try installing libarchive-dev or libarchive-devel. "
202                        "Otherwise, use --without-libarchive to "
203                        "build without libarchive support. "
204                        "libarchive support is required for the smbclient "
205                        "tar-file mode")
206     elif conf.CONFIG_GET('ENABLE_SELFTEST'):
207         raise Errors.WafError('libarchive library required for '
208                              '--enable-selftest')
209
210
211     # check for DMAPI libs
212     if Options.options.with_dmapi == False:
213         have_dmapi = False
214     else:
215         have_dmapi = True
216         Logs.info("Checking for DMAPI library existence")
217         samba_dmapi_lib = ''
218         if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'dm'):
219             samba_dmapi_lib = 'dm'
220         else:
221             if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'jfsdm'):
222                 samba_dmapi_lib = 'jfsdm'
223             else:
224                 if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'dmapi'):
225                     samba_dmapi_lib = 'dmapi'
226                 else:
227                     if conf.CHECK_FUNCS_IN('dm_get_eventlist', 'xdsm'):
228                         samba_dmapi_lib = 'xdsm'
229         # only bother to test headers and compilation when a candidate
230         # library has been found
231         if samba_dmapi_lib == '':
232             have_dmapi = False
233             broken_dmapi = "no suitable DMAPI library found"
234
235         if have_dmapi:
236             conf.CHECK_HEADERS('sys/dmi.h xfs/dmapi.h sys/jfsdmapi.h sys/dmapi.h dmapi.h')
237             conf.CHECK_CODE('''
238 #include <time.h>      /* needed by Tru64 */
239 #include <sys/types.h> /* needed by AIX */
240 #ifdef HAVE_XFS_DMAPI_H
241 #include <xfs/dmapi.h>
242 #elif defined(HAVE_SYS_DMI_H)
243 #include <sys/dmi.h>
244 #elif defined(HAVE_SYS_JFSDMAPI_H)
245 #include <sys/jfsdmapi.h>
246 #elif defined(HAVE_SYS_DMAPI_H)
247 #include <sys/dmapi.h>
248 #elif defined(HAVE_DMAPI_H)
249 #include <dmapi.h>
250 #endif
251
252 /* This link test is designed to fail on IRI 6.4, but should
253  * succeed on Linux, IRIX 6.5 and AIX.
254  */
255 int main(int argc, char **argv)
256 {
257         char * version;
258         dm_eventset_t events;
259         /* This doesn't take an argument on IRIX 6.4. */
260         dm_init_service(&version);
261         /* IRIX 6.4 expects events to be a pointer. */
262         DMEV_ISSET(DM_EVENT_READ, events);
263
264         return 0;
265 }
266 ''',
267             'USEABLE_DMAPI_LIBRARY',
268             addmain=False,
269             execute=False,
270             lib=samba_dmapi_lib,
271             msg='Checking whether DMAPI lib '+samba_dmapi_lib+' can be used')
272             if not conf.CONFIG_SET('USEABLE_DMAPI_LIBRARY'):
273                 have_dmapi = False
274                 broken_dmapi = "no usable DMAPI library found"
275
276     if have_dmapi:
277         Logs.info("Building with DMAPI support.")
278         conf.env['dmapi_lib'] = samba_dmapi_lib
279         conf.DEFINE('USE_DMAPI', 1)
280     else:
281         if Options.options.with_dmapi == False:
282             Logs.info("Building without DMAPI support (--without-dmapi).")
283         elif Options.options.with_dmapi == True:
284             Logs.error("DMAPI support not available: " + broken_dmapi)
285             conf.fatal('DMAPI support requested but not found.');
286         else:
287             Logs.warn("Building without DMAPI support: " + broken_dmapi)
288         conf.env['dmapi_lib'] = ''
289
290     # Check for various members of the stat structure
291     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blocks', define='HAVE_STAT_ST_BLOCKS',
292                                 headers='sys/stat.h')
293     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_blksize', define='HAVE_STAT_ST_BLKSIZE',
294                                 headers='sys/stat.h')
295     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_flags', define='HAVE_STAT_ST_FLAGS',
296                                 headers='sys/types.h sys/stat.h unistd.h')
297
298     if conf.env.HAVE_BLKCNT_T:
299         conf.CHECK_CODE('''
300         static int test_array[1 - 2 * !(((long int)(sizeof(blkcnt_t))) <= 4)];''',
301                 'SIZEOF_BLKCNT_T_4',
302                 headers='replace.h sys/types.h sys/stat.h unistd.h',
303                 msg="Checking whether blkcnt_t is 32 bit")
304
305     # If sizeof is 4 it can't be 8
306     if conf.env.HAVE_BLKCNT_T:
307         if not conf.CONFIG_SET('SIZEOF_BLKCNT_T_4'):
308             conf.CHECK_CODE('''
309             static int test_array[1 - 2 * !(((long int)(sizeof(blkcnt_t))) <= 8)];''',
310                     'SIZEOF_BLKCNT_T_8',
311                     headers='replace.h sys/types.h sys/stat.h unistd.h',
312                     msg="Checking whether blkcnt_t is 64 bit")
313
314     # Check for POSIX capability support
315     conf.CHECK_FUNCS_IN('cap_get_proc', 'cap', headers='sys/capability.h')
316
317     if conf.env.HAVE_SYS_CAPABILITY_H:
318         conf.CHECK_CODE('''
319         cap_t cap;
320         cap_value_t vals[1];
321         if (!(cap = cap_get_proc())) exit(1);
322         vals[0] = CAP_CHOWN;
323         cap_set_flag(cap, CAP_INHERITABLE, 1, vals, CAP_CLEAR);
324         cap_set_proc(cap);''',
325                         'HAVE_POSIX_CAPABILITIES', execute=True, lib="cap",
326                         headers='sys/capability.h',
327                         msg="Checking whether POSIX capabilities are available")
328
329     conf.CHECK_CODE('int i;', 'BROKEN_NISPLUS_INCLUDE_FILES',
330                     headers='sys/types.h sys/acl.h rpcsvc/nis.h',
331                     msg="Checking for broken nisplus include files")
332
333     # Check if the compiler will optimize out functions
334     conf.CHECK_CODE('''
335 #include <sys/types.h>
336 size_t __unsafe_string_function_usage_here_size_t__(void);
337 #define CHECK_STRING_SIZE(d, len) (sizeof(d) != (len) && sizeof(d) != sizeof(char *))
338 static size_t push_string_check_fn(void *dest, const char *src, size_t dest_len) {
339         return 0;
340 }
341
342 #define push_string_check(dest, src, dest_len) \
343     (CHECK_STRING_SIZE(dest, dest_len) \
344     ? __unsafe_string_function_usage_here_size_t__()    \
345     : push_string_check_fn(dest, src, dest_len))
346
347 int main(int argc, char **argv) {
348     char outbuf[1024];
349     char *p = outbuf;
350     const char *foo = "bar";
351     p += 31 + push_string_check(p + 31, foo, sizeof(outbuf) - (p + 31 - outbuf));
352     return 0;
353 }''', 'HAVE_COMPILER_WILL_OPTIMIZE_OUT_FNS',
354             addmain=False,
355             add_headers=False,
356             msg="Checking if the compiler will optimize out functions")
357
358     # Check if the compiler supports the LL suffix on long long integers
359     # AIX needs this
360     conf.CHECK_CODE('long long i = 0x8000000000LL', 'COMPILER_SUPPORTS_LL',
361                     headers='stdio.h',
362                     msg="Checking for LL suffix on long long integers")
363
364     conf.CHECK_FUNCS('''
365 DNSServiceRegister
366 atexit
367 chflags
368 fchflags
369 chmod
370 crypt16
371 devnm
372 endmntent
373 execl
374 fchmod
375 fchown
376 fseeko
377 fsync
378 futimens
379 getauthuid
380 getcwd
381 getgrent
382 getgrnam
383 getgrouplist
384 getgrset
385 getmntent
386 getpagesize
387 getpwanam
388 getpwent_r
389 getrlimit
390 glob
391 grantpt
392 hstrerror
393 initgroups
394 innetgr
395 llseek
396 lutimes
397 memalign
398 mknod
399 mlock
400 mlockall
401 munlock
402 munlockall
403 pathconf poll
404 posix_memalign
405 pread
406 pwrite
407 rdchk
408 select
409 setenv
410 setgidx
411 setgroups
412 setlocale
413 setluid
414 setmntent
415 setpgid
416 setpriv
417 setsid
418 setuidx
419 statvfs
420 strcasecmp
421 strchr
422 strpbrk
423 strsignal
424 strtol
425 strupr
426 sysconf
427 sysctl
428 sysctlbyname
429 syslog
430 timegm
431 utimensat
432 vsyslog
433 ''')
434
435     conf.CHECK_SAMBA3_CHARSET() # see build/charset.py
436
437     # FIXME: these should be tests for features, but the old build system just
438     # checks for OSes.
439     host_os = sys.platform
440     Logs.info("building on %s" % host_os)
441
442     # Python doesn't have case switches... :/
443     # FIXME: original was *linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu | *qnx*)
444     # the search for .rfind('gnu') covers gnu* and *-gnu is that too broad?
445
446     conf.SET_TARGET_TYPE('sunacl', 'EMPTY')
447     if (host_os.rfind('linux') > -1) or (host_os.rfind('gnu') > -1) or (host_os.rfind('qnx') > -1):
448         if host_os.rfind('linux') > -1:
449             conf.DEFINE('LINUX', '1')
450         elif host_os.rfind('qnx') > -1:
451             conf.DEFINE('QNX', '1')
452         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
453     elif (host_os.rfind('darwin') > -1):
454         conf.DEFINE('DARWINOS', 1)
455         conf.ADD_CFLAGS('-fno-common')
456         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
457     elif (host_os.rfind('freebsd') > -1):
458         conf.DEFINE('FREEBSD', 1)
459         if conf.CHECK_HEADERS('sunacl.h'):
460             conf.DEFINE('HAVE_FREEBSD_SUNACL_H', '1')
461             conf.CHECK_FUNCS_IN(['acl'], 'sunacl')
462         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
463     elif (host_os.rfind('irix') > -1):
464         conf.DEFINE('IRIX', 1)
465         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
466     elif (host_os.rfind('aix') > -1):
467         conf.DEFINE('AIX', 1)
468         conf.DEFINE('STAT_ST_BLOCKSIZE', 'DEV_BSIZE')
469     elif (host_os.rfind('hpux') > -1):
470         conf.DEFINE('HPUX', 1)
471         conf.DEFINE('STAT_ST_BLOCKSIZE', '8192')
472     elif (host_os.rfind('osf') > -1):
473         conf.DEFINE('OSF1', 1)
474         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
475
476     # FIXME: Add more checks here.
477     else:
478         conf.DEFINE('STAT_ST_BLOCKSIZE', '512')
479
480     if Options.options.with_acl_support:
481         if (host_os.rfind('hpux') > -1):
482                 Logs.info('Using HPUX ACLs')
483                 conf.DEFINE('HAVE_HPUX_ACLS',1)
484                 conf.DEFINE('POSIX_ACL_NEEDS_MASK',1)
485                 required_static_modules.extend(['vfs_hpuxacl'])
486         elif (host_os.rfind('aix') > -1):
487                 Logs.info('Using AIX ACLs')
488                 conf.DEFINE('HAVE_AIX_ACLS',1)
489                 required_static_modules.extend(['vfs_aixacl', 'vfs_aixacl2'])
490         elif (host_os.rfind('darwin') > -1):
491             Logs.warn('ACLs on Darwin currently not supported')
492             conf.fatal("ACL support not available on Darwin/MacOS. "
493                        "Use --without-acl-support for building without "
494                        "ACL support. "
495                        "ACL support is required to change permissions "
496                        "from Windows clients.")
497         else:
498             conf.CHECK_FUNCS_IN(['acl_get_file'], 'acl')
499             if conf.CHECK_CODE('''
500 acl_t acl;
501 int entry_id;
502 acl_entry_t *entry_p;
503 return acl_get_entry(acl, entry_id, entry_p);
504 ''',
505                         'HAVE_POSIX_ACLS',
506                         headers='sys/types.h sys/acl.h', link=False,
507                         msg="Checking for POSIX ACL support") :
508                 conf.CHECK_CODE('''
509 acl_permset_t permset_d;
510 acl_perm_t perm;
511 return acl_get_perm_np(permset_d, perm);
512 ''',
513                         'HAVE_ACL_GET_PERM_NP',
514                         headers='sys/types.h sys/acl.h', link=True,
515                         msg="Checking whether acl_get_perm_np() is available")
516                 # source3/lib/sysacls.c calls posixacl_sys_acl_get_file()
517                 required_static_modules.extend(['vfs_posixacl'])
518                 conf.CHECK_VARIABLE('ACL_EVERYONE', headers='sys/acl.h')
519             elif conf.CHECK_FUNCS_IN(['facl'], 'sec'):
520                 Logs.info('Using solaris or UnixWare ACLs')
521                 conf.DEFINE('HAVE_SOLARIS_UNIXWARE_ACLS',1)
522                 required_static_modules.extend(['vfs_solarisacl'])
523             else:
524                 conf.fatal("ACL support not found. Try installing libacl1-dev "
525                            "or libacl-devel.  "
526                            "Otherwise, use --without-acl-support to build "
527                            "without ACL support. "
528                            "ACL support is required to change permissions from "
529                            "Windows clients.")
530
531     if conf.CHECK_FUNCS('dirfd'):
532         conf.DEFINE('HAVE_DIRFD_DECL', 1)
533
534     conf.CHECK_CODE('struct statfs fsd; fsid_t fsid = fsd.f_fsid; return statfs(".", &fsd);',
535                     'HAVE_STATFS_F_FSID',
536                     msg="vfs_fileid checking for statfs() and struct statfs.f_fsid",
537                     headers='sys/types.h sys/statfs.h',
538                     execute=True)
539
540     if conf.CONFIG_SET('HAVE_FALLOCATE'):
541         conf.CHECK_CODE('''
542                 int ret = fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 10);''',
543                 'HAVE_LINUX_FALLOCATE',
544                 msg="Checking whether the Linux 'fallocate' function is available",
545                 headers='unistd.h sys/types.h fcntl.h linux/falloc.h')
546         conf.CHECK_CODE('''
547                 int ret = fallocate(0, FALLOC_FL_PUNCH_HOLE, 0, 10);''',
548                 'HAVE_FALLOC_FL_PUNCH_HOLE',
549                 msg="Checking whether Linux 'fallocate' supports hole-punching",
550                 headers='unistd.h sys/types.h fcntl.h linux/falloc.h')
551
552     conf.CHECK_CODE('''
553             int ret = lseek(0, 0, SEEK_HOLE);
554             ret = lseek(0, 0, SEEK_DATA);''',
555             'HAVE_LSEEK_HOLE_DATA',
556             msg="Checking whether lseek supports hole/data seeking",
557             headers='unistd.h sys/types.h')
558
559     conf.CHECK_CODE('''
560                 ssize_t err = readahead(0,0,0x80000);''',
561                 'HAVE_LINUX_READAHEAD',
562                 msg="Checking whether Linux readahead is available",
563                 headers='unistd.h fcntl.h')
564     conf.CHECK_DECLS('readahead', headers='fcntl.h', always=True)
565
566     conf.CHECK_CODE('int fd = openat(AT_FDCWD, ".", O_RDONLY);',
567                 'HAVE_OPENAT',
568                 msg='Checking for openat',
569                 headers='fcntl.h')
570
571     conf.CHECK_CODE('''
572 struct msghdr msg;
573 union {
574         struct cmsghdr cm;
575         char control[CMSG_SPACE(sizeof(int))];
576 } control_un;
577 msg.msg_control = control_un.control;
578 msg.msg_controllen = sizeof(control_un.control);
579 ''',
580         'HAVE_STRUCT_MSGHDR_MSG_CONTROL',
581         msg='Checking if we can use msg_control for passing file descriptors',
582         headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
583     conf.CHECK_CODE('''
584 struct msghdr msg;
585 int fd;
586 msg.msg_accrights = (caddr_t) &fd;
587 msg.msg_accrightslen = sizeof(fd);
588 ''',
589         'HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS',
590         msg='Checking if we can use msg_accrights for passing file descriptors',
591         headers='sys/types.h stdlib.h stddef.h sys/socket.h sys/un.h')
592
593     if Options.options.with_winbind:
594         conf.env.build_winbind = True
595         conf.DEFINE('WITH_WINBIND', '1')
596
597     conf.find_program('awk', var='AWK')
598
599     conf.CHECK_HEADERS('asm/types.h')
600
601     conf.CHECK_CODE('dev_t dev; int i = major(dev); return 0', "HAVE_DEVICE_MAJOR_FN",
602                     headers='sys/sysmacros.h unistd.h sys/types.h',
603                     msg="Checking for major macro")
604
605     conf.CHECK_CODE('dev_t dev; int i = minor(dev); return 0', "HAVE_DEVICE_MINOR_FN",
606                     headers='sys/sysmacros.h unistd.h sys/types.h',
607                     msg="Checking for minor macro")
608
609     conf.CHECK_STRUCTURE_MEMBER('struct dirent', 'd_off',
610                                 headers='unistd.h sys/types.h dirent.h',
611                                 define='HAVE_DIRENT_D_OFF')
612
613     if (conf.CONFIG_SET('HAVE_GETDOMAINNAME')):
614         conf.DEFINE('HAVE_NETGROUP', '1')
615
616     # Look for CUPS
617     if Options.options.with_cups:
618         conf.find_program('cups-config', var='CUPS_CONFIG')
619         if conf.env.CUPS_CONFIG:
620             # we would normally use --libs here, but cups-config incorrectly adds
621             # gssapi_krb5 and other libraries to its --libs output. That breaks the use
622             # of an in-tree heimdal kerberos
623             conf.CHECK_CFG(path=conf.env.CUPS_CONFIG, args="--cflags --ldflags",
624                            package="", uselib_store="CUPS")
625         conf.CHECK_HEADERS('cups/cups.h cups/language.h', lib='cups')
626         conf.CHECK_FUNCS_IN('httpConnect httpConnect2 httpConnectEncrypt', 'cups')
627         if conf.CONFIG_SET('HAVE_CUPS_CUPS_H') and conf.CONFIG_SET('HAVE_CUPS_LANGUAGE_H'):
628             conf.DEFINE('HAVE_CUPS', '1')
629         else:
630             conf.undefine('HAVE_CUPS')
631             conf.SET_TARGET_TYPE('cups', 'EMPTY')
632     else:
633         # define an empty subsystem for cups, to allow it to be used as an empty dependency
634         conf.SET_TARGET_TYPE('cups', 'EMPTY')
635
636     if Options.options.with_iprint:
637         if conf.CONFIG_SET('HAVE_CUPS'):
638             conf.DEFINE('HAVE_IPRINT', '1')
639         else:
640             Logs.warn("--enable-iprint=yes but cups support not sufficient")
641     if Options.options.with_syslog:
642         conf.DEFINE('WITH_SYSLOG', '1')
643     if Options.options.with_automount:
644         conf.DEFINE('WITH_AUTOMOUNT', '1')
645
646     # Check for LDAP
647     if Options.options.with_ldap:
648         conf.CHECK_HEADERS('ldap.h lber.h ldap_pvt.h')
649         conf.CHECK_TYPE('ber_tag_t', 'unsigned int', headers='ldap.h lber.h')
650         conf.CHECK_FUNCS_IN('ber_scanf ber_sockbuf_add_io', 'lber')
651         conf.CHECK_VARIABLE('LDAP_OPT_SOCKBUF', headers='ldap.h')
652
653         # if we LBER_OPT_LOG_PRINT_FN we can intercept ldap logging and print it out
654         # for the samba logs
655         conf.CHECK_VARIABLE('LBER_OPT_LOG_PRINT_FN',
656                             define='HAVE_LBER_LOG_PRINT_FN', headers='lber.h')
657
658         conf.CHECK_FUNCS_IN('ldap_init ldap_init_fd ldap_initialize ldap_set_rebind_proc', 'ldap')
659         conf.CHECK_FUNCS_IN('ldap_add_result_entry', 'ldap')
660
661         # Check if ldap_set_rebind_proc() takes three arguments
662         if conf.CHECK_CODE('ldap_set_rebind_proc(0, 0, 0)',
663                            'LDAP_SET_REBIND_PROC_ARGS',
664                            msg="Checking whether ldap_set_rebind_proc takes 3 arguments",
665                            headers='ldap.h lber.h', link=False):
666             conf.DEFINE('LDAP_SET_REBIND_PROC_ARGS', '3')
667         else:
668             conf.DEFINE('LDAP_SET_REBIND_PROC_ARGS', '2')
669
670         # last but not least, if ldap_init() exists, we want to use ldap
671         if conf.CONFIG_SET('HAVE_LDAP_INIT') and conf.CONFIG_SET('HAVE_LDAP_H'):
672             conf.DEFINE('HAVE_LDAP', '1')
673             conf.DEFINE('LDAP_DEPRECATED', '1')
674             conf.env['HAVE_LDAP'] = '1'
675             # if ber_sockbuf_add_io() and LDAP_OPT_SOCKBUF are available, we can add
676             # SASL wrapping hooks
677             if conf.CONFIG_SET('HAVE_BER_SOCKBUF_ADD_IO') and \
678                     conf.CONFIG_SET('HAVE_LDAP_OPT_SOCKBUF'):
679                 conf.DEFINE('HAVE_LDAP_SASL_WRAPPING', '1')
680         else:
681             conf.fatal("LDAP support not found. "
682                        "Try installing libldap2-dev or openldap-devel. "
683                        "Otherwise, use --without-ldap to build without "
684                        "LDAP support. "
685                        "LDAP support is required for the LDAP passdb backend, "
686                        "LDAP idmap backends and ADS. "
687                        "ADS support improves communication with "
688                        "Active Directory domain controllers.")
689     else:
690         conf.SET_TARGET_TYPE('ldap', 'EMPTY')
691         conf.SET_TARGET_TYPE('lber', 'EMPTY')
692
693     if Options.options.with_ads == False:
694         use_ads = False
695         use_ads_krb5 = False
696         use_ads_ldap = False
697     else:
698         use_ads = True
699         use_ads_krb5 = True
700         use_ads_ldap = True
701         if not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC_MD5') and \
702            not conf.CONFIG_SET('HAVE_ENCTYPE_ARCFOUR_HMAC'):
703             Logs.warn("arcfour-hmac-md5 encryption type not found in -lkrb5")
704             use_ads_krb5 = False
705         if not conf.CONFIG_SET('HAVE_KRB5_MK_REQ_EXTENDED'):
706             Logs.warn("krb5_mk_req_extended not found in -lkrb5")
707             use_ads_krb5 = False
708         if not conf.CONFIG_SET('HAVE_KRB5_GET_HOST_REALM'):
709             Logs.warn("krb5_get_host_realm not found in -lkrb5")
710             use_ads_krb5 = False
711         if not conf.CONFIG_SET('HAVE_KRB5_FREE_HOST_REALM'):
712             Logs.warn("krb5_free_host_realm not found in -lkrb5")
713             use_ads_krb5 = False
714         if not conf.CONFIG_SET('HAVE_KRB5_FWD_TGT_CREDS'):
715             Logs.warn("krb5_fwd_tgt_creds found in -lkrb5")
716             use_ads_krb5 = False
717         if not conf.CONFIG_SET('HAVE_KRB5_GET_INIT_CREDS_OPT_ALLOC'):
718             Logs.warn("krb5_get_init_creds_opt_alloc not found in -lkrb5")
719             use_ads_krb5 = False
720         if not conf.CONFIG_SET('KRB5_CREDS_OPT_FREE_REQUIRES_CONTEXT'):
721             Logs.warn("krb5_get_init_creds_opt_free was not found or was too old in -lkrb5")
722             use_ads_krb5 = False
723         if not conf.CONFIG_SET('HAVE_KRB5_GET_RENEWED_CREDS'):
724             Logs.warn("krb5_get_renewed_creds not found in -lkrb5")
725             use_ads_krb5 = False
726         if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL_COMPARE_ANY_REALM'):
727             Logs.warn("krb5_principal_compare_any_realm not found in -lkrb5")
728             use_ads_krb5 = False
729         if not conf.CONFIG_SET('HAVE_KRB5_C_STRING_TO_KEY') and \
730            not conf.CONFIG_SET('HAVE_KRB5_STRING_TO_KEY_SALT'):
731             Logs.warn("krb5_c_string_to_key not found in -lkrb5")
732             use_ads_krb5 = False
733         if not conf.CONFIG_SET('HAVE_KRB5_PRINCIPAL2SALT') and \
734            not conf.CONFIG_SET('HAVE_KRB5_GET_PW_SALT'):
735             Logs.warn("no CREATE_KEY_FUNCTIONS detected")
736             use_ads_krb5 = False
737         if not conf.CONFIG_SET('HAVE_KRB5_GET_PERMITTED_ENCTYPES') and \
738            not conf.CONFIG_SET('HAVE_KRB5_GET_DEFAULT_IN_TKT_ETYPES'):
739             Logs.warn("no GET_ENCTYPES_FUNCTIONS detected")
740             use_ads_krb5 = False
741         if not conf.CONFIG_SET('HAVE_KRB5_KT_FREE_ENTRY') and \
742            not conf.CONFIG_SET('HAVE_KRB5_FREE_KEYTAB_ENTRY_CONTENTS'):
743             Logs.warn("no KT_FREE_FUNCTION detected")
744             use_ads_krb5 = False
745         if not conf.CONFIG_SET('HAVE_KRB5_C_VERIFY_CHECKSUM'):
746             Logs.warn("krb5_c_verify_checksum_compare not found in -lkrb5")
747             use_ads_krb5 = False
748
749         # We don't actually use
750         # gsskrb5_extract_authz_data_from_sec_context, but it is a
751         # clue that this Heimdal, which does the PAC processing we
752         # need on the standard gss_inquire_sec_context_by_oid
753         if not conf.CONFIG_SET('HAVE_GSS_GET_NAME_ATTRIBUTE') and \
754             not (conf.CONFIG_SET('HAVE_GSSKRB5_EXTRACT_AUTHZ_DATA_FROM_SEC_CONTEXT') and \
755                      conf.CONFIG_SET('HAVE_GSS_INQUIRE_SEC_CONTEXT_BY_OID')):
756             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")
757             use_ads_krb5 = False
758
759         if not conf.CONFIG_SET('HAVE_GSS_KRB5_EXPORT_LUCID_SEC_CONTEXT'):
760             Logs.warn("need gss_krb5_export_lucid_sec_context for SPNEGO and gss_wrap support")
761             use_ads_krb5 = False
762
763         if use_ads_krb5:
764             conf.DEFINE('HAVE_KRB5', '1')
765             conf.env['HAVE_KRB5'] = '1'
766         else:
767             conf.undefine('HAVE_KRB5_H')
768             conf.undefine('HAVE_GSSAPI_H')
769             conf.undefine('HAVE_GSSAPI_GSSAPI_GENERIC_H')
770             conf.undefine('HAVE_GSSAPI_GSSAPI_H')
771             use_ads = False
772
773         if not conf.CONFIG_SET('HAVE_LDAP'):
774             use_ads = False
775             use_ads_ldap = False
776
777     if use_ads:
778         conf.DEFINE('WITH_ADS', '1')
779         conf.env['HAVE_ADS'] = '1'
780         Logs.info("Building with Active Directory support.")
781         # these have broken dependencies
782         forced_shared_modules.extend(['idmap_ad', 'idmap_rfc2307'])
783     elif Options.options.with_ads == False:
784         Logs.info("Building without Active Directory support (--without-ads).")
785         if not Options.options.without_ad_dc:
786             conf.fatal("Building --without-ads requires also "
787                        "building --without-ad-dc.")
788     else:
789         if not use_ads_krb5:
790             Logs.warn("Active Directory support not available: krb5 libs don't have all required features")
791         if not use_ads_ldap:
792             Logs.warn("Active Directory support not available: LDAP support is not available.")
793         if Options.options.with_ads:
794             conf.fatal("Active Directory support not found. Use --without-ads "
795                        "for building without Active Directory support. "
796                        "ADS support improves communication with "
797                        "Active Directory domain controllers.")
798         else:
799             # this is the auto-mode case
800             Logs.warn("Building without Active Directory support.")
801
802
803     if Options.options.with_utmp:
804         conf.env.with_utmp = True
805         if not conf.CHECK_HEADERS('utmp.h'): conf.env.with_utmp = False
806         conf.CHECK_FUNCS('pututline pututxline updwtmp updwtmpx getutmpx getutxent')
807         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_name', headers='utmp.h',
808                                     define='HAVE_UT_UT_NAME')
809         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_user', headers='utmp.h',
810                                     define='HAVE_UT_UT_USER')
811         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_id', headers='utmp.h',
812                                     define='HAVE_UT_UT_ID')
813         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_host', headers='utmp.h',
814                                     define='HAVE_UT_UT_HOST')
815         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_time', headers='utmp.h',
816                                     define='HAVE_UT_UT_TIME')
817         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_tv', headers='utmp.h',
818                                     define='HAVE_UT_UT_TV')
819         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_type', headers='utmp.h',
820                                     define='HAVE_UT_UT_TYPE')
821         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_pid', headers='utmp.h',
822                                     define='HAVE_UT_UT_PID')
823         conf.CHECK_STRUCTURE_MEMBER('struct utmp', 'ut_exit.e_exit', headers='utmp.h',
824                                     define='HAVE_UT_UT_EXIT')
825         conf.CHECK_STRUCTURE_MEMBER('struct utmpx', 'ut_syslen', headers='utmpx.h',
826                                     define='HAVE_UX_UT_SYSLEN')
827         conf.CHECK_STRUCTURE_MEMBER('struct utmpx', 'ut_host', headers='utmpx.h',
828                                     define='HAVE_UX_UT_HOST')
829         conf.CHECK_CODE('struct utmp utarg; struct utmp *utreturn; utreturn = pututline(&utarg);',
830                         'PUTUTLINE_RETURNS_UTMP', headers='utmp.h',
831                         msg="Checking whether pututline returns pointer")
832         conf.CHECK_SIZEOF(['((struct utmp *)NULL)->ut_line'], headers='utmp.h',
833                           define='SIZEOF_UTMP_UT_LINE', critical=False)
834         if not conf.CONFIG_SET('SIZEOF_UTMP_UT_LINE'):
835             conf.env.with_utmp = False
836         elif int(conf.env.SIZEOF_UTMP_UT_LINE) < 15:
837             conf.env.with_utmp = False
838         if conf.env.with_utmp:
839             conf.DEFINE('WITH_UTMP', 1)
840         else:
841             Logs.warn("--with-utmp but utmp support not sufficient")
842
843     if Options.options.with_avahi:
844         conf.env.with_avahi = True
845         if not conf.CHECK_HEADERS('avahi-common/watch.h avahi-client/client.h'): conf.env.with_avahi = False
846         if not conf.CHECK_FUNCS_IN('avahi_client_new', 'avahi-client'): conf.env.with_avahi = False
847         if not conf.CHECK_FUNCS_IN('avahi_strerror', 'avahi-common'): conf.env.with_avahi = False
848         if conf.env.with_avahi:
849             conf.DEFINE('WITH_AVAHI_SUPPORT', 1)
850     else:
851         conf.SET_TARGET_TYPE('avahi-common', 'EMPTY')
852         conf.SET_TARGET_TYPE('avahi-client', 'EMPTY')
853
854     if Options.options.with_iconv:
855         conf.env.with_iconv = True
856         if not conf.CHECK_FUNCS_IN('iconv_open', 'iconv', headers='iconv.h'):
857             conf.env.with_iconv = False
858         if conf.env.with_iconv:
859             conf.DEFINE('HAVE_ICONV', 1)
860
861     if Options.options.with_pam:
862         use_pam=True
863         conf.CHECK_HEADERS('security/pam_appl.h pam/pam_appl.h')
864         if not conf.CONFIG_SET('HAVE_SECURITY_PAM_APPL_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_APPL_H'):
865             Logs.warn("--with-pam=yes but pam_appl.h not found")
866             use_pam=False
867         conf.CHECK_FUNCS_IN('pam_get_data', 'pam')
868         conf.CHECK_HEADERS('security/pam_modules.h pam/pam_modules.h')
869         if not conf.CONFIG_SET('HAVE_SECURITY_PAM_MODULES_H') and not conf.CONFIG_SET('HAVE_PAM_PAM_MODULES_H'):
870             Logs.warn("--with-pam=yes but pam_modules.h not found")
871             use_pam=False
872         conf.CHECK_HEADERS('security/pam_ext.h security/_pam_macros.h')
873         conf.CHECK_HEADERS('pam/pam_ext.h pam/_pam_macros.h')
874         conf.CHECK_FUNCS_IN('pam_vsyslog', 'pam')
875         conf.CHECK_CODE('''
876 #if defined(HAVE_SECURITY_PAM_APPL_H)
877 #include <security/pam_appl.h>
878 #elif defined(HAVE_PAM_PAM_APPL_H)
879 #include <pam/pam_appl.h>
880 #endif
881 pam_set_item(0, PAM_RHOST, 0);
882 ''',
883             'HAVE_PAM_RHOST',
884             lib='pam',
885             msg="Checking whether PAM_RHOST is available");
886         conf.CHECK_CODE('''
887 #if defined(HAVE_SECURITY_PAM_APPL_H)
888 #include <security/pam_appl.h>
889 #elif defined(HAVE_PAM_PAM_APPL_H)
890 #include <pam/pam_appl.h>
891 #endif
892 pam_set_item(0, PAM_TTY, 0);
893 ''',
894             'HAVE_PAM_TTY',
895             lib='pam',
896             msg="Checking whether PAM_TTY is available");
897         conf.CHECK_CODE('''
898 #if (!defined(LINUX))
899
900 #define PAM_EXTERN extern
901 #if defined(HAVE_SECURITY_PAM_APPL_H)
902 #include <security/pam_appl.h>
903 #elif defined(HAVE_PAM_PAM_APPL_H)
904 #include <pam/pam_appl.h>
905 #endif
906
907 #endif
908
909 #if defined(HAVE_SECURITY_PAM_MODULES_H)
910 #include <security/pam_modules.h>
911 #elif defined(HAVE_PAM_PAM_MODULES_H)
912 #include <pam/pam_modules.h>
913 #endif
914
915 #if defined(HAVE_SECURITY__PAM_MACROS_H)
916 #include <security/_pam_macros.h>
917 #elif defined(HAVE_PAM__PAM_MACROS_H)
918 #include <pam/_pam_macros.h>
919 #endif
920
921 #ifdef HAVE_SECURITY_PAM_EXT_H
922 #include <security/pam_ext.h>
923 #endif
924
925 int i; i = PAM_RADIO_TYPE;
926 ''',
927             'HAVE_PAM_RADIO_TYPE',
928             lib='pam',
929             msg="Checking whether PAM_RADIO_TYPE is available");
930         if use_pam:
931             conf.DEFINE('WITH_PAM', 1)
932             conf.DEFINE('WITH_PAM_MODULES', 1)
933         else:
934             conf.fatal("PAM support is enabled but prerequisite libraries "
935                        "or headers not found. Use --without-pam to disable "
936                        "PAM support.");
937
938     seteuid = False
939
940 #
941 # Ensure we select the correct set of system calls on Linux.
942 #
943     if (host_os.rfind('linux') > -1):
944         conf.CHECK_CODE('''
945 #if defined(HAVE_UNISTD_H)
946 #include <unistd.h>
947 #endif
948 #include <stdlib.h>
949 #include <stdio.h>
950 #include <sys/types.h>
951 #include <errno.h>
952
953 #ifdef HAVE_SYS_PRIV_H
954 #include <sys/priv.h>
955 #endif
956 #ifdef HAVE_SYS_ID_H
957 #include <sys/id.h>
958 #endif
959
960 #if defined(HAVE_SYSCALL_H)
961 #include <syscall.h>
962 #endif
963
964 #if defined(HAVE_SYS_SYSCALL_H)
965 #include <sys/syscall.h>
966 #endif
967
968 syscall(SYS_setresuid32, -1, -1, -1);
969 syscall(SYS_setresgid32, -1, -1, -1);
970 syscall(SYS_setreuid32, -1, -1);
971 syscall(SYS_setregid32, -1, -1);
972 syscall(SYS_setuid32, -1);
973 syscall(SYS_setgid32, -1);
974 syscall(SYS_setgroups32, 0, NULL);
975 ''',
976             'USE_LINUX_32BIT_SYSCALLS',
977             msg="Checking whether Linux should use 32-bit credential calls");
978
979         if (conf.CONFIG_SET('USE_LINUX_32BIT_SYSCALLS')):
980             seteuid = conf.CHECK_CODE('''
981                                 #define AUTOCONF_TEST 1
982                                 #define HAVE_LINUX_THREAD_CREDENTIALS 1
983                                 #define USE_LINUX_32BIT_SYSCALLS 1
984                                 #include "../lib/util/setid.c"
985                                 #include "./lib/util_sec.c"
986                                 ''',
987                                 'HAVE_LINUX_THREAD_CREDENTIALS',
988                                 addmain=False,
989                                 execute=True,
990                                 msg="Checking whether we can use Linux thread-specific credentials with 32-bit system calls")
991         else:
992             seteuid = conf.CHECK_CODE('''
993                                 #define AUTOCONF_TEST 1
994                                 #define HAVE_LINUX_THREAD_CREDENTIALS 1
995                                 #include "../lib/util/setid.c"
996                                 #include "./lib/util_sec.c"
997                                 ''',
998                                 'HAVE_LINUX_THREAD_CREDENTIALS',
999                                 addmain=False,
1000                                 execute=True,
1001                                 msg="Checking whether we can use Linux thread-specific credentials")
1002     if not seteuid:
1003         seteuid = conf.CHECK_CODE('''
1004                                 #define AUTOCONF_TEST 1
1005                                 #define USE_SETREUID 1
1006                                 #include "../lib/util/setid.c"
1007                                 #include "./lib/util_sec.c"
1008                                 ''',
1009                                 'USE_SETREUID',
1010                                 addmain=False,
1011                                 execute=True,
1012                                 msg="Checking whether setreuid is available")
1013     if not seteuid:
1014         seteuid = conf.CHECK_CODE('''
1015                                 #define AUTOCONF_TEST 1
1016                                 #define USE_SETRESUID 1
1017                                 #include "../lib/util/setid.c"
1018                                 #include "./lib/util_sec.c"
1019                                 ''',
1020                                 'USE_SETRESUID',
1021                                 addmain=False,
1022                                 execute=True,
1023                                 msg="Checking whether setresuid is available")
1024     if not seteuid:
1025         seteuid = conf.CHECK_CODE('''
1026                                 #define AUTOCONF_TEST 1
1027                                 #define USE_SETEUID 1
1028                                 #include "../lib/util/setid.c"
1029                                 #include "./lib/util_sec.c"
1030                                 ''',
1031                                 'USE_SETEUID',
1032                                 addmain=False,
1033                                 execute=True,
1034                                 msg="Checking whether seteuid is available")
1035     if not seteuid:
1036         seteuid = conf.CHECK_CODE('''
1037                                 #define AUTOCONF_TEST 1
1038                                 #define USE_SETUIDX 1
1039                                 #include "../lib/util/setid.c"
1040                                 #include "./lib/util_sec.c"
1041                                 ''',
1042                                 'USE_SETUIDX',
1043                                 addmain=False,
1044                                 execute=True,
1045                                 mandatory=True,
1046                                 msg="Checking whether setuidx is available")
1047     # valgrind.h or valgrind/valgrind.h is checked in lib/replace/wscript
1048     if Options.options.developer:
1049         if conf.CONFIG_SET('HAVE_VALGRIND_H') or conf.CONFIG_SET('HAVE_VALGRIND_VALGRIND_H'):
1050             conf.DEFINE('VALGRIND', '1')
1051
1052     if conf.CHECK_CODE('''
1053 #include <bits/sockaddr.h>
1054 #include <linux/netlink.h>
1055 ''',
1056                 'HAVE_LINUX_NETLINK_H',
1057                 msg="Checking whether Linux netlink is available"):
1058
1059         conf.CHECK_CODE('''
1060 #include <bits/sockaddr.h>
1061 #include <linux/netlink.h>
1062 #include <linux/rtnetlink.h>
1063 ''',
1064                 'HAVE_LINUX_RTNETLINK_H',
1065                 msg='Checking whether Linux rtnetlink is available')
1066
1067     conf.CHECK_CODE('''
1068 #include "../tests/fcntl_lock.c"
1069 ''',
1070                 'HAVE_FCNTL_LOCK',
1071                 addmain=False,
1072                 execute=True,
1073                 msg='Checking whether fcntl locking is available')
1074
1075     conf.CHECK_CODE('''
1076 #include <unistd.h>
1077 #include <sys/types.h>
1078 #include <sys/stat.h>
1079 #include <fcntl.h>
1080 #include <errno.h>
1081
1082 #define DATA "ofdtest.fcntl"
1083
1084 int main(void) {
1085         struct flock lck = {
1086            .l_whence = SEEK_SET,
1087            .l_type = F_WRLCK,
1088            .l_start = 0,
1089            .l_len = 1,
1090            .l_pid = 0,
1091         };
1092         int ret;
1093         int fd1;
1094         int fd2;
1095         char *testdir = getenv("TESTDIR");
1096
1097         if (testdir) {
1098            if (chdir(testdir) != 0) {
1099               goto err;
1100            }
1101         }
1102
1103         unlink(DATA);
1104         fd1 = open(DATA, O_RDWR|O_CREAT|O_EXCL, 0600);
1105         fd2 = open(DATA, O_RDWR);
1106         if (fd1 == -1 || fd2 == -1) {
1107            goto err;
1108         }
1109         ret = fcntl(fd1,F_OFD_SETLKW,&lck);
1110         if (ret == -1) {
1111           goto err;
1112         }
1113         ret = fcntl(fd2,F_OFD_SETLK,&lck);
1114         if (ret != -1) {
1115           goto err;
1116         }
1117         if (errno != EAGAIN) {
1118           goto err;
1119         }
1120         ret = fcntl(fd2,F_OFD_GETLK,&lck);
1121         if (ret == -1) {
1122           goto err;
1123         }
1124         unlink(DATA);
1125         exit(0);
1126 err:
1127         unlink(DATA);
1128         exit(1);
1129 }''',
1130             'HAVE_OFD_LOCKS',
1131             addmain=False,
1132             execute=True,
1133             msg="Checking whether fcntl lock supports open file description locks")
1134
1135     conf.CHECK_CODE('''
1136 #include <fcntl.h>
1137 #include <unistd.h>
1138 #include <stdlib.h>
1139 #include <sys/socket.h>
1140
1141 int main(void)
1142 {
1143         int sockfd, ret;
1144         struct f_owner_ex owner, get_owner;
1145
1146         sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
1147         if (sockfd == -1) {
1148             goto err;
1149         }
1150
1151         owner.type = F_OWNER_PID;
1152         owner.pid = getpid();
1153
1154         ret = fcntl(sockfd, F_SETOWN_EX, &owner);
1155         if (ret == -1) {
1156             goto err;
1157         }
1158
1159         ret = fcntl(sockfd, F_GETOWN_EX, &get_owner);
1160         if (ret == -1) {
1161             goto err;
1162         }
1163
1164         if (get_owner.type != F_OWNER_PID) {
1165             goto err;
1166         }
1167
1168         if (get_owner.pid != getpid()) {
1169             goto err;
1170         }
1171
1172         close(sockfd);
1173         exit(0);
1174 err:
1175         close(sockfd);
1176         exit(1);
1177 }''',
1178             'HAVE_F_OWNER_EX',
1179             addmain=False,
1180             execute=True,
1181             msg="Checking whether fcntl supports flags to send direct I/O availability signals")
1182
1183     conf.CHECK_CODE('''
1184 #include <fcntl.h>
1185 #include <unistd.h>
1186 #include <stdlib.h>
1187 #include <stdint.h>
1188
1189 #define DATA "hinttest.fcntl"
1190
1191 int main(void)
1192 {
1193         uint64_t hint, get_hint;
1194         int fd;
1195
1196         fd = open(DATA, O_RDONLY | O_CREAT | O_EXCL);
1197         if (fd == -1) {
1198             goto err;
1199         }
1200
1201         hint = RWH_WRITE_LIFE_SHORT;
1202         int ret = fcntl(fd, F_SET_RW_HINT, &hint);
1203         if (ret == -1) {
1204             goto err;
1205         }
1206
1207         ret = fcntl(fd, F_GET_RW_HINT, &get_hint);
1208         if (ret == -1) {
1209             goto err;
1210         }
1211
1212         if (get_hint != RWH_WRITE_LIFE_SHORT) {
1213             goto err;
1214         }
1215
1216         hint = RWH_WRITE_LIFE_EXTREME;
1217         ret = fcntl(fd, F_SET_FILE_RW_HINT, &hint);
1218         if (ret == -1) {
1219             goto err;
1220         }
1221
1222         ret = fcntl(fd, F_GET_FILE_RW_HINT, &get_hint);
1223         if (ret == -1) {
1224             goto err;
1225         }
1226
1227         if (get_hint != RWH_WRITE_LIFE_EXTREME) {
1228             goto err;
1229         }
1230
1231         close(fd);
1232         unlink(DATA);
1233         exit(0);
1234 err:
1235         close(fd);
1236         unlink(DATA);
1237         exit(1);
1238 }''',
1239             'HAVE_RW_HINTS',
1240             addmain=False,
1241             execute=True,
1242             msg="Checking whether fcntl supports setting/getting hints")
1243
1244     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtim.tv_nsec',
1245                                 define='HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') # Linux, Solaris
1246     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimensec',
1247                                 define='HAVE_STRUCT_STAT_ST_MTIMENSEC') # BSD, if defined _POSIX_SOURCE
1248     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtimespec.tv_nsec',
1249                                 define='HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') # BSD, if not defined _POSIX_SOURCE
1250     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_mtime_n',
1251                                 define='HAVE_STRUCT_STAT_ST_MTIME_N') # AIX
1252     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_umtime',
1253                                 define='HAVE_STRUCT_STAT_ST_UMTIME') # Tru64
1254     if conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC') or \
1255        conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMENSEC') or \
1256        conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC') or \
1257        conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_MTIME_N') or \
1258        conf.CONFIG_SET('HAVE_STRUCT_STAT_ST_UMTIME'):
1259         conf.DEFINE('HAVE_STAT_HIRES_TIMESTAMPS', '1')
1260
1261     # recent FreeBSD, NetBSD have creation timestamps called birthtime:
1262     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtime',
1263                                 define='HAVE_STRUCT_STAT_ST_BIRTHTIME')
1264     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimespec.tv_nsec',
1265                                 define='HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC_TV_NSEC')
1266     conf.CHECK_STRUCTURE_MEMBER('struct stat', 'st_birthtimensec',
1267                                 define='HAVE_STRUCT_STAT_ST_BIRTHTIMENSEC')
1268
1269     conf.CHECK_CODE('''
1270 ssize_t err = posix_fadvise(0,0,0x80000,POSIX_FADV_WILLNEED);
1271 ''',
1272                 'HAVE_POSIX_FADVISE',
1273                 msg='Checking whether posix_fadvise is available',
1274                 headers='unistd.h fcntl.h')
1275
1276     for v in ['_SC_NGROUPS_MAX', '_SC_NPROC_ONLN', '_SC_NPROCESSORS_ONLN', '_SC_PAGESIZE' ]:
1277         conf.CHECK_CODE('''
1278                         #include <unistd.h>
1279                         return sysconf(%s) == -1 ? 1 : 0;
1280                         ''' % v,
1281                         'SYSCONF%s' % v,
1282                         msg='Checking whether sysconf(%s) is available' % v)
1283
1284     conf.CHECK_CODE('''
1285 #include <sys/syscall.h>
1286 #include <unistd.h>
1287 syscall(SYS_initgroups, 16, NULL, NULL, 0);
1288                     ''',
1289                     'HAVE_DARWIN_INITGROUPS',
1290                     msg='Checking whether to use the Darwin-specific initgroups system call')
1291
1292     conf.CHECK_CODE('''struct utimbuf tbuf;  tbuf.actime = 0; tbuf.modtime = 1; exit(utime("foo.c",&tbuf));''',
1293                     'HAVE_UTIMBUF',
1294                     headers='sys/types.h utime.h',
1295                     msg='Checking whether struct utimbuf is available')
1296
1297     if conf.CHECK_CODE('''struct sigevent s;''',
1298                     'HAVE_STRUCT_SIGEVENT',
1299                     headers='sys/types.h stdlib.h stddef.h signal.h',
1300                     msg='Checking whether we have the struct sigevent'):
1301         conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sival_ptr',
1302                                     define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIVAL_PTR',
1303                                     headers='signal.h');
1304         conf.CHECK_STRUCTURE_MEMBER('struct sigevent', 'sigev_value.sigval_ptr',
1305                                     define='HAVE_STRUCT_SIGEVENT_SIGEV_VALUE_SIGVAL_PTR',
1306                                     headers='signal.h');
1307
1308     if os.path.exists('/proc/sys/kernel/core_pattern'):
1309         conf.DEFINE('HAVE_SYS_KERNEL_PROC_CORE_PATTERN', '1')
1310
1311     if conf.CHECK_CODE('''
1312 #include <time.h>
1313 int main(void) {
1314         struct tm *tm;
1315         if (sizeof(time_t) == 8) {
1316                 time_t max_time = 0x7fffffffffffffffll;
1317                 tm = gmtime(&max_time);
1318                 /* This should fail with 32-bit tm_year. */
1319                 if (tm == NULL) {
1320                         /* Max time_t that works with 32-bit int tm_year in struct tm. */
1321                         max_time = 67768036191676799ll;
1322                         tm = gmtime(&max_time);
1323                         if (tm) {
1324                                 exit(0);
1325                         }
1326                 }
1327         }
1328         exit(1);
1329 }''',
1330         '__TIME_T_MAX',
1331         addmain=False,
1332         execute=True,
1333         msg="Checking for the maximum value of the 'time_t' type"):
1334             conf.DEFINE('TIME_T_MAX', '67768036191676799ll')
1335
1336     conf.CHECK_CODE('''
1337 #if defined(HAVE_UNISTD_H)
1338 #include <unistd.h>
1339 #endif
1340 #include <sys/types.h>
1341 #if defined(HAVE_SYS_SYSMACROS_H)
1342 #include <sys/sysmacros.h>
1343 #endif
1344 int main(void) { dev_t dev = makedev(1,2); return 0; }
1345 ''',
1346         'HAVE_MAKEDEV',
1347         addmain=False,
1348         msg='Checking whether the macro for makedev is available')
1349
1350     conf.CHECK_CODE('''
1351 #include <stdio.h>
1352 #include <limits.h>
1353 #include <signal.h>
1354 #include <stdlib.h>
1355
1356 void exit_on_core(int ignored) {
1357         exit(1);
1358 }
1359
1360 int main(void) {
1361         char *newpath;
1362         signal(SIGSEGV, exit_on_core);
1363         newpath = realpath("/tmp", NULL);
1364         exit((newpath != NULL) ? 0 : 1);
1365 }
1366 ''',
1367         'REALPATH_TAKES_NULL',
1368         addmain=False,
1369         execute=True,
1370         msg='Checking whether the realpath function allows a NULL argument')
1371
1372     conf.CHECK_CODE('''#include "../tests/ftruncate.c"''',
1373                     'HAVE_FTRUNCATE_EXTEND',
1374                     msg='Checking for ftruncate extend',
1375                     addmain=False,
1376                     execute=True)
1377
1378     conf.CHECK_CODE('''#include "../tests/readlink.c"''',
1379                     'HAVE_BROKEN_READLINK',
1380                     msg='Checking for readlink breakage',
1381                     addmain=False,
1382                     execute=True)
1383
1384     conf.SET_TARGET_TYPE('sendfile', 'EMPTY')
1385     conf.CHECK_LIB('sendfile')
1386     if not Options.options.with_sendfile_support == False:
1387         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):
1388             conf.CHECK_CODE('''
1389                             int tofd, fromfd;
1390                             off_t offset;
1391                             size_t total;
1392                             ssize_t nwritten = sendfile(tofd, fromfd, &offset, total);
1393                             ''',
1394                             '_HAVE_SENDFILE',
1395                             headers='sys/sendfile.h',
1396                             msg='Checking for linux sendfile support')
1397
1398             if conf.CONFIG_SET('_HAVE_SENDFILE'):
1399                 conf.DEFINE('HAVE_SENDFILE', '1')
1400                 conf.DEFINE('LINUX_SENDFILE_API', '1')
1401         elif (host_os.rfind('freebsd') > -1) or (host_os.rfind('dragonfly') > -1):
1402             conf.CHECK_CODE('''
1403                             #include <sys/types.h>
1404                             #include <unistd.h>
1405                             #include <sys/socket.h>
1406                             #include <sys/uio.h>
1407                             int fromfd, tofd, ret, total=0;
1408                             off_t offset, nwritten;
1409                             struct sf_hdtr hdr;
1410                             struct iovec hdtrl;
1411                             hdr.headers = &hdtrl;
1412                             hdr.hdr_cnt = 1;
1413                             hdr.trailers = NULL;
1414                             hdr.trl_cnt = 0;
1415                             hdtrl.iov_base = NULL;
1416                             hdtrl.iov_len = 0;
1417                             ret = sendfile(fromfd, tofd, offset, total, &hdr, &nwritten, 0)
1418                             ''',
1419                             '_HAVE_SENDFILE',
1420                             msg='Checking for freebsd sendfile support')
1421             if conf.CONFIG_SET('_HAVE_SENDFILE'):
1422                 conf.DEFINE('HAVE_SENDFILE', '1')
1423                 conf.DEFINE('FREEBSD_SENDFILE_API', '1')
1424         elif (host_os.rfind('darwin') > -1):
1425             conf.CHECK_CODE('''
1426                             #include <sys/types.h>
1427                             #include <sys/socket.h>
1428                             #include <sys/uio.h>
1429                             int fromfd, tofd, ret;
1430                             off_t offset, nwritten;
1431                             struct sf_hdtr hdr;
1432                             struct iovec hdtrl;
1433                             hdr.headers = &hdtrl;
1434                             hdr.hdr_cnt = 1;
1435                             hdr.trailers = (void *)0;
1436                             hdr.trl_cnt = 0;
1437                             hdtrl.iov_base = (void *)0;
1438                             hdtrl.iov_len = 0;
1439                             ret = sendfile(fromfd, tofd, offset, &nwritten, &hdr, 0);
1440                             ''',
1441                             '_HAVE_SENDFILE',
1442                             msg='Checking for darwin sendfile support')
1443             if conf.CONFIG_SET('_HAVE_SENDFILE'):
1444                 conf.DEFINE('HAVE_SENDFILE', '1')
1445                 conf.DEFINE('DARWIN_SENDFILE_API', '1')
1446         elif (host_os.rfind('hpux') > -1) or (host_os.rfind('osf') > -1):
1447             conf.CHECK_CODE('''
1448                             #include <sys/socket.h>
1449                             #include <sys/uio.h>
1450                             int fromfd, tofd;
1451                             size_t total=0;
1452                             struct iovec hdtrl[2];
1453                             ssize_t nwritten;
1454                             off_t offset;
1455                             hdtrl[0].iov_base = 0;
1456                             hdtrl[0].iov_len = 0;
1457                             nwritten = sendfile(tofd, fromfd, offset, total, &hdtrl[0], 0);
1458                             ''',
1459                             '_HAVE_SENDFILE',
1460                             msg='Checking for osf/hpux sendfile support')
1461             if conf.CONFIG_SET('_HAVE_SENDFILE'):
1462                 conf.DEFINE('HAVE_SENDFILE', '1')
1463                 conf.DEFINE('HPUX_SENDFILE_API', '1')
1464         elif (host_os.rfind('sunos') > -1):
1465             conf.CHECK_FUNCS_IN('sendfilev', 'sendfile')
1466             conf.CHECK_CODE('''
1467                             #include <sys/sendfile.h>,
1468                             int sfvcnt;
1469                             size_t xferred;
1470                             struct sendfilevec vec[2];
1471                             ssize_t nwritten;
1472                             int tofd;
1473                             sfvcnt = 2;
1474                             vec[0].sfv_fd = SFV_FD_SELF;
1475                             vec[0].sfv_flag = 0;
1476                             vec[0].sfv_off = 0;
1477                             vec[0].sfv_len = 0;
1478                             vec[1].sfv_fd = 0;
1479                             vec[1].sfv_flag = 0;
1480                             vec[1].sfv_off = 0;
1481                             vec[1].sfv_len = 0;
1482                             nwritten = sendfilev(tofd, vec, sfvcnt, &xferred);
1483                             ''',
1484                             '_HAVE_SENDFILEV',
1485                             msg='Checking for solaris sendfilev support',
1486                             lib='sendfile')
1487             if conf.CONFIG_SET('_HAVE_SENDFILEV'):
1488                 conf.DEFINE('HAVE_SENDFILEV', '1')
1489                 conf.DEFINE('SOLARIS_SENDFILE_API', '1')
1490         elif (host_os.rfind('aix') > -1):
1491             conf.CHECK_CODE('''
1492                             #include <sys/socket.h>
1493                             int fromfd, tofd;
1494                             size_t total=0;
1495                             struct sf_parms hdtrl;
1496                             ssize_t nwritten;
1497                             hdtrl.header_data = 0;
1498                             hdtrl.header_length = 0;
1499                             hdtrl.file_descriptor = fromfd;
1500                             hdtrl.file_offset = 0;
1501                             hdtrl.file_bytes = 0;
1502                             hdtrl.trailer_data = 0;
1503                             hdtrl.trailer_length = 0;
1504                             nwritten = send_file(&tofd, &hdtrl, 0);
1505                             ''',
1506                             '_HAVE_SENDFILE',
1507                             msg='Checking for AIX send_file support')
1508             if conf.CONFIG_SET('_HAVE_SENDFILE'):
1509                 conf.DEFINE('HAVE_SENDFILE', '1')
1510                 conf.DEFINE('AIX_SENDFILE_API', '1')
1511
1512     if Options.options.with_sendfile_support == True and not conf.CONFIG_SET('HAVE_SENDFILE'):
1513         conf.fatal('sendfile support not found but it was requested !')
1514     # Check for getcwd allowing a NULL arg.
1515     conf.CHECK_CODE('''
1516 #include <unistd.h>
1517 int main(void) {
1518         char *s = getcwd(NULL,0);
1519         return s != NULL ?  0 : 1;
1520 }''', 'GETCWD_TAKES_NULL', addmain=False, execute=True,
1521         msg="getcwd takes a NULL argument")
1522
1523
1524     # UnixWare 7.x has its getspnam in -lgen
1525     conf.CHECK_FUNCS_IN('getspnam', 'gen')
1526     conf.CHECK_FUNCS_IN('getspnam', 'security')
1527     conf.CHECK_FUNCS_IN('getspnam', 'sec')
1528
1529     legacy_quota_libs = ''
1530     if not Options.options.with_quotas == False:
1531         # For quotas on Veritas VxFS filesystems
1532         conf.CHECK_HEADERS('sys/fs/vx_quota.h')
1533         # For sys/quota.h and linux/quota.h
1534         conf.CHECK_HEADERS('sys/quota.h')
1535         # For quotas on BSD systems
1536         conf.CHECK_HEADERS('ufs/ufs/quota.h')
1537         # For quotas on AIX systems
1538         conf.CHECK_HEADERS('jfs/quota.h')
1539         # For quotas on Linux XFS filesystems
1540         if conf.CHECK_HEADERS('xfs/xqm.h'):
1541             conf.DEFINE('HAVE_XFS_QUOTAS', '1')
1542         else:
1543             # For Irix XFS
1544             conf.CHECK_CODE('''
1545                 #include "confdefs.h"
1546                 #ifdef HAVE_SYS_TYPES_H
1547                 #include <sys/types.h>
1548                 #endif
1549                 #ifdef HAVE_ASM_TYPES_H
1550                 #include <asm/types.h>
1551                 #endif
1552                 #include <sys/quota.h>
1553                 int i = Q_XGETQUOTA;''',
1554                 define='HAVE_XFS_QUOTAS',
1555                 msg='for XFS QUOTA in <sys/quota.h>',
1556                 execute=False,
1557                 local_include=False)
1558
1559         # For IRIX like dqb_isoftlimit instead of dqb_fsoftlimit in struct dqblk
1560         conf.CHECK_STRUCTURE_MEMBER('struct dqblk', 'dqb_fsoftlimit', define='HAVE_DQB_FSOFTLIMIT',
1561                                 headers='sys/quota.h')
1562         #darwin style quota bytecount
1563         conf.CHECK_STRUCTURE_MEMBER('struct dqblk', 'dqb_curbytes', define='HAVE_STRUCT_DQBLK_DQB_CURBYTES',
1564                                 headers='sys/quota.h')
1565         conf.CHECK_HEADERS('rpc/types.h rpc/xdr.h', together=True)
1566         if conf.CHECK_HEADERS('rpcsvc/rquota.h', lib='tirpc'):
1567             # Optional structure member
1568             conf.CHECK_STRUCTURE_MEMBER('struct getquota_rslt', 'getquota_rslt_u',
1569                                         define='HAVE_GETQUOTA_RSLT_GETQUOTA_RSLT_U',
1570                                         headers='rpcsvc/rquota.h',
1571                                         lib='tirpc')
1572
1573             # Required function for NFS quota support
1574             conf.CHECK_CODE('''
1575                             clnt_create("", RQUOTAPROG, RQUOTAVERS, "udp");
1576                             ''',
1577                             headers="rpc/rpc.h rpc/types.h rpcsvc/rquota.h rpc/nettype.h rpc/xdr.h",
1578                             define='HAVE_NFS_QUOTAS',
1579                             msg='checking for clnt_create()',
1580                             execute=True,
1581                             local_include=False,
1582                             lib='tirpc')
1583
1584         if (host_os.rfind('linux') > -1):
1585             conf.DEFINE('HAVE_QUOTACTL_LINUX', '1')
1586         elif not conf.CONFIG_SET("HAVE_XFS_QUOTAS"):
1587             if not conf.CHECK_CODE('''
1588                 #define HAVE_QUOTACTL_4A 1
1589                 #define AUTOCONF_TEST 1
1590                 #include "../tests/sysquotas.c"
1591                 ''',
1592                                    cflags=conf.env['WERROR_CFLAGS'],
1593                                    define='HAVE_QUOTACTL_4A',
1594                                    msg='for QUOTACTL_4A: long quotactl(int cmd, char *special, qid_t id, caddr_t addr)',
1595                                    execute=True,
1596                                    addmain=False):
1597
1598                 conf.CHECK_CODE('''
1599                 #define HAVE_QUOTACTL_4B 1
1600                 #define AUTOCONF_TEST 1
1601                 #include "../tests/sysquotas.c"
1602                 ''',
1603                                 cflags=conf.env['WERROR_CFLAGS'],
1604                                 define='HAVE_QUOTACTL_4B',
1605                                 msg='for QUOTACTL_4B:  int quotactl(const char *path, int cmd, int id, char *addr)',
1606                                 execute=True,
1607                                 addmain=False)
1608
1609         if conf.CONFIG_SET('HAVE_QUOTACTL_LINUX') or \
1610            conf.CONFIG_SET('HAVE_QUOTACTL_4A') or \
1611            conf.CONFIG_SET('HAVE_QUOTACTL_4B') or \
1612            conf.CONFIG_SET('HAVE_XFS_QUOTAS'):
1613             conf.DEFINE('HAVE_SYS_QUOTAS', '1')
1614             conf.DEFINE('WITH_QUOTAS', '1')
1615
1616         #
1617         # check if Legacy quota code can be brought in
1618         # if standard interfaces are not supported
1619         #
1620         if not conf.CONFIG_SET('WITH_QUOTAS'):
1621             if host_os.rfind('sunos5') > -1:
1622                 conf.DEFINE('SUNOS5', '1')
1623                 legacy_quota_libs = 'nsl'
1624             conf.CHECK_CODE('''
1625             #define WITH_QUOTAS 1
1626             #define AUTOCONF_TEST 1
1627             #include "../tests/oldquotas.c"
1628             ''',
1629                             cflags=conf.env['WERROR_CFLAGS'],
1630                             define='WITH_QUOTAS',
1631                             lib=legacy_quota_libs,
1632                             msg='Checking whether legacy quota code can be used',
1633                             execute=False,
1634                             addmain=False)
1635             if not conf.CONFIG_SET('WITH_QUOTAS'):
1636                 legacy_quota_libs = ''
1637     conf.env['legacy_quota_libs'] = legacy_quota_libs
1638
1639     if Options.options.with_quotas == True and not conf.CONFIG_SET('WITH_QUOTAS'):
1640         conf.fatal('quota support not found but it was requested !')
1641
1642     conf.CHECK_CODE('(void)unshare(CLONE_FS);',
1643                     headers='sched.h',
1644                     define='HAVE_UNSHARE_CLONE_FS',
1645                     msg='for Linux unshare(CLONE_FS)')
1646
1647     #
1648     # cluster support (CTDB)
1649     #
1650     if not Options.options.with_cluster_support:
1651         Logs.info("building without cluster support (--without-cluster-support)")
1652         conf.env.with_ctdb = False
1653     else:
1654         Logs.info("building with cluster support")
1655         conf.env.with_ctdb = True
1656         conf.DEFINE('CLUSTER_SUPPORT', 1)
1657
1658     if Options.options.with_profiling_data:
1659         conf.DEFINE('WITH_PROFILE', 1);
1660         conf.CHECK_FUNCS('getrusage', headers="sys/time.h sys/resource.h")
1661
1662     if (conf.CHECK_HEADERS('linux/ioctl.h sys/ioctl.h linux/fs.h') and
1663         conf.CHECK_DECLS('FS_IOC_GETFLAGS FS_COMPR_FL', headers='linux/fs.h')):
1664             conf.DEFINE('HAVE_LINUX_IOCTL', '1')
1665
1666     conf.env['CFLAGS_CEPHFS'] = "-D_FILE_OFFSET_BITS=64"
1667     if Options.options.libcephfs_dir:
1668         Logs.error('''--with-libcephfs no longer supported, please use compiler
1669                    flags instead, e.g. GCC LIBRARY_PATH and C_INCLUDE_PATH''')
1670         sys.exit(1)
1671
1672     if (Options.options.with_cephfs and
1673         conf.CHECK_HEADERS('cephfs/libcephfs.h', False, False, 'cephfs') and
1674         conf.CHECK_LIB('cephfs', shlib=True)):
1675         if (Options.options.with_acl_support and
1676             conf.CHECK_FUNCS_IN('ceph_statx', 'cephfs',
1677                                 headers='cephfs/libcephfs.h')):
1678             conf.DEFINE('HAVE_CEPH', '1')
1679             conf.CHECK_FUNCS_IN('ceph_select_filesystem', 'cephfs',
1680                                 headers='cephfs/libcephfs.h')
1681         else:
1682             Logs.warn('''Ceph support disabled due to --without-acl-support
1683                       or lack of ceph_statx support''')
1684             conf.undefine('HAVE_CEPH')
1685
1686     if Options.options.with_glusterfs:
1687         conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 4" --cflags --libs',
1688                        msg='Checking for glusterfs-api >= 4', uselib_store="GFAPI")
1689         conf.CHECK_HEADERS('glusterfs/api/glfs.h', lib='gfapi')
1690         conf.CHECK_LIB('gfapi', shlib=True)
1691
1692         if conf.CONFIG_SET('HAVE_GLUSTERFS_API_GLFS_H'):
1693             if Options.options.with_acl_support:
1694                  conf.DEFINE('HAVE_GLUSTERFS', '1')
1695             else:
1696                 Logs.warn("GlusterFS support disabled due to --without-acl-support")
1697                 conf.undefine('HAVE_GLUSTERFS')
1698         else:
1699             conf.undefine('HAVE_GLUSTERFS')
1700
1701         conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 6" --cflags --libs',
1702                        msg='Checking for glusterfs-api >= 6',
1703                        uselib_store="GFAPI_VER_6")
1704         conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 7.6" --cflags --libs',
1705                        msg='Checking for glusterfs-api >= 7.6',
1706                        uselib_store="GFAPI_VER_7_6")
1707         conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 7.9" --cflags --libs',
1708                        msg='Checking for glusterfs-api >= 7.9',
1709                        uselib_store="GFAPI_VER_7_9")
1710         conf.CHECK_CFG(package='glusterfs-api', args='"glusterfs-api >= 7.11" --cflags --libs',
1711                        msg='Checking for glusterfs-api >= 7.11',
1712                        uselib_store="GFAPI_VER_7_11")
1713
1714     else:
1715         conf.SET_TARGET_TYPE('gfapi', 'EMPTY')
1716         conf.undefine('HAVE_GLUSTERFS')
1717
1718     if Options.options.enable_vxfs:
1719         conf.DEFINE('HAVE_VXFS', '1')
1720
1721     conf.env.build_regedit = False
1722     if not Options.options.with_regedit == False:
1723         conf.PROCESS_SEPARATE_RULE('system_ncurses')
1724         if conf.CONFIG_SET('HAVE_NCURSES'):
1725             conf.env.build_regedit = True
1726
1727     if conf.env.build_regedit:
1728         Logs.info("building regedit")
1729     else:
1730         if Options.options.with_regedit == False:
1731             Logs.info("not building regedit (--without-regedit)")
1732         elif Options.options.with_regedit == True:
1733             Logs.error("ncurses not available, cannot build regedit")
1734             conf.fatal("ncurses not available, but --with-regedit was specified")
1735         else:
1736             Logs.info("ncurses not available, not building regedit")
1737
1738     if conf.CHECK_HEADERS('ftw.h') and conf.CHECK_FUNCS('nftw'):
1739         conf.env.build_mvxattr = True
1740
1741     conf.env.build_winexe = False
1742     if not Options.options.with_winexe == False:
1743         if conf.CONFIG_SET('HAVE_WINEXE_CC_WIN32') or conf.CONFIG_SET('HAVE_WINEXE_CC_WIN64'):
1744             conf.env.build_winexe = True
1745
1746     if conf.env.build_winexe:
1747         Logs.info("building winexe")
1748     else:
1749         if Options.options.with_winexe == False:
1750             Logs.info("not building winexe (--without-winexe)")
1751         elif Options.options.with_winexe == True:
1752             Logs.error("mingw not available, cannot build winexe")
1753             conf.fatal("mingw not available, but --with-winexe was specified")
1754         else:
1755             Logs.info("mingw not available, not building winexe")
1756
1757     conf.CHECK_FUNCS_IN('DES_pcbc_encrypt', 'crypto')
1758     if Options.options.with_fake_kaserver == True:
1759         conf.CHECK_HEADERS('afs/param.h afs/stds.h', together=True)
1760         conf.CHECK_HEADERS('afs/param.h afs/stds.h', together=True)
1761         if (conf.CONFIG_SET('HAVE_AFS_PARAM_H') and conf.CONFIG_SET('HAVE_AFS_STDS_H') and conf.CONFIG_SET('HAVE_DES_PCBC_ENCRYPT')):
1762             conf.DEFINE('WITH_FAKE_KASERVER', '1')
1763         else:
1764             conf.fatal('AFS headers not available, but --with-fake-kaserver was specified')
1765
1766     if conf.CHECK_CFG(package='glib-2.0',
1767                       args='--cflags --libs',
1768                       msg='Checking for glib-2.0',
1769                       uselib_store="GLIB-2.0"):
1770         if (conf.CHECK_HEADERS('glib.h', lib='glib-2.0') and conf.CHECK_LIB('glib-2.0', shlib=True)):
1771             conf.DEFINE('HAVE_GLIB', 1)
1772
1773     if conf.CONFIG_SET('HAVE_GLIB'):
1774         conf.DEFINE('WITH_TEVENT_GLIB_GLUE', '1')
1775
1776     conf.env['libtracker']=''
1777     tracker_versions = ['2.0', '1.0', '0.16', '0.14']
1778
1779     for version in tracker_versions:
1780         testlib = 'tracker-sparql-' + version
1781         if conf.CHECK_CFG(package=testlib,
1782                           args='--cflags --libs',
1783                           mandatory=False):
1784             conf.SET_TARGET_TYPE(testlib, 'SYSLIB')
1785             conf.env['libtracker'] = testlib
1786             conf.DEFINE('HAVE_TRACKER', '1')
1787             break
1788
1789     with_spotlight_tracker_backend = (
1790         conf.CONFIG_SET('HAVE_TRACKER')
1791         and conf.CONFIG_SET('HAVE_GLIB')
1792         and conf.env['BISON']
1793         and conf.env['FLEX']
1794         and conf.CONFIG_GET('HAVE_UTF8_NORMALISATION')
1795     )
1796
1797     with_spotlight_es_backend = (
1798         conf.CONFIG_SET('HAVE_JSON_OBJECT')
1799         and conf.env['BISON']
1800         and conf.env['FLEX']
1801         and conf.CONFIG_GET('HAVE_UTF8_NORMALISATION')
1802     )
1803
1804     conf.env.with_spotlight = False
1805     if Options.options.with_spotlight is not False:
1806         backends = ['noindex']
1807
1808         if not conf.env['BISON']:
1809             Logs.warn("Spotlight support requested but bison missing")
1810         if not conf.env['FLEX']:
1811             Logs.warn("Spotlight support requested but flex missing")
1812         if not conf.CONFIG_GET('HAVE_UTF8_NORMALISATION'):
1813             Logs.warn("Missing support for Unicode normalisation. "
1814                       "Try installing icu-dev or libicu-devel.")
1815         if not conf.CONFIG_SET('HAVE_TRACKER'):
1816             Logs.warn('Missing libtracker-sparql development files for Spotlight backend "tracker"')
1817         if not conf.CONFIG_SET('HAVE_GLIB'):
1818             Logs.warn('Missing glib-2.0 development files for Spotlight backend "tracker"')
1819         if not conf.CONFIG_GET('HAVE_JSON_OBJECT'):
1820             Logs.warn('Missing libjansson development files for Spotlight backend "elasticsearch"')
1821
1822         if with_spotlight_tracker_backend:
1823             conf.env.spotlight_backend_tracker = True
1824             backends.append('tracker')
1825             conf.DEFINE('HAVE_SPOTLIGHT_BACKEND_TRACKER', '1')
1826
1827         if with_spotlight_es_backend:
1828             conf.env.spotlight_backend_es = True
1829             backends.append('elasticsearch')
1830             conf.DEFINE('HAVE_SPOTLIGHT_BACKEND_ES', '1')
1831
1832         if (Options.options.with_spotlight is True
1833             and not conf.env.spotlight_backend_tracker
1834             and not conf.env.spotlight_backend_es):
1835             conf.fatal("Unmet dependencies for Spotlight backends")
1836
1837         Logs.info("Building with Spotlight support, available backends: %s" % ', '.join(backends))
1838         conf.DEFINE('WITH_SPOTLIGHT', '1')
1839         conf.env.with_spotlight = True
1840
1841     if not conf.CONFIG_SET('HAVE_RPC_XDR_H'):
1842         conf.CHECK_HEADERS('rpc/types.h rpc/xdr.h', together=True, lib='tirpc')
1843
1844     if conf.CHECK_FUNCS_IN('nscd_flush_cache', 'nscd', headers='libnscd.h'):
1845         conf.DEFINE('HAVE_NSCD_FLUSH_CACHE', '1')
1846
1847     forced_static_modules.extend(['auth_builtin', 'auth_sam', 'auth_winbind'])
1848     default_static_modules.extend(['pdb_smbpasswd', 'pdb_tdbsam',
1849                                       'auth_unix',
1850                                       'nss_info_template', 'idmap_tdb', 'idmap_passdb',
1851                                       'idmap_nss'])
1852
1853     default_shared_modules.extend(['vfs_recycle', 'vfs_audit', 'vfs_extd_audit', 'vfs_full_audit',
1854                                       'vfs_fake_perms', 'vfs_default_quota', 'vfs_readonly', 'vfs_cap',
1855                                       'vfs_expand_msdfs', 'vfs_shadow_copy', 'vfs_shadow_copy2',
1856                                       'vfs_readahead', 'vfs_xattr_tdb',
1857                                       'vfs_streams_xattr', 'vfs_streams_depot', 'vfs_acl_xattr', 'vfs_acl_tdb',
1858                                       'vfs_preopen', 'vfs_catia',
1859                                       'vfs_media_harmony', 'vfs_unityed_media', 'vfs_fruit', 'vfs_shell_snap',
1860                                       'vfs_commit', 'vfs_worm', 'vfs_crossrename', 'vfs_linux_xfs_sgid',
1861                                       'vfs_time_audit', 'vfs_offline', 'vfs_virusfilter', 'vfs_widelinks'])
1862     if host_os.rfind('linux') > -1:
1863         default_shared_modules.extend(['vfs_snapper'])
1864
1865     default_shared_modules.extend(['idmap_tdb2', 'idmap_script'])
1866     # these have broken dependencies
1867     forced_shared_modules.extend(['idmap_autorid', 'idmap_rid', 'idmap_hash'])
1868
1869     if Options.options.developer:
1870         default_static_modules.extend(['charset_weird'])
1871         default_shared_modules.extend(['vfs_skel_opaque',
1872                                        'vfs_skel_transparent',
1873                                        'vfs_shadow_copy_test',
1874                                        'pdb_test',
1875                                        'vfs_fake_dfq',
1876                                        'gpext_security', 'gpext_registry', 'gpext_scripts'])
1877
1878     if Options.options.enable_selftest or Options.options.developer:
1879         default_shared_modules.extend(['vfs_fake_acls', 'vfs_nfs4acl_xattr',
1880                                        'vfs_error_inject',
1881                                        'vfs_delay_inject'])
1882
1883     if conf.CONFIG_SET('AD_DC_BUILD_IS_ENABLED'):
1884         default_static_modules.extend(['pdb_samba_dsdb', 'auth_samba4', 'vfs_dfs_samba4'])
1885         default_shared_modules.extend(['vfs_posix_eadb'])
1886
1887     if conf.CONFIG_SET('HAVE_FREEBSD_SUNACL_H'):
1888         default_shared_modules.extend(['vfs_zfsacl'])
1889
1890     if conf.CONFIG_SET('HAVE_DIRFD_DECL'):
1891         default_shared_modules.extend(['vfs_syncops', 'vfs_dirsort'])
1892
1893     if conf.CONFIG_SET('HAVE_STATFS_F_FSID'):
1894         default_shared_modules.extend(['vfs_fileid'])
1895
1896     if (conf.CONFIG_SET('HAVE_STRUCT_MSGHDR_MSG_CONTROL') or conf.CONFIG_SET('HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS')):
1897         default_shared_modules.extend(['vfs_aio_fork'])
1898
1899     if conf.CONFIG_SET('HAVE_LIBURING'):
1900         default_shared_modules.extend(['vfs_io_uring'])
1901
1902     if Options.options.with_pthreadpool:
1903         default_shared_modules.extend(['vfs_aio_pthread'])
1904
1905     if conf.CONFIG_SET('HAVE_LDAP'):
1906         default_static_modules.extend(['pdb_ldapsam', 'idmap_ldap'])
1907
1908     if conf.CONFIG_SET('DARWINOS'):
1909         default_static_modules.extend(['charset_macosxfs'])
1910
1911     if conf.CONFIG_SET('HAVE_GPFS') and conf.CONFIG_SET('HAVE_KERNEL_OPLOCKS_LINUX'):
1912         default_shared_modules.extend(['vfs_gpfs'])
1913
1914     if (conf.CONFIG_SET('HAVE_LINUX_IOCTL')
1915       and conf.CONFIG_SET('HAVE_BASENAME') and conf.CONFIG_SET('HAVE_DIRNAME')):
1916         default_shared_modules.extend(['vfs_btrfs'])
1917
1918     if conf.CONFIG_SET("HAVE_CEPH"):
1919         default_shared_modules.extend(['vfs_ceph'])
1920         # Unlike vfs_ceph, vfs_ceph_snapshots doesn't depend on libcephfs, so
1921         # can be enabled atop a kernel CephFS share (with vfs_default) in
1922         # addition to vfs_ceph. Still, only enable vfs_ceph_snapshots builds
1923         # if we're building with libcephfs for now.
1924         default_shared_modules.extend(['vfs_ceph_snapshots'])
1925
1926     if conf.CONFIG_SET('HAVE_GLUSTERFS'):
1927         default_shared_modules.extend(['vfs_glusterfs'])
1928
1929     if conf.CONFIG_SET('HAVE_SETMNTENT'):
1930         default_shared_modules.extend(['vfs_glusterfs_fuse'])
1931
1932     if conf.CONFIG_SET('HAVE_VXFS'):
1933         default_shared_modules.extend(['vfs_vxfs'])
1934
1935     explicit_shared_modules = TO_LIST(Options.options.shared_modules, delimiter=',')
1936     explicit_static_modules = TO_LIST(Options.options.static_modules, delimiter=',')
1937
1938     def replace_list_item(lst, item, value):
1939         try:
1940             idx = lst.index(item)
1941             lst[idx] = value
1942         except:
1943             pass
1944     # PDB module file name should have the same name as module registers itself
1945     # In Autoconf build we export LDAP passdb module as ldapsam but WAF build
1946     # was always exporting pdb_ldap. In order to support existing packages
1947     # allow referring to pdb_ldapsam as pdb_ldap but use proper name internally.
1948     replace_list_item(explicit_shared_modules, 'pdb_ldap', 'pdb_ldapsam')
1949     replace_list_item(explicit_static_modules, 'pdb_ldap', 'pdb_ldapsam')
1950
1951     final_static_modules = []
1952     final_static_modules.extend(TO_LIST(required_static_modules))
1953     final_shared_modules = []
1954
1955     if '!FORCED' not in explicit_static_modules:
1956         final_static_modules.extend(TO_LIST(forced_static_modules))
1957     if '!FORCED' not in explicit_shared_modules:
1958         final_shared_modules.extend(TO_LIST(forced_shared_modules))
1959     if '!DEFAULT' not in explicit_static_modules:
1960         final_static_modules.extend(TO_LIST(default_static_modules))
1961     if '!DEFAULT' not in explicit_shared_modules:
1962         final_shared_modules.extend(TO_LIST(default_shared_modules))
1963
1964     if 'ALL' in explicit_static_modules:
1965         for m in default_shared_modules:
1966             if m in final_shared_modules:
1967                 final_shared_modules.remove(m)
1968             final_static_modules.append(m)
1969     if 'ALL' in explicit_shared_modules:
1970         for m in default_static_modules:
1971             if m in final_static_modules:
1972                 final_static_modules.remove(m)
1973             final_shared_modules.append(m)
1974
1975     for m in explicit_static_modules:
1976         if m in ['ALL','!DEFAULT','!FORCED']:
1977             continue
1978         if m.startswith('!'):
1979             m = m[1:]
1980             if m in required_static_modules:
1981                 raise Errors.WafError('These modules are REQUIRED as static modules: %s' %
1982                                      ' '.join(required_static_modules))
1983             if m in final_static_modules:
1984                 final_static_modules.remove(m)
1985             continue
1986         if m in forced_shared_modules:
1987             raise Errors.WafError('These modules MUST be configured as shared modules: %s' %
1988                                  ' '.join(forced_shared_modules))
1989         if m in final_shared_modules:
1990             final_shared_modules.remove(m)
1991         if m not in final_static_modules:
1992             final_static_modules.append(m)
1993     for m in explicit_shared_modules:
1994         if m in ['ALL','!DEFAULT','!FORCED']:
1995             continue
1996         if m.startswith('!'):
1997             m = m[1:]
1998             if m in final_shared_modules:
1999                 final_shared_modules.remove(m)
2000             continue
2001         if m in required_static_modules:
2002             raise Errors.WafError('These modules are REQUIRED as static modules: %s' %
2003                                  ' '.join(required_static_modules))
2004         if m in forced_static_modules:
2005             raise Errors.WafError('These module MUST be configured as static modules: %s' %
2006                                  ' '.join(forced_static_modules))
2007         if m in final_static_modules:
2008             final_static_modules.remove(m)
2009         if m not in final_shared_modules:
2010             final_shared_modules.append(m)
2011
2012     conf.env['static_modules'] = final_static_modules
2013     conf.env['shared_modules'] = final_shared_modules
2014
2015     conf.DEFINE('STRING_STATIC_MODULES', ' '.join(final_static_modules), quote=True)
2016     conf.DEFINE('STRING_SHARED_MODULES', ' '.join(final_shared_modules), quote=True)
2017
2018     static_list = {}
2019     shared_list = {}
2020
2021     prefixes = ['vfs', 'pdb', 'auth', 'nss_info', 'charset', 'idmap', 'gpext']
2022     conf.env['MODULE_PREFIXES'] = prefixes
2023     for p in prefixes:
2024         for m in final_static_modules:
2025             if m.find(p) == 0:
2026                 if not p in static_list:
2027                     static_list[p] = []
2028                 static_list[p].append(m)
2029         for m in final_shared_modules:
2030             if m.find(p) == 0:
2031                 if not p in shared_list:
2032                     shared_list[p] = []
2033                 shared_list[p].append(m)
2034
2035     for p in prefixes:
2036         static_env = "%s_STATIC" % p.upper()
2037         shared_env = "%s_SHARED" % p.upper()
2038         conf.env[static_env] = []
2039         conf.env[shared_env] = []
2040         if p in static_list:
2041             decl_list = " ".join("extern NTSTATUS %s_init(TALLOC_CTX *mem_ctx); " % entry for entry in static_list[p])
2042             for entry in static_list[p]:
2043                 conf.env[static_env].append('%s' % entry)
2044             conf.DEFINE('static_decl_%s' % p, decl_list)
2045             conf.DEFINE('static_init_%s(mem_ctx)' % p, '{ %s_init((mem_ctx)); }' % '_init((mem_ctx));  '.join(static_list[p]))
2046         else:
2047             conf.DEFINE('static_decl_%s' % p, '')
2048             conf.DEFINE('static_init_%s(mem_ctx)' % p, '{}')
2049         if p in shared_list:
2050             for entry in shared_list[p]:
2051                 conf.DEFINE('%s_init' % entry, 'samba_init_module')
2052                 conf.env[shared_env].append('%s' % entry)
2053         Logs.info("%s: %s" % (static_env, ','.join(conf.env[static_env])))
2054         Logs.info("%s: %s" % (shared_env, ','.join(conf.env[shared_env])))
2055
2056     if (('vfs_snapper' in shared_list.get('vfs', []) or 'vfs_snapper' in static_list.get('vfs', []))
2057         and not (conf.CHECK_CFG(package='dbus-1', args='--cflags --libs',
2058                                 msg='Checking for dbus', uselib_store="DBUS-1")
2059                  and conf.CHECK_HEADERS('dbus/dbus.h', lib='dbus-1')
2060                  and conf.CHECK_LIB('dbus-1', shlib=True))):
2061         conf.fatal("vfs_snapper is enabled but prerequisite dbus-1 package not "
2062                    "found. Use --with-shared-modules='!vfs_snapper' to disable "
2063                    "vfs_snapper support.")
2064
2065     conf.SAMBA_CONFIG_H('include/config.h')