summaryrefslogtreecommitdiff
path: root/source4/lib/events
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2008-05-18 17:35:16 +0200
committerJelmer Vernooij <jelmer@samba.org>2008-05-18 17:35:16 +0200
commit4911af47f8cd750f9b0f1374b447f171318de964 (patch)
treea28fdd6e18a560b10fa52e40cec9b9f2709b46fe /source4/lib/events
parentd648c5849fba34b5691dcf1867ecd8f80fe35a6d (diff)
parent250478d0445cf56e8b0b4e876977a9ae968ff55b (diff)
downloadsamba-4911af47f8cd750f9b0f1374b447f171318de964.tar.gz
samba-4911af47f8cd750f9b0f1374b447f171318de964.tar.bz2
samba-4911af47f8cd750f9b0f1374b447f171318de964.zip
Merge branch 'v4-0-test' of ssh://git.samba.org/data/git/samba into v4-0-test
(This used to be commit 16dbbf75c7fa0f877659654a20bcab73b707e627)
Diffstat (limited to 'source4/lib/events')
-rw-r--r--source4/lib/events/Makefile.in66
-rwxr-xr-xsource4/lib/events/autogen.sh17
-rw-r--r--source4/lib/events/config.mk11
-rw-r--r--source4/lib/events/configure.ac35
-rw-r--r--source4/lib/events/events.c14
-rw-r--r--source4/lib/events/events.i2
-rw-r--r--source4/lib/events/events.mk59
-rw-r--r--source4/lib/events/events.pc.in11
-rw-r--r--source4/lib/events/events_epoll.c15
-rw-r--r--source4/lib/events/events_select.c13
-rw-r--r--source4/lib/events/events_signal.c13
-rw-r--r--source4/lib/events/events_standard.c11
-rw-r--r--source4/lib/events/events_timed.c11
-rw-r--r--source4/lib/events/events_util.c129
-rw-r--r--source4/lib/events/events_util.h123
-rw-r--r--source4/lib/events/events_wrap.c2
-rw-r--r--source4/lib/events/libevents.m421
17 files changed, 527 insertions, 26 deletions
diff --git a/source4/lib/events/Makefile.in b/source4/lib/events/Makefile.in
new file mode 100644
index 0000000000..0a0df9bef9
--- /dev/null
+++ b/source4/lib/events/Makefile.in
@@ -0,0 +1,66 @@
+#!gmake
+#
+# Makefile for tdb directory
+#
+
+CC = @CC@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+includedir = @includedir@
+libdir = @libdir@
+VPATH = @srcdir@:@tallocdir@:@libreplacedir@
+srcdir = @srcdir@
+builddir = @builddir@
+CPPFLAGS = @CPPFLAGS@ -I$(srcdir)/include -Iinclude -I.
+LDFLAGS = @LDFLAGS@
+EXEEXT = @EXEEXT@
+SHLD = @SHLD@
+SHLD_FLAGS = @SHLD_FLAGS@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PICFLAG = @PICFLAG@
+SHLIBEXT = @SHLIBEXT@
+SWIG = swig
+PYTHON = @PYTHON@
+PYTHON_CONFIG = @PYTHON_CONFIG@
+PYTHON_BUILD_TARGET = @PYTHON_BUILD_TARGET@
+PYTHON_INSTALL_TARGET = @PYTHON_INSTALL_TARGET@
+PYTHON_CHECK_TARGET = @PYTHON_CHECK_TARGET@
+LIB_PATH_VAR = @LIB_PATH_VAR@
+eventsdir = @eventsdir@
+tallocdir = @tallocdir@
+
+TALLOC_LIBS = @TALLOC_LIBS@
+TALLOC_CFLAGS = @TALLOC_CFLAGS@
+TALLOC_OBJ = @TALLOC_OBJ@
+
+CFLAGS = $(CPPFLAGS) $(TALLOC_CFLAGS) @CFLAGS@
+
+EVENTS_OBJ = @EVENTS_OBJ@ $(TALLOC_OBJ) @LIBREPLACEOBJ@
+
+default: all
+
+include $(eventsdir)/events.mk
+include $(eventsdir)/rules.mk
+
+all:: showflags dirs $(PROGS) $(LIBEVENTS_SOLIB) libevents.a $(PYTHON_BUILD_TARGET)
+
+install:: all
+$(LIBEVENTS_SOLIB): $(EVENTS_OBJ)
+ $(SHLD) $(SHLD_FLAGS) -o $@ $(EVENTS_OBJ) $(TALLOC_LIBS) @SONAMEFLAG@$(LIBEVENTS_SONAME)
+
+check: test
+
+test:: $(PYTHON_CHECK_TARGET)
+installcheck:: test install
+
+clean::
+ rm -f *.o *.a */*.o
+ rm -f $(TALLOC_OBJ)
+
+distclean:: clean
+ rm -f config.log config.status include/config.h config.cache
+ rm -f Makefile
+
+realdistclean:: distclean
+ rm -f configure include/config.h.in
diff --git a/source4/lib/events/autogen.sh b/source4/lib/events/autogen.sh
new file mode 100755
index 0000000000..b13a4b685d
--- /dev/null
+++ b/source4/lib/events/autogen.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+rm -rf autom4te.cache
+rm -f configure config.h.in
+
+IPATHS="-I libreplace -I lib/replace -I ../libreplace -I ../replace"
+IPATHS="$IPATHS -I lib/talloc -I talloc -I ../talloc"
+autoconf $IPATHS || exit 1
+autoheader $IPATHS || exit 1
+
+rm -rf autom4te.cache
+
+swig -O -Wall -python -keyword events.i # Ignore errors for now
+
+echo "Now run ./configure and then make."
+exit 0
+
diff --git a/source4/lib/events/config.mk b/source4/lib/events/config.mk
index 058ce7f793..34c24f76f5 100644
--- a/source4/lib/events/config.mk
+++ b/source4/lib/events/config.mk
@@ -1,3 +1,13 @@
+################################################
+# Start SUBSYSTEM LIBEVENTS
+[LIBRARY::LIBEVENTS]
+PUBLIC_DEPENDENCIES = LIBTALLOC
+OUTPUT_TYPE = STATIC_LIBRARY
+CFLAGS = -Ilib/events
+#
+# End SUBSYSTEM LIBEVENTS
+################################################
+
##############################
[MODULE::EVENTS_AIO]
PRIVATE_DEPENDENCIES = LIBAIO_LINUX
@@ -34,7 +44,6 @@ EVENTS_STANDARD_OBJ_FILES = lib/events/events_standard.o
##############################
# Start SUBSYSTEM LIBEVENTS
[SUBSYSTEM::LIBEVENTS]
-PUBLIC_DEPENDENCIES = LIBTALLOC LIBSAMBA-UTIL
# End SUBSYSTEM LIBEVENTS
##############################
diff --git a/source4/lib/events/configure.ac b/source4/lib/events/configure.ac
new file mode 100644
index 0000000000..4eb3575aac
--- /dev/null
+++ b/source4/lib/events/configure.ac
@@ -0,0 +1,35 @@
+AC_PREREQ(2.50)
+AC_DEFUN([SMB_MODULE_DEFAULT], [echo -n ""])
+AC_DEFUN([SMB_LIBRARY_ENABLE], [echo -n ""])
+AC_DEFUN([SMB_ENABLE], [echo -n ""])
+AC_INIT(events, 1.0.0)
+AC_CONFIG_SRCDIR([events.c])
+AC_CONFIG_HEADER(config.h)
+AC_LIBREPLACE_ALL_CHECKS
+AC_LIBREPLACE_NETWORK_CHECKS
+
+m4_include(libtalloc.m4)
+
+AC_LD_EXPORT_DYNAMIC
+AC_LD_SONAMEFLAG
+AC_LD_PICFLAG
+AC_LD_SHLIBEXT
+AC_LIBREPLACE_SHLD
+AC_LIBREPLACE_SHLD_FLAGS
+AC_LIBREPLACE_RUNTIME_LIB_PATH_VAR
+m4_include(libevents.m4)
+AC_PATH_PROGS([PYTHON_CONFIG], [python2.6-config python2.5-config python2.4-config python-config])
+AC_PATH_PROGS([PYTHON], [python2.6 python2.5 python2.4 python])
+
+PYTHON_BUILD_TARGET="build-python"
+PYTHON_INSTALL_TARGET="install-python"
+PYTHON_CHECK_TARGET="check-python"
+AC_SUBST(PYTHON_BUILD_TARGET)
+AC_SUBST(PYTHON_INSTALL_TARGET)
+AC_SUBST(PYTHON_CHECK_TARGET)
+if test -z "$PYTHON_CONFIG"; then
+ PYTHON_BUILD_TARGET=""
+ PYTHON_INSTALL_TARGET=""
+ PYTHON_CHECK_TARGET=""
+fi
+AC_OUTPUT(Makefile events.pc)
diff --git a/source4/lib/events/events.c b/source4/lib/events/events.c
index 6f45db512a..ccc62b4c83 100644
--- a/source4/lib/events/events.c
+++ b/source4/lib/events/events.c
@@ -52,12 +52,16 @@
forever.
*/
-
+#if _SAMBA_BUILD_
#include "includes.h"
-#include "lib/events/events.h"
-#include "lib/events/events_internal.h"
#include "lib/util/dlinklist.h"
#include "param/param.h"
+#else
+#include "replace.h"
+#include "events_util.h"
+#endif
+#include "events.h"
+#include "events_internal.h"
struct event_ops_list {
struct event_ops_list *next, *prev;
@@ -204,6 +208,8 @@ struct event_context *event_context_init_byname(TALLOC_CTX *mem_ctx, const char
*/
struct event_context *event_context_init(TALLOC_CTX *mem_ctx)
{
+ DEBUG(0, ("New event context requested. Parent: [%s:%p]\n",
+ mem_ctx?talloc_get_name(mem_ctx):"NULL", mem_ctx));
return event_context_init_byname(mem_ctx, NULL);
}
@@ -283,7 +289,7 @@ struct signal_event *event_add_signal(struct event_context *ev, TALLOC_CTX *mem_
/*
do a single event loop using the events defined in ev
*/
-_PUBLIC_ int event_loop_once(struct event_context *ev)
+int event_loop_once(struct event_context *ev)
{
return ev->ops->loop_once(ev);
}
diff --git a/source4/lib/events/events.i b/source4/lib/events/events.i
index 263605b176..c16d482efc 100644
--- a/source4/lib/events/events.i
+++ b/source4/lib/events/events.i
@@ -21,7 +21,7 @@
%import "../talloc/talloc.i";
%{
-#include "lib/events/events.h"
+#include "events.h"
typedef struct event_context event;
%}
diff --git a/source4/lib/events/events.mk b/source4/lib/events/events.mk
new file mode 100644
index 0000000000..64d3fcb9fd
--- /dev/null
+++ b/source4/lib/events/events.mk
@@ -0,0 +1,59 @@
+dirs::
+ @mkdir -p lib
+
+LIBEVENTS_SONAME = libevents.$(SHLIBEXT).0
+LIBEVENTS_SOLIB = libevents.$(SHLIBEXT).$(PACKAGE_VERSION)
+
+LIBEVENTS = libevents.a
+
+clean::
+ rm -f $(LIBEVENTS_SONAME) $(LIBEVENTS_SOLIB) libevents.a libevents.$(SHLIBEXT)
+ rm -f events.pc
+
+build-python:: _libevents.$(SHLIBEXT)
+
+events_wrap.o: $(eventsdir)/events_wrap.c
+ $(CC) $(PICFLAG) -c $(eventsdir)/events_wrap.c $(CFLAGS) `$(PYTHON_CONFIG) --cflags`
+
+_libevents.$(SHLIBEXT): libevents.$(SHLIBEXT) events_wrap.o
+ $(SHLD) $(SHLD_FLAGS) -o $@ events_wrap.o -L. -levents `$(PYTHON_CONFIG) --libs`
+
+install:: installdirs installbin installheaders installlibs \
+ $(PYTHON_INSTALL_TARGET)
+
+install-python:: build-python
+ mkdir -p $(DESTDIR)`$(PYTHON) -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib(0, prefix='$(prefix)')"` \
+ $(DESTDIR)`$(PYTHON) -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1, prefix='$(prefix)')"`
+ cp $(eventsdir)/events.py $(DESTDIR)`$(PYTHON) -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib(0, prefix='$(prefix)')"`
+ cp _libevents.$(SHLIBEXT) $(DESTDIR)`$(PYTHON) -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib(1, prefix='$(prefix)')"`
+
+check-python:: build-python
+ $(LIB_PATH_VAR)=. PYTHONPATH=".:$(eventsdir)" $(PYTHON) $(eventsdir)/python/tests/simple.py
+
+install-swig::
+ mkdir -p $(DESTDIR)`$(SWIG) -swiglib`
+ cp events.i $(DESTDIR)`$(SWIG) -swiglib`
+
+clean::
+ rm -f _libevents.$(SHLIBEXT)
+
+installdirs::
+ mkdir -p $(DESTDIR)$(includedir)
+ mkdir -p $(DESTDIR)$(libdir)
+ mkdir -p $(DESTDIR)$(libdir)/pkgconfig
+
+installheaders:: installdirs
+ cp $(srcdir)/events.h $(DESTDIR)$(includedir)
+
+installlibs:: all installdirs
+ cp events.pc $(DESTDIR)$(libdir)/pkgconfig
+ cp libevents.a $(LIBEVENTS_SOLIB) $(DESTDIR)$(libdir)
+
+libevents.a: $(EVENTS_OBJ)
+ ar -rv libevents.a $(EVENTS_OBJ)
+
+libevents.$(SHLIBEXT): $(LIBEVENTS_SOLIB)
+ ln -fs $< $@
+
+$(LIBEVENTS_SONAME): $(LIBEVENTS_SOLIB)
+ ln -fs $< $@
diff --git a/source4/lib/events/events.pc.in b/source4/lib/events/events.pc.in
new file mode 100644
index 0000000000..4a4c012d73
--- /dev/null
+++ b/source4/lib/events/events.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: events
+Description: An event system library
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -levents
+Cflags: -I${includedir}
+URL: http://samba.org/
diff --git a/source4/lib/events/events_epoll.c b/source4/lib/events/events_epoll.c
index 109027eb1a..07e66154fc 100644
--- a/source4/lib/events/events_epoll.c
+++ b/source4/lib/events/events_epoll.c
@@ -20,12 +20,17 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#if _SAMBA_BUILD_
#include "includes.h"
+#include "lib/util/dlinklist.h"
+#else
+#include "replace.h"
+#include "events_util.h"
+#endif
#include "system/filesys.h"
#include "system/network.h"
-#include "lib/util/dlinklist.h"
-#include "lib/events/events.h"
-#include "lib/events/events_internal.h"
+#include "events.h"
+#include "events_internal.h"
#include <sys/epoll.h>
struct epoll_event_context {
@@ -56,9 +61,11 @@ struct epoll_event_context {
called when a epoll call fails, and we should fallback
to using select
*/
-_NORETURN_ static void epoll_panic(struct epoll_event_context *epoll_ev, const char *reason)
+static void epoll_panic(struct epoll_event_context *epoll_ev, const char *reason)
{
+#if _SAMBA_BUILD_
DEBUG(0,("%s (%s) - calling abort()\n", reason, strerror(errno)));
+#endif
abort();
}
diff --git a/source4/lib/events/events_select.c b/source4/lib/events/events_select.c
index f4b7e4e5eb..16fff71e4a 100644
--- a/source4/lib/events/events_select.c
+++ b/source4/lib/events/events_select.c
@@ -23,12 +23,17 @@
*/
+#if _SAMBA_BUILD_
#include "includes.h"
+#include "lib/util/dlinklist.h"
+#else
+#include "replace.h"
+#include "events_util.h"
+#endif
#include "system/filesys.h"
#include "system/select.h"
-#include "lib/util/dlinklist.h"
-#include "lib/events/events.h"
-#include "lib/events/events_internal.h"
+#include "events.h"
+#include "events_internal.h"
struct select_event_context {
/* a pointer back to the generic event_context */
@@ -216,7 +221,9 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
made readable and that should have removed
the event, so this must be a bug. This is a
fatal error. */
+#if _SAMBA_BUILD_
DEBUG(0,("ERROR: EBADF on select_event_loop_once\n"));
+#endif
select_ev->exit_code = EBADF;
return -1;
}
diff --git a/source4/lib/events/events_signal.c b/source4/lib/events/events_signal.c
index c0771cbe01..7128612fb0 100644
--- a/source4/lib/events/events_signal.c
+++ b/source4/lib/events/events_signal.c
@@ -19,13 +19,18 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#if _SAMBA_BUILD_
#include "includes.h"
+#include "lib/util/dlinklist.h"
+#else
+#include <signal.h>
+#include "replace.h"
+#include "events_util.h"
+#endif
#include "system/filesys.h"
#include "system/select.h"
-#include "system/wait.h"
-#include "lib/util/dlinklist.h"
-#include "lib/events/events.h"
-#include "lib/events/events_internal.h"
+#include "events.h"
+#include "events_internal.h"
#define NUM_SIGNALS 64
diff --git a/source4/lib/events/events_standard.c b/source4/lib/events/events_standard.c
index 7b945b154d..4e41c42206 100644
--- a/source4/lib/events/events_standard.c
+++ b/source4/lib/events/events_standard.c
@@ -27,13 +27,18 @@
at runtime we fallback to select()
*/
+#if _SAMBA_BUILD_
#include "includes.h"
+#include "lib/util/dlinklist.h"
+#else
+#include "replace.h"
+#include "events_util.h"
+#endif
#include "system/filesys.h"
#include "system/network.h"
#include "system/select.h" /* needed for HAVE_EVENTS_EPOLL */
-#include "lib/util/dlinklist.h"
-#include "lib/events/events.h"
-#include "lib/events/events_internal.h"
+#include "events.h"
+#include "events_internal.h"
struct std_event_context {
/* a pointer back to the generic event_context */
diff --git a/source4/lib/events/events_timed.c b/source4/lib/events/events_timed.c
index 389c2cbbb7..79e4cde795 100644
--- a/source4/lib/events/events_timed.c
+++ b/source4/lib/events/events_timed.c
@@ -20,12 +20,17 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#if _SAMBA_BUILD_
#include "includes.h"
+#include "lib/util/dlinklist.h"
+#else
+#include "replace.h"
+#include "events_util.h"
+#endif
#include "system/filesys.h"
#include "system/select.h"
-#include "lib/util/dlinklist.h"
-#include "lib/events/events.h"
-#include "lib/events/events_internal.h"
+#include "events.h"
+#include "events_internal.h"
/*
destroy a timed event
diff --git a/source4/lib/events/events_util.c b/source4/lib/events/events_util.c
new file mode 100644
index 0000000000..74e11473f3
--- /dev/null
+++ b/source4/lib/events/events_util.c
@@ -0,0 +1,129 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Copyright (C) Andrew Tridgell 2005
+ Copyright (C) Jelmer Vernooij 2005
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "replace.h"
+#include "talloc.h"
+
+/**
+ return the number of elements in a string list
+*/
+static size_t str_list_length(const char **list)
+{
+ size_t ret;
+ for (ret=0;list && list[ret];ret++) /* noop */ ;
+ return ret;
+}
+
+/**
+ add an entry to a string list
+*/
+const char **str_list_add(const char **list, const char *s)
+{
+ size_t len = str_list_length(list);
+ const char **ret;
+
+ ret = talloc_realloc(NULL, list, const char *, len+2);
+ if (ret == NULL) return NULL;
+
+ ret[len] = talloc_strdup(ret, s);
+ if (ret[len] == NULL) return NULL;
+
+ ret[len+1] = NULL;
+
+ return ret;
+}
+
+/**
+ compare two timeval structures.
+ Return -1 if tv1 < tv2
+ Return 0 if tv1 == tv2
+ Return 1 if tv1 > tv2
+*/
+static int timeval_compare(const struct timeval *tv1, const struct timeval *tv2)
+{
+ if (tv1->tv_sec > tv2->tv_sec) return 1;
+ if (tv1->tv_sec < tv2->tv_sec) return -1;
+ if (tv1->tv_usec > tv2->tv_usec) return 1;
+ if (tv1->tv_usec < tv2->tv_usec) return -1;
+ return 0;
+}
+
+/**
+ return a zero timeval
+*/
+struct timeval timeval_zero(void)
+{
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ return tv;
+}
+
+/**
+ return true if a timeval is zero
+*/
+bool timeval_is_zero(const struct timeval *tv)
+{
+ return tv->tv_sec == 0 && tv->tv_usec == 0;
+}
+
+/**
+ return a timeval for the current time
+*/
+struct timeval timeval_current(void)
+{
+ struct timeval tv;
+ GetTimeOfDay(&tv);
+ return tv;
+}
+
+/**
+ return a timeval struct with the given elements
+*/
+struct timeval timeval_set(uint32_t secs, uint32_t usecs)
+{
+ struct timeval tv;
+ tv.tv_sec = secs;
+ tv.tv_usec = usecs;
+ return tv;
+}
+
+/**
+ return the difference between two timevals as a timeval
+ if tv1 comes after tv2, then return a zero timeval
+ (this is *tv2 - *tv1)
+*/
+struct timeval timeval_until(const struct timeval *tv1,
+ const struct timeval *tv2)
+{
+ struct timeval t;
+ if (timeval_compare(tv1, tv2) >= 0) {
+ return timeval_zero();
+ }
+ t.tv_sec = tv2->tv_sec - tv1->tv_sec;
+ if (tv1->tv_usec > tv2->tv_usec) {
+ t.tv_sec--;
+ t.tv_usec = 1000000 - (tv1->tv_usec - tv2->tv_usec);
+ } else {
+ t.tv_usec = tv2->tv_usec - tv1->tv_usec;
+ }
+ return t;
+}
+
diff --git a/source4/lib/events/events_util.h b/source4/lib/events/events_util.h
new file mode 100644
index 0000000000..401df891a5
--- /dev/null
+++ b/source4/lib/events/events_util.h
@@ -0,0 +1,123 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Copyright (C) Andrew Tridgell 1998-2005
+ Copyright (C) Jelmer Vernooij 2005
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* To use these macros you must have a structure containing a next and
+ prev pointer */
+
+#ifndef _DLINKLIST_H
+#define _DLINKLIST_H
+
+
+/* hook into the front of the list */
+#define DLIST_ADD(list, p) \
+do { \
+ if (!(list)) { \
+ (list) = (p); \
+ (p)->next = (p)->prev = NULL; \
+ } else { \
+ (list)->prev = (p); \
+ (p)->next = (list); \
+ (p)->prev = NULL; \
+ (list) = (p); \
+ }\
+} while (0)
+
+/* remove an element from a list - element doesn't have to be in list. */
+#define DLIST_REMOVE(list, p) \
+do { \
+ if ((p) == (list)) { \
+ (list) = (p)->next; \
+ if (list) (list)->prev = NULL; \
+ } else { \
+ if ((p)->prev) (p)->prev->next = (p)->next; \
+ if ((p)->next) (p)->next->prev = (p)->prev; \
+ } \
+ if ((p) != (list)) (p)->next = (p)->prev = NULL; \
+} while (0)
+
+/* promote an element to the top of the list */
+#define DLIST_PROMOTE(list, p) \
+do { \
+ DLIST_REMOVE(list, p); \
+ DLIST_ADD(list, p); \
+} while (0)
+
+/* hook into the end of the list - needs a tmp pointer */
+#define DLIST_ADD_END(list, p, type) \
+do { \
+ if (!(list)) { \
+ (list) = (p); \
+ (p)->next = (p)->prev = NULL; \
+ } else { \
+ type tmp; \
+ for (tmp = (list); tmp->next; tmp = tmp->next) ; \
+ tmp->next = (p); \
+ (p)->next = NULL; \
+ (p)->prev = tmp; \
+ } \
+} while (0)
+
+/* insert 'p' after the given element 'el' in a list. If el is NULL then
+ this is the same as a DLIST_ADD() */
+#define DLIST_ADD_AFTER(list, p, el) \
+do { \
+ if (!(list) || !(el)) { \
+ DLIST_ADD(list, p); \
+ } else { \
+ p->prev = el; \
+ p->next = el->next; \
+ el->next = p; \
+ if (p->next) p->next->prev = p; \
+ }\
+} while (0)
+
+/* demote an element to the end of the list, needs a tmp pointer */
+#define DLIST_DEMOTE(list, p, tmp) \
+do { \
+ DLIST_REMOVE(list, p); \
+ DLIST_ADD_END(list, p, tmp); \
+} while (0)
+
+/* concatenate two lists - putting all elements of the 2nd list at the
+ end of the first list */
+#define DLIST_CONCATENATE(list1, list2, type) \
+do { \
+ if (!(list1)) { \
+ (list1) = (list2); \
+ } else { \
+ type tmp; \
+ for (tmp = (list1); tmp->next; tmp = tmp->next) ; \
+ tmp->next = (list2); \
+ if (list2) { \
+ (list2)->prev = tmp; \
+ } \
+ } \
+} while (0)
+
+#endif /* _DLINKLIST_H */
+
+const char **str_list_add(const char **list, const char *s);
+struct timeval timeval_zero(void);
+bool timeval_is_zero(const struct timeval *tv);
+struct timeval timeval_current(void);
+struct timeval timeval_set(uint32_t secs, uint32_t usecs);
+struct timeval timeval_until(const struct timeval *tv1,
+ const struct timeval *tv2);
+
diff --git a/source4/lib/events/events_wrap.c b/source4/lib/events/events_wrap.c
index b220d320cf..9dbbb08734 100644
--- a/source4/lib/events/events_wrap.c
+++ b/source4/lib/events/events_wrap.c
@@ -2501,7 +2501,7 @@ static swig_module_info swig_module = {swig_types, 4, 0, 0, 0, 0};
#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),(void**)(a))
-#include "lib/events/events.h"
+#include "events.h"
typedef struct event_context event;
SWIGINTERN event *new_event(TALLOC_CTX *mem_ctx){ return event_context_init(mem_ctx); }
diff --git a/source4/lib/events/libevents.m4 b/source4/lib/events/libevents.m4
index 99a47dcc54..483ab861fb 100644
--- a/source4/lib/events/libevents.m4
+++ b/source4/lib/events/libevents.m4
@@ -1,11 +1,28 @@
-EVENTS_OBJ="lib/events/events.o lib/events/events_select.o lib/events/events_signal.o lib/events/events_timed.o lib/events/events_standard.o"
+dnl find the events sources. This is meant to work both for
+dnl standalone builds, and builds of packages using libevents
+eventsdir=""
+eventspaths="$srcdir $srcdir/lib/events $srcdir/events $srcdir/../events"
+for d in $eventspaths; do
+ if test -f "$d/events.c"; then
+ eventsdir="$d"
+ AC_SUBST(eventsdir)
+ break;
+ fi
+done
+if test x"$eventsdir" = "x"; then
+ AC_MSG_ERROR([cannot find libevents source in $eventspaths])
+fi
+
+EVENTS_OBJ="events.o events_select.o events_signal.o events_timed.o events_standard.o events_util.o"
+AC_SUBST(LIBREPLACEOBJ)
AC_CHECK_HEADERS(sys/epoll.h)
AC_CHECK_FUNCS(epoll_create)
if test x"$ac_cv_header_sys_epoll_h" = x"yes" -a x"$ac_cv_func_epoll_create" = x"yes"; then
- EVENTS_OBJ="$EVENTS_OBJ lib/events/events_epoll.o"
+ EVENTS_OBJ="$EVENTS_OBJ events_epoll.o"
AC_DEFINE(HAVE_EVENTS_EPOLL, 1, [Whether epoll available])
fi
AC_SUBST(EVENTS_OBJ)
+