[SCM] Samba Shared Repository - branch master updated

Ralph Böhme slow at samba.org
Wed Apr 24 19:33:02 UTC 2019


The branch, master has been updated
       via  613acd3ddd7 s3-mdssvc: add a comment to mds_init()
       via  003b5d3ee4c s3-mdssvc: make mds_ctx_destructor_cb static
       via  91c9c03435e s3-mdssvc: add missing call to g_cancellable_new()
       via  984c890cd05 s3-mdssvc: use default g_main context
       via  55b2cca14a1 s3-mdssvc: use tevent_glib_glue in mdssvc RPC service
       via  bc053abdd1d s3-mdssvc: call [un]become_authenticated_pipe_user()
       via  675902f8006 s3-mdssvc: add tevent context arg to mds_init_ctx
       via  6592daf56fa s3/lib: tevent-glib-glue test utiltity with Tracker
       via  1f836d4c7fa s3/lib: add a tevent_glib_glue subsystem test
       via  fa39a7b2e6e s3/lib: new tevent_glib_glue subsystem
       via  2f87661c568 s3:wscript: fix flex and bison detection
       via  f52e4020653 s3:wscript: fix flex and bison detection message when not installed
       via  f79acc51a5f s3: build: seperate out check for Gnome Tracker from Spotlight
       via  adbb6e91adf waf: fix array access out of bounds exception in the check for flex
       via  d5166089d69 bootstrap: move flex to common packages
      from  92f30f91e44 waf: build: Respect --disable-python for third_party modules

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 613acd3ddd789290f4a018f6920fc51ed9bac6b2
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Mar 12 15:43:57 2019 +0100

    s3-mdssvc: add a comment to mds_init()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>
    
    Autobuild-User(master): Ralph Böhme <slow at samba.org>
    Autobuild-Date(master): Wed Apr 24 19:32:12 UTC 2019 on sn-devel-184

commit 003b5d3ee4c8a44ad9062fbee4cec45738b5a9bd
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Mar 12 15:29:48 2019 +0100

    s3-mdssvc: make mds_ctx_destructor_cb static
    
    This is only used in this compilation unit.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 91c9c03435e6d0d42d7be69c1effac2a36f296ec
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Mar 12 15:27:25 2019 +0100

    s3-mdssvc: add missing call to g_cancellable_new()
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 984c890cd0561bc016fd327ba7030df4e6b20b45
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Mar 25 16:11:30 2019 +0100

    s3-mdssvc: use default g_main context
    
    Way back when the module was developed it seemed to be necessary the use
    a private context with push/pop as thread default. Maybe there was a bug
    in libtracker-sparql dispatching callback in the wrong (global)
    context. It's not necessary anymore with a recent libtracker-sparql
    version.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 55b2cca14a115a9c13004ec9f59b6b95a2776e78
Author: Ralph Boehme <slow at samba.org>
Date:   Wed Jan 27 13:23:51 2016 +0100

    s3-mdssvc: use tevent_glib_glue in mdssvc RPC service
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit bc053abdd1df343eb4bf0eeff52bebc2dcbd7a30
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Mar 11 18:11:04 2019 +0100

    s3-mdssvc: call [un]become_authenticated_pipe_user()
    
    This ensures we're running as the authenticated user int the tevent
    callback which might be running in an arbitrary impersonation context.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 675902f80068c159af51b004ccded7fb777d1c40
Author: Ralph Boehme <slow at samba.org>
Date:   Wed Jan 27 13:17:04 2016 +0100

    s3-mdssvc: add tevent context arg to mds_init_ctx
    
    This is needed later when adding tevent_glib_glue support, not used for now.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 6592daf56fa1dc6d7e489add54a07d407cbb00c6
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 22 15:38:39 2016 +0100

    s3/lib: tevent-glib-glue test utiltity with Tracker
    
    A small utilitly useful for tesing the tevent_glib_glue code. It runs a
    tracker-sparql search query against your local tracker store that must
    be setup and running.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 1f836d4c7fa5376eb4b45116cb59755e1c363b7f
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 28 08:29:28 2016 +0100

    s3/lib: add a tevent_glib_glue subsystem test
    
    Tests adapted from glib2 glib/tests/mainloop.c.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit fa39a7b2e6e3fd22d234b2c6c53772b08243db9d
