Make it possible to build libevents standalone.
authorSimo Sorce <idra@samba.org>
Thu, 24 Apr 2008 21:28:30 +0000 (17:28 -0400)
committerSimo Sorce <idra@samba.org>
Wed, 14 May 2008 04:03:01 +0000 (00:03 -0400)
(This used to be commit 10415bb738d51afdebbfeae976923e086805ae84)

17 files changed:
source4/lib/events/Makefile.in [new file with mode: 0644]
source4/lib/events/autogen.sh [new file with mode: 0755]
source4/lib/events/config.mk
source4/lib/events/configure.ac [new file with mode: 0644]
source4/lib/events/events.c
source4/lib/events/events.i
source4/lib/events/events.mk [new file with mode: 0644]
source4/lib/events/events.pc.in [new file with mode: 0644]
source4/lib/events/events_epoll.c
source4/lib/events/events_select.c
source4/lib/events/events_signal.c
source4/lib/events/events_standard.c
source4/lib/events/events_timed.c
source4/lib/events/events_util.c [new file with mode: 0644]
source4/lib/events/events_util.h [new file with mode: 0644]
source4/lib/events/events_wrap.c
source4/lib/events/libevents.m4

diff --git a/source4/lib/events/Makefile.in b/source4/lib/events/Makefile.in
new file mode 100644 (file)
index 0000000..0a0df9b
--- /dev/null
@@ -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 (executable)
index 0000000..b13a4b6
--- /dev/null
@@ -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
+
index 058ce7f793bf0ffa9783d88c4f0e77e5da255f36..34c24f76f528fee791ee2b490e0d8200cbc913e4 100644 (file)
@@ -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 (file)
index 0000000..4eb3575
--- /dev/null
@@ -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)
index 6f45db512a1b3aecd7143433f0646d2f71e541aa..ccc62b4c83ce77ba69df9b7c2206bfe9334e752d 100644 (file)
   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);
 }
index 263605b176ce8d98063ae77ffc9d61281dc00aa6..c16d482efc61d6caaab6f97bc88f0c6747b182d8 100644 (file)
@@ -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 (file)
index 0000000..64d3fcb
--- /dev/null
@@ -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 (file)
index 0000000..4a4c012
--- /dev/null
@@ -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/
index 109027eb1abbd49074724e7d009b6a44da3f2b58..07e66154fc6026027c147d5ea3cca81d68ac12de 100644 (file)
    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();
 }
 
index f4b7e4e5ebd1f67735a8c35b365dbcf55652a679..16fff71e4a591e1c688e2a64e890d9258d6e4976 100644 (file)
 
 */
 
+#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;
        }
index c0771cbe01fd6ede8f84dc770d999905cb4fc3cf..7128612fb03f572b4297a503c875904546646feb 100644 (file)
    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
 
index 7b945b154d96780d1ff9a113b7f49afaa070991a..4e41c42206d541529de8ad0520ec2082caa97899 100644 (file)
     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 */
index 389c2cbbb7c7dd4349b93260a3f7853a34ee1955..79e4cde795009f723cf51f64990187b417fd1d12 100644 (file)
    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 (file)
index 0000000..74e1147
--- /dev/null
@@ -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 (file)
index 0000000..401df89
--- /dev/null
@@ -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);
+
index b220d320cf3204aa0085c7f290f79660cac5728e..9dbbb08734793743e0b022623aa056001fd7f679 100644 (file)
@@ -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); }
index 99a47dcc547e3691e82d5a2095577e3d4333e621..483ab861fb9509ad5f8cf196aa05df9025a3266f 100644 (file)
@@ -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)
+