Change kore_parent_configure() for single binaries.

This function now takes any remaining arguments passed on the command line
after kore parsed its own.

For C the new prototype looks like this:

void kore_parent_configure(int argc, char **argv);

For python code, kore will pass each argument to the function so you
can do things like:

def kore_parent_configure(arg1, arg2):
This commit is contained in:
Joris Vink 2018-04-09 12:51:20 +02:00
parent cb4567683a
commit 9c337ded1e
5 changed files with 77 additions and 22 deletions

View File

@ -228,6 +228,7 @@ struct kore_runtime {
void (*execute)(void *);
int (*onload)(void *, int);
void (*connect)(void *, struct connection *);
void (*configure)(void *, int, char **);
};
struct kore_runtime_call {
@ -557,6 +558,7 @@ void kore_log_init(void);
void *kore_malloc(size_t);
void kore_parse_config(void);
void kore_parse_config_file(FILE *);
void *kore_calloc(size_t, size_t);
void *kore_realloc(void *, size_t);
void kore_free(void *);
@ -633,6 +635,7 @@ struct kore_runtime_call *kore_runtime_getcall(const char *);
void kore_runtime_execute(struct kore_runtime_call *);
int kore_runtime_onload(struct kore_runtime_call *, int);
void kore_runtime_configure(struct kore_runtime_call *, int, char **);
void kore_runtime_connect(struct kore_runtime_call *, struct connection *);
#if !defined(KORE_NO_HTTP)
int kore_runtime_http_request(struct kore_runtime_call *,
@ -706,8 +709,8 @@ void kore_buf_replace_string(struct kore_buf *, char *, void *, size_t);
void kore_keymgr_run(void);
void kore_keymgr_cleanup(void);
void kore_parent_configure(void);
void kore_worker_configure(void);
void kore_parent_configure(int, char **);
#if defined(__cplusplus)
}

View File

@ -113,7 +113,6 @@ static int configure_python_import(char *);
#endif
static void domain_tls_init(void);
static void kore_parse_config_file(const char *);
static struct {
const char *name;
@ -195,12 +194,17 @@ static struct kore_domain *current_domain = NULL;
void
kore_parse_config(void)
{
FILE *fp;
#if !defined(KORE_SINGLE_BINARY)
kore_parse_config_file(config_file);
if ((fp = fopen(config_file, "r")) == NULL)
fatal("configuration given cannot be opened: %s", config_file);
#else
kore_parse_config_file(NULL);
fp = config_file_write();
#endif
kore_parse_config_file(fp);
if (!kore_module_loaded())
fatal("no application module was loaded");
@ -221,23 +225,12 @@ kore_parse_config(void)
}
}
static void
kore_parse_config_file(const char *fpath)
void
kore_parse_config_file(FILE *fp)
{
FILE *fp;
int i, lineno;
char buf[BUFSIZ], *p, *t;
#if !defined(KORE_SINGLE_BINARY)
if ((fp = fopen(fpath, "r")) == NULL)
fatal("configuration given cannot be opened: %s", fpath);
#else
(void)fpath;
fp = config_file_write();
#endif
kore_debug("parsing configuration file '%s'", fpath);
lineno = 1;
while ((p = kore_read_line(fp, buf, sizeof(buf))) != NULL) {
if (strlen(p) == 0) {
@ -309,7 +302,12 @@ kore_parse_config_file(const char *fpath)
static int
configure_include(char *path)
{
kore_parse_config_file(path);
FILE *fp;
if ((fp = fopen(path, "r")) == NULL)
fatal("failed to open include '%s'", path);
kore_parse_config_file(fp);
return (KORE_RESULT_OK);
}

View File

@ -169,8 +169,10 @@ main(int argc, char *argv[])
kore_mem_init();
#if !defined(KORE_SINGLE_BINARY)
if (argc > 0)
fatal("did you mean to run `kodev´ instead?");
#endif
kore_pid = getpid();
nlisteners = 0;
@ -191,16 +193,18 @@ main(int argc, char *argv[])
#if !defined(KORE_SINGLE_BINARY)
if (config_file == NULL)
usage();
kore_parse_config();
#else
kore_module_load(NULL, NULL, KORE_MODULE_NATIVE);
kore_parse_config();
rcall = kore_runtime_getcall("kore_parent_configure");
if (rcall != NULL) {
kore_runtime_execute(rcall);
kore_runtime_configure(rcall, argc, argv);
kore_free(rcall);
}
#endif
kore_parse_config();
kore_platform_init();
#if !defined(KORE_NO_HTTP)

View File

@ -55,6 +55,7 @@ static void python_runtime_wsmessage(void *, struct connection *,
u_int8_t, const void *, size_t);
static void python_runtime_execute(void *);
static int python_runtime_onload(void *, int);
static void python_runtime_configure(void *, int, char **);
static void python_runtime_connect(void *, struct connection *);
static void python_module_load(struct kore_module *);
@ -83,7 +84,8 @@ struct kore_runtime kore_python_runtime = {
.wsdisconnect = python_runtime_connect,
.onload = python_runtime_onload,
.connect = python_runtime_connect,
.execute = python_runtime_execute
.execute = python_runtime_execute,
.configure = python_runtime_configure
};
static struct {
@ -440,6 +442,37 @@ python_runtime_execute(void *addr)
Py_DECREF(pyret);
}
static void
python_runtime_configure(void *addr, int argc, char **argv)
{
int i;
PyObject *callable, *args, *pyret, *pyarg;
callable = (PyObject *)addr;
if ((args = PyTuple_New(argc)) == NULL)
fatal("python_runtime_configure: PyTuple_New failed");
for (i = 0; i < argc; i++) {
if ((pyarg = PyUnicode_FromString(argv[i])) == NULL)
fatal("python_runtime_configure: PyUnicode_FromString");
if (PyTuple_SetItem(args, i, pyarg) != 0)
fatal("python_runtime_configure: PyTuple_SetItem");
}
PyErr_Clear();
pyret = PyObject_Call(callable, args, NULL);
Py_DECREF(args);
if (pyret == NULL) {
python_log_error("python_runtime_configure");
fatal("failed to call configure method: wrong args?");
}
Py_DECREF(pyret);
}
static int
python_runtime_onload(void *addr, int action)
{

View File

@ -29,6 +29,7 @@
static void native_runtime_execute(void *);
static int native_runtime_onload(void *, int);
static void native_runtime_connect(void *, struct connection *);
static void native_runtime_configure(void *, int, char **);
#if !defined(KORE_NO_HTTP)
static int native_runtime_http_request(void *, struct http_request *);
static int native_runtime_validator(void *, struct http_request *,
@ -49,7 +50,8 @@ struct kore_runtime kore_native_runtime = {
#endif
.onload = native_runtime_onload,
.connect = native_runtime_connect,
.execute = native_runtime_execute
.execute = native_runtime_execute,
.configure = native_runtime_configure
};
struct kore_runtime_call *
@ -76,6 +78,12 @@ kore_runtime_execute(struct kore_runtime_call *rcall)
rcall->runtime->execute(rcall->addr);
}
void
kore_runtime_configure(struct kore_runtime_call *rcall, int argc, char **argv)
{
rcall->runtime->configure(rcall->addr, argc, argv);
}
int
kore_runtime_onload(struct kore_runtime_call *rcall, int action)
{
@ -132,6 +140,15 @@ native_runtime_execute(void *addr)
cb();
}
static void
native_runtime_configure(void *addr, int argc, char **argv)
{
void (*cb)(int, char **);
*(void **)&(cb) = addr;
cb(argc, argv);
}
static void
native_runtime_connect(void *addr, struct connection *c)
{