lib/util: Add tevent WERROR wrappers
authorKai Blin <kai@samba.org>
Fri, 22 Oct 2010 14:40:38 +0000 (16:40 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 23 Oct 2010 07:35:28 +0000 (07:35 +0000)
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Autobuild-User: Stefan Metzmacher <metze@samba.org>
Autobuild-Date: Sat Oct 23 07:35:28 UTC 2010 on sn-devel-104

lib/util/tevent_werror.c [new file with mode: 0644]
lib/util/tevent_werror.h [new file with mode: 0644]
lib/util/wscript_build
source3/Makefile.in
source3/wscript_build

diff --git a/lib/util/tevent_werror.c b/lib/util/tevent_werror.c
new file mode 100644 (file)
index 0000000..d8956b3
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+   Unix SMB/CIFS implementation.
+   Wrap win32 errors around tevent_req
+   Copyright (C) Kai Blin 2010
+
+   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 <http://www.gnu.org/licenses/>.
+*/
+
+#include "../replace/replace.h"
+#include "tevent_werror.h"
+
+bool _tevent_req_werror(struct tevent_req *req,
+                       WERROR werror,
+                       const char *location)
+{
+       return _tevent_req_error(req, W_ERROR_V(werror),
+                                location);
+}
+
+bool tevent_req_is_werror(struct tevent_req *req, WERROR *error)
+{
+       enum tevent_req_state state;
+       uint64_t err;
+
+       if (!tevent_req_is_error(req, &state, &err)) {
+               return false;
+       }
+       switch (state) {
+       case TEVENT_REQ_TIMED_OUT:
+               *error = WERR_TIMEOUT;
+               break;
+       case TEVENT_REQ_NO_MEMORY:
+               *error = WERR_NOMEM;
+               break;
+       case TEVENT_REQ_USER_ERROR:
+               *error = W_ERROR(err);
+               break;
+       default:
+               *error = WERR_INTERNAL_ERROR;
+               break;
+       }
+       return true;
+}
+
+WERROR tevent_req_simple_recv_werror(struct tevent_req *req)
+{
+       WERROR werror;
+
+       if (tevent_req_is_werror(req, &werror)) {
+               tevent_req_received(req);
+               return werror;
+       }
+       tevent_req_received(req);
+       return WERR_OK;
+}
+
+void tevent_req_simple_finish_werror(struct tevent_req *subreq,
+                                    WERROR subreq_error)
+{
+       struct tevent_req *req = tevent_req_callback_data(
+               subreq, struct tevent_req);
+
+       TALLOC_FREE(subreq);
+
+       if (!W_ERROR_IS_OK(subreq_error)) {
+               tevent_req_werror(req, subreq_error);
+               return;
+       }
+       tevent_req_done(req);
+}
diff --git a/lib/util/tevent_werror.h b/lib/util/tevent_werror.h
new file mode 100644 (file)
index 0000000..0e24382
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+   Unix SMB/CIFS implementation.
+   Wrap win32 errors around tevent_req
+   Copyright (C) Kai Blin 2010
+
+   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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _TEVENT_WERROR_H
+#define _TEVENT_WERROR_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "../libcli/util/werror.h"
+#include <tevent.h>
+
+bool _tevent_req_werror(struct tevent_req *req,
+                       WERROR werror,
+                       const char *location);
+#define tevent_req_werror(req, werror) \
+       _tevent_req_werror(req, werror, __location__)
+bool tevent_req_is_werror(struct tevent_req *req, WERROR *error);
+WERROR tevent_req_simple_recv_werror(struct tevent_req *req);
+
+/*
+ * Helper routine to pass the subreq_werror to the req embedded in
+ * tevent_req_callback_data(subreq), which will be freed.
+ */
+void tevent_req_simple_finish_werror(struct tevent_req *subreq,
+                                    WERROR subreq_error);
+
+#endif
index 9162bcbba00e9932bb72a0400d1c5a392505b8dd..e1030c88e9c88579f96ae40e5af43e2ae37c8058 100644 (file)
@@ -41,10 +41,10 @@ bld.SAMBA_SUBSYSTEM('UTIL_TDB',
        )
 
 bld.SAMBA_SUBSYSTEM('UTIL_TEVENT',
-       source='tevent_unix.c tevent_ntstatus.c',
+       source='tevent_unix.c tevent_ntstatus.c tevent_werror.c',
        local_include=False,
        public_deps='tevent',
-       public_headers='tevent_ntstatus.h tevent_unix.h',
+       public_headers='tevent_ntstatus.h tevent_unix.h tevent_werror.h',
        header_path=[ ('*', 'util') ],
        )
 
index 5d390def48e73c67b4762f5592bf4c31ebea772b..b2877841e70739b2b960c601044c9204c4ddc0f3 100644 (file)
@@ -429,6 +429,7 @@ UTIL_OBJ = ../lib/util/rbtree.o ../lib/util/signal.o ../lib/util/time.o \
                   ../lib/util/genrand.o ../lib/util/util_net.o \
                   ../lib/util/become_daemon.o ../lib/util/system.o \
                   ../lib/util/tevent_unix.o ../lib/util/tevent_ntstatus.o \
+                  ../lib/util/tevent_werror.o \
                   ../lib/util/smb_threads.o ../lib/util/util_id.o \
                   ../lib/util/blocking.o ../lib/util/rfc1738.o \
                   ../lib/util/select.o
index 7516f7ac052c9d87c8b7419e88a02c12d817c2ee..9ee2cbc77ffc00796b44b9336b4550d76f5596f2 100644 (file)
@@ -152,6 +152,7 @@ UTIL_SRC = '''../lib/util/rbtree.c ../lib/util/signal.c ../lib/util/time.c
                    ../lib/util/genrand.c ../lib/util/util_net.c
                    ../lib/util/become_daemon.c ../lib/util/system.c
                    ../lib/util/tevent_unix.c ../lib/util/tevent_ntstatus.c
+                   ../lib/util/tevent_werror.c
                    ../lib/util/smb_threads.c ../lib/util/util_id.c
                    ../lib/util/blocking.c ../lib/util/rfc1738.c
                    ../lib/util/select.c'''