mirror of
https://github.com/swaywm/sway.git
synced 2024-11-11 04:54:14 +01:00
Merge pull request #1178 from 4e554c4c/fork
Prevent sway from duplicating on a failed fork
This commit is contained in:
commit
35603b2341
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user