aboutsummaryrefslogtreecommitdiff
path: root/swaybar
diff options
context:
space:
mode:
Diffstat (limited to 'swaybar')
-rw-r--r--swaybar/main.c42
1 files changed, 41 insertions, 1 deletions
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;
}