Created
October 16, 2014 00:01
-
-
Save fiorix/433bd0bd8e74c3933a1f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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