You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.3 KiB
85 lines
2.3 KiB
#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
|
|
|