parse_tcpdump_log.pl: die nicely on pcap
authorMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 26 Jul 2011 13:09:44 +0000 (10:09 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 23 Nov 2011 21:32:34 +0000 (19:32 -0200)
Handles common kill signals, to close pcap capture nicely.

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
contrib/parse_tcpdump_log.pl

index e665e29..a94af7f 100755 (executable)
@@ -528,6 +528,15 @@ sub handle_pcap_packet($$$)
        process_frame(\%frame);
 }
 
+my $pcap_descr;
+sub sigint_handler {
+       # Close pcap gracefully after CTRL/C
+       if ($pcap_descr) {
+               Net::Pcap::close($pcap_descr);
+               print "End of capture.\n";
+               exit(0);
+       }
+}
 
 # Main program, reading from a file. A small change is needed to allow it to
 # accept a pipe
@@ -555,17 +564,23 @@ if (!$pcap) {
 } else {
        my $err;
 
-       $pcap = Net::Pcap::open_live($device, 65535, 0, 1000, \$err);
+       $pcap_descr = Net::Pcap::open_live($device, 65535, 0, 1000, \$err);
        die $err if ($err);
 
-       my $dl = Net::Pcap::datalink($pcap);
+       # Trap  signals to exit nicely
+       $SIG{HUP} = \&sigint_handler;
+       $SIG{INT} = \&sigint_handler;
+       $SIG{QUIT} = \&sigint_handler;
+       $SIG{TERM} = \&sigint_handler;
+
+       my $dl = Net::Pcap::datalink($pcap_descr);
        if ($dl != 220) {
                printf"Link type %d\n", $dl;
                die "ERROR: Link type is not USB";
        }
 
-       Net::Pcap::loop($pcap, -1, \&handle_pcap_packet, '');
-       Net::Pcap::close($pcap);
+       Net::Pcap::loop($pcap_descr, -1, \&handle_pcap_packet, '');
+       Net::Pcap::close($pcap_descr);
        die $err;
 }