swaybar: terminate status_command process

Fix #346

Send SIGTERM to the `status_command` process before swaybar exits.
This commit is contained in:
Mikkel Oscar Lyderik 2015-12-18 03:02:35 +01:00
parent f994f00d00
commit 529ee83ef6

View file

@ -3,6 +3,7 @@
#include <string.h> #include <string.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <unistd.h>
#include <stropts.h> #include <stropts.h>
#include <json-c/json.h> #include <json-c/json.h>
#include <sys/un.h> #include <sys/un.h>
@ -47,6 +48,8 @@ struct workspace {
list_t *workspaces = NULL; list_t *workspaces = NULL;
int socketfd; int socketfd;
pid_t pid;
int pipefd[2];
FILE *command; FILE *command;
char *line, *output, *status_command; char *line, *output, *status_command;
struct registry *registry; struct registry *registry;
@ -90,6 +93,21 @@ void sway_terminate(void) {
if (registry) { if (registry) {
registry_teardown(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); exit(EXIT_FAILURE);
} }
@ -417,7 +435,24 @@ int main(int argc, char **argv) {
bar_ipc_init(desired_output, bar_id); bar_ipc_init(desired_output, bar_id);
if (status_command) { 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 = malloc(1024);
line[0] = '\0'; line[0] = '\0';
} }
@ -443,6 +478,11 @@ int main(int argc, char **argv) {
window_teardown(window); window_teardown(window);
registry_teardown(registry); registry_teardown(registry);
fclose(command);
// terminate status_command process
kill(pid, SIGTERM);
close(pipefd[0]);
free(line);
return 0; return 0;
} }