Browse Source

tdb2: tdb_mkdata

It's common to want to create a struct tdb_data which contains a const
pointer, so add a helper to do so, and use it to clean up other -Wcast-qual
warnings.
Rusty Russell 15 years ago
parent
commit
f367a1dc85

+ 14 - 10
ccan/tdb2/check.c

@@ -402,22 +402,26 @@ static enum TDB_ERROR check_hash_tree(struct tdb_context *tdb,
 		check:
 			if (check) {
 				TDB_DATA key, data;
-				key.dsize = rec_key_length(&rec);
-				data.dsize = rec_data_length(&rec);
-				key.dptr = (void *)tdb_access_read(tdb,
-						   off + sizeof(rec),
-						   key.dsize + data.dsize,
-						   false);
-				if (TDB_PTR_IS_ERR(key.dptr)) {
-					ecode = TDB_PTR_ERR(key.dptr);
+				const unsigned char *kptr;
+
+				kptr = tdb_access_read(tdb,
+						       off + sizeof(rec),
+						       rec_key_length(&rec)
+						       + rec_data_length(&rec),
+						       false);
+				if (TDB_PTR_IS_ERR(kptr)) {
+					ecode = TDB_PTR_ERR(kptr);
 					goto fail;
 				}
-				data.dptr = key.dptr + key.dsize;
+
+				key = tdb_mkdata(kptr, rec_key_length(&rec));
+				data = tdb_mkdata(kptr + key.dsize,
+						  rec_data_length(&rec));
 				ecode = check(key, data, private_data);
+				tdb_access_release(tdb, kptr);
 				if (ecode != TDB_SUCCESS) {
 					goto fail;
 				}
-				tdb_access_release(tdb, key.dptr);
 			}
 		}
 	}

+ 0 - 1
ccan/tdb2/private.h

@@ -35,7 +35,6 @@
 #include <ccan/tdb2/tdb2.h>
 #include <ccan/likely/likely.h>
 #include <ccan/compiler/compiler.h>
-#include <ccan/cast/cast.h>
 #if HAVE_BYTESWAP_H
 #include <byteswap.h>
 #endif

+ 8 - 9
ccan/tdb2/tdb.c

@@ -422,7 +422,6 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb,
 	tdb_off_t off;
 	struct tdb_used_record rec;
 	struct hash_info h;
-	TDB_DATA data;
 	enum TDB_ERROR ecode;
 
 	off = find_and_lock(tdb, key, F_RDLCK, &h, &rec, NULL);
