Import Upstream version 20180207
[hcoop/debian/mlton.git] / runtime / basis / MLton / Process / spawne.c
CommitLineData
7f918cf1
CE
1#include "platform.h"
2
3#if HAS_SPAWN
4
5C_Errno_t(C_PId_t) MLton_Process_spawne (NullString8_t pNStr,
6 Array(NullString8_t) aStr,
7 Array(NullString8_t) eStr) {
8 const char *path;
9 char **args;
10 char **env;
11 int aLen;
12 int eLen;
13 char *aSaved;
14 char *eSaved;
15 C_PId_t res;
16
17 path = (const char *) pNStr;
18 args = (char **) aStr;
19 aLen = GC_getArrayLength((pointer)aStr);
20 aSaved = args[aLen - 1];
21 args[aLen - 1] = NULL;
22 env = (char **) eStr;
23 eLen = GC_getArrayLength((pointer)eStr);
24 eSaved = env[eLen - 1];
25 env[eLen - 1] = NULL;
26 res = spawnve (SPAWN_MODE, path,
27 (const char * const *)args,
28 (const char * const *)env);
29 /* spawnve failed */
30 args[aLen - 1] = aSaved;
31 env[eLen - 1] = eSaved;
32 return (C_Errno_t(C_PId_t))res;
33}
34
35#else
36
37__attribute__ ((noreturn))
38C_Errno_t(C_PId_t) MLton_Process_spawne (__attribute__ ((unused))NullString8_t pNStr,
39 __attribute__ ((unused))Array(NullString8_t) aStr,
40 __attribute__ ((unused))Array(NullString8_t) ePtr) {
41 die ("MLton_Process_spawne not implemented");
42}
43
44#endif