From: Rusty Russell Date: Thu, 17 Mar 2011 11:42:21 +0000 (+1030) Subject: tdb2: typesafe traverse function X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=5d226247fd983bdde5780e672a5ae38391356265 tdb2: typesafe traverse function This make sure that the data being handed to the function in tdb_traverse is the correct type. --- diff --git a/ccan/tdb2/_info b/ccan/tdb2/_info index 67ad3f6c..0e894e5b 100644 --- a/ccan/tdb2/_info +++ b/ccan/tdb2/_info @@ -85,6 +85,7 @@ int main(int argc, char *argv[]) printf("ccan/ilog\n"); printf("ccan/failtest\n"); printf("ccan/tally\n"); + printf("ccan/typesafe_cb\n"); return 0; } diff --git a/ccan/tdb2/tdb2.h b/ccan/tdb2/tdb2.h index c0ab8eb0..52c26959 100644 --- a/ccan/tdb2/tdb2.h +++ b/ccan/tdb2/tdb2.h @@ -40,6 +40,7 @@ extern "C" { #include #endif #include +#include union tdb_attribute; struct tdb_context; @@ -249,9 +250,6 @@ enum TDB_ERROR tdb_transaction_commit(struct tdb_context *tdb); */ enum TDB_ERROR tdb_transaction_prepare_commit(struct tdb_context *tdb); -/* FIXME: Make typesafe */ -typedef int (*tdb_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void *); - /** * tdb_traverse - traverse a TDB * @tdb: the tdb context returned from tdb_open() @@ -269,7 +267,14 @@ typedef int (*tdb_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void * On success, returns the number of keys iterated. On error returns * a negative enum TDB_ERROR value. */ -int64_t tdb_traverse(struct tdb_context *tdb, tdb_traverse_func fn, void *p); +#define tdb_traverse(tdb, fn, p) \ + tdb_traverse_(tdb, typesafe_cb_preargs(int, (fn), (p), \ + struct tdb_context *, \ + TDB_DATA, TDB_DATA), (p)) + +int64_t tdb_traverse_(struct tdb_context *tdb, + int (*fn)(struct tdb_context *, + TDB_DATA, TDB_DATA, void *), void *p); /** * tdb_firstkey - get the "first" key in a TDB diff --git a/ccan/tdb2/test/run-traverse.c b/ccan/tdb2/test/run-traverse.c index 0a631002..13c3d457 100644 --- a/ccan/tdb2/test/run-traverse.c +++ b/ccan/tdb2/test/run-traverse.c @@ -38,9 +38,9 @@ struct trav_data { enum TDB_ERROR delete_error; }; -static int trav(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, void *p) +static int trav(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, + struct trav_data *td) { - struct trav_data *td = p; int val; td->calls++; @@ -75,9 +75,8 @@ struct trav_grow_data { }; static int trav_grow(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, - void *p) + struct trav_grow_data *tgd) { - struct trav_grow_data *tgd = p; int val; unsigned char buffer[128] = { 0 }; diff --git a/ccan/tdb2/traverse.c b/ccan/tdb2/traverse.c index 5217f63b..9736e9f5 100644 --- a/ccan/tdb2/traverse.c +++ b/ccan/tdb2/traverse.c @@ -18,7 +18,10 @@ #include "private.h" #include -int64_t tdb_traverse(struct tdb_context *tdb, tdb_traverse_func fn, void *p) +int64_t tdb_traverse_(struct tdb_context *tdb, + int (*fn)(struct tdb_context *, + TDB_DATA, TDB_DATA, void *), + void *p) { enum TDB_ERROR ecode; struct traverse_info tinfo;