diff options
author | Slaven Rezic <slaven@rezic.de> | 2003-01-23 16:48:52 +0100 |
---|---|---|
committer | Abhijit Menon-Sen <ams@wiw.org> | 2003-01-26 05:29:40 +0000 |
commit | 090bf15bb9dfb4e3cb204e6874ee60c0c987535e (patch) | |
tree | 1f770756fd13c43128efa1c54756e421881dea41 /pp_sys.c | |
parent | e311fd516b524122f8c5b6ef607a521c46c05571 (diff) | |
download | perl-090bf15bb9dfb4e3cb204e6874ee60c0c987535e.tar.gz |
Re: truncate using a globref
Message-Id: <200301231448.h0NEmqnu022591@vran.herceg.de>
p4raw-id: //depot/perl@18581
Diffstat (limited to 'pp_sys.c')
-rw-r--r-- | pp_sys.c | 35 |
1 files changed, 24 insertions, 11 deletions
@@ -2031,22 +2031,31 @@ PP(pp_truncate) STRLEN n_a; int result = 1; GV *tmpgv; - + IO *io; + if (PL_op->op_flags & OPf_SPECIAL) { tmpgv = gv_fetchpv(POPpx, FALSE, SVt_PVIO); - do_ftruncate: - TAINT_PROPER("truncate"); - if (!GvIO(tmpgv) || !IoIFP(GvIOp(tmpgv))) - result = 0; + do_ftruncate_gv: + if (!GvIO(tmpgv)) + result = 0; else { - PerlIO_flush(IoIFP(GvIOp(tmpgv))); + PerlIO *fp; + io = GvIOp(tmpgv); + do_ftruncate_io: + TAINT_PROPER("truncate"); + if (!(fp = IoIFP(io))) { + result = 0; + } + else { + PerlIO_flush(fp); #ifdef HAS_TRUNCATE - if (ftruncate(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0) + if (ftruncate(PerlIO_fileno(fp), len) < 0) #else - if (my_chsize(PerlIO_fileno(IoIFP(GvIOn(tmpgv))), len) < 0) + if (my_chsize(PerlIO_fileno(fp), len) < 0) #endif - result = 0; + result = 0; + } } } else { @@ -2055,11 +2064,15 @@ PP(pp_truncate) if (SvTYPE(sv) == SVt_PVGV) { tmpgv = (GV*)sv; /* *main::FRED for example */ - goto do_ftruncate; + goto do_ftruncate_gv; } else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVGV) { tmpgv = (GV*) SvRV(sv); /* \*main::FRED for example */ - goto do_ftruncate; + goto do_ftruncate_gv; + } + else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO) { + io = (IO*) SvRV(sv); /* *main::FRED{IO} for example */ + goto do_ftruncate_io; } name = SvPV(sv, n_a); |