X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=cygwin%2Fcygwin.c;h=b774394c7c5ba75ad9515d40242793df7e1e18b2;hb=2da69e3251f35ba724310352213c9f1aa37d4d1d;hp=962a60a8d4057060c23467de1a864814b4757eae;hpb=0e06870bf080a38cda51c06c6612359afc2334e1;p=p5sagit%2Fp5-mst-13.2.git diff --git a/cygwin/cygwin.c b/cygwin/cygwin.c index 962a60a..b774394 100644 --- a/cygwin/cygwin.c +++ b/cygwin/cygwin.c @@ -9,6 +9,8 @@ #include #include +#include +#include /* * pp_system() implemented via spawn() @@ -18,17 +20,17 @@ static int do_spawnvp (const char *path, const char * const *argv) { - dTHXo; + dTHX; 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; if(ckWARN(WARN_EXEC)) - Perl_warner(aTHX_ WARN_EXEC,"Can't spawn \"%s\": %s", + Perl_warner(aTHX_ packWARN(WARN_EXEC),"Can't spawn \"%s\": %s", path,Strerror (errno)); } else { do { @@ -45,7 +47,7 @@ do_spawnvp (const char *path, const char * const *argv) int do_aspawn (SV *really, void **mark, void **sp) { - dTHXo; + dTHX; int rc; char **a,*tmps,**argv; STRLEN n_a; @@ -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; @@ -78,7 +80,7 @@ do_aspawn (SV *really, void **mark, void **sp) int do_spawn (char *cmd) { - dTHXo; + dTHX; char **a,*s,*metachars = "$&*(){}[]'\";\\?>|<~`\n"; const char *command[4]; @@ -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,17 +147,66 @@ 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 XSRETURN(1); } 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) { char *file = __FILE__; + CV *cv; 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); + + if ((cv = get_cv("Win32CORE::bootstrap", 0))) { + dSP; + PUSHMARK(SP); + (void)call_sv((SV *)cv, G_EVAL|G_DISCARD|G_VOID); + } }