diff --git a/includes/kore.h b/includes/kore.h index 28d2e95..a77304f 100644 --- 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 index f909957..457c0b7 100644 --- 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 index 81d6498..4e9b5f6 100644 --- a/src/config.c +++ b/src/config.c @@ -15,6 +15,7 @@ */ #include +#include #include #include @@ -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 index 91f8fb9..7d465ca 100644 --- 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 index 0550aac..6f80866 100644 --- 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); }