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 2 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, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "tdb_private.h"
31 static tdb_off_t
tdb_dump_record(struct tdb_context
*tdb
, int hash
,
34 struct list_struct rec
;
35 tdb_off_t tailer_ofs
, tailer
;
37 if (tdb
->methods
->tdb_read(tdb
, offset
, (char *)&rec
,
38 sizeof(rec
), DOCONV()) == -1) {
39 printf("ERROR: failed to read record at %u\n", offset
);
43 printf(" rec: hash=%d offset=0x%08x next=0x%08x rec_len=%d "
44 "key_len=%d data_len=%d full_hash=0x%x magic=0x%x\n",
45 hash
, offset
, rec
.next
, rec
.rec_len
, rec
.key_len
, rec
.data_len
,
46 rec
.full_hash
, rec
.magic
);
48 tailer_ofs
= offset
+ sizeof(rec
) + rec
.rec_len
- sizeof(tdb_off_t
);
50 if (tdb_ofs_read(tdb
, tailer_ofs
, &tailer
) == -1) {
51 printf("ERROR: failed to read tailer at %u\n", tailer_ofs
);
55 if (tailer
!= rec
.rec_len
+ sizeof(rec
)) {
56 printf("ERROR: tailer does not match record! tailer=%u totalsize=%u\n",
57 (unsigned int)tailer
, (unsigned int)(rec
.rec_len
+ sizeof(rec
)));
62 static int tdb_dump_chain(struct tdb_context
*tdb
, int i
)
64 tdb_off_t rec_ptr
, top
;
66 top
= TDB_HASH_TOP(i
);
68 if (tdb_lock(tdb
, i
, F_WRLCK
) != 0)
71 if (tdb_ofs_read(tdb
, top
, &rec_ptr
) == -1)
72 return tdb_unlock(tdb
, i
, F_WRLCK
);
75 printf("hash=%d\n", i
);
78 rec_ptr
= tdb_dump_record(tdb
, i
, rec_ptr
);
81 return tdb_unlock(tdb
, i
, F_WRLCK
);
84 void tdb_dump_all(struct tdb_context
*tdb
)
87 for (i
=0;i
<tdb
->header
.hash_size
;i
++) {
88 tdb_dump_chain(tdb
, i
);
90 printf("freelist:\n");
91 tdb_dump_chain(tdb
, -1);
94 int tdb_printfreelist(struct tdb_context
*tdb
)
98 tdb_off_t offset
, rec_ptr
;
99 struct list_struct rec
;
101 if ((ret
= tdb_lock(tdb
, -1, F_WRLCK
)) != 0)
104 offset
= FREELIST_TOP
;
106 /* read in the freelist top */
107 if (tdb_ofs_read(tdb
, offset
, &rec_ptr
) == -1) {
108 tdb_unlock(tdb
, -1, F_WRLCK
);
112 printf("freelist top=[0x%08x]\n", rec_ptr
);
114 if (tdb
->methods
->tdb_read(tdb
, rec_ptr
, (char *)&rec
,
115 sizeof(rec
), DOCONV()) == -1) {
116 tdb_unlock(tdb
, -1, F_WRLCK
);
120 if (rec
.magic
!= TDB_FREE_MAGIC
) {
121 printf("bad magic 0x%08x in free list\n", rec
.magic
);
122 tdb_unlock(tdb
, -1, F_WRLCK
);
126 printf("entry offset=[0x%08x], rec.rec_len = [0x%08x (%d)] (end = 0x%08x)\n",
127 rec_ptr
, rec
.rec_len
, rec
.rec_len
, rec_ptr
+ rec
.rec_len
);
128 total_free
+= rec
.rec_len
;
130 /* move to the next record */
133 printf("total rec_len = [0x%08x (%d)]\n", (int)total_free
,
136 return tdb_unlock(tdb
, -1, F_WRLCK
);