Browse Source

tdb: port trivial differences across from SAMBA
Whitespace and C++-compatibility mainly.

Rusty Russell 16 years ago
parent
commit
d6b6780d0b
7 changed files with 87 additions and 64 deletions
  1. 10 9
      ccan/tdb/check.c
  2. 4 1
      ccan/tdb/io.c
  3. 7 5
      ccan/tdb/lock.c
  4. 20 12
      ccan/tdb/open.c
  5. 29 32
      ccan/tdb/tdb.c
  6. 12 0
      ccan/tdb/tdb_private.h
  7. 5 5
      ccan/tdb/traverse.c

+ 10 - 9
ccan/tdb/check.c

@@ -1,14 +1,14 @@
- /* 
+ /*
    Unix SMB/CIFS implementation.
    Unix SMB/CIFS implementation.
 
 
    trivial database library
    trivial database library
 
 
    Copyright (C) Rusty Russell		   2009
    Copyright (C) Rusty Russell		   2009
-   
+
      ** NOTE! The following LGPL license applies to the tdb
      ** NOTE! The following LGPL license applies to the tdb
      ** library. This does NOT imply that all of Samba is released
      ** library. This does NOT imply that all of Samba is released
      ** under the LGPL
      ** under the LGPL
-   
+
    This library is free software; you can redistribute it and/or
    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    License as published by the Free Software Foundation; either
@@ -232,7 +232,7 @@ static bool tdb_check_used_record(struct tdb_context *tdb,
 				  const struct tdb_record *rec,
 				  const struct tdb_record *rec,
 				  unsigned char **hashes,
 				  unsigned char **hashes,
 				  int (*check)(TDB_DATA, TDB_DATA, void *),
 				  int (*check)(TDB_DATA, TDB_DATA, void *),
-				  void *private)
+				  void *private_data)
 {
 {
 	TDB_DATA key, data;
 	TDB_DATA key, data;
 
 
@@ -270,7 +270,7 @@ static bool tdb_check_used_record(struct tdb_context *tdb,
 		if (!data.dptr)
 		if (!data.dptr)
 			goto fail_put_key;
 			goto fail_put_key;
 
 
-		if (check(key, data, private) == -1)
+		if (check(key, data, private_data) == -1)
 			goto fail_put_data;
 			goto fail_put_data;
 		put_bytes(tdb, data);
 		put_bytes(tdb, data);
 	}
 	}
@@ -303,8 +303,8 @@ static bool tdb_check_free_record(struct tdb_context *tdb,
 }
 }
 
 
 int tdb_check(struct tdb_context *tdb,
 int tdb_check(struct tdb_context *tdb,
-	      int (*check)(TDB_DATA key, TDB_DATA data, void *private),
-	      void *private)
+	      int (*check)(TDB_DATA key, TDB_DATA data, void *private_data),
+	      void *private_data)
 {
 {
 	unsigned int h;
 	unsigned int h;
 	unsigned char **hashes;
 	unsigned char **hashes;
@@ -330,7 +330,8 @@ int tdb_check(struct tdb_context *tdb,
 	}
 	}
 
 
 	/* One big malloc: pointers then bit arrays. */
 	/* One big malloc: pointers then bit arrays. */
