#!/usr/bin/perl

# ptee -- perl implementation of unix tee
$VERSION = '0.11';
use strict;
use File::Basename qw/basename/;
use Getopt::Long;
use IO::File;

=head1 NAME

ptee - emulate the GNU tee program with Perl

=cut

my $help_text = <<'=cut';

=head1 SYNOPSIS

 ptee [OPTIONS]... [FILENAMES]...

 OPTIONS:
 
    --append or -a
        append to file(s) rather than overwrite

    --help or -h
        give usage information

    --version or -V
        print the version number of this program

=cut

$help_text =~ s/\A.+?( ptee.*)/$1/ms;

#--------------------------------------------------------------------------#
# process command line
#--------------------------------------------------------------------------#

my %opts;
GetOptions( \%opts,
    'version|V',
    'help|h|?',
    'append|a',
);

#--------------------------------------------------------------------------#
# options
#--------------------------------------------------------------------------#

if ($opts{version}) {
    print basename($0), " $main::VERSION\n";
    exit 0;
}

if ($opts{help}) {
    print "Usage:\n$help_text";
    exit 1;
}

my $mode = $opts{append} ? ">>" : ">";

#--------------------------------------------------------------------------#
# Setup list of filehandles
#--------------------------------------------------------------------------#

my $stdout = IO::Handle->new->fdopen(fileno(STDOUT),"w");
my @files = $stdout;

for my $file ( @ARGV ) {
    my $f = IO::File->new("$mode $file") 
        or die "Could't open '$file' for writing: $!'";
    push @files, $f;
}

#--------------------------------------------------------------------------#
# Tee input to the filehandle list
#--------------------------------------------------------------------------#

my $buffer_size = 1024;
my $buffer;

while ( sysread( STDIN, $buffer, $buffer_size ) > 0 ) {
    for my $fh ( @files ) {
        syswrite $fh, $buffer;
    }
}

__END__

=head1 DESCRIPTION

C<ptee> is a pure Perl emulation of the standard GNU tool C<tee> and is
designed to be a platform independent replacement for operating systems without
a native C<tee> program.

It passes input received on STDIN through to STDOUT while also writing a copy
of the input to any files provided as arguments.  By default, files will be
overwritten, but this behavior may be altered with the C<--append> option.  

Unlike C<tee>, C<ptee> does not support ignoring interrupts, as signal handling
is not sufficiently portable.

=head1 BUGS

Please report any bugs or feature using the CPAN Request Tracker.  
Bugs can be submitted by email to C<bug-Tee@rt.cpan.org> or 
through the web interface at 
L<http:E<sol>E<sol>rt.cpan.orgE<sol>PublicE<sol>DistE<sol>Display.html?Name=Tee>

When submitting a bug or request, please include a test-file or a patch to an
existing test-file that illustrates the bug or desired feature.

=head1 AUTHOR

David A. Golden (DAGOLDEN)

dagolden@cpan.org

http:E<sol>E<sol>www.dagolden.orgE<sol>

=head1 COPYRIGHT AND LICENSE

Copyright (c) 2006 by David A. Golden

This program is free software; you can redistribute
it andE<sol>or modify it under the same terms as Perl itself.

The full text of the license can be found in the
LICENSE file included with this module.

=head1 DISCLAIMER OF WARRANTY

BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS ANDE<sol>OR OTHER PARTIES
PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
NECESSARY SERVICING, REPAIR, OR CORRECTION.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY ANDE<sol>OR
REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.



