#include "process.h" #include "err.h" #include "log.h" #include #include #include #include int spawn(char **argv) { pid_t pid; int status; if (!argv[0] || *argv[0] == '\0') { return SF_ERR_INVALID_ARG; } if ((pid = fork()) < 0) { log_write(LOG_ERR, "fork error: %s", strerror(errno)); return -errno; } if (pid == 0) { execvp(argv[0], argv); _exit(errno == ENONET ? 127 : 126); } if (waitpid(pid, &status, 0) < 0) { return -errno; } if (WIFEXITED(status)) { int exit_code = WEXITSTATUS(status); if (exit_code != 0) { log_write(LOG_ERR, "Command failed with code %d", exit_code); return SF_ERR_EXEC_FAILED; } } else if (WIFSIGNALED(status)) { return SF_ERR_SIGNALED; } return SF_OK; }