-	hashes = calloc(1, sizeof(hashes[0]) * (1+tdb->header.hash_size)
+	hashes = (unsigned char **)calloc(
+			1, sizeof(hashes[0]) * (1+tdb->header.hash_size)
 			+ BITMAP_BITS / CHAR_BIT * (1+tdb->header.hash_size));
 			+ BITMAP_BITS / CHAR_BIT * (1+tdb->header.hash_size));
 	if (!hashes) {
 	if (!hashes) {
 		tdb->ecode = TDB_ERR_OOM;
 		tdb->ecode = TDB_ERR_OOM;
@@ -362,7 +363,7 @@ int tdb_check(struct tdb_context *tdb,
 		case TDB_MAGIC:
 		case TDB_MAGIC:
 		case TDB_DEAD_MAGIC:
 		case TDB_DEAD_MAGIC:
 			if (!tdb_check_used_record(tdb, off, &rec, hashes,
 			if (!tdb_check_used_record(tdb, off, &rec, hashes,
-						   check, private))
+						   check, private_data))
 				goto free;
 				goto free;
 			break;
 			break;
 		case TDB_FREE_MAGIC:
 		case TDB_FREE_MAGIC:

+ 4 - 1
ccan/tdb/io.c

@@ -194,7 +194,9 @@ int tdb_munmap(struct tdb_context *tdb)
 
 
 #if HAVE_MMAP
 #if HAVE_MMAP
 	if (tdb->map_ptr) {
 	if (tdb->map_ptr) {
-		int ret = munmap(tdb->map_ptr, tdb->map_size);
+		int ret;
+
+		ret = munmap(tdb->map_ptr, tdb->map_size);
 		if (ret != 0)
 		if (ret != 0)
 			return ret;
 			return ret;
 	}
 	}
@@ -386,6 +388,7 @@ unsigned char *tdb_alloc_read(struct tdb_context *tdb, tdb_off_t offset, tdb_len
 	unsigned char *buf;
 	unsigned char *buf;
 
 
 	/* some systems don't like zero length malloc */
 	/* some systems don't like zero length malloc */
+
 	if (!(buf = (unsigned char *)malloc(len ? len : 1))) {
 	if (!(buf = (unsigned char *)malloc(len ? len : 1))) {
 		/* Ensure ecode is set for log fn. */
 		/* Ensure ecode is set for log fn. */
 		tdb->ecode = TDB_ERR_OOM;
 		tdb->ecode = TDB_ERR_OOM;

+ 7 - 5
ccan/tdb/lock.c

@@ -33,17 +33,17 @@ void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *ptr)
 }
 }
 
 
 static int fcntl_lock(struct tdb_context *tdb,
 static int fcntl_lock(struct tdb_context *tdb,
-		      int rw, off_t off, off_t len, bool wait)
+		      int rw, off_t off, off_t len, bool waitflag)
 {
 {
 	struct flock fl;
 	struct flock fl;
-	
+
 	fl.l_type = rw;
 	fl.l_type = rw;
 	fl.l_whence = SEEK_SET;
 	fl.l_whence = SEEK_SET;
 	fl.l_start = off;
 	fl.l_start = off;
 	fl.l_len = len;
 	fl.l_len = len;
 	fl.l_pid = 0;
 	fl.l_pid = 0;
 
 
-	if (wait)
+	if (waitflag)
 		return fcntl(tdb->fd, F_SETLKW, &fl);
 		return fcntl(tdb->fd, F_SETLKW, &fl);
 	else
 	else
 		return fcntl(tdb->fd, F_SETLK, &fl);
 		return fcntl(tdb->fd, F_SETLK, &fl);
@@ -163,7 +163,7 @@ int tdb_brlock(struct tdb_context *tdb,
 		 * EAGAIN is an expected return from non-blocking
 		 * EAGAIN is an expected return from non-blocking
 		 * locks. */
 		 * locks. */
 		if (!(flags & TDB_LOCK_PROBE) && errno != EAGAIN) {
 		if (!(flags & TDB_LOCK_PROBE) && errno != EAGAIN) {
-			TDB_LOG((tdb, TDB_DEBUG_TRACE,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d flags=%d len=%d\n", 
+			TDB_LOG((tdb, TDB_DEBUG_TRACE,"tdb_brlock failed (fd=%d) at offset %d rw_type=%d flags=%d len=%d\n",
 				 tdb->fd, offset, rw_type, flags, (int)len));
 				 tdb->fd, offset, rw_type, flags, (int)len));
 		}
 		}
 		return -1;
 		return -1;
@@ -185,7 +185,7 @@ int tdb_brunlock(struct tdb_context *tdb,
 	} while (ret == -1 && errno == EINTR);
 	} while (ret == -1 && errno == EINTR);
 
 
 	if (ret == -1) {
 	if (ret == -1) {
-		TDB_LOG((tdb, TDB_DEBUG_TRACE,"tdb_brunlock failed (fd=%d) at offset %d rw_type=%d len=%d\n", 
+		TDB_LOG((tdb, TDB_DEBUG_TRACE,"tdb_brunlock failed (fd=%d) at offset %d rw_type=%d len=%d\n",
 			 tdb->fd, offset, rw_type, (int)len));
 			 tdb->fd, offset, rw_type, (int)len));
 	}
 	}
 	return ret;
 	return ret;
@@ -632,6 +632,8 @@ int tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key)
 	return tdb_unlock(tdb, BUCKET(tdb->hash_fn(&key)), F_RDLCK);
 	return tdb_unlock(tdb, BUCKET(tdb->hash_fn(&key)), F_RDLCK);
 }
 }
 
 
+
+
 /* record lock stops delete underneath */
 /* record lock stops delete underneath */
 int tdb_lock_record(struct tdb_context *tdb, tdb_off_t off)
 int tdb_lock_record(struct tdb_context *tdb, tdb_off_t off)
 {
 {

+ 20 - 12
ccan/tdb/open.c

@@ -161,7 +161,6 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
 		errno = ENOMEM;
 		errno = ENOMEM;
 		goto fail;
 		goto fail;
 	}
 	}
-
 	tdb_io_init(tdb);
 	tdb_io_init(tdb);
 	tdb->fd = -1;
 	tdb->fd = -1;
 #ifdef TDB_TRACE
 #ifdef TDB_TRACE
@@ -341,7 +340,8 @@ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
 	{
 	{
 		char tracefile[strlen(name) + 32];
 		char tracefile[strlen(name) + 32];
 
 
-		sprintf(tracefile, "%s.trace.%u", name, getpid());
+		snprintf(tracefile, sizeof(tracefile),
+			 "%s.trace.%li", name, (long)getpid());
 		tdb->tracefd = open(tracefile, O_WRONLY|O_CREAT|O_EXCL, 0600);
 		tdb->tracefd = open(tracefile, O_WRONLY|O_CREAT|O_EXCL, 0600);
 		if (tdb->tracefd >= 0) {
 		if (tdb->tracefd >= 0) {
 			tdb_enable_seqnum(tdb);
 			tdb_enable_seqnum(tdb);
@@ -453,9 +453,7 @@ void *tdb_get_logging_private(struct tdb_context *tdb)
 	return tdb->log.log_private;
 	return tdb->log.log_private;
 }
 }
 
 
-/* reopen a tdb - this can be used after a fork to ensure that we have an independent
-   seek pointer from our parent and to re-establish locks */
-int tdb_reopen(struct tdb_context *tdb)
+static int tdb_reopen_internal(struct tdb_context *tdb, bool active_lock)
 {
 {
 	struct stat st;
 	struct stat st;
 
 
@@ -484,11 +482,6 @@ int tdb_reopen(struct tdb_context *tdb)
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: open failed (%s)\n", strerror(errno)));
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: open failed (%s)\n", strerror(errno)));
 		goto fail;
 		goto fail;
 	}
 	}
-	if ((tdb->flags & TDB_CLEAR_IF_FIRST) && 
-	    (tdb->methods->brlock(tdb, F_RDLCK, ACTIVE_LOCK, 1, TDB_LOCK_WAIT) == -1)) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: failed to obtain active lock\n"));
-		goto fail;
-	}
 	if (fstat(tdb->fd, &st) != 0) {
 	if (fstat(tdb->fd, &st) != 0) {
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: fstat failed (%s)\n", strerror(errno)));
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: fstat failed (%s)\n", strerror(errno)));
 		goto fail;
 		goto fail;
@@ -499,6 +492,12 @@ int tdb_reopen(struct tdb_context *tdb)
 	}
 	}
 	tdb_mmap(tdb);
 	tdb_mmap(tdb);
 
 
+	if (active_lock &&
+	    (tdb->methods->brlock(tdb, F_RDLCK, ACTIVE_LOCK, 1, TDB_LOCK_WAIT) == -1)) {
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: failed to obtain active lock\n"));
+		goto fail;
+	}
+
 	return 0;
 	return 0;
 
 
 fail:
 fail:
@@ -506,12 +505,21 @@ fail:
 	return -1;
 	return -1;
 }
 }
 
 
+/* reopen a tdb - this can be used after a fork to ensure that we have an independent
+   seek pointer from our parent and to re-establish locks */
+int tdb_reopen(struct tdb_context *tdb)
+{
+	return tdb_reopen_internal(tdb, tdb->flags & TDB_CLEAR_IF_FIRST);
+}
+
 /* reopen all tdb's */
 /* reopen all tdb's */
 int tdb_reopen_all(int parent_longlived)
 int tdb_reopen_all(int parent_longlived)
 {
 {
 	struct tdb_context *tdb;
 	struct tdb_context *tdb;
 
 
 	for (tdb=tdbs; tdb; tdb = tdb->next) {
 	for (tdb=tdbs; tdb; tdb = tdb->next) {
+		bool active_lock = (tdb->flags & TDB_CLEAR_IF_FIRST);
+
 		/*
 		/*
 		 * If the parent is longlived (ie. a
 		 * If the parent is longlived (ie. a
 		 * parent daemon architecture), we know
 		 * parent daemon architecture), we know
@@ -525,10 +533,10 @@ int tdb_reopen_all(int parent_longlived)
 		 */
 		 */
 		if (parent_longlived) {
 		if (parent_longlived) {
 			/* Ensure no clear-if-first. */
 			/* Ensure no clear-if-first. */
-			tdb->flags &= ~TDB_CLEAR_IF_FIRST;
+			active_lock = false;
 		}
 		}
 
 
-		if (tdb_reopen(tdb) != 0)
+		if (tdb_reopen_internal(tdb, active_lock) != 0)
 			return -1;
 			return -1;
 	}
 	}
 
 

+ 29 - 32
ccan/tdb/tdb.c

@@ -190,9 +190,9 @@ static TDB_DATA _tdb_fetch(struct tdb_context *tdb, TDB_DATA key)
 
 
 	/* find which hash bucket it is in */
 	/* find which hash bucket it is in */
 	hash = tdb->hash_fn(&key);
 	hash = tdb->hash_fn(&key);
-	if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) {
+	if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec)))
 		return tdb_null;
 		return tdb_null;
