From: Rusty Russell Date: Mon, 21 Mar 2011 11:42:17 +0000 (+1030) Subject: tdb2: tdb_mkdata X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=f367a1dc8573db0a1f6f49fcda474eb51c192241 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. --- diff --git a/ccan/tdb2/check.c b/ccan/tdb2/check.c index b44ae42a..57708668 100644 --- a/ccan/tdb2/check.c +++ b/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); } } } diff --git a/ccan/tdb2/private.h b/ccan/tdb2/private.h index 1e31ec15..90fe7376 100644 --- a/ccan/tdb2/private.h +++ b/ccan/tdb2/private.h @@ -35,7 +35,6 @@ #include #include #include -#include #if HAVE_BYTESWAP_H #include #endif diff --git a/ccan/tdb2/tdb.c b/ccan/tdb2/tdb.c index 254aac5f..09333a26 100644 --- a/ccan/tdb2/tdb.c +++ b/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); } } diff --git a/ccan/tdb2/tdb2.h b/ccan/tdb2/tdb2.h index 4f5be819..fa5787c3 100644 --- a/ccan/tdb2/tdb2.h +++ b/ccan/tdb2/tdb2.h @@ -45,6 +45,7 @@ extern "C" { #endif #include #include +#include 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() diff --git a/ccan/tdb2/test/external-agent.c b/ccan/tdb2/test/external-agent.c index 79c299a0..df51a0c5 100644 --- a/ccan/tdb2/test/external-agent.c +++ b/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) { diff --git a/ccan/tdb2/test/run-03-coalesce.c b/ccan/tdb2/test/run-03-coalesce.c index c3583d85..0b544f8c 100644 --- a/ccan/tdb2/test/run-03-coalesce.c +++ b/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"); diff --git a/ccan/tdb2/test/run-04-basichash.c b/ccan/tdb2/test/run-04-basichash.c index b3a5d1c5..0f962f82 100644 --- a/ccan/tdb2/test/run-04-basichash.c +++ b/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); } diff --git a/ccan/tdb2/test/run-10-simple-store.c b/ccan/tdb2/test/run-10-simple-store.c index daf97555..3aeb3816 100644 --- a/ccan/tdb2/test/run-10-simple-store.c +++ b/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; diff --git a/ccan/tdb2/test/run-11-simple-fetch.c b/ccan/tdb2/test/run-11-simple-fetch.c index ad1933cd..278d726a 100644 --- a/ccan/tdb2/test/run-11-simple-fetch.c +++ b/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; diff --git a/ccan/tdb2/test/run-13-delete.c b/ccan/tdb2/test/run-13-delete.c index aba6fe29..c70fec84 100644 --- a/ccan/tdb2/test/run-13-delete.c +++ b/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); } diff --git a/ccan/tdb2/test/run-15-append.c b/ccan/tdb2/test/run-15-append.c index e11289e9..70c0d174 100644 --- a/ccan/tdb2/test/run-15-append.c +++ b/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); diff --git a/ccan/tdb2/test/run-20-growhash.c b/ccan/tdb2/test/run-20-growhash.c index b504e490..1b6e7450 100644 --- a/ccan/tdb2/test/run-20-growhash.c +++ b/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, diff --git a/ccan/tdb2/test/run-50-multiple-freelists.c b/ccan/tdb2/test/run-50-multiple-freelists.c index 8220b911..7a48c3e0 100644 --- a/ccan/tdb2/test/run-50-multiple-freelists.c +++ b/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); diff --git a/ccan/tdb2/test/run-55-transaction.c b/ccan/tdb2/test/run-55-transaction.c index d7fd951e..1650e40e 100644 --- a/ccan/tdb2/test/run-55-transaction.c +++ b/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); diff --git a/ccan/tdb2/test/run-56-open-during-transaction.c b/ccan/tdb2/test/run-56-open-during-transaction.c index b242eab7..96107d63 100644 --- a/ccan/tdb2/test/run-56-open-during-transaction.c +++ b/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); diff --git a/ccan/tdb2/test/run-57-die-during-transaction.c b/ccan/tdb2/test/run-57-die-during-transaction.c index 54dcdca6..84f01eb2 100644 --- a/ccan/tdb2/test/run-57-die-during-transaction.c +++ b/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; diff --git a/ccan/tdb2/test/run-81-seqnum.c b/ccan/tdb2/test/run-81-seqnum.c index db42b976..f7308e2d 100644 --- a/ccan/tdb2/test/run-81-seqnum.c +++ b/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 }; diff --git a/ccan/tdb2/test/run-record-expand.c b/ccan/tdb2/test/run-record-expand.c index 63bbf18d..155484ce 100644 --- a/ccan/tdb2/test/run-record-expand.c +++ b/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); diff --git a/ccan/tdb2/test/run-remap-in-read_traverse.c b/ccan/tdb2/test/run-remap-in-read_traverse.c index 85df6612..d784ca34 100644 --- a/ccan/tdb2/test/run-remap-in-read_traverse.c +++ b/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); diff --git a/ccan/tdb2/test/run-simple-delete.c b/ccan/tdb2/test/run-simple-delete.c index fef79a9b..3d6a6f2a 100644 --- a/ccan/tdb2/test/run-simple-delete.c +++ b/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++) {