Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / basis / Posix / Process / exece.c
CommitLineData
7f918cf1
CE
1#include "platform.h"
2
3C_Errno_t(C_Int_t) Posix_Process_exece (NullString8_t pNStr,
4 Array(NullString8_t) aStr,
5 Array(NullString8_t) eStr) {
6 const char *path;
7 char **args;
8 char **env;
9 uintmax_t aLen;
10 uintmax_t eLen;
11 char *aSaved;
12 char *eSaved;
13 int res;
14
15 path = (const char *) pNStr;
16 args = (char **) aStr;
17 aLen = GC_getArrayLength((pointer)aStr);
18 aSaved = args[aLen - 1];
19 args[aLen - 1] = NULL;
20 env = (char **) eStr;
21 eLen = GC_getArrayLength((pointer)eStr);
22 eSaved = env[eLen - 1];
23 env[eLen - 1] = NULL;
24 res = EXECVE (path,
25 (char * const *)args,
26 (char * const *)env);
27 /* exece failed */
28 args[aLen - 1] = aSaved;
29 env[eLen - 1] = eSaved;
30 return (C_Errno_t(C_Int_t))res;
31}