#ifndef HYDRANT_H #define HYDRANT_H /* run hydrant inside another program. hydrant serves its usual http api, ideally on a * `unix:` bind, and the embedder talks to it over that. see ffi/src/lib.rs for details. */ #include #ifdef __cplusplus extern "C" { #endif typedef struct HydrantHandle hydrant_t; /* starts hydrant from a json object of the HYDRANT_* settings the binary reads from its * environment, plus RUST_LOG. HYDRANT_API_BIND is required, and `none` runs without an api. * returns NULL and sets *err on failure. ignore SIGPIPE before calling this, the way * rust binaries do at startup, or a write to a socket whose peer left kills the process. */ hydrant_t *hydrant_start(const char *settings_json, char **err); /* blocks until hydrant stops. returns -1 with *err set when it failed, or 0 once hydrant_shutdown * stopped it. a failed hydrant still holds its database until hydrant_shutdown. */ int hydrant_wait(const hydrant_t *handle, char **err); /* stops hydrant and waits up to timeout_ms for its database to close, so its memory is * given back and hydrant_start can open the same database again. returns -1 with *err set * if it's still open after that, or if it was already shut down. */ int hydrant_shutdown(const hydrant_t *handle, uint64_t timeout_ms, char **err); /* frees a handle, telling it to stop first if hydrant_shutdown wasn't called. nothing may * still be blocked in hydrant_wait on it. */ void hydrant_free(hydrant_t *handle); /* frees an error string from this library. */ void hydrant_free_string(char *s); #ifdef __cplusplus } #endif #endif