summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/tdb/common/dump.c11
-rw-r--r--source3/tdb/common/tdbback.c7
-rw-r--r--source3/tdb/include/tdbback.h2
-rw-r--r--source3/tdb/tools/tdbbackup.c9
4 files changed, 19 insertions, 10 deletions
diff --git a/source3/tdb/common/dump.c b/source3/tdb/common/dump.c
index 577f23aac6..70382ca949 100644
--- a/source3/tdb/common/dump.c
+++ b/source3/tdb/common/dump.c
@@ -28,7 +28,8 @@
#include "tdb_private.h"
-static tdb_off_t tdb_dump_record(struct tdb_context *tdb, tdb_off_t offset)
+static tdb_off_t tdb_dump_record(struct tdb_context *tdb, int hash,
+ tdb_off_t offset)
{
struct list_struct rec;
tdb_off_t tailer_ofs, tailer;
@@ -39,8 +40,10 @@ static tdb_off_t tdb_dump_record(struct tdb_context *tdb, tdb_off_t offset)
return 0;
}
- printf(" rec: offset=0x%08x next=0x%08x rec_len=%d key_len=%d data_len=%d full_hash=0x%x magic=0x%x\n",
- offset, rec.next, rec.rec_len, rec.key_len, rec.data_len, rec.full_hash, rec.magic);
+ printf(" rec: hash=%d, offset=0x%08x next=0x%08x rec_len=%d "
+ "key_len=%d data_len=%d full_hash=0x%x magic=0x%x\n",
+ hash, offset, rec.next, rec.rec_len, rec.key_len, rec.data_len,
+ rec.full_hash, rec.magic);
tailer_ofs = offset + sizeof(rec) + rec.rec_len - sizeof(tdb_off_t);
@@ -72,7 +75,7 @@ static int tdb_dump_chain(struct tdb_context *tdb, int i)
printf("hash=%d\n", i);
while (rec_ptr) {
- rec_ptr = tdb_dump_record(tdb, rec_ptr);
+ rec_ptr = tdb_dump_record(tdb, i, rec_ptr);
}
return tdb_unlock(tdb, i, F_WRLCK);
diff --git a/source3/tdb/common/tdbback.c b/source3/tdb/common/tdbback.c
index 4698e6016b..28de85c29f 100644
--- a/source3/tdb/common/tdbback.c
+++ b/source3/tdb/common/tdbback.c
@@ -95,7 +95,7 @@ static int test_fn(TDB_CONTEXT *tdb, TDB_DATA key, TDB_DATA dbuf, void *state)
only doing the backup if its OK
this function is also used for restore
*/
-int backup_tdb(const char *old_name, const char *new_name)
+int backup_tdb(const char *old_name, const char *new_name, int hash_size)
{
TDB_CONTEXT *tdb;
TDB_CONTEXT *tdb_new;
@@ -122,7 +122,8 @@ int backup_tdb(const char *old_name, const char *new_name)
/* create the new tdb */
unlink(tmp_name);
- tdb_new = tdb_open(tmp_name, tdb_hash_size(tdb),
+ tdb_new = tdb_open(tmp_name,
+ hash_size ? hash_size : tdb_hash_size(tdb),
TDB_DEFAULT, O_RDWR|O_CREAT|O_EXCL,
st.st_mode & 0777);
if (!tdb_new) {
@@ -217,7 +218,7 @@ int verify_tdb(const char *fname, const char *bak_name)
/* count is < 0 means an error */
if (count < 0) {
printf("restoring %s\n", fname);
- return backup_tdb(bak_name, fname);
+ return backup_tdb(bak_name, fname, 0);
}
printf("%s : %d records\n", fname, count);
diff --git a/source3/tdb/include/tdbback.h b/source3/tdb/include/tdbback.h
index 7ebeaa494d..69d3bb6f91 100644
--- a/source3/tdb/include/tdbback.h
+++ b/source3/tdb/include/tdbback.h
@@ -19,5 +19,5 @@
*/
char *add_suffix(const char *name, const char *suffix);
-int backup_tdb(const char *old_name, const char *new_name);
+int backup_tdb(const char *old_name, const char *new_name, int hash_size);
int verify_tdb(const char *fname, const char *bak_name);
diff --git a/source3/tdb/tools/tdbbackup.c b/source3/tdb/tools/tdbbackup.c
index f49cd339c7..4ae5a4f921 100644
--- a/source3/tdb/tools/tdbbackup.c
+++ b/source3/tdb/tools/tdbbackup.c
@@ -93,6 +93,7 @@ static void usage(void)
printf(" -h this help message\n");
printf(" -s suffix set the backup suffix\n");
printf(" -v verify mode (restore if corrupt)\n");
+ printf(" -n hashsize set the new hash size for the backup\n");
}
@@ -102,9 +103,10 @@ static void usage(void)
int ret = 0;
int c;
int verify = 0;
+ int hashsize = 0;
const char *suffix = ".bak";
- while ((c = getopt(argc, argv, "vhs:")) != -1) {
+ while ((c = getopt(argc, argv, "vhs:n:")) != -1) {
switch (c) {
case 'h':
usage();
@@ -115,6 +117,9 @@ static void usage(void)
case 's':
suffix = optarg;
break;
+ case 'n':
+ hashsize = atoi(optarg);
+ break;
}
}
@@ -138,7 +143,7 @@ static void usage(void)
}
} else {
if (file_newer(fname, bak_name) &&
- backup_tdb(fname, bak_name) != 0) {
+ backup_tdb(fname, bak_name, hashsize) != 0) {
ret = 1;
}
}