2 Unix SMB/CIFS implementation.
4 trivial database library
6 Copyright (C) Andrew Tridgell 1999-2005
7 Copyright (C) Paul `Rusty' Russell 2000
8 Copyright (C) Jeremy Allison 2000-2003
10 ** NOTE! The following LGPL license applies to the tdb
11 ** library. This does NOT imply that all of Samba is released
14 This library is free software; you can redistribute it and/or
15 modify it under the terms of the GNU Lesser General Public
16 License as published by the Free Software Foundation; either
17 version 3 of the License, or (at your option) any later version.
19 This library is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 Lesser General Public License for more details.
24 You should have received a copy of the GNU Lesser General Public
25 License along with this library; if not, see <http://www.gnu.org/licenses/>.
28 #include "tdb_private.h"
30 static tdb_off_t
tdb_dump_record(struct tdb_context
*tdb
, int hash
,
33 struct tdb_record rec
;
34 tdb_off_t tailer_ofs
, tailer
;
36 if (tdb
->methods
->tdb_read(tdb
, offset
, (char *)&rec
,
37 sizeof(rec
), DOCONV()) == -1) {
38 printf("ERROR: failed to read record at %u\n", offset
);
42 printf(" rec: hash=%d offset=0x%08x next=0x%08x rec_len=%u "
43 "key_len=%u data_len=%u full_hash=0x%08x magic=0x%08x\n",
44 hash
, offset
, rec
.next
, rec
.rec_len
, rec
.key_len
, rec
.data_len
,
45 rec
.full_hash
, rec
.magic
);
47 tailer_ofs
= offset
+ sizeof(rec
) + rec
.rec_len
- sizeof(tdb_off_t
);
49 if (tdb_ofs_read(tdb
, tailer_ofs
, &tailer
) == -1) {
50 printf("ERROR: failed to read tailer at %u\n", tailer_ofs
);
54 if (tailer
!= rec
.rec_len
+ sizeof(rec
)) {
55 printf("ERROR: tailer does not match record! tailer=%u totalsize=%u\n",
56 (unsigned int)tailer
, (unsigned int)(rec
.rec_len
+ sizeof(rec
)));
61 static int tdb_dump_chain(struct tdb_context
*tdb
, int i
)
63 struct tdb_chainwalk_ctx chainwalk
;
64 tdb_off_t rec_ptr
, top
;
69 top
= TDB_HASH_TOP(i
);
72 if (tdb_lock(tdb
, i
, F_WRLCK
) != 0)
75 if (tdb_ofs_read(tdb
, top
, &rec_ptr
) == -1)
76 return tdb_unlock(tdb
, i
, F_WRLCK
);
78 tdb_chainwalk_init(&chainwalk
, rec_ptr
);
81 printf("hash=%d\n", i
);
85 rec_ptr
= tdb_dump_record(tdb
, i
, rec_ptr
);
86 ok
= tdb_chainwalk_check(tdb
, &chainwalk
, rec_ptr
);
88 printf("circular hash chain %d\n", i
);
93 return tdb_unlock(tdb
, i
, F_WRLCK
);
96 _PUBLIC_
void tdb_dump_all(struct tdb_context
*tdb
)
99 for (i
=0;i
<tdb
->hash_size
;i
++) {
100 tdb_dump_chain(tdb
, i
);
102 printf("freelist:\n");
103 tdb_dump_chain(tdb
, -1);
106 _PUBLIC_
int tdb_printfreelist(struct tdb_context
*tdb
)
110 tdb_off_t offset
, rec_ptr
;
111 struct tdb_record rec
;
113 if ((ret
= tdb_lock(tdb
, -1, F_WRLCK
)) != 0)
116 offset
= FREELIST_TOP
;
118 /* read in the freelist top */
119 if (tdb_ofs_read(tdb
, offset
, &rec_ptr
) == -1) {
120 tdb_unlock(tdb
, -1, F_WRLCK
);
124 printf("freelist top=[0x%08x]\n", rec_ptr
);
126 if (tdb
->methods
->tdb_read(tdb
, rec_ptr
, (char *)&rec
,
127 sizeof(rec
), DOCONV()) == -1) {
128 tdb_unlock(tdb
, -1, F_WRLCK
);
132 if (rec
.magic
!= TDB_FREE_MAGIC
) {
133 printf("bad magic 0x%08x in free list\n", rec
.magic
);
134 tdb_unlock(tdb
, -1, F_WRLCK
);
138 printf("entry offset=[0x%08x], rec.rec_len = [0x%08x (%u)] (end = 0x%08x)\n",
139 rec_ptr
, rec
.rec_len
, rec
.rec_len
, rec_ptr
+ rec
.rec_len
);
140 total_free
+= rec
.rec_len
;
142 /* move to the next record */
145 printf("total rec_len = [0x%08lx (%lu)]\n", total_free
, total_free
);
147 return tdb_unlock(tdb
, -1, F_WRLCK
);