winebus.sys: Add initial udev stub driver.
Signed-off-by: Aric Stewart <aric@codeweavers.com> Signed-off-by: Sebastian Lackner <sebastian@fds-team.de> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0c4c6d603b
commit
6d3e5f8441
|
@ -652,6 +652,8 @@ FONTCONFIG_CFLAGS
|
||||||
CUPS_CFLAGS
|
CUPS_CFLAGS
|
||||||
CAPI20_LIBS
|
CAPI20_LIBS
|
||||||
CAPI20_CFLAGS
|
CAPI20_CFLAGS
|
||||||
|
UDEV_LIBS
|
||||||
|
UDEV_CFLAGS
|
||||||
OSS4_CFLAGS
|
OSS4_CFLAGS
|
||||||
ALSA_LIBS
|
ALSA_LIBS
|
||||||
GSTREAMER_LIBS
|
GSTREAMER_LIBS
|
||||||
|
@ -846,6 +848,7 @@ with_pthread
|
||||||
with_pulse
|
with_pulse
|
||||||
with_sane
|
with_sane
|
||||||
with_tiff
|
with_tiff
|
||||||
|
with_udev
|
||||||
with_v4l
|
with_v4l
|
||||||
with_xcomposite
|
with_xcomposite
|
||||||
with_xcursor
|
with_xcursor
|
||||||
|
@ -1590,6 +1593,8 @@ PULSE_CFLAGS
|
||||||
PULSE_LIBS
|
PULSE_LIBS
|
||||||
GSTREAMER_CFLAGS
|
GSTREAMER_CFLAGS
|
||||||
GSTREAMER_LIBS
|
GSTREAMER_LIBS
|
||||||
|
UDEV_CFLAGS
|
||||||
|
UDEV_LIBS
|
||||||
CAPI20_CFLAGS
|
CAPI20_CFLAGS
|
||||||
CAPI20_LIBS
|
CAPI20_LIBS
|
||||||
FONTCONFIG_CFLAGS
|
FONTCONFIG_CFLAGS
|
||||||
|
@ -2275,6 +2280,7 @@ Optional Packages:
|
||||||
--without-pulse do not use PulseAudio sound support
|
--without-pulse do not use PulseAudio sound support
|
||||||
--without-sane do not use SANE (scanner support)
|
--without-sane do not use SANE (scanner support)
|
||||||
--without-tiff do not use TIFF
|
--without-tiff do not use TIFF
|
||||||
|
--without-udev do not use udev (play and play support)
|
||||||
--without-v4l do not use v4l1 (v4l support)
|
--without-v4l do not use v4l1 (v4l support)
|
||||||
--without-xcomposite do not use the Xcomposite extension
|
--without-xcomposite do not use the Xcomposite extension
|
||||||
--without-xcursor do not use the Xcursor extension
|
--without-xcursor do not use the Xcursor extension
|
||||||
|
@ -2342,6 +2348,8 @@ Some influential environment variables:
|
||||||
GSTREAMER_LIBS
|
GSTREAMER_LIBS
|
||||||
Linker flags for gstreamer-1.0 gstreamer-video-1.0
|
Linker flags for gstreamer-1.0 gstreamer-video-1.0
|
||||||
gstreamer-audio-1.0, overriding pkg-config
|
gstreamer-audio-1.0, overriding pkg-config
|
||||||
|
UDEV_CFLAGS C compiler flags for libudev, overriding pkg-config
|
||||||
|
UDEV_LIBS Linker flags for libudev, overriding pkg-config
|
||||||
CAPI20_CFLAGS
|
CAPI20_CFLAGS
|
||||||
C compiler flags for capi20, overriding pkg-config
|
C compiler flags for capi20, overriding pkg-config
|
||||||
CAPI20_LIBS Linker flags for capi20, overriding pkg-config
|
CAPI20_LIBS Linker flags for capi20, overriding pkg-config
|
||||||
|
@ -3546,6 +3554,12 @@ if test "${with_tiff+set}" = set; then :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Check whether --with-udev was given.
|
||||||
|
if test "${with_udev+set}" = set; then :
|
||||||
|
withval=$with_udev;
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-v4l was given.
|
# Check whether --with-v4l was given.
|
||||||
if test "${with_v4l+set}" = set; then :
|
if test "${with_v4l+set}" = set; then :
|
||||||
withval=$with_v4l;
|
withval=$with_v4l;
|
||||||
|
@ -12902,6 +12916,97 @@ esac
|
||||||
enable_wineoss_drv=${enable_wineoss_drv:-no}
|
enable_wineoss_drv=${enable_wineoss_drv:-no}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x$with_udev" != "xno"
|
||||||
|
then
|
||||||
|
if ${UDEV_CFLAGS:+false} :; then :
|
||||||
|
if ${PKG_CONFIG+:} false; then :
|
||||||
|
UDEV_CFLAGS=`$PKG_CONFIG --cflags libudev 2>/dev/null`
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ${UDEV_LIBS:+false} :; then :
|
||||||
|
if ${PKG_CONFIG+:} false; then :
|
||||||
|
UDEV_LIBS=`$PKG_CONFIG --libs libudev 2>/dev/null`
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: libudev cflags: $UDEV_CFLAGS" >&5
|
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: libudev libs: $UDEV_LIBS" >&5
|
||||||
|
ac_save_CPPFLAGS=$CPPFLAGS
|
||||||
|
CPPFLAGS="$CPPFLAGS $UDEV_CFLAGS"
|
||||||
|
for ac_header in libudev.h
|
||||||
|
do :
|
||||||
|
ac_fn_c_check_header_mongrel "$LINENO" "libudev.h" "ac_cv_header_libudev_h" "$ac_includes_default"
|
||||||
|
if test "x$ac_cv_header_libudev_h" = xyes; then :
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define HAVE_LIBUDEV_H 1
|
||||||
|
_ACEOF
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for udev_new in -ludev" >&5
|
||||||
|
$as_echo_n "checking for udev_new in -ludev... " >&6; }
|
||||||
|
if ${ac_cv_lib_udev_udev_new+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
ac_check_lib_save_LIBS=$LIBS
|
||||||
|
LIBS="-ludev $UDEV_LIBS $LIBS"
|
||||||
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any GCC internal prototype to avoid an error.
|
||||||
|
Use char because int might match the return type of a GCC
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
char udev_new ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
return udev_new ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
if ac_fn_c_try_link "$LINENO"; then :
|
||||||
|
ac_cv_lib_udev_udev_new=yes
|
||||||
|
else
|
||||||
|
ac_cv_lib_udev_udev_new=no
|
||||||
|
fi
|
||||||
|
rm -f core conftest.err conftest.$ac_objext \
|
||||||
|
conftest$ac_exeext conftest.$ac_ext
|
||||||
|
LIBS=$ac_check_lib_save_LIBS
|
||||||
|
fi
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_udev_udev_new" >&5
|
||||||
|
$as_echo "$ac_cv_lib_udev_udev_new" >&6; }
|
||||||
|
if test "x$ac_cv_lib_udev_udev_new" = xyes; then :
|
||||||
|
|
||||||
|
$as_echo "#define HAVE_UDEV 1" >>confdefs.h
|
||||||
|
|
||||||
|
else
|
||||||
|
UDEV_LIBS=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
UDEV_LIBS=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
CPPFLAGS=$ac_save_CPPFLAGS
|
||||||
|
test -z "$UDEV_CFLAGS" || UDEV_CFLAGS=`echo " $UDEV_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
|
||||||
|
test -z "$UDEV_LIBS" || UDEV_LIBS=`echo " $UDEV_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`
|
||||||
|
|
||||||
|
fi
|
||||||
|
if test "x$UDEV_LIBS" = "x"; then :
|
||||||
|
case "x$with_udev" in
|
||||||
|
x) as_fn_append wine_notices "|libudev ${notice_platform}development files not found, plug and play won't be supported." ;;
|
||||||
|
xno) ;;
|
||||||
|
*) as_fn_error $? "libudev ${notice_platform}development files not found, plug and play won't be supported.
|
||||||
|
This is an error since --with-udev was requested." "$LINENO" 5 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
if test "x$with_capi" != "xno"
|
if test "x$with_capi" != "xno"
|
||||||
then
|
then
|
||||||
if ${CAPI20_CFLAGS:+false} :; then :
|
if ${CAPI20_CFLAGS:+false} :; then :
|
||||||
|
@ -17350,6 +17455,8 @@ GSTREAMER_CFLAGS = $GSTREAMER_CFLAGS
|
||||||
GSTREAMER_LIBS = $GSTREAMER_LIBS
|
GSTREAMER_LIBS = $GSTREAMER_LIBS
|
||||||
ALSA_LIBS = $ALSA_LIBS
|
ALSA_LIBS = $ALSA_LIBS
|
||||||
OSS4_CFLAGS = $OSS4_CFLAGS
|
OSS4_CFLAGS = $OSS4_CFLAGS
|
||||||
|
UDEV_CFLAGS = $UDEV_CFLAGS
|
||||||
|
UDEV_LIBS = $UDEV_LIBS
|
||||||
CAPI20_CFLAGS = $CAPI20_CFLAGS
|
CAPI20_CFLAGS = $CAPI20_CFLAGS
|
||||||
CAPI20_LIBS = $CAPI20_LIBS
|
CAPI20_LIBS = $CAPI20_LIBS
|
||||||
CUPS_CFLAGS = $CUPS_CFLAGS
|
CUPS_CFLAGS = $CUPS_CFLAGS
|
||||||
|
|
14
configure.ac
14
configure.ac
|
@ -75,6 +75,7 @@ AC_ARG_WITH(pthread, AS_HELP_STRING([--without-pthread],[do not use the pthrea
|
||||||
AC_ARG_WITH(pulse, AS_HELP_STRING([--without-pulse],[do not use PulseAudio sound support]))
|
AC_ARG_WITH(pulse, AS_HELP_STRING([--without-pulse],[do not use PulseAudio sound support]))
|
||||||
AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)]))
|
AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)]))
|
||||||
AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF]))
|
AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF]))
|
||||||
|
AC_ARG_WITH(udev, AS_HELP_STRING([--without-udev],[do not use udev (play and play support)]))
|
||||||
AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
|
AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
|
||||||
AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
|
AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
|
||||||
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
|
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
|
||||||
|
@ -1519,6 +1520,19 @@ WINE_NOTICE_WITH(oss,[test "x$ac_cv_member_oss_sysinfo_numaudioengines" != xyes]
|
||||||
[OSS sound system found but too old (OSSv4 needed), OSS won't be supported.],
|
[OSS sound system found but too old (OSSv4 needed), OSS won't be supported.],
|
||||||
[enable_wineoss_drv])
|
[enable_wineoss_drv])
|
||||||
|
|
||||||
|
dnl **** Check for libudev ****
|
||||||
|
if test "x$with_udev" != "xno"
|
||||||
|
then
|
||||||
|
WINE_PACKAGE_FLAGS(UDEV,[libudev],,,,
|
||||||
|
[AC_CHECK_HEADERS(libudev.h,
|
||||||
|
[AC_CHECK_LIB(udev,udev_new,
|
||||||
|
AC_DEFINE(HAVE_UDEV,1,[Define to 1 if you have the `udev' library (-ludev).]),
|
||||||
|
[UDEV_LIBS=""],[$UDEV_LIBS])],
|
||||||
|
[UDEV_LIBS=""])])
|
||||||
|
fi
|
||||||
|
WINE_NOTICE_WITH(udev,[test "x$UDEV_LIBS" = "x"],
|
||||||
|
[libudev ${notice_platform}development files not found, plug and play won't be supported.])
|
||||||
|
|
||||||
dnl **** Check for capi4linux ****
|
dnl **** Check for capi4linux ****
|
||||||
if test "x$with_capi" != "xno"
|
if test "x$with_capi" != "xno"
|
||||||
then
|
then
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
MODULE = winebus.sys
|
MODULE = winebus.sys
|
||||||
|
IMPORTS = ntoskrnl
|
||||||
EXTRADLLFLAGS = -Wb,--subsystem,native
|
EXTRADLLFLAGS = -Wb,--subsystem,native
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
|
bus_udev.c \
|
||||||
main.c
|
main.c
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2016 Aric Stewart
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Busses */
|
||||||
|
NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
/* HID Plug and Play Bus */
|
||||||
|
NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp) DECLSPEC_HIDDEN;
|
|
@ -0,0 +1,60 @@
|
||||||
|
/*
|
||||||
|
* Plug and Play support for hid devices found through udev
|
||||||
|
*
|
||||||
|
* Copyright 2016 CodeWeavers, Aric Stewart
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
|
#include "ntstatus.h"
|
||||||
|
#define WIN32_NO_STATUS
|
||||||
|
#include "windef.h"
|
||||||
|
#include "winbase.h"
|
||||||
|
#include "winternl.h"
|
||||||
|
#include "ddk/wdm.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
#include "bus.h"
|
||||||
|
|
||||||
|
WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
|
||||||
|
|
||||||
|
#ifdef HAVE_UDEV
|
||||||
|
|
||||||
|
static DRIVER_OBJECT *udev_driver_obj = NULL;
|
||||||
|
|
||||||
|
NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
|
||||||
|
{
|
||||||
|
TRACE("(%p, %s)\n", driver, debugstr_w(registry_path->Buffer));
|
||||||
|
|
||||||
|
udev_driver_obj = driver;
|
||||||
|
driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
|
||||||
|
{
|
||||||
|
WARN("Wine was compiled without UDEV support\n");
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_UDEV */
|
|
@ -20,6 +20,8 @@
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define NONAMELESSUNION
|
||||||
|
|
||||||
#include "ntstatus.h"
|
#include "ntstatus.h"
|
||||||
#define WIN32_NO_STATUS
|
#define WIN32_NO_STATUS
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
|
@ -28,11 +30,43 @@
|
||||||
#include "ddk/wdm.h"
|
#include "ddk/wdm.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
#include "bus.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
|
WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
|
||||||
|
|
||||||
|
NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp)
|
||||||
|
{
|
||||||
|
NTSTATUS status = irp->IoStatus.u.Status;
|
||||||
|
IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation(irp);
|
||||||
|
|
||||||
|
switch (irpsp->MinorFunction)
|
||||||
|
{
|
||||||
|
case IRP_MN_QUERY_DEVICE_RELATIONS:
|
||||||
|
TRACE("IRP_MN_QUERY_DEVICE_RELATIONS\n");
|
||||||
|
break;
|
||||||
|
case IRP_MN_QUERY_ID:
|
||||||
|
TRACE("IRP_MN_QUERY_ID\n");
|
||||||
|
break;
|
||||||
|
case IRP_MN_QUERY_CAPABILITIES:
|
||||||
|
TRACE("IRP_MN_QUERY_CAPABILITIES\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("Unhandled function %08x\n", irpsp->MinorFunction);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
IoCompleteRequest(irp, IO_NO_INCREMENT);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
|
NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
|
||||||
{
|
{
|
||||||
|
static const WCHAR udevW[] = {'\\','D','r','i','v','e','r','\\','U','D','E','V',0};
|
||||||
|
static UNICODE_STRING udev = {sizeof(udevW) - sizeof(WCHAR), sizeof(udevW), (WCHAR *)udevW};
|
||||||
|
|
||||||
TRACE( "(%p, %s)\n", driver, debugstr_w(path->Buffer) );
|
TRACE( "(%p, %s)\n", driver, debugstr_w(path->Buffer) );
|
||||||
|
|
||||||
|
IoCreateDriver(&udev, udev_driver_init);
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -378,6 +378,9 @@
|
||||||
/* Define to 1 if you have the <libproc.h> header file. */
|
/* Define to 1 if you have the <libproc.h> header file. */
|
||||||
#undef HAVE_LIBPROC_H
|
#undef HAVE_LIBPROC_H
|
||||||
|
|
||||||
|
/* Define to 1 if you have the <libudev.h> header file. */
|
||||||
|
#undef HAVE_LIBUDEV_H
|
||||||
|
|
||||||
/* Define to 1 if you have the <libunwind.h> header file. */
|
/* Define to 1 if you have the <libunwind.h> header file. */
|
||||||
#undef HAVE_LIBUNWIND_H
|
#undef HAVE_LIBUNWIND_H
|
||||||
|
|
||||||
|
@ -1200,6 +1203,9 @@
|
||||||
/* Define to 1 if you have the `truncf' function. */
|
/* Define to 1 if you have the `truncf' function. */
|
||||||
#undef HAVE_TRUNCF
|
#undef HAVE_TRUNCF
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `udev' library (-ludev). */
|
||||||
|
#undef HAVE_UDEV
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
/* Define to 1 if you have the <unistd.h> header file. */
|
||||||
#undef HAVE_UNISTD_H
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue