From 529ee83ef63d69f3cc045f2e9cc52c7ec2fe1334 Mon Sep 17 00:00:00 2001
From: Mikkel Oscar Lyderik <mikkeloscar@gmail.com>
Date: Fri, 18 Dec 2015 03:02:35 +0100
Subject: swaybar: terminate status_command process

Fix #346

Send SIGTERM to the `status_command` process before swaybar exits.
---
 swaybar/main.c | 42 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/swaybar/main.c b/swaybar/main.c
index 0a25d0f5..27eebcaa 100644
--- a/swaybar/main.c
+++ b/swaybar/main.c
@@ -3,6 +3,7 @@
 #include <string.h>
 #include <stdint.h>
 #include <stdbool.h>
+#include <unistd.h>
 #include <stropts.h>
 #include <json-c/json.h>
 #include <sys/un.h>
@@ -47,6 +48,8 @@ struct workspace {
 
 list_t *workspaces = NULL;
 int socketfd;
+pid_t pid;
+int pipefd[2];
 FILE *command;
 char *line, *output, *status_command;
 struct registry *registry;
@@ -90,6 +93,21 @@ void sway_terminate(void) {
 	if (registry) {
 		registry_teardown(registry);
 	}
+
+	if (command) {
+		fclose(command);
+	}
+
+	if (pid) {
+		// terminate status_command process
+		kill(pid, SIGTERM);
+	}
+
+	if (pipefd[0]) {
+		close(pipefd[0]);
+	}
+
+	free(line);
 	exit(EXIT_FAILURE);
 }
 
@@ -417,7 +435,24 @@ int main(int argc, char **argv) {
 	bar_ipc_init(desired_output, bar_id);
 
 	if (status_command) {
-		command = popen(status_command, "r");
+		pipe(pipefd);
+		pid = fork();
+		if (pid == 0) {
+			close(pipefd[0]);
+			dup2(pipefd[1], STDOUT_FILENO);
+			close(pipefd[1]);
+			char *const cmd[] = {
+				"sh",
+				"-c",
+				status_command,
+				NULL,
+			};
+			execvp(cmd[0], cmd);
+			return 0;
+		}
+
+		close(pipefd[1]);
+		command = fdopen(pipefd[0], "r");
 		line = malloc(1024);
 		line[0] = '\0';
 	}
@@ -443,6 +478,11 @@ int main(int argc, char **argv) {
 
 	window_teardown(window);
 	registry_teardown(registry);
+	fclose(command);
+	// terminate status_command process
+	kill(pid, SIGTERM);
+	close(pipefd[0]);
+	free(line);
 
 	return 0;
 }
-- 
cgit v1.2.3