From eee40b92a38fa8c6a0308d7b17f2196f06410650 Mon Sep 17 00:00:00 2001
From: Dmitriy Vorotnikov <vorotnikovdk@yandex.ru>
Date: Wed, 2 Mar 2016 13:08:08 +0600
Subject: [PATCH] Allow L2pcapListenSocket.recv() to return None if where is no
 captured packets. Make sniff() to continue loop if received pkt is None
 (issue #74)

---
 scapy/arch/pcapdnet.py | 29 +++++++++++++----------------
 scapy/sendrecv.py      |  2 +-
 2 files changed, 14 insertions(+), 17 deletions(-)

diff --git a/scapy/arch/pcapdnet.py b/scapy/arch/pcapdnet.py
index c3333b0f..c608b70b 100755
--- a/scapy/arch/pcapdnet.py
+++ b/scapy/arch/pcapdnet.py
@@ -203,7 +203,7 @@ if conf.use_winpcapy:
           else:
               cls = conf.default_l2
               warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name))
-  
+
           pkt = None
           while pkt is None:
               pkt = self.ins.next()
@@ -438,23 +438,20 @@ if conf.use_pcap:
                     cls = conf.default_l2
                     warning("Unable to guess datalink type (interface=%s linktype=%i). Using %s" % (self.iface, ll, cls.name))
         
-                pkt = None
-                while pkt is None:
-                    pkt = self.ins.next()
-                    if pkt is not None:
-                        ts,pkt = pkt
-                    if scapy.arch.WINDOWS and pkt is None:
+                pkt = self.ins.next()
+                if scapy.arch.WINDOWS and pkt is None:
                         raise PcapTimeoutElapsed
-                
-                try:
-                    pkt = cls(pkt)
-                except KeyboardInterrupt:
-                    raise
-                except:
-                    if conf.debug_dissector:
+                if pkt is not None:
+                    ts,pkt = pkt
+                    try:
+                        pkt = cls(pkt)
+                    except KeyboardInterrupt:
                         raise
-                    pkt = conf.raw_layer(pkt)
-                pkt.time = ts
+                    except:
+                        if conf.debug_dissector:
+                            raise
+                        pkt = conf.raw_layer(pkt)
+                    pkt.time = ts
                 return pkt
         
             def send(self, x):
diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py
index f24591f2..ee7aaca9 100644
--- a/scapy/sendrecv.py
+++ b/scapy/sendrecv.py
@@ -585,7 +585,7 @@ stop_filter: python function applied to each packet to determine
             if s in sel[0]:
                 p = s.recv(MTU)
                 if p is None:
-                    break
+                    continue
                 if lfilter and not lfilter(p):
                     continue
                 if store:
-- 
GitLab