lib: dns: Clean up allocated structure on error exit.
[sfrench/samba-autobuild/.git] / lib / util / tevent_unix.c
1 /*
2    Unix SMB/CIFS implementation.
3    Wrap unix errno around tevent_req
4    Copyright (C) Volker Lendecke 2009
5
6      ** NOTE! The following LGPL license applies to the tevent_unix
7      ** helper library. This does NOT imply that all of Samba is released
8      ** under the LGPL
9
10    This library is free software; you can redistribute it and/or
11    modify it under the terms of the GNU Lesser General Public
12    License as published by the Free Software Foundation; either
13    version 3 of the License, or (at your option) any later version.
14
15    This library is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    Library General Public License for more details.
19
20    You should have received a copy of the GNU Lesser General Public License
21    along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 */
23
24 #include "../replace/replace.h"
25 #include "tevent_unix.h"
26
27 bool tevent_req_is_unix_error(struct tevent_req *req, int *perrno)
28 {
29         enum tevent_req_state state;
30         uint64_t err;
31
32         if (!tevent_req_is_error(req, &state, &err)) {
33                 return false;
34         }
35         switch (state) {
36         case TEVENT_REQ_TIMED_OUT:
37                 *perrno = ETIMEDOUT;
38                 break;
39         case TEVENT_REQ_NO_MEMORY:
40                 *perrno = ENOMEM;
41                 break;
42         case TEVENT_REQ_USER_ERROR:
43                 *perrno = err;
44                 break;
45         default:
46                 *perrno = EINVAL;
47                 break;
48         }
49         return true;
50 }
51
52 int tevent_req_simple_recv_unix(struct tevent_req *req)
53 {
54         int err = 0;
55
56         /*
57          * Ignore result of tevent_req_is_unix_error, we're only interested in
58          * the status
59          */
60         tevent_req_is_unix_error(req, &err);
61         tevent_req_received(req);
62         return err;
63 }
64
65 bool tevent_req_poll_unix(struct tevent_req *req, struct tevent_context *ev,
66                           int *err)
67 {
68         bool ret = tevent_req_poll(req, ev);
69         if (!ret) {
70                 *err = errno;
71         }
72         return ret;
73 }