diff options
-rw-r--r-- | docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml | 16 | ||||
-rw-r--r-- | source3/include/proto.h | 1 | ||||
-rw-r--r-- | source3/param/loadparm.c | 13 | ||||
-rw-r--r-- | source3/smbd/server.c | 31 |
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); |