We are triggering the cleanup_timeout_fn() too often, on exiting when an smbd is...
[ddiss/samba.git] / source3 / smbd / server_exit.c
index 57fec8d96c7ff7892c58c2ea9fd21ebbfcf066af..fc77deec72b241e699f53dde81c5b997fc59d350 100644 (file)
 */
 
 #include "includes.h"
+#include "smbd/smbd.h"
 #include "smbd/globals.h"
-#include "librpc/gen_ndr/messaging.h"
+#include "ntdomain.h"
+#include "../librpc/gen_ndr/srv_dfs.h"
+#include "../librpc/gen_ndr/srv_dssetup.h"
+#include "../librpc/gen_ndr/srv_echo.h"
+#include "../librpc/gen_ndr/srv_eventlog.h"
+#include "../librpc/gen_ndr/srv_initshutdown.h"
+#include "../librpc/gen_ndr/srv_lsa.h"
+#include "../librpc/gen_ndr/srv_netlogon.h"
+#include "../librpc/gen_ndr/srv_ntsvcs.h"
+#include "../librpc/gen_ndr/srv_samr.h"
+#include "../librpc/gen_ndr/srv_spoolss.h"
+#include "../librpc/gen_ndr/srv_srvsvc.h"
+#include "../librpc/gen_ndr/srv_svcctl.h"
+#include "../librpc/gen_ndr/srv_winreg.h"
+#include "../librpc/gen_ndr/srv_wkssvc.h"
+#include "printing/notify.h"
+#include "printing.h"
+#include "serverid.h"
 
 static struct files_struct *log_writeable_file_fn(
        struct files_struct *fsp, void *private_data)
@@ -65,7 +83,6 @@ static void exit_server_common(enum server_exit_reason how,
 static void exit_server_common(enum server_exit_reason how,
        const char *const reason)
 {
-       bool had_open_conn = false;
        struct smbd_server_connection *sconn = smbd_server_conn;
 
        if (!exit_firsttime)
@@ -83,7 +100,7 @@ static void exit_server_common(enum server_exit_reason how,
                        bool found = false;
                        files_forall(sconn, log_writeable_file_fn, &found);
                }
-               had_open_conn = conn_close_all(sconn);
+               (void)conn_close_all(sconn);
                invalidate_all_vuids(sconn);
        }
 
@@ -113,8 +130,26 @@ static void exit_server_common(enum server_exit_reason how,
        }
 #endif
 
-       locking_end();
-       printing_end();
+       if (am_parent) {
+               rpc_wkssvc_shutdown();
+               rpc_dssetup_shutdown();
+#ifdef DEVELOPER
+               rpc_rpcecho_shutdown();
+#endif
+               rpc_netdfs_shutdown();
+               rpc_initshutdown_shutdown();
+               rpc_eventlog_shutdown();
+               rpc_ntsvcs_shutdown();
+               rpc_svcctl_shutdown();
+               rpc_spoolss_shutdown();
+
+               rpc_srvsvc_shutdown();
+               rpc_winreg_shutdown();
+
+               rpc_netlogon_shutdown();
+               rpc_samr_shutdown();
+               rpc_lsarpc_shutdown();
+       }
 
        /*
         * we need to force the order of freeing the following,
@@ -126,6 +161,9 @@ static void exit_server_common(enum server_exit_reason how,
        server_event_context_free();
        TALLOC_FREE(smbd_memcache_ctx);
 
+       locking_end();
+       printing_end();
+
        if (how != SERVER_EXIT_NORMAL) {
                DEBUGSEP(0);
                DEBUG(0,("Abnormal server exit: %s\n",
@@ -136,6 +174,8 @@ static void exit_server_common(enum server_exit_reason how,
 
                dump_core();
 
+               /* Notreached. */
+               exit(1);
        } else {
                DEBUG(3,("Server exit (%s)\n",
                        (reason ? reason : "normal exit")));
@@ -145,15 +185,7 @@ static void exit_server_common(enum server_exit_reason how,
                gencache_stabilize();
        }
 
-       /* if we had any open SMB connections when we exited then we
-          need to tell the parent smbd so that it can trigger a retry
-          of any locks we may have been holding or open files we were
-          blocking */
-       if (had_open_conn) {
-               exit(1);
-       } else {
-               exit(0);
-       }
+       exit(0);
 }
 
 void exit_server(const char *const explanation)