s3-secrets: only include secrets.h when needed.
[samba.git] / source3 / winbindd / winbindd.c
index 948e9ec93ab116b1c8c70a6e950888e12ebc8f63..05114b2432a8000f6b2e41356867a6b2f64db172 100644 (file)
@@ -26,6 +26,9 @@
 #include "winbindd.h"
 #include "../../nsswitch/libwbclient/wbc_async.h"
 #include "librpc/gen_ndr/messaging.h"
+#include "../librpc/gen_ndr/srv_lsa.h"
+#include "../librpc/gen_ndr/srv_samr.h"
+#include "secrets.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
@@ -37,20 +40,6 @@ static bool interactive = False;
 
 extern bool override_logfile;
 
-struct messaging_context *winbind_messaging_context(void)
-{
-       static struct messaging_context *ctx;
-
-       if (ctx == NULL) {
-               ctx = messaging_init(NULL, procid_self(),
-                                    winbind_event_context());
-       }
-       if (ctx == NULL) {
-               DEBUG(0, ("Could not init winbind messaging context.\n"));
-       }
-       return ctx;
-}
-
 /* Reload configuration */
 
 static bool reload_services_file(const char *lfile)
@@ -190,7 +179,7 @@ static void terminate(bool is_parent)
 #endif
 
        if (is_parent) {
-               serverid_deregister_self();
+               serverid_deregister(procid_self());
                pidfile_unlink();
        }
 
@@ -574,7 +563,7 @@ static void process_request(struct winbindd_cli_state *state)
        struct winbindd_dispatch_table *table = dispatch_table;
        struct winbindd_async_dispatch_table *atable;
 
-       state->mem_ctx = talloc_init("winbind request");
+       state->mem_ctx = talloc_named(state, 0, "winbind request");
        if (state->mem_ctx == NULL)
                return;
 
@@ -938,6 +927,20 @@ static void winbindd_listen_fde_handler(struct tevent_context *ev,
        new_connection(s->fd, s->privileged);
 }
 
+/*
+ * Winbindd socket accessor functions
+ */
+
+const char *get_winbind_pipe_dir(void)
+{
+       return lp_parm_const_string(-1, "winbindd", "socket dir", WINBINDD_SOCKET_DIR);
+}
+
+char *get_winbind_priv_pipe_dir(void)
+{
+       return lock_path(WINBINDD_PRIV_SOCKET_SUBDIR);
+}
+
 static bool winbindd_setup_listeners(void)
 {
        struct winbindd_listen_state *pub_state = NULL;
@@ -951,7 +954,8 @@ static bool winbindd_setup_listeners(void)
        }
 
        pub_state->privileged = false;
-       pub_state->fd = open_winbindd_socket();
+       pub_state->fd = create_pipe_sock(
+               get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755);
        if (pub_state->fd == -1) {
                goto failed;
        }
@@ -972,7 +976,8 @@ static bool winbindd_setup_listeners(void)
        }
 
        priv_state->privileged = true;
-       priv_state->fd = open_winbindd_priv_socket();
+       priv_state->fd = create_pipe_sock(
+               get_winbind_priv_pipe_dir(), WINBINDD_SOCKET_NAME, 0750);
        if (priv_state->fd == -1) {
                goto failed;
        }
@@ -1003,6 +1008,95 @@ bool winbindd_use_cache(void)
        return !opt_nocache;
 }
 
+void winbindd_register_handlers(void)
+{
+       struct tevent_timer *te;
+       /* Setup signal handlers */
+
+       if (!winbindd_setup_sig_term_handler(true))
+               exit(1);
+       if (!winbindd_setup_sig_hup_handler(NULL))
+               exit(1);
+       if (!winbindd_setup_sig_chld_handler())
+               exit(1);
+       if (!winbindd_setup_sig_usr2_handler())
+               exit(1);
+
+       CatchSignal(SIGPIPE, SIG_IGN);                 /* Ignore sigpipe */
+
+       /*
+        * Ensure all cache and idmap caches are consistent
+        * and initialized before we startup.
+        */
+       if (!winbindd_cache_validate_and_initialize()) {
+               exit(1);
+       }
+
+       /* get broadcast messages */
+
+       if (!serverid_register(procid_self(),
+                              FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP)) {
+               DEBUG(1, ("Could not register myself in serverid.tdb\n"));
+               exit(1);
+       }
+
+       /* React on 'smbcontrol winbindd reload-config' in the same way
+          as to SIGHUP signal */
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_SMB_CONF_UPDATED, msg_reload_services);
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_SHUTDOWN, msg_shutdown);
+
+       /* Handle online/offline messages. */
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_OFFLINE, winbind_msg_offline);
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_ONLINE, winbind_msg_online);
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus);
+
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list);
+
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_VALIDATE_CACHE,
+                          winbind_msg_validate_cache);
+
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_DUMP_DOMAIN_LIST,
+                          winbind_msg_dump_domain_list);
+
+       /* Register handler for MSG_DEBUG. */
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_DEBUG,
+                          winbind_msg_debug);
+
+       netsamlogon_cache_init(); /* Non-critical */
+
+       /* clear the cached list of trusted domains */
+
+       wcache_tdc_clear();
+
+       if (!init_domain_list()) {
+               DEBUG(0,("unable to initialize domain list\n"));
+               exit(1);
+       }
+
+       init_idmap_child();
+       init_locator_child();
+
+       smb_nscd_flush_user_cache();
+       smb_nscd_flush_group_cache();
+
+       te = tevent_add_timer(winbind_event_context(), NULL, timeval_zero(),
+                             rescan_trusted_domains, NULL);
+       if (te == NULL) {
+               DEBUG(0, ("Could not trigger rescan_trusted_domains()\n"));
+               exit(1);
+       }
+
+}
+
 /* Main function */
 
 int main(int argc, char **argv, char **envp)
