… | |
… | |
46 | if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) |
46 | if (!SvROK (sv) || SvTYPE (SvRV (sv)) != SVt_PVAV) |
47 | croak ("expected a reference to an array of argument/environment strings"); |
47 | croak ("expected a reference to an array of argument/environment strings"); |
48 | |
48 | |
49 | av = (AV *)SvRV (sv); |
49 | av = (AV *)SvRV (sv); |
50 | n = av_len (av) + 1; |
50 | n = av_len (av) + 1; |
51 | cvec = (char **)SvPVX (sv_2mortal (NEWSV (0, sizeof (char *) * n + 1))); |
51 | cvec = (char **)SvPVX (sv_2mortal (NEWSV (0, sizeof (char *) * (n + 1)))); |
52 | |
52 | |
53 | for (i = 0; i < n; ++i) |
53 | for (i = 0; i < n; ++i) |
54 | cvec [i] = SvPVbyte_nolen (*av_fetch (av, i, 11)); |
54 | cvec [i] = SvPVbyte_nolen (*av_fetch (av, i, 1)); |
55 | |
55 | |
56 | cvec [n] = 0; |
56 | cvec [n] = 0; |
57 | |
57 | |
58 | return cvec; |
58 | return cvec; |
59 | } |
59 | } |
… | |
… | |
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 */ |
104 | w32_child_handles [w32_num_children] = (HANDLE)pid; |
106 | w32_child_handles [w32_num_children] = (HANDLE)pid; |
105 | pid = GetProcessId ((HANDLE)pid); /* get the real pid, unfortunately, requires wxp or newer */ |
107 | pid = GetProcessId ((HANDLE)pid); /* get the real pid, unfortunately, requires wxp or newer */ |
106 | w32_child_pids [w32_num_children] = pid; |
108 | w32_child_pids [w32_num_children] = pid; |
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 | pid = (ix ? fork : vfork) (); |
121 | |
123 | |
122 | if (pid < 0) |
124 | if (pid < 0) |
123 | XSRETURN_UNDEF; |
125 | XSRETURN_UNDEF; |
124 | |
126 | |
125 | if (pid == 0) |
127 | if (pid == 0) |
126 | { |
128 | { |
|
|
129 | if (ix) |
|
|
130 | { |
|
|
131 | environ = (char **)cenvp; |
|
|
132 | execvp (path, cargv); |
|
|
133 | } |
|
|
134 | else |
127 | execve (path, cargv, cenvp); |
135 | execve (path, cargv, cenvp); |
|
|
136 | |
128 | _exit (127); |
137 | _exit (127); |
129 | } |
138 | } |
130 | #endif |
139 | #endif |
131 | |
140 | |
132 | RETVAL = pid; |
141 | RETVAL = pid; |
… | |
… | |
139 | #ifdef WIN32 |
148 | #ifdef WIN32 |
140 | SetHandleInformation ((HANDLE)_get_osfhandle (fd), HANDLE_FLAG_INHERIT, on ? HANDLE_FLAG_INHERIT : 0); |
149 | SetHandleInformation ((HANDLE)_get_osfhandle (fd), HANDLE_FLAG_INHERIT, on ? HANDLE_FLAG_INHERIT : 0); |
141 | #else |
150 | #else |
142 | fcntl (fd, F_SETFD, on ? 0 : FD_CLOEXEC); |
151 | fcntl (fd, F_SETFD, on ? 0 : FD_CLOEXEC); |
143 | #endif |
152 | #endif |
|
|
153 | |