From 4f649505cb188b4c6ce5bcc254cb55d36046e229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= Date: Mon, 21 Nov 2016 16:30:25 +0200 Subject: nlplug-findfs: improve logging about spawned commands --- nlplug-findfs.c | 52 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/nlplug-findfs.c b/nlplug-findfs.c index d38f34b..4b41ea2 100644 --- a/nlplug-findfs.c +++ b/nlplug-findfs.c @@ -188,6 +188,30 @@ struct spawn_manager { static struct spawn_manager spawnmgr; +static void dbgT(struct spawn_task *task, const char *fmt, ...) +{ +#if defined(DEBUG) + va_list fmtargs; + int i; + + if (!dodebug) + return; + + fprintf(stderr, "%s: [%d] ", argv0, task->pid); + va_start(fmtargs, fmt); + vfprintf(stderr, fmt, fmtargs); + va_end(fmtargs); + for (i = 0; task->argv[i]; i++) + fprintf(stderr, " %s", task->argv[i]); + if (task->envp) { + fprintf(stderr, ":"); + for (i = 1; task->envp[i]; i++) + fprintf(stderr, " %s", task->envp[i]); + } + fprintf(stderr, "\n"); +#endif +} + static void spawn_init(struct spawn_manager *mgr) { int i; @@ -200,23 +224,31 @@ static void spawn_init(struct spawn_manager *mgr) dbg("max_running=%d", mgr->max_running); } +static void spawn_task_done(struct spawn_task *task, int status) +{ + if (task->done) task->done(task->ctx, status); + list_del(&task->node); + free(task->argv); + free(task->envp); + free(task); +} + static void spawn_execute(struct spawn_manager *mgr, struct spawn_task *task) { pid_t pid; if (!(pid = fork())) { - if (execve(task->argv[0], task->argv, task->envp ? task->envp : default_envp) < 0) - err(1, task->argv[0]); - exit(0); + execve(task->argv[0], task->argv, task->envp ? task->envp : default_envp); + err(127, task->argv[0]); } if (pid < 0) - err(1,"fork"); + err(1, "fork"); task->pid = pid; list_add_tail(&task->node, &mgr->running[pid % SPAWNMGR_PID_HASH_SIZE]); mgr->num_running++; - dbg("[%d,%d] spawned %s", pid, mgr->num_running, task->argv[0]); + dbgT(task, "spawned (%d running):", mgr->num_running); } static void spawn_command_cb(struct spawn_manager *mgr, char **argv, char **envp, void (*done)(void *, int), void *ctx) @@ -256,15 +288,9 @@ static void spawn_reap(struct spawn_manager *mgr, pid_t pid, int status) return; found: - if (task->done) task->done(task->ctx, status); - mgr->num_running--; - list_del(&task->node); - free(task->argv); - free(task->envp); - free(task); - - dbg("[%d,%d] reaped", pid, mgr->num_running); + dbgT(task, "reaped (%d running):", mgr->num_running); + spawn_task_done(task, status); if (!list_empty(&mgr->queue) && mgr->num_running < mgr->max_running) { struct spawn_task *task = list_next(&mgr->queue, struct spawn_task, node); -- cgit v1.2.3