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;