Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : Wrap win32 errors around tevent_req 4 : Copyright (C) Kai Blin 2010 5 : 6 : This program is free software; you can redistribute it and/or modify 7 : it under the terms of the GNU General Public License as published by 8 : the Free Software Foundation; either version 3 of the License, or 9 : (at your option) any later version. 10 : 11 : This program is distributed in the hope that it will be useful, 12 : but WITHOUT ANY WARRANTY; without even the implied warranty of 13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 : GNU General Public License for more details. 15 : 16 : You should have received a copy of the GNU General Public License 17 : along with this program. If not, see <http://www.gnu.org/licenses/>. 18 : */ 19 : 20 : #include "../replace/replace.h" 21 : #include "tevent_werror.h" 22 : #include "libcli/util/error.h" 23 : 24 15913 : bool _tevent_req_werror(struct tevent_req *req, 25 : WERROR werror, 26 : const char *location) 27 : { 28 15913 : return _tevent_req_error(req, W_ERROR_V(werror), 29 : location); 30 : } 31 : 32 14211 : bool tevent_req_is_werror(struct tevent_req *req, WERROR *error) 33 : { 34 0 : enum tevent_req_state state; 35 0 : uint64_t err; 36 : 37 14211 : if (!tevent_req_is_error(req, &state, &err)) { 38 13896 : return false; 39 : } 40 315 : switch (state) { 41 0 : case TEVENT_REQ_TIMED_OUT: 42 0 : *error = WERR_TIMEOUT; 43 0 : break; 44 0 : case TEVENT_REQ_NO_MEMORY: 45 0 : *error = WERR_NOT_ENOUGH_MEMORY; 46 0 : break; 47 315 : case TEVENT_REQ_USER_ERROR: 48 315 : *error = W_ERROR(err); 49 315 : break; 50 0 : default: 51 0 : *error = WERR_INTERNAL_ERROR; 52 0 : break; 53 : } 54 315 : return true; 55 : } 56 : 57 4774 : WERROR tevent_req_simple_recv_werror(struct tevent_req *req) 58 : { 59 0 : WERROR werror; 60 : 61 4774 : if (tevent_req_is_werror(req, &werror)) { 62 6 : tevent_req_received(req); 63 6 : return werror; 64 : } 65 4768 : tevent_req_received(req); 66 4768 : return WERR_OK; 67 : } 68 : 69 0 : void tevent_req_simple_finish_werror(struct tevent_req *subreq, 70 : WERROR subreq_error) 71 : { 72 0 : struct tevent_req *req = tevent_req_callback_data( 73 : subreq, struct tevent_req); 74 : 75 0 : TALLOC_FREE(subreq); 76 : 77 0 : if (!W_ERROR_IS_OK(subreq_error)) { 78 0 : tevent_req_werror(req, subreq_error); 79 0 : return; 80 : } 81 0 : tevent_req_done(req); 82 : } 83 : 84 0 : bool tevent_req_poll_werror(struct tevent_req *req, 85 : struct tevent_context *ev, 86 : WERROR *err) 87 : { 88 0 : bool ret = tevent_req_poll(req, ev); 89 0 : if (!ret) { 90 0 : NTSTATUS status = map_nt_error_from_unix_common(errno); 91 0 : *err = ntstatus_to_werror(status); 92 : } 93 0 : return ret; 94 : }