summaryrefslogtreecommitdiff
path: root/source4/smbd/service.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/smbd/service.c')
-rw-r--r--source4/smbd/service.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/source4/smbd/service.c b/source4/smbd/service.c
index ca5f5e7531..33c0d5fcbd 100644
--- a/source4/smbd/service.c
+++ b/source4/smbd/service.c
@@ -349,3 +349,33 @@ void service_close_listening_sockets(struct server_context *srv_ctx)
}
}
}
+
+
+/*
+ cleanup temporary files. This is the new alternative to
+ TDB_CLEAR_IF_FIRST. Unfortunately TDB_CLEAR_IF_FIRST is not
+ efficient on unix systems due to the lack of scaling of the byte
+ range locking system. So instead of putting the burden on tdb to
+ cleanup tmp files, this function deletes them. You need to expand
+ the list here as appropriate.
+*/
+void service_cleanup_tmp_files(void)
+{
+ const char *list[] = {
+ "openfiles.tdb",
+ "brlock.tdb",
+ "unexpected.tdb"};
+ int i;
+ for (i=0;i<ARRAY_SIZE(list);i++) {
+ char *path = lock_path(NULL, list[i]);
+ int ret;
+ ret = unlink(path);
+ if (ret == -1 &&
+ errno != ENOENT &&
+ errno != ENOTDIR) {
+ DEBUG(0,("Failed to cleanup '%s'\n", path));
+ smb_panic("unable to cleanup temporary files\n");
+ }
+ talloc_free(path);
+ }
+}