#include <unistd.h>
#include <process.h>
+#include <sys/cygwin.h>
/*
* pp_system() implemented via spawn()
static int
do_spawnvp (const char *path, const char * const *argv)
{
- dTHXo;
+ dTHX;
Sigsave_t ihand,qhand;
int childpid, result, status;
childpid = spawnvp(_P_NOWAIT,path,argv);
if (childpid < 0) {
status = -1;
- if(ckWARN(WARN_EXEC)) {
- dTHR;
- Perl_warner(aTHX_ WARN_EXEC,"Can't spawn \"%s\": %s",
+ if(ckWARN(WARN_EXEC))
+ Perl_warner(aTHX_ packWARN(WARN_EXEC),"Can't spawn \"%s\": %s",
path,Strerror (errno));
- }
} else {
do {
result = wait4pid(childpid, &status, 0);
int
do_aspawn (SV *really, void **mark, void **sp)
{
- dTHXo;
+ dTHX;
int rc;
char **a,*tmps,**argv;
STRLEN n_a;
int
do_spawn (char *cmd)
{
- dTHXo;
+ dTHX;
char **a,*s,*metachars = "$&*(){}[]'\";\\?>|<~`\n";
const char *command[4];
if(items != 0)
Perl_croak(aTHX_ "Usage: Cwd::cwd()");
- if((cwd = getcwd(NULL, 0))) {
+ if((cwd = getcwd(NULL, -1))) {
ST(0) = sv_2mortal(newSVpv(cwd, 0));
safesysfree(cwd);
+#ifndef INCOMPLETE_TAINTS
+ SvTAINTED_on(ST(0));
+#endif
XSRETURN(1);
}
XSRETURN_UNDEF;
}
+static
+XS(XS_Cygwin_pid_to_winpid)
+{
+ dXSARGS;
+ if (items != 1)
+ Perl_croak(aTHX_ "Usage: Cygwin::pid_to_winpid(pid)");
+ pid_t pid = (pid_t)SvIV(ST(0));
+ pid_t RETVAL;
+ dXSTARG;
+ if ((RETVAL = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, pid)) > 0) {
+ XSprePUSH; PUSHi((IV)RETVAL);
+ XSRETURN(1);
+ }
+ XSRETURN_UNDEF;
+}
+
+static
+XS(XS_Cygwin_winpid_to_pid)
+{
+ dXSARGS;
+ if (items != 1)
+ Perl_croak(aTHX_ "Usage: Cygwin::winpid_to_pid(pid)");
+ pid_t pid = (pid_t)SvIV(ST(0));
+ pid_t RETVAL;
+ dXSTARG;
+ if ((RETVAL = cygwin32_winpid_to_pid(pid)) > 0) {
+ XSprePUSH; PUSHi((IV)RETVAL);
+ XSRETURN(1);
+ }
+ XSRETURN_UNDEF;
+}
+
+
void
init_os_extras(void)
{
dTHX;
newXS("Cwd::cwd", Cygwin_cwd, file);
+ newXS("Cygwin::winpid_to_pid", XS_Cygwin_winpid_to_pid, file);
+ newXS("Cygwin::pid_to_winpid", XS_Cygwin_pid_to_winpid, file);
}