summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Ing-Simmons <nik@tiuk.ti.com>2001-04-07 09:11:38 +0000
committerNick Ing-Simmons <nik@tiuk.ti.com>2001-04-07 09:11:38 +0000
commit267cbce72d0da7af102852e6d7e0bb5c1ce41da6 (patch)
treee88e609455d2fcc6a3a5798a149a35c831628841
parent9070af9fb87632d66faa82c00ab8b5cf20323a2b (diff)
downloadperl-267cbce72d0da7af102852e6d7e0bb5c1ce41da6.tar.gz
Cleanup correction for failed :Via() layer, also set an error code.
p4raw-id: //depot/perlio@9603
-rw-r--r--ext/PerlIO/Via/Via.xs14
1 files changed, 12 insertions, 2 deletions
diff --git a/ext/PerlIO/Via/Via.xs b/ext/PerlIO/Via/Via.xs
index 0abcece8a7..cb3f328e6c 100644
--- a/ext/PerlIO/Via/Via.xs
+++ b/ext/PerlIO/Via/Via.xs
@@ -126,7 +126,7 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg)
{
STRLEN pkglen = 0;
char *pkg = SvPV(arg,pkglen);
- s->obj = arg;
+ s->obj = SvREFCNT_inc(arg);
s->stash = gv_stashpvn(pkg, pkglen, FALSE);
if (s->stash)
{
@@ -135,7 +135,10 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg)
if (result)
{
if (sv_isobject(result))
- s->obj = SvREFCNT_inc(result);
+ {
+ s->obj = SvREFCNT_inc(result);
+ SvREFCNT_dec(arg);
+ }
else if (SvIV(result) != 0)
return SvIV(result);
}
@@ -147,6 +150,13 @@ PerlIOVia_pushed(PerlIO *f, const char *mode, SV *arg)
else
{
Perl_warn(aTHX_ "Cannot find package '%.*s'",(int) pkglen,pkg);
+#ifdef ENOSYS
+ errno = ENOSYS;
+#else
+#ifdef ENOENT
+ errno = ENOENT;
+#endif
+#endif
code = -1;
}
}