kore

An easy to use, scalable and secure web application framework for writing web APIs in C.
Commits | Files | Refs | README | LICENSE | git clone https://git.kore.io/kore.git

commit 95c8b8e12669e951a5c9902cbe13f41685bed018
parent 9fa9fd7402e345d3cd34b6753d80c3446f7b132a
Author: Joris Vink <joris@coders.se>
Date:   Mon,  2 Sep 2013 08:52:16 +0200

Add a callback that Kore can call in your module every given interval.
The callback is run from the parent process (which runs as root).

Adds kore_cb and kore_cb_interval configuration options.

Diffstat:
includes/kore.h | 3+++
modules/example/module.conf | 6++++++
src/config.c | 42++++++++++++++++++++++++++++++++++++++++++
src/kore.c | 14++++++++++++++
src/module.c | 14++++++++++++++
5 files changed, 79 insertions(+), 0 deletions(-)

diff --git a/includes/kore.h b/includes/kore.h @@ -229,6 +229,7 @@ extern char *runas_user; extern char *kore_module_onload; extern char *kore_pidfile; extern char *config_file; +extern char *kore_cb_name; extern char *kore_ssl_cipher_list; extern DH *ssl_dhparam; extern int ssl_no_compression; @@ -237,8 +238,10 @@ extern u_int8_t nlisteners; extern u_int64_t spdy_idle_time; extern u_int16_t cpu_count; extern u_int8_t worker_count; +extern u_int64_t kore_cb_interval; extern u_int32_t worker_max_connections; extern u_int32_t worker_active_connections; +extern void (*kore_cb)(void); extern struct listener_head listeners; extern struct kore_worker *worker; diff --git a/modules/example/module.conf b/modules/example/module.conf @@ -24,6 +24,12 @@ workers 4 # The onload function is called everytime the module is loaded or reloaded. #onload myinit +# You can define a callback Kore calls from its parent process everytime +# the kore_cb_interval timer (in milliseconds) is reached. +# NOTE: Remember that the parent process runs as root and is not chroot(). +#kore_cb my_callback +#kore_cb_interval 1000 + # Specifies what module to be loaded. load modules/example/example.module diff --git a/src/config.c b/src/config.c @@ -15,6 +15,7 @@ */ #include <ctype.h> +#include <limits.h> #include <fcntl.h> #include <pwd.h> @@ -37,6 +38,8 @@ static int configure_ssl_cipher(char **); static int configure_ssl_dhparam(char **); static int configure_ssl_no_compression(char **); static int configure_spdy_idle_time(char **); +static int configure_kore_cb(char **); +static int configure_kore_cb_interval(char **); static void domain_sslstart(void); static struct { @@ -61,6 +64,8 @@ static struct { { "accesslog", configure_accesslog }, { "certfile", configure_certfile }, { "certkey", configure_certkey }, + { "kore_cb", configure_kore_cb }, + { "kore_cb_interval", configure_kore_cb_interval }, { NULL, NULL }, }; @@ -434,6 +439,43 @@ configure_max_connections(char **argv) return (KORE_RESULT_OK); } +static int +configure_kore_cb(char **argv) +{ + if (argv[1] == NULL) + return (KORE_RESULT_ERROR); + + if (kore_cb_name != NULL) { + kore_debug("kore_cb was already set"); + return (KORE_RESULT_ERROR); + } + + kore_cb_name = kore_strdup(argv[1]); + return (KORE_RESULT_OK); +} + +static int +configure_kore_cb_interval(char **argv) +{ + int err; + + if (argv[1] == NULL) + return (KORE_RESULT_ERROR); + + if (kore_cb_interval != 0) { + kore_debug("kore_cb_interval already given"); + return (KORE_RESULT_ERROR); + } + + kore_cb_interval = kore_strtonum(argv[1], 10, 1, LLONG_MAX, &err); + if (err != KORE_RESULT_OK) { + kore_debug("invalid value for kore_cb_interval"); + return (KORE_RESULT_ERROR); + } + + return (KORE_RESULT_OK); +} + static void domain_sslstart(void) { diff --git a/src/kore.c b/src/kore.c @@ -29,9 +29,11 @@ struct passwd *pw = NULL; pid_t kore_pid = -1; u_int16_t cpu_count = 1; int kore_debug = 0; +void (*kore_cb)(void); u_int8_t worker_count = 0; char *runas_user = NULL; char *chroot_path = NULL; +u_int64_t kore_cb_interval = 0; char *kore_pidfile = KORE_PIDFILE_DEFAULT; char *kore_ssl_cipher_list = KORE_DEFAULT_CIPHER_LIST; @@ -220,6 +222,8 @@ kore_server_sslstart(void) static void kore_server_start(void) { + u_int64_t now, last_cb_run; + kore_mem_free(runas_user); if (daemon(1, 1) == -1) @@ -232,6 +236,9 @@ kore_server_start(void) kore_platform_proctitle("kore [parent]"); kore_worker_init(); + now = kore_time_ms(); + last_cb_run = now; + for (;;) { if (sig_recv != 0) { if (sig_recv == SIGHUP || sig_recv == SIGQUIT) { @@ -246,6 +253,13 @@ kore_server_start(void) if (!kore_accesslog_wait()) break; + + now = kore_time_ms(); + if ((now - last_cb_run) >= kore_cb_interval) { + last_cb_run = now; + kore_cb(); + } + kore_worker_wait(0); } } diff --git a/src/module.c b/src/module.c @@ -23,6 +23,8 @@ static void *mod_handle = NULL; static char *mod_name = NULL; static time_t mod_last_mtime = 0; + +char *kore_cb_name = NULL; char *kore_module_onload = NULL; void @@ -53,6 +55,12 @@ kore_module_load(char *module_name) fatal("onload '%s' not present", kore_module_onload); onload(); } + + if (kore_cb_name != NULL) { + kore_cb = dlsym(mod_handle, kore_cb_name); + if (kore_cb == NULL) + fatal("kore_cb '%s' not present", kore_cb_name); + } } void @@ -85,6 +93,12 @@ kore_module_reload(void) onload(); } + if (kore_cb_name != NULL) { + kore_cb = dlsym(mod_handle, kore_cb_name); + if (kore_cb == NULL) + fatal("kore_cb '%s' not present", kore_cb_name); + } + kore_log(LOG_NOTICE, "reloaded '%s' module", mod_name); }