summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/Makefile.in2
-rw-r--r--source3/smbd/server.c146
-rw-r--r--source3/smbd/server_exit.c173
3 files changed, 174 insertions, 147 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 72a7315eaa..36380b5cc7 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -776,7 +776,7 @@ AUTH_OBJ = auth/auth.o @AUTH_STATIC@ auth/auth_util.o auth/token_util.o \
MANGLE_OBJ = smbd/mangle.o smbd/mangle_hash.o smbd/mangle_hash2.o
-SMBD_OBJ_MAIN = smbd/server.o
+SMBD_OBJ_MAIN = smbd/server.o smbd/server_exit.o
BUILDOPT_OBJ = smbd/build_options.o
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 7cd69467a8..80c5fba25f 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -849,152 +849,6 @@ bool reload_services(bool test)
return(ret);
}
-static struct files_struct *log_writeable_file_fn(
- struct files_struct *fsp, void *private_data)
-{
- bool *found = (bool *)private_data;
- char *path;
-
- if (!fsp->can_write) {
- return NULL;
- }
- if (!(*found)) {
- DEBUG(0, ("Writable files open at exit:\n"));
- *found = true;
- }
-
- path = talloc_asprintf(talloc_tos(), "%s/%s", fsp->conn->connectpath,
- smb_fname_str_dbg(fsp->fsp_name));
- if (path == NULL) {
- DEBUGADD(0, ("<NOMEM>\n"));
- }
-
- DEBUGADD(0, ("%s\n", path));
-
- TALLOC_FREE(path);
- return NULL;
-}
-
-/****************************************************************************
- Exit the server.
-****************************************************************************/
-
-/* Reasons for shutting down a server process. */
-enum server_exit_reason { SERVER_EXIT_NORMAL, SERVER_EXIT_ABNORMAL };
-
-static void exit_server_common(enum server_exit_reason how,
- const char *const reason) _NORETURN_;
-
-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)
- exit(0);
- exit_firsttime = false;
-
- change_to_root_user();
-
- if (sconn && sconn->smb1.negprot.auth_context) {
- struct auth_context *a = sconn->smb1.negprot.auth_context;
- a->free(&sconn->smb1.negprot.auth_context);
- }
-
- if (lp_log_writeable_files_on_exit()) {
- bool found = false;
- files_forall(log_writeable_file_fn, &found);
- }
-
- if (sconn) {
- had_open_conn = conn_close_all(sconn);
- invalidate_all_vuids(sconn);
- }
-
- /* 3 second timeout. */
- print_notify_send_messages(smbd_messaging_context(), 3);
-
- /* delete our entry in the serverid database. */
- serverid_deregister_self();
-
-#ifdef WITH_DFS
- if (dcelogin_atmost_once) {
- dfs_unlogin();
- }
-#endif
-
-#ifdef USE_DMAPI
- /* Destroy Samba DMAPI session only if we are master smbd process */
- if (am_parent) {
- if (!dmapi_destroy_session()) {
- DEBUG(0,("Unable to close Samba DMAPI session\n"));
- }
- }
-#endif
-
- locking_end();
- printing_end();
-
- /*
- * we need to force the order of freeing the following,
- * because smbd_msg_ctx is not a talloc child of smbd_server_conn.
- */
- sconn = NULL;
- TALLOC_FREE(smbd_server_conn);
- TALLOC_FREE(smbd_msg_ctx);
- TALLOC_FREE(smbd_event_ctx);
-
- if (how != SERVER_EXIT_NORMAL) {
- int oldlevel = DEBUGLEVEL;
-
- DEBUGLEVEL = 10;
-
- DEBUGSEP(0);
- DEBUG(0,("Abnormal server exit: %s\n",
- reason ? reason : "no explanation provided"));
- DEBUGSEP(0);
-
- log_stack_trace();
-
- DEBUGLEVEL = oldlevel;
- dump_core();
-
- } else {
- DEBUG(3,("Server exit (%s)\n",
- (reason ? reason : "normal exit")));
- if (am_parent) {
- pidfile_unlink();
- }
- 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);
- }
-}
-
-void exit_server(const char *const explanation)
-{
- exit_server_common(SERVER_EXIT_ABNORMAL, explanation);
-}
-
-void exit_server_cleanly(const char *const explanation)
-{
- exit_server_common(SERVER_EXIT_NORMAL, explanation);
-}
-
-void exit_server_fault(void)
-{
- exit_server("critical server fault");
-}
-
/****************************************************************************
Initialise connect, service and file structs.
****************************************************************************/
diff --git a/source3/smbd/server_exit.c b/source3/smbd/server_exit.c
new file mode 100644
index 0000000000..868cd67b4f
--- /dev/null
+++ b/source3/smbd/server_exit.c
@@ -0,0 +1,173 @@
+/*
+ Unix SMB/CIFS implementation.
+ Main SMB server routines
+ Copyright (C) Andrew Tridgell 1992-1998
+ Copyright (C) Martin Pool 2002
+ Copyright (C) Jelmer Vernooij 2002-2003
+ Copyright (C) Volker Lendecke 1993-2007
+ Copyright (C) Jeremy Allison 1993-2007
+ Copyright (C) Andrew Bartlett 2010
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "smbd/globals.h"
+#include "librpc/gen_ndr/messaging.h"
+
+static struct files_struct *log_writeable_file_fn(
+ struct files_struct *fsp, void *private_data)
+{
+ bool *found = (bool *)private_data;
+ char *path;
+
+ if (!fsp->can_write) {
+ return NULL;
+ }
+ if (!(*found)) {
+ DEBUG(0, ("Writable files open at exit:\n"));
+ *found = true;
+ }
+
+ path = talloc_asprintf(talloc_tos(), "%s/%s", fsp->conn->connectpath,
+ smb_fname_str_dbg(fsp->fsp_name));
+ if (path == NULL) {
+ DEBUGADD(0, ("<NOMEM>\n"));
+ }
+
+ DEBUGADD(0, ("%s\n", path));
+
+ TALLOC_FREE(path);
+ return NULL;
+}
+
+/****************************************************************************
+ Exit the server.
+****************************************************************************/
+
+/* Reasons for shutting down a server process. */
+enum server_exit_reason { SERVER_EXIT_NORMAL, SERVER_EXIT_ABNORMAL };
+
+static void exit_server_common(enum server_exit_reason how,
+ const char *const reason) _NORETURN_;
+
+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)
+ exit(0);
+ exit_firsttime = false;
+
+ change_to_root_user();
+
+ if (sconn && sconn->smb1.negprot.auth_context) {
+ struct auth_context *a = sconn->smb1.negprot.auth_context;
+ a->free(&sconn->smb1.negprot.auth_context);
+ }
+
+ if (lp_log_writeable_files_on_exit()) {
+ bool found = false;
+ files_forall(log_writeable_file_fn, &found);
+ }
+
+ if (sconn) {
+ had_open_conn = conn_close_all(sconn);
+ invalidate_all_vuids(sconn);
+ }
+
+ /* 3 second timeout. */
+ print_notify_send_messages(smbd_messaging_context(), 3);
+
+ /* delete our entry in the serverid database. */
+ serverid_deregister_self();
+
+#ifdef WITH_DFS
+ if (dcelogin_atmost_once) {
+ dfs_unlogin();
+ }
+#endif
+
+#ifdef USE_DMAPI
+ /* Destroy Samba DMAPI session only if we are master smbd process */
+ if (am_parent) {
+ if (!dmapi_destroy_session()) {
+ DEBUG(0,("Unable to close Samba DMAPI session\n"));
+ }
+ }
+#endif
+
+ locking_end();
+ printing_end();
+
+ /*
+ * we need to force the order of freeing the following,
+ * because smbd_msg_ctx is not a talloc child of smbd_server_conn.
+ */
+ sconn = NULL;
+ TALLOC_FREE(smbd_server_conn);
+ TALLOC_FREE(smbd_msg_ctx);
+ TALLOC_FREE(smbd_event_ctx);
+
+ if (how != SERVER_EXIT_NORMAL) {
+ int oldlevel = DEBUGLEVEL;
+
+ DEBUGLEVEL = 10;
+
+ DEBUGSEP(0);
+ DEBUG(0,("Abnormal server exit: %s\n",
+ reason ? reason : "no explanation provided"));
+ DEBUGSEP(0);
+
+ log_stack_trace();
+
+ DEBUGLEVEL = oldlevel;
+ dump_core();
+
+ } else {
+ DEBUG(3,("Server exit (%s)\n",
+ (reason ? reason : "normal exit")));
+ if (am_parent) {
+ pidfile_unlink();
+ }
+ 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);
+ }
+}
+
+void exit_server(const char *const explanation)
+{
+ exit_server_common(SERVER_EXIT_ABNORMAL, explanation);
+}
+
+void exit_server_cleanly(const char *const explanation)
+{
+ exit_server_common(SERVER_EXIT_NORMAL, explanation);
+}
+
+void exit_server_fault(void)
+{
+ exit_server("critical server fault");
+}