1/* 2 Unix SMB/CIFS implementation. 3 4 Command backend for wbinfo -n 5 6 Copyright (C) Volker Lendecke 2005 7 8 This program is free software; you can redistribute it and/or modify 9 it under the terms of the GNU General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or 11 (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program. If not, see <http://www.gnu.org/licenses/>. 20*/ 21 22#include "includes.h" 23#include "libcli/composite/composite.h" 24#include "winbind/wb_server.h" 25#include "winbind/wb_async_helpers.h" 26#include "winbind/wb_helper.h" 27#include "smbd/service_task.h" 28 29struct cmd_lookupname_state { 30 struct composite_context *ctx; 31 const char *name; 32 struct wb_sid_object *result; 33}; 34 35static void lookupname_recv_domain(struct composite_context *ctx); 36static void lookupname_recv_sids(struct composite_context *ctx); 37 38struct composite_context *wb_cmd_lookupname_send(TALLOC_CTX *mem_ctx, 39 struct wbsrv_service *service, 40 const char *dom_name, 41 const char *name) 42{ 43 struct composite_context *result, *ctx; 44 struct cmd_lookupname_state *state; 45 46 result = composite_create(mem_ctx, service->task->event_ctx); 47 if (result == NULL) goto failed; 48 49 state = talloc(result, struct cmd_lookupname_state); 50 if (state == NULL) goto failed; 51 state->ctx = result; 52 result->private_data = state; 53 54 state->name = talloc_asprintf(state, "%s\\%s", dom_name, name); 55 if (state->name == NULL) goto failed; 56 57 ctx = wb_sid2domain_send(state, service, service->primary_sid); 58 if (ctx == NULL) goto failed; 59 60 ctx->async.fn = lookupname_recv_domain; 61 ctx->async.private_data = state; 62 return result; 63 64 failed: 65 talloc_free(result); 66 return NULL; 67} 68 69static void lookupname_recv_domain(struct composite_context *ctx) 70{ 71 struct cmd_lookupname_state *state = 72 talloc_get_type(ctx->async.private_data, 73 struct cmd_lookupname_state); 74 struct wbsrv_domain *domain; 75 76 state->ctx->status = wb_sid2domain_recv(ctx, &domain); 77 if (!composite_is_ok(state->ctx)) return; 78 79 ctx = wb_lsa_lookupnames_send(state, domain->libnet_ctx->lsa.pipe, 80 &domain->libnet_ctx->lsa.handle, 1, &state->name); 81 composite_continue(state->ctx, ctx, lookupname_recv_sids, state); 82} 83 84static void lookupname_recv_sids(struct composite_context *ctx) 85{ 86 struct cmd_lookupname_state *state = 87 talloc_get_type(ctx->async.private_data, 88 struct cmd_lookupname_state); 89 struct wb_sid_object **sids; 90 91 state->ctx->status = wb_lsa_lookupnames_recv(ctx, state, &sids); 92 if (!composite_is_ok(state->ctx)) return; 93 94 state->result = sids[0]; 95 composite_done(state->ctx); 96} 97 98NTSTATUS wb_cmd_lookupname_recv(struct composite_context *c, 99 TALLOC_CTX *mem_ctx, 100 struct wb_sid_object **sid) 101{ 102 struct cmd_lookupname_state *state = 103 talloc_get_type(c->private_data, struct cmd_lookupname_state); 104 NTSTATUS status = composite_wait(c); 105 if (NT_STATUS_IS_OK(status)) { 106 *sid = talloc_steal(mem_ctx, state->result); 107 } 108 talloc_free(state); 109 return status; 110} 111 112NTSTATUS wb_cmd_lookupname(TALLOC_CTX *mem_ctx, 113 struct wbsrv_service *service, 114 const char *dom_name, 115 const char *name, 116 struct wb_sid_object **sid) 117{ 118 struct composite_context *c = 119 wb_cmd_lookupname_send(mem_ctx, service, dom_name, name); 120 return wb_cmd_lookupname_recv(c, mem_ctx, sid); 121} 122