39
39
#define DBGC_CLASS DBGC_WINBIND
41
#define WINBINDD_CACHE_VERSION 2
41
#define WINBINDD_CACHE_VER1 1 /* initial db version */
42
#define WINBINDD_CACHE_VER2 2 /* second version with timeouts for NDR entries */
44
#define WINBINDD_CACHE_VERSION WINBINDD_CACHE_VER2
42
45
#define WINBINDD_CACHE_VERSION_KEYSTR "WINBINDD_CACHE_VERSION"
44
47
extern struct winbindd_methods reconnect_methods;
4087
static int wbcache_update_centry_fn(TDB_CONTEXT *tdb,
4095
if (is_non_centry_key(key)) {
4099
if (data.dptr == NULL || data.dsize == 0) {
4100
if (tdb_delete(tdb, key) < 0) {
4101
DEBUG(0, ("tdb_delete for [%s] failed!\n",
4107
/* add timeout to blob (uint64_t) */
4108
blob.dsize = data.dsize + 8;
4110
blob.dptr = SMB_XMALLOC_ARRAY(uint8_t, blob.dsize);
4111
if (blob.dptr == NULL) {
4114
memset(blob.dptr, 0, blob.dsize);
4116
/* copy status and seqnum */
4117
memcpy(blob.dptr, data.dptr, 8);
4120
ctimeout = lp_winbind_cache_time() + time(NULL);
4121
SBVAL(blob.dptr, 8, ctimeout);
4124
memcpy(blob.dptr + 16, data.dptr + 8, data.dsize - 8);
4126
if (tdb_store(tdb, key, blob, TDB_REPLACE) < 0) {
4127
DEBUG(0, ("tdb_store to update [%s] failed!\n",
4129
SAFE_FREE(blob.dptr);
4133
SAFE_FREE(blob.dptr);
4137
static bool wbcache_upgrade_v1_to_v2(TDB_CONTEXT *tdb)
4141
DEBUG(1, ("Upgrade to version 2 of the winbindd_cache.tdb\n"));
4143
rc = tdb_traverse(tdb, wbcache_update_centry_fn, NULL);
4084
4151
/***********************************************************************
4085
4152
Try and validate every entry in the winbindd cache. If we fail here,
4086
4153
delete the cache tdb and return non-zero.
4092
4159
const char *tdb_path = cache_path("winbindd_cache.tdb");
4093
4160
TDB_CONTEXT *tdb = NULL;
4095
4164
DEBUG(10, ("winbindd_validate_cache: replacing panic function\n"));
4096
4165
smb_panic_fn = validate_panic;
4099
4167
tdb = tdb_open_log(tdb_path,
4100
4168
WINBINDD_CACHE_TDB_DEFAULT_HASH_SIZE,
4101
4169
TDB_INCOMPATIBLE_HASH |
4109
4177
"error opening/initializing tdb\n"));
4181
/* Version check and upgrade code. */
4182
if (!tdb_fetch_uint32(tdb, WINBINDD_CACHE_VERSION_KEYSTR, &vers_id)) {
4183
DEBUG(10, ("Fresh database\n"));
4184
tdb_store_uint32(tdb, WINBINDD_CACHE_VERSION_KEYSTR, WINBINDD_CACHE_VERSION);
4185
vers_id = WINBINDD_CACHE_VERSION;
4188
if (vers_id != WINBINDD_CACHE_VERSION) {
4189
if (vers_id == WINBINDD_CACHE_VER1) {
4190
ok = wbcache_upgrade_v1_to_v2(tdb);
4192
DEBUG(10, ("winbindd_validate_cache: upgrade to version 2 failed.\n"));
4197
tdb_store_uint32(tdb,
4198
WINBINDD_CACHE_VERSION_KEYSTR,
4199
WINBINDD_CACHE_VERSION);
4200
vers_id = WINBINDD_CACHE_VER2;
4112
4204
tdb_close(tdb);
4114
4206
ret = tdb_validate_and_backup(tdb_path, cache_traverse_validate_fn);