Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package tdb for openSUSE:Factory checked in 
at 2023-03-25 18:54:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/tdb (Old)
 and      /work/SRC/openSUSE:Factory/.tdb.new.31432 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "tdb"

Sat Mar 25 18:54:44 2023 rev:42 rq:1074013 version:1.4.8

Changes:
--------
--- /work/SRC/openSUSE:Factory/tdb/tdb.changes  2022-10-03 13:44:07.701265792 
+0200
+++ /work/SRC/openSUSE:Factory/.tdb.new.31432/tdb.changes       2023-03-25 
18:54:49.502497283 +0100
@@ -1,0 +2,6 @@
+Fri Mar 17 07:52:46 UTC 2023 - Samuel Cabrero <[email protected]>
+
+- Update to 1.4.8:
+  * Support python 3.12
+
+-------------------------------------------------------------------

Old:
----
  tdb-1.4.7.tar.asc
  tdb-1.4.7.tar.gz

New:
----
  tdb-1.4.8.tar.asc
  tdb-1.4.8.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ tdb.spec ++++++
--- /var/tmp/diff_new_pack.ott7Hk/_old  2023-03-25 18:54:50.098500398 +0100
+++ /var/tmp/diff_new_pack.ott7Hk/_new  2023-03-25 18:54:50.102500419 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package tdb
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %{!?python_sitearch:  %global python_sitearch %(python -c "from 
distutils.sysconfig import get_python_lib; print get_python_lib(1)")}
 %{!?py3_soflags:  %global py3_soflags cpython-%{python3_version_nodots}m}
 Name:           tdb
-Version:        1.4.7
+Version:        1.4.8
 Release:        0
 Summary:        Samba Trivial Database
 License:        LGPL-3.0-or-later

++++++ tdb-1.4.7.tar.gz -> tdb-1.4.8.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/ABI/tdb-1.4.8.sigs 
new/tdb-1.4.8/ABI/tdb-1.4.8.sigs
--- old/tdb-1.4.7/ABI/tdb-1.4.8.sigs    1970-01-01 01:00:00.000000000 +0100
+++ new/tdb-1.4.8/ABI/tdb-1.4.8.sigs    2023-01-18 18:37:29.303779800 +0100
@@ -0,0 +1,73 @@
+tdb_add_flags: void (struct tdb_context *, unsigned int)
+tdb_append: int (struct tdb_context *, TDB_DATA, TDB_DATA)
+tdb_chainlock: int (struct tdb_context *, TDB_DATA)
+tdb_chainlock_mark: int (struct tdb_context *, TDB_DATA)
+tdb_chainlock_nonblock: int (struct tdb_context *, TDB_DATA)
+tdb_chainlock_read: int (struct tdb_context *, TDB_DATA)
+tdb_chainlock_read_nonblock: int (struct tdb_context *, TDB_DATA)
+tdb_chainlock_unmark: int (struct tdb_context *, TDB_DATA)
+tdb_chainunlock: int (struct tdb_context *, TDB_DATA)
+tdb_chainunlock_read: int (struct tdb_context *, TDB_DATA)
+tdb_check: int (struct tdb_context *, int (*)(TDB_DATA, TDB_DATA, void *), 
void *)
+tdb_close: int (struct tdb_context *)
+tdb_delete: int (struct tdb_context *, TDB_DATA)
+tdb_dump_all: void (struct tdb_context *)
+tdb_enable_seqnum: void (struct tdb_context *)
+tdb_error: enum TDB_ERROR (struct tdb_context *)
+tdb_errorstr: const char *(struct tdb_context *)
+tdb_exists: int (struct tdb_context *, TDB_DATA)
+tdb_fd: int (struct tdb_context *)
+tdb_fetch: TDB_DATA (struct tdb_context *, TDB_DATA)
+tdb_firstkey: TDB_DATA (struct tdb_context *)
+tdb_freelist_size: int (struct tdb_context *)
+tdb_get_flags: int (struct tdb_context *)
+tdb_get_logging_private: void *(struct tdb_context *)
+tdb_get_seqnum: int (struct tdb_context *)
+tdb_hash_size: int (struct tdb_context *)
+tdb_increment_seqnum_nonblock: void (struct tdb_context *)
+tdb_jenkins_hash: unsigned int (TDB_DATA *)
+tdb_lock_nonblock: int (struct tdb_context *, int, int)
+tdb_lockall: int (struct tdb_context *)
+tdb_lockall_mark: int (struct tdb_context *)
+tdb_lockall_nonblock: int (struct tdb_context *)
+tdb_lockall_read: int (struct tdb_context *)
+tdb_lockall_read_nonblock: int (struct tdb_context *)
+tdb_lockall_unmark: int (struct tdb_context *)
+tdb_log_fn: tdb_log_func (struct tdb_context *)
+tdb_map_size: size_t (struct tdb_context *)
+tdb_name: const char *(struct tdb_context *)
+tdb_nextkey: TDB_DATA (struct tdb_context *, TDB_DATA)
+tdb_null: dptr = 0xXXXX, dsize = 0
+tdb_open: struct tdb_context *(const char *, int, int, int, mode_t)
+tdb_open_ex: struct tdb_context *(const char *, int, int, int, mode_t, const 
struct tdb_logging_context *, tdb_hash_func)
+tdb_parse_record: int (struct tdb_context *, TDB_DATA, int (*)(TDB_DATA, 
TDB_DATA, void *), void *)
+tdb_printfreelist: int (struct tdb_context *)
+tdb_remove_flags: void (struct tdb_context *, unsigned int)
+tdb_reopen: int (struct tdb_context *)
+tdb_reopen_all: int (int)
+tdb_repack: int (struct tdb_context *)
+tdb_rescue: int (struct tdb_context *, void (*)(TDB_DATA, TDB_DATA, void *), 
void *)
+tdb_runtime_check_for_robust_mutexes: bool (void)
+tdb_set_logging_function: void (struct tdb_context *, const struct 
tdb_logging_context *)
+tdb_set_max_dead: void (struct tdb_context *, int)
+tdb_setalarm_sigptr: void (struct tdb_context *, volatile sig_atomic_t *)
+tdb_store: int (struct tdb_context *, TDB_DATA, TDB_DATA, int)
+tdb_storev: int (struct tdb_context *, TDB_DATA, const TDB_DATA *, int, int)
+tdb_summary: char *(struct tdb_context *)
+tdb_transaction_active: bool (struct tdb_context *)
+tdb_transaction_cancel: int (struct tdb_context *)
+tdb_transaction_commit: int (struct tdb_context *)
+tdb_transaction_prepare_commit: int (struct tdb_context *)
+tdb_transaction_start: int (struct tdb_context *)
+tdb_transaction_start_nonblock: int (struct tdb_context *)
+tdb_transaction_write_lock_mark: int (struct tdb_context *)
+tdb_transaction_write_lock_unmark: int (struct tdb_context *)
+tdb_traverse: int (struct tdb_context *, tdb_traverse_func, void *)
+tdb_traverse_chain: int (struct tdb_context *, unsigned int, 
tdb_traverse_func, void *)
+tdb_traverse_key_chain: int (struct tdb_context *, TDB_DATA, 
tdb_traverse_func, void *)
+tdb_traverse_read: int (struct tdb_context *, tdb_traverse_func, void *)
+tdb_unlock: int (struct tdb_context *, int, int)
+tdb_unlockall: int (struct tdb_context *)
+tdb_unlockall_read: int (struct tdb_context *)
+tdb_validate_freelist: int (struct tdb_context *, int *)
+tdb_wipe_all: int (struct tdb_context *)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/bin/waf 
new/tdb-1.4.8/buildtools/bin/waf
--- old/tdb-1.4.7/buildtools/bin/waf    2022-06-09 06:23:07.911090400 +0200
+++ new/tdb-1.4.8/buildtools/bin/waf    2023-01-18 16:27:05.360657700 +0100
@@ -32,7 +32,7 @@
 
 import os, sys, inspect
 
-VERSION="2.0.24"
+VERSION="2.0.25"
 REVISION="x"
 GIT="x"
 INSTALL="x"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/wafsamba/samba_autoconf.py 
new/tdb-1.4.8/buildtools/wafsamba/samba_autoconf.py
--- old/tdb-1.4.7/buildtools/wafsamba/samba_autoconf.py 2022-04-12 
01:57:37.760320000 +0200
+++ new/tdb-1.4.8/buildtools/wafsamba/samba_autoconf.py 2023-01-18 
16:27:05.360657700 +0100
@@ -146,7 +146,7 @@
 
 
 @conf
-def CHECK_TYPE(conf, t, alternate=None, headers=None, define=None, lib=None, 
msg=None):
+def CHECK_TYPE(conf, t, alternate=None, headers=None, define=None, lib=None, 
msg=None, cflags=''):
     '''check for a single type'''
     if define is None:
         define = 'HAVE_' + t.upper().replace(' ', '_')
@@ -158,6 +158,7 @@
                      headers=headers,
                      local_include=False,
                      msg=msg,
+                     cflags=cflags,
                      lib=lib,
                      link=False)
     if not ret and alternate:
@@ -177,14 +178,15 @@
 
 
 @conf
-def CHECK_TYPE_IN(conf, t, headers=None, alternate=None, define=None):
+def CHECK_TYPE_IN(conf, t, headers=None, alternate=None, define=None, 
cflags=''):
     '''check for a single type with a header'''
-    return CHECK_TYPE(conf, t, headers=headers, alternate=alternate, 
define=define)
+    return CHECK_TYPE(conf, t, headers=headers, alternate=alternate, 
define=define, cflags=cflags)
 
 
 @conf
 def CHECK_VARIABLE(conf, v, define=None, always=False,
-                   headers=None, msg=None, lib=None):
+                   headers=None, msg=None, lib=None,
+                   mandatory=False):
     '''check for a variable declaration (or define)'''
     if define is None:
         define = 'HAVE_%s' % v.upper()