-	}
+
 	ret.dptr = tdb_alloc_read(tdb, rec_ptr + sizeof(rec) + rec.key_len,
 	ret.dptr = tdb_alloc_read(tdb, rec_ptr + sizeof(rec) + rec.key_len,
 				  rec.data_len);
 				  rec.data_len);
 	ret.dsize = rec.data_len;
 	ret.dsize = rec.data_len;
@@ -238,8 +238,7 @@ int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key,
 	hash = tdb->hash_fn(&key);
 	hash = tdb->hash_fn(&key);
 
 
 	if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) {
 	if (!(rec_ptr = tdb_find_lock_hash(tdb,key,hash,F_RDLCK,&rec))) {
-		tdb_trace_1rec_ret(tdb, "tdb_parse_record", key,
-				   -TDB_ERR_NOEXIST);
+		tdb_trace_1rec_ret(tdb, "tdb_parse_record", key, -1);
 		tdb->ecode = TDB_ERR_NOEXIST;
 		tdb->ecode = TDB_ERR_NOEXIST;
 		return 0;
 		return 0;
 	}
 	}
@@ -468,7 +467,7 @@ static tdb_off_t tdb_find_dead(struct tdb_context *tdb, uint32_t hash,
 }
 }
 
 
 static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
 static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
-		      TDB_DATA dbuf, int flag, uint32_t hash)
+		       TDB_DATA dbuf, int flag, uint32_t hash)
 {
 {
 	struct tdb_record rec;
 	struct tdb_record rec;
 	tdb_off_t rec_ptr;
 	tdb_off_t rec_ptr;
@@ -594,7 +593,7 @@ static int _tdb_store(struct tdb_context *tdb, TDB_DATA key,
 }
 }
 
 
 /* store an element in the database, replacing any existing element
 /* store an element in the database, replacing any existing element
-   with the same key 
+   with the same key
 
 
    return 0 on success, -1 on failure
    return 0 on success, -1 on failure
 */
 */
@@ -605,8 +604,7 @@ int tdb_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag)
 
 
 	if (tdb->read_only || tdb->traverse_read) {
 	if (tdb->read_only || tdb->traverse_read) {
 		tdb->ecode = TDB_ERR_RDONLY;
 		tdb->ecode = TDB_ERR_RDONLY;
-		tdb_trace_2rec_flag_ret(tdb, "tdb_store", key, dbuf, flag,
-					-TDB_ERR_RDONLY);
+		tdb_trace_2rec_flag_ret(tdb, "tdb_store", key, dbuf, flag, -1);
 		return -1;
 		return -1;
 	}
 	}
 
 
