1
0
mirror of https://github.com/emersion/kanshi synced 2024-09-18 09:51:36 +02:00

Clean up exec_command.

Rename pid_t variables "pid", "child" to "child" and "grandchild", since
we were using "child" in comments to refer to the PID stored in "pid".

Use _exit(2) whenever exiting from a forked child; calling exit(3)
should't be done in such a context.

Add missing new lines to error messages. Arguably using stdio in this
context isn't safe either, but we aren't a threaded program and stderr
is always flushed when this function is called, so it won't ouput
previous buffer contents or deadlock.

Fix one _exit(2) call to return 1 as status code, since it should be
indicating a failure.

Add error message in case waitpid(2) fails.
This commit is contained in:
Érico Nogueira 2021-06-29 21:06:11 -03:00 committed by Simon Ser
parent b6613c2eac
commit dd3f91fbd3

26
main.c
View File

@ -78,34 +78,36 @@ static struct kanshi_profile *match(struct kanshi_state *state,
static void exec_command(char *cmd) {
pid_t pid, child;
pid_t child, grandchild;
// Fork process
if ((pid = fork()) == 0) {
// Fork child process again
if ((child = fork()) == 0) {
// Fork child process again so we can unparent the process
setsid();
sigset_t set;
sigemptyset(&set);
sigprocmask(SIG_SETMASK, &set, NULL);
if ((child = fork()) == 0) {
if ((grandchild = fork()) == 0) {
execl("/bin/sh", "/bin/sh", "-c", cmd, (void *)NULL);
fprintf(stderr, "Executing command '%s' failed: %s", cmd, strerror(errno));
exit(-1);
fprintf(stderr, "Executing command '%s' failed: %s\n", cmd, strerror(errno));
_exit(-1);
}
if (child < 0) {
if (grandchild < 0) {
fprintf(stderr, "Impossible to fork a new process to execute"
" command '%s': %s", cmd, strerror(errno));
exit(0);
" command '%s': %s\n", cmd, strerror(errno));
_exit(1);
}
exit(0); // Close child process
_exit(0); // Close child process
}
if (pid < 0) {
if (child < 0) {
perror("Impossible to fork a new process");
return;
}
// cleanup child process
waitpid(pid, NULL, 0);
if (waitpid(child, NULL, 0) < 0) {
perror("Impossible to clean up child process");
}
}
static void execute_profile_commands(struct kanshi_profile *profile) {