s3-winbindd: call dump_core_setup after command line option has been parsed
[ddiss/samba.git] / source3 / winbindd / winbindd.c
index 92ae12fe766a85a59b003503e72cbf73813c7914..15aafebf725440419e84d089234352a03e3ef452 100644 (file)
 #include "winbindd.h"
 #include "nsswitch/winbind_client.h"
 #include "nsswitch/wb_reqtrans.h"
-#include "librpc/gen_ndr/messaging.h"
+#include "ntdomain.h"
 #include "../librpc/gen_ndr/srv_lsa.h"
 #include "../librpc/gen_ndr/srv_samr.h"
 #include "secrets.h"
 #include "idmap.h"
 #include "lib/addrchange.h"
+#include "serverid.h"
+#include "auth.h"
+#include "messages.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_WINBIND
@@ -62,11 +65,12 @@ static bool reload_services_file(const char *lfile)
        bool ret;
 
        if (lp_loaded()) {
-               const char *fname = lp_configfile();
+               char *fname = lp_configfile();
 
                if (file_exist(fname) && !strcsequal(fname,get_dyn_CONFIGFILE())) {
                        set_dyn_CONFIGFILE(fname);
                }
+               TALLOC_FREE(fname);
        }
 
        /* if this is a child, restore the logfile to the special
@@ -385,6 +389,7 @@ static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
 {
        uint8 ret;
        pid_t child_pid;
+       NTSTATUS status;
 
        DEBUG(10, ("winbindd_msg_validate_cache: got validate-cache "
                   "message.\n"));
@@ -411,7 +416,10 @@ static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
 
        /* child */
 
-       if (!winbindd_reinit_after_fork(NULL)) {
+       status = winbindd_reinit_after_fork(NULL, NULL);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("winbindd_reinit_after_fork failed: %s\n",
+                         nt_errstr(status)));
                _exit(0);
        }
 
@@ -478,6 +486,8 @@ static struct winbindd_async_dispatch_table async_nonpriv_table[] = {
          wb_ping_send, wb_ping_recv },
        { WINBINDD_LOOKUPSID, "LOOKUPSID",
          winbindd_lookupsid_send, winbindd_lookupsid_recv },
+       { WINBINDD_LOOKUPSIDS, "LOOKUPSIDS",
+         winbindd_lookupsids_send, winbindd_lookupsids_recv },
        { WINBINDD_LOOKUPNAME, "LOOKUPNAME",
          winbindd_lookupname_send, winbindd_lookupname_recv },
        { WINBINDD_SID_TO_UID, "SID_TO_UID",
@@ -488,6 +498,8 @@ static struct winbindd_async_dispatch_table async_nonpriv_table[] = {
          winbindd_uid_to_sid_send, winbindd_uid_to_sid_recv },
        { WINBINDD_GID_TO_SID, "GID_TO_SID",
          winbindd_gid_to_sid_send, winbindd_gid_to_sid_recv },
+       { WINBINDD_SIDS_TO_XIDS, "SIDS_TO_XIDS",
+         winbindd_sids_to_xids_send, winbindd_sids_to_xids_recv },
        { WINBINDD_GETPWSID, "GETPWSID",
          winbindd_getpwsid_send, winbindd_getpwsid_recv },
        { WINBINDD_GETPWNAM, "GETPWNAM",
@@ -768,13 +780,15 @@ static void new_connection(int listen_sock, bool privileged)
 
        len = sizeof(sunaddr);
 
-       do {
-               sock = accept(listen_sock, (struct sockaddr *)(void *)&sunaddr,
-                             &len);
-       } while (sock == -1 && errno == EINTR);
+       sock = accept(listen_sock, (struct sockaddr *)(void *)&sunaddr, &len);
 
-       if (sock == -1)
+       if (sock == -1) {
+               if (errno != EINTR) {
+                       DEBUG(0, ("Faild to accept socket - %s\n",
+                                 strerror(errno)));
+               }
                return;
+       }
 
        DEBUG(6,("accepted socket %d\n", sock));
 
@@ -1018,7 +1032,6 @@ bool winbindd_use_cache(void)
 
 void winbindd_register_handlers(void)
 {
-       struct tevent_timer *te;
        /* Setup signal handlers */
 
        if (!winbindd_setup_sig_term_handler(true))
@@ -1100,11 +1113,12 @@ void winbindd_register_handlers(void)
        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);
+       if (lp_allow_trusted_domains()) {
+               if (tevent_add_timer(winbind_event_context(), NULL, timeval_zero(),
+                             rescan_trusted_domains, NULL) == NULL) {
+                       DEBUG(0, ("Could not trigger rescan_trusted_domains()\n"));
+                       exit(1);
+               }
        }
 
 }
@@ -1289,6 +1303,15 @@ int main(int argc, char **argv, char **envp)
                }
        }
 
+       /* We call dump_core_setup one more time because the command line can
+        * set the log file or the log-basename and this will influence where
+        * cores are stored. Without this call get_dyn_LOGFILEBASE will be
+        * the default value derived from build's prefix. For EOM this value
+        * is often not related to the path where winbindd is actually run
+        * in production.
+        */
+       dump_core_setup("winbindd");
+
        if (is_daemon && interactive) {
                d_fprintf(stderr,"\nERROR: "
                          "Option -i|--interactive is not allowed together with -D|--daemon\n\n");
@@ -1327,6 +1350,11 @@ int main(int argc, char **argv, char **envp)
                DEBUG(0, ("error opening config file\n"));
                exit(1);
        }
+       /* After parsing the configuration file we setup the core path one more time
+        * as the log file might have been set in the configuration and cores's
+        * path is by default basename(lp_logfile()).
+        */
+       dump_core_setup("winbindd");
 
        /* Initialise messaging system */
 
@@ -1398,8 +1426,10 @@ int main(int argc, char **argv, char **envp)
 
        winbindd_register_handlers();
 
-       if (!init_system_info()) {
-               DEBUG(0,("ERROR: failed to setup system user info.\n"));
+       status = init_system_info();
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("ERROR: failed to setup system user info: %s.\n",
+                         nt_errstr(status)));
                exit(1);
        }