fetch_script

March 26, 2020 Contributors

Name

fetch_script

Synopsis

#include "hooks/sieve/fetch_script.h"

| int **fetch_script** ( | closure, |   |
|   | uri, |   |
|   | optional_args, |   |
|   | script, |   |
|   | seng, |   |
|   | error_log); |   |

void * <var class="pdparam">closure</var>;
const char * <var class="pdparam">uri</var>;
SIEVEARGS * <var class="pdparam">optional_args</var>;
string * <var class="pdparam">script</var>;
SENG * <var class="pdparam">seng</var>;
string * <var class="pdparam">error_log</var>;

| int **has_sieve_fetch_script_hook** ( | ); |   |

| void **register_sieve_fetch_script_hook_first** ( | hook, |   |
|   | closure); |   |

ec_hook_sieve_fetch_script_func_t <var class="pdparam">hook</var>;
void *<var class="pdparam">closure</var>;

| void **register_sieve_fetch_script_hook_last** ( | hook, |   |
|   | closure); |   |

ec_hook_sieve_fetch_script_func_t <var class="pdparam">hook</var>;
void *<var class="pdparam">closure</var>;

| int **call_sieve_fetch_script_hook** ( | uri, |   |
|   | optional_args, |   |
|   | script, |   |
|   | seng, |   |
|   | error_log); |   |

const char * <var class="pdparam">uri</var>;
SIEVEARGS * <var class="pdparam">optional_args</var>;
string * <var class="pdparam">script</var>;
SENG * <var class="pdparam">seng</var>;
string * <var class="pdparam">error_log</var>;

Description

This hook allows modules to plug in their own custom Sieve script storage and retrieval mechanism when processing runtime included scripts. The Momentum core doesn’t provide this facility by itself; the Sieve validation module registers a compile_script hook of its own to implement this feature, which in turns calls out to the fetch_script hooks. If you need to add a storage mechanism that isn’t supported via the Sieve validation module, you can do so by implementing this hook.

uri is the URI from the ec_include statement in the calling Sieve script, and optional_args will be either NULL or a valid SIEVEARGS specifying some kind of optional parameters for the uri. It is up to your hook implementation to interpret these.

When called, the hook is responsible for resolving the supplied uri and optional_args into a UTF-8 encoded Sieve script. On success, it should populate script with the text for the script, and then return SIV_DONE. The hook implementation must only add content to script once it has fully retrieved the script text; it MUST NOT cache the string pointer for later use; it is a transient resource that will become invalidated as soon as the hook function returns. script is supplied uninitialized; the hook implementation is responsible for allocating the string buffer, by calling the STRING_INIT macro or through some other means.

If an error occurred, the hook should log the reason for the error and return SIV_DONE.

If the retrieval process is going to block the caller, the hook implementation may arrange for it to complete asynchronously, stashing seng in an appropriate location and returning SIV_AGAIN. When the retrieval completes, the implementation may call sieve_resume to restart the Sieve engine processing and retry the include. If seng is NULL, or if sieve_seng_get_can_go_async returns 0 you MUST NOT run asynchronously.

If the uri is not understood by the hook implementation, it should return SIV_CONT to allow additional hooks the opportunity to handle the compilation.