Ignore:
Timestamp:
Nov 27, 2012, 4:43:17 PM (13 years ago)
Author:
Silvan Scherrer
Message:

Samba Server: updated trunk to 3.6.0

Location:
trunk/server
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/server

  • trunk/server/source4/libnet/libnet_lookup.c

    r414 r745  
    2323
    2424#include "includes.h"
    25 #include "lib/events/events.h"
    2625#include "libnet/libnet.h"
    2726#include "libcli/composite/composite.h"
    2827#include "auth/credentials/credentials.h"
    29 #include "lib/messaging/messaging.h"
    30 #include "lib/messaging/irpc.h"
    3128#include "libcli/resolve/resolve.h"
    32 #include "libcli/finddcs.h"
     29#include "libcli/finddc.h"
    3330#include "libcli/security/security.h"
    34 #include "librpc/gen_ndr/lsa.h"
    3531#include "librpc/gen_ndr/ndr_lsa_c.h"
    36 
    3732#include "param/param.h"
    3833
     
    187182 * Sends asynchronous LookupDCs request
    188183 */
    189 struct composite_context* libnet_LookupDCs_send(struct libnet_context *ctx,
    190                                                 TALLOC_CTX *mem_ctx,
    191                                                 struct libnet_LookupDCs *io)
    192 {
    193         struct composite_context *c;
    194         struct messaging_context *msg_ctx =
    195                 messaging_client_init(mem_ctx, lp_messaging_path(mem_ctx, ctx->lp_ctx),
    196                                       lp_iconv_convenience(ctx->lp_ctx), ctx->event_ctx);
    197 
    198         c = finddcs_send(mem_ctx, lp_netbios_name(ctx->lp_ctx), lp_nbt_port(ctx->lp_ctx),
    199                          io->in.domain_name, io->in.name_type,
    200                          NULL, lp_iconv_convenience(ctx->lp_ctx),
    201                          ctx->resolve_ctx, ctx->event_ctx, msg_ctx);
    202         return c;
     184struct tevent_req *libnet_LookupDCs_send(struct libnet_context *ctx,
     185                                         TALLOC_CTX *mem_ctx,
     186                                         struct libnet_LookupDCs *io)
     187{
     188        struct tevent_req *req;
     189        struct finddcs finddcs_io;
     190
     191        ZERO_STRUCT(finddcs_io);
     192
     193        if (strcasecmp_m(io->in.domain_name, lpcfg_workgroup(ctx->lp_ctx)) == 0) {
     194                finddcs_io.in.domain_name = lpcfg_dnsdomain(ctx->lp_ctx);
     195        } else {
     196                finddcs_io.in.domain_name = io->in.domain_name;
     197        }
     198        finddcs_io.in.minimum_dc_flags = NBT_SERVER_LDAP | NBT_SERVER_DS | NBT_SERVER_WRITABLE;
     199        finddcs_io.in.server_address = ctx->server_address;
     200
     201        req = finddcs_cldap_send(mem_ctx, &finddcs_io, ctx->resolve_ctx, ctx->event_ctx);
     202        return req;
    203203}
    204204
     
    212212 */
    213213
    214 NTSTATUS libnet_LookupDCs_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
     214NTSTATUS libnet_LookupDCs_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
    215215                               struct libnet_LookupDCs *io)
    216216{
    217217        NTSTATUS status;
    218         status = finddcs_recv(c, mem_ctx, &io->out.num_dcs, &io->out.dcs);
    219         if (!NT_STATUS_IS_OK(status)) {
    220                 return status;
    221         }
     218        struct finddcs finddcs_io;
     219        status = finddcs_cldap_recv(req, mem_ctx, &finddcs_io);
     220        talloc_free(req);
     221        io->out.num_dcs = 1;
     222        io->out.dcs = talloc(mem_ctx, struct nbt_dc_name);
     223        NT_STATUS_HAVE_NO_MEMORY(io->out.dcs);
     224        io->out.dcs[0].address = finddcs_io.out.address;
     225        io->out.dcs[0].name = finddcs_io.out.netlogon.data.nt5_ex.pdc_dns_name;
    222226        return status;
    223227}
     
    230234                          struct libnet_LookupDCs *io)
    231235{
    232         struct composite_context *c = libnet_LookupDCs_send(ctx, mem_ctx, io);
    233         return libnet_LookupDCs_recv(c, mem_ctx, io);
     236        struct tevent_req *req = libnet_LookupDCs_send(ctx, mem_ctx, io);
     237        return libnet_LookupDCs_recv(req, mem_ctx, io);
    234238}
    235239
     
    253257                                  struct lookup_name_state *s);
    254258static void continue_lookup_name(struct composite_context *ctx);
    255 static void continue_name_found(struct rpc_request *req);
     259static void continue_name_found(struct tevent_req *subreq);
    256260
    257261
     
    263267        struct composite_context *c;
    264268        struct lookup_name_state *s;
    265         struct rpc_request *lookup_req;
     269        struct tevent_req *subreq;
    266270        bool prereq_met = false;
    267271
     
    284288        if (!prepare_lookup_params(ctx, c, s)) return c;
    285289
    286         lookup_req = dcerpc_lsa_LookupNames_send(ctx->lsa.pipe, c, &s->lookup);
    287         if (composite_nomem(lookup_req, c)) return c;
    288 
    289         composite_continue_rpc(c, lookup_req, continue_name_found, c);
     290        subreq = dcerpc_lsa_LookupNames_r_send(s, c->event_ctx,
     291                                               ctx->lsa.pipe->binding_handle,
     292                                               &s->lookup);
     293        if (composite_nomem(subreq, c)) return c;
     294
     295        tevent_req_set_callback(subreq, continue_name_found, c);
    290296        return c;
    291297}
     
    324330        struct composite_context *c;
    325331        struct lookup_name_state *s;
    326         struct rpc_request *lookup_req;
     332        struct tevent_req *subreq;
    327333
    328334        c = talloc_get_type(ctx->async.private_data, struct composite_context);
     
    334340        if (!prepare_lookup_params(s->ctx, c, s)) return;
    335341
    336         lookup_req = dcerpc_lsa_LookupNames_send(s->ctx->lsa.pipe, c, &s->lookup);
    337         if (composite_nomem(lookup_req, c)) return;
    338        
    339         composite_continue_rpc(c, lookup_req, continue_name_found, c);
    340 }
    341 
    342 
    343 static void continue_name_found(struct rpc_request *req)
     342        subreq = dcerpc_lsa_LookupNames_r_send(s, c->event_ctx,
     343                                               s->ctx->lsa.pipe->binding_handle,
     344                                               &s->lookup);
     345        if (composite_nomem(subreq, c)) return;
     346       
     347        tevent_req_set_callback(subreq, continue_name_found, c);
     348}
     349
     350
     351static void continue_name_found(struct tevent_req *subreq)
    344352{
    345353        struct composite_context *c;
    346354        struct lookup_name_state *s;
    347355
    348         c = talloc_get_type(req->async.private_data, struct composite_context);
     356        c = tevent_req_callback_data(subreq, struct composite_context);
    349357        s = talloc_get_type(c->private_data, struct lookup_name_state);
    350358
    351         c->status = dcerpc_ndr_request_recv(req);
     359        c->status = dcerpc_lsa_LookupNames_r_recv(subreq, s);
     360        TALLOC_FREE(subreq);
    352361        if (!composite_is_ok(c)) return;
    353362
Note: See TracChangeset for help on using the changeset viewer.