sway

i3-compatible Wayland compositor
git clone https://git.awy.one/sway
Log | Files | Refs | README | LICENSE

commit 529ee83ef63d69f3cc045f2e9cc52c7ec2fe1334
parent f994f00d0059039d952d7dcfb72a683f303878bc
Author: Mikkel Oscar Lyderik <mikkeloscar@gmail.com>
Date:   Fri, 18 Dec 2015 03:02:35 +0100

swaybar: terminate status_command process

Fix #346

Send SIGTERM to the `status_command` process before swaybar exits.

Diffstat:
Mswaybar/main.c | 42+++++++++++++++++++++++++++++++++++++++++-
1 file changed, 41 insertions(+), 1 deletion(-)

diff --git 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; }