File Coverage

blib/lib/AnyEvent/Pcap.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             package AnyEvent::Pcap;
2 3     3   1203 use strict;
  3         5  
  3         110  
3 3     3   15 use warnings;
  3         4  
  3         65  
4 3     3   15 use Carp;
  3         3  
  3         261  
5 3     3   4805 use AnyEvent;
  3         18247  
  3         110  
6 3     3   1860 use AnyEvent::Pcap::Utils;
  3         10  
  3         86  
7 3     3   3719 use Net::Pcap;
  0            
  0            
8             use base qw(Class::Accessor::Fast);
9              
10             our $VERSION = '0.00002';
11              
12             __PACKAGE__->mk_accessors($_) for qw(utils device filter packet_handler fd);
13              
14             sub new {
15             my $class = shift;
16             my $self = bless {@_}, $class;
17             $self->utils( AnyEvent::Pcap::Utils->new );
18             return $self;
19             }
20              
21             sub _setup_pcap {
22             my $self = shift;
23              
24             my $err;
25             my $device = $self->device || sub {
26             $self->device( Net::Pcap::pcap_lookupdev( \$err ) );
27             }
28             ->();
29             croak $err if $err;
30              
31             my $pcap = Net::Pcap::pcap_open_live( $device, 1024, 1, 0, \$err );
32             croak $err if $err;
33              
34             my ( $address, $netmask );
35             Net::Pcap::lookupnet( $device, \$address, \$netmask, \$err );
36             croak $err if $err;
37              
38             my $filter;
39             my $filter_string = $self->filter || sub {
40             $self->filter("");
41             }
42             ->();
43              
44             Net::Pcap::compile( $pcap, \$filter, $filter_string, 0, $netmask );
45             Net::Pcap::setfilter( $pcap, $filter );
46              
47             my $fd = Net::Pcap::fileno($pcap);
48             $self->fd($fd);
49             return $pcap;
50             }
51              
52             sub run {
53             my $self = shift;
54              
55             my $pcap = $self->_setup_pcap();
56              
57             my $packet_handler = $self->packet_handler || sub {
58             $self->packet_handler( sub { } );
59             }
60             ->();
61              
62             my $io;
63             $io = AnyEvent->io(
64             fh => $self->fd,
65             poll => 'r',
66             cb => sub {
67             my @pending;
68             Net::Pcap::dispatch(
69             $pcap, -1,
70             sub {
71             my $header = $_[1];
72             my $packet = $_[2];
73             push @{ $_[0] }, ( $header, $packet );
74             },
75             \@pending
76             );
77             $packet_handler->( @pending, $io );
78             }
79             );
80             }
81              
82             1;
83             __END__