The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

# make sure we can do sockets
use IO::Socket ();
use Data::Dumper ();

# some local lexicals
my $text;

# satisy -require-
1;

#------------------------------------------------------------------------
# anyport
#
# Return a free port for listening
#
#  IN: 1 servername or IP address (defaults to "localhost")
# OUT: 1 random port number

sub anyport {

    # attempt to obtain a port to work on
    my $port = '';
    if (my $socket = IO::Socket::INET->new(
      Listen    => 5,
      LocalAddr => (shift || '127.0.0.1'),
    ) ) {
        $port = $socket->sockport;
    }

    # make sure the system's freed up the port
    sleep 1;
    return $port;
} #anyport

#------------------------------------------------------------------------
# ft
#
# Helper sub for doing tests inside a forked process
#
# a. called without parameter in void context: initialize
# b. called with parameter in void context: add test result + comment
# c. called without parameter in scalar context: return result

sub ft {

    # completed, return what we got
    if ( defined wantarray ) {
        return $text;
    }

    # we're getting a test, return its result
    elsif (@_) {
        $text .= ($_[0] || '')."#$_[1]\n";
    }

    # we're initializing
    else {
        $text = '';
    }
} #ft

#------------------------------------------------------------------------
# pft
#
# Process forked test results
#
#  IN: 1 filename to read

sub pft {

    # open the file
    open my $handle, $_[0] or die "Could not open '$_[0]': $!";

    # process all lines
    chomp,&ok( split "#" ) while <$handle>;

    # deny all further knowledge
    close $handle;
    unlink $_[0];
} #pft

#------------------------------------------------------------------------
# slurp
#
# Slurp the contents of a file
#
#  IN: 1 filename
# OUT: 1 contents of file

sub slurp { open my $handle,$_[0]; local $/; <$handle> } #slurp

#------------------------------------------------------------------------
# splat
#
# Splat contents to a file
#
#  IN: 1 filename
#      2 contents of file

sub splat { open my $handle,">$_[0]"; print $handle $_[1] } #splat