[PATCH 2/2] wpcap: Implement pcap_dispatch.

Roman Pišl rpisl at seznam.cz
Sat Jul 2 06:18:26 CDT 2022


Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53104
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
 dlls/wpcap/wpcap.c | 41 ++++++++++++++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 9 deletions(-)

diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c
index a295819f7fe..c5a4b391af5 100644
--- a/dlls/wpcap/wpcap.c
+++ b/dlls/wpcap/wpcap.c
@@ -99,15 +99,6 @@ const char * CDECL pcap_datalink_val_to_name( int link )
     return ret;
 }
 
-int CDECL pcap_dispatch( struct pcap *pcap, int count,
-                         void (CALLBACK *callback)(unsigned char *, const struct pcap_pkthdr_win32 *, const unsigned char *),
-                         unsigned char *user )
-{
-    /* FIXME: reimplement on top of pcap_next_ex */
-    FIXME( "%p, %d, %p, %p: not implemented\n", pcap, count, callback, user );
-    return -1;
-}
-
 void CDECL pcap_dump( unsigned char *user, const struct pcap_pkthdr_win32 *hdr, const unsigned char *packet )
 {
     struct dump_params params = { user, hdr, packet };
@@ -543,6 +534,38 @@ const unsigned char * CDECL pcap_next( struct pcap *pcap, struct pcap_pkthdr_win
     return data;
 }
 
+int CDECL pcap_dispatch( struct pcap *pcap, int count,
+                         void (CALLBACK *callback)(unsigned char *, const struct pcap_pkthdr_win32 *, const unsigned char *),
+                         unsigned char *user )
+{
+    int processed = 0;
+    TRACE( "%p, %d, %p, %p\n", pcap, count, callback, user );
+
+    while (processed < count)
+    {
+        struct pcap_pkthdr_win32 *hdr = 0;
+        const unsigned char *data = 0;
+
+        int ret = pcap_next_ex( pcap, &hdr, &data );
+
+        if (ret == 1)
+            processed++;
+        else if (ret == 0)
+            break;
+        else if (ret == -2)
+        {
+            if (processed == 0) return -2;
+            break;
+        }
+        else
+            return ret;
+
+        (*callback)( user, hdr, data );
+    }
+
+    return processed;
+}
+
 static char *strdupWA( const WCHAR *src )
 {
     char *dst;
-- 
2.30.2




More information about the wine-devel mailing list