Author: Ralph Boehme <slow at samba.org>
Date:   Wed Jan 20 15:08:31 2016 +0100

    s3/lib: new tevent_glib_glue subsystem
    
    tevent_glib_glue_create() takes glib GMainContext and adds its event
    sources to a tevent context. tevent will poll the sources and run
    handlers for pending events as detailed in the glib documentation:
    
    https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit 2f87661c568e33ab4f74e3434ffbb7ec49f03203
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Mar 29 18:40:51 2019 +0100

    s3:wscript: fix flex and bison detection
    
    conf.env['BISON'] and conf.env['FLEX'] return lists.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit f52e4020653a3848efef47424e21481ed18d3935
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Mar 29 18:20:52 2019 +0100

    s3:wscript: fix flex and bison detection message when not installed
    
    If flex or bison are not installed, conf.env['BISON'] and
    conf.env['FLEX'] respectively return an empty string, so
    conf.CHECK_COMMAND() runs
    
     $ /bin/sh -c " --version  | head -n1"
    
    and
    
     $ /bin/sh -c " --version"
    
    which results in the following message
    
      /bin/sh: []: command not found
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit f79acc51a5f45da3936886eaec7b635e70ad4540
Author: Ralph Boehme <slow at samba.org>
Date:   Mon Feb 15 10:42:52 2016 +0100

    s3: build: seperate out check for Gnome Tracker from Spotlight
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit adbb6e91adfaa03c5519f3c7eeaa29fdde991efb
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Mar 29 18:18:27 2019 +0100

    waf: fix array access out of bounds exception in the check for flex
    
    If flex is not installed the following expection is triggered:
    
    Checking for flex
    Checking for program 'flex'                                                       : not found
    Traceback (most recent call last):
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Scripting.py", line 158, in waf_entry_point
        run_commands()
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Scripting.py", line 251, in run_commands
        ctx = run_command(cmd_name)
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Scripting.py", line 235, in run_command
        ctx.execute()
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Configure.py", line 159, in execute
        super(ConfigurationContext, self).execute()
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Context.py", line 204, in execute
        self.recurse([os.path.dirname(g_module.root_path)])
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Context.py", line 286, in recurse
        user_function(self)
      File "/home/slow/git/samba/scratch/wscript", line 307, in configure
        conf.RECURSE('source3')
      File "./buildtools/wafsamba/samba_utils.py", line 66, in fun
        return f(*k, **kw)
      File "./buildtools/wafsamba/samba_utils.py", line 481, in RECURSE
        return ctx.recurse(relpath)
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Context.py", line 286, in recurse
        user_function(self)
      File "/home/slow/git/samba/scratch/source3/wscript", line 1660, in configure
        flex.configure(conf)
      File "/home/slow/git/samba/scratch/third_party/waf/waflib/Tools/flex.py", line 59, in configure
        if re.search (r"\\msys\\[0-9.]+\\bin\\flex.exe$", conf.env.FLEX[0]):
    IndexError: list index out of range
    
    This happens because when the detection of flex fails, an excpetion is
    thrown in Configure.py:find_program by calling self.fatal(), but as
    Configure.py:find_program() is called from
    samba_waf18.py:find_program_samba() which sets the keyword argument
    mandatory=False, Configure.py:conf:fun() catches the expection.
    
    As a result in flex.py the call to conf.find_program('flex', var='FLEX')
    does not abort and
    
      if re.search (r"\\msys\\[0-9.]+\\bin\\flex.exe$", conf.env.FLEX[0])
    
    is executed even though conf.env.FLEX is None.
    
    As this is a not a problem of upstream Samba, but triggered by our
    samba_waf18.py:find_program_samba(), I don't pursue an upstream
    fix. Instead, just use conf.find_program() directly instead of the
    wrapper in flex.py.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Noel Power <npower at samba.org>

commit d5166089d6960379872d864e74eb4e1cf177cdd1
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Apr 19 11:04:58 2019 +0200

    bootstrap: move flex to common packages
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Andrew Bartlett <abartlet at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 .gitlab-ci.yml                                     |   2 +-
 bootstrap/config.py                                |   2 +-
 bootstrap/generated-dists/centos6/bootstrap.sh     |   1 +
 bootstrap/generated-dists/centos6/packages.yml     |   1 +
 bootstrap/generated-dists/centos7/bootstrap.sh     |   1 +
 bootstrap/generated-dists/centos7/packages.yml     |   1 +
 bootstrap/generated-dists/fedora28/bootstrap.sh    |   1 +
 bootstrap/generated-dists/fedora28/packages.yml    |   1 +
 bootstrap/generated-dists/fedora29/bootstrap.sh    |   1 +
 bootstrap/generated-dists/fedora29/packages.yml    |   1 +
 bootstrap/generated-dists/opensuse150/bootstrap.sh |   1 +
 bootstrap/generated-dists/opensuse150/packages.yml |   1 +
 bootstrap/sha1sum.txt                              |   2 +-
 source3/lib/tevent_glib_glue.c                     | 883 +++++++++++++++++++++
 source3/lib/tevent_glib_glue.h                     |  68 ++
 source3/lib/tevent_glib_glue_tests.c               | 397 +++++++++
 source3/rpc_server/mdssvc/mdssvc.c                 | 279 +++----
 source3/rpc_server/mdssvc/mdssvc.h                 |  16 +-
 source3/rpc_server/mdssvc/srv_mdssvc_nt.c          |   6 +-
 source3/rpc_server/wscript_build                   |   4 +-
 source3/script/tests/test_tevent_glib_glue.sh      |  21 +
 source3/selftest/tests.py                          |   3 +
 source3/utils/async-tracker.c                      | 288 +++++++
 source3/wscript                                    |  71 +-
 source3/wscript_build                              |  26 +
 25 files changed, 1879 insertions(+), 199 deletions(-)
 create mode 100644 source3/lib/tevent_glib_glue.c
 create mode 100644 source3/lib/tevent_glib_glue.h
 create mode 100644 source3/lib/tevent_glib_glue_tests.c
 create mode 100755 source3/script/tests/test_tevent_glib_glue.sh
 create mode 100644 source3/utils/async-tracker.c


Changeset truncated at 500 lines:

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9d596372df8..e43000548ca 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,7 +19,7 @@ variables:
   # Set this to the contents of bootstrap/sha1sum.txt
   # which is generated by bootstrap/template.py --render
   #
-  SAMBA_CI_CONTAINER_TAG: 8606e89b0ce6a916fa881549a6cebf6eed528157
+  SAMBA_CI_CONTAINER_TAG: 5c2b831fb6aef8abd25dbdc6ade53ba2ebad1a1c
   #
   # The following images are available
   # Please see the samba-o3 sections at the end of this file!
