You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
42 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5d354c9b2a | ||
|
e8fee88c50 | ||
|
c2e8167d6d | ||
|
907d56238e | ||
|
674b998176 | ||
|
882b560d0d | ||
|
8df335170a | ||
|
2241ffdf4b | ||
|
dff7b6b562 | ||
|
cdb00a9e7a | ||
|
f7541123b5 | ||
|
6578707ac2 | ||
|
719c65ebb0 | ||
|
ddefcb372a | ||
|
c594bca17a | ||
|
3c33a592f6 | ||
|
4476d8af38 | ||
|
b216cdce2c | ||
|
fc086bb2bc | ||
|
772dfd9f5a | ||
|
b4d53a7344 | ||
|
e5c7fe8c18 | ||
|
fdc24226bf | ||
|
3886ee9fae | ||
|
229eb9bba5 | ||
|
1800d1f853 | ||
|
24d682fd91 | ||
|
979900f060 | ||
|
d094743650 | ||
|
2c9d2d8f64 | ||
|
457c0bf7e1 | ||
|
d2209c6ee0 | ||
|
84997e39ab | ||
|
01be545e92 | ||
|
bfb7d535af | ||
|
94813ecf3c | ||
|
b09ed0f3d2 | ||
|
807da03757 | ||
|
af447c6cfd | ||
|
aac5a0da53 | ||
|
7fede3cd56 | ||
|
43b781b453 |
@@ -14,5 +14,7 @@ Current patches include:
|
||||
* Workaround for TransactNamedPipe not being supported (http://bugs.winehq.org/show_bug.cgi?id=17273)
|
||||
* XEMBED support for embedding Wine windows inside Linux applications
|
||||
* Reduced SetTimer minimum value from 15 ms to 5 ms (improves Silverlight framerates)
|
||||
* Lockfree algorithm for filedescriptor cache (improves file access speed)
|
||||
* Workaround for shlwapi URLs with relative paths
|
||||
* Support for PulseAudio backend for audio
|
||||
* Other Pipelight specific enhancements
|
||||
|
38
debian/changelog
vendored
38
debian/changelog
vendored
@@ -1,3 +1,41 @@
|
||||
wine-compholio (1.7.21) unstable; urgency=low
|
||||
* Remove several patches (accepted upstream).
|
||||
-- Sebastian Lackner <sebastian@fds-team.de> Fri, 27 Jun 2014 23:08:48 -0600
|
||||
|
||||
wine-compholio (1.7.20) unstable; urgency=low
|
||||
* Remove several patches (accepted upstream).
|
||||
* Fix recommendation for odbc and add libgsm1.
|
||||
* Disabled gstreamer (broken with glib >= 2.32.0).
|
||||
* Updated scripts to be compatible with BSD systems.
|
||||
* Update winepulse patches to latest revision (extracted from 1.7.19).
|
||||
* Force autoreconf even when timestamp seems to indicate that it is not necessary.
|
||||
* Added patches for default security descriptor ownership and DACLs for processes.
|
||||
* Added a patch to avoid a race-condition when unloading modules while a hook is active.
|
||||
* Add patch to fix issues with Obsidium copy protection.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Sat, 14 Jun 2014 18:15:12 +0200
|
||||
|
||||
wine-compholio (1.7.19-1) unstable; urgency=low
|
||||
* Added a patch to fix return value for FSCTL_PIPE_WAIT (required for Unity3D).
|
||||
* Added a patch to stub TokenAppContainerSid in NtQueryInformationToken (required for Unity3D).
|
||||
* Added a patch to optimize the file descriptor cache by using lockfree algorithms.
|
||||
* Add additional checks in XATTR patch to ensure wineserver doesn't crash if data is corrupted.
|
||||
* Add support for extended attributes on FreeBSD systems.
|
||||
* Added a patch to fix ntdll/exception test failures on x86_64.
|
||||
* Allow to change 'strict draw ordering' at runtime.
|
||||
* Add ability to test if all dynamic libraries are installed with "wine --check-libs".
|
||||
* Added a patch to query if direct rendering is enabled via GLX extension.
|
||||
-- Sebastian Lackner <sebastian@fds-team.de> Mon, 02 Jun 2014 23:50:23 +0200
|
||||
|
||||
wine-compholio (1.7.19) unstable; urgency=low
|
||||
* Updated SIO_ADDRESS_LIST_CHANGE patches.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Tue, 06 May 2014 15:42:32 -0600
|
||||
|
||||
wine-compholio (1.7.18-1) unstable; urgency=low
|
||||
* Fix some issues on BSD systems.
|
||||
* Add additional patches to silence a few FIXMEs.
|
||||
* Rebase 02-ACL_Extended_Attributes patches.
|
||||
-- Sebastian Lackner <sebastian@fds-team.de> Tue, 13 May 2014 20:47:23 +0200
|
||||
|
||||
wine-compholio (1.7.18) unstable; urgency=low
|
||||
* Updated SetTimer patch (10 ms accepted upstream).
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 02 May 2014 13:05:13 -0600
|
||||
|
8
debian/control
vendored
8
debian/control
vendored
@@ -32,8 +32,6 @@ Build-Depends: autotools-dev,
|
||||
libgnutls-dev,
|
||||
libgphoto2-dev | libgphoto2-6-dev | libgphoto2-2-dev (>= 2.4.6),
|
||||
libgsm1-dev,
|
||||
libgstreamer-plugins-base0.10-dev,
|
||||
libgstreamer0.10-dev,
|
||||
libice-dev,
|
||||
libjpeg-dev,
|
||||
liblcms2-dev | ubuntu-desktop (<< 1.267),
|
||||
@@ -102,7 +100,8 @@ Recommends: libcapi20-3,
|
||||
libxslt1.1,
|
||||
libxt6,
|
||||
libxxf86vm1,
|
||||
unixodbc
|
||||
libodbc1,
|
||||
libgsm1
|
||||
Section: otherosfs
|
||||
Priority: optional
|
||||
Replaces: wine-compholio (<< 1.7.15-1~)
|
||||
@@ -159,7 +158,8 @@ Recommends: libcapi20-3,
|
||||
libxslt1.1,
|
||||
libxt6,
|
||||
libxxf86vm1,
|
||||
unixodbc
|
||||
libodbc1,
|
||||
libgsm1
|
||||
Section: otherosfs
|
||||
Priority: optional
|
||||
Replaces: wine-compholio (<< 1.7.15-1~)
|
||||
|
4
debian/rules
vendored
4
debian/rules
vendored
@@ -16,9 +16,9 @@ override_dh_auto_configure:
|
||||
make -C "$(CURDIR)/patches/" DESTDIR="$(CURDIR)" install
|
||||
|
||||
ifeq ($(DEB_BUILD_ARCH), amd64)
|
||||
./configure --prefix=/opt/wine-compholio --libdir=\$${prefix}/lib64 --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --enable-win64 --with-xattr $(CONFFLAGS)
|
||||
./configure --prefix=/opt/wine-compholio --libdir=\$${prefix}/lib64 --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --enable-win64 --without-gstreamer --with-xattr $(CONFFLAGS)
|
||||
else
|
||||
./configure --prefix=/opt/wine-compholio --libdir=\$${prefix}/lib --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --with-xattr $(CONFFLAGS)
|
||||
./configure --prefix=/opt/wine-compholio --libdir=\$${prefix}/lib --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --without-gstreamer --with-xattr $(CONFFLAGS)
|
||||
endif
|
||||
|
||||
override_dh_auto_test:
|
||||
|
83
debian/tools/generate-patchlist.sh
vendored
83
debian/tools/generate-patchlist.sh
vendored
@@ -18,50 +18,17 @@ done
|
||||
|
||||
PATCH_LINES=$(echo "${PATCH_DATA}" | wc -l);
|
||||
PATCH_LINES=$((${PATCH_LINES}+20));
|
||||
PATCH_DATA=$(echo "${PATCH_DATA}" | sed ':a;N;$!ba;s/\n/\\n/g');
|
||||
|
||||
cat <<EOF | sed -e "s|##PATCH_LINES##|${PATCH_LINES}|" \
|
||||
-e "s|##PATCH_DATA##|${PATCH_DATA}|"
|
||||
cat <<EOF
|
||||
From: "FDS-Team" <webmaster@fds-team.de>
|
||||
Subject: Autogenerated patch list.
|
||||
|
||||
---
|
||||
diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c
|
||||
index 8bd4eb7..4b4c318 100644
|
||||
--- a/dlls/ntdll/misc.c
|
||||
+++ b/dlls/ntdll/misc.c
|
||||
@@ -60,6 +60,14 @@ const char * CDECL NTDLL_wine_get_version(void)
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
+ * wine_get_patches (NTDLL.@)
|
||||
+ */
|
||||
+const void * CDECL NTDLL_wine_get_patches(void)
|
||||
+{
|
||||
+ return wine_get_patches();
|
||||
+}
|
||||
+
|
||||
+/*********************************************************************
|
||||
* wine_get_build_id (NTDLL.@)
|
||||
*/
|
||||
const char * CDECL NTDLL_wine_get_build_id(void)
|
||||
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index 70bf94f..42eddcf 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -1410,6 +1410,7 @@
|
||||
|
||||
# Version
|
||||
@ cdecl wine_get_version() NTDLL_wine_get_version
|
||||
+@ cdecl wine_get_patches() NTDLL_wine_get_patches
|
||||
@ cdecl wine_get_build_id() NTDLL_wine_get_build_id
|
||||
@ cdecl wine_get_host_version(ptr ptr) NTDLL_wine_get_host_version
|
||||
|
||||
diff --git a/libs/wine/config.c b/libs/wine/config.c
|
||||
index a273502..5fa0cd5 100644
|
||||
--- a/libs/wine/config.c
|
||||
+++ b/libs/wine/config.c
|
||||
@@ -478,6 +478,##PATCH_LINES## @@ const char *wine_get_version(void)
|
||||
@@ -478,6 +478,${PATCH_LINES} @@ const char *wine_get_version(void)
|
||||
return PACKAGE_VERSION;
|
||||
}
|
||||
|
||||
@@ -70,7 +37,7 @@ index a273502..5fa0cd5 100644
|
||||
+ const char *author;
|
||||
+ const char *title;
|
||||
+} wine_patch_data[] = {
|
||||
##PATCH_DATA##
|
||||
${PATCH_DATA}
|
||||
+ { NULL, NULL, NULL }
|
||||
+};
|
||||
+
|
||||
@@ -107,50 +74,6 @@ index 2159fac..7cb2918 100644
|
||||
wine_init;
|
||||
wine_init_argv0_path;
|
||||
wine_is_dbcs_leadbyte;
|
||||
diff --git a/loader/main.c b/loader/main.c
|
||||
index ac67290..516fd82 100644
|
||||
--- a/loader/main.c
|
||||
+++ b/loader/main.c
|
||||
@@ -79,6 +79,12 @@ static inline void reserve_area( void *addr, size_t size )
|
||||
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
+struct wine_patch {
|
||||
+ const char *hash;
|
||||
+ const char *author;
|
||||
+ const char *title;
|
||||
+};
|
||||
+
|
||||
/***********************************************************************
|
||||
* check_command_line
|
||||
*
|
||||
@@ -89,7 +96,8 @@ static void check_command_line( int argc, char *argv[] )
|
||||
static const char usage[] =
|
||||
"Usage: wine PROGRAM [ARGUMENTS...] Run the specified program\n"
|
||||
" wine --help Display this help and exit\n"
|
||||
- " wine --version Output version information and exit";
|
||||
+ " wine --version Output version information and exit\n"
|
||||
+ " wine --patches Output patch information and exit";
|
||||
|
||||
if (argc <= 1)
|
||||
{
|
||||
@@ -106,6 +114,16 @@ static void check_command_line( int argc, char *argv[] )
|
||||
printf( "%s\n", wine_get_build_id() );
|
||||
exit(0);
|
||||
}
|
||||
+ if (!strcmp( argv[1], "--patches" ))
|
||||
+ {
|
||||
+ const struct wine_patch *wine_patch_data = wine_get_patches();
|
||||
+ for(; wine_patch_data->hash != NULL; wine_patch_data++)
|
||||
+ {
|
||||
+ printf( "%s :: %s :: %s\n", wine_patch_data->hash, wine_patch_data->author,
|
||||
+ wine_patch_data->title );
|
||||
+ }
|
||||
+ exit(0);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
diff --git a/include/wine/library.h b/include/wine/library.h
|
||||
index 242bb69..aa9e585 100644
|
||||
--- a/include/wine/library.h
|
||||
|
8
debian/tools/gitapply.sh
vendored
8
debian/tools/gitapply.sh
vendored
@@ -1,4 +1,4 @@
|
||||
#!/bin/bash
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Setup parser variables
|
||||
nogit=0
|
||||
@@ -82,6 +82,12 @@ if [ "$nogit" -eq 0 ] && command -v git >/dev/null 2>&1; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if gzip -V 2>&1 | grep "BSD" &> /dev/null; then
|
||||
echo "This script is not compatible with *BSD utilities." >&2
|
||||
echo "Please install git, which provides the same functionality and will be used instead." >&2
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# Decode base85 git data, prepend with a gzip header
|
||||
awk_b85='
|
||||
BEGIN{
|
||||
|
@@ -0,0 +1,89 @@
|
||||
From d88eb32e40bff9b8279f57b13a5f2cc09a9273ea Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Thu, 29 May 2014 23:43:45 +0200
|
||||
Subject: loader: Add commandline option --patches to show the patch list.
|
||||
|
||||
---
|
||||
dlls/ntdll/misc.c | 8 ++++++++
|
||||
dlls/ntdll/ntdll.spec | 1 +
|
||||
loader/main.c | 19 ++++++++++++++++++-
|
||||
3 files changed, 27 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c
|
||||
index 8bd4eb7..4b4c318 100644
|
||||
--- a/dlls/ntdll/misc.c
|
||||
+++ b/dlls/ntdll/misc.c
|
||||
@@ -60,6 +60,14 @@ const char * CDECL NTDLL_wine_get_version(void)
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
+ * wine_get_patches (NTDLL.@)
|
||||
+ */
|
||||
+const void * CDECL NTDLL_wine_get_patches(void)
|
||||
+{
|
||||
+ return wine_get_patches();
|
||||
+}
|
||||
+
|
||||
+/*********************************************************************
|
||||
* wine_get_build_id (NTDLL.@)
|
||||
*/
|
||||
const char * CDECL NTDLL_wine_get_build_id(void)
|
||||
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
|
||||
index 5bac269..ab50882 100644
|
||||
--- a/dlls/ntdll/ntdll.spec
|
||||
+++ b/dlls/ntdll/ntdll.spec
|
||||
@@ -1419,6 +1419,7 @@
|
||||
|
||||
# Version
|
||||
@ cdecl wine_get_version() NTDLL_wine_get_version
|
||||
+@ cdecl wine_get_patches() NTDLL_wine_get_patches
|
||||
@ cdecl wine_get_build_id() NTDLL_wine_get_build_id
|
||||
@ cdecl wine_get_host_version(ptr ptr) NTDLL_wine_get_host_version
|
||||
|
||||
diff --git a/loader/main.c b/loader/main.c
|
||||
index ac67290..71e5055 100644
|
||||
--- a/loader/main.c
|
||||
+++ b/loader/main.c
|
||||
@@ -79,6 +79,12 @@ static inline void reserve_area( void *addr, size_t size )
|
||||
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
+struct wine_patch {
|
||||
+ const char *hash;
|
||||
+ const char *author;
|
||||
+ const char *title;
|
||||
+};
|
||||
+
|
||||
/***********************************************************************
|
||||
* check_command_line
|
||||
*
|
||||
@@ -89,7 +95,8 @@ static void check_command_line( int argc, char *argv[] )
|
||||
static const char usage[] =
|
||||
"Usage: wine PROGRAM [ARGUMENTS...] Run the specified program\n"
|
||||
" wine --help Display this help and exit\n"
|
||||
- " wine --version Output version information and exit";
|
||||
+ " wine --version Output version information and exit\n"
|
||||
+ " wine --patches Output patch information and exit";
|
||||
|
||||
if (argc <= 1)
|
||||
{
|
||||
@@ -106,6 +113,16 @@ static void check_command_line( int argc, char *argv[] )
|
||||
printf( "%s\n", wine_get_build_id() );
|
||||
exit(0);
|
||||
}
|
||||
+ if (!strcmp( argv[1], "--patches" ))
|
||||
+ {
|
||||
+ const struct wine_patch *wine_patch_data = wine_get_patches();
|
||||
+ for(; wine_patch_data->hash != NULL; wine_patch_data++)
|
||||
+ {
|
||||
+ printf( "%s :: %s :: %s\n", wine_patch_data->hash, wine_patch_data->author,
|
||||
+ wine_patch_data->title );
|
||||
+ }
|
||||
+ exit(0);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -0,0 +1,301 @@
|
||||
From eb9657a39d222aa59140f6b0aff657ae86d1824d Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Wed, 28 May 2014 19:50:51 +0200
|
||||
Subject: loader: Add commandline option --check-libs.
|
||||
|
||||
---
|
||||
include/wine/library.h | 2 ++
|
||||
libs/wine/config.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
libs/wine/loader.c | 36 +++++++++++++++++++
|
||||
libs/wine/wine.def | 2 ++
|
||||
libs/wine/wine.map | 2 ++
|
||||
loader/main.c | 50 +++++++++++++++++++++++++-
|
||||
6 files changed, 182 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/include/wine/library.h b/include/wine/library.h
|
||||
index fae73fe..7395a11 100644
|
||||
--- a/include/wine/library.h
|
||||
+++ b/include/wine/library.h
|
||||
@@ -40,6 +40,7 @@ extern "C" {
|
||||
extern const char *wine_get_build_dir(void);
|
||||
extern const char *wine_get_config_dir(void);
|
||||
extern const char *wine_get_data_dir(void);
|
||||
+extern const char **wine_get_libs(void);
|
||||
extern const char *wine_get_server_dir(void);
|
||||
extern const char *wine_get_user_name(void);
|
||||
extern const char *wine_get_version(void);
|
||||
@@ -52,6 +53,7 @@ extern void wine_exec_wine_binary( const char *name, char **argv, const char *en
|
||||
|
||||
typedef void (*load_dll_callback_t)( void *, const char * );
|
||||
|
||||
+extern int wine_dladdr( void *addr, void *info, char *error, size_t errorsize );
|
||||
extern void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize );
|
||||
extern void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize );
|
||||
extern int wine_dlclose( void *handle, char *error, size_t errorsize );
|
||||
diff --git a/libs/wine/config.c b/libs/wine/config.c
|
||||
index 954035d..3fb7327 100644
|
||||
--- a/libs/wine/config.c
|
||||
+++ b/libs/wine/config.c
|
||||
@@ -444,6 +444,97 @@ const char *wine_get_build_dir(void)
|
||||
return build_dir;
|
||||
}
|
||||
|
||||
+const char *wine_libs[] = {
|
||||
+#ifdef SONAME_LIBCAPI20
|
||||
+ SONAME_LIBCAPI20,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBCUPS
|
||||
+ SONAME_LIBCUPS,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBCURSES
|
||||
+ SONAME_LIBCURSES,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBDBUS_1
|
||||
+ SONAME_LIBDBUS_1,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBFONTCONFIG
|
||||
+ SONAME_LIBFONTCONFIG,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBGL
|
||||
+ SONAME_LIBGL,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBGNUTLS
|
||||
+ SONAME_LIBGNUTLS,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBGSM
|
||||
+ SONAME_LIBGSM,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBHAL
|
||||
+ SONAME_LIBHAL,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBJPEG
|
||||
+ SONAME_LIBJPEG,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBNCURSES
|
||||
+ SONAME_LIBNCURSES,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBNETAPI
|
||||
+ SONAME_LIBNETAPI,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBODBC
|
||||
+ SONAME_LIBODBC,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBOSMESA
|
||||
+ SONAME_LIBOSMESA,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBPNG
|
||||
+ SONAME_LIBPNG,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBSANE
|
||||
+ SONAME_LIBSANE,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBTIFF
|
||||
+ SONAME_LIBTIFF,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBV4L1
|
||||
+ SONAME_LIBV4L1,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXCOMPOSITE
|
||||
+ SONAME_LIBXCOMPOSITE,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXCURSOR
|
||||
+ SONAME_LIBXCURSOR,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXEXT
|
||||
+ SONAME_LIBXEXT,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXI
|
||||
+ SONAME_LIBXI,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXINERAMA
|
||||
+ SONAME_LIBXINERAMA,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXRANDR
|
||||
+ SONAME_LIBXRANDR,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXRENDER
|
||||
+ SONAME_LIBXRENDER,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXSLT
|
||||
+ SONAME_LIBXSLT,
|
||||
+#endif
|
||||
+#ifdef SONAME_LIBXXF86VM
|
||||
+ SONAME_LIBXXF86VM,
|
||||
+#endif
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
+/* return the list of shared libs used by wine */
|
||||
+const char **wine_get_libs(void)
|
||||
+{
|
||||
+ return &wine_libs[0];
|
||||
+}
|
||||
+
|
||||
/* return the full name of the server directory (the one containing the socket) */
|
||||
const char *wine_get_server_dir(void)
|
||||
{
|
||||
diff --git a/libs/wine/loader.c b/libs/wine/loader.c
|
||||
index 5c0192d..91a4428 100644
|
||||
--- a/libs/wine/loader.c
|
||||
+++ b/libs/wine/loader.c
|
||||
@@ -1054,6 +1054,42 @@ void *wine_dlopen( const char *filename, int flag, char *error, size_t errorsize
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
+ * wine_dladdr
|
||||
+ */
|
||||
+int wine_dladdr( void *addr, void *info, char *error, size_t errorsize )
|
||||
+{
|
||||
+#ifdef HAVE_DLADDR
|
||||
+ int ret;
|
||||
+ const char *s;
|
||||
+ dlerror(); dlerror();
|
||||
+ ret = dladdr( addr, (Dl_info *)info );
|
||||
+ s = dlerror();
|
||||
+ if (error && errorsize)
|
||||
+ {
|
||||
+ if (s)
|
||||
+ {
|
||||
+ size_t len = strlen(s);
|
||||
+ if (len >= errorsize) len = errorsize - 1;
|
||||
+ memcpy( error, s, len );
|
||||
+ error[len] = 0;
|
||||
+ }
|
||||
+ else error[0] = 0;
|
||||
+ }
|
||||
+ dlerror();
|
||||
+ return ret;
|
||||
+#else
|
||||
+ if (error)
|
||||
+ {
|
||||
+ static const char msg[] = "dladdr interface not detected by configure";
|
||||
+ size_t len = min( errorsize, sizeof(msg) );
|
||||
+ memcpy( error, msg, len );
|
||||
+ error[len - 1] = 0;
|
||||
+ }
|
||||
+ return 0;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/***********************************************************************
|
||||
* wine_dlsym
|
||||
*/
|
||||
void *wine_dlsym( void *handle, const char *symbol, char *error, size_t errorsize )
|
||||
diff --git a/libs/wine/wine.def b/libs/wine/wine.def
|
||||
index 5b42029..6acf329 100644
|
||||
--- a/libs/wine/wine.def
|
||||
+++ b/libs/wine/wine.def
|
||||
@@ -64,6 +64,7 @@ EXPORTS
|
||||
wine_dbg_sprintf
|
||||
wine_dbgstr_an
|
||||
wine_dbgstr_wn
|
||||
+ wine_dladdr
|
||||
wine_dlclose
|
||||
wine_dll_enum_load_path
|
||||
wine_dll_get_owner
|
||||
@@ -79,6 +80,7 @@ EXPORTS
|
||||
wine_get_build_id
|
||||
wine_get_config_dir
|
||||
wine_get_data_dir
|
||||
+ wine_get_libs
|
||||
wine_get_server_dir
|
||||
wine_get_sortkey
|
||||
wine_get_user_name
|
||||
diff --git a/libs/wine/wine.map b/libs/wine/wine.map
|
||||
index 7cb2918..72ffed8 100644
|
||||
--- a/libs/wine/wine.map
|
||||
+++ b/libs/wine/wine.map
|
||||
@@ -65,6 +65,7 @@ WINE_1.0
|
||||
wine_dbg_sprintf;
|
||||
wine_dbgstr_an;
|
||||
wine_dbgstr_wn;
|
||||
+ wine_dladdr;
|
||||
wine_dlclose;
|
||||
wine_dll_enum_load_path;
|
||||
wine_dll_get_owner;
|
||||
@@ -85,6 +86,7 @@ WINE_1.0
|
||||
wine_get_es;
|
||||
wine_get_fs;
|
||||
wine_get_gs;
|
||||
+ wine_get_libs;
|
||||
wine_get_server_dir;
|
||||
wine_get_sortkey;
|
||||
wine_get_ss;
|
||||
diff --git a/loader/main.c b/loader/main.c
|
||||
index 71e5055..131ac2f 100644
|
||||
--- a/loader/main.c
|
||||
+++ b/loader/main.c
|
||||
@@ -36,6 +36,12 @@
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
+#ifdef HAVE_DLADDR
|
||||
+# include <dlfcn.h>
|
||||
+#endif
|
||||
+#ifdef HAVE_LINK_H
|
||||
+# include <link.h>
|
||||
+#endif
|
||||
#include <pthread.h>
|
||||
|
||||
#include "wine/library.h"
|
||||
@@ -96,7 +102,8 @@ static void check_command_line( int argc, char *argv[] )
|
||||
"Usage: wine PROGRAM [ARGUMENTS...] Run the specified program\n"
|
||||
" wine --help Display this help and exit\n"
|
||||
" wine --version Output version information and exit\n"
|
||||
- " wine --patches Output patch information and exit";
|
||||
+ " wine --patches Output patch information and exit\n"
|
||||
+ " wine --check-libs Checks if shared libs are installed";
|
||||
|
||||
if (argc <= 1)
|
||||
{
|
||||
@@ -123,6 +130,47 @@ static void check_command_line( int argc, char *argv[] )
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
+ if (!strcmp( argv[1], "--check-libs" ))
|
||||
+ {
|
||||
+ void* lib_handle;
|
||||
+ int ret = 0;
|
||||
+ const char **wine_libs = wine_get_libs();
|
||||
+
|
||||
+ for(; *wine_libs; wine_libs++)
|
||||
+ {
|
||||
+ lib_handle = wine_dlopen( *wine_libs, RTLD_NOW, NULL, 0 );
|
||||
+ if (lib_handle)
|
||||
+ {
|
||||
+ #ifdef HAVE_DLADDR
|
||||
+ Dl_info libinfo;
|
||||
+ void* symbol;
|
||||
+
|
||||
+ #ifdef HAVE_LINK_H
|
||||
+ struct link_map *lm = (struct link_map *)lib_handle;
|
||||
+ symbol = (void *)lm->l_addr;
|
||||
+ #else
|
||||
+ symbol = wine_dlsym( lib_handle, "_init", NULL, 0 );
|
||||
+ #endif
|
||||
+ if (symbol && wine_dladdr( symbol, &libinfo, NULL, 0 ))
|
||||
+ {
|
||||
+ printf( "%s: %s\n", *wine_libs, libinfo.dli_fname );
|
||||
+ }
|
||||
+ else
|
||||
+ #endif
|
||||
+ {
|
||||
+ printf( "%s: found\n", *wine_libs );
|
||||
+ }
|
||||
+ wine_dlclose( lib_handle, NULL, 0 );
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ printf( "%s: missing\n", *wine_libs );
|
||||
+ ret = 1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ exit(ret);
|
||||
+ }
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -0,0 +1,3 @@
|
||||
Revision: 1
|
||||
Author: Sebastian Lackner
|
||||
Title: Add commandline option --patches to show the patch list.
|
@@ -0,0 +1,3 @@
|
||||
Revision: 1
|
||||
Author: Michael Müller
|
||||
Title: Add commandline option --check-libs to test if shared libraries are installed.
|
@@ -1,15 +1,15 @@
|
||||
From 69e77bd226057f486d1c076ccbebb963d3b750ee Mon Sep 17 00:00:00 2001
|
||||
From 864781654bfbb059a351fdcda6773e2857019278 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 3 Apr 2014 09:25:48 -0600
|
||||
Date: Tue, 6 May 2014 08:39:18 -0600
|
||||
Subject: server: Add socket-side support for the interface change
|
||||
notification object.
|
||||
|
||||
---
|
||||
server/sock.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 91 insertions(+), 1 deletion(-)
|
||||
server/sock.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 86 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/server/sock.c b/server/sock.c
|
||||
index 05fc38b..20d022f 100644
|
||||
index 3eb1bdf..ad20a69 100644
|
||||
--- a/server/sock.c
|
||||
+++ b/server/sock.c
|
||||
@@ -106,12 +106,18 @@ struct sock
|
||||
@@ -22,26 +22,26 @@ index 05fc38b..20d022f 100644
|
||||
};
|
||||
|
||||
static void sock_dump( struct object *obj, int verbose );
|
||||
+static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data );
|
||||
+static void sock_add_ifchange( struct sock *sock, const async_data_t *async_data );
|
||||
static int sock_signaled( struct object *obj, struct wait_queue_entry *entry );
|
||||
static struct fd *sock_get_fd( struct object *obj );
|
||||
static void sock_destroy( struct object *obj );
|
||||
+static int sock_get_ifchange_q( struct sock *sock, struct async_queue **async_queue );
|
||||
+static struct async_queue *sock_get_ifchange_q( struct sock *sock );
|
||||
+static void sock_destroy_ifchange_q( struct sock *sock );
|
||||
|
||||
static int sock_get_poll_events( struct fd *fd );
|
||||
static void sock_poll_event( struct fd *fd, int event );
|
||||
@@ -539,7 +545,8 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *a
|
||||
@@ -529,7 +535,8 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *a
|
||||
switch(code)
|
||||
{
|
||||
case WS_SIO_ADDRESS_LIST_CHANGE:
|
||||
- /* intentional fallthrough, not yet supported */
|
||||
+ error = sock_add_ifchange( sock, async_data );
|
||||
+ break;
|
||||
+ sock_add_ifchange( sock, async_data );
|
||||
+ return 0;
|
||||
default:
|
||||
error = STATUS_NOT_SUPPORTED;
|
||||
break;
|
||||
@@ -625,6 +632,7 @@ static void sock_destroy( struct object *obj )
|
||||
set_error( STATUS_NOT_SUPPORTED );
|
||||
return 0;
|
||||
@@ -610,6 +617,7 @@ static void sock_destroy( struct object *obj )
|
||||
|
||||
free_async_queue( sock->read_q );
|
||||
free_async_queue( sock->write_q );
|
||||
@@ -49,7 +49,7 @@ index 05fc38b..20d022f 100644
|
||||
if (sock->event) release_object( sock->event );
|
||||
if (sock->fd)
|
||||
{
|
||||
@@ -651,6 +659,8 @@ static void init_sock(struct sock *sock)
|
||||
@@ -636,6 +644,8 @@ static void init_sock(struct sock *sock)
|
||||
sock->deferred = NULL;
|
||||
sock->read_q = NULL;
|
||||
sock->write_q = NULL;
|
||||
@@ -58,37 +58,37 @@ index 05fc38b..20d022f 100644
|
||||
memset( sock->errors, 0, sizeof(sock->errors) );
|
||||
}
|
||||
|
||||
@@ -939,6 +949,86 @@ static void sock_set_error(void)
|
||||
@@ -924,6 +934,81 @@ static void sock_set_error(void)
|
||||
set_error( sock_get_ntstatus( errno ) );
|
||||
}
|
||||
|
||||
+/* add interface change notification to a socket */
|
||||
+static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data )
|
||||
+static void sock_add_ifchange( struct sock *sock, const async_data_t *async_data )
|
||||
+{
|
||||
+ struct async_queue *ifchange_q = NULL;
|
||||
+ struct async *async;
|
||||
+ int error;
|
||||
+
|
||||
+ error = sock_get_ifchange_q( sock, &ifchange_q );
|
||||
+ if (error != STATUS_PENDING)
|
||||
+ return error;
|
||||
+ if (!(ifchange_q = sock_get_ifchange_q( sock )))
|
||||
+ return;
|
||||
+
|
||||
+ if (!(async = create_async( current, ifchange_q, async_data )))
|
||||
+ {
|
||||
+ if (!async_queued( ifchange_q ))
|
||||
+ sock_destroy_ifchange_q( sock );
|
||||
+
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+ set_error( STATUS_NO_MEMORY );
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ release_object( async );
|
||||
+ return error;
|
||||
+ set_error( STATUS_PENDING );
|
||||
+}
|
||||
+
|
||||
+/* stub ifchange object */
|
||||
+static int get_ifchange( struct object **obj )
|
||||
+static struct object *get_ifchange( void )
|
||||
+{
|
||||
+ return STATUS_NOT_SUPPORTED;
|
||||
+ set_error( STATUS_NOT_SUPPORTED );
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+/* stub ifchange add socket to list */
|
||||
@@ -97,21 +97,16 @@ index 05fc38b..20d022f 100644
|
||||
+}
|
||||
+
|
||||
+/* create a new ifchange queue for a specific socket or, if one already exists, reuse the existing one */
|
||||
+static int sock_get_ifchange_q( struct sock *sock, struct async_queue **async_queue )
|
||||
+static struct async_queue *sock_get_ifchange_q( struct sock *sock )
|
||||
+{
|
||||
+ struct object *ifchange = NULL;
|
||||
+ struct fd *fd;
|
||||
+ int error;
|
||||
+
|
||||
+ if (sock->ifchange_q) /* reuse existing ifchange_q for this socket */
|
||||
+ {
|
||||
+ *async_queue = sock->ifchange_q;
|
||||
+ return STATUS_PENDING;
|
||||
+ }
|
||||
+ return sock->ifchange_q;
|
||||
+
|
||||
+ error = get_ifchange( &ifchange );
|
||||
+ if (error != STATUS_PENDING)
|
||||
+ return error;
|
||||
+ if (!(ifchange = get_ifchange()))
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* create the ifchange notification queue */
|
||||
+ fd = ifchange->ops->get_fd( ifchange );
|
||||
@@ -120,14 +115,14 @@ index 05fc38b..20d022f 100644
|
||||
+ if (!sock->ifchange_q)
|
||||
+ {
|
||||
+ release_object( ifchange );
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+ set_error( STATUS_NO_MEMORY );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ /* add the socket to the ifchange notification list */
|
||||
+ ifchange_add_sock( ifchange, sock );
|
||||
+ sock->ifchange_obj = ifchange;
|
||||
+ *async_queue = sock->ifchange_q;
|
||||
+ return error;
|
||||
+ return sock->ifchange_q;
|
||||
+}
|
||||
+
|
||||
+/* destroy an existing ifchange queue for a specific socket */
|
@@ -1,14 +1,14 @@
|
||||
From 45dfbd2ddb5ca2c64fcfd56392be9c55513abc4b Mon Sep 17 00:00:00 2001
|
||||
From c93a05ca0114b76c542f251de60b8c009e4a72b0 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 3 Apr 2014 09:23:02 -0600
|
||||
Subject: server: Add delayed processing for socket-specific ioctl().
|
||||
Date: Tue, 6 May 2014 08:44:59 -0600
|
||||
Subject: server: Add blocked support for SIO_ADDRESS_LIST_CHANGE ioctl().
|
||||
|
||||
---
|
||||
server/event.c | 13 +++++++++++++
|
||||
server/named_pipe.c | 13 -------------
|
||||
server/object.h | 1 +
|
||||
server/sock.c | 19 +++++++++++++++++--
|
||||
4 files changed, 31 insertions(+), 15 deletions(-)
|
||||
server/sock.c | 26 ++++++++++++++++++++------
|
||||
4 files changed, 34 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/server/event.c b/server/event.c
|
||||
index 4d3c562..0daa5b2 100644
|
||||
@@ -71,44 +71,78 @@ index bb3ff21..bad162f 100644
|
||||
extern struct keyed_event *get_keyed_event_obj( struct process *process, obj_handle_t handle, unsigned int access );
|
||||
extern void pulse_event( struct event *event );
|
||||
diff --git a/server/sock.c b/server/sock.c
|
||||
index 3eb1bdf..05fc38b 100644
|
||||
index ad20a69..a8a5ac3 100644
|
||||
--- a/server/sock.c
|
||||
+++ b/server/sock.c
|
||||
@@ -523,17 +523,32 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *a
|
||||
@@ -112,7 +112,7 @@ struct sock
|
||||
};
|
||||
|
||||
static void sock_dump( struct object *obj, int verbose );
|
||||
-static void sock_add_ifchange( struct sock *sock, const async_data_t *async_data );
|
||||
+static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data );
|
||||
static int sock_signaled( struct object *obj, struct wait_queue_entry *entry );
|
||||
static struct fd *sock_get_fd( struct object *obj );
|
||||
static void sock_destroy( struct object *obj );
|
||||
@@ -529,14 +529,27 @@ obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *a
|
||||
int blocking, const void *data, data_size_t size )
|
||||
{
|
||||
struct sock *sock = get_fd_user( fd );
|
||||
+ obj_handle_t wait_handle = 0;
|
||||
+ async_data_t new_data;
|
||||
+ int error;
|
||||
|
||||
assert( sock->obj.ops == &sock_ops );
|
||||
|
||||
+ if (blocking)
|
||||
+ {
|
||||
+ if (!(wait_handle = alloc_wait_event( current->process ))) return 0;
|
||||
+ new_data = *async_data;
|
||||
+ new_data.event = wait_handle;
|
||||
+ async_data = &new_data;
|
||||
+ }
|
||||
switch(code)
|
||||
{
|
||||
case WS_SIO_ADDRESS_LIST_CHANGE:
|
||||
/* intentional fallthrough, not yet supported */
|
||||
default:
|
||||
- set_error( STATUS_NOT_SUPPORTED );
|
||||
- sock_add_ifchange( sock, async_data );
|
||||
- return 0;
|
||||
+ error = STATUS_NOT_SUPPORTED;
|
||||
+ break;
|
||||
}
|
||||
+ set_error( error );
|
||||
+ if (error == STATUS_PENDING)
|
||||
+ if (blocking)
|
||||
+ {
|
||||
+ if (!(wait_handle = alloc_wait_event( current->process ))) return 0;
|
||||
+ new_data = *async_data;
|
||||
+ new_data.event = wait_handle;
|
||||
+ async_data = &new_data;
|
||||
+ }
|
||||
+ if (!sock_add_ifchange( sock, async_data ) && wait_handle)
|
||||
+ {
|
||||
+ close_handle( current->process, wait_handle );
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return wait_handle;
|
||||
+ close_handle( current->process, wait_handle );
|
||||
+ return 0;
|
||||
default:
|
||||
set_error( STATUS_NOT_SUPPORTED );
|
||||
return 0;
|
||||
@@ -935,13 +948,13 @@ static void sock_set_error(void)
|
||||
}
|
||||
|
||||
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
|
||||
/* add interface change notification to a socket */
|
||||
-static void sock_add_ifchange( struct sock *sock, const async_data_t *async_data )
|
||||
+static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data )
|
||||
{
|
||||
struct async_queue *ifchange_q = NULL;
|
||||
struct async *async;
|
||||
|
||||
if (!(ifchange_q = sock_get_ifchange_q( sock )))
|
||||
- return;
|
||||
+ return FALSE;
|
||||
|
||||
if (!(async = create_async( current, ifchange_q, async_data )))
|
||||
{
|
||||
@@ -949,11 +962,12 @@ static void sock_add_ifchange( struct sock *sock, const async_data_t *async_data
|
||||
sock_destroy_ifchange_q( sock );
|
||||
|
||||
set_error( STATUS_NO_MEMORY );
|
||||
- return;
|
||||
+ return FALSE;
|
||||
}
|
||||
|
||||
release_object( async );
|
||||
set_error( STATUS_PENDING );
|
||||
+ return TRUE;
|
||||
}
|
||||
|
||||
/* stub ifchange object */
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -1,14 +1,14 @@
|
||||
From 85d0475a493be336c340f25cab9895846e202f26 Mon Sep 17 00:00:00 2001
|
||||
From 55c83dc866e2d0e2cdc15b976b6d818a03ef4b89 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 3 Apr 2014 09:26:34 -0600
|
||||
Date: Tue, 6 May 2014 08:49:52 -0600
|
||||
Subject: server: Implement the interface change notification object.
|
||||
|
||||
---
|
||||
server/sock.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 198 insertions(+), 2 deletions(-)
|
||||
server/sock.c | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
|
||||
1 file changed, 203 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/server/sock.c b/server/sock.c
|
||||
index 20d022f..82464f2 100644
|
||||
index a8a5ac3..2af9acc 100644
|
||||
--- a/server/sock.c
|
||||
+++ b/server/sock.c
|
||||
@@ -43,6 +43,10 @@
|
||||
@@ -22,11 +22,12 @@ index 20d022f..82464f2 100644
|
||||
|
||||
#include "ntstatus.h"
|
||||
#define WIN32_NO_STATUS
|
||||
@@ -972,15 +976,207 @@ static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data
|
||||
return error;
|
||||
@@ -970,16 +974,212 @@ static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
-/* stub ifchange object */
|
||||
-static struct object *get_ifchange( void )
|
||||
+#ifdef HAVE_LINUX_RTNETLINK_H
|
||||
+
|
||||
+/* only keep one ifchange object around, all sockets waiting for wakeups will look to it */
|
||||
@@ -162,7 +163,7 @@ index 20d022f..82464f2 100644
|
||||
+}
|
||||
+
|
||||
+static void ifchange_reselect_async( struct fd *fd, struct async_queue *queue )
|
||||
+{
|
||||
{
|
||||
+ /* do nothing, this object is about to disappear */
|
||||
+}
|
||||
+
|
||||
@@ -170,8 +171,8 @@ index 20d022f..82464f2 100644
|
||||
+
|
||||
+/* we only need one of these interface notification objects, all of the sockets dependent upon
|
||||
+ * it will wake up when a notification event occurs */
|
||||
static int get_ifchange( struct object **obj )
|
||||
{
|
||||
+ static struct object *get_ifchange( void )
|
||||
+ {
|
||||
+#ifdef HAVE_LINUX_RTNETLINK_H
|
||||
+ struct ifchange *ifchange;
|
||||
+ struct sockaddr_nl addr;
|
||||
@@ -180,14 +181,16 @@ index 20d022f..82464f2 100644
|
||||
+ if (ifchange_object)
|
||||
+ {
|
||||
+ /* increment the refcount for each socket that uses the ifchange object */
|
||||
+ *obj = grab_object( ifchange_object );
|
||||
+ return STATUS_PENDING;
|
||||
+ return grab_object( ifchange_object );
|
||||
+ }
|
||||
+
|
||||
+ /* create the socket we need for processing interface change notifications */
|
||||
+ unix_fd = socket( PF_NETLINK, SOCK_RAW, NETLINK_ROUTE );
|
||||
+ if (unix_fd == -1)
|
||||
+ return sock_get_ntstatus( errno );
|
||||
+ {
|
||||
+ sock_set_error();
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ fcntl( unix_fd, F_SETFL, O_NONBLOCK ); /* make socket nonblocking */
|
||||
+ memset( &addr, 0, sizeof(addr) );
|
||||
+ addr.nl_family = AF_NETLINK;
|
||||
@@ -196,27 +199,30 @@ index 20d022f..82464f2 100644
|
||||
+ if (bind( unix_fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1)
|
||||
+ {
|
||||
+ close( unix_fd );
|
||||
+ return sock_get_ntstatus( errno );
|
||||
+ sock_set_error();
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ if (!(ifchange = alloc_object( &ifchange_ops )))
|
||||
+ {
|
||||
+ close( unix_fd );
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+ set_error( STATUS_NO_MEMORY );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ list_init( &ifchange->sockets );
|
||||
+ if (!(ifchange->fd = create_anonymous_fd( &ifchange_fd_ops, unix_fd, &ifchange->obj, 0 )))
|
||||
+ {
|
||||
+ release_object( ifchange );
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+ set_error( STATUS_NO_MEMORY );
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ set_fd_events( ifchange->fd, POLLIN ); /* enable read wakeup on the file descriptor */
|
||||
+
|
||||
+ /* the ifchange object is now successfully configured */
|
||||
+ ifchange_object = &ifchange->obj;
|
||||
+ *obj = &ifchange->obj;
|
||||
+ return STATUS_PENDING;
|
||||
+ return &ifchange->obj;
|
||||
+#else
|
||||
return STATUS_NOT_SUPPORTED;
|
||||
set_error( STATUS_NOT_SUPPORTED );
|
||||
return NULL;
|
||||
+#endif
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From e031dc5069bebd63770a405d684ee75a14d1826b Mon Sep 17 00:00:00 2001
|
||||
From 4498c57f61bf85fca6eb17afd21c0c7051534f75 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Fri, 18 Apr 2014 14:01:35 -0600
|
||||
Subject: server: Retrieve file security attributes with extended file
|
||||
@@ -11,7 +11,7 @@ Subject: server: Retrieve file security attributes with extended file
|
||||
3 files changed, 50 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
|
||||
index bd45189..e5ef7e6 100644
|
||||
index a0574c4..26cde37 100644
|
||||
--- a/dlls/advapi32/tests/security.c
|
||||
+++ b/dlls/advapi32/tests/security.c
|
||||
@@ -3105,24 +3105,24 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -49,9 +49,9 @@ index bd45189..e5ef7e6 100644
|
||||
+ todo_wine ok(ace->Mask == 0x1f01ff,
|
||||
+ "Administators Group ACE has unexpected mask (0x%x != 0x1f01ff)\n", ace->Mask);
|
||||
}
|
||||
LocalFree(pSD);
|
||||
|
||||
done:
|
||||
@@ -3294,23 +3294,22 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
@@ -3297,23 +3297,22 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
bret = pGetAce(pDacl, 0, (VOID **)&ace);
|
||||
ok(bret, "Failed to get Current User ACE.\n");
|
||||
bret = EqualSid(&ace->SidStart, user_sid);
|
||||
@@ -81,7 +81,7 @@ index bd45189..e5ef7e6 100644
|
||||
}
|
||||
LocalFree(pSD);
|
||||
HeapFree(GetProcessHeap(), 0, user);
|
||||
@@ -3960,22 +3959,22 @@ static void test_GetSecurityInfo(void)
|
||||
@@ -3963,22 +3962,22 @@ static void test_GetSecurityInfo(void)
|
||||
bret = pGetAce(pDacl, 0, (VOID **)&ace);
|
||||
ok(bret, "Failed to get Current User ACE.\n");
|
||||
bret = EqualSid(&ace->SidStart, user_sid);
|
||||
@@ -108,8 +108,8 @@ index bd45189..e5ef7e6 100644
|
||||
+ todo_wine ok(ace->Mask == 0x1f01ff,
|
||||
+ "Administators Group ACE has unexpected mask (0x%x != 0x1f01ff)\n", ace->Mask);
|
||||
}
|
||||
LocalFree(pSD);
|
||||
CloseHandle(obj);
|
||||
}
|
||||
diff --git a/server/change.c b/server/change.c
|
||||
index c391180..77c01bb 100644
|
||||
--- a/server/change.c
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 74d97eda7172d7eae8468c7a32d4e330382afca2 Mon Sep 17 00:00:00 2001
|
||||
From 689b660afba80654cde0a2dd6cf1d647a6e3705c Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Fri, 18 Apr 2014 14:05:32 -0600
|
||||
Subject: server: Convert return of file security masks with generic access
|
||||
@@ -10,7 +10,7 @@ Subject: server: Convert return of file security masks with generic access
|
||||
2 files changed, 34 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
|
||||
index e5ef7e6..5b7e6a6 100644
|
||||
index 26cde37..48a3291 100644
|
||||
--- a/dlls/advapi32/tests/security.c
|
||||
+++ b/dlls/advapi32/tests/security.c
|
||||
@@ -3109,8 +3109,8 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -33,9 +33,9 @@ index e5ef7e6..5b7e6a6 100644
|
||||
+ ok(ace->Mask == 0x1f01ff, "Administators Group ACE has unexpected mask (0x%x != 0x1f01ff)\n",
|
||||
+ ace->Mask);
|
||||
}
|
||||
LocalFree(pSD);
|
||||
|
||||
done:
|
||||
@@ -3297,8 +3297,8 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
@@ -3300,8 +3300,8 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
ok(bret, "Current User ACE != Current User SID.\n");
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
@@ -46,7 +46,7 @@ index e5ef7e6..5b7e6a6 100644
|
||||
}
|
||||
if (acl_size.AceCount > 1)
|
||||
{
|
||||
@@ -3308,8 +3308,8 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
@@ -3311,8 +3311,8 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
ok(bret || broken(!bret) /* win2k */, "Administators Group ACE != Administators Group SID.\n");
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
@@ -57,7 +57,7 @@ index e5ef7e6..5b7e6a6 100644
|
||||
}
|
||||
LocalFree(pSD);
|
||||
HeapFree(GetProcessHeap(), 0, user);
|
||||
@@ -3962,8 +3962,8 @@ static void test_GetSecurityInfo(void)
|
||||
@@ -3965,8 +3965,8 @@ static void test_GetSecurityInfo(void)
|
||||
ok(bret, "Current User ACE != Current User SID.\n");
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
@@ -68,7 +68,7 @@ index e5ef7e6..5b7e6a6 100644
|
||||
}
|
||||
if (acl_size.AceCount > 1)
|
||||
{
|
||||
@@ -3973,8 +3973,8 @@ static void test_GetSecurityInfo(void)
|
||||
@@ -3976,8 +3976,8 @@ static void test_GetSecurityInfo(void)
|
||||
ok(bret, "Administators Group ACE != Administators Group SID.\n");
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
@@ -77,8 +77,8 @@ index e5ef7e6..5b7e6a6 100644
|
||||
+ ok(ace->Mask == 0x1f01ff, "Administators Group ACE has unexpected mask (0x%x != 0x1f01ff)\n",
|
||||
+ ace->Mask);
|
||||
}
|
||||
LocalFree(pSD);
|
||||
CloseHandle(obj);
|
||||
}
|
||||
diff --git a/server/file.c b/server/file.c
|
||||
index c4706b6..75f015b 100644
|
||||
--- a/server/file.c
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From fba93c12801c694d0e1248cd582c9d679e3a246a Mon Sep 17 00:00:00 2001
|
||||
From c6052d785f4419a80ca091d978ee1ff3e7400ca9 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Fri, 18 Apr 2014 14:08:36 -0600
|
||||
Subject: server: Inherit security attributes from parent directories on
|
||||
@@ -12,7 +12,7 @@ Subject: server: Inherit security attributes from parent directories on
|
||||
4 files changed, 179 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
|
||||
index 5b7e6a6..68b63a0 100644
|
||||
index 48a3291..f3a3c09 100644
|
||||
--- a/dlls/advapi32/tests/security.c
|
||||
+++ b/dlls/advapi32/tests/security.c
|
||||
@@ -3030,10 +3030,11 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -28,9 +28,9 @@ index 5b7e6a6..68b63a0 100644
|
||||
DWORD error;
|
||||
PACL pDacl;
|
||||
|
||||
@@ -3125,6 +3126,43 @@ static void test_CreateDirectoryA(void)
|
||||
ace->Mask);
|
||||
@@ -3126,6 +3127,43 @@ static void test_CreateDirectoryA(void)
|
||||
}
|
||||
LocalFree(pSD);
|
||||
|
||||
+ /* Test inheritance of ACLs */
|
||||
+ strcpy(tmpfile, tmpdir);
|
||||
|
@@ -0,0 +1,38 @@
|
||||
From 8abcd1aac3f65585dfb2e761dd737c0609cd5f93 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sun, 1 Jun 2014 23:46:09 +0200
|
||||
Subject: server: Add additional checks in get_xattr_sd to prevent crashes
|
||||
caused by invalid attributes.
|
||||
|
||||
---
|
||||
server/file.c | 10 ++++++++--
|
||||
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/server/file.c b/server/file.c
|
||||
index 08231a7..11522c3 100644
|
||||
--- a/server/file.c
|
||||
+++ b/server/file.c
|
||||
@@ -738,12 +738,18 @@ struct security_descriptor *get_xattr_sd( int fd )
|
||||
int n;
|
||||
|
||||
n = fgetxattr( fd, "user.wine.sd", buffer, sizeof(buffer) );
|
||||
- if (n == -1) return NULL;
|
||||
+ if (n == -1 || n < 2 + sizeof(struct security_descriptor)) return NULL;
|
||||
+
|
||||
/* validate that we can handle the descriptor */
|
||||
if (buffer[0] != SECURITY_DESCRIPTOR_REVISION || buffer[1] != 0) return NULL;
|
||||
|
||||
+ sd = (struct security_descriptor *)&buffer[2];
|
||||
+ if (n < 2 + sizeof(struct security_descriptor) + sd->owner_len
|
||||
+ + sd->group_len + sd->sacl_len + sd->dacl_len)
|
||||
+ return NULL;
|
||||
+
|
||||
sd = mem_alloc( n - 2 );
|
||||
- memcpy( sd, &buffer[2], n - 2 );
|
||||
+ if (sd) memcpy( sd, &buffer[2], n - 2 );
|
||||
return sd;
|
||||
#else
|
||||
return NULL;
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -0,0 +1,80 @@
|
||||
From 682e63875f4ae2f58da1677ff44cf1adea35e7d8 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
|
||||
Date: Sun, 1 Jun 2014 22:06:35 +0200
|
||||
Subject: server: Add support for ACLs/xattr on FreeBSD
|
||||
|
||||
---
|
||||
configure.ac | 2 +-
|
||||
server/file.c | 16 ++++++++++++++--
|
||||
2 files changed, 15 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 0663893..c1ea0c9 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -668,7 +668,7 @@ AC_CHECK_HEADERS([libprocstat.h],,,
|
||||
|
||||
if test "x$with_xattr" != "xno"
|
||||
then
|
||||
- AC_CHECK_HEADERS(attr/xattr.h,HAVE_XATTR=1)
|
||||
+ AC_CHECK_HEADERS(attr/xattr.h sys/extattr.h,HAVE_XATTR=1)
|
||||
fi
|
||||
if test "x$with_xattr" == "xyes"
|
||||
then
|
||||
diff --git a/server/file.c b/server/file.c
|
||||
index d5d5ad4..5a4d2f4 100644
|
||||
--- a/server/file.c
|
||||
+++ b/server/file.c
|
||||
@@ -43,6 +43,10 @@
|
||||
#ifdef HAVE_ATTR_XATTR_H
|
||||
#include <attr/xattr.h>
|
||||
#endif
|
||||
+#ifdef HAVE_SYS_EXTATTR_H
|
||||
+#include <sys/extattr.h>
|
||||
+#define XATTR_SIZE_MAX 65536
|
||||
+#endif
|
||||
|
||||
#include "ntstatus.h"
|
||||
#define WIN32_NO_STATUS
|
||||
@@ -184,7 +188,7 @@ static struct object *create_file_obj( struct fd *fd, unsigned int access, mode_
|
||||
|
||||
void set_xattr_sd( int fd, const struct security_descriptor *sd, const SID *user, const SID *group )
|
||||
{
|
||||
-#ifdef HAVE_ATTR_XATTR_H
|
||||
+#if defined(HAVE_ATTR_XATTR_H) || defined(HAVE_SYS_EXTATTR_H)
|
||||
char buffer[XATTR_SIZE_MAX], *dst_ptr = &buffer[2], *src_ptr = (char *)sd;
|
||||
int present, len, owner_len, group_len;
|
||||
struct security_descriptor *dst_sd;
|
||||
@@ -241,7 +245,11 @@ void set_xattr_sd( int fd, const struct security_descriptor *sd, const SID *user
|
||||
memcpy( dst_ptr, src_ptr, sd->dacl_len );
|
||||
src_ptr += sd->dacl_len;
|
||||
dst_ptr += sd->dacl_len;
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
fsetxattr( fd, "user.wine.sd", buffer, len, 0 );
|
||||
+#else
|
||||
+ extattr_set_fd( fd, EXTATTR_NAMESPACE_USER, "wine.sd", buffer, len );
|
||||
+#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -732,12 +740,16 @@ struct security_descriptor *mode_to_sd( mode_t mode, const SID *user, const SID
|
||||
|
||||
struct security_descriptor *get_xattr_sd( int fd )
|
||||
{
|
||||
-#ifdef HAVE_ATTR_XATTR_H
|
||||
+#if defined(HAVE_ATTR_XATTR_H) || defined(HAVE_SYS_EXTATTR_H)
|
||||
struct security_descriptor *sd;
|
||||
char buffer[XATTR_SIZE_MAX];
|
||||
int n;
|
||||
|
||||
+#if defined(HAVE_ATTR_XATTR_H)
|
||||
n = fgetxattr( fd, "user.wine.sd", buffer, sizeof(buffer) );
|
||||
+#else
|
||||
+ n = extattr_get_fd( fd, EXTATTR_NAMESPACE_USER, "wine.sd", buffer, sizeof(buffer) );
|
||||
+#endif
|
||||
if (n == -1 || n < 2 + sizeof(struct security_descriptor)) return NULL;
|
||||
|
||||
/* validate that we can handle the descriptor */
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -1,3 +1,3 @@
|
||||
Revision: 4
|
||||
Revision: 6
|
||||
Author: Erich E. Hoover
|
||||
Title: Store and return security attributes with extended file attributes.
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user