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 #include #include +#include #include #include #include @@ -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; }