diff options
Diffstat (limited to 'lib/tdb2/tdb1_freelistcheck.c')
-rw-r--r-- | lib/tdb2/tdb1_freelistcheck.c | 109 |
1 files changed, 0 insertions, 109 deletions
diff --git a/lib/tdb2/tdb1_freelistcheck.c b/lib/tdb2/tdb1_freelistcheck.c deleted file mode 100644 index c095ea57fb..0000000000 --- a/lib/tdb2/tdb1_freelistcheck.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - Unix SMB/CIFS implementation. - - trivial database library - - Copyright (C) Jeremy Allison 2006 - - ** NOTE! The following LGPL license applies to the tdb - ** library. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see <http://www.gnu.org/licenses/>. -*/ - -#include "tdb1_private.h" - -/* Check the freelist is good and contains no loops. - Very memory intensive - only do this as a consistency - checker. Heh heh - uses an in memory tdb as the storage - for the "seen" record list. For some reason this strikes - me as extremely clever as I don't have to write another tree - data structure implementation :-). - */ - -static int seen_insert(struct tdb1_context *mem_tdb, tdb1_off_t rec_ptr) -{ - TDB1_DATA key, data; - - memset(&data, '\0', sizeof(data)); - key.dptr = (unsigned char *)&rec_ptr; - key.dsize = sizeof(rec_ptr); - return tdb1_store(mem_tdb, key, data, TDB1_INSERT); -} - -_PUBLIC_ int tdb1_validate_freelist(struct tdb1_context *tdb, int *pnum_entries) -{ - struct tdb1_context *mem_tdb = NULL; - struct tdb1_record rec; - tdb1_off_t rec_ptr, last_ptr; - int ret = -1; - - *pnum_entries = 0; - - mem_tdb = tdb1_open("flval", tdb->header.hash_size, - TDB1_INTERNAL, O_RDWR, 0600); - if (!mem_tdb) { - return -1; - } - - if (tdb1_lock(tdb, -1, F_WRLCK) == -1) { - tdb1_close(mem_tdb); - return 0; - } - - last_ptr = TDB1_FREELIST_TOP; - - /* Store the TDB1_FREELIST_TOP record. */ - if (seen_insert(mem_tdb, last_ptr) == -1) { - tdb->ecode = TDB1_ERR_CORRUPT; - ret = -1; - goto fail; - } - - /* read in the freelist top */ - if (tdb1_ofs_read(tdb, TDB1_FREELIST_TOP, &rec_ptr) == -1) { - goto fail; - } - - while (rec_ptr) { - - /* If we can't store this record (we've seen it - before) then the free list has a loop and must - be corrupt. */ - - if (seen_insert(mem_tdb, rec_ptr)) { - tdb->ecode = TDB1_ERR_CORRUPT; - ret = -1; - goto fail; - } - - if (tdb1_rec_free_read(tdb, rec_ptr, &rec) == -1) { - goto fail; - } - - /* move to the next record */ - last_ptr = rec_ptr; - rec_ptr = rec.next; - *pnum_entries += 1; - } - - ret = 0; - - fail: - - tdb1_close(mem_tdb); - tdb1_unlock(tdb, -1, F_WRLCK); - return ret; -} |