summaryrefslogtreecommitdiff
path: root/pp_sys.c
diff options
context:
space:
mode:
authorSlaven Rezic <slaven@rezic.de>2003-01-23 16:48:52 +0100
committerAbhijit Menon-Sen <ams@wiw.org>2003-01-26 05:29:40 +0000
commit090bf15bb9dfb4e3cb204e6874ee60c0c987535e (patch)
tree1f770756fd13c43128efa1c54756e421881dea41 /pp_sys.c
parente311fd516b524122f8c5b6ef607a521c46c05571 (diff)
downloadperl-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.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/pp_sys.c b/pp_sys.c
index 46d06f5ede..b14dd7719e 100644
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -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);