00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "tdb_private.h"
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 static int seen_insert(struct tdb_context *mem_tdb, tdb_off_t rec_ptr)
00038 {
00039 TDB_DATA key, data;
00040
00041 memset(&data, '\0', sizeof(data));
00042 key.dptr = (char *)&rec_ptr;
00043 key.dsize = sizeof(rec_ptr);
00044 return tdb_store(mem_tdb, key, data, TDB_INSERT);
00045 }
00046
00047 int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries)
00048 {
00049 struct tdb_context *mem_tdb = NULL;
00050 struct list_struct rec;
00051 tdb_off_t rec_ptr, last_ptr;
00052 int ret = -1;
00053
00054 *pnum_entries = 0;
00055
00056 mem_tdb = tdb_open("flval", tdb->header.hash_size,
00057 TDB_INTERNAL, O_RDWR, 0600);
00058 if (!mem_tdb) {
00059 return -1;
00060 }
00061
00062 if (tdb_lock(tdb, -1, F_WRLCK) == -1) {
00063 tdb_close(mem_tdb);
00064 return 0;
00065 }
00066
00067 last_ptr = FREELIST_TOP;
00068
00069
00070 if (seen_insert(mem_tdb, last_ptr) == -1) {
00071 ret = TDB_ERRCODE(TDB_ERR_CORRUPT, -1);
00072 goto fail;
00073 }
00074
00075
00076 if (tdb_ofs_read(tdb, FREELIST_TOP, &rec_ptr) == -1) {
00077 goto fail;
00078 }
00079
00080 while (rec_ptr) {
00081
00082
00083
00084
00085
00086 if (seen_insert(mem_tdb, rec_ptr)) {
00087 ret = TDB_ERRCODE(TDB_ERR_CORRUPT, -1);
00088 goto fail;
00089 }
00090
00091 if (rec_free_read(tdb, rec_ptr, &rec) == -1) {
00092 goto fail;
00093 }
00094
00095
00096 last_ptr = rec_ptr;
00097 rec_ptr = rec.next;
00098 *pnum_entries += 1;
00099 }
00100
00101 ret = 0;
00102
00103 fail:
00104
00105 tdb_close(mem_tdb);
00106 tdb_unlock(tdb, -1, F_WRLCK);
00107 return ret;
00108 }