@@ -208,6 +210,7 @@
                       lib=lib,
                       headers=headers,
                       define=define,
+                      mandatory=mandatory,
                       always=always)
 
 
@@ -774,6 +777,8 @@
                         testflags=True)
         conf.ADD_CFLAGS('-Werror-implicit-function-declaration',
                         testflags=True)
+        conf.ADD_CFLAGS('-Werror=implicit-int',
+                        testflags=True)
         conf.ADD_CFLAGS('-Werror=pointer-arith -Wpointer-arith',
                         testflags=True)
         conf.ADD_CFLAGS('-Werror=declaration-after-statement 
-Wdeclaration-after-statement',
@@ -786,6 +791,8 @@
                         testflags=True)
         conf.ADD_CFLAGS('-Werror=strict-overflow -Wstrict-overflow=2',
                         testflags=True)
+        conf.ADD_CFLAGS('-Werror=old-style-definition -Wold-style-definition',
+                        testflags=True)
 
         conf.ADD_CFLAGS('-Wformat=2 -Wno-format-y2k', testflags=True)
         conf.ADD_CFLAGS('-Wno-format-zero-length', testflags=True)
@@ -806,6 +813,9 @@
                 conf.env['EXTRA_CFLAGS'] = []
             conf.env['EXTRA_CFLAGS'].extend(TO_LIST("-Werror=format"))
 
+        if CHECK_CFLAGS(conf, ["-Wno-error=array-bounds"]):
+            conf.define('HAVE_WNO_ERROR_ARRAY_BOUNDS', 1)
+
         if not Options.options.disable_warnings_as_errors:
             conf.ADD_NAMED_CFLAGS('PICKY_CFLAGS', '-Werror 
-Wno-error=deprecated-declarations', testflags=True)
             conf.ADD_NAMED_CFLAGS('PICKY_CFLAGS', 
'-Wno-error=tautological-compare', testflags=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/wafsamba/samba_conftests.py 
new/tdb-1.4.8/buildtools/wafsamba/samba_conftests.py
--- old/tdb-1.4.7/buildtools/wafsamba/samba_conftests.py        2020-01-21 
15:09:47.853205000 +0100
+++ new/tdb-1.4.8/buildtools/wafsamba/samba_conftests.py        2022-11-15 
16:59:09.743139700 +0100
@@ -126,7 +126,7 @@
 
 
 @conf
-def CHECK_C_PROTOTYPE(conf, function, prototype, define, headers=None, 
msg=None):
+def CHECK_C_PROTOTYPE(conf, function, prototype, define, headers=None, 
msg=None, lib=None):
     '''verify that a C prototype matches the one on the current system'''
     if not conf.CHECK_DECLS(function, headers=headers):
         return False
@@ -138,7 +138,8 @@
                            headers=headers,
                            link=False,
                            execute=False,
-                           msg=msg)
+                           msg=msg,
+                           lib=lib)
 
 
 @conf
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/wafsamba/samba_cross.py 
new/tdb-1.4.8/buildtools/wafsamba/samba_cross.py
--- old/tdb-1.4.7/buildtools/wafsamba/samba_cross.py    2022-04-12 
01:57:37.760320000 +0200
+++ new/tdb-1.4.8/buildtools/wafsamba/samba_cross.py    2022-06-20 
09:53:53.787543500 +0200
@@ -77,7 +77,7 @@
                 f.close()
                 return (0, ans.strip("'"))
             else:
-                m = re.match('\(\s*(-?\d+)\s*,\s*\"(.*)\"\s*\)', ans)
+                m = re.match(r'\(\s*(-?\d+)\s*,\s*\"(.*)\"\s*\)', ans)
                 if m:
                     f.close()
                     return (int(m.group(1)), m.group(2))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/wafsamba/samba_third_party.py 
new/tdb-1.4.8/buildtools/wafsamba/samba_third_party.py
--- old/tdb-1.4.7/buildtools/wafsamba/samba_third_party.py      2022-04-12 
01:57:37.760320000 +0200
+++ new/tdb-1.4.8/buildtools/wafsamba/samba_third_party.py      2023-01-18 
16:27:05.360657700 +0100
@@ -24,17 +24,17 @@
 
 @conf
 def CHECK_SOCKET_WRAPPER(conf):
-    return conf.CHECK_BUNDLED_SYSTEM_PKG('socket_wrapper', minversion='1.3.3')
+    return conf.CHECK_BUNDLED_SYSTEM_PKG('socket_wrapper', minversion='1.3.4')
 Build.BuildContext.CHECK_SOCKET_WRAPPER = CHECK_SOCKET_WRAPPER
 
 @conf
 def CHECK_NSS_WRAPPER(conf):
-    return conf.CHECK_BUNDLED_SYSTEM_PKG('nss_wrapper', minversion='1.1.11')
+    return conf.CHECK_BUNDLED_SYSTEM_PKG('nss_wrapper', minversion='1.1.13')
 Build.BuildContext.CHECK_NSS_WRAPPER = CHECK_NSS_WRAPPER
 
 @conf
 def CHECK_RESOLV_WRAPPER(conf):
-    return conf.CHECK_BUNDLED_SYSTEM_PKG('resolv_wrapper', minversion='1.1.7')
+    return conf.CHECK_BUNDLED_SYSTEM_PKG('resolv_wrapper', minversion='1.1.8')
 Build.BuildContext.CHECK_RESOLV_WRAPPER = CHECK_RESOLV_WRAPPER
 
 @conf
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/wafsamba/samba_waf18.py 
new/tdb-1.4.8/buildtools/wafsamba/samba_waf18.py
--- old/tdb-1.4.7/buildtools/wafsamba/samba_waf18.py    2022-01-24 
13:18:16.290473500 +0100
+++ new/tdb-1.4.8/buildtools/wafsamba/samba_waf18.py    2023-01-18 
16:27:05.360657700 +0100
@@ -209,7 +209,8 @@
         lib_node.parent.mkdir()
         lib_node.write('int lib_func(void) { return 42; }\n', 'w')
         main_node = bld.srcnode.make_node('main.c')
-        main_node.write('int main(void) {return !(lib_func() == 42);}', 'w')
+        main_node.write('int lib_func(void);\n'
+                        'int main(void) {return !(lib_func() == 42);}', 'w')
         linkflags = []
         if version_script:
             script = bld.srcnode.make_node('ldscript')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/buildtools/wafsamba/wafsamba.py 
new/tdb-1.4.8/buildtools/wafsamba/wafsamba.py
--- old/tdb-1.4.7/buildtools/wafsamba/wafsamba.py       2022-06-09 
06:23:07.911090400 +0200
+++ new/tdb-1.4.8/buildtools/wafsamba/wafsamba.py       2023-01-18 
16:27:05.360657700 +0100
@@ -38,7 +38,7 @@
 
 os.environ['PYTHONUNBUFFERED'] = '1'
 
