X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cygwin%2Fcygwin.c;h=ec564f68cfc34689ddf506cf69751a4321a0be7f;hb=eec72883e7bd2862f334c41702163eb3262a292c;hp=0e9d07d35e08f30c83cfd52c1e738b89d6488bd5;hpb=d6b7ef8642dbff7f74dde11fd4995a37e8f38c04;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cygwin/cygwin.c b/cygwin/cygwin.c index 0e9d07d..ec564f6 100644 --- a/cygwin/cygwin.c +++ b/cygwin/cygwin.c @@ -9,6 +9,8 @@ #include #include +#include +#include /* * pp_system() implemented via spawn() @@ -22,8 +24,8 @@ do_spawnvp (const char *path, const char * const *argv) Sigsave_t ihand,qhand; int childpid, result, status; - rsignal_save(SIGINT, SIG_IGN, &ihand); - rsignal_save(SIGQUIT, SIG_IGN, &qhand); + rsignal_save(SIGINT, (Sighandler_t) SIG_IGN, &ihand); + rsignal_save(SIGQUIT, (Sighandler_t) SIG_IGN, &qhand); childpid = spawnvp(_P_NOWAIT,path,argv); if (childpid < 0) { status = -1; @@ -56,7 +58,7 @@ do_aspawn (SV *really, void **mark, void **sp) while (++mark <= sp) if (*mark) - *a++ = SvPVx(*mark, n_a); + *a++ = SvPVx((SV *)*mark, n_a); else *a++ = ""; *a = Nullch; @@ -117,7 +119,7 @@ do_spawn (char *cmd) return do_spawnvp("sh",command); } - New (1303,PL_Argv,(s-cmd)/2+2,char*); + Newx (PL_Argv,(s-cmd)/2+2,char*); PL_Cmd=savepvn (cmd,s-cmd); a=PL_Argv; for (s=PL_Cmd; *s;) { @@ -136,7 +138,6 @@ do_spawn (char *cmd) } /* see also Cwd.pm */ -static XS(Cygwin_cwd) { dXSARGS; @@ -146,7 +147,7 @@ XS(Cygwin_cwd) Perl_croak(aTHX_ "Usage: Cwd::cwd()"); if((cwd = getcwd(NULL, -1))) { ST(0) = sv_2mortal(newSVpv(cwd, 0)); - safesysfree(cwd); + free(cwd); #ifndef INCOMPLETE_TAINTS SvTAINTED_on(ST(0)); #endif @@ -155,6 +156,43 @@ XS(Cygwin_cwd) XSRETURN_UNDEF; } +XS(XS_Cygwin_pid_to_winpid) +{ + dXSARGS; + dXSTARG; + pid_t pid, RETVAL; + + if (items != 1) + Perl_croak(aTHX_ "Usage: Cygwin::pid_to_winpid(pid)"); + + pid = (pid_t)SvIV(ST(0)); + + if ((RETVAL = cygwin_internal(CW_CYGWIN_PID_TO_WINPID, pid)) > 0) { + XSprePUSH; PUSHi((IV)RETVAL); + XSRETURN(1); + } + XSRETURN_UNDEF; +} + +XS(XS_Cygwin_winpid_to_pid) +{ + dXSARGS; + dXSTARG; + pid_t pid, RETVAL; + + if (items != 1) + Perl_croak(aTHX_ "Usage: Cygwin::winpid_to_pid(pid)"); + + pid = (pid_t)SvIV(ST(0)); + + if ((RETVAL = cygwin32_winpid_to_pid(pid)) > 0) { + XSprePUSH; PUSHi((IV)RETVAL); + XSRETURN(1); + } + XSRETURN_UNDEF; +} + + void init_os_extras(void) { @@ -162,4 +200,6 @@ 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); }