Roman Pišl : wpcap: Implement pcap_dispatch.
Alexandre Julliard
julliard at winehq.org
Thu Jul 7 17:03:26 CDT 2022
Module: wine
Branch: master
Commit: 556077e674ce4a44bf1ae2ea2e4dd5b2501ce175
URL: https://source.winehq.org/git/wine.git/?a=commit;h=556077e674ce4a44bf1ae2ea2e4dd5b2501ce175
Author: Roman Pišl <rpisl at seznam.cz>
Date: Tue Jul 5 12:11:03 2022 +0200
wpcap: Implement pcap_dispatch.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53104
Signed-off-by: Roman Pišl <rpisl at seznam.cz>
Signed-off-by: André Zwing <nerv at dawncrow.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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..df35954bfa7 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 = NULL;
+ const unsigned char *data = NULL;
+
+ 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;
More information about the wine-cvs
mailing list