-if Context.HEXVERSION not in (0x2001800,):
+if Context.HEXVERSION not in (0x2001900,):
     Logs.error('''
 Please use the version of waf that comes with Samba, not
 a system installed version. See http://wiki.samba.org/index.php/Waf
@@ -913,12 +913,19 @@
     dep_vars.append('ruledeps')
     dep_vars.append('SAMBA_GENERATOR_VARS')
 
+    shell=isinstance(rule, str)
+
+    # This ensures that if the command (executed in the shell) fails
+    # (returns non-zero), the build fails
+    if shell:
+        rule = "set -e; " + rule
+
     bld.SET_BUILD_GROUP(group)
     t = bld(
         rule=rule,
         source=bld.EXPAND_VARIABLES(source, vars=vars),
+        shell=shell,
         target=target,
-        shell=isinstance(rule, str),
         update_outputs=True,
         before='c',
         ext_out='.c',
@@ -1180,10 +1187,10 @@
         source = [m + '.xml']
         if extra_source is not None:
             source = [source, extra_source]
-        # ${SRC[1]} and ${SRC[2]} are not referenced in the
+        # ${SRC[1]}, ${SRC[2]} and ${SRC[3]} are not referenced in the
         # SAMBA_GENERATOR but trigger the dependency calculation so
         # ensures that manpages are rebuilt when these change.
-        source += ['build/DTD/samba.entities', 'build/DTD/samba.build.version']
+        source += ['build/DTD/samba.build.pathconfig', 
'build/DTD/samba.entities', 'build/DTD/samba.build.version']
         bld.SAMBA_GENERATOR(m,
                             source=source,
                             target=m,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/common/error.c new/tdb-1.4.8/common/error.c
--- old/tdb-1.4.7/common/error.c        2020-01-21 15:09:48.013205500 +0100
+++ new/tdb-1.4.8/common/error.c        2023-01-18 16:27:05.372657800 +0100
@@ -32,26 +32,43 @@
        return tdb->ecode;
 }
 
-static struct tdb_errname {
-       enum TDB_ERROR ecode; const char *estring;
-} emap[] = { {TDB_SUCCESS, "Success"},
-            {TDB_ERR_CORRUPT, "Corrupt database"},
-            {TDB_ERR_IO, "IO Error"},
-            {TDB_ERR_LOCK, "Locking error"},
-            {TDB_ERR_OOM, "Out of memory"},
-            {TDB_ERR_EXISTS, "Record exists"},
-            {TDB_ERR_NOLOCK, "Lock exists on other keys"},
-            {TDB_ERR_EINVAL, "Invalid parameter"},
-            {TDB_ERR_NOEXIST, "Record does not exist"},
-            {TDB_ERR_RDONLY, "write not permitted"} };
-
-/* Error string for the last tdb error */
 _PUBLIC_ const char *tdb_errorstr(struct tdb_context *tdb)
 {
-       uint32_t i;
-       for (i = 0; i < sizeof(emap) / sizeof(struct tdb_errname); i++)
-               if (tdb->ecode == emap[i].ecode)
-                       return emap[i].estring;
+       switch (tdb->ecode) {
+       case TDB_SUCCESS:
+               return "Success";
+               break;
+       case TDB_ERR_CORRUPT:
+               return "Corrupt database";
+               break;
+       case TDB_ERR_IO:
+               return "IO Error";
+               break;
+       case TDB_ERR_LOCK:
+               return "Locking error";
+               break;
+       case TDB_ERR_OOM:
+               return "Out of memory";
+               break;
+       case TDB_ERR_EXISTS:
+               return "Record exists";
+               break;
+       case TDB_ERR_NOLOCK:
+               return "Lock exists on other keys";
+               break;
+       case TDB_ERR_EINVAL:
+               return "Invalid parameter";
+               break;
+       case TDB_ERR_NOEXIST:
+               return "Record does not exist";
+               break;
+       case TDB_ERR_RDONLY:
+               return "write not permitted";
+               break;
+       default:
+               break;
+       }
+
        return "Invalid error code";
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/lib/replace/replace.c 
new/tdb-1.4.8/lib/replace/replace.c
--- old/tdb-1.4.7/lib/replace/replace.c 2022-01-24 13:18:16.326473700 +0100
+++ new/tdb-1.4.8/lib/replace/replace.c 2022-12-09 09:35:17.185507800 +0100
@@ -33,6 +33,10 @@
 #include "system/locale.h"
 #include "system/wait.h"
 
+#ifdef HAVE_SYS_SYSCALL_H
+#include <sys/syscall.h>
+#endif
+
 #ifdef _WIN32
 #define mkdir(d,m) _mkdir(d)
 #endif
@@ -1058,9 +1062,6 @@
 #endif /* HAVE_GETPROGNAME */
 
 #ifndef HAVE_COPY_FILE_RANGE
-# ifdef HAVE_SYSCALL_COPY_FILE_RANGE
-# include <sys/syscall.h>
-# endif
 ssize_t rep_copy_file_range(int fd_in,
                            loff_t *off_in,
                            int fd_out,
@@ -1081,3 +1082,64 @@
        return -1;
 }
 #endif /* HAVE_COPY_FILE_RANGE */
+
+#ifndef HAVE_OPENAT2
+
+/* fallback known wellknown __NR_openat2 values */
+#ifndef __NR_openat2
+# if defined(LINUX) && defined(HAVE_SYS_SYSCALL_H)
+#  if defined(__i386__)
+#   define __NR_openat2 437
+#  elif defined(__x86_64__) && defined(__LP64__)
+#   define __NR_openat2 437 /* 437 0x1B5 */
+#  elif defined(__x86_64__) && defined(__ILP32__)
+#   define __NR_openat2 1073742261 /* 1073742261 0x400001B5 */
+#  elif defined(__aarch64__)
+#   define __NR_openat2 437
+#  elif defined(__arm__)
+#   define __NR_openat2 437
+#  elif defined(__sparc__)
+#   define __NR_openat2 437
+#  endif
+# endif /* defined(LINUX) && defined(HAVE_SYS_SYSCALL_H) */
+#endif /* !__NR_openat2 */
+
+#ifdef DISABLE_OPATH
+/*
+ * systems without O_PATH also don't have openat2,
+ * so make sure we at a realistic combination.
+ */
+#undef __NR_openat2
+#endif /* DISABLE_OPATH */
+
+long rep_openat2(int dirfd, const char *pathname,
+                struct open_how *how, size_t size)
+{
+#ifdef __NR_openat2
+#if _FILE_OFFSET_BITS == 64 && SIZE_MAX == 0xffffffffUL && defined(O_LARGEFILE)
+       struct open_how __how;
+
+#if defined(O_PATH) && ! defined(DISABLE_OPATH)
+       if ((how->flags & O_PATH) == 0)
+#endif
+       {
+               if (sizeof(__how) == size) {
+                       __how = *how;
+
+                       __how.flags |= O_LARGEFILE;
+                       how = &__how;
+               }
+       }
+#endif
+
+       return syscall(__NR_openat2,
+                      dirfd,
+                      pathname,
+                      how,
+                      size);
+#else
+       errno = ENOSYS;
+       return -1;
+#endif
+}
+#endif /* !HAVE_OPENAT2 */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/lib/replace/replace.h 
new/tdb-1.4.8/lib/replace/replace.h
--- old/tdb-1.4.7/lib/replace/replace.h 2022-04-12 01:57:37.800320100 +0200
+++ new/tdb-1.4.8/lib/replace/replace.h 2023-01-18 16:27:05.368657800 +0100
@@ -699,13 +699,9 @@
 #include <stdbool.h>
 #endif
 
-#if !defined(HAVE_BOOL)
-#ifdef HAVE__Bool
-#define bool _Bool
-#else
+#ifndef HAVE_BOOL
 #error Need a real boolean type
 #endif
-#endif
 
 #if !defined(HAVE_INTPTR_T)
 typedef long long intptr_t ;
@@ -847,6 +843,35 @@
 #define ZERO_ARRAY_LEN(x, l) memset_s((char *)(x), (l), 0, (l))
 
 /**
+ * Explicitly zero data from memory. This is guaranteed to be not optimized
+ * away.
+ */
+#define BURN_DATA(x) memset_s((char *)&(x), sizeof(x), 0, sizeof(x))
+
+/**
+ * Explicitly zero data from memory. This is guaranteed to be not optimized
+ * away.
+ */
+#define BURN_DATA_SIZE(x, s) memset_s((char *)&(x), (s), 0, (s))
+
+/**
+ * Explicitly zero data from memory. This is guaranteed to be not optimized
+ * away.
+ */
+#define BURN_PTR_SIZE(x, s) memset_s((x), (s), 0, (s))
+
+/**
+ * Explicitly zero data in string. This is guaranteed to be not optimized
+ * away.
+ */
+#define BURN_STR(x)    do { \
+                               if ((x) != NULL) { \
+                                       size_t s = strlen(x); \
+                                       memset_s((x), s, 0, s); \
+                               } \
+                       } while(0)
+
+/**
  * Work out how many elements there are in a static array.
  */
 #ifdef ARRAY_SIZE
@@ -1057,4 +1082,16 @@
 #include <sys/atomic.h>
 #endif
 
+/*
+ * This handles the case of missing pthread support and ensures code can use
+ * __thread unconditionally, such that when built on a platform without pthread
+ * support, the __thread qualifier is an empty define.
+ */
+#ifndef HAVE___THREAD
+# ifdef HAVE_PTHREAD
+# error Configure failed to detect pthread library with missing TLS support
+# endif
+#define HAVE___THREAD
+#endif
+
 #endif /* _LIBREPLACE_REPLACE_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/lib/replace/snprintf.c 
new/tdb-1.4.8/lib/replace/snprintf.c
--- old/tdb-1.4.7/lib/replace/snprintf.c        2020-01-21 15:09:48.005205600 
+0100
+++ new/tdb-1.4.8/lib/replace/snprintf.c        2022-11-15 16:59:09.747140000 
+0100
@@ -751,6 +751,8 @@
 
        while (chunks) {
                cnk = chunks->next;
+               if (chunks->min_star) free(chunks->min_star);
+               if (chunks->max_star) free(chunks->max_star);
                free(chunks);
                chunks = cnk;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/lib/replace/system/filesys.h 
new/tdb-1.4.8/lib/replace/system/filesys.h
--- old/tdb-1.4.7/lib/replace/system/filesys.h  2022-01-24 13:18:16.326473700 
+0100
+++ new/tdb-1.4.8/lib/replace/system/filesys.h  2022-08-16 14:27:23.900461000 
+0200
@@ -36,7 +36,8 @@
 #include <sys/param.h>
 #endif
 
-#ifdef HAVE_SYS_MOUNT_H
+/* This include is required on UNIX (*BSD, AIX, ...) for statfs() */
+#if !defined(LINUX) && defined(HAVE_SYS_MOUNT_H)
 #include <sys/mount.h>
 #endif
 
@@ -44,6 +45,7 @@
 #include <mntent.h>
 #endif
 
+/* This include is required on Linux for statfs() */
 #ifdef HAVE_SYS_VFS_H
 #include <sys/vfs.h>
 #endif
@@ -241,4 +243,39 @@
 
 #endif /* !defined(HAVE_XATTR_XATTR) || defined(XATTR_ADDITIONAL_OPTIONS) */
 
+#ifdef HAVE_LINUX_OPENAT2_H
+#include <linux/openat2.h>
+#else /* ! HAVE_LINUX_OPENAT2_H */
+/* how->resolve flags for openat2(2). */
+#define RESOLVE_NO_XDEV                0x01 /* Block mount-point crossings
+                                       (includes bind-mounts). */
+#define RESOLVE_NO_MAGICLINKS  0x02 /* Block traversal through procfs-style
+                                       "magic-links". */
+#define RESOLVE_NO_SYMLINKS    0x04 /* Block traversal through all symlinks
+                                       (implies OEXT_NO_MAGICLINKS) */
+#define RESOLVE_BENEATH                0x08 /* Block "lexical" trickery like
+                                       "..", symlinks, and absolute
+                                       paths which escape the dirfd. */
+#define RESOLVE_IN_ROOT                0x10 /* Make all jumps to "/" and ".."
+                                       be scoped inside the dirfd
+                                       (similar to chroot(2)). */
+#define RESOLVE_CACHED         0x20 /* Only complete if resolution can be
+                                       completed through cached lookup. May
+                                       return -EAGAIN if that's not
+                                       possible. */
+struct __rep_open_how {
+       uint64_t flags;
+       uint64_t mode;
+       uint64_t resolve;
+};
+#define open_how __rep_open_how
+#endif /* ! HAVE_LINUX_OPENAT2_H */
+
+#ifndef HAVE_OPENAT2
+long rep_openat2(int dirfd, const char *pathname,
+                struct open_how *how, size_t size);
+#define openat2(dirfd, pathname, how, size) \
+       rep_openat2(dirfd, pathname, how, size)
+#endif /* !HAVE_OPENAT2 */
+
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/lib/replace/wscript 
new/tdb-1.4.8/lib/replace/wscript
--- old/tdb-1.4.7/lib/replace/wscript   2022-04-12 01:57:37.800320100 +0200
+++ new/tdb-1.4.8/lib/replace/wscript   2023-01-18 16:27:05.368657800 +0100
@@ -31,6 +31,9 @@
 
     conf.env.standalone_replace = conf.IN_LAUNCH_DIR()
 
+    if sys.platform.rfind('linux') > -1:
+        conf.DEFINE('LINUX', '1')
+
     conf.DEFINE('BOOL_DEFINED', 1)
     conf.DEFINE('HAVE_LIBREPLACE', 1)
     conf.DEFINE('LIBREPLACE_NETWORK_CHECKS', 1)
@@ -63,6 +66,7 @@
     conf.CHECK_HEADERS('errno.h')
     conf.CHECK_HEADERS('getopt.h iconv.h')
     conf.CHECK_HEADERS('memory.h nss.h sasl/sasl.h')
+    conf.CHECK_HEADERS('linux/openat2.h')
 
     conf.CHECK_FUNCS_IN('inotify_init', 'inotify', checklibc=True,
                         headers='sys/inotify.h')
@@ -128,6 +132,9 @@
     if conf.CHECK_CFLAGS('-Wno-strict-overflow'):
         conf.define('HAVE_WNO_STRICT_OVERFLOW', '1')
 
+    if conf.CHECK_CFLAGS('-Wuse-after-free=1'):
+        conf.define('HAVE_WUSE_AFTER_FREE_1', '1')
+
     # Check for process set name support
     conf.CHECK_CODE('''
                     #include <sys/prctl.h>
@@ -153,8 +160,7 @@
                     msg='Checking for O_DIRECT flag to open(2)')
 
     conf.CHECK_TYPES('"long long" intptr_t uintptr_t ptrdiff_t 
comparison_fn_t')
-    if not conf.CHECK_TYPE('bool', define='HAVE_BOOL'):
-        if not conf.CHECK_TYPE('_Bool', define='HAVE__Bool'):
+    if not conf.CHECK_TYPE('bool', define='HAVE_BOOL', headers='stdbool.h'):
             raise Errors.WafError('Samba requires a genuine boolean type')
 
     conf.CHECK_TYPE('int8_t', 'char')
@@ -470,7 +476,7 @@
                         execute = True,
                         define = 'HAVE_BSD_STRTOLL',
                         )