@@ -433,16 +432,16 @@ enum TDB_ERROR tdb_parse_record_(struct tdb_context *tdb,
 	if (!off) {
 		ecode = TDB_ERR_NOEXIST;
 	} else {
-		data.dsize = rec_data_length(&rec);
-		data.dptr = (void *)tdb_access_read(tdb,
-						    off + sizeof(rec)
-						    + key.dsize,
-						    data.dsize, false);
-		if (TDB_PTR_IS_ERR(data.dptr)) {
-			ecode = TDB_PTR_ERR(data.dptr);
+		const void *dptr;
+		dptr = tdb_access_read(tdb, off + sizeof(rec) + key.dsize,
+				       rec_data_length(&rec), false);
+		if (TDB_PTR_IS_ERR(dptr)) {
+			ecode = TDB_PTR_ERR(dptr);
 		} else {
+			TDB_DATA data = tdb_mkdata(dptr, rec_data_length(&rec));
+
 			ecode = parse(key, data, p);
-			tdb_access_release(tdb, data.dptr);
+			tdb_access_release(tdb, dptr);
 		}
 	}
 

+ 19 - 0
ccan/tdb2/tdb2.h

@@ -45,6 +45,7 @@ extern "C" {
 #endif
 #include <ccan/compiler/compiler.h>
 #include <ccan/typesafe_cb/typesafe_cb.h>
+#include <ccan/cast/cast.h>
 
 union tdb_attribute;
 struct tdb_context;
@@ -221,6 +222,24 @@ static inline bool tdb_deq(struct tdb_data a, struct tdb_data b)
 	return a.dsize == b.dsize && memcmp(a.dptr, b.dptr, a.dsize) == 0;
 }
 
+/**
+ * tdb_mkdata - make a struct tdb_data from const data
+ * @p: the constant pointer
+ * @len: the length
+ *
+ * As the dptr member of struct tdb_data is not constant, you need to
+ * cast it.  This function keeps thost casts in one place, as well as
+ * suppressing the warning some compilers give when casting away a
+ * qualifier (eg. gcc with -Wcast-qual)
+ */
+static inline struct tdb_data tdb_mkdata(const void *p, size_t len)
+{
+	struct tdb_data d;
+	d.dptr = cast_const(void *, p);
+	d.dsize = len;
+	return d;
+}
+
 /**
  * tdb_transaction_start - start a transaction
  * @tdb: the tdb context returned from tdb_open()

+ 1 - 2
ccan/tdb2/test/external-agent.c

@@ -31,8 +31,7 @@ static enum agent_return do_operation(enum operation op, const char *name)
 
 	diag("external: %s", operation_name(op));
 
-	k.dptr = (void *)name;
-	k.dsize = strlen(name);
+	k = tdb_mkdata(name, strlen(name));
 
 	locking_would_block = 0;
 	switch (op) {

+ 2 - 4
ccan/tdb2/test/run-03-coalesce.c

@@ -34,10 +34,8 @@ int main(int argc, char *argv[])
 	/* FIXME: Test TDB_CONVERT */
 
 	plan_tests(38);
-	data.dptr = (void *)"world";
-	data.dsize = 5;
-	key.dptr = (void *)"hello";
-	key.dsize = 5;
+	data = tdb_mkdata("world", 5);
+	key = tdb_mkdata("hello", 5);
 
 	/* No coalescing can be done due to EOF */
 	layout = new_tdb_layout("run-03-coalesce.tdb");

+ 1 - 1
ccan/tdb2/test/run-04-basichash.c

@@ -12,7 +12,7 @@
 /* We rig the hash so adjacent-numbered records always clash. */
 static uint64_t clash(const void *key, size_t len, uint64_t seed, void *priv)
 {
-	return ((uint64_t)*(unsigned int *)key)
+	return ((uint64_t)*(const unsigned int *)key)
 		<< (64 - TDB_TOPLEVEL_HASH_BITS - 1);
 }
 

+ 2 - 2
ccan/tdb2/test/run-10-simple-store.c

@@ -30,8 +30,8 @@ int main(int argc, char *argv[])
 	int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
 			TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, 
 			TDB_NOMMAP|TDB_CONVERT };
-	struct tdb_data key = { (unsigned char *)"key", 3 };
-	struct tdb_data data = { (unsigned char *)"data", 4 };
+	struct tdb_data key = tdb_mkdata("key", 3);
+	struct tdb_data data = tdb_mkdata("data", 4);
 
 	failtest_init(argc, argv);
 	failtest_hook = suppress_failure;

+ 2 - 2
ccan/tdb2/test/run-11-simple-fetch.c

@@ -30,8 +30,8 @@ int main(int argc, char *argv[])
 	int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
 			TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, 
 			TDB_NOMMAP|TDB_CONVERT };
-	struct tdb_data key = { (unsigned char *)"key", 3 };
-	struct tdb_data data = { (unsigned char *)"data", 4 };
+	struct tdb_data key = tdb_mkdata("key", 3);
+	struct tdb_data data = tdb_mkdata("data", 4);
 
 	failtest_init(argc, argv);
 	failtest_hook = suppress_failure;

+ 1 - 1
ccan/tdb2/test/run-13-delete.c

@@ -12,7 +12,7 @@
 /* We rig the hash so adjacent-numbered records always clash. */
 static uint64_t clash(const void *key, size_t len, uint64_t seed, void *priv)
 {
-	return ((uint64_t)*(unsigned int *)key)
+	return ((uint64_t)*(const unsigned int *)key)
 		<< (64 - TDB_TOPLEVEL_HASH_BITS - 1);
 }
 

+ 1 - 1
ccan/tdb2/test/run-15-append.c

@@ -35,7 +35,7 @@ int main(int argc, char *argv[])
 	int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
 			TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, 
 			TDB_NOMMAP|TDB_CONVERT };
-	struct tdb_data key = { (unsigned char *)"key", 3 };
+	struct tdb_data key = tdb_mkdata("key", 3);
 	struct tdb_data data;
 
 	buffer = malloc(MAX_SIZE);

+ 1 - 1
ccan/tdb2/test/run-20-growhash.c

