+++ /dev/null
-/*
- Unix SMB/CIFS implementation.
- async seqnum
- Copyright (C) Volker Lendecke 2009
-
- 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 "includes.h"
-#include "winbindd.h"
-#include "librpc/gen_ndr/ndr_winbind_c.h"
-
-struct wb_seqnum_state {
- uint32_t seqnum;
-};
-
-static void wb_seqnum_done(struct tevent_req *subreq);
-
-struct tevent_req *wb_seqnum_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct winbindd_domain *domain)
-{
- struct tevent_req *req, *subreq;
- struct wb_seqnum_state *state;
-
- req = tevent_req_create(mem_ctx, &state, struct wb_seqnum_state);
- if (req == NULL) {
- return NULL;
- }
- subreq = dcerpc_wbint_QuerySequenceNumber_send(
- state, ev, dom_child_handle(domain), &state->seqnum);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, wb_seqnum_done, req);
- return req;
-}
-
-static void wb_seqnum_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct wb_seqnum_state *state = tevent_req_data(
- req, struct wb_seqnum_state);
- NTSTATUS status, result;
-
- status = dcerpc_wbint_QuerySequenceNumber_recv(subreq, state, &result);
- TALLOC_FREE(subreq);
- if (any_nt_status_not_ok(status, result, &status)) {
- tevent_req_nterror(req, status);
- return;
- }
- tevent_req_done(req);
-}
-
-NTSTATUS wb_seqnum_recv(struct tevent_req *req, uint32_t *seqnum)
-{
- struct wb_seqnum_state *state = tevent_req_data(
- req, struct wb_seqnum_state);
- NTSTATUS status;
-
- if (tevent_req_is_nterror(req, &status)) {
- return status;
- }
- *seqnum = state->seqnum;
- return NT_STATUS_OK;
-}
+++ /dev/null
-/*
- Unix SMB/CIFS implementation.
-
- async seqnums, update the seqnums in winbindd_cache.c
-
- Copyright (C) Volker Lendecke 2009
-
- 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 "includes.h"
-#include "winbindd.h"
-#include "librpc/gen_ndr/ndr_winbind_c.h"
-
-struct wb_seqnums_state {
- int num_domains;
- int num_received;
-
- struct tevent_req **subreqs;
- struct winbindd_domain **domains;
- NTSTATUS *statuses;
- uint32_t *seqnums;
-};
-
-static void wb_seqnums_done(struct tevent_req *subreq);
-
-struct tevent_req *wb_seqnums_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev)
-{
- struct tevent_req *req;
- struct wb_seqnums_state *state;
- struct winbindd_domain *domain;
- int i;
-
- req = tevent_req_create(mem_ctx, &state, struct wb_seqnums_state);
- if (req == NULL) {
- return NULL;
- }
- state->num_received = 0;
- state->num_domains = 0;
-
- for (domain = domain_list(); domain != NULL; domain = domain->next) {
- state->num_domains += 1;
- }
-
- state->subreqs = talloc_array(state, struct tevent_req *,
- state->num_domains);
- state->domains = talloc_zero_array(state, struct winbindd_domain *,
- state->num_domains);
- state->statuses = talloc_array(state, NTSTATUS, state->num_domains);
- state->seqnums = talloc_array(state, uint32_t, state->num_domains);
-
- if ((state->subreqs == NULL) || (state->domains == NULL) ||
- (state->statuses == NULL) || (state->seqnums == NULL)) {
- tevent_req_nterror(req, NT_STATUS_NO_MEMORY);
- return tevent_req_post(req, ev);
- }
-
- i = 0;
-
- for (domain = domain_list(); domain != NULL; domain = domain->next) {
- state->domains[i] = domain;
- state->subreqs[i] = wb_seqnum_send(state->subreqs, ev, domain);
- if (tevent_req_nomem(state->subreqs[i], req)) {
- /* Don't even start all the other requests */
- TALLOC_FREE(state->subreqs);
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(state->subreqs[i], wb_seqnums_done,
- req);
- i += 1;
- }
- return req;
-}
-
-static void wb_seqnums_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct wb_seqnums_state *state = tevent_req_data(
- req, struct wb_seqnums_state);
- NTSTATUS status;
- uint32_t seqnum;
- int i;
-
- status = wb_seqnum_recv(subreq, &seqnum);
-
- for (i=0; i<state->num_domains; i++) {
- if (subreq == state->subreqs[i]) {
- break;
- }
- }
- if (i < state->num_domains) {
- /* found one */
-
- state->subreqs[i] = NULL;
- state->statuses[i] = status;
- if (NT_STATUS_IS_OK(status)) {
- state->seqnums[i] = seqnum;
-
- /*
- * This first assignment might be removed
- * later
- */
- state->domains[i]->sequence_number = seqnum;
-
- if (!wcache_store_seqnum(state->domains[i]->name,
- state->seqnums[i],
- time(NULL))) {
- DEBUG(1, ("wcache_store_seqnum failed for "
- "domain %s\n",
- state->domains[i]->name));
- }
- }
- }
-
- TALLOC_FREE(subreq);
-
- state->num_received += 1;
-
- if (state->num_received >= state->num_domains) {
- tevent_req_done(req);
- }
-}
-
-NTSTATUS wb_seqnums_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
- int *num_domains, struct winbindd_domain ***domains,
- NTSTATUS **statuses, uint32_t **seqnums)
-{
- struct wb_seqnums_state *state = tevent_req_data(
- req, struct wb_seqnums_state);
- NTSTATUS status;
-
- if (tevent_req_is_nterror(req, &status)) {
- return status;
- }
- *num_domains = state->num_domains;
- *domains = talloc_move(mem_ctx, &state->domains);
- *statuses = talloc_move(mem_ctx, &state->statuses);
- *seqnums = talloc_move(mem_ctx, &state->seqnums);
- return NT_STATUS_OK;
-}
winbindd_getuserdomgroups_send, winbindd_getuserdomgroups_recv },
{ WINBINDD_GETGROUPS, "GETGROUPS",
winbindd_getgroups_send, winbindd_getgroups_recv },
- { WINBINDD_SHOW_SEQUENCE, "SHOW_SEQUENCE",
- winbindd_show_sequence_send, winbindd_show_sequence_recv },
{ WINBINDD_GETGRGID, "GETGRGID",
winbindd_getgrgid_send, winbindd_getgrgid_recv },
{ WINBINDD_GETGRNAM, "GETGRNAM",
NTSTATUS winbindd_getgroups_recv(struct tevent_req *req,
struct winbindd_response *response);
-struct tevent_req *wb_seqnum_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct winbindd_domain *domain);
-NTSTATUS wb_seqnum_recv(struct tevent_req *req, uint32_t *seqnum);
-
-struct tevent_req *wb_seqnums_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev);
-NTSTATUS wb_seqnums_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
- int *num_domains, struct winbindd_domain ***domains,
- NTSTATUS **statuses, uint32_t **seqnums);
-
-struct tevent_req *winbindd_show_sequence_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct winbindd_cli_state *cli,
- struct winbindd_request *request);
-NTSTATUS winbindd_show_sequence_recv(struct tevent_req *req,
- struct winbindd_response *response);
-
struct tevent_req *wb_group_members_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
const struct dom_sid *sid,
+++ /dev/null
-/*
- Unix SMB/CIFS implementation.
- async implementation of WINBINDD_SHOW_SEQUENCE
- Copyright (C) Volker Lendecke 2009
-
- 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 "includes.h"
-#include "winbindd.h"
-
-struct winbindd_show_sequence_state {
- bool one_domain;
- /* One domain */
- uint32_t seqnum;
-
- /* All domains */
- int num_domains;
- NTSTATUS *statuses;
- struct winbindd_domain **domains;
- uint32_t *seqnums;
-};
-
-static void winbindd_show_sequence_done_one(struct tevent_req *subreq);
-static void winbindd_show_sequence_done_all(struct tevent_req *subreq);
-
-struct tevent_req *winbindd_show_sequence_send(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct winbindd_cli_state *cli,
- struct winbindd_request *request)
-{
- struct tevent_req *req, *subreq;
- struct winbindd_show_sequence_state *state;
-
- req = tevent_req_create(mem_ctx, &state,
- struct winbindd_show_sequence_state);
- if (req == NULL) {
- return NULL;
- }
- state->one_domain = false;
- state->domains = NULL;
- state->statuses = NULL;
- state->seqnums = NULL;
-
- /* Ensure null termination */
- request->domain_name[sizeof(request->domain_name)-1]='\0';
-
- DEBUG(3, ("show_sequence %s\n", request->domain_name));
-
- if (request->domain_name[0] != '\0') {
- struct winbindd_domain *domain;
-
- state->one_domain = true;
-
- domain = find_domain_from_name_noinit(
- request->domain_name);
- if (domain == NULL) {
- tevent_req_nterror(req, NT_STATUS_NO_SUCH_DOMAIN);
- return tevent_req_post(req, ev);
- }
-
- subreq = wb_seqnum_send(state, ev, domain);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(
- subreq, winbindd_show_sequence_done_one, req);
- return req;
- }
-
- subreq = wb_seqnums_send(state, ev);
- if (tevent_req_nomem(subreq, req)) {
- return tevent_req_post(req, ev);
- }
- tevent_req_set_callback(subreq, winbindd_show_sequence_done_all, req);
- return req;
-}
-
-static void winbindd_show_sequence_done_one(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct winbindd_show_sequence_state *state = tevent_req_data(
- req, struct winbindd_show_sequence_state);
- NTSTATUS status;
-
- status = wb_seqnum_recv(subreq, &state->seqnum);
- TALLOC_FREE(subreq);
- if (tevent_req_nterror(req, status)) {
- return;
- }
- tevent_req_done(req);
-}
-
-static void winbindd_show_sequence_done_all(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct winbindd_show_sequence_state *state = tevent_req_data(
- req, struct winbindd_show_sequence_state);
- NTSTATUS status;
-
- status = wb_seqnums_recv(subreq, state, &state->num_domains,
- &state->domains, &state->statuses,
- &state->seqnums);
- TALLOC_FREE(subreq);
- if (tevent_req_nterror(req, status)) {
- return;
- }
- tevent_req_done(req);
-}
-
-NTSTATUS winbindd_show_sequence_recv(struct tevent_req *req,
- struct winbindd_response *response)
-{
- struct winbindd_show_sequence_state *state = tevent_req_data(
- req, struct winbindd_show_sequence_state);
- NTSTATUS status;
- char *extra_data;
- int i;
-
- if (tevent_req_is_nterror(req, &status)) {
- return status;
- }
-
- if (state->one_domain) {
- response->data.sequence_number = state->seqnum;
- return NT_STATUS_OK;
- }
-
- extra_data = talloc_strdup(response, "");
- if (extra_data == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
-
- for (i=0; i<state->num_domains; i++) {
- if (!NT_STATUS_IS_OK(state->statuses[i])
- || (state->seqnums[i] == DOM_SEQUENCE_NONE)) {
- extra_data = talloc_asprintf_append_buffer(
- extra_data, "%s : DISCONNECTED\n",
- state->domains[i]->name);
- } else {
- extra_data = talloc_asprintf_append_buffer(
- extra_data, "%s : %d\n",
- state->domains[i]->name,
- (int)state->seqnums[i]);
- }
- if (extra_data == NULL) {
- return NT_STATUS_NO_MEMORY;
- }
- }
-
- response->extra_data.data = extra_data;
- response->length += talloc_get_size(extra_data);
- return NT_STATUS_OK;
-}
wb_lookupusergroups.c
wb_getpwsid.c
wb_gettoken.c
- wb_seqnum.c
- wb_seqnums.c
wb_group_members.c
wb_alias_members.c
wb_getgrsid.c
winbindd_getsidaliases.c
winbindd_getuserdomgroups.c
winbindd_getgroups.c
- winbindd_show_sequence.c
winbindd_getgrgid.c
winbindd_getgrnam.c
winbindd_getusersids.c