@@ -621,7 +619,6 @@ int tdb_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag)
 	return ret;
 	return ret;
 }
 }
 
 
-
 /* Append to an entry. Create if not exist. */
 /* Append to an entry. Create if not exist. */
 int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf)
 int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf)
 {
 {
@@ -714,7 +711,6 @@ int tdb_get_seqnum(struct tdb_context *tdb)
 	tdb_off_t seqnum=0;
 	tdb_off_t seqnum=0;
 
 
 	tdb_ofs_read(tdb, TDB_SEQNUM_OFS, &seqnum);
 	tdb_ofs_read(tdb, TDB_SEQNUM_OFS, &seqnum);
-	tdb_trace_ret(tdb, "tdb_get_seqnum", seqnum);
 	return seqnum;
 	return seqnum;
 }
 }
 
 
@@ -900,7 +896,6 @@ failed:
 	return -1;
 	return -1;
 }
 }
 
 
-
 struct traverse_state {
 struct traverse_state {
 	bool error;
 	bool error;
 	struct tdb_context *dest_db;
 	struct tdb_context *dest_db;
@@ -909,9 +904,9 @@ struct traverse_state {
 /*
 /*
   traverse function for repacking
   traverse function for repacking
  */
  */
-static int repack_traverse(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *private)
+static int repack_traverse(struct tdb_context *tdb, TDB_DATA key, TDB_DATA data, void *private_data)
 {
 {
-	struct traverse_state *state = (struct traverse_state *)private;
+	struct traverse_state *state = (struct traverse_state *)private_data;
 	if (tdb_store(state->dest_db, key, data, TDB_INSERT) != 0) {
 	if (tdb_store(state->dest_db, key, data, TDB_INSERT) != 0) {
 		state->error = true;
 		state->error = true;
 		return -1;
 		return -1;
@@ -930,13 +925,13 @@ int tdb_repack(struct tdb_context *tdb)
 	tdb_trace(tdb, "tdb_repack");
 	tdb_trace(tdb, "tdb_repack");
 
 
 	if (tdb_transaction_start(tdb) != 0) {
 	if (tdb_transaction_start(tdb) != 0) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Failed to start transaction\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to start transaction\n"));
 		return -1;
 		return -1;
 	}
 	}
 
 
 	tmp_db = tdb_open("tmpdb", tdb_hash_size(tdb), TDB_INTERNAL, O_RDWR|O_CREAT, 0);
 	tmp_db = tdb_open("tmpdb", tdb_hash_size(tdb), TDB_INTERNAL, O_RDWR|O_CREAT, 0);
 	if (tmp_db == NULL) {
 	if (tmp_db == NULL) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Failed to create tmp_db\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to create tmp_db\n"));
 		tdb_transaction_cancel(tdb);
 		tdb_transaction_cancel(tdb);
 		return -1;
 		return -1;
 	}
 	}
@@ -945,21 +940,21 @@ int tdb_repack(struct tdb_context *tdb)
 	state.dest_db = tmp_db;
 	state.dest_db = tmp_db;
 
 
 	if (tdb_traverse_read(tdb, repack_traverse, &state) == -1) {
 	if (tdb_traverse_read(tdb, repack_traverse, &state) == -1) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Failed to traverse copying out\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to traverse copying out\n"));
 		tdb_transaction_cancel(tdb);
 		tdb_transaction_cancel(tdb);
 		tdb_close(tmp_db);
 		tdb_close(tmp_db);
 		return -1;		
 		return -1;		
 	}
 	}
 
 
 	if (state.error) {
 	if (state.error) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Error during traversal\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Error during traversal\n"));
 		tdb_transaction_cancel(tdb);
 		tdb_transaction_cancel(tdb);
 		tdb_close(tmp_db);
 		tdb_close(tmp_db);
 		return -1;
 		return -1;
 	}
 	}
 
 
 	if (tdb_wipe_all(tdb) != 0) {
 	if (tdb_wipe_all(tdb) != 0) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Failed to wipe database\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to wipe database\n"));
 		tdb_transaction_cancel(tdb);
 		tdb_transaction_cancel(tdb);
 		tdb_close(tmp_db);
 		tdb_close(tmp_db);
 		return -1;
 		return -1;
@@ -969,14 +964,14 @@ int tdb_repack(struct tdb_context *tdb)
 	state.dest_db = tdb;
 	state.dest_db = tdb;
 
 
 	if (tdb_traverse_read(tmp_db, repack_traverse, &state) == -1) {
 	if (tdb_traverse_read(tmp_db, repack_traverse, &state) == -1) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Failed to traverse copying back\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to traverse copying back\n"));
 		tdb_transaction_cancel(tdb);
 		tdb_transaction_cancel(tdb);
 		tdb_close(tmp_db);
 		tdb_close(tmp_db);
 		return -1;		
 		return -1;		
 	}
 	}
 
 
 	if (state.error) {
 	if (state.error) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Error during second traversal\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Error during second traversal\n"));
 		tdb_transaction_cancel(tdb);
 		tdb_transaction_cancel(tdb);
 		tdb_close(tmp_db);
 		tdb_close(tmp_db);
 		return -1;
 		return -1;
@@ -985,7 +980,7 @@ int tdb_repack(struct tdb_context *tdb)
 	tdb_close(tmp_db);
 	tdb_close(tmp_db);
 
 
 	if (tdb_transaction_commit(tdb) != 0) {
 	if (tdb_transaction_commit(tdb) != 0) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_repack: Failed to commit\n"));
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, __location__ " Failed to commit\n"));
 		return -1;
 		return -1;
 	}
 	}
 
 
@@ -1004,10 +999,10 @@ static void tdb_trace_write(struct tdb_context *tdb, const char *str)
 static void tdb_trace_start(struct tdb_context *tdb)
 static void tdb_trace_start(struct tdb_context *tdb)
 {
 {
 	tdb_off_t seqnum=0;
 	tdb_off_t seqnum=0;
-	char msg[sizeof(tdb_off_t) * 4];
+	char msg[sizeof(tdb_off_t) * 4 + 1];
 
 
 	tdb_ofs_read(tdb, TDB_SEQNUM_OFS, &seqnum);
 	tdb_ofs_read(tdb, TDB_SEQNUM_OFS, &seqnum);
-	sprintf(msg, "%u ", seqnum);
+	snprintf(msg, sizeof(msg), "%u ", seqnum);
 	tdb_trace_write(tdb, msg);
 	tdb_trace_write(tdb, msg);
 }
 }
 
 
@@ -1018,8 +1013,8 @@ static void tdb_trace_end(struct tdb_context *tdb)
 
 
 static void tdb_trace_end_ret(struct tdb_context *tdb, int ret)
 static void tdb_trace_end_ret(struct tdb_context *tdb, int ret)
 {
 {
-	char msg[sizeof(ret) * 4];
-	sprintf(msg, " = %i\n", ret);
+	char msg[sizeof(ret) * 4 + 4];
+	snprintf(msg, sizeof(msg), " = %i\n", ret);
 	tdb_trace_write(tdb, msg);
 	tdb_trace_write(tdb, msg);
 }
 }
 
 
@@ -1034,10 +1029,11 @@ static void tdb_trace_record(struct tdb_context *tdb, TDB_DATA rec)
 		return;
 		return;
 	}
 	}
 
 