@@ -11,7 +11,7 @@
 
 static uint64_t myhash(const void *key, size_t len, uint64_t seed, void *priv)
 {
-	return *(uint64_t *)key;
+	return *(const uint64_t *)key;
 }
 
 static void add_bits(uint64_t *val, unsigned new, unsigned new_bits,

+ 2 - 4
ccan/tdb2/test/run-50-multiple-freelists.c

@@ -18,10 +18,8 @@ int main(int argc, char *argv[])
 	TDB_DATA key, data;
 
 	plan_tests(11);
-	key.dptr = (unsigned char *)"Hello";
-	data.dptr = (unsigned char *)"world";
-	data.dsize = 5;
-	key.dsize = 5;
+	key = tdb_mkdata("Hello", 5);
+	data = tdb_mkdata("world", 5);
 
 	/* Create a TDB with three free tables. */
 	layout = new_tdb_layout(NULL);

+ 1 - 1
ccan/tdb2/test/run-55-transaction.c

@@ -16,7 +16,7 @@ int main(int argc, char *argv[])
 	unsigned char *buffer;
 	int flags[] = { TDB_DEFAULT, TDB_NOMMAP,
 			TDB_CONVERT, TDB_NOMMAP|TDB_CONVERT };
-	struct tdb_data key = { (unsigned char *)"key", 3 };
+	struct tdb_data key = tdb_mkdata("key", 3);
 	struct tdb_data data;
 
 	buffer = malloc(1000);

+ 2 - 4
ccan/tdb2/test/run-56-open-during-transaction.c

@@ -160,10 +160,8 @@ int main(int argc, char *argv[])
 
 		opened = true;
 		ok1(tdb_transaction_start(tdb) == 0);
-		key.dsize = strlen("hi");
-		key.dptr = (void *)"hi";
-		data.dptr = (void *)"world";
-		data.dsize = strlen("world");
+		key = tdb_mkdata("hi", strlen("hi"));
+		data = tdb_mkdata("world", strlen("world"));
 
 		ok1(tdb_store(tdb, key, data, TDB_INSERT) == 0);
 		ok1(tdb_transaction_commit(tdb) == 0);

+ 1 - 2
ccan/tdb2/test/run-57-die-during-transaction.c

@@ -208,8 +208,7 @@ reset:
 	}
 
 	/* Put key for agent to fetch. */
-	key.dsize = strlen(KEY_STRING);
-	key.dptr = (void *)KEY_STRING;
+	key = tdb_mkdata(KEY_STRING, strlen(KEY_STRING));
 	if (tdb_store(tdb, key, key, TDB_INSERT) != 0)
 		return false;
 

+ 2 - 2
ccan/tdb2/test/run-81-seqnum.c

@@ -15,8 +15,8 @@ int main(int argc, char *argv[])
 	unsigned int i;
 	struct tdb_context *tdb;
 	struct tdb_data d = { NULL, 0 }; /* Bogus GCC warning */
-	struct tdb_data key = { (unsigned char *)"key", 3 };
-	struct tdb_data data = { (unsigned char *)"data", 4 };
+	struct tdb_data key = tdb_mkdata("key", 3);
+	struct tdb_data data = tdb_mkdata("data", 4);
 	int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
 			TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT,
 			TDB_NOMMAP|TDB_CONVERT };

+ 1 - 1
ccan/tdb2/test/run-record-expand.c

@@ -19,7 +19,7 @@ int main(int argc, char *argv[])
 	int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
 			TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, 
 			TDB_NOMMAP|TDB_CONVERT };
-	struct tdb_data key = { (unsigned char *)"key", 3 };
+	struct tdb_data key = tdb_mkdata("key", 3);
 	struct tdb_data data;
 
 	data.dptr = malloc(MAX_SIZE);

+ 1 - 1
ccan/tdb2/test/run-remap-in-read_traverse.c

@@ -40,7 +40,7 @@ int main(int argc, char *argv[])
 	unsigned int i;
 	struct agent *agent;
 	struct tdb_context *tdb;
-	struct tdb_data d = { (unsigned char *)"hello", 5 };
+	struct tdb_data d = tdb_mkdata("hello", 5);
 	const char filename[] = "run-remap-in-read_traverse.tdb";
 
 	plan_tests(4);

+ 2 - 2
ccan/tdb2/test/run-simple-delete.c

@@ -16,8 +16,8 @@ int main(int argc, char *argv[])
 	int flags[] = { TDB_INTERNAL, TDB_DEFAULT, TDB_NOMMAP,
 			TDB_INTERNAL|TDB_CONVERT, TDB_CONVERT, 
 			TDB_NOMMAP|TDB_CONVERT };
-	struct tdb_data key = { (unsigned char *)"key", 3 };
-	struct tdb_data data = { (unsigned char *)"data", 4 };
+	struct tdb_data key = tdb_mkdata("key", 3);
+	struct tdb_data data = tdb_mkdata("data", 4);
 
 	plan_tests(sizeof(flags) / sizeof(flags[0]) * 7 + 1);
 	for (i = 0; i < sizeof(flags) / sizeof(flags[0]); i++) {