forked from mirrors/kore
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:
parent
cb4567683a
commit
9c337ded1e
|
@ -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)
|
||||
}
|
||||
|
|
32
src/config.c
32
src/config.c
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
35
src/python.c
35
src/python.c
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue