AnyEvent-ITM

 view release on metacpan or  search on metacpan

lib/AnyEvent/ITM.pm  view on Meta::CPAN


AnyEvent::Handle::register_read_type(itm => sub {
  my ( $self, $cb ) = @_;
  sub {
    if (defined $_[0]{rbuf}) {
      my $first = substr($_[0]{rbuf},0,1);
      my $len = length($_[0]{rbuf});
      my $f = ord($first);
      my $header = itm_header($first);
      if ($header) {
        my $size = $header->{size} ? $header->{size} : 0;
        my $payload = substr($_[0]{rbuf},1,$size);
        if (defined $payload && length($payload) == $size) {
          my $itm = itm_parse($header,$size ? ($payload) : ());
          $_[0]{rbuf} = substr($_[0]{rbuf},$size + 1);
          $cb->( $_[0], $itm );
          return 1;          
        }
        return 0;
      } else {
        croak sprintf("unknown packet type");
      }
    }
    return 0;
  };
});

sub _ts {
  my @t = localtime;
  return sprintf "%04d-%02d-%02d %02d:%02d:%02d",
    $t[5]+1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0];
}

sub _print_ts {
  my ( $label, $line ) = @_;
  chomp $line;
  if ($label eq '2>') {
    print STDERR _ts()." $label $line\n";
  } else {
    print STDOUT _ts()." $label $line\n";
  }
};

sub handle {
  my ( $class, $file, $payload_sub, $cv ) = @_;

  my $has_cv = defined $cv ? 1 : 0;

  $cv = AE::cv unless $has_cv;

  # Choose flags so open won't block
  my $flags;
  if (-p $file) {
    $flags = O_RDWR | O_NONBLOCK;
  } else {
    $flags = O_RDONLY | O_NONBLOCK;
    $flags |= O_NOCTTY if -c $file;
  }

  sysopen(my $fh, $file, $flags) or die "sysopen $file: $!";
  binmode($fh, ':raw');

  my $handle = AnyEvent::Handle->new(
    fh => $fh,
    on_error => sub {
      my ( $handle, $fatal, $message ) = @_;
      $handle->destroy;
      $cv->send("$fatal: $message");
    },
    on_eof => sub {
      my ( $handle ) = @_;
      $handle->destroy;
      $cv->send("EOF");
    },
    on_read => sub {
      my $handle = shift;
      $handle->push_read( itm => $payload_sub );
    },
  );

  $cv->recv unless $has_cv;

  return $handle;
}

sub _run_cmd {
  my ($class, @cmd) = @_;
  die "run_cmd: no command" unless @cmd;

  my ($out_r, $out_w) = portable_pipe;
  my ($err_r, $err_w) = portable_pipe;

  my $proc = run_cmd \@cmd, '>' => $out_w, '2>' => $err_w, close_all => 1;

  close $out_w;
  close $err_w;

  my %cmd = (
    cv   => AE::cv,
    proc => $proc,
  );

  $cmd{hout} = AnyEvent::Handle->new(
    fh      => $out_r,
    on_read => sub {
      my ($h) = @_;
      $h->push_read(line => sub {
        my ($h, $line) = @_;
        _print_ts('>', $line);
      });
    },
    on_eof   => sub { shift->destroy },
    on_error => sub { shift->destroy },
  );

  $cmd{herr} = AnyEvent::Handle->new(
    fh      => $err_r,
    on_read => sub {
      my ($h) = @_;
      $h->push_read(line => sub {
        my ($h, $line) = @_;



( run in 1.762 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )