[ID 20001112.006] IO::Seekable::getpos doesn't check for fgetpos() failure
[p5sagit/p5-mst-13.2.git] / ext / IO / lib / IO / Handle.pm
CommitLineData
774d564b 1
8add82fc 2package IO::Handle;
3
4=head1 NAME
5
27d4819a 6IO::Handle - supply object methods for I/O handles
8add82fc 7
8=head1 SYNOPSIS
9
10 use IO::Handle;
11
cf7fe8a2 12 $io = new IO::Handle;
13 if ($io->fdopen(fileno(STDIN),"r")) {
14 print $io->getline;
15 $io->close;
8add82fc 16 }
17
cf7fe8a2 18 $io = new IO::Handle;
19 if ($io->fdopen(fileno(STDOUT),"w")) {
20 $io->print("Some text\n");
8add82fc 21 }
22
3370baa8 23 use IO::Handle '_IOLBF';
cf7fe8a2 24 $io->setvbuf($buffer_var, _IOLBF, 1024);
8add82fc 25
cf7fe8a2 26 undef $io; # automatically closes the file if it's open
774d564b 27
8add82fc 28 autoflush STDOUT 1;
29
30=head1 DESCRIPTION
31
774d564b 32C<IO::Handle> is the base class for all other IO handle classes. It is
33not intended that objects of C<IO::Handle> would be created directly,
34but instead C<IO::Handle> is inherited from by several other classes
35in the IO hierarchy.
36
37If you are reading this documentation, looking for a replacement for
38the C<FileHandle> package, then I suggest you read the documentation
cf7fe8a2 39for C<IO::File> too.
8add82fc 40
27d4819a 41=head1 CONSTRUCTOR
42
43=over 4
44
45=item new ()
8add82fc 46
27d4819a 47Creates a new C<IO::Handle> object.
8add82fc 48
27d4819a 49=item new_from_fd ( FD, MODE )
50
51Creates a C<IO::Handle> like C<new> does.
52It requires two parameters, which are passed to the method C<fdopen>;
53if the fdopen fails, the object is destroyed. Otherwise, it is returned
54to the caller.
55
56=back
57
58=head1 METHODS
8add82fc 59
8add82fc 60See L<perlfunc> for complete descriptions of each of the following
61supported C<IO::Handle> methods, which are just front ends for the
62corresponding built-in functions:
a6006777 63
cf7fe8a2 64 $io->close
65 $io->eof
66 $io->fileno
67 $io->format_write( [FORMAT_NAME] )
68 $io->getc
69 $io->read ( BUF, LEN, [OFFSET] )
70 $io->print ( ARGS )
71 $io->printf ( FMT, [ARGS] )
72 $io->stat
73 $io->sysread ( BUF, LEN, [OFFSET] )
2ecf2f18 74 $io->syswrite ( BUF, [LEN, [OFFSET]] )
cf7fe8a2 75 $io->truncate ( LEN )
8add82fc 76
77See L<perlvar> for complete descriptions of each of the following
cf7fe8a2 78supported C<IO::Handle> methods. All of them return the previous
79value of the attribute and takes an optional single argument that when
80given will set the value. If no argument is given the previous value
81is unchanged (except for $io->autoflush will actually turn ON
82autoflush by default).
8add82fc 83
cf7fe8a2 84 $io->autoflush ( [BOOL] ) $|
85 $io->format_page_number( [NUM] ) $%
86 $io->format_lines_per_page( [NUM] ) $=
87 $io->format_lines_left( [NUM] ) $-
88 $io->format_name( [STR] ) $~
89 $io->format_top_name( [STR] ) $^
90 $io->input_line_number( [NUM]) $.
91
92The following methods are not supported on a per-filehandle basis.
93
94 IO::Handle->format_line_break_characters( [STR] ) $:
95 IO::Handle->format_formfeed( [STR]) $^L
96 IO::Handle->output_field_separator( [STR] ) $,
97 IO::Handle->output_record_separator( [STR] ) $\
98
99 IO::Handle->input_record_separator( [STR] ) $/
8add82fc 100
101Furthermore, for doing normal I/O you might need these:
102
103=over
104
cf7fe8a2 105=item $io->fdopen ( FD, MODE )
948ecc40 106
107C<fdopen> is like an ordinary C<open> except that its first parameter
108is not a filename but rather a file handle name, a IO::Handle object,
109or a file descriptor number.
110
cf7fe8a2 111=item $io->opened
948ecc40 112
a47f745f 113Returns true if the object is currently a valid file descriptor, false
114otherwise.
948ecc40 115
cf7fe8a2 116=item $io->getline
8add82fc 117
cf7fe8a2 118This works like <$io> described in L<perlop/"I/O Operators">
91e74348 119except that it's more readable and can be safely called in a
120list context but still returns just one line.
8add82fc 121
cf7fe8a2 122=item $io->getlines
8add82fc 123
91e74348 124This works like <$io> when called in a list context to read all
125the remaining lines in a file, except that it's more readable.
8add82fc 126It will also croak() if accidentally called in a scalar context.
127
cf7fe8a2 128=item $io->ungetc ( ORD )
27d4819a 129
948ecc40 130Pushes a character with the given ordinal value back onto the given
cf7fe8a2 131handle's input stream. Only one character of pushback per handle is
132guaranteed.
27d4819a 133
cf7fe8a2 134=item $io->write ( BUF, LEN [, OFFSET ] )
27d4819a 135
948ecc40 136This C<write> is like C<write> found in C, that is it is the
27d4819a 137opposite of read. The wrapper for the perl C<write> function is
138called C<format_write>.
139
cf7fe8a2 140=item $io->error
948ecc40 141
142Returns a true value if the given handle has experienced any errors
a47f745f 143since it was opened or since the last call to C<clearerr>, or if the
144handle is invalid. It only returns false for a valid handle with no
145outstanding errors.
948ecc40 146
cf7fe8a2 147=item $io->clearerr
948ecc40 148
a47f745f 149Clear the given handle's error indicator. Returns -1 if the handle is
150invalid, 0 otherwise.
27d4819a 151
cf7fe8a2 152=item $io->sync
153
154C<sync> synchronizes a file's in-memory state with that on the
155physical medium. C<sync> does not operate at the perlio api level, but
a47f745f 156operates on the file descriptor (similar to sysread, sysseek and
157systell). This means that any data held at the perlio api level will not
158be synchronized. To synchronize data that is buffered at the perlio api
159level you must use the flush method. C<sync> is not implemented on all
160platforms. Returns 0 on success, -1 on error, -1 for an invalid handle.
161See L<fsync(3c)>.
cf7fe8a2 162
163=item $io->flush
164
165C<flush> causes perl to flush any buffered data at the perlio api level.
166Any unread data in the buffer will be discarded, and any unwritten data
a47f745f 167will be written to the underlying file descriptor. Returns 0 on success,
168or a negative value on error.
cf7fe8a2 169
170=item $io->printflush ( ARGS )
171
172Turns on autoflush, print ARGS and then restores the autoflush status of the
a47f745f 173C<IO::Handle> object. Returns the return value from print.
cf7fe8a2 174
175=item $io->blocking ( [ BOOL ] )
176
177If called with an argument C<blocking> will turn on non-blocking IO if
178C<BOOL> is false, and turn it off if C<BOOL> is true.
179
180C<blocking> will return the value of the previous setting, or the
181current setting if C<BOOL> is not given.
182
183If an error occurs C<blocking> will return undef and C<$!> will be set.
184
8add82fc 185=back
186
cf7fe8a2 187
948ecc40 188If the C functions setbuf() and/or setvbuf() are available, then
189C<IO::Handle::setbuf> and C<IO::Handle::setvbuf> set the buffering
190policy for an IO::Handle. The calling sequences for the Perl functions
191are the same as their C counterparts--including the constants C<_IOFBF>,
192C<_IOLBF>, and C<_IONBF> for setvbuf()--except that the buffer parameter
a47f745f 193specifies a scalar variable to use as a buffer. You should only
194change the buffer before any I/O, or immediately after calling flush.
195
196WARNING: A variable used as a buffer by C<setbuf> or C<setvbuf> B<must not
197be modified> in any way until the IO::Handle is closed or C<setbuf> or
198C<setvbuf> is called again, or memory corruption may result! Remember that
199the order of global destruction is undefined, so even if your buffer
200variable remains in scope until program termination, it may be undefined
201before the file IO::Handle is closed. Note that you need to import the
202constants C<_IOFBF>, C<_IOLBF>, and C<_IONBF> explicitly. Like C, setbuf
203returns nothing, setvbuf returns 0 on success, -1 on failure.
948ecc40 204
205Lastly, there is a special method for working under B<-T> and setuid/gid
206scripts:
515e7bd7 207
208=over
209
cf7fe8a2 210=item $io->untaint
515e7bd7 211
212Marks the object as taint-clean, and as such data read from it will also
213be considered taint-clean. Note that this is a very trusting action to
214take, and appropriate consideration for the data source and potential
a47f745f 215vulnerability should be kept in mind. Returns 0 on success, -1 if setting
216the taint-clean flag failed. (eg invalid handle)
515e7bd7 217
218=back
219
27d4819a 220=head1 NOTE
8add82fc 221
cf7fe8a2 222A C<IO::Handle> object is a reference to a symbol/GLOB reference (see
223the C<Symbol> package). Some modules that
8add82fc 224inherit from C<IO::Handle> may want to keep object related variables
225in the hash table part of the GLOB. In an attempt to prevent modules
226trampling on each other I propose the that any such module should prefix
227its variables with its own name separated by _'s. For example the IO::Socket
228module keeps a C<timeout> variable in 'io_socket_timeout'.
229
230=head1 SEE ALSO
231
232L<perlfunc>,
233L<perlop/"I/O Operators">,
774d564b 234L<IO::File>
8add82fc 235
236=head1 BUGS
237
238Due to backwards compatibility, all filehandles resemble objects
239of class C<IO::Handle>, or actually classes derived from that class.
240They actually aren't. Which means you can't derive your own
241class from C<IO::Handle> and inherit those methods.
242
243=head1 HISTORY
244
cf7fe8a2 245Derived from FileHandle.pm by Graham Barr E<lt>F<gbarr@pobox.com>E<gt>
8add82fc 246
247=cut
248
17f410f9 249require 5.005_64;
7a4c00b4 250use strict;
17f410f9 251our($VERSION, @EXPORT_OK, @ISA);
8add82fc 252use Carp;
253use Symbol;
254use SelectSaver;
cf7fe8a2 255use IO (); # Load the XS module
8add82fc 256
257require Exporter;
258@ISA = qw(Exporter);
259
cf7fe8a2 260$VERSION = "1.21";
8add82fc 261
262@EXPORT_OK = qw(
263 autoflush
264 output_field_separator
265 output_record_separator
266 input_record_separator
267 input_line_number
268 format_page_number
269 format_lines_per_page
270 format_lines_left
271 format_name
272 format_top_name
273 format_line_break_characters
274 format_formfeed
275 format_write
276
277 print
278 printf
279 getline
280 getlines
281
cf7fe8a2 282 printflush
283 flush
284
8add82fc 285 SEEK_SET
286 SEEK_CUR
287 SEEK_END
288 _IOFBF
289 _IOLBF
290 _IONBF
8add82fc 291);
292
8add82fc 293################################################
294## Constructors, destructors.
295##
296
297sub new {
27d4819a 298 my $class = ref($_[0]) || $_[0] || "IO::Handle";
299 @_ == 1 or croak "usage: new $class";
cf7fe8a2 300 my $io = gensym;
301 bless $io, $class;
8add82fc 302}
303
304sub new_from_fd {
27d4819a 305 my $class = ref($_[0]) || $_[0] || "IO::Handle";
306 @_ == 3 or croak "usage: new_from_fd $class FD, MODE";
cf7fe8a2 307 my $io = gensym;
c927212d 308 shift;
cf7fe8a2 309 IO::Handle::fdopen($io, @_)
8add82fc 310 or return undef;
cf7fe8a2 311 bless $io, $class;
8add82fc 312}
313
98d4926f 314#
315# There is no need for DESTROY to do anything, because when the
316# last reference to an IO object is gone, Perl automatically
317# closes its associated files (if any). However, to avoid any
318# attempts to autoload DESTROY, we here define it to do nothing.
319#
320sub DESTROY {}
7a4c00b4 321
8add82fc 322
323################################################
324## Open and close.
325##
326
327sub _open_mode_string {
328 my ($mode) = @_;
329 $mode =~ /^\+?(<|>>?)$/
330 or $mode =~ s/^r(\+?)$/$1</
331 or $mode =~ s/^w(\+?)$/$1>/
332 or $mode =~ s/^a(\+?)$/$1>>/
333 or croak "IO::Handle: bad open mode: $mode";
334 $mode;
335}
336
337sub fdopen {
cf7fe8a2 338 @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)';
339 my ($io, $fd, $mode) = @_;
8add82fc 340 local(*GLOB);
341
342 if (ref($fd) && "".$fd =~ /GLOB\(/o) {
343 # It's a glob reference; Alias it as we cannot get name of anon GLOBs
344 my $n = qualify(*GLOB);
345 *GLOB = *{*$fd};
346 $fd = $n;
347 } elsif ($fd =~ m#^\d+$#) {
348 # It's an FD number; prefix with "=".
349 $fd = "=$fd";
350 }
351
cf7fe8a2 352 open($io, _open_mode_string($mode) . '&' . $fd)
353 ? $io : undef;
8add82fc 354}
355
356sub close {
cf7fe8a2 357 @_ == 1 or croak 'usage: $io->close()';
358 my($io) = @_;
8add82fc 359
cf7fe8a2 360 close($io);
8add82fc 361}
362
363################################################
364## Normal I/O functions.
365##
366
8add82fc 367# flock
8add82fc 368# select
8add82fc 369
370sub opened {
cf7fe8a2 371 @_ == 1 or croak 'usage: $io->opened()';
8add82fc 372 defined fileno($_[0]);
373}
374
375sub fileno {
cf7fe8a2 376 @_ == 1 or croak 'usage: $io->fileno()';
8add82fc 377 fileno($_[0]);
378}
379
380sub getc {
cf7fe8a2 381 @_ == 1 or croak 'usage: $io->getc()';
8add82fc 382 getc($_[0]);
383}
384
8add82fc 385sub eof {
cf7fe8a2 386 @_ == 1 or croak 'usage: $io->eof()';
8add82fc 387 eof($_[0]);
388}
389
390sub print {
cf7fe8a2 391 @_ or croak 'usage: $io->print(ARGS)';
8add82fc 392 my $this = shift;
393 print $this @_;
394}
395
396sub printf {
cf7fe8a2 397 @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])';
8add82fc 398 my $this = shift;
399 printf $this @_;
400}
401
402sub getline {
cf7fe8a2 403 @_ == 1 or croak 'usage: $io->getline()';
8add82fc 404 my $this = shift;
405 return scalar <$this>;
406}
407
f86702cc 408*gets = \&getline; # deprecated
409
8add82fc 410sub getlines {
cf7fe8a2 411 @_ == 1 or croak 'usage: $io->getlines()';
8add82fc 412 wantarray or
cf7fe8a2 413 croak 'Can\'t call $io->getlines in a scalar context, use $io->getline';
27d4819a 414 my $this = shift;
8add82fc 415 return <$this>;
416}
417
418sub truncate {
cf7fe8a2 419 @_ == 2 or croak 'usage: $io->truncate(LEN)';
8add82fc 420 truncate($_[0], $_[1]);
421}
422
423sub read {
cf7fe8a2 424 @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])';
8add82fc 425 read($_[0], $_[1], $_[2], $_[3] || 0);
426}
427
27d4819a 428sub sysread {
cf7fe8a2 429 @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])';
27d4819a 430 sysread($_[0], $_[1], $_[2], $_[3] || 0);
431}
432
8add82fc 433sub write {
8fd73a68 434 @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])';
8add82fc 435 local($\) = "";
8fd73a68 436 $_[2] = length($_[1]) unless defined $_[2];
8add82fc 437 print { $_[0] } substr($_[1], $_[3] || 0, $_[2]);
438}
439
27d4819a 440sub syswrite {
8fd73a68 441 @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])';
2ecf2f18 442 if (defined($_[2])) {
443 syswrite($_[0], $_[1], $_[2], $_[3] || 0);
444 } else {
445 syswrite($_[0], $_[1]);
446 }
27d4819a 447}
448
8add82fc 449sub stat {
cf7fe8a2 450 @_ == 1 or croak 'usage: $io->stat()';
8add82fc 451 stat($_[0]);
452}
453
454################################################
455## State modification functions.
456##
457
458sub autoflush {
cf7fe8a2 459 my $old = new SelectSaver qualify($_[0], caller);
8add82fc 460 my $prev = $|;
461 $| = @_ > 1 ? $_[1] : 1;
462 $prev;
463}
464
465sub output_field_separator {
cf7fe8a2 466 carp "output_field_separator is not supported on a per-handle basis"
467 if ref($_[0]);
8add82fc 468 my $prev = $,;
469 $, = $_[1] if @_ > 1;
470 $prev;
471}
472
473sub output_record_separator {
cf7fe8a2 474 carp "output_record_separator is not supported on a per-handle basis"
475 if ref($_[0]);
8add82fc 476 my $prev = $\;
477 $\ = $_[1] if @_ > 1;
478 $prev;
479}
480
481sub input_record_separator {
cf7fe8a2 482 carp "input_record_separator is not supported on a per-handle basis"
483 if ref($_[0]);
8add82fc 484 my $prev = $/;
485 $/ = $_[1] if @_ > 1;
486 $prev;
487}
488
489sub input_line_number {
91cce263 490 local $.;
491 my $tell = tell qualify($_[0], caller) if ref($_[0]);
492 my $prev = $.;
493 $. = $_[1] if @_ > 1;
494 $prev;
495}
91cce263 496
8add82fc 497sub format_page_number {
b61d194c 498 my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
8add82fc 499 my $prev = $%;
500 $% = $_[1] if @_ > 1;
501 $prev;
502}
503
504sub format_lines_per_page {
b61d194c 505 my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
8add82fc 506 my $prev = $=;
507 $= = $_[1] if @_ > 1;
508 $prev;
509}
510
511sub format_lines_left {
b61d194c 512 my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
8add82fc 513 my $prev = $-;
514 $- = $_[1] if @_ > 1;
515 $prev;
516}
517
518sub format_name {
b61d194c 519 my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
8add82fc 520 my $prev = $~;
521 $~ = qualify($_[1], caller) if @_ > 1;
522 $prev;
523}
524
525sub format_top_name {
b61d194c 526 my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]);
8add82fc 527 my $prev = $^;
528 $^ = qualify($_[1], caller) if @_ > 1;
529 $prev;
530}
531
532sub format_line_break_characters {
cf7fe8a2 533 carp "format_line_break_characters is not supported on a per-handle basis"
534 if ref($_[0]);
8add82fc 535 my $prev = $:;
536 $: = $_[1] if @_ > 1;
537 $prev;
538}
539
540sub format_formfeed {
cf7fe8a2 541 carp "format_formfeed is not supported on a per-handle basis"
542 if ref($_[0]);
8add82fc 543 my $prev = $^L;
544 $^L = $_[1] if @_ > 1;
545 $prev;
546}
547
548sub formline {
cf7fe8a2 549 my $io = shift;
8add82fc 550 my $picture = shift;
551 local($^A) = $^A;
552 local($\) = "";
553 formline($picture, @_);
cf7fe8a2 554 print $io $^A;
8add82fc 555}
556
557sub format_write {
cf7fe8a2 558 @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )';
8add82fc 559 if (@_ == 2) {
cf7fe8a2 560 my ($io, $fmt) = @_;
561 my $oldfmt = $io->format_name($fmt);
562 CORE::write($io);
563 $io->format_name($oldfmt);
8add82fc 564 } else {
56f7f34b 565 CORE::write($_[0]);
8add82fc 566 }
567}
568
21e970cc 569# XXX undocumented
27d4819a 570sub fcntl {
cf7fe8a2 571 @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );';
21e970cc 572 my ($io, $op) = @_;
573 return fcntl($io, $op, $_[2]);
27d4819a 574}
575
21e970cc 576# XXX undocumented
27d4819a 577sub ioctl {
cf7fe8a2 578 @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );';
21e970cc 579 my ($io, $op) = @_;
580 return ioctl($io, $op, $_[2]);
27d4819a 581}
8add82fc 582
cf7fe8a2 583# this sub is for compatability with older releases of IO that used
584# a sub called constant to detemine if a constant existed -- GMB
585#
586# The SEEK_* and _IO?BF constants were the only constants at that time
587# any new code should just chech defined(&CONSTANT_NAME)
588
589sub constant {
590 no strict 'refs';
591 my $name = shift;
592 (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name})
593 ? &{$name}() : undef;
594}
595
596
597# so that flush.pl can be depriciated
598
599sub printflush {
600 my $io = shift;
601 my $old = new SelectSaver qualify($io, caller) if ref($io);
602 local $| = 1;
603 if(ref($io)) {
604 print $io @_;
605 }
606 else {
607 print @_;
608 }
609}
610
8add82fc 6111;