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.3 by root, Tue Apr 2 03:53:50 2013 UTC vs.
Revision 1.6 by root, Sun Apr 28 01:10:44 2013 UTC

1/* GetProcessId is XP and up */ 1/* GetProcessId is XP and up, which means in all supported versions */
2/* but older SDK's might need this */
2#define _WIN32_WINNT NTDDI_WINXP 3#define _WIN32_WINNT NTDDI_WINXP
3 4
4#include "EXTERN.h" 5#include "EXTERN.h"
5#include "perl.h" 6#include "perl.h"
6#include "XSUB.h" 7#include "XSUB.h"
66 cv_undef (get_cv ("Proc::FastSpawn::_quote", 0)); 67 cv_undef (get_cv ("Proc::FastSpawn::_quote", 0));
67#endif 68#endif
68 69
69long 70long
70spawn (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
71 INIT: 74 INIT:
72{ 75{
73#ifdef WIN32 76#ifdef WIN32
74 if (w32_num_children >= MAXIMUM_WAIT_OBJECTS) 77 if (w32_num_children >= MAXIMUM_WAIT_OBJECTS)
75 { 78 {
92 char *const *cenvp = SvOK (envp) ? array_to_cvec (envp) : environ; 95 char *const *cenvp = SvOK (envp) ? array_to_cvec (envp) : environ;
93 intptr_t pid; 96 intptr_t pid;
94 97
95 fflush (0); 98 fflush (0);
96#ifdef WIN32 99#ifdef WIN32
97 pid = _spawnve (_P_NOWAIT, path, cargv, cenvp); 100 pid = (ix ? _spawnvpe : _spawnve) (_P_NOWAIT, path, cargv, cenvp);
98 101
99 if (pid == -1) 102 if (pid == -1)
100 XSRETURN_UNDEF; 103 XSRETURN_UNDEF;
101 104
102 /* do it like perl, dadadoop dadadoop */ 105 /* do it like perl, dadadoop dadadoop */
106 ++w32_num_children; 109 ++w32_num_children;
107#elif USE_SPAWN 110#elif USE_SPAWN
108 { 111 {
109 pid_t xpid; 112 pid_t xpid;
110 113
111 errno = posix_spawn (&xpid, path, 0, 0, cargv, cenvp); 114 errno = (ix ? posix_spawnp : posix_spawn) (&xpid, path, 0, 0, cargv, cenvp);
112 115
113 if (errno) 116 if (errno)
114 XSRETURN_UNDEF; 117 XSRETURN_UNDEF;
115 118
116 pid = xpid; 119 pid = xpid;
117 } 120 }
118#else 121#else
119 pid = vfork (); 122 pid = (ix ? fork : vfork) ();
120 123
121 if (pid < 0) 124 if (pid < 0)
122 XSRETURN_UNDEF; 125 XSRETURN_UNDEF;
123 126
124 if (pid == 0) 127 if (pid == 0)
125 { 128 {
129 if (ix)
130 {
131 environ = (char **)cenvp;
132 execvp (path, cargv);
133 }
134 else
126 execve (path, cargv, cenvp); 135 execve (path, cargv, cenvp);
136
127 _exit (127); 137 _exit (127);
128 } 138 }
129#endif 139#endif
130 140
131 RETVAL = pid; 141 RETVAL = pid;
138#ifdef WIN32 148#ifdef WIN32
139 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);
140#else 150#else
141 fcntl (fd, F_SETFD, on ? 0 : FD_CLOEXEC); 151 fcntl (fd, F_SETFD, on ? 0 : FD_CLOEXEC);
142#endif 152#endif
153

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines