summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml16
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/param/loadparm.c13
-rw-r--r--source3/smbd/server.c31
4 files changed, 61 insertions, 0 deletions
diff --git a/docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml b/docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml
new file mode 100644
index 0000000000..1c75457803
--- /dev/null
+++ b/docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml
@@ -0,0 +1,16 @@
+<samba:parameter name="log writeable files on exit"
+ context="G"
+ type="boolean"
+ advanced="1" developer="0"
+ xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+ <para>
+ This boolean option controls whether at exit time the server
+ dumps a list of files with debug level 0 that were still open
+ for write. This is an administrative aid to find the files
+ that were potentially corrupt if the network connection died.
+ </para>
+</description>
+
+<value type="default">no</value>
+</samba:parameter>
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 69fd591057..4832a60c90 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -4029,6 +4029,7 @@ bool lp_usershare_allow_guests(void);
bool lp_usershare_owner_only(void);
bool lp_disable_netbios(void);
bool lp_reset_on_zero_vc(void);
+bool lp_log_writeable_files_on_exit(void);
bool lp_ms_add_printer_wizard(void);
bool lp_dns_proxy(void);
bool lp_wins_support(void);
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 579f847b97..e94c270247 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -353,6 +353,7 @@ struct global {
int iIdmapCacheTime;
int iIdmapNegativeCacheTime;
bool bResetOnZeroVC;
+ bool bLogWriteableFilesOnExit;
int iKeepalive;
int iminreceivefile;
struct param_opt_struct *param_opt;
@@ -2078,6 +2079,15 @@ static struct parm_struct parm_table[] = {
.flags = FLAG_ADVANCED,
},
{
+ .label = "log writeable files on exit",
+ .type = P_BOOL,
+ .p_class = P_GLOBAL,
+ .ptr = &Globals.bLogWriteableFilesOnExit,
+ .special = NULL,
+ .enum_list = NULL,
+ .flags = FLAG_ADVANCED,
+ },
+ {
.label = "acl compatibility",
.type = P_ENUM,
.p_class = P_GLOBAL,
@@ -5087,6 +5097,7 @@ static void init_globals(bool first_time_only)
#endif
Globals.bUnixExtensions = True;
Globals.bResetOnZeroVC = False;
+ Globals.bLogWriteableFilesOnExit = False;
Globals.bCreateKrb5Conf = true;
/* hostname lookups can be very expensive and are broken on
@@ -5483,6 +5494,8 @@ FN_GLOBAL_BOOL(lp_usershare_allow_guests, &Globals.bUsershareAllowGuests)
FN_GLOBAL_BOOL(lp_usershare_owner_only, &Globals.bUsershareOwnerOnly)
FN_GLOBAL_BOOL(lp_disable_netbios, &Globals.bDisableNetbios)
FN_GLOBAL_BOOL(lp_reset_on_zero_vc, &Globals.bResetOnZeroVC)
+FN_GLOBAL_BOOL(lp_log_writeable_files_on_exit,
+ &Globals.bLogWriteableFilesOnExit)
FN_GLOBAL_BOOL(lp_ms_add_printer_wizard, &Globals.bMsAddPrinterWizard)
FN_GLOBAL_BOOL(lp_dns_proxy, &Globals.bDNSproxy)
FN_GLOBAL_BOOL(lp_wins_support, &Globals.bWINSsupport)
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 400edcf202..81d75b13a0 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -847,6 +847,32 @@ 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.
****************************************************************************/
@@ -874,6 +900,11 @@ static void exit_server_common(enum server_exit_reason how,
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);