Merge branch 'v3-2-test' of ssh://git.samba.org/data/git/samba into v3-2-test
[ira/wip.git] / source3 / winbindd / winbindd_dual.c
index 2739ab542e2cf988fa2c5d5d4a38bba44dd75fb8..1f2972f9b2be5b3a6c9dd7c47f7e109b98f3ca34 100644 (file)
@@ -481,7 +481,6 @@ void winbind_child_died(pid_t pid)
        child->event.fd = 0;
        child->event.flags = 0;
        child->pid = 0;
-       SAFE_FREE(child->logfilename);
 
        schedule_async_request(child);
 }
@@ -678,6 +677,88 @@ void winbind_msg_dump_event_list(struct messaging_context *msg_ctx,
 
 }
 
+void winbind_msg_dump_domain_list(struct messaging_context *msg_ctx,
+                                 void *private_data,
+                                 uint32_t msg_type,
+                                 struct server_id server_id,
+                                 DATA_BLOB *data)
+{
+       TALLOC_CTX *mem_ctx;
+       const char *message = NULL;
+       struct server_id *sender = NULL;
+       const char *domain = NULL;
+       char *s = NULL;
+       NTSTATUS status;
+       struct winbindd_domain *dom = NULL;
+
+       DEBUG(5,("winbind_msg_dump_domain_list received.\n"));
+
+       if (!data || !data->data) {
+               return;
+       }
+
+       if (data->length < sizeof(struct server_id)) {
+               return;
+       }
+
+       mem_ctx = talloc_init("winbind_msg_dump_domain_list");
+       if (!mem_ctx) {
+               return;
+       }
+
+       sender = (struct server_id *)data->data;
+       if (data->length > sizeof(struct server_id)) {
+               domain = (const char *)data->data+sizeof(struct server_id);
+       }
+
+       if (domain) {
+
+               DEBUG(5,("winbind_msg_dump_domain_list for domain: %s\n",
+                       domain));
+
+               message = NDR_PRINT_STRUCT_STRING(mem_ctx, winbindd_domain,
+                                                 find_domain_from_name_noinit(domain));
+               if (!message) {
+                       talloc_destroy(mem_ctx);
+                       return;
+               }
+
+               messaging_send_buf(msg_ctx, *sender,
+                                  MSG_WINBIND_DUMP_DOMAIN_LIST,
+                                  (uint8_t *)message, strlen(message) + 1);
+
+               talloc_destroy(mem_ctx);
+
+               return;
+       }
+
+       DEBUG(5,("winbind_msg_dump_domain_list all domains\n"));
+
+       for (dom = domain_list(); dom; dom=dom->next) {
+               message = NDR_PRINT_STRUCT_STRING(mem_ctx, winbindd_domain, dom);
+               if (!message) {
+                       talloc_destroy(mem_ctx);
+                       return;
+               }
+
+               s = talloc_asprintf_append(s, "%s\n", message);
+               if (!s) {
+                       talloc_destroy(mem_ctx);
+                       return;
+               }
+       }
+
+       status = messaging_send_buf(msg_ctx, *sender,
+                                   MSG_WINBIND_DUMP_DOMAIN_LIST,
+                                   (uint8_t *)s, strlen(s) + 1);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(0,("failed to send message: %s\n",
+               nt_errstr(status)));
+       }
+
+       talloc_destroy(mem_ctx);
+}
+
 static void account_lockout_policy_handler(struct event_context *ctx,
                                           struct timed_event *te,
                                           const struct timeval *now,
@@ -879,6 +960,13 @@ static bool fork_domain_child(struct winbindd_child *child)
        struct winbindd_cli_state state;
        struct winbindd_domain *domain;
 
+       if (child->domain) {
+               DEBUG(10, ("fork_domain_child called for domain '%s'\n",
+                          child->domain->name));
+       } else {
+               DEBUG(10, ("fork_domain_child called without domain.\n"));
+       }
+
        if (socketpair(AF_UNIX, SOCK_STREAM, 0, fdpair) != 0) {
                DEBUG(0, ("Could not open child pipe: %s\n",
                          strerror(errno)));
@@ -948,6 +1036,8 @@ static bool fork_domain_child(struct winbindd_child *child)
                             MSG_WINBIND_ONLINESTATUS, NULL);
        messaging_deregister(winbind_messaging_context(),
                             MSG_DUMP_EVENT_LIST, NULL);
+       messaging_deregister(winbind_messaging_context(),
+                            MSG_WINBIND_DUMP_DOMAIN_LIST, NULL);
 
        /* Handle online/offline messages. */
        messaging_register(winbind_messaging_context(), NULL,