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;
|
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)
|
static void tevent_abort_nesting(struct tevent_context *ev, const char *location)
|
||||||
{
|
{
|
||||||
const char *reason;
|
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 _tevent_loop_once(struct tevent_context *ev, const char *location)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
void *nesting_stack_ptr = NULL;
|
||||||
|
|
||||||
ev->nesting.level++;
|
ev->nesting.level++;
|
||||||
|
|
||||||
@ -402,12 +411,41 @@ int _tevent_loop_once(struct tevent_context *ev, const char *location)
|
|||||||
errno = ELOOP;
|
errno = ELOOP;
|
||||||
return -1;
|
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);
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,6 +301,12 @@ void tevent_queue_stop(struct tevent_queue *queue);
|
|||||||
|
|
||||||
size_t tevent_queue_length(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
|
#ifdef TEVENT_DEPRECATED
|
||||||
#ifndef _DEPRECATED_
|
#ifndef _DEPRECATED_
|
||||||
#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
|
#if (__GNUC__ >= 3) && (__GNUC_MINOR__ >= 1 )
|
||||||
@ -310,6 +316,9 @@ size_t tevent_queue_length(struct tevent_queue *queue);
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
void tevent_loop_allow_nesting(struct tevent_context *ev) _DEPRECATED_;
|
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
|
#endif
|
||||||
|
|
||||||
#ifdef TEVENT_COMPAT_DEFINES
|
#ifdef TEVENT_COMPAT_DEFINES
|
||||||
|
@ -238,6 +238,8 @@ struct tevent_context {
|
|||||||
struct {
|
struct {
|
||||||
bool allowed;
|
bool allowed;
|
||||||
uint32_t level;
|
uint32_t level;
|
||||||
|
tevent_nesting_hook hook_fn;
|
||||||
|
void *hook_private;
|
||||||
} nesting;
|
} nesting;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user