2020from  scapy .data  import  ETH_P_ALL 
2121from  scapy .config  import  conf 
2222from  scapy .error  import  warning 
23- from  scapy .packet  import  Gen 
23+ from  scapy .packet  import  Gen ,  Packet 
2424from  scapy .utils  import  get_temp_file , tcpdump , wrpcap , \
2525    ContextManagerSubprocess , PcapReader 
2626from  scapy .plist  import  PacketList , SndRcvList 
@@ -772,7 +772,8 @@ def _run(self,
772772                message  =  "tcpdump is not available. Cannot use filter!" 
773773                raise  Scapy_Exception (message )
774774
775-             if  isinstance (offline , list ):
775+             if  isinstance (offline , list ) and  \
776+                     all (isinstance (elt , str ) for  elt  in  offline ):
776777                sniff_sockets .update ((PcapReader (
777778                    fname  if  flt  is  None  else 
778779                    tcpdump (fname , args = ["-w" , "-" , flt ], getfd = True )
@@ -783,6 +784,18 @@ def _run(self,
783784                    tcpdump (fname , args = ["-w" , "-" , flt ], getfd = True )
784785                ), label ) for  fname , label  in  six .iteritems (offline ))
785786            else :
787+                 # Write Scapy Packet objects to a pcap file 
788+                 def  _write_to_pcap (packets_list ):
789+                     filename  =  get_temp_file (autoext = ".pcap" )
790+                     wrpcap (filename , offline )
791+                     return  filename , filename 
792+ 
793+                 if  isinstance (offline , Packet ):
794+                     tempfile_written , offline  =  _write_to_pcap ([offline ])
795+                 elif  isinstance (offline , list ) and  \
796+                         all (isinstance (elt , Packet ) for  elt  in  offline ):
797+                     tempfile_written , offline  =  _write_to_pcap (offline )
798+ 
786799                sniff_sockets [PcapReader (
787800                    offline  if  flt  is  None  else 
788801                    tcpdump (offline , args = ["-w" , "-" , flt ], getfd = True )
0 commit comments