int posix_spawn(pid_t *pid, const char *path, const posix_spawn_file_actions_t *file_actions, const posix_spawnattr_t *attrp, char *const argv[], char *const envp[]) { short int flags; pid_t p; volatile int error; error = 0; flags = attrp ? attrp->posix_attr_flags : 0; if (file_actions == NULL && is_vfork_safe(flags)) p = vfork(); else #ifdef THERE_IS_NO_FORK return ENOSYS; #else p = fork(); #endif switch (p) { case -1: return errno; case 0: if (attrp) { error = posix_spawnattr_handle(attrp); if (error) _exit(127); } execve(path, argv, envp); error = errno; _exit(127); default: if (error != 0) waitpid(p, NULL, WNOHANG); else if (pid != NULL) *pid = p; return error; } }
int posix_spawn(pid_t *pid, const char * path, __unused void *arg, const posix_spawnattr_t *attrp, char *const argv[], char *const envp[]) { pid_t p; volatile int error; error = 0; #ifdef THERE_IS_NO_FORK /* Pray we can sanely modify signal foo */ p = vfork(); #else p = fork(); #endif switch (p) { case -1: return errno; case 0: if (attrp) { error = posix_spawnattr_handle(attrp); if (error) _exit(127); } execve(path, argv, envp); error = errno; _exit(127); default: if (error != 0) waitpid(p, NULL, WNOHANG); else if (pid != NULL) *pid = p; return error; } }