diff --git a/bootstrap/config.py b/bootstrap/config.py
index 8d85dce1e83..d8bb7cf9654 100644
--- a/bootstrap/config.py
+++ b/bootstrap/config.py
@@ -37,6 +37,7 @@ COMMON = [
     'binutils',
     'bison',
     'curl',
+    'flex',
     'gcc',
     'gdb',
     'git',
@@ -163,7 +164,6 @@ PKGS = [
     # rpm has no pkg for docbook-xml
     ('docbook-xml', 'docbook-dtds'),
     ('docbook-xsl', 'docbook-style-xsl'),
-    ('flex', ''),
     ('', 'keyutils-libs-devel'),
     ('', 'which'),
 ]
diff --git a/bootstrap/generated-dists/centos6/bootstrap.sh b/bootstrap/generated-dists/centos6/bootstrap.sh
index 2ac905ddda7..be21d8bec69 100755
--- a/bootstrap/generated-dists/centos6/bootstrap.sh
+++ b/bootstrap/generated-dists/centos6/bootstrap.sh
@@ -25,6 +25,7 @@ yum -y -q --verbose install \
     dbus-devel \
     docbook-dtds \
     docbook-style-xsl \
+    flex \
     gawk \
     gcc \
     gdb \
diff --git a/bootstrap/generated-dists/centos6/packages.yml b/bootstrap/generated-dists/centos6/packages.yml
index 344d88a5d2a..c7953bd60f9 100644
--- a/bootstrap/generated-dists/centos6/packages.yml
+++ b/bootstrap/generated-dists/centos6/packages.yml
@@ -13,6 +13,7 @@ packages:
   - dbus-devel
   - docbook-dtds
   - docbook-style-xsl
+  - flex
   - gawk
   - gcc
   - gdb
diff --git a/bootstrap/generated-dists/centos7/bootstrap.sh b/bootstrap/generated-dists/centos7/bootstrap.sh
index 90dcbd19566..08a11b7ee93 100755
--- a/bootstrap/generated-dists/centos7/bootstrap.sh
+++ b/bootstrap/generated-dists/centos7/bootstrap.sh
@@ -25,6 +25,7 @@ yum -y -q --verbose install \
     dbus-devel \
     docbook-dtds \
     docbook-style-xsl \
+    flex \
     gawk \
     gcc \
     gdb \
diff --git a/bootstrap/generated-dists/centos7/packages.yml b/bootstrap/generated-dists/centos7/packages.yml
index d5048a71d77..c3bbe7ba4a6 100644
--- a/bootstrap/generated-dists/centos7/packages.yml
+++ b/bootstrap/generated-dists/centos7/packages.yml
@@ -13,6 +13,7 @@ packages:
   - dbus-devel
   - docbook-dtds
   - docbook-style-xsl
+  - flex
   - gawk
   - gcc
   - gdb
diff --git a/bootstrap/generated-dists/fedora28/bootstrap.sh b/bootstrap/generated-dists/fedora28/bootstrap.sh
index ec1fdff902a..6793a37b8c9 100755
--- a/bootstrap/generated-dists/fedora28/bootstrap.sh
+++ b/bootstrap/generated-dists/fedora28/bootstrap.sh
@@ -23,6 +23,7 @@ dnf -y -q --verbose install \
     dbus-devel \
     docbook-dtds \
     docbook-style-xsl \
+    flex \
     gawk \
     gcc \
     gdb \
diff --git a/bootstrap/generated-dists/fedora28/packages.yml b/bootstrap/generated-dists/fedora28/packages.yml
index 40cc9e74abb..a37f78b33d2 100644
--- a/bootstrap/generated-dists/fedora28/packages.yml
+++ b/bootstrap/generated-dists/fedora28/packages.yml
@@ -13,6 +13,7 @@ packages:
   - dbus-devel
   - docbook-dtds
   - docbook-style-xsl
+  - flex
   - gawk
   - gcc
   - gdb
diff --git a/bootstrap/generated-dists/fedora29/bootstrap.sh b/bootstrap/generated-dists/fedora29/bootstrap.sh
index ec1fdff902a..6793a37b8c9 100755
--- a/bootstrap/generated-dists/fedora29/bootstrap.sh
+++ b/bootstrap/generated-dists/fedora29/bootstrap.sh
@@ -23,6 +23,7 @@ dnf -y -q --verbose install \
     dbus-devel \
     docbook-dtds \
     docbook-style-xsl \
+    flex \
     gawk \
     gcc \
     gdb \
diff --git a/bootstrap/generated-dists/fedora29/packages.yml b/bootstrap/generated-dists/fedora29/packages.yml
index 40cc9e74abb..a37f78b33d2 100644
--- a/bootstrap/generated-dists/fedora29/packages.yml
+++ b/bootstrap/generated-dists/fedora29/packages.yml
@@ -13,6 +13,7 @@ packages:
   - dbus-devel
   - docbook-dtds
   - docbook-style-xsl
+  - flex
   - gawk
   - gcc
   - gdb
diff --git a/bootstrap/generated-dists/opensuse150/bootstrap.sh b/bootstrap/generated-dists/opensuse150/bootstrap.sh
index 06f3ca67fed..dbf7dabf55a 100755
--- a/bootstrap/generated-dists/opensuse150/bootstrap.sh
+++ b/bootstrap/generated-dists/opensuse150/bootstrap.sh
@@ -22,6 +22,7 @@ zypper --non-interactive install \
     dbus-1-devel \
     docbook-dtds \
     docbook-xsl-stylesheets \
+    flex \
     gawk \
     gcc \
     gdb \
diff --git a/bootstrap/generated-dists/opensuse150/packages.yml b/bootstrap/generated-dists/opensuse150/packages.yml
index 415384721c3..a6c989ffebd 100644
--- a/bootstrap/generated-dists/opensuse150/packages.yml
+++ b/bootstrap/generated-dists/opensuse150/packages.yml
@@ -12,6 +12,7 @@ packages:
   - dbus-1-devel
   - docbook-dtds
   - docbook-xsl-stylesheets
+  - flex
   - gawk
   - gcc
   - gdb
diff --git a/bootstrap/sha1sum.txt b/bootstrap/sha1sum.txt
index dad5a55516e..d7dbdaee084 100644
--- a/bootstrap/sha1sum.txt
+++ b/bootstrap/sha1sum.txt
@@ -1 +1 @@
-8606e89b0ce6a916fa881549a6cebf6eed528157
+5c2b831fb6aef8abd25dbdc6ade53ba2ebad1a1c
diff --git a/source3/lib/tevent_glib_glue.c b/source3/lib/tevent_glib_glue.c
new file mode 100644
index 00000000000..b83f2036d9a
--- /dev/null
+++ b/source3/lib/tevent_glib_glue.c
@@ -0,0 +1,883 @@
+/*
+   Unix SMB/CIFS implementation.
+   Integration of a glib g_main_context into a tevent_context
+   Copyright (C) Stefan Metzmacher 2016
+   Copyright (C) Ralph Boehme 2016
+
+     ** NOTE! The following LGPL license applies to the tevent
+     ** library. This does NOT imply that all of Samba is released
+     ** under the LGPL
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 3 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "replace.h"
+#include "system/filesys.h"
+#include "lib/util/debug.h"
+#include "lib/util/select.h"
+#include <tevent.h>
+
+#undef DBGC_CLASS
+#define DBGC_CLASS DBGC_TEVENT
+
+#ifdef HAVE_GLIB
+#include <glib.h>
+#include "tevent_glib_glue.h"
+
+struct fd_map {
+	struct tevent_glib_glue *glue;
+	int fd;
+	struct tevent_fd *fd_event;
+};
+
+struct tevent_glib_glue {
+	/*
+	 * The tevent context we're feeding.
+	 */
+	struct tevent_context *ev;
+
+	/*
+	 * The glib gmain context we're polling and whether we're currently
+	 * owning it by virtue of g_main_context_acquire().
+	 */
+	GMainContext *gmain_ctx;
+	bool gmain_owner;
+
+	/*
+	 * Set by samba_tevent_glib_glue_quit().
+	 */
+	bool quit;
+
+	/*
+	 * tevent trace callback and data we got from tevent_get_trace_callback()
+	 * before installing our own trace callback.
+	 */
+	tevent_trace_callback_t prev_tevent_trace_cb;
+	void *prev_tevent_trace_data;
+
+	/*
+	 * Don't call tevent_glib_prepare() in the tevent tracepoint handler if
+	 * explicity told so. This is an optimisation for the case that glib
+	 * event sources are created from glib event callbacks.
+	 */
+	bool skip_glib_refresh;
+
+	/*
+	 * Used when acquiring the glib gmain context failed.
+	 */
+	struct tevent_timer *acquire_retry_timer;
+
+	/*
+	 * glib gmain context timeout and priority for the current event look
+	 * iteration. gtimeout is translated to a tevent timer event, unless it
+	 * is 0 which signals some event source is pending. In that case we
+	 * dispatch an immediate event. gpriority is ignored by us, just passed
+	 * to the glib relevant functions.
+	 */
+	gint gtimeout;
+	gint gpriority;
+	struct tevent_timer *timer;
+	struct tevent_immediate *im;
+	bool scheduled_im;
+
+	/*
+	 * glib gmain context fds returned from g_main_context_query(). These
+	 * get translated to tevent fd events.
+	 */
+	GPollFD *gpollfds;
+	gint num_gpollfds;
+
+	/*
+	 * A copy of gpollfds and num_gpollfds from the previous event loop
+	 * iteration, used to detect changes in the set of fds.
+	 */
+	GPollFD *prev_gpollfds;
+	gint num_prev_gpollfds;
+
+	/*
+	 * An array of pointers to fd_map's. The fd_map'd contain the tevent
+	 * event fd as well as a pointer to the corresponding glib GPollFD.
+	 */
+	struct fd_map **fd_map;
+	size_t num_maps;
+};
+
+static bool tevent_glib_prepare(struct tevent_glib_glue *glue);
+static bool tevent_glib_process(struct tevent_glib_glue *glue);
+static bool tevent_glib_glue_reinit(struct tevent_glib_glue *glue);
+static void tevent_glib_fd_handler(struct tevent_context *ev,
+				   struct tevent_fd *fde,
+				   uint16_t flags,
+				   void *private_data);
+
+typedef int (*gfds_cmp_cb)(const void *fd1, const void *fd2);
+typedef bool (*gfds_found_cb)(struct tevent_glib_glue *glue,
+			      const GPollFD *new,
+			      const GPollFD *old);
+typedef bool (*gfds_new_cb)(struct tevent_glib_glue *glue,
+			    const GPollFD *fd);
+typedef bool (*gfds_removed_cb)(struct tevent_glib_glue *glue,
+				const GPollFD *fd);
+
+/**
+ * Compare two sorted GPollFD arrays
+ *
+ * For every element that exists in gfds and prev_gfds found_fn() is called.
+ * For every element in gfds but not in prev_gfds, new_fn() is called.
+ * For every element in prev_gfds but not in gfds removed_fn() is called.
+ **/
+static bool cmp_gfds(struct tevent_glib_glue *glue,
+		     GPollFD *gfds,
+		     GPollFD *prev_gfds,
+		     size_t num_gfds,
+		     size_t num_prev_gfds,
+		     gfds_cmp_cb cmp_cb,
+		     gfds_found_cb found_cb,
+		     gfds_new_cb new_cb,
+		     gfds_removed_cb removed_cb)
+{
+	bool ok;
+	size_t i = 0, j = 0;
+	int cmp;
+
+	while (i < num_gfds && j < num_prev_gfds) {
+		cmp = cmp_cb(&gfds[i], &prev_gfds[j]);
+		if (cmp == 0) {
+			ok = found_cb(glue, &gfds[i], &prev_gfds[j]);
+			if (!ok) {
+				return false;
+			}
+			i++;
+			j++;
+		} else if (cmp < 0) {
+			ok = new_cb(glue, &gfds[i]);
+			if (!ok) {
+				return false;
+			}
+			i++;
+		} else {
+			ok = removed_cb(glue, &prev_gfds[j]);
+			if (!ok) {
+				return false;
+			}
+			j++;
+		}
+	}
+
+	while (i < num_gfds) {
+		ok = new_cb(glue, &gfds[i++]);
+		if (!ok) {
+			return false;
+		}
+	}
+
+	while (j < num_prev_gfds) {
+		ok = removed_cb(glue, &prev_gfds[j++]);
+		if (!ok) {
+			return false;
+		}
+	}
+
+	return true;
+}
+
+static int glib_fd_cmp_func(const void *p1, const void *p2)
+{
+	const GPollFD *lhs = p1;
+	const GPollFD *rhs = p2;
+
+	if (lhs->fd < rhs->fd) {
+		return -1;
+	} else if (lhs->fd > rhs->fd) {
+		return 1;
+	}
+
+	return 0;
+}
+
+/*
+ * We already have a tevent fd event for the glib GPollFD, but we may have to
+ * update flags.
+ */
+static bool match_gfd_cb(struct tevent_glib_glue *glue,
+			 const GPollFD *new_gfd,
+			 const GPollFD *old_gfd)
+{
+	size_t i;
+	struct fd_map *fd_map = NULL;
+	struct tevent_fd *fd_event = NULL;
+
+	if (new_gfd->events == old_gfd->events) {
+		return true;
+	}
+
+	for (i = 0; i < glue->num_maps; i++) {
+		if (glue->fd_map[i]->fd == new_gfd->fd) {
+			break;
+		}
+	}
+
+	if (i == glue->num_maps) {
+		DBG_ERR("match_gfd_cb: glib fd %d not in map\n", new_gfd->fd);
+		return false;
+	}
+
+	fd_map = glue->fd_map[i];
+	if (fd_map == NULL) {
+		DBG_ERR("fd_map for fd %d is NULL\n", new_gfd->fd);
+		return false;
+	}
+
+	fd_event = fd_map->fd_event;
+	if (fd_event == NULL) {
+		DBG_ERR("fd_event for fd %d is NULL\n", new_gfd->fd);
+		return false;
+	}
+
+	tevent_fd_set_flags(fd_event, 0);
+
+	if (new_gfd->events & (G_IO_IN | G_IO_HUP | G_IO_ERR)) {
+		TEVENT_FD_READABLE(fd_event);
+	}
+	if (new_gfd->events & G_IO_OUT) {
+		TEVENT_FD_WRITEABLE(fd_event);
+	}
+
+	return true;
+}
+
+static bool new_gfd_cb(struct tevent_glib_glue *glue, const GPollFD *gfd)
+{
+	struct tevent_fd *fd_event = NULL;
+	struct fd_map *fd_map = NULL;
+	uint16_t events = 0;
+	bool revent;
+	bool wevent;
+
+	revent = (gfd->events & (G_IO_IN | G_IO_HUP | G_IO_ERR));
+	wevent = (gfd->events & G_IO_OUT);
+	if (revent) {
+		events |= TEVENT_FD_READ;
+	}
+	if (wevent) {
+		events |= TEVENT_FD_WRITE;
+	}
+
+	glue->fd_map = talloc_realloc(glue,
+				      glue->fd_map,
+				      struct fd_map *,
+				      glue->num_maps + 1);
+	if (glue->fd_map == NULL) {
+		DBG_ERR("talloc_realloc failed\n");
+		return false;
+	}
+	fd_map = talloc_zero(glue->fd_map, struct fd_map);
+	if (fd_map == NULL) {
+		DBG_ERR("talloc_realloc failed\n");
+		return false;
+	}
+	glue->fd_map[glue->num_maps] = fd_map;
+	glue->num_maps++;
+
+	fd_event = tevent_add_fd(glue->ev,
+				 glue->fd_map,
+				 gfd->fd,
+				 events,
+				 tevent_glib_fd_handler,
+				 fd_map);
+	if (fd_event == NULL) {
+		DBG_ERR("tevent_add_fd failed\n");
+		return false;
+	}
+
+	*fd_map = (struct fd_map) {
+		.glue = glue,
+		.fd = gfd->fd,
+		.fd_event = fd_event,
+	};
+
+	DBG_DEBUG("added tevent_fd for glib fd %d\n", gfd->fd);
+
+	return true;
+}
+
+static bool remove_gfd_cb(struct tevent_glib_glue *glue, const GPollFD *gfd)
+{
+	size_t i;
+
+	for (i = 0; i < glue->num_maps; i++) {
+		if (glue->fd_map[i]->fd == gfd->fd) {
+			break;
+		}
+	}
+
+	if (i == glue->num_maps) {
+		DBG_ERR("remove_gfd_cb: glib fd %d not in map\n", gfd->fd);
+		return false;
+	}
+
+	TALLOC_FREE(glue->fd_map[i]->fd_event);
+	TALLOC_FREE(glue->fd_map[i]);
+
+	if (i + 1 < glue->num_maps) {
+		memmove(&glue->fd_map[i],


-- 
Samba Shared Repository



More information about the samba-cvs mailing list