Skip to content

Instantly share code, notes, and snippets.

@fiorix
Created October 16, 2014 00:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fiorix/433bd0bd8e74c3933a1f to your computer and use it in GitHub Desktop.
Save fiorix/433bd0bd8e74c3933a1f to your computer and use it in GitHub Desktop.
diff --git a/examples/httpassembly/main.go b/examples/httpassembly/main.go
index 51ead6e..28c2a63 100644
--- a/examples/httpassembly/main.go
+++ b/examples/httpassembly/main.go
@@ -11,17 +11,18 @@ package main
import (
"bufio"
+ "flag"
+ "io"
+ "log"
+ "net/http"
+ "time"
+
"code.google.com/p/gopacket"
"code.google.com/p/gopacket/examples/util"
"code.google.com/p/gopacket/layers"
"code.google.com/p/gopacket/pcap"
"code.google.com/p/gopacket/tcpassembly"
"code.google.com/p/gopacket/tcpassembly/tcpreader"
- "flag"
- "io"
- "log"
- "net/http"
- "time"
)
var iface = flag.String("i", "eth0", "Interface to get packets from")
@@ -72,27 +73,23 @@ func (h *httpStream) run() {
func main() {
defer util.Run()()
- log.Printf("starting capture on interface %q", *iface)
-
var handle *pcap.Handle
var err error
// Set up pcap packet capture
if *fname != "" {
log.Printf("Reading from pcap dump %q", *fname)
- if handle, err = pcap.OpenOffline(*fname); err != nil {
- log.Fatal("PCAP OpenOffline error:", err)
- }
+ handle, err = pcap.OpenOffline(*fname)
} else {
- log.Printf("starting capture on interface %q", *iface)
- if handle, err = pcap.OpenLive(*iface, int32(*snaplen), true, pcap.BlockForever); err != nil {
- log.Fatal("error:", err)
- }
-
+ log.Printf("Starting capture on interface %q", *iface)
+ handle, err = pcap.OpenLive(*iface, int32(*snaplen), true, pcap.BlockForever)
+ }
+ if err != nil {
+ log.Fatal(err)
}
if err := handle.SetBPFFilter(*filter); err != nil {
- panic(err)
+ log.Fatal(err)
}
// Set up assembly
@@ -108,6 +105,10 @@ func main() {
for {
select {
case packet := <-packets:
+ // A nil packet indicates the end of a pcap file.
+ if packet == nil {
+ return
+ }
if *logAllPackets {
log.Println(packet)
}
diff --git a/pcap/pcap.go b/pcap/pcap.go
index 4102dba..2767e5f 100644
--- a/pcap/pcap.go
+++ b/pcap/pcap.go
@@ -390,17 +390,25 @@ func (p *Handle) ListDataLinks() (datalinks []Datalink, err error) {
// SetBPFFilter compiles and sets a BPF filter for the pcap handle.
func (p *Handle) SetBPFFilter(expr string) (err error) {
- dev := C.CString(p.device)
- defer C.free(unsafe.Pointer(dev))
-
errorBuf := (*C.char)(C.calloc(errorBufferSize, 1))
defer C.free(unsafe.Pointer(errorBuf))
var netp uint32
var maskp uint32
- if -1 == C.pcap_lookupnet(dev, (*C.bpf_u_int32)(unsafe.Pointer(&netp)), (*C.bpf_u_int32)(unsafe.Pointer(&maskp)), errorBuf) {
- return errors.New(C.GoString(errorBuf))
+ // Only do the lookup on network interfaces.
+ // No device indicates we're handling a pcap file.
+ if len(p.device) > 0 {
+ dev := C.CString(p.device)
+ defer C.free(unsafe.Pointer(dev))
+ if -1 == C.pcap_lookupnet(
+ dev,
+ (*C.bpf_u_int32)(unsafe.Pointer(&netp)),
+ (*C.bpf_u_int32)(unsafe.Pointer(&maskp)),
+ errorBuf,
+ ) {
+ return errors.New(C.GoString(errorBuf))
+ }
}
var bpf _Ctype_struct_bpf_program
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment