kore

a fork of the worlds most advanced web framework
Log | Files | Refs | README | LICENSE

commit 3dbb80463a335b1844b74020c426b67459ba5f25
parent 66305e551a1421caa86b8044c6c90ccb88ecffe5
Author: Joris Vink <joris@coders.se>
Date:   Fri, 22 Feb 2019 16:56:34 +0100

allow double quotes in kore.proc argument lists.

Diffstat:
Msrc/python.c | 55++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 52 insertions(+), 3 deletions(-)

diff --git a/src/python.c b/src/python.c @@ -20,6 +20,7 @@ #include <sys/socket.h> #include <sys/wait.h> +#include <ctype.h> #include <libgen.h> #include <signal.h> @@ -37,6 +38,7 @@ static PyMODINIT_FUNC python_module_init(void); static PyObject *python_import(const char *); static PyObject *pyconnection_alloc(struct connection *); static PyObject *python_callable(PyObject *, const char *); +static void python_split_arguments(char *, char **, size_t); static int pyhttp_response_sent(struct netbuf *); static PyObject *pyhttp_file_alloc(struct http_file *); @@ -414,6 +416,53 @@ python_module_free(struct kore_module *module) } static void +python_split_arguments(char *args, char **argv, size_t elm) +{ + size_t idx; + char *p, *line, *end; + + if (elm <= 1) + fatal("not enough elements (%zu)", elm); + + idx = 0; + line = args; + + for (p = line; *p != '\0'; p++) { + if (idx >= elm - 1) + break; + + if (*p == ' ') { + *p = '\0'; + if (*line != '\0') + argv[idx++] = line; + line = p + 1; + continue; + } + + if (*p != '"') + continue; + + line = p + 1; + if ((end = strchr(line, '"')) == NULL) + break; + + *end = '\0'; + argv[idx++] = line; + line = end + 1; + + while (isspace(*(unsigned char *)line)) + line++; + + p = line; + } + + if (idx < elm - 1 && *line != '\0') + argv[idx++] = line; + + argv[idx] = NULL; +} + +static void python_module_reload(struct kore_module *module) { PyObject *handle; @@ -1221,7 +1270,7 @@ python_kore_proc(PyObject *self, PyObject *args) { const char *cmd; struct pyproc *proc; - char *copy, *argv[30]; + char *copy, *argv[32]; int timeo, in_pipe[2], out_pipe[2]; timeo = -1; @@ -1290,9 +1339,9 @@ python_kore_proc(PyObject *self, PyObject *args) fatal("dup2: %s", errno_s); copy = kore_strdup(cmd); - kore_split_string(copy, " ", argv, 30); + python_split_arguments(copy, argv, 32); (void)execve(argv[0], argv, NULL); - printf("kore.proc failed to execute %s (%s)\n", + kore_log(LOG_ERR, "kore.proc failed to execute %s (%s)", argv[0], errno_s); exit(1); }