From 3da86cc23f20e5b852d08aa05dacabb2d6e496e2 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Wed, 18 Jul 2012 11:25:42 +0200 Subject: s3: Add tevent_wait_send/recv To me it seems that we might have this functionality already somewere... I just can't find it. Metze, do you have an idea? Signed-off-by: Jeremy Allison --- source3/Makefile.in | 1 + source3/lib/tevent_wait.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++ source3/lib/tevent_wait.h | 37 +++++++++++++++++++++ source3/wscript_build | 1 + 4 files changed, 122 insertions(+) create mode 100644 source3/lib/tevent_wait.c create mode 100644 source3/lib/tevent_wait.h (limited to 'source3') diff --git a/source3/Makefile.in b/source3/Makefile.in index 7538077a54..dc3817f80a 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -495,6 +495,7 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) $(LIBTSOCKET_OBJ) \ lib/fncall.o \ libads/krb5_errs.o lib/system_smbd.o lib/audit.o $(LIBNDR_OBJ) \ lib/file_id.o lib/idmap_cache.o \ + lib/tevent_wait.o \ ../libcli/security/dom_sid.o ../libcli/security/security_descriptor.o \ ../libcli/security/security_token.o ../libcli/security/util_sid.o \ ../libcli/smb/util.o ../lib/util/idtree.o diff --git a/source3/lib/tevent_wait.c b/source3/lib/tevent_wait.c new file mode 100644 index 0000000000..ec7c8cbf50 --- /dev/null +++ b/source3/lib/tevent_wait.c @@ -0,0 +1,83 @@ +/* + Unix SMB/CIFS implementation. + Implement a send/recv interface to wait for an external trigger + Copyright (C) Volker Lendecke 2012 + + 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 . +*/ + +#include "lib/replace/replace.h" +#include "talloc.h" +#include "tevent.h" +#include "tevent_wait.h" +#include "lib/util/tevent_unix.h" + +struct tevent_wait_state { + struct tevent_immediate *im; + struct tevent_context *ev; +}; + +struct tevent_req *tevent_wait_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev) +{ + struct tevent_req *req; + struct tevent_wait_state *state; + + req = tevent_req_create(mem_ctx, &state, struct tevent_wait_state); + if (req == NULL) { + return NULL; + } + state->ev = ev; + state->im = tevent_create_immediate(state); + if (tevent_req_nomem(state->im, req)) { + return tevent_req_post(req, ev); + } + return req; +} + +static void tevent_wait_trigger(struct tevent_context *ctx, + struct tevent_immediate *im, + void *private_data); + +void tevent_wait_done(struct tevent_req *req) +{ + struct tevent_wait_state *state; + + if (req == NULL) { + return; + } + state = tevent_req_data(req, struct tevent_wait_state); + + tevent_schedule_immediate(state->im, state->ev, + tevent_wait_trigger, req); +} + +static void tevent_wait_trigger(struct tevent_context *ctx, + struct tevent_immediate *im, + void *private_data) +{ + struct tevent_req *req = talloc_get_type_abort( + private_data, struct tevent_req); + tevent_req_done(req); +} + +int tevent_wait_recv(struct tevent_req *req) +{ + int err; + + if (tevent_req_is_unix_error(req, &err)) { + return err; + } + return 0; +} diff --git a/source3/lib/tevent_wait.h b/source3/lib/tevent_wait.h new file mode 100644 index 0000000000..97b749191d --- /dev/null +++ b/source3/lib/tevent_wait.h @@ -0,0 +1,37 @@ +/* + Unix SMB/CIFS implementation. + Implement a send/recv interface to wait for an external trigger + Copyright (C) Volker Lendecke 2012 + + 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 . +*/ + +#ifndef _TEVENT_WAIT_H +#define _TEVENT_WAIT_H + +#include "talloc.h" +#include "tevent.h" + +/* + * Just wait for getting a tevent_wait_done. tevent_wait_done can deal with a + * NULL request. + */ + +struct tevent_req *tevent_wait_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev); +int tevent_wait_recv(struct tevent_req *req); + +void tevent_wait_done(struct tevent_req *req); + +#endif /* _TEVENT_WAIT_H */ diff --git a/source3/wscript_build b/source3/wscript_build index 3b3bdeac9f..7204220b0a 100755 --- a/source3/wscript_build +++ b/source3/wscript_build @@ -67,6 +67,7 @@ LIB_SRC = ''' lib/ldap_escape.c lib/fncall.c libads/krb5_errs.c lib/system_smbd.c lib/audit.c + lib/tevent_wait.c lib/idmap_cache.c''' LIB_UTIL_SRC = ''' -- cgit