mirror of
https://github.com/samba-team/samba.git
synced 2025-02-28 01:58:17 +03:00
tevent: add tevent_loop_set_nesting_hook()
This is an ugly hack to let the s4 server work arround some bugs related to nested events and uid changing. metze
This commit is contained in:
parent
a3d5d8378c
commit
7142ef49bd
@ -374,6 +374,14 @@ void tevent_loop_allow_nesting(struct tevent_context *ev)
|
||||
ev->nesting.allowed = true;
|
||||
}
|
||||
|
||||
void tevent_loop_set_nesting_hook(struct tevent_context *ev,
|
||||
tevent_nesting_hook hook,
|
||||
void *private_data)
|
||||
{
|
||||
ev->nesting.hook_fn = hook;
|
||||
ev->nesting.hook_private = private_data;
|
||||
}
|
||||
|
||||
static void tevent_abort_nesting(struct tevent_context *ev, const char *location)
|
||||
{
|
||||
const char *reason;
|
||||
@ -393,6 +401,7 @@ static void tevent_abort_nesting(struct tevent_context *ev, const char *location
|
||||
int _tevent_loop_once(struct tevent_context *ev, const char *location)
|
||||
{
|
||||
int ret;
|
||||
void *nesting_stack_ptr = NULL;
|
||||
|
||||
ev->nesting.level++;
|
||||
|
||||
@ -402,12 +411,41 @@ int _tevent_loop_once(struct tevent_context *ev, const char *location)
|
||||
errno = ELOOP;
|
||||
return -1;
|
||||
}
|
||||
if (ev->nesting.hook_fn) {
|
||||
int ret2;
|
||||
ret2 = ev->nesting.hook_fn(ev,
|
||||
ev->nesting.hook_private,
|
||||
ev->nesting.level,
|
||||
true,
|
||||
(void *)&nesting_stack_ptr,
|
||||
location);
|
||||
if (ret2 != 0) {
|
||||
ret = ret2;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ret = ev->ops->loop_once(ev, location);
|
||||
|
||||
ev->nesting.level--;
|
||||
if (ev->nesting.level > 1) {
|
||||
if (ev->nesting.hook_fn) {
|
||||
int ret2;
|
||||
ret2 = ev->nesting.hook_fn(ev,
|
||||
ev->nesting.hook_private,
|
||||
ev->nesting.level,
|
||||
false,
|
||||
(void *)&nesting_stack_ptr,
|
||||
location);
|
||||
if (ret2 != 0) {
|
||||
ret = ret2;
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
ev->nesting.level--;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -301,6 +301,12 @@ void tevent_queue_stop(struct tevent_queue *queue);
|
||||
|
||||
size_t tevent_queue_length(struct tevent_queue *queue);
|
||||
|
||||
typedef int (*tevent_nesting_hook)(struct tevent_context *ev,
|
||||
void *private_data,
|
||||
uint32_t level,
|
||||
bool begin,
|
||||
void *stack_ptr,
|
||||
const char *location);
|
||||
#ifdef TEVENT_DEPRECATED
|
||||
#ifndef _DEPRECATED_
|
||||
#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
|
||||
@ -310,6 +316,9 @@ size_t tevent_queue_length(struct tevent_queue *queue);
|
||||
#endif
|
||||
#endif
|
||||
void tevent_loop_allow_nesting(struct tevent_context *ev) _DEPRECATED_;
|
||||
void tevent_loop_set_nesting_hook(struct tevent_context *ev,
|
||||
tevent_nesting_hook hook,
|
||||
void *private_data) _DEPRECATED_;
|
||||
#endif
|
||||
|
||||
#ifdef TEVENT_COMPAT_DEFINES
|
||||
|
@ -238,6 +238,8 @@ struct tevent_context {
|
||||
struct {
|
||||
bool allowed;
|
||||
uint32_t level;
|
||||
tevent_nesting_hook hook_fn;
|
||||
void *hook_private;
|
||||
} nesting;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user