/***********************************************************/ /* ntux: native translation und extension */ /* Copyright (C) 2016--2021 SysDeer Technologies, LLC */ /* Released under GPLv2 and GPLv3; see COPYING.NTUX. */ /***********************************************************/ #include #include #include #include "ntux_driver_impl.h" #include "ntux_nolibc_impl.h" #include "ntux_errinfo_impl.h" int ntux_cmd_spawn(const struct ntux_driver_ctx * dctx) { int32_t status; pid_t pid; const char ** argv; const char ** envp; unsigned char * program; /* init */ ntux_driver_set_ectx( dctx,0, dctx->cctx->sargv[0]); argv = (const char **)dctx->cctx->sargv; envp = (const char **)dctx->cctx->senvp; program = (unsigned char *)dctx->cctx->sargv[0]; /* spawn */ pid = __sys_vfork(); /* failed? */ if (pid < 0) if (ntux_errno_set(dctx,pid)) return NTUX_SYSTEM_ERROR(dctx); /* child */ if (pid == 0) if ((status = __sys_execve(program,argv,envp))) if (ntux_errno_set(dctx,status)) if (NTUX_SYSTEM_ERROR(dctx)) __sys_exit(0); /* parent */ struct ntux_driver_ctx_impl * ictx = ntux_get_driver_ictx(dctx); __sys_wait4( pid, &ictx->cctx.status, 0,0); return 0; }