86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
| #ifndef HOOK_H
 | |
| #define HOOK_H
 | |
| #include "strvec.h"
 | |
| 
 | |
| struct run_hooks_opt
 | |
| {
 | |
| 	/* Environment vars to be set for each hook */
 | |
| 	struct strvec env;
 | |
| 
 | |
| 	/* Args to be passed to each hook */
 | |
| 	struct strvec args;
 | |
| 
 | |
| 	/* Emit an error if the hook is missing */
 | |
| 	unsigned int error_if_missing:1;
 | |
| 
 | |
| 	/**
 | |
| 	 * An optional initial working directory for the hook,
 | |
| 	 * translates to "struct child_process"'s "dir" member.
 | |
| 	 */
 | |
| 	const char *dir;
 | |
| 
 | |
| 	/**
 | |
| 	 * A pointer which if provided will be set to 1 or 0 depending
 | |
| 	 * on if a hook was started, regardless of whether or not that
 | |
| 	 * was successful. I.e. if the underlying start_command() was
 | |
| 	 * successful this will be set to 1.
 | |
| 	 *
 | |
| 	 * Used for avoiding TOCTOU races in code that would otherwise
 | |
| 	 * call hook_exist() after a "maybe hook run" to see if a hook
 | |
| 	 * was invoked.
 | |
| 	 */
 | |
| 	int *invoked_hook;
 | |
| };
 | |
| 
 | |
| #define RUN_HOOKS_OPT_INIT { \
 | |
| 	.env = STRVEC_INIT, \
 | |
| 	.args = STRVEC_INIT, \
 | |
| }
 | |
| 
 | |
| struct hook_cb_data {
 | |
| 	/* rc reflects the cumulative failure state */
 | |
| 	int rc;
 | |
| 	const char *hook_name;
 | |
| 	const char *hook_path;
 | |
| 	struct run_hooks_opt *options;
 | |
| };
 | |
| 
 | |
| /*
 | |
|  * Returns the path to the hook file, or NULL if the hook is missing
 | |
|  * or disabled. Note that this points to static storage that will be
 | |
|  * overwritten by further calls to find_hook and run_hook_*.
 | |
|  */
 | |
| const char *find_hook(const char *name);
 | |
| 
 | |
| /**
 | |
|  * A boolean version of find_hook()
 | |
|  */
 | |
| int hook_exists(const char *hookname);
 | |
| 
 | |
| /**
 | |
|  * Takes a `hook_name`, resolves it to a path with find_hook(), and
 | |
|  * runs the hook for you with the options specified in "struct
 | |
|  * run_hooks opt". Will free memory associated with the "struct run_hooks_opt".
 | |
|  *
 | |
|  * Returns the status code of the run hook, or a negative value on
 | |
|  * error().
 | |
|  */
 | |
| int run_hooks_opt(const char *hook_name, struct run_hooks_opt *options);
 | |
| 
 | |
| /**
 | |
|  * A wrapper for run_hooks_opt() which provides a dummy "struct
 | |
|  * run_hooks_opt" initialized with "RUN_HOOKS_OPT_INIT".
 | |
|  */
 | |
| int run_hooks(const char *hook_name);
 | |
| 
 | |
| /**
 | |
|  * Like run_hooks(), a wrapper for run_hooks_opt().
 | |
|  *
 | |
|  * In addition to the wrapping behavior provided by run_hooks(), this
 | |
|  * wrapper takes a list of strings terminated by a NULL
 | |
|  * argument. These things will be used as positional arguments to the
 | |
|  * hook. This function behaves like the old run_hook_le() API.
 | |
|  */
 | |
| int run_hooks_l(const char *hook_name, ...);
 | |
| #endif
 |