@@ -1031,7 +1125,7 @@ int main(int argc, char **argv, char **envp)
        poptContext pc;
        int opt;
        TALLOC_CTX *frame = talloc_stackframe();
-       struct tevent_timer *te;
+       NTSTATUS status;
 
        /* glibc (?) likes to print "User defined signal 1" and exit if a
           SIGUSR[12] is received before a handler is installed */
@@ -1188,89 +1282,24 @@ int main(int argc, char **argv, char **envp)
         * winbindd-specific resources we must free yet. JRA.
         */
 
-       if (!NT_STATUS_IS_OK(reinit_after_fork(winbind_messaging_context(),
-                                              winbind_event_context(),
-                                              false))) {
+       status = reinit_after_fork(winbind_messaging_context(),
+                                  winbind_event_context(),
+                                  procid_self(), false);
+       if (!NT_STATUS_IS_OK(status)) {
                DEBUG(0,("reinit_after_fork() failed\n"));
                exit(1);
        }
 
-       /* Setup signal handlers */
+       winbindd_register_handlers();
 
-       if (!winbindd_setup_sig_term_handler(true))
-               exit(1);
-       if (!winbindd_setup_sig_hup_handler(NULL))
-               exit(1);
-       if (!winbindd_setup_sig_chld_handler())
-               exit(1);
-       if (!winbindd_setup_sig_usr2_handler())
-               exit(1);
+       rpc_lsarpc_init(NULL);
+       rpc_samr_init(NULL);
 
-       CatchSignal(SIGPIPE, SIG_IGN);                 /* Ignore sigpipe */
-
-       /*
-        * Ensure all cache and idmap caches are consistent
-        * and initialized before we startup.
-        */
-       if (!winbindd_cache_validate_and_initialize()) {
-               exit(1);
-       }
-
-       /* get broadcast messages */
-
-       if (!serverid_register_self(FLAG_MSG_GENERAL|FLAG_MSG_DBWRAP)) {
-               DEBUG(1, ("Could not register myself in serverid.tdb\n"));
+       if (!init_system_info()) {
+               DEBUG(0,("ERROR: failed to setup system user info.\n"));
                exit(1);
        }
 
-       /* React on 'smbcontrol winbindd reload-config' in the same way
-          as to SIGHUP signal */
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_SMB_CONF_UPDATED, msg_reload_services);
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_SHUTDOWN, msg_shutdown);
-
-       /* Handle online/offline messages. */
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_WINBIND_OFFLINE, winbind_msg_offline);
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_WINBIND_ONLINE, winbind_msg_online);
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus);
-
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list);
-
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_WINBIND_VALIDATE_CACHE,
-                          winbind_msg_validate_cache);
-
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_WINBIND_DUMP_DOMAIN_LIST,
-                          winbind_msg_dump_domain_list);
-
-       /* Register handler for MSG_DEBUG. */
-       messaging_register(winbind_messaging_context(), NULL,
-                          MSG_DEBUG,
-                          winbind_msg_debug);
-
-       netsamlogon_cache_init(); /* Non-critical */
-
-       /* clear the cached list of trusted domains */
-
-       wcache_tdc_clear();     
-
-       if (!init_domain_list()) {
-               DEBUG(0,("unable to initialize domain list\n"));
-               exit(1);
-       }
-
-       init_idmap_child();
-       init_locator_child();
-
-       smb_nscd_flush_user_cache();
-       smb_nscd_flush_group_cache();
-
        /* setup listen sockets */
 
        if (!winbindd_setup_listeners()) {
@@ -1278,13 +1307,6 @@ int main(int argc, char **argv, char **envp)
                exit(1);
        }
 
-       te = tevent_add_timer(winbind_event_context(), NULL, timeval_zero(),
-                             rescan_trusted_domains, NULL);
-       if (te == NULL) {
-               DEBUG(0, ("Could not trigger rescan_trusted_domains()\n"));
-               exit(1);
-       }
-
        TALLOC_FREE(frame);
        /* Loop waiting for requests */
        while (1) {