1*e3723e1fSApple OSS Distributions #include <unistd.h> 2*e3723e1fSApple OSS Distributions #include <spawn.h> 3*e3723e1fSApple OSS Distributions #include <sys/wait.h> 4*e3723e1fSApple OSS Distributions 5*e3723e1fSApple OSS Distributions #define SUBSYSTEM_ROOT_PATH_KEY "subsystem_root_path" 6*e3723e1fSApple OSS Distributions 7*e3723e1fSApple OSS Distributions #define HELPER_BEHAVIOR_NOT_SET "not_set" 8*e3723e1fSApple OSS Distributions #define HELPER_BEHAVIOR_SET "set" 9*e3723e1fSApple OSS Distributions #define HELPER_BEHAVIOR_FORK_EXEC "fork_exec" 10*e3723e1fSApple OSS Distributions #define HELPER_BEHAVIOR_SPAWN "spawn" 11*e3723e1fSApple OSS Distributions 12*e3723e1fSApple OSS Distributions static int _spawn_and_wait(char ** args,posix_spawnattr_t * attr)13*e3723e1fSApple OSS Distributions_spawn_and_wait(char ** args, posix_spawnattr_t *attr) 14*e3723e1fSApple OSS Distributions { 15*e3723e1fSApple OSS Distributions int pid; 16*e3723e1fSApple OSS Distributions int status; 17*e3723e1fSApple OSS Distributions 18*e3723e1fSApple OSS Distributions if (posix_spawn(&pid, args[0], NULL, attr, args, NULL)) { 19*e3723e1fSApple OSS Distributions return -1; 20*e3723e1fSApple OSS Distributions } 21*e3723e1fSApple OSS Distributions if (waitpid(pid, &status, 0) < 0) { 22*e3723e1fSApple OSS Distributions return -1; 23*e3723e1fSApple OSS Distributions } 24*e3723e1fSApple OSS Distributions 25*e3723e1fSApple OSS Distributions if (WIFEXITED(status) && (WEXITSTATUS(status) == 0)) { 26*e3723e1fSApple OSS Distributions return 0; 27*e3723e1fSApple OSS Distributions } 28*e3723e1fSApple OSS Distributions 29*e3723e1fSApple OSS Distributions return -1; 30*e3723e1fSApple OSS Distributions } 31