… | |
… | |
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 | } |
… | |
… | |
102 | if (pid == -1) |
102 | if (pid == -1) |
103 | XSRETURN_UNDEF; |
103 | XSRETURN_UNDEF; |
104 | |
104 | |
105 | /* do it like perl, dadadoop dadadoop */ |
105 | /* do it like perl, dadadoop dadadoop */ |
106 | w32_child_handles [w32_num_children] = (HANDLE)pid; |
106 | w32_child_handles [w32_num_children] = (HANDLE)pid; |
107 | 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 */ |
108 | w32_child_pids [w32_num_children] = pid; |
108 | w32_child_pids [w32_num_children] = pid; |
109 | ++w32_num_children; |
109 | ++w32_num_children; |
110 | #elif USE_SPAWN |
110 | #elif USE_SPAWN |
111 | { |
111 | { |
112 | pid_t xpid; |
112 | pid_t xpid; |
… | |
… | |
117 | XSRETURN_UNDEF; |
117 | XSRETURN_UNDEF; |
118 | |
118 | |
119 | pid = xpid; |
119 | pid = xpid; |
120 | } |
120 | } |
121 | #else |
121 | #else |
122 | { |
122 | pid = (ix ? fork : vfork) (); |
123 | char **old_environ = environ; |
|
|
124 | environ = (char **)cenvp; |
|
|
125 | |
123 | |
126 | pid = vfork (); |
124 | if (pid < 0) |
|
|
125 | XSRETURN_UNDEF; |
127 | |
126 | |
|
|
127 | if (pid == 0) |
|
|
128 | { |
128 | if (pid) |
129 | if (ix) |
129 | environ = old_environ; |
130 | { |
|
|
131 | environ = (char **)cenvp; |
|
|
132 | execvp (path, cargv); |
|
|
133 | } |
|
|
134 | else |
|
|
135 | execve (path, cargv, cenvp); |
130 | |
136 | |
131 | if (pid < 0) |
|
|
132 | XSRETURN_UNDEF; |
|
|
133 | |
|
|
134 | if (pid == 0) |
|
|
135 | { |
|
|
136 | (ix ? execvp : execv) (path, cargv); |
|
|
137 | _exit (127); |
137 | _exit (127); |
138 | } |
138 | } |
139 | } |
|
|
140 | #endif |
139 | #endif |
141 | |
140 | |
142 | RETVAL = pid; |
141 | RETVAL = pid; |
143 | } |
142 | } |
144 | OUTPUT: RETVAL |
143 | OUTPUT: RETVAL |