Merge pull request #1178 from 4e554c4c/fork

Prevent sway from duplicating on a failed fork
This commit is contained in:
Drew DeVault 2017-04-18 17:49:23 -04:00 committed by GitHub
commit 35603b2341

View file

@ -912,8 +912,16 @@ void merge_output_config(struct output_config *dst, struct output_config *src) {
} }
static void invoke_swaybar(struct bar_config *bar) { static void invoke_swaybar(struct bar_config *bar) {
// Pipe to communicate errors
int filedes[2];
if (pipe(filedes) == -1) {
sway_log(L_ERROR, "Pipe setup failed! Cannot fork into bar");
return;
}
bar->pid = fork(); bar->pid = fork();
if (bar->pid == 0) { if (bar->pid == 0) {
close(filedes[0]);
if (!bar->swaybar_command) { if (!bar->swaybar_command) {
char *const cmd[] = { char *const cmd[] = {
"swaybar", "swaybar",
@ -922,14 +930,20 @@ static void invoke_swaybar(struct bar_config *bar) {
NULL, NULL,
}; };
close(filedes[1]);
execvp(cmd[0], cmd); execvp(cmd[0], cmd);
_exit(EXIT_SUCCESS);
} else { } else {
// run custom swaybar // run custom swaybar
int len = strlen(bar->swaybar_command) + strlen(bar->id) + 5; int len = strlen(bar->swaybar_command) + strlen(bar->id) + 5;
char *command = malloc(len * sizeof(char)); char *command = malloc(len * sizeof(char));
if (!command) { if (!command) {
sway_log(L_ERROR, "Unable to allocate swaybar command string"); const char msg[] = "Unable to allocate swaybar command string";
return; int len = sizeof(msg);
write(filedes[1], &len, sizeof(int));
write(filedes[1], msg, len);
close(filedes[1]);
_exit(EXIT_FAILURE);
} }
snprintf(command, len, "%s -b %s", bar->swaybar_command, bar->id); snprintf(command, len, "%s -b %s", bar->swaybar_command, bar->id);
@ -940,10 +954,26 @@ static void invoke_swaybar(struct bar_config *bar) {
NULL, NULL,
}; };
close(filedes[1]);
execvp(cmd[0], cmd); execvp(cmd[0], cmd);
free(command); free(command);
_exit(EXIT_SUCCESS);
} }
} }
close(filedes[0]);
int len;
if(read(filedes[1], &len, sizeof(int)) == sizeof(int)) {
char *buf = malloc(len);
if(!buf) {
sway_log(L_ERROR, "Cannot allocate error string");
return;
}
if(read(filedes[1], buf, len)) {
sway_log(L_ERROR, "%s", buf);
}
free(buf);
}
close(filedes[1]);
} }
static void terminate_swaybar(pid_t pid) { static void terminate_swaybar(pid_t pid) {