ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Proc-FastSpawn/FastSpawn.xs
(Generate patch)

Comparing Proc-FastSpawn/FastSpawn.xs (file contents):
Revision 1.4 by root, Tue Apr 2 04:27:01 2013 UTC vs.
Revision 1.7 by root, Mon Jun 10 03:02:33 2013 UTC

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
70long 70long
71spawn (const char *path, SV *argv, SV *envp = &PL_sv_undef) 71spawn (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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines