Exemple #1
0
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;
	}
}
Exemple #2
0
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;
	}
}