/*
  Extension that safely execs a new process
*/

#include "escheme.h"
#include <unistd.h>
#include <sys/time.h>
#include <errno.h>
#include <string.h>

static Scheme_Object *safe_exec(int argc, Scheme_Object **argv)
{
	mz_jmp_buf not_yet;
	char** sarg = NULL;
	int i = 0;
	struct itimerval disable = {
		{0, 0},
		{0, 0}};
	int result;

	sarg = alloca(sizeof(char*)*(argc+1));

	for(;i<argc;++i) {
		if (SCHEME_BYTE_STRINGP(argv[i])) {
			sarg[i] = SCHEME_BYTE_STR_VAL(argv[i]);
		} else {

			scheme_wrong_type(
				"safe_exec",
				"bytes (bytestring)",
				i,
				argc,
				argv);
		}
	}

	sarg[argc] = NULL;


	setitimer(ITIMER_PROF,&disable,NULL);
	result = execv(sarg[0],sarg+1);

	return scheme_void;
}

Scheme_Object *scheme_reload(Scheme_Env *env)
{
  Scheme_Object *proc;

  proc = scheme_make_prim_w_arity(safe_exec, "safe_exec", 2, -1);

  return proc;
}

Scheme_Object *scheme_initialize(Scheme_Env *env)
{
  return scheme_reload(env);
}

Scheme_Object *scheme_module_name()
{
  return scheme_false;
}
