# HG changeset patch # User Sebastien Decugis # Date 1368587910 -28800 # Node ID 7c5449ddc434828e77517cb893c882d740b5a4d6 # Parent 1af09cc156d6dab4c0f5f9718a5f825a285d9492 New macro HOOK_MASK to ease call of the fd_hook_register function diff -r 1af09cc156d6 -r 7c5449ddc434 extensions/dbg_msg_dumps/dbg_msg_dumps.c --- a/extensions/dbg_msg_dumps/dbg_msg_dumps.c Wed May 15 10:39:25 2013 +0800 +++ b/extensions/dbg_msg_dumps/dbg_msg_dumps.c Wed May 15 11:18:30 2013 +0800 @@ -63,7 +63,7 @@ { TRACE_ENTRY("%p", conffile); - CHECK_FCT( fd_hook_register( ((1 << HOOK_MESSAGE_RECEIVED) | (1 << HOOK_MESSAGE_SENT)), + CHECK_FCT( fd_hook_register( HOOK_MASK( HOOK_MESSAGE_RECEIVED, HOOK_MESSAGE_SENT ), md_hook_cb, NULL, NULL, &md_hdl) ); return 0; diff -r 1af09cc156d6 -r 7c5449ddc434 extensions/dbg_msg_timings/dbg_msg_timings.c --- a/extensions/dbg_msg_timings/dbg_msg_timings.c Wed May 15 10:39:25 2013 +0800 +++ b/extensions/dbg_msg_timings/dbg_msg_timings.c Wed May 15 11:18:30 2013 +0800 @@ -116,7 +116,7 @@ CHECK_FCT( fd_hook_data_register( sizeof(struct fd_hook_permsgdata), NULL, NULL, &mt_data_hdl ) ); - CHECK_FCT( fd_hook_register( ((1 << HOOK_MESSAGE_RECEIVED) | (1 << HOOK_MESSAGE_SENT) | (1 << HOOK_DATA_RECEIVED)), + CHECK_FCT( fd_hook_register( HOOK_MASK( HOOK_MESSAGE_RECEIVED, HOOK_MESSAGE_SENT, HOOK_DATA_RECEIVED ), mt_hook_cb, NULL, mt_data_hdl, &mt_hdl) ); return 0; diff -r 1af09cc156d6 -r 7c5449ddc434 include/freeDiameter/libfdcore.h --- a/include/freeDiameter/libfdcore.h Wed May 15 10:39:25 2013 +0800 +++ b/include/freeDiameter/libfdcore.h Wed May 15 11:18:30 2013 +0800 @@ -1076,11 +1076,14 @@ /* A handler associated with a registered hook callback (for cleanup) */ struct fd_hook_hdl; +/* Helper for building a mask of hooks for registration */ +#define HOOK_MASK(hooklist...) fd_hook_mask_helper(0, ## hooklist, -1) + /* * FUNCTION: fd_hook_register * * PARAMETERS: - * type_mask : A bitmask of fd_hook_type bits for which this cb is registered, e.g. ((1 << HOOK_MESSAGE_RECEIVED) | (1 << HOOK_MESSAGE_SENT)) + * type_mask : A bitmask of fd_hook_type bits for which this cb is registered, e.g. HOOK_MASK( HOOK_MESSAGE_RECEIVED, HOOK_MESSAGE_SENT ) * fd_hook_cb : The callback function to register (see prototype above). * regdata : Pointer to pass to the callback when it is called. The data is opaque to the daemon. * data_hdl : If permsgdata is requested for the hooks, a handler registered with fd_hook_data_register. NULL otherwise. @@ -1109,6 +1112,8 @@ /* Use the following function to retrieve any pmd structure associated with a request matching the current answer. Returns NULL in case of error / no such structure */ struct fd_hook_permsgdata * fd_hook_get_request_pmd(struct fd_hook_data_hdl *data_hdl, struct msg * answer); +/* The following is used by HOOK_MASK macro */ +uint32_t fd_hook_mask_helper(int dummy, ...); /*============================================================*/ diff -r 1af09cc156d6 -r 7c5449ddc434 libfdcore/hooks.c --- a/libfdcore/hooks.c Wed May 15 10:39:25 2013 +0800 +++ b/libfdcore/hooks.c Wed May 15 11:18:30 2013 +0800 @@ -262,6 +262,24 @@ return ret; } +/* Create a mask */ +uint32_t fd_hook_mask_helper(int dummy, ...) +{ + va_list ap; + uint32_t ret = 0; + int next; + + va_start(ap, dummy); + while ((next = va_arg(ap, int)) >= 0) { + if (next > HOOK_PEER_LAST) + break; /* invalid parameter */ + ret |= (1<