s3-winbindd: Remove undocumented winbindd:socket dir parameter
[mat/samba.git] / source3 / winbindd / winbindd.c
index 654c14c504de6d4ad964977318d5e620373a1f0f..31280c216b86e4784e73ff6a245f40888d61fa62 100644 (file)
@@ -49,14 +49,42 @@ static bool interactive = False;
 
 extern bool override_logfile;
 
+struct tevent_context *winbind_event_context(void)
+{
+       static struct tevent_context *ev = NULL;
+
+       if (ev != NULL) {
+               return ev;
+       }
+
+       /*
+        * Note we MUST use the NULL context here, not the autofree context,
+        * to avoid side effects in forked children exiting.
+        */
+       ev = samba_tevent_context_init(NULL);
+       if (ev == NULL) {
+               smb_panic("Could not init winbindd's messaging context.\n");
+       }
+       return ev;
+}
+
 struct messaging_context *winbind_messaging_context(void)
 {
-       struct messaging_context *msg_ctx = server_messaging_context();
-       if (likely(msg_ctx != NULL)) {
-               return msg_ctx;
+       static struct messaging_context *msg = NULL;
+
+       if (msg != NULL) {
+               return msg;
+       }
+
+       /*
+        * Note we MUST use the NULL context here, not the autofree context,
+        * to avoid side effects in forked children exiting.
+        */
+       msg = messaging_init(NULL, winbind_event_context());
+       if (msg == NULL) {
+               smb_panic("Could not init winbindd's messaging context.\n");
        }
-       smb_panic("Could not init winbindd's messaging context.\n");
-       return NULL;
+       return msg;
 }
 
 /* Reload configuration */
@@ -161,7 +189,7 @@ static void terminate(bool is_parent)
                char *path = NULL;
 
                if (asprintf(&path, "%s/%s",
-                       get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME) > 0) {
+                       lp_winbindd_socket_directory(), WINBINDD_SOCKET_NAME) > 0) {
                        unlink(path);
                        SAFE_FREE(path);
                }
@@ -184,7 +212,9 @@ static void terminate(bool is_parent)
 #endif
 
        if (is_parent) {
-               serverid_deregister(procid_self());
+               struct messaging_context *msg = winbind_messaging_context();
+               struct server_id self = messaging_server_id(msg);
+               serverid_deregister(self);
                pidfile_unlink(lp_piddir(), "winbindd");
        }
 
@@ -278,6 +308,8 @@ bool winbindd_setup_stdin_handler(bool parent, bool foreground)
        bool *is_parent;
 
        if (foreground) {
+               struct stat st;
+
                is_parent = talloc(winbind_event_context(), bool);
                if (!is_parent) {
                        return false;
@@ -288,8 +320,19 @@ bool winbindd_setup_stdin_handler(bool parent, bool foreground)
                /* if we are running in the foreground then look for
                   EOF on stdin, and exit if it happens. This allows
                   us to die if the parent process dies
+                  Only do this on a pipe or socket, no other device.
                */
-               tevent_add_fd(winbind_event_context(), is_parent, 0, TEVENT_FD_READ, winbindd_stdin_handler, is_parent);
+               if (fstat(0, &st) != 0) {
+                       return false;
+               }
+               if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
+                       tevent_add_fd(winbind_event_context(),
+                                       is_parent,
+                                       0,
+                                       TEVENT_FD_READ,
+                                       winbindd_stdin_handler,
+                                       is_parent);
+               }
        }
 
        return true;
@@ -818,7 +861,7 @@ static void new_connection(int listen_sock, bool privileged)
 
        if (sock == -1) {
                if (errno != EINTR) {
-                       DEBUG(0, ("Faild to accept socket - %s\n",
+                       DEBUG(0, ("Failed to accept socket - %s\n",
                                  strerror(errno)));
                }
                return;
@@ -988,11 +1031,6 @@ static void winbindd_listen_fde_handler(struct tevent_context *ev,
  * Winbindd socket accessor functions
  */
 
-const char *get_winbind_pipe_dir(void)
-{
-       return lp_parm_const_string(-1, "winbindd", "socket dir", get_dyn_WINBINDD_SOCKET_DIR());
-}
-
 char *get_winbind_priv_pipe_dir(void)
 {
        return state_path(WINBINDD_PRIV_SOCKET_SUBDIR);
@@ -1013,7 +1051,7 @@ static bool winbindd_setup_listeners(void)
 
        pub_state->privileged = false;
        pub_state->fd = create_pipe_sock(
-               get_winbind_pipe_dir(), WINBINDD_SOCKET_NAME, 0755);
+               lp_winbindd_socket_directory(), WINBINDD_SOCKET_NAME, 0755);
        if (pub_state->fd == -1) {
                goto failed;
        }
@@ -1125,6 +1163,12 @@ static void winbindd_register_handlers(struct messaging_context *msg_ctx,
        messaging_register(msg_ctx, NULL,
                           MSG_WINBIND_ONLINESTATUS, winbind_msg_onlinestatus);
 
+       /* Handle domain online/offline messages for domains */
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_DOMAIN_OFFLINE, winbind_msg_domain_offline);
+       messaging_register(winbind_messaging_context(), NULL,
+                          MSG_WINBIND_DOMAIN_ONLINE, winbind_msg_domain_online);
+
        messaging_register(msg_ctx, NULL,
                           MSG_DUMP_EVENT_LIST, winbind_msg_dump_event_list);
 
@@ -1285,6 +1329,7 @@ int main(int argc, char **argv, char **envp)
        int opt;
        TALLOC_CTX *frame;
        NTSTATUS status;
+       bool ok;
 
        /*
         * Do this before any other talloc operation
@@ -1292,6 +1337,12 @@ int main(int argc, char **argv, char **envp)
        talloc_enable_null_tracking();
        frame = talloc_stackframe();
 
+       /*
+        * We want total control over the permissions on created files,
+        * so set our umask to 0.
+        */
+       umask(0);
+
        setup_logging("winbindd", DEBUG_DEFAULT_STDOUT);
 
        /* glibc (?) likes to print "User defined signal 1" and exit if a
@@ -1424,12 +1475,18 @@ int main(int argc, char **argv, char **envp)
                exit(1);
        }
 
-       if (!directory_exist(lp_lockdir())) {
-               mkdir(lp_lockdir(), 0755);
+       ok = directory_create_or_exist(lp_lockdir(), geteuid(), 0755);
+       if (!ok) {
+               DEBUG(0, ("Failed to create directory %s for lock files - %s\n",
+                         lp_lockdir(), strerror(errno)));
+               exit(1);
        }
 
-       if (!directory_exist(lp_piddir())) {
-               mkdir(lp_piddir(), 0755);
+       ok = directory_create_or_exist(lp_piddir(), geteuid(), 0755);
+       if (!ok) {
+               DEBUG(0, ("Failed to create directory %s for pid files - %s\n",
+                         lp_piddir(), strerror(errno)));
+               exit(1);
        }
 
        /* Setup names. */