-    conf.CHECK_FUNCS('if_nametoindex strerror_r')
+    conf.CHECK_FUNCS('if_nameindex if_nametoindex strerror_r')
     conf.CHECK_FUNCS('syslog')
     conf.CHECK_FUNCS('gai_strerror get_current_dir_name')
     conf.CHECK_FUNCS('timegm getifaddrs freeifaddrs mmap setgroups syscall 
setsid')
@@ -667,7 +673,8 @@
              conf.CONFIG_SET('HAVE_PTHREAD_MUTEX_CONSISTENT_NP'))):
             conf.DEFINE('HAVE_ROBUST_MUTEXES', 1)
 
-    # __thread is available since 2002 in gcc.
+    # __thread is available in Solaris Studio, IBM XL,
+    # gcc, Clang and Intel C Compiler
     conf.CHECK_CODE('''
         __thread int tls;
 
@@ -679,6 +686,9 @@
         addmain=False,
         msg='Checking for __thread local storage')
 
+    if conf.CONFIG_SET('HAVE_PTHREAD') and not 
conf.CONFIG_SET('HAVE___THREAD'):
+        conf.fatal('Missing required TLS support in pthread library')
+
     conf.CHECK_FUNCS_IN('crypt', 'crypt', checklibc=True)
     conf.CHECK_FUNCS_IN('crypt_r', 'crypt', checklibc=True)
     conf.CHECK_FUNCS_IN('crypt_rn', 'crypt', checklibc=True)
@@ -927,9 +937,9 @@
     bld.SAMBA_LIBRARY('replace',
                       source=REPLACE_SOURCE,
                       group='base_libraries',
-                      # FIXME: Ideally symbols should be hidden here so they 
-                      # don't appear in the global namespace when Samba 
-                      # libraries are loaded, but this doesn't appear to work 
+                      # FIXME: Ideally symbols should be hidden here so they
+                      # don't appear in the global namespace when Samba
+                      # libraries are loaded, but this doesn't appear to work
                       # at the moment:
                       # hide_symbols=bld.BUILTIN_LIBRARY('replace'),
                       private_library=True,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/lib/replace/xattr.c 
new/tdb-1.4.8/lib/replace/xattr.c
--- old/tdb-1.4.7/lib/replace/xattr.c   2020-07-09 14:04:50.454105000 +0200
+++ new/tdb-1.4.8/lib/replace/xattr.c   2023-01-18 16:27:05.372657800 +0100
@@ -210,7 +210,8 @@
 static ssize_t bsd_attr_list (int type, extattr_arg arg, char *list, size_t 
size)
 {
        ssize_t list_size, total_size = 0;
-       int i, t, len;
+       int i, len;
+       size_t t;
        char *buf;
        /* Iterate through extattr(2) namespaces */
        for(t = 0; t < ARRAY_SIZE(extattr); t++) {
@@ -266,6 +267,18 @@
 
                for(i = 0; i < list_size; i += len + 1) {
                        len = buf[i];
+
+                       /*
+                        * If for some reason we receive a truncated
+                        * return from call to list xattrs the pascal
+                        * string lengths will not be changed and
+                        * therefore we must check that we're not
+                        * reading garbage data or off end of array
+                        */
+                       if (len + i >= list_size) {
+                               errno = ERANGE;
+                               return -1;
+                       }
                        strncpy(list, extattr[t].name, extattr[t].len + 1);
                        list += extattr[t].len;
                        strncpy(list, buf + i + 1, len);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/update.sh 
new/tdb-1.4.8/third_party/waf/update.sh
--- old/tdb-1.4.7/third_party/waf/update.sh     2022-04-12 01:57:38.360324000 
+0200
+++ new/tdb-1.4.8/third_party/waf/update.sh     2022-08-16 14:27:23.928461300 
+0200
@@ -1,8 +1,8 @@
 #!/bin/bash
 
 if [[ $# -lt 1 ]]; then
-    echo "Usage: update.sh VERSION"
-    exit 1
+       echo "Usage: update.sh VERSION"
+       exit 1
 fi
 
 WAF_VERSION="${1}"
@@ -16,19 +16,21 @@
 echo "WAF SAMBA DIR: ${WAF_SAMBA_DIR}"
 echo "WAF TMP DIR:    ${WAF_TMPDIR}"
 
-cleanup_tmpdir() {
-    popd 2>/dev/null || true
-    rm -rf "$WAF_TMPDIR"
+cleanup_tmpdir()
+{
+       popd 2>/dev/null || true
+       rm -rf "$WAF_TMPDIR"
 }
 trap cleanup_tmpdir SIGINT
 
-cleanup_and_exit() {
-    cleanup_tmpdir
-    if test "$1" = 0 -o -z "$1" ; then
-        exit 0
-    else
-        exit "$1"
-    fi
+cleanup_and_exit()
+{
+       cleanup_tmpdir
+       if test "$1" = 0 -o -z "$1"; then
+               exit 0
+       else
+               exit "$1"
+       fi
 }
 
 # Checkout the git tree
@@ -38,17 +40,16 @@
 git clone "${WAF_GIT}"
 ret=$?
 if [ $ret -ne 0 ]; then
-    echo "ERROR: Failed to clone repository"
-    cleanup_and_exit 1
+       echo "ERROR: Failed to clone repository"
+       cleanup_and_exit 1
 fi
 
-
 pushd waf || cleanup_and_exit 1
 git checkout -b "waf-${WAF_VERSION}" "waf-${WAF_VERSION}"
 ret=$?
 if [ $ret -ne 0 ]; then
-    echo "ERROR: Failed to checkout waf-${WAF_VERSION} repository"
-    cleanup_and_exit 1
+       echo "ERROR: Failed to checkout waf-${WAF_VERSION} repository"
+       cleanup_and_exit 1
 fi
 popd || cleanup_and_exit 1
 
@@ -62,8 +63,8 @@
 rsync -av "${WAF_TMPDIR}/waf/waflib" .
 ret=$?
 if [ $ret -ne 0 ]; then
-    echo "ERROR: Failed copy waflib"
-    cleanup_and_exit 1
+       echo "ERROR: Failed copy waflib"
+       cleanup_and_exit 1
 fi
 chmod -x waflib/Context.py
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/Configure.py 
new/tdb-1.4.8/third_party/waf/waflib/Configure.py
--- old/tdb-1.4.7/third_party/waf/waflib/Configure.py   2022-01-24 
13:18:16.802476000 +0100
+++ new/tdb-1.4.8/third_party/waf/waflib/Configure.py   2023-01-18 
16:27:05.468658400 +0100
@@ -439,7 +439,7 @@
 
        var = kw.get('var', '')
        if not var:
-               var = re.sub(r'[-.]', '_', filename[0].upper())
+               var = re.sub(r'\W', '_', filename[0].upper())
 
        path_list = kw.get('path_list', '')
        if path_list:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/Context.py 
new/tdb-1.4.8/third_party/waf/waflib/Context.py
--- old/tdb-1.4.7/third_party/waf/waflib/Context.py     2022-06-09 
06:23:08.007090800 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/Context.py     2023-01-18 
16:27:05.472658400 +0100
@@ -18,13 +18,13 @@
        import imp
 
 # the following 3 constants are updated on each new release (do not touch)
-HEXVERSION=0x2001800
+HEXVERSION=0x2001900
 """Constant updated on new releases"""
 
-WAFVERSION="2.0.24"
+WAFVERSION="2.0.25"
 """Constant updated on new releases"""
 
-WAFREVISION="1af97c71f5a6756abf36d0f78ed8fd551596d7cb"
+WAFREVISION="2db0b41b2805cd5db3b55476c06b23c1e46d319f"
 """Git revision when the waf version is updated"""
 
 WAFNAME="waf"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/TaskGen.py 
new/tdb-1.4.8/third_party/waf/waflib/TaskGen.py
--- old/tdb-1.4.7/third_party/waf/waflib/TaskGen.py     2022-04-12 
01:57:38.360324000 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/TaskGen.py     2023-01-18 
16:27:05.472658400 +0100
@@ -400,7 +400,7 @@
        Decorator that registers a task generator method that will be executed 
when the
        object attribute ``feature`` contains the corresponding key(s)::
 
-               from waflib.Task import feature
+               from waflib.TaskGen import feature
                @feature('myfeature')
                def myfunction(self):
                        print('that is my feature!')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/Tools/msvc.py 
new/tdb-1.4.8/third_party/waf/waflib/Tools/msvc.py
--- old/tdb-1.4.7/third_party/waf/waflib/Tools/msvc.py  2022-06-09 
06:23:08.007090800 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/Tools/msvc.py  2023-01-18 
16:27:05.472658400 +0100
@@ -111,7 +111,7 @@
 
 class MSVCVersion(object):
        def __init__(self, ver):
-               m = re.search('^(.*)\s+(\d+[.]\d+)', ver)
+               m = re.search(r'^(.*)\s+(\d+[.]\d+)', ver)
                if m:
                        self.name = m.group(1)
                        self.number = float(m.group(2))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/Tools/python.py 
new/tdb-1.4.8/third_party/waf/waflib/Tools/python.py
--- old/tdb-1.4.7/third_party/waf/waflib/Tools/python.py        2022-06-09 
06:23:08.007090800 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/Tools/python.py        2023-01-18 
16:27:05.472658400 +0100
@@ -53,7 +53,17 @@
 Piece of Python code used in :py:class:`waflib.Tools.python.pyo` and 
:py:class:`waflib.Tools.python.pyc` for byte-compiling python files
 """
 
-DISTUTILS_IMP = ['from distutils.sysconfig import get_config_var, 
get_python_lib']
+DISTUTILS_IMP = """
+try:
+       from distutils.sysconfig import get_config_var, get_python_lib
+except ImportError:
+       from sysconfig import get_config_var, get_path
+       def get_python_lib(*k, **kw):
+               keyword='platlib' if kw.get('plat_specific') else 'purelib'
+               if 'prefix' in kw:
+                       return get_path(keyword, vars={'installed_base': 
kw['prefix'], 'platbase': kw['prefix']})
+               return get_path(keyword)
+""".splitlines()
 
 @before_method('process_source')
 @feature('py')
@@ -219,7 +229,7 @@
        try:
                out = self.cmd_and_log(self.env.PYTHON + ['-c', 
'\n'.join(program)], env=os_env)
        except Errors.WafError:
-               self.fatal('The distutils module is unusable: install 
"python-devel"?')
+               self.fatal('Could not run %r' % self.env.PYTHON)
        self.to_log(out)
        return_values = []
        for s in out.splitlines():
@@ -291,7 +301,8 @@
 @conf
 def check_python_headers(conf, features='pyembed pyext'):
        """
-       Check for headers and libraries necessary to extend or embed python by 
using the module *distutils*.
+       Check for headers and libraries necessary to extend or embed python.
+       It may use the module *distutils* or sysconfig in newer Python versions.
        On success the environment variables xxx_PYEXT and xxx_PYEMBED are 
added:
 
        * PYEXT: for compiling python extensions
@@ -439,7 +450,7 @@
                env.LIBPATH_PYEXT = env.LIBPATH_PYEMBED
                env.LIB_PYEXT = env.LIB_PYEMBED
 
-       conf.to_log("Include path for Python extensions (found via distutils 
module): %r\n" % (dct['INCLUDEPY'],))
+       conf.to_log("Found an include path for Python extensions: %r\n" % 
(dct['INCLUDEPY'],))
        env.INCLUDES_PYEXT = [dct['INCLUDEPY']]
        env.INCLUDES_PYEMBED = [dct['INCLUDEPY']]
 
@@ -452,15 +463,21 @@
                env.append_unique('CXXFLAGS_PYEXT', ['-fno-strict-aliasing'])
 
        if env.CC_NAME == "msvc":
-               from distutils.msvccompiler import MSVCCompiler
-               dist_compiler = MSVCCompiler()
-               dist_compiler.initialize()
-               env.append_value('CFLAGS_PYEXT', dist_compiler.compile_options)
-               env.append_value('CXXFLAGS_PYEXT', 
dist_compiler.compile_options)
-               env.append_value('LINKFLAGS_PYEXT', 
dist_compiler.ldflags_shared)
+               try:
+                       from distutils.msvccompiler import MSVCCompiler
+               except ImportError:
+                       # From 
https://github.com/python/cpython/blob/main/Lib/distutils/msvccompiler.py
+                       env.append_value('CFLAGS_PYEXT', [ '/nologo', '/Ox', 
'/MD', '/W3', '/GX', '/DNDEBUG'])
+                       env.append_value('CXXFLAGS_PYEXT', [ '/nologo', '/Ox', 
'/MD', '/W3', '/GX', '/DNDEBUG'])
+                       env.append_value('LINKFLAGS_PYEXT', ['/DLL', '/nologo', 
'/INCREMENTAL:NO'])
+               else:
+                       dist_compiler = MSVCCompiler()
+                       dist_compiler.initialize()
+                       env.append_value('CFLAGS_PYEXT', 
dist_compiler.compile_options)
+                       env.append_value('CXXFLAGS_PYEXT', 
dist_compiler.compile_options)
+                       env.append_value('LINKFLAGS_PYEXT', 
dist_compiler.ldflags_shared)
 
-       # See if it compiles
-       conf.check(header_name='Python.h', define_name='HAVE_PYTHON_H', 
uselib='PYEMBED', fragment=FRAG, errmsg='Distutils not installed? Broken python 
installation? Get python-config now!')
+       conf.check(header_name='Python.h', define_name='HAVE_PYTHON_H', 
uselib='PYEMBED', fragment=FRAG, errmsg='Could not build a Python embedded 
interpreter')
 
 @conf
 def check_python_version(conf, minver=None):
@@ -506,17 +523,9 @@
                else:
                        # Finally, try to guess
                        if Utils.is_win32:
-                               (python_LIBDEST, pydir) = 
conf.get_python_variables(
-                                         ["get_config_var('LIBDEST') or ''",
-                                          "get_python_lib(standard_lib=0) or 
''"])
+                               (pydir,) = 
conf.get_python_variables(["get_python_lib(standard_lib=0) or ''"])
                        else:
-                               python_LIBDEST = None
-                               (pydir,) = conf.get_python_variables( 
["get_python_lib(standard_lib=0, prefix=%r) or ''" % conf.env.PREFIX])
-                       if python_LIBDEST is None:
-                               if conf.env.LIBDIR:
-                                       python_LIBDEST = 
os.path.join(conf.env.LIBDIR, 'python' + pyver)
-                               else:
-                                       python_LIBDEST = 
os.path.join(conf.env.PREFIX, 'lib', 'python' + pyver)
+                               (pydir,) = 
conf.get_python_variables(["get_python_lib(standard_lib=0, prefix=%r) or ''" % 
conf.env.PREFIX])
 
                if 'PYTHONARCHDIR' in conf.env:
                        # Check if --pythonarchdir was specified
@@ -526,7 +535,7 @@
                        pyarchdir = conf.environ['PYTHONARCHDIR']
                else:
                        # Finally, try to guess
-                       (pyarchdir, ) = conf.get_python_variables( 
["get_python_lib(plat_specific=1, standard_lib=0, prefix=%r) or ''" % 
conf.env.PREFIX])
+                       (pyarchdir, ) = 
conf.get_python_variables(["get_python_lib(plat_specific=1, standard_lib=0, 
prefix=%r) or ''" % conf.env.PREFIX])
                        if not pyarchdir:
                                pyarchdir = pydir
 
@@ -585,13 +594,12 @@
                if ret == 'unknown version':
                        conf.fatal('Could not check the %s version' % 
module_name)
 
-               from distutils.version import LooseVersion
                def num(*k):
                        if isinstance(k[0], int):
-                               return LooseVersion('.'.join([str(x) for x in 
k]))
+                               return Utils.loose_version('.'.join([str(x) for 
x in k]))
                        else:
-                               return LooseVersion(k[0])
-               d = {'num': num, 'ver': LooseVersion(ret)}
+                               return Utils.loose_version(k[0])
+               d = {'num': num, 'ver': Utils.loose_version(ret)}
                ev = eval(condition, {}, d)
                if not ev:
                        conf.fatal('The %s version does not satisfy the 
requirements' % module_name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/Utils.py 
new/tdb-1.4.8/third_party/waf/waflib/Utils.py
--- old/tdb-1.4.7/third_party/waf/waflib/Utils.py       2022-04-12 
01:57:38.364324000 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/Utils.py       2023-01-18 
16:27:05.472658400 +0100
@@ -452,6 +452,8 @@
                        pass
                else:
                        if codepage:
+                               if 65001 == codepage and sys.version_info < (3, 
3):
+                                       return 'utf-8'
                                return 'cp%d' % codepage
        return sys.stdout.encoding or ('cp1252' if is_win32 else 'latin-1')
 
@@ -868,6 +870,19 @@
                                return '64'
        return ''
 
+def loose_version(ver_str):
+       # private for the time being!
+       # see #2402
+       lst = re.split(r'([.]|\\d+|[a-zA-Z])', ver_str)
+       ver = []
+       for i, val in enumerate(lst):
+               try:
+                       ver.append(int(val))
+               except ValueError:
+                       if val != '.':
+                               ver.append(val)
+       return ver
+
 def sane_path(p):
        # private function for the time being!
        return os.path.abspath(os.path.expanduser(p))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/extras/cpplint.py 
new/tdb-1.4.8/third_party/waf/waflib/extras/cpplint.py
--- old/tdb-1.4.7/third_party/waf/waflib/extras/cpplint.py      2020-01-21 
15:09:49.025209400 +0100
+++ new/tdb-1.4.8/third_party/waf/waflib/extras/cpplint.py      2023-01-18 
16:27:05.472658400 +0100
@@ -169,7 +169,7 @@
         global critical_errors
         with cpplint_wrapper(get_cpplint_logger(self.env.CPPLINT_OUTPUT), 
self.env.CPPLINT_BREAK, self.env.CPPLINT_OUTPUT):
             params = {key: str(self.env[key]) for key in self.env if 
'CPPLINT_' in key}
-            if params['CPPLINT_OUTPUT'] is 'waf':
+            if params['CPPLINT_OUTPUT'] == 'waf':
                 params['CPPLINT_OUTPUT'] = 'emacs'
             params['CPPLINT'] = self.env.get_flat('CPPLINT')
             cmd = Utils.subst_vars(CPPLINT_STR, params)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/tdb-1.4.7/third_party/waf/waflib/extras/fc_fujitsu.py 
new/tdb-1.4.8/third_party/waf/waflib/extras/fc_fujitsu.py
--- old/tdb-1.4.7/third_party/waf/waflib/extras/fc_fujitsu.py   1970-01-01 
01:00:00.000000000 +0100
+++ new/tdb-1.4.8/third_party/waf/waflib/extras/fc_fujitsu.py   2023-01-18 
16:27:05.472658400 +0100
@@ -0,0 +1,52 @@
+#! /usr/bin/env python
+# encoding: utf-8
+# Detection of the Fujitsu Fortran compiler for ARM64FX
+
+import re
+from waflib.Tools import fc,fc_config,fc_scan
+from waflib.Configure import conf
+from waflib.Tools.compiler_fc import fc_compiler
+fc_compiler['linux'].append('fc_fujitsu')
+
+@conf
+def find_fujitsu(conf):
+       fc=conf.find_program(['frtpx'],var='FC')
+       conf.get_fujitsu_version(fc)
+       conf.env.FC_NAME='FUJITSU'
+       conf.env.FC_MOD_CAPITALIZATION='lower'
+
+@conf
+def fujitsu_flags(conf):
+       v=conf.env
+       v['_FCMODOUTFLAGS']=[]
+       v['FCFLAGS_DEBUG']=[]
+       v['FCFLAGS_fcshlib']=[]
+       v['LINKFLAGS_fcshlib']=[]
+       v['FCSTLIB_MARKER']=''
+       v['FCSHLIB_MARKER']=''
+
+@conf
+def get_fujitsu_version(conf,fc):
+       
version_re=re.compile(r"frtpx\s*\(FRT\)\s*(?P<major>\d+)\.(?P<minor>\d+)\.",re.I).search
+       cmd=fc+['--version']
+       out,err=fc_config.getoutput(conf,cmd,stdin=False)
+       if out:
+               match=version_re(out)
+       else:
+               match=version_re(err)
+       if not match:
+               return(False)
+               conf.fatal('Could not determine the Fujitsu FRT Fortran 
compiler version.')
+       else:
+               k=match.groupdict()
+               conf.env['FC_VERSION']=(k['major'],k['minor'])
+
+def configure(conf):
+       conf.find_fujitsu()
+       conf.find_program('ar',var='AR')
+       conf.add_os_flags('ARFLAGS')
+       if not conf.env.ARFLAGS:
+               conf.env.ARFLAGS=['rcs']
+       conf.fc_flags()
+       conf.fc_add_flags()
+       conf.fujitsu_flags()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/extras/gccdeps.py 
new/tdb-1.4.8/third_party/waf/waflib/extras/gccdeps.py
--- old/tdb-1.4.7/third_party/waf/waflib/extras/gccdeps.py      2022-04-12 
01:57:38.364324000 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/extras/gccdeps.py      2023-01-18 
16:27:05.472658400 +0100
@@ -17,7 +17,7 @@
 
 import os, re, threading
 from waflib import Task, Logs, Utils, Errors
-from waflib.Tools import c_preproc
+from waflib.Tools import asm, c, c_preproc, cxx
 from waflib.TaskGen import before_method, feature
 
 lock = threading.Lock()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/extras/pyqt5.py 
new/tdb-1.4.8/third_party/waf/waflib/extras/pyqt5.py
--- old/tdb-1.4.7/third_party/waf/waflib/extras/pyqt5.py        2020-01-21 
15:09:49.025209400 +0100
+++ new/tdb-1.4.8/third_party/waf/waflib/extras/pyqt5.py        2023-01-18 
16:27:05.472658400 +0100
@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 # encoding: utf-8
-# Federico Pellegrin, 2016-2019 (fedepell) adapted for Python
+# Federico Pellegrin, 2016-2022 (fedepell) adapted for Python
 
 """
 This tool helps with finding Python Qt5 tools and libraries,
@@ -137,7 +137,7 @@
        Processes ``.qrc`` files
        """
        color   = 'BLUE'
-       run_str = '${QT_PYRCC} ${SRC} -o ${TGT}'
+       run_str = '${QT_PYRCC} ${QT_PYRCC_FLAGS} ${SRC} -o ${TGT}'
        ext_out = ['.py']
 
        def rcname(self):
@@ -175,7 +175,7 @@
        Processes ``.ui`` files for python
        """
        color   = 'BLUE'
-       run_str = '${QT_PYUIC} ${SRC} -o ${TGT}'
+       run_str = '${QT_PYUIC} ${QT_PYUIC_FLAGS} ${SRC} -o ${TGT}'
        ext_out = ['.py']
 
 class ts2qm(Task.Task):
@@ -216,17 +216,17 @@
                self.find_program(['pyrcc5'], var='QT_PYRCC')
                self.find_program(['pylupdate5'], var='QT_PYLUPDATE')
        elif getattr(Options.options, 'want_pyside2', True):
-               self.find_program(['pyside2-uic'], var='QT_PYUIC')
-               self.find_program(['pyside2-rcc'], var='QT_PYRCC')
-               self.find_program(['pyside2-lupdate'], var='QT_PYLUPDATE')
+               self.find_program(['pyside2-uic','uic-qt5'], var='QT_PYUIC')
+               self.find_program(['pyside2-rcc','rcc-qt5'], var='QT_PYRCC')
+               self.find_program(['pyside2-lupdate','lupdate-qt5'], 
var='QT_PYLUPDATE')
        elif getattr(Options.options, 'want_pyqt4', True):
                self.find_program(['pyuic4'], var='QT_PYUIC')
                self.find_program(['pyrcc4'], var='QT_PYRCC')
                self.find_program(['pylupdate4'], var='QT_PYLUPDATE')
        else:
-               self.find_program(['pyuic5','pyside2-uic','pyuic4'], 
var='QT_PYUIC')
-               self.find_program(['pyrcc5','pyside2-rcc','pyrcc4'], 
var='QT_PYRCC')
-               self.find_program(['pylupdate5', 
'pyside2-lupdate','pylupdate4'], var='QT_PYLUPDATE')
+               self.find_program(['pyuic5','pyside2-uic','pyuic4','uic-qt5'], 
var='QT_PYUIC')
+               self.find_program(['pyrcc5','pyside2-rcc','pyrcc4','rcc-qt5'], 
var='QT_PYRCC')
+               self.find_program(['pylupdate5', 
'pyside2-lupdate','pylupdate4','lupdate-qt5'], var='QT_PYLUPDATE')
 
        if not env.QT_PYUIC:
                self.fatal('cannot find the uic compiler for python for qt5')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/extras/sphinx.py 
new/tdb-1.4.8/third_party/waf/waflib/extras/sphinx.py
--- old/tdb-1.4.7/third_party/waf/waflib/extras/sphinx.py       2022-01-24 
13:18:16.806475900 +0100
+++ new/tdb-1.4.8/third_party/waf/waflib/extras/sphinx.py       2023-01-18 
16:27:05.472658400 +0100
@@ -1,7 +1,15 @@
 """Support for Sphinx documentation
 
-This is a wrapper for sphinx-build program. Please note that sphinx-build 
supports only one output format which can
-passed to build via sphinx_output_format attribute. The default output format 
is html.
+This is a wrapper for sphinx-build program. Please note that sphinx-build 
supports only
+one output format at a time, but the tool can create multiple tasks to handle 
more.
+The output formats can be passed via the sphinx_output_format, which is an 
array of
+strings. For backwards compatibility if only one output is needed, it can be 
passed
+as a single string.
+The default output format is html.
+
+Specific formats can be installed in different directories by specifying the
+install_path_<FORMAT> attribute. If not defined, the standard install_path
+will be used instead.
 
 Example wscript:
 
@@ -13,7 +21,8 @@
         features='sphinx',
         sphinx_source='sources',  # path to source directory
         sphinx_options='-a -v',  # sphinx-build program additional options
-        sphinx_output_format='man'  # output format of sphinx documentation
+        sphinx_output_format=['html', 'man'],  # output format of sphinx 
documentation
+        install_path_man='${DOCDIR}/man'       # put man pages in a specific 
directory
         )
 
 """
@@ -43,30 +52,36 @@
     if not self.sphinx_source:
         self.bld.fatal('Can\'t find sphinx_source: %r' % self.sphinx_source)
 
+    # In the taskgen we have the complete list of formats
     Utils.def_attrs(self, sphinx_output_format='html')
-    self.env.SPHINX_OUTPUT_FORMAT = self.sphinx_output_format
+    self.sphinx_output_format = Utils.to_list(self.sphinx_output_format)
+
     self.env.SPHINX_OPTIONS = getattr(self, 'sphinx_options', [])
 
     for source_file in self.sphinx_source.ant_glob('**/*'):
         self.bld.add_manual_dependency(self.sphinx_source, source_file)
 
-    sphinx_build_task = self.create_task('SphinxBuildingTask')
-    sphinx_build_task.set_inputs(self.sphinx_source)
-    sphinx_build_task.set_outputs(self.path.get_bld())
-
-    # the sphinx-build results are in <build + output_format> directory
-    self.sphinx_output_directory = 
self.path.get_bld().make_node(self.env.SPHINX_OUTPUT_FORMAT)
-    self.sphinx_output_directory.mkdir()
-    Utils.def_attrs(self, install_path=get_install_path(self))
-
-
-def get_install_path(tg):
-    if tg.env.SPHINX_OUTPUT_FORMAT == 'man':
-        return tg.env.MANDIR
-    elif tg.env.SPHINX_OUTPUT_FORMAT == 'info':
-        return tg.env.INFODIR
+    for cfmt in self.sphinx_output_format:
+        sphinx_build_task = self.create_task('SphinxBuildingTask')
+        sphinx_build_task.set_inputs(self.sphinx_source)
+        # In task we keep the specific format this task is generating
+        sphinx_build_task.env.SPHINX_OUTPUT_FORMAT = cfmt
+
+        # the sphinx-build results are in <build + output_format> directory
+        sphinx_build_task.sphinx_output_directory = 
self.path.get_bld().make_node(cfmt)
+        
sphinx_build_task.set_outputs(sphinx_build_task.sphinx_output_directory)
+        sphinx_build_task.sphinx_output_directory.mkdir()
+
+        Utils.def_attrs(sphinx_build_task, install_path=getattr(self, 
'install_path_' + cfmt, getattr(self, 'install_path', 
get_install_path(sphinx_build_task))))
+
+
+def get_install_path(object):
+    if object.env.SPHINX_OUTPUT_FORMAT == 'man':
+        return object.env.MANDIR
+    elif object.env.SPHINX_OUTPUT_FORMAT == 'info':
+        return object.env.INFODIR
     else:
-        return tg.env.DOCDIR
+        return object.env.DOCDIR
 
 
 class SphinxBuildingTask(Task.Task):
@@ -96,10 +111,10 @@
 
 
     def add_install(self):
-        nodes = self.generator.sphinx_output_directory.ant_glob('**/*', 
quiet=True)
+        nodes = self.sphinx_output_directory.ant_glob('**/*', quiet=True)
         self.outputs += nodes
-        
self.generator.add_install_files(install_to=self.generator.install_path,
+        self.generator.add_install_files(install_to=self.install_path,
                                          install_from=nodes,
                                          postpone=False,
-                                         
cwd=self.generator.sphinx_output_directory,
+                                         
cwd=self.sphinx_output_directory.make_node(self.env.SPHINX_OUTPUT_FORMAT),
                                          relative_trick=True)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/third_party/waf/waflib/extras/wafcache.py 
new/tdb-1.4.8/third_party/waf/waflib/extras/wafcache.py
--- old/tdb-1.4.7/third_party/waf/waflib/extras/wafcache.py     2022-04-12 
01:57:38.364324000 +0200
+++ new/tdb-1.4.8/third_party/waf/waflib/extras/wafcache.py     2023-01-18 
16:27:05.472658400 +0100
@@ -39,7 +39,14 @@
 * WAFCACHE_TRIM_MAX_FOLDER: maximum amount of tasks to cache (1M)
 * WAFCACHE_EVICT_MAX_BYTES: maximum amount of cache size in bytes (10GB)
 * WAFCACHE_EVICT_INTERVAL_MINUTES: minimum time interval to try
-                                   and trim the cache (3 minutess)
+                                   and trim the cache (3 minutes)
+
+Upload specific options:
+* WAFCACHE_ASYNC_WORKERS: define a number of workers to upload results 
asynchronously
+                          this may improve build performance with many/long 
file uploads
+                          the default is unset (synchronous uploads)
+* WAFCACHE_ASYNC_NOWAIT: do not wait for uploads to complete (default: False)
+                         this requires asynchonous uploads to have an effect
 
 Usage::
 
@@ -49,10 +56,10 @@
 
 To troubleshoot::
 
-       waf clean build --zones=wafcache
+       waf clean build --zone=wafcache
 """
 
-import atexit, base64, errno, fcntl, getpass, os, re, shutil, sys, time, 
traceback, urllib3, shlex
+import atexit, base64, errno, fcntl, getpass, os, re, shutil, sys, time, 
threading, traceback, urllib3, shlex
 try:
        import subprocess32 as subprocess
 except ImportError:
@@ -71,6 +78,8 @@
 WAFCACHE_NO_PUSH = 1 if os.environ.get('WAFCACHE_NO_PUSH') else 0
 WAFCACHE_VERBOSITY = 1 if os.environ.get('WAFCACHE_VERBOSITY') else 0
 WAFCACHE_STATS = 1 if os.environ.get('WAFCACHE_STATS') else 0
+WAFCACHE_ASYNC_WORKERS = os.environ.get('WAFCACHE_ASYNC_WORKERS')
+WAFCACHE_ASYNC_NOWAIT = os.environ.get('WAFCACHE_ASYNC_NOWAIT')
 OK = "ok"
 
 re_waf_cmd = re.compile('(?P<src>%{SRC})|(?P<tgt>%{TGT})')
@@ -99,7 +108,9 @@
                self.generator.bld.cache_reqs += 1
 
        files_to = [node.abspath() for node in self.outputs]
-       err = cache_command(ssig, [], files_to)
+       proc = get_process()
+       err = cache_command(proc, ssig, [], files_to)
+       process_pool.append(proc)
        if err.startswith(OK):
                if WAFCACHE_VERBOSITY:
                        Logs.pprint('CYAN', '  Fetched %r from cache' % 
files_to)
@@ -132,23 +143,50 @@
                files_from.append(path)
 
        bld = self.generator.bld
+       old_sig = self.signature()
+
+       for node in self.inputs:
+               try:
+                       del node.ctx.cache_sig[node]
+               except KeyError:
+                       pass
+
+       delattr(self, 'cache_sig')
        sig = self.signature()
-       ssig = Utils.to_hex(self.uid() + sig)
 
-       err = cache_command(ssig, files_from, [])
+       def _async_put_files_cache(bld, ssig, files_from):
+               proc = get_process()
+               if WAFCACHE_ASYNC_WORKERS:
+                       with bld.wafcache_lock:
+                               if bld.wafcache_stop:
+                                       process_pool.append(proc)
+                                       return
+                               bld.wafcache_procs.add(proc)
+
+               err = cache_command(proc, ssig, files_from, [])
+               process_pool.append(proc)
+               if err.startswith(OK):
+                       if WAFCACHE_VERBOSITY:
+                               Logs.pprint('CYAN', '  Successfully uploaded %s 
to cache' % files_from)
+                       else:
+                               Logs.debug('wafcache: Successfully uploaded %r 
to cache', files_from)
+                       if WAFCACHE_STATS:
+                               bld.cache_puts += 1
+               else:
+                       if WAFCACHE_VERBOSITY:
+                               Logs.pprint('RED', '  Error caching step 
results %s: %s' % (files_from, err))
+                       else:
+                               Logs.debug('wafcache: Error caching results %s: 
%s', files_from, err)
 
-       if err.startswith(OK):
-               if WAFCACHE_VERBOSITY:
-                       Logs.pprint('CYAN', '  Successfully uploaded %s to 
cache' % files_from)
+       if old_sig == sig:
+               ssig = Utils.to_hex(self.uid() + sig)
+               if WAFCACHE_ASYNC_WORKERS:
+                       fut = 
bld.wafcache_executor.submit(_async_put_files_cache, bld, ssig, files_from)
+                       bld.wafcache_uploads.append(fut)
                else:
-                       Logs.debug('wafcache: Successfully uploaded %r to 
cache', files_from)
-               if WAFCACHE_STATS:
-                       self.generator.bld.cache_puts += 1
+                       _async_put_files_cache(bld, ssig, files_from)
        else:
-               if WAFCACHE_VERBOSITY:
-                       Logs.pprint('RED', '  Error caching step results %s: 
%s' % (files_from, err))
-               else:
-                       Logs.debug('wafcache: Error caching results %s: %s', 
files_from, err)
+               Logs.debug('wafcache: skipped %r upload due to late input 
modifications %r', self.outputs, self.inputs)
 
        bld.task_sigs[self.uid()] = self.cache_sig
 
@@ -245,19 +283,45 @@
                return subprocess.Popen(cmd, stdout=subprocess.PIPE, 
stdin=subprocess.PIPE, bufsize=0)
 
 def atexit_pool():
-       for k in process_pool:
-               try:
-                       os.kill(k.pid, 9)
-               except OSError:
-                       pass
-               else:
-                       k.wait()
+       for proc in process_pool:
+               proc.kill()
 atexit.register(atexit_pool)
 
 def build(bld):
        """
        Called during the build process to enable file caching
        """
+
+       if WAFCACHE_ASYNC_WORKERS:
+               try:
+                       num_workers = int(WAFCACHE_ASYNC_WORKERS)
+               except ValueError:
+                       Logs.warn('Invalid WAFCACHE_ASYNC_WORKERS specified: 
%r' % WAFCACHE_ASYNC_WORKERS)
+               else:
+                       from concurrent.futures import ThreadPoolExecutor
+                       bld.wafcache_executor = 
ThreadPoolExecutor(max_workers=num_workers)
+                       bld.wafcache_uploads = []
+                       bld.wafcache_procs = set([])
+                       bld.wafcache_stop = False
+                       bld.wafcache_lock = threading.Lock()
+
+               def finalize_upload_async(bld):
+                       if WAFCACHE_ASYNC_NOWAIT:
+                               with bld.wafcache_lock:
+                                       bld.wafcache_stop = True
+
+                               for fut in reversed(bld.wafcache_uploads):
+                                       fut.cancel()
+
+                               for proc in bld.wafcache_procs:
+                                       proc.kill()
+
+                               bld.wafcache_procs.clear()
+                       else:
+                               Logs.pprint('CYAN', '... waiting for wafcache 
uploads to complete (%s uploads)' % len(bld.wafcache_uploads))
+                       bld.wafcache_executor.shutdown(wait=True)
+               bld.add_post_fun(finalize_upload_async)
+
        if WAFCACHE_STATS:
                # Init counter for statistics and hook to print results at the 
end
                bld.cache_reqs = bld.cache_hits = bld.cache_puts = 0
@@ -266,9 +330,8 @@
                        hit_ratio = 0
                        if bld.cache_reqs > 0:
                                hit_ratio = (bld.cache_hits / bld.cache_reqs) * 
100
-                       Logs.pprint('CYAN', '  wafcache stats: requests: %s, 
hits, %s, ratio: %.2f%%, writes %s' %
+                       Logs.pprint('CYAN', '  wafcache stats: %s requests, %s 
hits (ratio: %.2f%%), %s writes' %
                                         (bld.cache_reqs, bld.cache_hits, 
hit_ratio, bld.cache_puts) )
-
                bld.add_post_fun(printstats)
 
        if process_pool:
@@ -286,15 +349,13 @@
        for x in reversed(list(Task.classes.values())):
                make_cached(x)
 
-def cache_command(sig, files_from, files_to):
+def cache_command(proc, sig, files_from, files_to):
        """
        Create a command for cache worker processes, returns a pickled
        base64-encoded tuple containing the task signature, a list of files to
        cache and a list of files files to get from cache (one of the lists
        is assumed to be empty)
        """
-       proc = get_process()
-
        obj = base64.b64encode(cPickle.dumps([sig, files_from, files_to]))
        proc.stdin.write(obj)
        proc.stdin.write('\n'.encode())
@@ -302,7 +363,6 @@
        obj = proc.stdout.readline()
        if not obj:
                raise OSError('Preforked sub-process %r died' % proc.pid)
-       process_pool.append(proc)
        return cPickle.loads(base64.b64decode(obj))
 
 try:
@@ -456,7 +516,10 @@
 class fcache(object):
        def __init__(self):
                if not os.path.exists(CACHE_DIR):
-                       os.makedirs(CACHE_DIR)
+                       try:
+                               os.makedirs(CACHE_DIR)
+                       except OSError:
+                               pass
                if not os.path.exists(CACHE_DIR):
                        raise ValueError('Could not initialize the cache 
directory')
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/tdb-1.4.7/wscript new/tdb-1.4.8/wscript
--- old/tdb-1.4.7/wscript       2022-06-09 06:25:08.387706500 +0200
+++ new/tdb-1.4.8/wscript       2023-01-18 18:37:29.303779800 +0100
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 APPNAME = 'tdb'
-VERSION = '1.4.7'
+VERSION = '1.4.8'
 
 import sys, os
 

Reply via email to