Blame src/internal/slibtool_spawn_impl.h

9fc046
/*******************************************************************/
9fc046
/*  slibtool: a skinny libtool implementation, written in C        */
05face
/*  Copyright (C) 2016--2021  Z. Gilboa                            */
9fc046
/*  Released under the Standard MIT License; see COPYING.SLIBTOOL. */
9fc046
/*******************************************************************/
9fc046
089c8b
#ifndef SLIBTOOL_SPAWN_IMPL_H
089c8b
#define SLIBTOOL_SPAWN_IMPL_H
089c8b
22fe25
#include <limits.h>
9fc046
#include <unistd.h>
86e387
#include <stdlib.h>
9fc046
#include <stdbool.h>
819200
#include <errno.h>
9fc046
#include <sys/wait.h>
9fc046
22fe25
#ifndef PATH_MAX
22fe25
#define PATH_MAX (_XOPEN_PATH_MAX < 4096) ? 4096 : _XOPEN_PATH_MAX
22fe25
#endif
22fe25
9fc046
#ifndef SLBT_USE_FORK
9fc046
#ifndef SLBT_USE_VFORK
9fc046
#ifndef SLBT_USE_POSIX_SPAWN
9fc046
#define SLBT_USE_POSIX_SPAWN
9fc046
#endif
9fc046
#endif
9fc046
#endif
9fc046
9fc046
#ifdef  SLBT_USE_POSIX_SPAWN
9fc046
#include <spawn.h>
9fc046
#endif
9fc046
9fc046
static inline int slbt_spawn(
9fc046
	struct slbt_exec_ctx *	ectx,
9fc046
	bool			fwait)
9fc046
{
9fc046
	pid_t	pid;
9fc046
9fc046
#ifdef SLBT_USE_POSIX_SPAWN
9fc046
9fc046
	if (posix_spawnp(
9fc046
			&pid,
9fc046
			ectx->program,
9fc046
			0,0,
9fc046
			ectx->argv,
e8bfe5
			ectx->envp))
9fc046
		pid = -1;
9fc046
9fc046
#else
9fc046
9fc046
#ifdef SLBT_USE_FORK
9fc046
	pid = fork();
9fc046
#else
9fc046
	pid = vfork();
9fc046
#endif
9fc046
9fc046
#endif
9fc046
86e387
	if (pid < 0) {
86e387
		ectx->pid      = pid;
86e387
		ectx->exitcode = errno;
9fc046
		return -1;
86e387
	}
9fc046
86e387
	if (pid == 0) {
86e387
		execvp(
9fc046
			ectx->program,
9fc046
			ectx->argv);
86e387
		_exit(errno);
86e387
	}
9fc046
819200
	errno     = 0;
9fc046
	ectx->pid = pid;
9fc046
9fc046
	if (fwait)
9fc046
		return waitpid(
9fc046
			pid,
9fc046
			&ectx->exitcode,
9fc046
			0);
9fc046
9fc046
	return 0;
9fc046
}
089c8b
089c8b
#endif