home: hub: mkinitfs

Download patch

ref: 4f649505cb188b4c6ce5bcc254cb55d36046e229
parent: a655555ac0f3da432e6503bccdaad812c94438c7
author: Timo Teräs <timo.teras@iki.fi>
date: Mon Nov 21 10:30:25 CST 2016

nlplug-findfs: improve logging about spawned commands

--- a/nlplug-findfs.c
+++ b/nlplug-findfs.c
@@ -188,6 +188,30 @@
 
 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 @@
 	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 @@
 	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);