diff options
Diffstat (limited to 'source4/lib/events')
-rw-r--r-- | source4/lib/events/events.h | 1 | ||||
-rw-r--r-- | source4/lib/events/events_debug.c | 13 | ||||
-rw-r--r-- | source4/lib/events/events_s4.c | 51 |
3 files changed, 60 insertions, 5 deletions
diff --git a/source4/lib/events/events.h b/source4/lib/events/events.h index 750cdfee05..478f127a35 100644 --- a/source4/lib/events/events.h +++ b/source4/lib/events/events.h @@ -43,7 +43,6 @@ typedef void (*event_aio_handler_t)(struct event_context *, struct aio_event *, int, void *); #ifdef _SAMBA_BUILD_ -struct event_context *s4_event_context_init_byname(TALLOC_CTX *mem_ctx, const char *name); struct event_context *s4_event_context_init(TALLOC_CTX *mem_ctx); #endif diff --git a/source4/lib/events/events_debug.c b/source4/lib/events/events_debug.c index 70b85d47e4..233844f024 100644 --- a/source4/lib/events/events_debug.c +++ b/source4/lib/events/events_debug.c @@ -43,9 +43,9 @@ int ev_set_debug(struct event_context *ev, /* debug function for ev_set_debug_stderr */ -static void ev_debug_stderr(void *context, enum ev_debug_level level, +void ev_debug_stderr(void *context, enum ev_debug_level level, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0); -static void ev_debug_stderr(void *context, enum ev_debug_level level, +void ev_debug_stderr(void *context, enum ev_debug_level level, const char *fmt, va_list ap) { if (level <= EV_DEBUG_WARNING) { @@ -63,13 +63,18 @@ int ev_set_debug_stderr(struct event_context *ev) } /* - log a message + * log a message + * + * The default debug action is to ignore debugging messages. + * This is the most appropriate action for a library. + * Applications using the library must decide where to + * redirect debugging messages */ void ev_debug(struct event_context *ev, enum ev_debug_level level, const char *fmt, ...) { va_list ap; if (ev->debug_ops.debug == NULL) { - ev_set_debug_stderr(ev); + return; } va_start(ap, fmt); ev->debug_ops.debug(ev->debug_ops.context, level, fmt, ap); diff --git a/source4/lib/events/events_s4.c b/source4/lib/events/events_s4.c index edf92dba22..134f899cf8 100644 --- a/source4/lib/events/events_s4.c +++ b/source4/lib/events/events_s4.c @@ -55,3 +55,54 @@ NTSTATUS s4_events_aio_init(void) return NT_STATUS_OK; } #endif + +/* + this is used to catch debug messages from events +*/ +static void ev_wrap_debug(void *context, enum ev_debug_level level, + const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0); + +static void ev_wrap_debug(void *context, enum ev_debug_level level, + const char *fmt, va_list ap) +{ + int samba_level = -1; + char *s = NULL; + switch (level) { + case EV_DEBUG_FATAL: + samba_level = 0; + break; + case EV_DEBUG_ERROR: + samba_level = 1; + break; + case EV_DEBUG_WARNING: + samba_level = 2; + break; + case EV_DEBUG_TRACE: + samba_level = 5; + break; + + }; + vasprintf(&s, fmt, ap); + if (!s) return; + DEBUG(samba_level, ("events: %s\n", s)); + free(s); +} + +/* + create a event_context structure. This must be the first events + call, and all subsequent calls pass this event_context as the first + element. Event handlers also receive this as their first argument. + + This samba4 specific call sets the samba4 debug handler. +*/ +struct event_context *s4_event_context_init(TALLOC_CTX *mem_ctx) +{ + struct event_context *ev; + + ev = event_context_init_byname(mem_ctx, NULL); + if (ev) { + ev_set_debug(ev, ev_wrap_debug, NULL); + } + return ev; +} + |