summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2009-12-04 16:46:34 +0100
committerKarolin Seeger <kseeger@samba.org>2009-12-08 09:15:41 +0100
commit850b3755654efeef9f32c6415c4c176d88cd7a9a (patch)
tree71b592a063a9334953f3b151a8a117459ccded1a
parent05927ff692edbac6b35dda175f702b72a38def8b (diff)
downloadsamba-850b3755654efeef9f32c6415c4c176d88cd7a9a.tar.gz
samba-850b3755654efeef9f32c6415c4c176d88cd7a9a.tar.xz
samba-850b3755654efeef9f32c6415c4c176d88cd7a9a.zip
s3: let gencache_init() use tdb_check()
If the check fails we try to clear the tdb and start with an empty cache. metze (cherry picked from commit 909cd2617fa1c170183664af1fc4253af2dc2f21) Signed-off-by: Stefan Metzmacher <metze@samba.org> (cherry picked from commit 1a17c8ffe0f17138e45b57a82d5b4a3c73628bca)
-rw-r--r--source3/lib/gencache.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/source3/lib/gencache.c b/source3/lib/gencache.c
index 4889d7ca62f..9a4cbc2cd7c 100644
--- a/source3/lib/gencache.c
+++ b/source3/lib/gencache.c
@@ -55,6 +55,7 @@ static bool gencache_init(void)
{
char* cache_fname = NULL;
int open_flags = O_RDWR|O_CREAT;
+ bool first_try = true;
/* skip file open if it's already opened */
if (cache) return True;
@@ -63,7 +64,30 @@ static bool gencache_init(void)
DEBUG(5, ("Opening cache file at %s\n", cache_fname));
+again:
cache = tdb_open_log(cache_fname, 0, TDB_DEFAULT, open_flags, 0644);
+ if (cache) {
+ int ret;
+ ret = tdb_check(cache, NULL, NULL);
+ if (ret != 0) {
+ tdb_close(cache);
+ cache = NULL;
+ if (!first_try) {
+ DEBUG(0, ("gencache_init: tdb_check(%s) failed\n",
+ cache_fname));
+ return false;
+ }
+ first_try = false;
+ DEBUG(0, ("gencache_init: tdb_check(%s) failed - retry after CLEAR_IF_FIRST\n",
+ cache_fname));
+ cache = tdb_open_log(cache_fname, 0, TDB_CLEAR_IF_FIRST, open_flags, 0644);
+ if (cache) {
+ tdb_close(cache);
+ cache = NULL;
+ goto again;
+ }
+ }
+ }
if (!cache && (errno == EACCES)) {
open_flags = O_RDONLY;
@@ -89,6 +113,7 @@ static bool gencache_init(void)
DEBUG(5, ("Opening %s failed: %s\n", cache_fname,
strerror(errno)));
tdb_close(cache);
+ cache = NULL;
return false;
}