Skip to content

Commit 3a8faeb

Browse files
committed
Add a wrapper around pcap_dump_open, pcap_dump_close, pcap_dump
1 parent 15b0bc8 commit 3a8faeb

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

pcap/pcap.go

+52
Original file line numberDiff line numberDiff line change
@@ -479,3 +479,55 @@ func (p *Handle) SetTimestampSource(t TimestampSource) error {
479479
}
480480
return nil
481481
}
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

Comments
 (0)