From: Aida Jonikienė aidas957@gmail.com
Based on a staging patch by André Zwing. --- configure | 51 ++++++---- configure.ac | 4 +- dlls/wpcap/Makefile.in | 1 - dlls/wpcap/unixlib.c | 224 ++++++++++++++++++++++++++++++++--------- dlls/wpcap/unixlib.h | 2 + dlls/wpcap/wpcap.c | 3 + include/config.h.in | 3 + 7 files changed, 218 insertions(+), 70 deletions(-)
diff --git a/configure b/configure index 17a6d982075..cc53610cc97 100755 --- a/configure +++ b/configure @@ -701,7 +701,6 @@ DBUS_CFLAGS INOTIFY_LIBS INOTIFY_CFLAGS PCSCLITE_LIBS -PCAP_LIBS WAYLAND_EGL_LIBS WAYLAND_EGL_CFLAGS EGL_LIBS @@ -5974,11 +5973,11 @@ if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } -if test ${ac_cv_prog_cxx_cxx11+y} +if test ${ac_cv_prog_cxx_11+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_cxx11=no + ac_cv_prog_cxx_11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -6020,11 +6019,11 @@ if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } -if test ${ac_cv_prog_cxx_cxx98+y} +if test ${ac_cv_prog_cxx_98+y} then : printf %s "(cached) " >&6 else $as_nop - ac_cv_prog_cxx_cxx98=no + ac_cv_prog_cxx_98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ @@ -16454,15 +16453,15 @@ fi
if test "$ac_cv_header_pcap_pcap_h" = "yes" then - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pcap_init in -lpcap" >&5 -printf %s "checking for pcap_init in -lpcap... " >&6; } -if test ${ac_cv_lib_pcap_pcap_init+y} + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -lpcap" >&5 +printf %s "checking for -lpcap... " >&6; } +if test ${ac_cv_lib_soname_pcap+y} then : printf %s "(cached) " >&6 else $as_nop - ac_check_lib_save_LIBS=$LIBS + ac_check_soname_save_LIBS=$LIBS LIBS="-lpcap $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error. @@ -16479,24 +16478,37 @@ return pcap_init (); _ACEOF if ac_fn_c_try_link "$LINENO" then : - ac_cv_lib_pcap_pcap_init=yes + case "$LIBEXT" in + dll) ac_cv_lib_soname_pcap=`$ac_cv_path_LDD conftest.exe | grep "pcap" | sed -e "s/dll.*/dll/"';2,$d'` ;; + dylib) ac_cv_lib_soname_pcap=`$OTOOL -L conftest$ac_exeext | grep "libpcap\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*/(libpcap.[0-9A-Za-z.]*dylib).*$/\1/"';2,$d'` ;; + *) ac_cv_lib_soname_pcap=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libpcap\.$LIBEXT" | sed -e "s/^.*\[\(libpcap\.$LIBEXT[^ ]*\)\].*$/\1/"';2,$d'` + if ${ac_cv_lib_soname_pcap:+false} : +then : + ac_cv_lib_soname_pcap=`$LDD conftest$ac_exeext | grep "libpcap\.$LIBEXT" | sed -e "s/^.*(libpcap.$LIBEXT[^ ]*).*$/\1/"';2,$d'` +fi ;; + esac else $as_nop - ac_cv_lib_pcap_pcap_init=no + ac_cv_lib_soname_pcap= fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS + LIBS=$ac_check_soname_save_LIBS fi -{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_pcap_init" >&5 -printf "%s\n" "$ac_cv_lib_pcap_pcap_init" >&6; } -if test "x$ac_cv_lib_pcap_pcap_init" = xyes +if ${ac_cv_lib_soname_pcap:+false} : then : - PCAP_LIBS="-lpcap" + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +printf "%s\n" "not found" >&6; }
-fi +else $as_nop + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_pcap" >&5 +printf "%s\n" "$ac_cv_lib_soname_pcap" >&6; } + +printf "%s\n" "#define SONAME_LIBPCAP "$ac_cv_lib_soname_pcap"" >>confdefs.h
+ +fi fi -if test "x$ac_cv_lib_pcap_pcap_init" != xyes +if test "x$ac_cv_lib_soname_pcap" = x then : case "x$with_pcap" in x) as_fn_append wine_notices "|pcap ${notice_platform}development files not found, wpcap won't be supported." ;; @@ -24033,7 +24045,6 @@ EGL_CFLAGS = $EGL_CFLAGS EGL_LIBS = $EGL_LIBS WAYLAND_EGL_CFLAGS = $WAYLAND_EGL_CFLAGS WAYLAND_EGL_LIBS = $WAYLAND_EGL_LIBS -PCAP_LIBS = $PCAP_LIBS PCSCLITE_LIBS = $PCSCLITE_LIBS INOTIFY_CFLAGS = $INOTIFY_CFLAGS INOTIFY_LIBS = $INOTIFY_LIBS diff --git a/configure.ac b/configure.ac index b03bb12f303..84403890bfd 100644 --- a/configure.ac +++ b/configure.ac @@ -1393,9 +1393,9 @@ WINE_NOTICE_WITH(opencl,[test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" != xyes], dnl **** Check for libpcap **** if test "$ac_cv_header_pcap_pcap_h" = "yes" then - AC_CHECK_LIB(pcap,pcap_init,[AC_SUBST(PCAP_LIBS,["-lpcap"])]) + WINE_CHECK_SONAME(pcap,pcap_init,,,) fi -WINE_NOTICE_WITH(pcap,[test "x$ac_cv_lib_pcap_pcap_init" != xyes], +WINE_NOTICE_WITH(pcap,[test "x$ac_cv_lib_soname_pcap" = x], [pcap ${notice_platform}development files not found, wpcap won't be supported.], [enable_wpcap])
diff --git a/dlls/wpcap/Makefile.in b/dlls/wpcap/Makefile.in index 3dfc5e5b869..7495480e825 100644 --- a/dlls/wpcap/Makefile.in +++ b/dlls/wpcap/Makefile.in @@ -2,7 +2,6 @@ MODULE = wpcap.dll UNIXLIB = wpcap.so IMPORTS = iphlpapi DELAYIMPORTS = ws2_32 -UNIX_LIBS = $(PCAP_LIBS)
SOURCES = \ unixlib.c \ diff --git a/dlls/wpcap/unixlib.c b/dlls/wpcap/unixlib.c index 4f5c2337b10..024cbc224d5 100644 --- a/dlls/wpcap/unixlib.c +++ b/dlls/wpcap/unixlib.c @@ -30,6 +30,7 @@ #include <stdarg.h> #include <stdlib.h> #include <limits.h> +#include <dlfcn.h> #include "ntstatus.h" #define WIN32_NO_STATUS #include "windef.h" @@ -41,36 +42,154 @@ #include "unixlib.h"
WINE_DEFAULT_DEBUG_CHANNEL(wpcap); +WINE_DECLARE_DEBUG_CHANNEL(winediag); + +static void *pcap_handle; + +static int (*ppcap_activate)( pcap_t * ); +static void (*ppcap_breakloop)( pcap_t * ); +static int (*ppcap_bufsize)( pcap_t * ); +static int (*ppcap_can_set_rfmon)( pcap_t * ); +static void (*ppcap_close)( pcap_t * ); +static int (*ppcap_compile)( pcap_t *, struct bpf_program *, const char *, int, unsigned int ); +static pcap_t* (*ppcap_create)( const char *, char * ); +static int (*ppcap_datalink)( pcap_t * ); +static int (*ppcap_datalink_name_to_val)( const char * ); +static const char* (*ppcap_datalink_val_to_description)( int ); +static const char* (*ppcap_datalink_val_to_name)( int ); +static void (*ppcap_dump)( u_char *, const struct pcap_pkthdr *, const u_char * ); +static void (*ppcap_dump_close)( pcap_dumper_t * ); +static pcap_dumper_t* (*ppcap_dump_open)( pcap_t *, const char * ); +static int (*ppcap_findalldevs)( pcap_if_t **, char * ); +static void (*ppcap_free_datalinks)( int * ); +static void (*ppcap_free_tstamp_types)( int * ); +static void (*ppcap_freealldevs)( pcap_if_t * ); +static void (*ppcap_freecode)( struct bpf_program * ); +static int (*ppcap_get_tstamp_precision)( pcap_t * ); +static char* (*ppcap_geterr)( pcap_t * ); +static int (*ppcap_getnonblock)( pcap_t *, char * ); +static int (*ppcap_init)( unsigned int, char * ); +static const char* (*ppcap_lib_version)( void ); +static int (*ppcap_list_datalinks)( pcap_t *, int ** ); +static int (*ppcap_list_tstamp_types)( pcap_t *, int ** ); +static int (*ppcap_lookupnet)( const char *, unsigned int *, unsigned int *, char * ); +static int (*ppcap_major_version)( pcap_t * ); +static int (*ppcap_minor_version)( pcap_t * ); +static int (*ppcap_next_ex)( pcap_t *, struct pcap_pkthdr **, const u_char ** ); +static pcap_t* (*ppcap_open_live)( const char *, int, int, int, char * ); +static int (*ppcap_sendpacket)( pcap_t *, const u_char *, int ); +static int (*ppcap_set_buffer_size)( pcap_t *, int ); +static int (*ppcap_set_datalink)( pcap_t *, int ); +static int (*ppcap_set_promisc)( pcap_t *, int ); +static int (*ppcap_set_rfmon)( pcap_t *, int ); +static int (*ppcap_set_snaplen)( pcap_t *, int ); +static int (*ppcap_set_timeout)( pcap_t *, int ); +static int (*ppcap_set_tstamp_precision)( pcap_t *, int ); +static int (*ppcap_set_tstamp_type)( pcap_t *, int ); +static int (*ppcap_setfilter)( pcap_t *, struct bpf_program * ); +static int (*ppcap_setnonblock)( pcap_t *, int, char * ); +static int (*ppcap_snapshot)( pcap_t * ); +static int (*ppcap_stats)( pcap_t *, struct pcap_stat * ); +static int (*ppcap_tstamp_type_name_to_val)( const char * ); +static const char* (*ppcap_tstamp_type_val_to_description)( int ); +static const char* (*ppcap_tstamp_type_val_to_name)( int );
static NTSTATUS wrap_activate( void *args ) { const struct activate_params *params = args; - return pcap_activate( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_activate( (pcap_t *)(ULONG_PTR)params->handle ); +} + +static NTSTATUS wrap_attach( void *args ) +{ + if (!(pcap_handle = dlopen( SONAME_LIBPCAP, RTLD_NOW ))) + { + ERR_(winediag)( "failed to load %s\n", SONAME_LIBPCAP ); + return STATUS_DLL_NOT_FOUND; + } + +#define LOAD_FUNCPTR(f) \ + if (!(p##f = dlsym( pcap_handle, #f ))) \ + { \ + ERR_(winediag)( "%s not found in %s\n", #f, SONAME_LIBPCAP ); \ + return STATUS_DLL_NOT_FOUND; \ + } + + LOAD_FUNCPTR(pcap_activate); + LOAD_FUNCPTR(pcap_breakloop); + LOAD_FUNCPTR(pcap_bufsize); + LOAD_FUNCPTR(pcap_can_set_rfmon); + LOAD_FUNCPTR(pcap_close); + LOAD_FUNCPTR(pcap_compile); + LOAD_FUNCPTR(pcap_create); + LOAD_FUNCPTR(pcap_datalink); + LOAD_FUNCPTR(pcap_datalink_name_to_val); + LOAD_FUNCPTR(pcap_datalink_val_to_description); + LOAD_FUNCPTR(pcap_datalink_val_to_name); + LOAD_FUNCPTR(pcap_dump); + LOAD_FUNCPTR(pcap_dump_close); + LOAD_FUNCPTR(pcap_dump_open); + LOAD_FUNCPTR(pcap_findalldevs); + LOAD_FUNCPTR(pcap_free_datalinks); + LOAD_FUNCPTR(pcap_free_tstamp_types); + LOAD_FUNCPTR(pcap_freealldevs); + LOAD_FUNCPTR(pcap_freecode); + LOAD_FUNCPTR(pcap_get_tstamp_precision); + LOAD_FUNCPTR(pcap_geterr); + LOAD_FUNCPTR(pcap_getnonblock); + LOAD_FUNCPTR(pcap_init); + LOAD_FUNCPTR(pcap_lib_version); + LOAD_FUNCPTR(pcap_list_datalinks); + LOAD_FUNCPTR(pcap_list_tstamp_types); + LOAD_FUNCPTR(pcap_lookupnet); + LOAD_FUNCPTR(pcap_major_version); + LOAD_FUNCPTR(pcap_minor_version); + LOAD_FUNCPTR(pcap_next_ex); + LOAD_FUNCPTR(pcap_open_live); + LOAD_FUNCPTR(pcap_sendpacket); + LOAD_FUNCPTR(pcap_set_buffer_size); + LOAD_FUNCPTR(pcap_set_datalink); + LOAD_FUNCPTR(pcap_set_promisc); + LOAD_FUNCPTR(pcap_set_rfmon); + LOAD_FUNCPTR(pcap_set_snaplen); + LOAD_FUNCPTR(pcap_set_timeout); + LOAD_FUNCPTR(pcap_set_tstamp_precision); + LOAD_FUNCPTR(pcap_set_tstamp_type); + LOAD_FUNCPTR(pcap_setfilter); + LOAD_FUNCPTR(pcap_setnonblock); + LOAD_FUNCPTR(pcap_snapshot); + LOAD_FUNCPTR(pcap_stats); + LOAD_FUNCPTR(pcap_tstamp_type_name_to_val); + LOAD_FUNCPTR(pcap_tstamp_type_val_to_description); + LOAD_FUNCPTR(pcap_tstamp_type_val_to_name); +#undef LOAD_FUNCPTR + + return STATUS_SUCCESS; }
static NTSTATUS wrap_breakloop( void *args ) { const struct breakloop_params *params = args; - pcap_breakloop( (pcap_t *)(ULONG_PTR)params->handle ); + ppcap_breakloop( (pcap_t *)(ULONG_PTR)params->handle ); return STATUS_SUCCESS; }
static NTSTATUS wrap_bufsize( void *args ) { const struct bufsize_params *params = args; - return pcap_bufsize( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_bufsize( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_can_set_rfmon( void *args ) { const struct can_set_rfmon_params *params = args; - return pcap_can_set_rfmon( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_can_set_rfmon( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_close( void *args ) { const struct close_params *params = args; - pcap_close( (pcap_t *)(ULONG_PTR)params->handle ); + ppcap_close( (pcap_t *)(ULONG_PTR)params->handle ); return STATUS_SUCCESS; }
@@ -80,13 +199,13 @@ static NTSTATUS wrap_compile( void *args ) struct bpf_program program; int ret;
- if (!(ret = pcap_compile( (pcap_t *)(ULONG_PTR)params->handle, &program, params->str, params->optimize, + if (!(ret = ppcap_compile( (pcap_t *)(ULONG_PTR)params->handle, &program, params->str, params->optimize, params->mask ))) { if (*params->program_len < program.bf_len) ret = STATUS_BUFFER_TOO_SMALL; else memcpy( params->program_insns, program.bf_insns, program.bf_len * sizeof(*program.bf_insns) ); *params->program_len = program.bf_len; - pcap_freecode( &program ); + ppcap_freecode( &program ); } return ret; } @@ -94,26 +213,26 @@ static NTSTATUS wrap_compile( void *args ) static NTSTATUS wrap_create( void *args ) { struct create_params *params = args; - if (!(*params->handle = (ULONG_PTR)pcap_create( params->source, params->errbuf ))) return STATUS_NO_MEMORY; + if (!(*params->handle = (ULONG_PTR)ppcap_create( params->source, params->errbuf ))) return STATUS_NO_MEMORY; return STATUS_SUCCESS; }
static NTSTATUS wrap_datalink( void *args ) { struct datalink_params *params = args; - return pcap_datalink( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_datalink( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_datalink_name_to_val( void *args ) { struct datalink_name_to_val_params *params = args; - return pcap_datalink_name_to_val( params->name ); + return ppcap_datalink_name_to_val( params->name ); }
static NTSTATUS wrap_datalink_val_to_description( void *args ) { const struct datalink_val_to_description_params *params = args; - const char *str = pcap_datalink_val_to_description( params->link ); + const char *str = ppcap_datalink_val_to_description( params->link ); int len;
if (!str || !params->buf) return STATUS_INVALID_PARAMETER; @@ -129,7 +248,7 @@ static NTSTATUS wrap_datalink_val_to_description( void *args ) static NTSTATUS wrap_datalink_val_to_name( void *args ) { const struct datalink_val_to_name_params *params = args; - const char *str = pcap_datalink_val_to_name( params->link ); + const char *str = ppcap_datalink_val_to_name( params->link ); int len;
if (!str || !params->buf) return STATUS_INVALID_PARAMETER; @@ -142,6 +261,12 @@ static NTSTATUS wrap_datalink_val_to_name( void *args ) return STATUS_SUCCESS; }
+static NTSTATUS wrap_detach( void *args ) +{ + if (pcap_handle) dlclose( pcap_handle ); + return STATUS_SUCCESS; +} + static NTSTATUS wrap_dump( void *args ) { const struct dump_params *params = args; @@ -151,21 +276,21 @@ static NTSTATUS wrap_dump( void *args ) hdr_unix.ts.tv_usec = params->hdr->ts.tv_usec; hdr_unix.caplen = params->hdr->caplen; hdr_unix.len = params->hdr->len; - pcap_dump( params->user, &hdr_unix, params->packet ); + ppcap_dump( params->user, &hdr_unix, params->packet ); return STATUS_SUCCESS; }
static NTSTATUS wrap_dump_close( void *args ) { const struct dump_close_params *params = args; - pcap_dump_close( (pcap_dumper_t *)(ULONG_PTR)params->handle ); + ppcap_dump_close( (pcap_dumper_t *)(ULONG_PTR)params->handle ); return STATUS_SUCCESS; }
static NTSTATUS wrap_dump_open( void *args ) { const struct dump_open_params *params = args; - *params->ret_handle = (ULONG_PTR)pcap_dump_open( (pcap_t *)(ULONG_PTR)params->handle, params->name ); + *params->ret_handle = (ULONG_PTR)ppcap_dump_open( (pcap_t *)(ULONG_PTR)params->handle, params->name ); return STATUS_SUCCESS; }
@@ -176,7 +301,7 @@ static NTSTATUS wrap_findalldevs( void *args ) struct pcap_interface_offsets *dst = (struct pcap_interface_offsets *)params->buf; int ret, len_total = 0;
- if ((ret = pcap_findalldevs( &devs, params->errbuf ))) return ret; + if ((ret = ppcap_findalldevs( &devs, params->errbuf ))) return ret;
src = devs; while (src) @@ -205,20 +330,20 @@ static NTSTATUS wrap_findalldevs( void *args )
if (*params->buflen < len_total) ret = STATUS_BUFFER_TOO_SMALL; *params->buflen = len_total; - pcap_freealldevs( devs ); + ppcap_freealldevs( devs ); return ret; }
static NTSTATUS wrap_get_tstamp_precision( void *args ) { const struct get_tstamp_precision_params *params = args; - return pcap_get_tstamp_precision( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_get_tstamp_precision( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_geterr( void *args ) { const struct geterr_params *params = args; - char *errbuf = pcap_geterr( (pcap_t *)(ULONG_PTR)params->handle ); + char *errbuf = ppcap_geterr( (pcap_t *)(ULONG_PTR)params->handle ); assert( strlen(errbuf) < PCAP_ERRBUF_SIZE ); strcpy( params->errbuf, errbuf ); return STATUS_SUCCESS; @@ -227,19 +352,20 @@ static NTSTATUS wrap_geterr( void *args ) static NTSTATUS wrap_getnonblock( void *args ) { const struct getnonblock_params *params = args; - return pcap_getnonblock( (pcap_t *)(ULONG_PTR)params->handle, params->errbuf ); + return ppcap_getnonblock( (pcap_t *)(ULONG_PTR)params->handle, params->errbuf ); }
static NTSTATUS wrap_init( void *args ) { const struct init_params *params = args; - return pcap_init( params->opt, params->errbuf ); + + return ppcap_init( params->opt, params->errbuf ); }
static NTSTATUS wrap_lib_version( void *args ) { const struct lib_version_params *params = args; - const char *str = pcap_lib_version(); + const char *str = ppcap_lib_version(); unsigned int len = min( strlen(str) + 1, params->size );
memcpy( params->version, str, len ); @@ -253,12 +379,12 @@ static NTSTATUS wrap_list_datalinks( void *args ) NTSTATUS status = STATUS_SUCCESS; int *links = NULL, count;
- if ((count = pcap_list_datalinks( (pcap_t *)(ULONG_PTR)params->handle, &links )) > 0) + if ((count = ppcap_list_datalinks( (pcap_t *)(ULONG_PTR)params->handle, &links )) > 0) { if (*params->count < count) status = STATUS_BUFFER_TOO_SMALL; else memcpy( params->links, links, count * sizeof(*links) ); } - pcap_free_datalinks( links ); + ppcap_free_datalinks( links ); *params->count = count; return status; } @@ -269,12 +395,12 @@ static NTSTATUS wrap_list_tstamp_types( void *args ) NTSTATUS status = STATUS_SUCCESS; int *types = NULL, count;
- if ((count = pcap_list_tstamp_types( (pcap_t *)(ULONG_PTR)params->handle, &types )) > 0) + if ((count = ppcap_list_tstamp_types( (pcap_t *)(ULONG_PTR)params->handle, &types )) > 0) { if (*params->count < count) status = STATUS_BUFFER_TOO_SMALL; else memcpy( params->types, types, count * sizeof(*types) ); } - pcap_free_tstamp_types( types ); + ppcap_free_tstamp_types( types ); *params->count = count; return status; } @@ -282,19 +408,19 @@ static NTSTATUS wrap_list_tstamp_types( void *args ) static NTSTATUS wrap_lookupnet( void *args ) { const struct lookupnet_params *params = args; - return pcap_lookupnet( params->device, params->net, params->mask, params->errbuf ); + return ppcap_lookupnet( params->device, params->net, params->mask, params->errbuf ); }
static NTSTATUS wrap_major_version( void *args ) { const struct major_version_params *params = args; - return pcap_major_version( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_major_version( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_minor_version( void *args ) { const struct minor_version_params *params = args; - return pcap_minor_version( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_minor_version( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_next_ex( void *args ) @@ -303,7 +429,7 @@ static NTSTATUS wrap_next_ex( void *args ) struct pcap_pkthdr *hdr_unix; int ret;
- if ((ret = pcap_next_ex( (pcap_t *)(ULONG_PTR)params->handle, &hdr_unix, params->data )) == 1) + if ((ret = ppcap_next_ex( (pcap_t *)(ULONG_PTR)params->handle, &hdr_unix, params->data )) == 1) { if (hdr_unix->ts.tv_sec > INT_MAX || hdr_unix->ts.tv_usec > INT_MAX) WARN( "truncating timeval values(s)\n" ); params->hdr->ts.tv_sec = hdr_unix->ts.tv_sec; @@ -317,7 +443,7 @@ static NTSTATUS wrap_next_ex( void *args ) static NTSTATUS wrap_open_live( void *args ) { const struct open_live_params *params = args; - if (!(*params->handle = (ULONG_PTR)pcap_open_live( params->source, params->snaplen, params->promisc, + if (!(*params->handle = (ULONG_PTR)ppcap_open_live( params->source, params->snaplen, params->promisc, params->timeout, params->errbuf ))) return STATUS_NO_MEMORY; return STATUS_SUCCESS; } @@ -325,74 +451,74 @@ static NTSTATUS wrap_open_live( void *args ) static NTSTATUS wrap_sendpacket( void *args ) { const struct sendpacket_params *params = args; - return pcap_sendpacket( (pcap_t *)(ULONG_PTR)params->handle, params->buf, params->size ); + return ppcap_sendpacket( (pcap_t *)(ULONG_PTR)params->handle, params->buf, params->size ); }
static NTSTATUS wrap_set_buffer_size( void *args ) { const struct set_buffer_size_params *params = args; - return pcap_set_buffer_size( (pcap_t *)(ULONG_PTR)params->handle, params->size ); + return ppcap_set_buffer_size( (pcap_t *)(ULONG_PTR)params->handle, params->size ); }
static NTSTATUS wrap_set_datalink( void *args ) { const struct set_datalink_params *params = args; - return pcap_set_datalink( (pcap_t *)(ULONG_PTR)params->handle, params->link ); + return ppcap_set_datalink( (pcap_t *)(ULONG_PTR)params->handle, params->link ); }
static NTSTATUS wrap_set_promisc( void *args ) { const struct set_promisc_params *params = args; - return pcap_set_promisc( (pcap_t *)(ULONG_PTR)params->handle, params->enable ); + return ppcap_set_promisc( (pcap_t *)(ULONG_PTR)params->handle, params->enable ); }
static NTSTATUS wrap_set_rfmon( void *args ) { const struct set_rfmon_params *params = args; - return pcap_set_rfmon( (pcap_t *)(ULONG_PTR)params->handle, params->enable ); + return ppcap_set_rfmon( (pcap_t *)(ULONG_PTR)params->handle, params->enable ); }
static NTSTATUS wrap_set_snaplen( void *args ) { const struct set_snaplen_params *params = args; - return pcap_set_snaplen( (pcap_t *)(ULONG_PTR)params->handle, params->len ); + return ppcap_set_snaplen( (pcap_t *)(ULONG_PTR)params->handle, params->len ); }
static NTSTATUS wrap_set_timeout( void *args ) { const struct set_timeout_params *params = args; - return pcap_set_timeout( (pcap_t *)(ULONG_PTR)params->handle, params->timeout ); + return ppcap_set_timeout( (pcap_t *)(ULONG_PTR)params->handle, params->timeout ); }
static NTSTATUS wrap_set_tstamp_precision( void *args ) { const struct set_tstamp_precision_params *params = args; - return pcap_set_tstamp_precision( (pcap_t *)(ULONG_PTR)params->handle, params->precision ); + return ppcap_set_tstamp_precision( (pcap_t *)(ULONG_PTR)params->handle, params->precision ); }
static NTSTATUS wrap_set_tstamp_type( void *args ) { const struct set_tstamp_type_params *params = args; - return pcap_set_tstamp_type( (pcap_t *)(ULONG_PTR)params->handle, params->type ); + return ppcap_set_tstamp_type( (pcap_t *)(ULONG_PTR)params->handle, params->type ); }
static NTSTATUS wrap_setfilter( void *args ) { const struct setfilter_params *params = args; struct bpf_program program = { params->program_len, params->program_insns }; - return pcap_setfilter( (pcap_t *)(ULONG_PTR)params->handle, &program ); + return ppcap_setfilter( (pcap_t *)(ULONG_PTR)params->handle, &program ); }
static NTSTATUS wrap_setnonblock( void *args ) { const struct setnonblock_params *params = args; - return pcap_setnonblock( (pcap_t *)(ULONG_PTR)params->handle, params->nonblock, params->errbuf ); + return ppcap_setnonblock( (pcap_t *)(ULONG_PTR)params->handle, params->nonblock, params->errbuf ); }
static NTSTATUS wrap_snapshot( void *args ) { const struct snapshot_params *params = args; - return pcap_snapshot( (pcap_t *)(ULONG_PTR)params->handle ); + return ppcap_snapshot( (pcap_t *)(ULONG_PTR)params->handle ); }
static NTSTATUS wrap_stats( void *args ) @@ -401,7 +527,7 @@ static NTSTATUS wrap_stats( void *args ) struct pcap_stat stat; int ret;
- if (!(ret = pcap_stats( (pcap_t *)(ULONG_PTR)params->handle, &stat ))) + if (!(ret = ppcap_stats( (pcap_t *)(ULONG_PTR)params->handle, &stat ))) { params->stat.ps_recv = stat.ps_recv; params->stat.ps_drop = stat.ps_drop; @@ -416,13 +542,13 @@ static NTSTATUS wrap_stats( void *args ) static NTSTATUS wrap_tstamp_type_name_to_val( void *args ) { const struct tstamp_type_name_to_val_params *params = args; - return pcap_tstamp_type_name_to_val( params->name ); + return ppcap_tstamp_type_name_to_val( params->name ); }
static NTSTATUS wrap_tstamp_type_val_to_description( void *args ) { const struct tstamp_type_val_to_description_params *params = args; - const char *str = pcap_tstamp_type_val_to_description( params->type ); + const char *str = ppcap_tstamp_type_val_to_description( params->type ); int len;
if (!str || !params->buf) return STATUS_INVALID_PARAMETER; @@ -438,7 +564,7 @@ static NTSTATUS wrap_tstamp_type_val_to_description( void *args ) static NTSTATUS wrap_tstamp_type_val_to_name( void *args ) { const struct tstamp_type_val_to_name_params *params = args; - const char *str = pcap_tstamp_type_val_to_name( params->type ); + const char *str = ppcap_tstamp_type_val_to_name( params->type ); int len;
if (!str || !params->buf) return STATUS_INVALID_PARAMETER; @@ -454,6 +580,7 @@ static NTSTATUS wrap_tstamp_type_val_to_name( void *args ) const unixlib_entry_t __wine_unix_call_funcs[] = { wrap_activate, + wrap_attach, wrap_breakloop, wrap_bufsize, wrap_can_set_rfmon, @@ -464,6 +591,7 @@ const unixlib_entry_t __wine_unix_call_funcs[] = wrap_datalink_name_to_val, wrap_datalink_val_to_description, wrap_datalink_val_to_name, + wrap_detach, wrap_dump, wrap_dump_close, wrap_dump_open, @@ -919,6 +1047,7 @@ static NTSTATUS wow64_tstamp_type_val_to_name( void *args ) const unixlib_entry_t __wine_unix_call_wow64_funcs[] = { wrap_activate, + wrap_attach, wrap_breakloop, wrap_bufsize, wrap_can_set_rfmon, @@ -929,6 +1058,7 @@ const unixlib_entry_t __wine_unix_call_wow64_funcs[] = wow64_datalink_name_to_val, wow64_datalink_val_to_description, wow64_datalink_val_to_name, + wrap_detach, wow64_dump, wrap_dump_close, wow64_dump_open, diff --git a/dlls/wpcap/unixlib.h b/dlls/wpcap/unixlib.h index d13d62a97aa..c518ffa230c 100644 --- a/dlls/wpcap/unixlib.h +++ b/dlls/wpcap/unixlib.h @@ -337,6 +337,7 @@ struct tstamp_type_val_to_name_params enum pcap_funcs { unix_activate, + unix_attach, unix_breakloop, unix_bufsize, unix_can_set_rfmon, @@ -347,6 +348,7 @@ enum pcap_funcs unix_datalink_name_to_val, unix_datalink_val_to_description, unix_datalink_val_to_name, + unix_detach, unix_dump, unix_dump_close, unix_dump_open, diff --git a/dlls/wpcap/wpcap.c b/dlls/wpcap/wpcap.c index de4bac33871..69a8edfeb52 100644 --- a/dlls/wpcap/wpcap.c +++ b/dlls/wpcap/wpcap.c @@ -1456,6 +1456,8 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, void *reserved ) struct init_params params = { PCAP_CHAR_ENC_UTF_8, errbuf }; BOOL is_wow64;
+ if (PCAP_CALL( attach, NULL )) return FALSE; + if (PCAP_CALL( init, ¶ms ) == PCAP_ERROR) WARN( "failed to enable UTF-8 encoding %s\n", debugstr_a(errbuf) ); if (IsWow64Process( GetCurrentProcess(), &is_wow64 ) && is_wow64) @@ -1471,6 +1473,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, void *reserved ) if (reserved) break; free_datalinks(); free_tstamp_types(); + PCAP_CALL( detach, NULL ); break; } return TRUE; diff --git a/include/config.h.in b/include/config.h.in index 184771d94f2..379ada9581d 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -762,6 +762,9 @@ /* Define to the soname of the libOSMesa library. */ #undef SONAME_LIBOSMESA
+/* Define to the soname of the libpcap library. */ +#undef SONAME_LIBPCAP + /* Define to the soname of the libSDL2 library. */ #undef SONAME_LIBSDL2