summaryrefslogtreecommitdiff
path: root/net/py-pcap/patches/patch-ac
blob: 867cebc0d3687ff3ab97ac99c490265e276e20bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
$NetBSD: patch-ac,v 1.1.1.1 2010/03/13 10:20:53 pettai Exp $

# Apply in SVN repo fixes
#

--- pcap.pyx.orig	2005-10-17 01:00:11.000000000 +0200
+++ pcap.pyx	2010-02-14 17:49:27.000000000 +0100
@@ -20,6 +20,7 @@
 
 cdef extern from "Python.h":
     object PyBuffer_FromMemory(char *s, int len)
+    int    PyObject_AsCharBuffer(object obj, char **buffer, int *buffer_len)
     int    PyGILState_Ensure()
     void   PyGILState_Release(int gil)
     void   Py_BEGIN_ALLOW_THREADS()
@@ -134,16 +135,18 @@
             raise IOError, 'bad filter'
     def filter(self, buf):
         """Return boolean match for buf against our filter."""
+        cdef char *p
         cdef int n
-        n = len(buf)
-        if bpf_filter(self.fcode.bf_insns, buf, n, n) == 0:
+        if PyObject_AsCharBuffer(buf, &p, &n) < 0:
+            raise TypeError
+        if bpf_filter(self.fcode.bf_insns, p, n, n) == 0:
             return False
         return True
     def __dealloc__(self):
         pcap_freecode(&self.fcode)
             
 cdef class pcap:
-    """pcap(name=None, snaplen=65535, promisc=True, immediate=False) -> packet capture object
+    """pcap(name=None, snaplen=65535, promisc=True, immediate=False, timeout_ms=None) -> packet capture object
     
     Open a handle to a packet capture descriptor.
     
@@ -153,15 +156,19 @@
     snaplen   -- maximum number of bytes to capture for each packet
     promisc   -- boolean to specify promiscuous mode sniffing
     immediate -- disable buffering, if possible
+    timeout_ms -- requests for the next packet will return None if the timeout
+                  (in milliseconds) is reached and no packets were received
+                  (Default: no timeout)
     """
     cdef pcap_t *__pcap
     cdef char *__name
     cdef char *__filter
     cdef char __ebuf[256]
     cdef int __dloff
+    cdef int __timeout_returns_none
     
     def __init__(self, name=None, snaplen=65535, promisc=True,
-                 timeout_ms=500, immediate=False):
+                 timeout_ms=None, immediate=False):
         global dltoff
         cdef char *p
         
@@ -172,6 +179,12 @@
         else:
             p = name
         
+        if timeout_ms is None:
+            timeout_ms = 500
+            self.__timeout_returns_none = 0
+        else:
+            self.__timeout_returns_none = 1
+
         self.__pcap = pcap_open_offline(p, self.__ebuf)
         if not self.__pcap:
             self.__pcap = pcap_open_live(pcap_ex_name(p), snaplen, promisc,
@@ -340,6 +353,8 @@
             if n == 1:
                 return (hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0),
                         PyBuffer_FromMemory(pkt, hdr.caplen))
+            elif n == 0 and self.__timeout_returns_none == 1:
+                return (hdr.ts.tv_sec + (hdr.ts.tv_usec / 1000000.0), None)
             elif n == -1:
                 raise KeyboardInterrupt
             elif n == -2: