Patch: Add init and cleanup functions to registry backends and call them if they are defined

Jeremy Allison jra at samba.org
Mon Jan 12 14:45:34 MST 2015


On Sun, Jan 11, 2015 at 11:59:44AM -0800, Richard Sharpe wrote:
> On Sat, Jan 10, 2015 at 1:02 PM, Richard Sharpe
> <realrichardsharpe at gmail.com> wrote:
> > Hi folks,
> >
> > Sometimes, as in my zookeeper backend, you need an init and cleanup function.
> >
> > This small patch provides that.
> >
> > Please provide feedback or push if OK ...
> 
> A small update. If the init function fails, we should not install it.
> Rather, we should print a level 0 message in the log.

Can you call the functions registry_ops_init()/registry_ops_cleanup()
not just init() and cleanup() please ?

Also, rather than calling these inside the reghook_cache_add()
function, shouldn't these be called inside reghook_cache_init() ?


> From 9de02e3617650b6295e584f4ea55512fd12ec68e Mon Sep 17 00:00:00 2001
> From: Richard Sharpe <realrichardsharpe at gmail.com>
> Date: Sat, 10 Jan 2015 12:58:37 -0800
> Subject: [PATCH] Add init and cleanup functions to the registry backends and
>  call them when them when a registry backend is installed, if they are
>  defined. If the init function for a new backend fails, we will refuse to
>  install it to prevent further damage and we print a log level 0 error
>  message.
> 
> Signed-off-by: Richard Sharpe <rsharpe at samba.org>
> ---
>  source3/include/registry.h       |  3 +++
>  source3/registry/reg_cachehook.c | 24 ++++++++++++++++++++++++
>  2 files changed, 27 insertions(+)
> 
> diff --git a/source3/include/registry.h b/source3/include/registry.h
> index f7a537e..008046a 100644
> --- a/source3/include/registry.h
> +++ b/source3/include/registry.h
> @@ -40,6 +40,9 @@ struct regsubkey_ctr;
>   */
>  
>  struct registry_ops {
> +	/* Initialize and cleanup the back end, if needed ... */
> +	int	(*init)(const char *base_key);
> +	int	(*cleanup)(void);
>  	/* functions for enumerating subkeys and values */
>  	int 	(*fetch_subkeys)( const char *key, struct regsubkey_ctr *subkeys);
>  	int 	(*fetch_values) ( const char *key, struct regval_ctr *val );
> diff --git a/source3/registry/reg_cachehook.c b/source3/registry/reg_cachehook.c
> index 1f26927..ae53096 100644
> --- a/source3/registry/reg_cachehook.c
> +++ b/source3/registry/reg_cachehook.c
> @@ -80,6 +80,7 @@ WERROR reghook_cache_add(const char *keyname, struct registry_ops *ops)
>  {
>  	WERROR werr;
>  	char *key = NULL;
> +	struct registry_ops *old_ops;
>  
>  	if ((keyname == NULL) || (ops == NULL)) {
>  		return WERR_INVALID_PARAM;
> @@ -93,6 +94,29 @@ WERROR reghook_cache_add(const char *keyname, struct registry_ops *ops)
>  	DEBUG(10, ("reghook_cache_add: Adding ops %p for key [%s]\n",
>  		   (void *)ops, key));
>  
> +	/*
> +	 * If there is already an ops structure registered, call its 
> +	 * cleanup function, if any.
> +	 */
> +	if ((old_ops = pathtree_find(cache_tree, key)) && old_ops->cleanup) {
> +		DEBUG(10, ("Calling cleanup function for old ops: %p\n",
> +			old_ops));
> +		old_ops->cleanup();
> +	}
> +
> +	/*
> +	 * Call the init function, if it exists ... but if the init
> +	 * function fails, do not install the new ops.
> +	 */
> +	if (ops->init) {
> +		if (!ops->init(key)) {
> +			DEBUG(0, ("ERROR: Init function failed for ops:key %p:%s, not installed\n",
> +				ops, key));
> +			werr = WERR_NOMEM; /* Is there something better? */
> +			goto done; 
> +		}
> +	}
> +
>  	if (!pathtree_add(cache_tree, key, ops))
>  		werr = WERR_NOMEM;
>  	else
> -- 
> 1.8.3.1
> 



More information about the samba-technical mailing list