From: Hans Leidekker hans@codeweavers.com
--- dlls/wpcap/wpcap.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-)
diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c index d1c05ed0c01..2a3be168fdf 100644 --- a/dlls/wpcap/wpcap.c +++ b/dlls/wpcap/wpcap.c @@ -909,15 +909,6 @@ int CDECL pcap_lookupnet( const char *device, unsigned int *net, unsigned int *m return ret; }
-int CDECL pcap_loop( 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; -} - int CDECL pcap_major_version( struct pcap *pcap ) { struct major_version_params params; @@ -1001,6 +992,39 @@ int CDECL pcap_dispatch( struct pcap *pcap, int count, return processed; }
+int CDECL pcap_loop( 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) + continue; + else if (ret == PCAP_ERROR_BREAK) + { + if (processed == 0) return PCAP_ERROR_BREAK; + break; + } + else + return ret; + + callback( user, hdr, data ); + } + + return processed; +} + struct pcap * CDECL pcap_create( const char *source, char *errbuf ) { struct pcap *ret;