SPLIT: get async winbind child building
[ddiss/samba.git] / source3 / winbindd / winbindd_locator.c
index 3fcb9de7a8f97527473466ad3896606a5bead188..eb6bb35d132d1ab3af1faf889a602d277c9e9cdf 100644 (file)
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
 
-static struct winbindd_child static_locator_child;
 
-void init_locator_child(void)
-{
-       setup_domain_child(NULL, &static_locator_child, "locator");
-}
+static struct winbindd_child static_locator_child;
 
 struct winbindd_child *locator_child(void)
 {
        return &static_locator_child;
 }
 
-void winbindd_dsgetdcname(struct winbindd_cli_state *state)
-{
-       state->request.domain_name
-               [sizeof(state->request.domain_name)-1] = '\0';
-
-       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
-                 state->request.domain_name));
-
-       sendto_child(state, locator_child());
-}
-
-enum winbindd_result winbindd_dual_dsgetdcname(struct winbindd_domain *domain,
-                                              struct winbindd_cli_state *state)
-{
-       NTSTATUS result;
-       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
-       const char *dc = NULL;
-
-       state->request.domain_name
-               [sizeof(state->request.domain_name)-1] = '\0';
-
-       DEBUG(3, ("[%5lu]: DsGetDcName for %s\n", (unsigned long)state->pid,
-                 state->request.domain_name));
-
-       result = DsGetDcName(state->mem_ctx, NULL, state->request.domain_name,
-                            NULL, NULL, state->request.flags, &info);
-
-       if (!NT_STATUS_IS_OK(result)) {
-               return WINBINDD_ERROR;
-       }
-
-       if (info->domain_controller_address) {
-               dc = info->domain_controller_address;
-               if ((dc[0] == '\\') && (dc[1] == '\\')) {
-                       dc += 2;
-               }
-       }
-
-       if ((!dc || !is_ipaddress_v4(dc)) && info->domain_controller_name) {
-               dc = info->domain_controller_name;
-       }
-
-       if (!dc || !*dc) {
-               return WINBINDD_ERROR;
+static const struct winbindd_child_dispatch_table locator_dispatch_table[] = {
+       {
+               .name           = "PING",
+               .struct_cmd     = WINBINDD_PING,
+               .type           = WINBINDD_CHILD_DISPATCH_SYNC,
+               .sync.struct_fn = winbindd_dual_ping,
+       },{
+               .name           = "NDRCMD",
+               .struct_cmd     = WINBINDD_DUAL_NDRCMD,
+               .type           = WINBINDD_CHILD_DISPATCH_ASYNC,
+               .async.struct_fn_send = winbindd_dual_ndrcmd_send,
+               .async.struct_fn_recv = winbindd_dual_ndrcmd_recv,
+       },{
+               .name           = NULL,
        }
+};
 
-       fstrcpy(state->response.data.dc_name, dc);
-
-       return WINBINDD_OK;
+void init_locator_child(void)
+{
+       setup_child(NULL, &static_locator_child,
+                   locator_dispatch_table,
+                   "log.winbindd", "locator");
 }