+	/* snprintf here is purely cargo-cult programming. */
 	p = msg;
 	p = msg;
-	p += sprintf(p, " %zu:", rec.dsize);
+	p += snprintf(p, sizeof(msg), " %zu:", rec.dsize);
 	for (i = 0; i < rec.dsize; i++)
 	for (i = 0; i < rec.dsize; i++)
-		p += sprintf(p, "%02x", rec.dptr[i]);
+		p += snprintf(p, 2, "%02x", rec.dptr[i]);
 
 
 	tdb_trace_write(tdb, msg);
 	tdb_trace_write(tdb, msg);
 }
 }
@@ -1051,9 +1047,9 @@ void tdb_trace(struct tdb_context *tdb, const char *op)
 
 
 void tdb_trace_seqnum(struct tdb_context *tdb, uint32_t seqnum, const char *op)
 void tdb_trace_seqnum(struct tdb_context *tdb, uint32_t seqnum, const char *op)
 {
 {
-	char msg[sizeof(tdb_off_t) * 4];
+	char msg[sizeof(tdb_off_t) * 4 + 1];
 
 
-	sprintf(msg, "%u ", seqnum);
+	snprintf(msg, sizeof(msg), "%u ", seqnum);
 	tdb_trace_write(tdb, msg);
 	tdb_trace_write(tdb, msg);
 	tdb_trace_write(tdb, op);
 	tdb_trace_write(tdb, op);
 	tdb_trace_end(tdb);
 	tdb_trace_end(tdb);
@@ -1064,7 +1060,8 @@ void tdb_trace_open(struct tdb_context *tdb, const char *op,
 {
 {
 	char msg[128];
 	char msg[128];
 
 
-	sprintf(msg, "%s %u %#x %#x", op, hash_size, tdb_flags, open_flags);
+	snprintf(msg, sizeof(msg),
+		 "%s %u 0x%x 0x%x", op, hash_size, tdb_flags, open_flags);
 	tdb_trace_start(tdb);
 	tdb_trace_start(tdb);
 	tdb_trace_write(tdb, msg);
 	tdb_trace_write(tdb, msg);
 	tdb_trace_end(tdb);
 	tdb_trace_end(tdb);
@@ -1119,9 +1116,9 @@ void tdb_trace_2rec_flag_ret(struct tdb_context *tdb, const char *op,
 			     TDB_DATA rec1, TDB_DATA rec2, unsigned flag,
 			     TDB_DATA rec1, TDB_DATA rec2, unsigned flag,
 			     int ret)
 			     int ret)
 {
 {
-	char msg[sizeof(ret) * 4];
+	char msg[1 + sizeof(ret) * 4];
 
 
-	sprintf(msg, " %#x", flag); 
+	snprintf(msg, sizeof(msg), " %#x", flag);
 	tdb_trace_start(tdb);
 	tdb_trace_start(tdb);
 	tdb_trace_write(tdb, op);
 	tdb_trace_write(tdb, op);
 	tdb_trace_record(tdb, rec1);
 	tdb_trace_record(tdb, rec1);

+ 12 - 0
ccan/tdb/tdb_private.h

@@ -52,6 +52,18 @@
 
 
 /* #define TDB_TRACE 1 */
 /* #define TDB_TRACE 1 */
 
 
+#ifndef __STRING
+#define __STRING(x)    #x
+#endif
+
+#ifndef __STRINGSTRING
+#define __STRINGSTRING(x) __STRING(x)
+#endif
+
+#ifndef __location__
+#define __location__ __FILE__ ":" __STRINGSTRING(__LINE__)
+#endif
+
 #if HAVE_GETPAGESIZE
 #if HAVE_GETPAGESIZE
 #define getpagesize() 0x2000
 #define getpagesize() 0x2000
 #endif
 #endif

+ 5 - 5
ccan/tdb/traverse.c

@@ -140,9 +140,9 @@ static tdb_off_t tdb_next_lock(struct tdb_context *tdb, struct tdb_traverse_lock
    if fn is NULL then it is not called
    if fn is NULL then it is not called
    a non-zero return value from fn() indicates that the traversal should stop
    a non-zero return value from fn() indicates that the traversal should stop
   */
   */
-static int _tdb_traverse(struct tdb_context *tdb, 
-			 tdb_traverse_func fn, void *private_data,
-			 struct tdb_traverse_lock *tl)
+static int tdb_traverse_internal(struct tdb_context *tdb, 
+				 tdb_traverse_func fn, void *private_data,
+				 struct tdb_traverse_lock *tl)
 {
 {
 	TDB_DATA key, dbuf;
 	TDB_DATA key, dbuf;
 	struct tdb_record rec;
 	struct tdb_record rec;
@@ -226,7 +226,7 @@ int tdb_traverse_read(struct tdb_context *tdb,
 
 
 	tdb->traverse_read++;
 	tdb->traverse_read++;
 	tdb_trace(tdb, "tdb_traverse_read_start");
 	tdb_trace(tdb, "tdb_traverse_read_start");
-	ret = _tdb_traverse(tdb, fn, private_data, &tl);
+	ret = tdb_traverse_internal(tdb, fn, private_data, &tl);
 	tdb->traverse_read--;
 	tdb->traverse_read--;
 
 
 	tdb_transaction_unlock(tdb, F_RDLCK);
 	tdb_transaction_unlock(tdb, F_RDLCK);
@@ -257,7 +257,7 @@ int tdb_traverse(struct tdb_context *tdb,
 
 
 	tdb->traverse_write++;
 	tdb->traverse_write++;
 	tdb_trace(tdb, "tdb_traverse_start");
 	tdb_trace(tdb, "tdb_traverse_start");
-	ret = _tdb_traverse(tdb, fn, private_data, &tl);
+	ret = tdb_traverse_internal(tdb, fn, private_data, &tl);
 	tdb->traverse_write--;
 	tdb->traverse_write--;
 
 
 	tdb_transaction_unlock(tdb, F_WRLCK);
 	tdb_transaction_unlock(tdb, F_WRLCK);