s3: Add "log writeable files on exit" parameter
authorVolker Lendecke <vl@samba.org>
Mon, 22 Mar 2010 10:19:10 +0000 (11:19 +0100)
committerVolker Lendecke <vl@samba.org>
Mon, 22 Mar 2010 11:03:44 +0000 (12:03 +0100)
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.

docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml [new file with mode: 0644]
source3/include/proto.h
source3/param/loadparm.c
source3/smbd/server.c

diff --git a/docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml b/docs-xml/smbdotconf/misc/logwriteablefilesonexit.xml
new file mode 100644 (file)
index 0000000..1c75457
--- /dev/null
@@ -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>
index 69fd591057c78c1ea08a1e8244d09071995a7572..4832a60c90ab3527965bc65fc5a331a3982f0126 100644 (file)
@@ -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);
index 579f847b97258eb22bad09cffedc0a4c0ff9a7d2..e94c2702470c19e0d2dd2ff7f172cf14aa116186 100644 (file)
@@ -353,6 +353,7 @@ struct global {
        int iIdmapCacheTime;
        int iIdmapNegativeCacheTime;
        bool bResetOnZeroVC;
+       bool bLogWriteableFilesOnExit;
        int iKeepalive;
        int iminreceivefile;
        struct param_opt_struct *param_opt;
@@ -2077,6 +2078,15 @@ static struct parm_struct parm_table[] = {
                .enum_list      = NULL,
                .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,
@@ -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)
index 400edcf20258031b549ebcae3bc05b2d4e72bf95..81d75b13a003ffa9185ba03ac865698eb20fe238 100644 (file)
@@ -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);