Add dump-domain-list command for debugging winbindd's domain_list.
authorGünther Deschner <gd@samba.org>
Thu, 24 Jan 2008 15:09:20 +0000 (16:09 +0100)
committerGünther Deschner <gd@samba.org>
Thu, 24 Jan 2008 15:21:53 +0000 (16:21 +0100)
Guenther
(This used to be commit 10fa43f2840899c0854763e55b9174827c522a5b)

source3/include/messages.h
source3/utils/smbcontrol.c

index 8de41ca049b870f703c90f290c400c4fe41ecfc4..c97ad982b3c34ab402e7588db41dc27a0502622e 100644 (file)
@@ -97,6 +97,7 @@
 #define MSG_WINBIND_TRY_TO_GO_ONLINE   0x0406
 #define MSG_WINBIND_FAILED_TO_GO_ONLINE 0x0407
 #define MSG_WINBIND_VALIDATE_CACHE     0x0408
+#define MSG_WINBIND_DUMP_DOMAIN_LIST   0x0409
 
 /* event messages */
 #define MSG_DUMP_EVENT_LIST            0x0500
index fe0c22911ea7486d0f15f6415b9c84cafbbe0718..76036bfdde6c8e5fa88e79f508c9caf7f46236d2 100644 (file)
@@ -1008,6 +1008,62 @@ static bool do_dump_event_list(struct messaging_context *msg_ctx,
        return send_message(msg_ctx, pid, MSG_DUMP_EVENT_LIST, NULL, 0);
 }
 
+static bool do_winbind_dump_domain_list(struct messaging_context *msg_ctx,
+                                       const struct server_id pid,
+                                       const int argc, const char **argv)
+{
+       const char *domain = NULL;
+       int domain_len = 0;
+       struct server_id myid;
+       uint8_t *buf = NULL;
+       int buf_len = 0;
+
+       myid = pid_to_procid(sys_getpid());
+
+       if (argc < 1 || argc > 2) {
+               fprintf(stderr, "Usage: smbcontrol <dest> dump_domain_list "
+                       "<domain>\n");
+               return false;
+       }
+
+       if (argc == 2) {
+               domain = argv[1];
+               domain_len = strlen(argv[1]) + 1;
+       }
+
+       messaging_register(msg_ctx, NULL, MSG_WINBIND_DUMP_DOMAIN_LIST,
+                          print_pid_string_cb);
+
+       buf_len = sizeof(myid)+domain_len;
+       buf = SMB_MALLOC(buf_len);
+       if (!buf) {
+               return false;
+       }
+
+       memcpy(buf, &myid, sizeof(myid));
+       memcpy(&buf[sizeof(myid)], domain, domain_len);
+
+       if (!send_message(msg_ctx, pid, MSG_WINBIND_DUMP_DOMAIN_LIST,
+                         buf, buf_len))
+       {
+               SAFE_FREE(buf);
+               return false;
+       }
+
+       wait_replies(msg_ctx, procid_to_pid(&pid) == 0);
+
+       /* No replies were received within the timeout period */
+
+       SAFE_FREE(buf);
+       if (num_replies == 0) {
+               printf("No replies received\n");
+       }
+
+       messaging_deregister(msg_ctx, MSG_WINBIND_DUMP_DOMAIN_LIST, NULL);
+
+       return num_replies;
+}
+
 static void winbind_validate_cache_cb(struct messaging_context *msg,
                                      void *private_data,
                                      uint32_t msg_type,
@@ -1150,6 +1206,7 @@ static const struct {
        { "dump-event-list", do_dump_event_list, "Dump event list"},
        { "validate-cache" , do_winbind_validate_cache,
          "Validate winbind's credential cache" },
+       { "dump-domain-list", do_winbind_dump_domain_list, "Dump winbind domain list"},
        { "noop", do_noop, "Do nothing" },
        { NULL }
 };