@@ -479,3 +479,55 @@ func (p *Handle) SetTimestampSource(t TimestampSource) error {
479
479
}
480
480
return nil
481
481
}
482
+
483
+ // DumpOpen open a PCAP file where packets will be
484
+ // dumped next. Please note only one dump per Handle
485
+ // could be open.
486
+ func (p * Handle ) DumpOpen (file string ) (err error ) {
487
+ if p .cptr != nil {
488
+ return fmt .Errorf ("a dump is already open" )
489
+ }
490
+
491
+ fn := C .CString (file )
492
+ defer C .free (unsafe .Pointer (fn ))
493
+
494
+ p .cptr = C .pcap_dump_open (p .cptr , fn )
495
+ if p .cptr == nil {
496
+ return fmt .Errorf ("unable to open %s" , file )
497
+ }
498
+ return
499
+ }
500
+
501
+ // DumpClose close the PCAP file previously open
502
+ // by DumpOpen
503
+ func (p * Handle ) DumpClose () (err error ) {
504
+ if p .cptr == nil {
505
+ return fmt .Errorf ("a dump is not open" )
506
+ }
507
+
508
+ C .pcap_dump_close (p .cptr )
509
+ p .cptr = nil
510
+
511
+ return
512
+ }
513
+
514
+ // Dump write the packet in the PCAP file opened
515
+ // by DumpOpen
516
+ func (p * Handle ) Dump (pkt gopacket.Packet ) (err error ) {
517
+ if p .cptr == nil {
518
+ return fmt .Errorf ("a dump is not open" )
519
+ }
520
+
521
+ var _pkthdr C.struct_pcap_pkthdr
522
+ _pkthdr .ts .tv_sec = (C .__time_t )(pkt .Metadata ().Timestamp .Unix ())
523
+ _pkthdr .ts .tv_usec = (C .__suseconds_t )(pkt .Metadata ().Timestamp .Nanosecond ())
524
+ _pkthdr .caplen = (C .bpf_u_int32 )(pkt .Metadata ().CaptureLength )
525
+ _pkthdr .len = (C .bpf_u_int32 )(pkt .Metadata ().Length )
526
+
527
+ packetData := pkt .Data ()
528
+
529
+ C .pcap_dump ((* C .u_char )(unsafe .Pointer (p .cptr )),
530
+ & _pkthdr , (* C .u_char )(unsafe .Pointer (& packetData )))
531
+
532
+ return
533
+ }
0 commit comments