r25026: Move param/param.h out of includes.h
[kai/samba-autobuild/.git] / source4 / lib / events / events.c
index 6159ea147f152417dcece058ebb7d7c2c766971c..77225b9ddf34af4643c37111e74cd4b295d332a8 100644 (file)
@@ -5,7 +5,7 @@
    
    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 2 of the License, or
+   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,
@@ -14,8 +14,7 @@
    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, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 /*
 #include "lib/events/events.h"
 #include "lib/events/events_internal.h"
 #include "lib/util/dlinklist.h"
+#include "param/param.h"
+#if _SAMBA_BUILD_
 #include "build.h"
+#endif
 
 struct event_ops_list {
        struct event_ops_list *next, *prev;
@@ -69,18 +71,29 @@ struct event_ops_list {
 /* list of registered event backends */
 static struct event_ops_list *event_backends;
 
+static char *event_default_backend = NULL;
+
 /*
   register an events backend
 */
-NTSTATUS event_register_backend(const char *name, const struct event_ops *ops)
+bool event_register_backend(const char *name, const struct event_ops *ops)
 {
        struct event_ops_list *e;
        e = talloc(talloc_autofree_context(), struct event_ops_list);
-       NT_STATUS_HAVE_NO_MEMORY(e);
+       if (e == NULL) return False;
        e->name = name;
        e->ops = ops;
        DLIST_ADD(event_backends, e);
-       return NT_STATUS_OK;
+       return True;
+}
+
+/*
+  set the default event backend
+ */
+void event_set_default_backend(const char *backend)
+{
+       if (event_default_backend) free(event_default_backend);
+       event_default_backend = strdup(backend);
 }
 
 /*
@@ -88,12 +101,25 @@ NTSTATUS event_register_backend(const char *name, const struct event_ops *ops)
 */
 static void event_backend_init(void)
 {
+#if _SAMBA_BUILD_
        init_module_fn static_init[] = STATIC_LIBEVENTS_MODULES;
        init_module_fn *shared_init;
        if (event_backends) return;
        shared_init = load_samba_modules(NULL, "LIBEVENTS");
        run_init_functions(static_init);
        run_init_functions(shared_init);
+#else
+       bool events_standard_init(void);
+       bool events_select_init(void);
+       events_select_init();
+       events_standard_init();
+#if HAVE_EVENTS_EPOLL
+       {
+               bool events_epoll_init(void);
+               events_epoll_init();
+       }
+#endif
+#endif
 }
 
 /*
@@ -162,6 +188,9 @@ struct event_context *event_context_init_byname(TALLOC_CTX *mem_ctx, const char
                name = lp_parm_string(-1, "event", "backend");
        }
 #endif
+       if (name == NULL) {
+               name = event_default_backend;
+       }
        if (name == NULL) {
                name = "standard";
        }
@@ -188,6 +217,9 @@ struct event_context *event_context_init(TALLOC_CTX *mem_ctx)
 /*
   add a fd based event
   return NULL on failure (memory allocation error)
+
+  if flags contains EVENT_FD_AUTOCLOSE then the fd will be closed when
+  the returned fd_event context is freed
 */
 struct fd_event *event_add_fd(struct event_context *ev, TALLOC_CTX *mem_ctx,
                              int fd, uint16_t flags, event_fd_handler_t handler,
@@ -239,6 +271,22 @@ struct timed_event *event_add_timed(struct event_context *ev, TALLOC_CTX *mem_ct
        return ev->ops->add_timed(ev, mem_ctx, next_event, handler, private_data);
 }
 
+/*
+  add a signal event
+
+  sa_flags are flags to sigaction(2)
+
+  return NULL on failure
+*/
+struct signal_event *event_add_signal(struct event_context *ev, TALLOC_CTX *mem_ctx,
+                                     int signum,
+                                     int sa_flags,
+                                     event_signal_handler_t handler, 
+                                     void *private_data)
+{
+       return ev->ops->add_signal(ev, mem_ctx, signum, sa_flags, handler, private_data);
+}
+
 /*
   do a single event loop using the events defined in ev 
 */