<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/fa7b3c195c4b066af5bbbaa0386568fb508e7540">https://github.com/macports/macports-ports/commit/fa7b3c195c4b066af5bbbaa0386568fb508e7540</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit fa7b3c195c4b066af5bbbaa0386568fb508e7540
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Fri Oct 21 00:06:06 2022 +1100
<span style='display:block; white-space:pre;color:#404040;'> py-pypcap: add py310 subport
</span>---
python/py-pypcap/Portfile | 23 ++++++---
.../files/{patch-pcap.pyx => pcap.pyx.patch} | 58 +++++++++++++++-------
python/py-pypcap/files/py3.patch | 39 +++++++++++++++
.../files/{patch-setup.py.diff => setup.py.patch} | 13 +++--
4 files changed, 104 insertions(+), 29 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-pypcap/Portfile b/python/py-pypcap/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 7f618858018..203b00c9306 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-pypcap/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-pypcap/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -10,7 +10,6 @@ license BSD
</span> maintainers gmail.com:andrew.reusch openmaintainer
description python extension module for libpcap
long_description A simplified object-oriented Python extension module for libpcap
<span style='display:block; white-space:pre;background:#ffe0e0;'>-platforms darwin
</span>
homepage https://code.google.com/p/pypcap/
master_sites googlecode:pypcap
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -20,21 +19,31 @@ checksums md5 034c3cbbfa81aa19e8f685b767c65764 \
</span> sha1 966f62deca16d5086e2ef6694b0c795f273da15c \
rmd160 119dcc393d42678e6fa8f0b0f8b82536ab1efb13
<span style='display:block; white-space:pre;background:#ffe0e0;'>-python.versions 27
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+python.versions 27 310
</span>
if {$subport ne $name} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- patchfiles patch-setup.py.diff patch-pcap.pyx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_build-append port:py${python.version}-cython
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ depends_lib-append port:libpcap
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- pre-configure {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- system -W ${worksrcpath} "${python.prefix}/bin/pyrexc pcap.pyx"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles setup.py.patch pcap.pyx.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${python.version} >= 36} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ python.pep517 yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles-append py3.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ post-patch {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ system -W ${worksrcpath} "${python.prefix}/bin/2to3 --write --nobackups setup.py"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ pre-configure {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ system -W ${worksrcpath} "${python.prefix}/bin/cythonize pcap.pyx"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> use_configure yes
configure.cmd ${python.bin} setup.py
configure.args config
configure.pre_args
configure.post_args --with-pcap="${prefix}"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- depends_build port:py${python.version}-pyrex
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- depends_lib-append port:libpcap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ build.env-append SETUP_PY_LOAD_PCAP_CONFIG=1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ destroot.env-append SETUP_PY_LOAD_PCAP_CONFIG=1
</span> }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-pypcap/files/patch-pcap.pyx b/python/py-pypcap/files/pcap.pyx.patch
</span>similarity index 82%
rename from python/py-pypcap/files/patch-pcap.pyx
rename to python/py-pypcap/files/pcap.pyx.patch
<span style='display:block; white-space:pre;color:#808080;'>index 763ad1d97b3..93528bd2348 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-pypcap/files/patch-pcap.pyx
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-pypcap/files/pcap.pyx.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- ./pcap.pyx.orig 2011-10-01 22:35:33.141146678 -0400
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ ./pcap.pyx 2011-10-01 22:35:39.416147272 -0400
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- pcap.pyx.orig 2005-10-17 09:00:11.000000000 +1000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ pcap.pyx 2022-10-20 22:52:38.000000000 +1100
</span> @@ -1,7 +1,7 @@
#
# pcap.pyx
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,7 +9,7 @@
</span>
"""packet capture library
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -17,9 +17,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -17,13 +17,13 @@
</span> __version__ = '1.1'
import sys
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -20,8 +20,12 @@
</span> + int PyObject_AsCharBuffer(object obj, char **buffer, int *buffer_len)
int PyGILState_Ensure()
void PyGILState_Release(int gil)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- void Py_BEGIN_ALLOW_THREADS()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -42,6 +44,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void Py_BEGIN_ALLOW_THREADS()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- void Py_END_ALLOW_THREADS()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cdef extern from "pcap.h":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct bpf_insn:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -42,6 +42,10 @@
</span> unsigned int caplen
ctypedef struct pcap_t:
int __xxx
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -32,7 +36,7 @@
</span>
ctypedef void (*pcap_handler)(void *arg, pcap_pkthdr *hdr, char *pkt)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -62,6 +68,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -62,6 +66,13 @@
</span> char *pcap_geterr(pcap_t *p)
void pcap_close(pcap_t *p)
int bpf_filter(bpf_insn *insns, char *buf, int len, int caplen)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -46,7 +50,16 @@
</span>
cdef extern from "pcap_ex.h":
# XXX - hrr, sync with libdnet and libevent
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -134,16 +147,18 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -72,7 +83,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pcap_ex_setup(pcap_t *p)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void pcap_ex_setnonblock(pcap_t *p, int nonblock, char *ebuf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int pcap_ex_getnonblock(pcap_t *p, char *ebuf)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- int pcap_ex_next(pcap_t *p, pcap_pkthdr **hdr, char **pkt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int pcap_ex_next(pcap_t *p, pcap_pkthdr **hdr, char **pkt) nogil
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int pcap_ex_compile_nopcap(int snaplen, int dlt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ bpf_program *fp, char *str,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int optimize, unsigned int netmask)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -134,16 +145,18 @@
</span> raise IOError, 'bad filter'
def filter(self, buf):
"""Return boolean match for buf against our filter."""
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -68,7 +81,7 @@
</span>
Open a handle to a packet capture descriptor.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -152,6 +167,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -152,6 +165,9 @@
</span> or None to open the first available up interface
snaplen -- maximum number of bytes to capture for each packet
promisc -- boolean to specify promiscuous mode sniffing
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -78,7 +91,7 @@
</span> immediate -- disable buffering, if possible
"""
cdef pcap_t *__pcap
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -161,7 +179,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -161,7 +177,7 @@
</span> cdef int __dloff
def __init__(self, name=None, snaplen=65535, promisc=True,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -87,7 +100,7 @@
</span> global dltoff
cdef char *p
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -171,7 +189,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -171,7 +187,7 @@
</span> raise OSError, self.__ebuf
else:
p = name
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -96,7 +109,7 @@
</span> self.__pcap = pcap_open_offline(p, self.__ebuf)
if not self.__pcap:
self.__pcap = pcap_open_live(pcap_ex_name(p), snaplen, promisc,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -184,7 +202,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -184,7 +200,7 @@
</span> try: self.__dloff = dltoff[pcap_datalink(self.__pcap)]
except KeyError: pass
if immediate and pcap_ex_immediate(self.__pcap) < 0:
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -105,7 +118,7 @@
</span>
property name:
"""Network interface or dumpfile name."""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -243,16 +261,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -243,16 +259,6 @@
</span> """Return datalink type (DLT_* values)."""
return pcap_datalink(self.__pcap)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -122,7 +135,7 @@
</span> def __add_pkts(self, ts, pkt, pkts):
pkts.append((ts, pkt))
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -288,18 +296,24 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -288,30 +294,47 @@
</span> raise exc[0], exc[1], exc[2]
return n
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -149,8 +162,11 @@
</span> + i = 1
pcap_ex_setup(self.__pcap)
while 1:
<span style='display:block; white-space:pre;background:#ffe0e0;'>- Py_BEGIN_ALLOW_THREADS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -308,10 +322,22 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Py_BEGIN_ALLOW_THREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- n = pcap_ex_next(self.__pcap, &hdr, &pkt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Py_END_ALLOW_THREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ with nogil:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ n = pcap_ex_next(self.__pcap, &hdr, &pkt)
</span> if n == 1:
callback(hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
PyBuffer_FromMemory(pkt, hdr.caplen), *args)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -173,7 +189,15 @@
</span>
def geterr(self):
"""Return the last error message associated with this handle."""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -340,6 +366,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -334,12 +357,13 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cdef char *pkt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cdef int n
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ while 1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Py_BEGIN_ALLOW_THREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- n = pcap_ex_next(self.__pcap, &hdr, &pkt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- Py_END_ALLOW_THREADS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ with nogil:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ n = pcap_ex_next(self.__pcap, &hdr, &pkt)
</span> if n == 1:
return (hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
PyBuffer_FromMemory(pkt, hdr.caplen))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -182,7 +206,7 @@
</span> elif n == -1:
raise KeyboardInterrupt
elif n == -2:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -364,3 +392,36 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -364,3 +388,36 @@
</span> raise OSError, ebuf
return p
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-pypcap/files/py3.patch b/python/py-pypcap/files/py3.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..df530fcf01a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-pypcap/files/py3.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,39 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- pcap.pyx.orig 2022-10-20 23:22:40.000000000 +1100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ pcap.pyx 2022-10-20 23:25:38.000000000 +1100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -20,7 +20,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ import struct
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cdef extern from "Python.h":
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- object PyBuffer_FromMemory(char *s, int len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int PyBUF_WRITE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ object PyMemoryView_FromMemory(char *mem, Py_ssize_t size, int flags)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int PyObject_AsCharBuffer(object obj, char **buffer, int *buffer_len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int PyGILState_Ensure()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void PyGILState_Release(int gil)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -104,7 +105,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ gil = PyGILState_Ensure()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ try:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (<object>ctx.callback)(hdr.ts.tv_sec + (hdr.ts.tv_usec/1000000.0),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- PyBuffer_FromMemory(pkt, hdr.caplen),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ PyMemoryView_FromMemory(pkt, hdr.caplen, PyBUF_WRITE),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *(<object>ctx.args))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ except:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ctx.got_exc = 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -318,7 +319,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n = pcap_ex_next(self.__pcap, &hdr, &pkt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if n == 1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ callback(hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- PyBuffer_FromMemory(pkt, hdr.caplen), *args)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ PyMemoryView_FromMemory(pkt, hdr.caplen, PyBUF_WRITE), *args)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ elif n == 0:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ elif n == -1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -361,7 +362,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ n = pcap_ex_next(self.__pcap, &hdr, &pkt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if n == 1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- PyBuffer_FromMemory(pkt, hdr.caplen))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ PyMemoryView_FromMemory(pkt, hdr.caplen, PyBUF_WRITE))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ elif n == 0:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return None
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ elif n == -1:
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/python/py-pypcap/files/patch-setup.py.diff b/python/py-pypcap/files/setup.py.patch
</span>similarity index 59%
rename from python/py-pypcap/files/patch-setup.py.diff
rename to python/py-pypcap/files/setup.py.patch
<span style='display:block; white-space:pre;color:#808080;'>index 82f072701b1..4b4d32226d6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/python/py-pypcap/files/patch-setup.py.diff
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/python/py-pypcap/files/setup.py.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,5 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- setup.py.orig 2011-01-25 10:56:52.000000000 -0800
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ setup.py 2011-01-25 11:19:36.000000000 -0800
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- setup.py.orig 2005-10-17 09:07:03.000000000 +1000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ setup.py 2022-10-20 23:51:20.000000000 +1100
</span> @@ -42,7 +42,7 @@
dirs = [ '/usr', sys.prefix ] + glob.glob('/opt/libpcap*') + \
glob.glob('../libpcap*') + glob.glob('../wpdpack*')
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,12 +9,15 @@
</span> incdirs = [ os.path.join(d, sd) ]
if os.path.exists(os.path.join(d, sd, 'pcap.h')):
cfg['include_dirs'] = [ os.path.join(d, sd) ]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -75,7 +75,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -75,9 +75,9 @@
</span> print "removing '%s'" % pcap_cache
os.unlink(pcap_cache)
-if len(sys.argv) > 1 and sys.argv[1] == 'build':
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+if len(sys.argv) > 1 and ('build' in sys.argv or 'install' in sys.argv):
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++if (len(sys.argv) > 1 and ('build' in sys.argv or 'install' in sys.argv)) or "SETUP_PY_LOAD_PCAP_CONFIG" in os.environ:
</span> try:
<span style='display:block; white-space:pre;background:#ffe0e0;'>- pcap_config = cPickle.load(open(pcap_cache))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- pcap_config = cPickle.load(open(pcap_cache))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pcap_config = cPickle.load(open(pcap_cache, 'rb'))
</span> except IOError:
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ print >>sys.stderr, 'run "%s config" first!' % sys.argv[0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sys.exit(1)
</span></pre><pre style='margin:0'>
</pre>