--- ./pod/perlrun.pod~	Fri Jul 11 03:42:39 2003
+++ ./pod/perlrun.pod	Tue Jul 22 19:14:23 2003
@@ -759,6 +759,9 @@ separators, it will first be searched fo
 before being searched for on the PATH.  On Unix platforms, the
 program will be searched for strictly on the PATH.
 
+At runtime one can use C<$name = Internals::find_script($name)>
+function to emulate the way Perl looks for scripts with B<-S> option.
+
 =item B<-t>
 
 Like B<-T>, but taint checks will issue warnings rather than fatal
--- ./lib/Internals.t~	Sat Jul 20 01:49:48 2002
+++ ./lib/Internals.t	Tue Jul 22 19:04:48 2003
@@ -7,7 +7,7 @@ BEGIN {
     }
 }
 
-use Test::More tests => 33;
+use Test::More tests => 34;
 
 my $foo;
 my @foo;
@@ -55,4 +55,9 @@ is(  Internals::SvREFCNT(@foo), 1 );
 is(  Internals::SvREFCNT($foo[2]), 1 );
 is(  Internals::SvREFCNT(%foo), 1 );
 is(  Internals::SvREFCNT($foo{foo}), 1 );
+{
+  local $ENV{PATH} = '../utils';
+  local $ENV{Commands} = '../utils';
+  like(  Internals::find_script('perlbug'), qr(^\.\./utils[:/]perlbug) );
+}
 
--- ./universal.c~	Tue Jun 24 22:07:33 2003
+++ ./universal.c	Tue Jul 22 18:37:53 2003
@@ -176,6 +176,7 @@ XS(XS_utf8_native_to_unicode);
 XS(XS_Internals_SvREADONLY);
 XS(XS_Internals_SvREFCNT);
 XS(XS_Internals_hv_clear_placehold);
+XS(XS_Internals_find_script);
 XS(XS_PerlIO_get_layers);
 XS(XS_Regexp_DESTROY);
 
@@ -199,6 +200,8 @@ Perl_boot_core_UNIVERSAL(pTHX)
     newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
     newXSproto("Internals::hv_clear_placeholders",
                XS_Internals_hv_clear_placehold, file, "\\%");
+    newXSproto("Internals::find_script",
+               XS_Internals_find_script, file, "$;$$$");
     newXSproto("PerlIO::get_layers",
                XS_PerlIO_get_layers, file, "*;@");
     newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
@@ -584,6 +587,42 @@ XS(XS_Internals_hv_clear_placehold)
     XSRETURN(0);
 }
 
+XS(XS_Internals_find_script)
+{
+    dXSARGS;
+    if (items < 1 || items > 4)
+	Perl_croak(aTHX_ "Usage: Internals::find_script(name, exts, inpath, flags)");
+    {
+	char *	name = SvPV_nolen(ST(0));
+	char *	RETVAL;
+	dXSTARG;
+	bool inpath = (items < 3 ? 1 : SvIV(ST(2)));
+	I32 flags = (items < 4 ? 0 : SvIV(ST(3)));
+	char **exts = NULL;
+
+	if (items >= 2 && SvOK(ST(1))) {
+	    AV *av;
+	    I32 n;
+	    STRLEN n_a;
+
+	    if (!SvROK(ST(1)))
+		Perl_croak(aTHX_ "Internals::find_script: exts should be undef or array reference");
+	    av = (AV*)SvRV(ST(1));
+	    n = av_len(av) + 1;		/* Number of elts */
+	    New(1012, exts, n + 1, char *);
+	    exts[n] = Nullch;
+	    while (--n >= 0)
+		exts[n] = SvPV_force(*av_fetch(av, n, TRUE), n_a);
+	}
+	RETVAL = find_script(name, inpath, exts, flags);
+	Safefree(exts);
+	if (!RETVAL)
+	    XSRETURN_EMPTY;
+	sv_setpv(TARG, RETVAL); Safefree(RETVAL); XSprePUSH; PUSHTARG;
+    }
+    XSRETURN(1);
+}
+
 XS(XS_Regexp_DESTROY)
 {
 
