s3-winbindd: call dump_core_setup after command line option has been parsed
[ddiss/samba.git] / source3 / winbindd / winbindd.c
index 7ff26f353906ca4cf3983089a6fb8ec50ec1653c..15aafebf725440419e84d089234352a03e3ef452 100644 (file)
@@ -27,6 +27,7 @@
 #include "winbindd.h"
 #include "nsswitch/winbind_client.h"
 #include "nsswitch/wb_reqtrans.h"
+#include "ntdomain.h"
 #include "../librpc/gen_ndr/srv_lsa.h"
 #include "../librpc/gen_ndr/srv_samr.h"
 #include "secrets.h"
@@ -64,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
@@ -387,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"));
@@ -413,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);
        }
 
@@ -480,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",
@@ -490,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",
@@ -1293,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");
@@ -1331,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 */