[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