… | |
… | |
67 | cv_undef (get_cv ("Proc::FastSpawn::_quote", 0)); |
67 | cv_undef (get_cv ("Proc::FastSpawn::_quote", 0)); |
68 | #endif |
68 | #endif |
69 | |
69 | |
70 | long |
70 | long |
71 | spawn (const char *path, SV *argv, SV *envp = &PL_sv_undef) |
71 | spawn (const char *path, SV *argv, SV *envp = &PL_sv_undef) |
|
|
72 | ALIAS: |
|
|
73 | spawnp = 1 |
72 | INIT: |
74 | INIT: |
73 | { |
75 | { |
74 | #ifdef WIN32 |
76 | #ifdef WIN32 |
75 | if (w32_num_children >= MAXIMUM_WAIT_OBJECTS) |
77 | if (w32_num_children >= MAXIMUM_WAIT_OBJECTS) |
76 | { |
78 | { |
… | |
… | |
93 | char *const *cenvp = SvOK (envp) ? array_to_cvec (envp) : environ; |
95 | char *const *cenvp = SvOK (envp) ? array_to_cvec (envp) : environ; |
94 | intptr_t pid; |
96 | intptr_t pid; |
95 | |
97 | |
96 | fflush (0); |
98 | fflush (0); |
97 | #ifdef WIN32 |
99 | #ifdef WIN32 |
98 | pid = _spawnve (_P_NOWAIT, path, cargv, cenvp); |
100 | pid = (ix ? _spawnvpe : _spawnve) (_P_NOWAIT, path, cargv, cenvp); |
99 | |
101 | |
100 | if (pid == -1) |
102 | if (pid == -1) |
101 | XSRETURN_UNDEF; |
103 | XSRETURN_UNDEF; |
102 | |
104 | |
103 | /* do it like perl, dadadoop dadadoop */ |
105 | /* do it like perl, dadadoop dadadoop */ |
… | |
… | |
107 | ++w32_num_children; |
109 | ++w32_num_children; |
108 | #elif USE_SPAWN |
110 | #elif USE_SPAWN |
109 | { |
111 | { |
110 | pid_t xpid; |
112 | pid_t xpid; |
111 | |
113 | |
112 | errno = posix_spawn (&xpid, path, 0, 0, cargv, cenvp); |
114 | errno = (ix ? posix_spawnp : posix_spawn) (&xpid, path, 0, 0, cargv, cenvp); |
113 | |
115 | |
114 | if (errno) |
116 | if (errno) |
115 | XSRETURN_UNDEF; |
117 | XSRETURN_UNDEF; |
116 | |
118 | |
117 | pid = xpid; |
119 | pid = xpid; |
118 | } |
120 | } |
119 | #else |
121 | #else |
120 | pid = vfork (); |
122 | { |
|
|
123 | char **old_environ = environ; |
|
|
124 | environ = (char **)cenvp; |
121 | |
125 | |
122 | if (pid < 0) |
126 | pid = vfork (); |
123 | XSRETURN_UNDEF; |
|
|
124 | |
127 | |
|
|
128 | if (pid) |
|
|
129 | environ = old_environ; |
|
|
130 | |
|
|
131 | if (pid < 0) |
|
|
132 | XSRETURN_UNDEF; |
|
|
133 | |
125 | if (pid == 0) |
134 | if (pid == 0) |
126 | { |
135 | { |
127 | execve (path, cargv, cenvp); |
136 | (ix ? execvp : execv) (path, cargv); |
128 | _exit (127); |
137 | _exit (127); |
129 | } |
138 | } |
|
|
139 | } |
130 | #endif |
140 | #endif |
131 | |
141 | |
132 | RETVAL = pid; |
142 | RETVAL = pid; |
133 | } |
143 | } |
134 | OUTPUT: RETVAL |
144 | OUTPUT: RETVAL |
… | |
… | |
139 | #ifdef WIN32 |
149 | #ifdef WIN32 |
140 | SetHandleInformation ((HANDLE)_get_osfhandle (fd), HANDLE_FLAG_INHERIT, on ? HANDLE_FLAG_INHERIT : 0); |
150 | SetHandleInformation ((HANDLE)_get_osfhandle (fd), HANDLE_FLAG_INHERIT, on ? HANDLE_FLAG_INHERIT : 0); |
141 | #else |
151 | #else |
142 | fcntl (fd, F_SETFD, on ? 0 : FD_CLOEXEC); |
152 | fcntl (fd, F_SETFD, on ? 0 : FD_CLOEXEC); |
143 | #endif |
153 | #endif |
|
|
154 | |