diff --git a/include/villas/nodes/shmem.h b/include/villas/nodes/shmem.h index 5648b706f..e4c5dbfe9 100644 --- a/include/villas/nodes/shmem.h +++ b/include/villas/nodes/shmem.h @@ -26,7 +26,7 @@ struct shmem { int insize, outsize; /**< Size of ingoing and outgoing queue, respectively. */ int cond_out; /**< Whether to use a pthread_cond_t to signal if new samples are written to outqueue. */ int cond_in; /**< Whether to use a pthread_cond_t to signal if new samples are written to inqueue. */ - const char * const exec; /**< External program to execute on start. */ + char **exec; /**< External program to execute on start. */ struct memtype *manager; /**< Manager for the shared memory region. */ int fd; /**< Handle as returned by shm_open().*/ diff --git a/include/villas/utils.h b/include/villas/utils.h index 72a5efbd6..b9a6cd9bc 100644 --- a/include/villas/utils.h +++ b/include/villas/utils.h @@ -230,4 +230,4 @@ void rdtsc_sleep(uint64_t nanosecs, uint64_t start); /** Register a exit callback for program termination (SIGINT / SIGKILL). */ void signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)); -pid_t spawn(const char* name, char **argv); +pid_t spawn(const char* name, char *const argv[]); diff --git a/lib/nodes/shmem.c b/lib/nodes/shmem.c index b78cebd68..c7b8b71c8 100644 --- a/lib/nodes/shmem.c +++ b/lib/nodes/shmem.c @@ -46,9 +46,11 @@ int shmem_parse(struct node *n, config_setting_t *cfg) int i; for (i = 0; i < config_setting_length(exec_cfg); i++) { - shm->exec[i] = config_setting_get_string_elem(exec_cfg, i); - if (!shm->exec[i]) + const char *elm = config_setting_get_string_elem(exec_cfg, i); + if (!elm) cerror(exec_cfg, "Invalid format for exec"); + + shm->exec[i] = strdup(elm); } shm->exec[i] = NULL; diff --git a/lib/utils.c b/lib/utils.c index 2a9025990..a45c32558 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -302,15 +302,15 @@ void signals_init(void (*cb)(int signal, siginfo_t *sinfo, void *ctx)) sigaction(SIGCHLD, &sa_chld, NULL); } -pid_t -spawn(const char* name, char **argv) { - pid_t pid = fork(); - switch(pid) { - case -1: - return -1; - case 0: - return execvp(name, argv); - default: - return pid; +pid_t spawn(const char* name, char *const argv[]) +{ + pid_t pid; + + pid = fork(); + switch (pid) { + case -1: return -1; + case 0: return execvp(name, (char * const*) argv); } + + return pid; }