swaybar: Correct handling of SIGTERM.

Swaybar did not correctly handle the SIGTERM sent from sway when
exiting, ultimately leaving the child status_command behind.
This should correctly handle the SIGTERM signal and terminate the
status_command.

Fix #386
This commit is contained in:
Mikkel Oscar Lyderik 2015-12-21 11:46:15 +01:00
parent fc71c6303c
commit 5c8a3afff9

View File

@ -5,6 +5,7 @@
#include <stdbool.h>
#include <unistd.h>
#include <sys/select.h>
#include <sys/wait.h>
#include <errno.h>
#include <json-c/json.h>
#include <sys/un.h>
@ -87,7 +88,7 @@ struct colors colors = {
},
};
void sway_terminate(void) {
void swaybar_teardown() {
window_teardown(window);
if (registry) {
registry_teardown(registry);
@ -99,16 +100,31 @@ void sway_terminate(void) {
if (pid) {
// terminate status_command process
kill(pid, SIGTERM);
int ret = kill(pid, SIGTERM);
if (ret != 0) {
sway_log(L_ERROR, "Unable to terminate status_command [pid: %d]", pid);
} else {
int status;
waitpid(pid, &status, 0);
}
}
if (pipefd[0]) {
close(pipefd[0]);
}
}
void sway_terminate(void) {
swaybar_teardown();
exit(EXIT_FAILURE);
}
void sig_handler(int signal) {
swaybar_teardown();
exit(0);
}
void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
cairo_set_source_rgba(cairo,
((color & 0xFF000000) >> 24) / 256.0,
@ -525,14 +541,12 @@ int main(int argc, char **argv) {
line[0] = '\0';
}
signal(SIGTERM, sig_handler);
poll_for_update();
window_teardown(window);
registry_teardown(registry);
fclose(command);
// terminate status_command process
kill(pid, SIGTERM);
close(pipefd[0]);
// gracefully shutdown swaybar and status_command
swaybar_teardown();
return 0;
}