Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : async seqnum 4 : Copyright (C) Volker Lendecke 2009 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 "includes.h" 21 : #include "winbindd.h" 22 : #include "librpc/gen_ndr/ndr_winbind_c.h" 23 : 24 : struct wb_seqnum_state { 25 : uint32_t seqnum; 26 : }; 27 : 28 : static void wb_seqnum_done(struct tevent_req *subreq); 29 : 30 32 : struct tevent_req *wb_seqnum_send(TALLOC_CTX *mem_ctx, 31 : struct tevent_context *ev, 32 : struct winbindd_domain *domain) 33 : { 34 0 : struct tevent_req *req, *subreq; 35 0 : struct wb_seqnum_state *state; 36 : 37 32 : req = tevent_req_create(mem_ctx, &state, struct wb_seqnum_state); 38 32 : if (req == NULL) { 39 0 : return NULL; 40 : } 41 32 : subreq = dcerpc_wbint_QuerySequenceNumber_send( 42 32 : state, ev, dom_child_handle(domain), &state->seqnum); 43 32 : if (tevent_req_nomem(subreq, req)) { 44 0 : return tevent_req_post(req, ev); 45 : } 46 32 : tevent_req_set_callback(subreq, wb_seqnum_done, req); 47 32 : return req; 48 : } 49 : 50 32 : static void wb_seqnum_done(struct tevent_req *subreq) 51 : { 52 32 : struct tevent_req *req = tevent_req_callback_data( 53 : subreq, struct tevent_req); 54 32 : struct wb_seqnum_state *state = tevent_req_data( 55 : req, struct wb_seqnum_state); 56 0 : NTSTATUS status, result; 57 : 58 32 : status = dcerpc_wbint_QuerySequenceNumber_recv(subreq, state, &result); 59 32 : TALLOC_FREE(subreq); 60 32 : if (any_nt_status_not_ok(status, result, &status)) { 61 0 : tevent_req_nterror(req, status); 62 0 : return; 63 : } 64 32 : tevent_req_done(req); 65 : } 66 : 67 32 : NTSTATUS wb_seqnum_recv(struct tevent_req *req, uint32_t *seqnum) 68 : { 69 32 : struct wb_seqnum_state *state = tevent_req_data( 70 : req, struct wb_seqnum_state); 71 0 : NTSTATUS status; 72 : 73 32 : if (tevent_req_is_nterror(req, &status)) { 74 0 : return status; 75 : } 76 32 : *seqnum = state->seqnum; 77 32 : return NT_STATUS_OK; 78 : }