[PATCH v2] wpcap: Implement pcap_dispatch.

André Zwing nerv at dawncrow.de
Wed Jul 6 14:12:27 CDT 2022


Am 05.07.22 um 12:11 schrieb Roman Pišl:
> 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..1a245ab4917 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;


Signed-off-by: André Zwing <nerv at dawncrow.de>




More information about the wine-devel mailing list