Compare commits

..

98 Commits

Author SHA1 Message Date
Erich E. Hoover
5d354c9b2a Release 1.7.21 2014-06-27 23:09:39 -06:00
Sebastian Lackner
e8fee88c50 Remove several patches (accepted upstream). 2014-06-22 20:40:51 +02:00
Sebastian Lackner
c2e8167d6d Release 1.7.20. 2014-06-14 19:46:09 +02:00
Sebastian Lackner
907d56238e Fix warning during compilation for unused variable. 2014-06-14 10:37:54 +02:00
Sebastian Lackner
674b998176 Add patch to fix issues with Obsidium copy protection (add missing exception in OutputDebugStringA). 2014-06-14 09:45:49 +02:00
Erich E. Hoover
882b560d0d Added patches for default security descriptor ownership and DACLs for processes. 2014-06-13 15:29:17 -06:00
Erich E. Hoover
8df335170a Updated changelog with recent changes. 2014-06-13 15:29:16 -06:00
Sebastian Lackner
2241ffdf4b Disable gstreamer (broken with glib >= 2.32.0).
See http://bugs.winehq.org/show_bug.cgi?id=30557 for more details.
2014-06-13 23:22:54 +02:00
Sebastian Lackner
dff7b6b562 Update winepulse patches to latest revision (extracted from 1.7.19). 2014-06-13 22:47:13 +02:00
Sebastian Lackner
cdb00a9e7a Update README.md. 2014-06-13 22:02:13 +02:00
Sebastian Lackner
f7541123b5 Add patch to avoid race-condition when unloading modules while hook is active. 2014-06-13 21:49:49 +02:00
Sebastian Lackner
6578707ac2 Remove several patches (accepted upstream). 2014-06-13 20:07:34 +02:00
Michael MĂĽller
719c65ebb0 Fix recommendation for odbc and add libgsm1. 2014-06-07 14:55:29 +02:00
Erich E. Hoover
ddefcb372a Force autoreconf even when timestamp seems to indicate that it is not necessary. 2014-06-05 15:38:43 -06:00
Michael MĂĽller
c594bca17a Error out in git apply script on *BSD. 2014-06-05 21:20:54 +02:00
Sebastian Lackner
3c33a592f6 Make generate-patchlist.sh compatible with FreeBSD. 2014-06-05 22:17:55 +02:00
Sebastian Lackner
4476d8af38 Update changelog for release 1.7.19-1. 2014-06-02 23:55:55 +02:00
Sebastian Lackner
b216cdce2c Update FD cache patch to allow complication with -DNDEBUG. 2014-06-02 20:57:19 +02:00
Sebastian Lackner
fc086bb2bc Add additional check to ensure wineserver doesn't crash if mem_alloc fails. 2014-06-02 01:42:23 +02:00
Sebastian Lackner
772dfd9f5a Work around compiler signed <-> unsigned casting issues. 2014-06-02 01:38:40 +02:00
Michael MĂĽller
b4d53a7344 Add support for xattr/ACLs on FreeBSD 2014-06-01 22:10:22 +02:00
Sebastian Lackner
e5c7fe8c18 Merge branch 'master' of github.com:compholio/wine-compholio-daily 2014-06-01 23:48:40 +02:00
Sebastian Lackner
fdc24226bf 02-ACL_Extended_Attributes: Add additional patch to prevent crashes in case of invalid extended attributes. 2014-06-01 23:47:53 +02:00
Michael MĂĽller
3886ee9fae Add patch to detect direct rendering in Wine applications. 2014-06-01 22:55:11 +02:00
Sebastian Lackner
229eb9bba5 Update fd cache patches (use slightly slower interlocked commands, which should also work well on less usual processor architectures). 2014-05-31 22:10:09 +02:00
Sebastian Lackner
1800d1f853 Fixed possible race-condition in FD cache patches. 2014-05-31 18:38:40 +02:00
Sebastian Lackner
24d682fd91 Add patch to fix exception test failures on x86_64. 2014-05-31 14:12:22 +02:00
Sebastian Lackner
979900f060 Add lockfree implementation for get_cached_fd to ntdll. 2014-05-31 04:02:40 +02:00
Michael MĂĽller
d094743650 Fix patchlist. 2014-05-31 03:46:10 +02:00
Michael MĂĽller
2c9d2d8f64 Merge branch 'master' of https://github.com/compholio/wine-compholio-daily 2014-05-31 03:42:29 +02:00
Michael MĂĽller
457c0bf7e1 Add patches to fix current Unity3D webplayer. 2014-05-31 03:42:21 +02:00
Sebastian Lackner
d2209c6ee0 Add additional patch for --check-libs commandline option. 2014-05-30 01:26:10 +02:00
Sebastian Lackner
84997e39ab Separate patchlist into patch-list.patch (containing the autogenerated list) and 00-Commandline for the commandline option changes. 2014-05-30 01:04:27 +02:00
Michael MĂĽller
01be545e92 Replace strict draw ordering patch with a different approach. 2014-05-27 03:03:03 +02:00
Erich E. Hoover
bfb7d535af Updated SIO_ADDRESS_LIST_CHANGE patches. 2014-05-16 13:32:52 -06:00
Sebastian Lackner
94813ecf3c Update changelog for release 1.7.18-1. 2014-05-13 20:49:41 +02:00
Sebastian Lackner
b09ed0f3d2 Rebase 02-ACL_Extended_Attributes patches. 2014-05-04 01:32:57 +02:00
Sebastian Lackner
807da03757 Add additional patch to silence repeated wined3d_swapchain_present FIXMEs. 2014-05-04 00:55:43 +02:00
Sebastian Lackner
af447c6cfd Simplify patch to silence repeated resource_check_usage FIXMEs. 2014-05-04 00:43:52 +02:00
Sebastian Lackner
aac5a0da53 Add additional patch to silence repeated CompareStringEx FIXME messages. 2014-05-04 00:29:57 +02:00
Michael Mueller
7fede3cd56 Fix gitapply on BSD systems 2014-05-03 02:31:56 +02:00
Michael Mueller
43b781b453 Fix problem with CURDIR on BSD systems 2014-05-03 02:19:22 +02:00
Erich E. Hoover
d989770f24 Update changelog for release 1.7.18. 2014-05-02 13:05:45 -06:00
Michael MĂĽller
036250b6da Update timer patch 2014-05-02 20:50:58 +02:00
Erich E. Hoover
d787be6d20 Update changelog for release 1.7.17. 2014-04-18 16:04:47 -06:00
Erich E. Hoover
c35db80eae Split the storage of the ownership information into a separate patch. 2014-04-18 15:48:33 -06:00
Erich E. Hoover
4328f2e964 Update ACL patches to store user/group data instead of replacing it on the retrieval side. 2014-04-18 15:29:56 -06:00
Erich E. Hoover
eecf7c4a68 ACL data is now stored in binary instead of converting it to ASCII. 2014-04-17 16:53:10 -06:00
compholio
4d01de8fcd Update README.md with linguistic casing removal 2014-04-17 13:03:11 -06:00
Erich E. Hoover
f5ef032c89 Removed linguistic casing patches (accepted upstream). 2014-04-17 12:56:29 -06:00
Erich E. Hoover
f9eebd5599 Removed dynamic unwind patches (accepted upstream). 2014-04-16 16:52:37 -06:00
Erich E. Hoover
48bbae3fb7 Fix strndup move not being properly rebased. 2014-04-15 15:30:37 -06:00
Michael MĂĽller
fdbc47e09e Merge branch 'master' of https://github.com/compholio/wine-compholio-daily 2014-04-15 23:19:39 +02:00
Michael MĂĽller
2b4093a0ea Remove recommendation for gettext and libgif 2014-04-15 23:18:52 +02:00
Erich E. Hoover
580ff7c1c5 Move strndup call inside of file_get_parent_sd. 2014-04-15 15:14:15 -06:00
Erich E. Hoover
454c09ddbe Remove old test code for adding extra ACLs. 2014-04-15 15:08:23 -06:00
Erich E. Hoover
810202432b Ensure ACL buffers are NULL terminated for all string processing. 2014-04-15 15:05:36 -06:00
Erich E. Hoover
737eb1005a Add bounds checking on SubAuthorityCount. 2014-04-15 14:56:44 -06:00
Erich E. Hoover
58eeb19b3e Rebase security attribute retrieval patch. 2014-04-15 14:32:21 -06:00
Erich E. Hoover
c8be20f3cf Remove unnecessary check for INHERIT_ONLY_ACE. 2014-04-15 14:28:42 -06:00
Erich E. Hoover
b6d34ea7d2 Do not unnecessarily move 'struct stat st;'. 2014-04-15 14:20:06 -06:00
slackner
f6d14c47ec Merge pull request #3 from anish/patch-1
Update gitapply.sh (Turn off whitespace warnings)
2014-04-10 04:08:07 +02:00
Anish Bhatt
78d6102645 Update gitapply.sh
Turn off whitespace warnings
2014-04-09 19:03:06 -07:00
Erich E. Hoover
b862f600f5 Start putting changelog entries in prior to releases. 2014-04-05 17:46:37 -06:00
Erich E. Hoover
e0b037b82a Update the linguistic casing patches to print a FIXME that the flags are not fully supported. 2014-04-05 14:28:26 -06:00
Erich E. Hoover
69b0f7ebd7 Split Arial replacement into two patches. 2014-04-05 13:29:29 -06:00
Erich E. Hoover
7c95fad661 Dropped liblcms2-dev dependency for old Ubuntu versions. 2014-04-04 19:52:26 -06:00
Sebastian Lackner
67cc61ffca Update changelog. 2014-04-05 03:49:35 +02:00
Sebastian Lackner
0df720506a Fix build failure caused by dynamic unwind patches on 32-bit. 2014-04-05 03:47:22 +02:00
Sebastian Lackner
68c91b3113 Merge branch 'master' of github.com:compholio/wine-compholio-daily 2014-04-05 02:03:52 +02:00
Sebastian Lackner
ac36f88de1 11-Dynamic_Unwind: Add forward from kernel32 to ntdll. 2014-04-05 02:03:07 +02:00
Erich E. Hoover
9fcd7e7113 Fix date in changelog. 2014-04-04 17:28:07 -06:00
Erich E. Hoover
903a8e54d4 Update changelog for release 1.7.16. 2014-04-04 17:25:15 -06:00
Sebastian Lackner
3de6b17d8a Update dynamic unwind patches and add test. 2014-04-05 01:24:13 +02:00
Sebastian Lackner
74bd451363 11-Dynamic_Unwind: Explicitly declare unwind table callback as CDECL. 2014-04-04 19:56:20 +02:00
Sebastian Lackner
22a1e1ff59 Add proper implementation for dynamic unwind functions, removed stub implementation. 2014-04-04 19:47:11 +02:00
Sebastian Lackner
c781d177e1 Removed first set of DXVA2 patches (accepted upstream). 2014-04-04 19:44:11 +02:00
Erich E. Hoover
f13c0f3cd8 Further split out the SIO_ADDRESS_LIST_CHANGE patches. 2014-04-04 11:34:29 -06:00
Michael MĂĽller
9ebbbcfc9f Add stub for RtlInstallFunctionTableCallback 2014-04-04 07:15:16 +02:00
Sebastian Lackner
d886426f50 Updated DXVA2 stub and header patches. 2014-04-04 07:06:47 +02:00
Erich E. Hoover
d30bfe1a41 Add patch to silence repeated resource_check_usage FIXME. 2014-04-03 21:39:17 -06:00
Erich E. Hoover
30825c59a9 SetWaitableTimerEx FIXME patch accepted upstream. 2014-04-03 21:37:49 -06:00
Sebastian Lackner
7d03df647f Fix lcms dependency (wine requires lcms2 instead of lcms1), add build dependency to libsane-dev. 2014-04-03 19:50:14 +02:00
Sebastian Lackner
a046f03792 Add patch to silence SetWaitableTimerEx fixme message (heavily used by Adobe Flash). 2014-04-03 05:31:09 +02:00
Erich E. Hoover
b744f3d37b Use 'Multi-Arch: foreign' flag for wine-compholio package. 2014-04-02 20:28:54 -06:00
Michael MĂĽller
c52df465c1 Merge branch 'wine64' 2014-04-02 23:59:54 +02:00
Sebastian Lackner
09bfdcb009 Update DXVA2 patches, remove last work-in-progress part. 2014-03-29 06:53:54 +01:00
Erich E. Hoover
2f449562d1 First SIO_ADDRESS_LIST_CHANGE patch accepted upstream. 2014-03-28 15:58:51 -06:00
Sebastian Lackner
3c6c730333 Remove previous dxva2 patch (accepted upstream), added additional dxva2 implementation patches. 2014-03-26 22:28:10 +01:00
Michael MĂĽller
809ee539f3 Fix version number in Replaces/Breaks. 2014-03-25 17:08:07 +01:00
Michael MĂĽller
339892ffe6 Try to fix upgrading from old versions. 2014-03-25 15:58:12 +01:00
Michael MĂĽller
2e7f83fbf8 Add changelog entry. 2014-03-25 06:09:09 +01:00
Michael MĂĽller
9043eadbcb Fix search path for dh_shlibdeps. 2014-03-25 04:50:06 +01:00
Michael MĂĽller
5386c7843d Update dependencies and make them 64 bit ready. 2014-03-25 02:04:35 +01:00
Michael MĂĽller
0675620019 Pass CONFFLAGS to ./configure. 2014-03-25 01:02:13 +01:00
Michael MĂĽller
552b6acf97 Initial work to make wine-compholio 64 bit ready. 2014-03-25 00:52:10 +01:00
Sebastian Lackner
86c9842e64 Fix bug in generate-patchlist.sh. 2014-03-24 18:48:08 +01:00
Michael MĂĽller
d0e9447fb6 dxva2: Added stub dll 2014-03-24 00:17:29 +01:00
94 changed files with 74490 additions and 42960 deletions

View File

@@ -11,9 +11,10 @@ Current patches include:
* Support for TransmitFile (http://bugs.winehq.org/show_bug.cgi?id=5048)
* Support for GetVolumePathName
* Implement an Arial replacement font (http://bugs.winehq.org/show_bug.cgi?id=32323)
* Allow CompareStringEx flag NORM_LINGUISTIC_CASING (http://bugs.winehq.org/show_bug.cgi?id=34269)
* 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

68
debian/changelog vendored
View File

@@ -1,3 +1,71 @@
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
wine-compholio (1.7.17) unstable; urgency=low
* Split Arial replacement into two patches.
* Removed dynamic unwind patches (accepted upstream).
* Removed linguistic casing patches (accepted upstream).
* ACL data is now stored in binary instead of converting it to ASCII.
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 18 Apr 2014 16:03:57 -0600
wine-compholio (1.7.16-1) unstable; urgency=low
* Fix build failure caused by dynamic unwind functions.
* Dropped liblcms2-dev dependency for old Ubuntu versions.
-- Sebastian Lackner <sebastian@fds-team.de> Sat, 05 Apr 2014 03:48:25 +0200
wine-compholio (1.7.16) unstable; urgency=low
* Add stub for RtlInstallFunctionTableCallback.
* Further split out the SIO_ADDRESS_LIST_CHANGE patches.
* Add proper implementation for dynamic unwind functions, removed stub implementation.
* Fix lcms dependency (Wine requires lcms2 instead of lcms1), add build dependency to libsane-dev.
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 04 Apr 2014 17:27:52 -0600
wine-compholio (1.7.15-1) unstable; urgency=low
* Build 64 bit version of Wine.
* First SIO_ADDRESS_LIST_CHANGE patch accepted upstream.
* Added stub dll for DirectX Video Acceleration (dxva2.dll).
* Update DXVA2 patches (additional implementation details, parts accepted upstream).
-- Erich E. Hoover <erich.e.hoover@gmail.com> Tue, 25 Mar 2014 06:08:01 +0100
wine-compholio (1.7.15) unstable; urgency=low
* Fixed build dependencies for Debian Sid.
* Fixed free() of a const variable (Bug #1).

181
debian/control vendored
View File

@@ -5,7 +5,6 @@ Maintainer: Erich E. Hoover <ehoover@mines.edu>
XSBC-Original-Maintainer: Scott Ritchie <scottritchie@ubuntu.com>
Build-Depends: autotools-dev,
autoconf,
bind9-host,
bison,
bsdmainutils,
coreutils,
@@ -17,19 +16,10 @@ Build-Depends: autotools-dev,
fontforge,
gawk,
gcc-4.5 | gcc-4.7 | ubuntu-desktop (<< 1.207),
gcc-4.5-multilib [amd64] | ubuntu-desktop (<< 1.207) [amd64],
gcc-multilib [amd64],
gettext,
gzip,
ia32-libs [amd64],
ia32-libs-dev [amd64] | ubuntu-desktop (<< 1.267) [amd64],
ia32-libs-multiarch [amd64] | ubuntu-desktop (<< 1.267) [amd64],
lib32asound2-dev [amd64],
lib32ncurses5-dev [amd64],
lib32z1-dev [amd64],
libacl1-dev,
libasound2-dev [i386 lpia],
libc6-dev-i386 [amd64],
libasound2-dev,
libcapi20-dev,
libcups2-dev,
libdbus-1-dev,
@@ -37,28 +27,25 @@ Build-Depends: autotools-dev,
libesd0-dev,
libfontconfig1-dev | libfontconfig-dev,
libfreetype6-dev,
libgif-dev | libungif4-dev,
libgl1-mesa-dev | nvidia-glx-dev | fglrx-driver-dev | libgl-dev,
libglu1-mesa-dev | libglu-dev,
libgnutls-dev,
libgphoto2-dev | libgphoto2-6-dev | libgphoto2-2-dev (>= 2.4.6),
libgphoto2port-dev | ubuntu-desktop (>= 1.245) | debian-edu-config,
libgsm1-dev,
libgstreamer-plugins-base0.10-dev,
libgstreamer0.10-dev,
libice-dev,
libjpeg-dev,
liblcms1-dev, liblcms-dev,
liblcms2-dev | ubuntu-desktop (<< 1.267),
libldap2-dev, libldap-dev,
libmpg123-dev,
libncurses5-dev [i386] | libncurses-dev [i386],
libncurses5-dev | libncurses-dev,
libopenal-dev (>= 1:1.12) | ubuntu-desktop (<< 1.207),
libpng12-dev,
libpulse-dev,
libsane-dev,
libssl-dev,
libstdc++6-4.5-dev | libstdc++-dev,
libtiff4-dev,
libv4l-dev [i386],
libtiff5-dev | libtiff4-dev | libtiff-dev,
libv4l-dev,
libx11-dev,
libxcomposite-dev,
libxcursor-dev,
@@ -73,27 +60,25 @@ Build-Depends: autotools-dev,
libxxf86vm-dev,
linux-kernel-headers,
linux-libc-dev,
prelink [i386 amd64],
prelink,
quilt (>= 0.46-7~),
sharutils,
unixodbc-dev,
x11proto-xinerama-dev
Standards-Version: 3.9.2
Package: wine-compholio
Package: wine-compholio-i386
Architecture: i386
Multi-Arch: foreign
Pre-Depends: dpkg (>= 1.14.12ubuntu3), ${misc:Pre-Depends}
Depends: ${shlibs:Depends},
libasound2-plugins,
libncurses5
Recommends: gettext,
libcapi20-3,
Recommends: libcapi20-3,
libcups2,
libdbus-1-3,
libfontconfig1 | libfontconfig,
libfreetype6,
libgif4,
libgnutls26,
libgphoto2-6 | libgphoto2-2 (>= 2.4.6),
libgphoto2-port10 | libgphoto2-port0 (>= 2.4.6),
@@ -104,7 +89,7 @@ Recommends: gettext,
libpulse0,
libsane,
libssl1.0.0,
libtiff4,
libtiff5 | libtiff4,
libv4l-0,
libxcomposite1,
libxcursor1,
@@ -115,8 +100,96 @@ Recommends: gettext,
libxslt1.1,
libxt6,
libxxf86vm1,
unixodbc
Provides: wine-compholio
libodbc1,
libgsm1
Section: otherosfs
Priority: optional
Replaces: wine-compholio (<< 1.7.15-1~)
Breaks: wine-compholio (<< 1.7.15-1~)
Description: The Compholio Edition is a special build of the popular Wine software
with patches representing my current staging tree for Wine.
Currently these patches fix:
* Netflix on Firefox hangs with loading bar at 100% (Bug 31993).
* Netflix on Firefox fails with Internet Connection Problem when loading bar is
at 99% (Bug 31858).
.
Microsoft Windows Compatibility Layer (Binary Emulator and Library)
Wine is a compatibility layer for running Windows applications on Linux.
Applications are run at full speed without the need of cpu emulation. Wine
does not require Microsoft Windows, however it can use native system dll
files in place of its own if they are available.
.
This package provides support for loading 32-bit x86 Windows applications
.
This package is based on a recent Wine beta. While many more applications will
work, there may be some loss of functionality compared with the stable release
provided by the regular wine package.
Package: wine-compholio-amd64
Architecture: amd64
Multi-Arch: foreign
Pre-Depends: dpkg (>= 1.14.12ubuntu3), ${misc:Pre-Depends}
Depends: ${shlibs:Depends},
libasound2-plugins,
libncurses5
Recommends: libcapi20-3,
libcups2,
libdbus-1-3,
libfontconfig1 | libfontconfig,
libfreetype6,
libgnutls26,
libgphoto2-6 | libgphoto2-2 (>= 2.4.6),
libgphoto2-port10 | libgphoto2-port0 (>= 2.4.6),
libjpeg8,
libopenal1 (>= 1:1.12),
libosmesa6,
libpng12-0,
libpulse0,
libsane,
libssl1.0.0,
libtiff5 | libtiff4,
libv4l-0,
libxcomposite1,
libxcursor1,
libxi6,
libxinerama1,
libxrandr2,
libxrender1,
libxslt1.1,
libxt6,
libxxf86vm1,
libodbc1,
libgsm1
Section: otherosfs
Priority: optional
Replaces: wine-compholio (<< 1.7.15-1~)
Breaks: wine-compholio (<< 1.7.15-1~)
Description: The Compholio Edition is a special build of the popular Wine software
with patches representing my current staging tree for Wine.
Currently these patches fix:
* Netflix on Firefox hangs with loading bar at 100% (Bug 31993).
* Netflix on Firefox fails with Internet Connection Problem when loading bar is
at 99% (Bug 31858).
.
Microsoft Windows Compatibility Layer (Binary Emulator and Library)
Wine is a compatibility layer for running Windows applications on Linux.
Applications are run at full speed without the need of cpu emulation. Wine
does not require Microsoft Windows, however it can use native system dll
files in place of its own if they are available.
.
This package provides support for loading 64-bit x86 Windows applications
.
This package is based on a recent Wine beta. While many more applications will
work, there may be some loss of functionality compared with the stable release
provided by the regular wine package.
Package: wine-compholio
Architecture: i386 amd64
Multi-Arch: foreign
Pre-Depends: dpkg (>= 1.14.12ubuntu3), ${misc:Pre-Depends}
Depends: ${misc:Depends}, ${shlibs:Depends},
wine-compholio-i386 (= ${binary:Version}) [i386 amd64],
wine-compholio-amd64 (= ${binary:Version}) [amd64],
Section: otherosfs
Priority: optional
Description: The Compholio Edition is a special build of the popular Wine software
@@ -139,3 +212,57 @@ Description: The Compholio Edition is a special build of the popular Wine softwa
This package is based on a recent Wine beta. While many more applications will
work, there may be some loss of functionality compared with the stable release
provided by the regular wine package.
Package: wine-compholio-dev
Architecture: i386 amd64
Pre-Depends: dpkg (>= 1.14.12ubuntu3), ${misc:Pre-Depends}
Depends: libc6-dev,
${shlibs:Depends},
wine-compholio-i386 (= ${binary:Version}) [i386 amd64],
wine-compholio-amd64 (= ${binary:Version}) [amd64],
Section: libdevel
Priority: optional
Replaces: wine-compholio (<< 1.7.15-1~)
Breaks: wine-compholio (<< 1.7.15-1~)
Description: The Compholio Edition is a special build of the popular Wine software
with patches representing my current staging tree for Wine.
Currently these patches fix:
* Netflix on Firefox hangs with loading bar at 100% (Bug 31993).
* Netflix on Firefox fails with Internet Connection Problem when loading bar is
at 99% (Bug 31858).
.
Microsoft Windows Compatibility Layer (Binary Emulator and Library)
Wine is a compatibility layer for running Windows applications on Linux.
Applications are run at full speed without the need of cpu emulation. Wine
does not require Microsoft Windows, however it can use native system dll
files in place of its own if they are available.
.
This package consists of the development files needed to compile programs
using wine's free version of the Microsoft Windows API.
Package: wine-compholio-dbg
Architecture: i386 amd64
Multi-Arch: same
Pre-Depends: dpkg (>= 1.14.12ubuntu3), ${misc:Pre-Depends}
Depends: ${shlibs:Depends},
wine-compholio-i386 (= ${binary:Version}) [i386 amd64],
wine-compholio-amd64 (= ${binary:Version}) [amd64],
Section: debug
Priority: optional
Replaces: wine-compholio (<< 1.7.15-1~)
Breaks: wine-compholio (<< 1.7.15-1~)
Description: The Compholio Edition is a special build of the popular Wine software
with patches representing my current staging tree for Wine.
Currently these patches fix:
* Netflix on Firefox hangs with loading bar at 100% (Bug 31993).
* Netflix on Firefox fails with Internet Connection Problem when loading bar is
at 99% (Bug 31858).
.
Microsoft Windows Compatibility Layer (Binary Emulator and Library)
Wine is a compatibility layer for running Windows applications on Linux.
Applications are run at full speed without the need of cpu emulation. Wine
does not require Microsoft Windows, however it can use native system dll
files in place of its own if they are available.
.
This package includes debugging symbols useful for reporting crashes and other
failures.

154
debian/rules vendored
View File

@@ -1,36 +1,4 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# These are used for cross-compiling and for saving the configure script
# from having to guess our platform (since we know it already)
DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
ifneq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
CROSS= --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
else
CROSS= --build $(DEB_BUILD_GNU_TYPE)
endif
# Apparently it's important to have an empty LDFLAGS, see:
# http://www.winehq.org/pipermail/wine-bugs/2007-July/062505.html
# For Wine 1.1.44 it's also important not to compile at -O0
LDFLAGS =
CFLAGS = -Wall -g -O2
# On amd64 the 32-bit libraries are in lib32 instead of lib
ifeq ($(DEB_BUILD_ARCH), amd64)
CONFFLAGS += --libdir=\$${prefix}/lib32
endif
# Use gcc-4.5 if it's available
ifeq ($(shell which gcc-4.5),)
@@ -39,106 +7,40 @@ else
CC = gcc-4.5
endif
# Support passing of parallel=<n> in build options
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
MAKEFLAGS += -j$(NUMJOBS)
endif
%:
dh $@ --parallel
configure:
# Unpack the original Wine version
tar -xjvf wine-*.tar.bz2
mv wine-*/* .
rm wine-*/.* || true
rm wine-*.tar.bz2
rmdir wine-*
config.status: configure
dh_testdir
# Add here commands to configure the package.
ifneq "$(wildcard /usr/share/misc/config.sub)" ""
cp -f /usr/share/misc/config.sub config.sub
endif
ifneq "$(wildcard /usr/share/misc/config.guess)" ""
cp -f /usr/share/misc/config.guess config.guess
endif
override_dh_auto_configure:
# Apply our patches, reconfigure, and update the wineserver protocol request data
make -C "$(CURDIR)/patches/" DESTDIR="$(CURDIR)" install
# Configure
CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/opt/wine-compholio --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --with-xattr $(CONFFLAGS)
build: build-stamp
build-stamp: config.status
dh_testdir
# Add here commands to compile the package.
$(MAKE) depend
$(MAKE) $(MAKEFLAGS)
#docbook-to-man debian/wine-compholio.sgml > wine-compholio.1
touch $@
clean:
dh_testdir
dh_testroot
rm -f build-stamp
# Add here commands to clean up after the build process.
[ ! -f Makefile ] || $(MAKE) distclean
rm -f config.sub config.guess
dh_clean
install: build
dh_testdir
dh_testroot
dh_prep
dh_installdirs
# Add here commands to install the package into debian/wine-compholio.
$(MAKE) DESTDIR=$(CURDIR)/debian/wine-compholio install
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-arch: build install
dh_testdir
dh_testroot
# dh_installchangelogs ChangeLog
# dh_installdocs
dh_installexamples
# dh_install
# dh_installmenu
# dh_installdebconf
# dh_installlogrotate
# dh_installemacsen
# dh_installpam
# dh_installmime
# dh_python
# dh_installinit
# dh_installcron
# dh_installinfo
dh_installman
dh_link
dh_strip
dh_compress
dh_fixperms
# dh_perl
dh_makeshlibs
dh_installdeb
ifeq ($(DEB_BUILD_ARCH), amd64)
dh_gencontrol -- -V"shlibs:Depends= ia32-libs (>= 1.6), lib32asound2 (>> 1.0.14), libc6-i386 (>= 2.6-1), lib32nss-mdns (>= 0.10-3)"
./configure --prefix=/opt/wine-compholio --libdir=\$${prefix}/lib64 --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --enable-win64 --without-gstreamer --with-xattr $(CONFFLAGS)
else
LD_LIBRARY_PATH="$(CURDIR)/debian/wine-compholio/opt/wine-compholio/lib:${LD_LIBRARY_PATH}" dh_shlibdeps -L wine-compholio -l debian/wine-compholio/opt/wine-compholio/lib
dh_gencontrol
./configure --prefix=/opt/wine-compholio --libdir=\$${prefix}/lib --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info --without-gstreamer --with-xattr $(CONFFLAGS)
endif
dh_md5sums
dh_builddeb -- -Z lzma
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install
override_dh_auto_test:
# Wine's test suite does not pass on build daemons, skip it for now
override_dh_installdocs:
dh_installdocs --link-doc=wine-compholio
override_dh_install:
dh_install --fail-missing
# These files will end up in multiple packages otherwise
rm -f debian/wine-compholio/opt/wine-compholio/bin/wine
rm -f debian/wine-compholio/opt/wine-compholio/bin/wine-preloader
rm -f debian/wine-compholio/opt/wine-compholio/bin/wine64
rm -f debian/wine-compholio/opt/wine-compholio/bin/wine64-preloader
override_dh_strip:
dh_strip -Xwine-pthread -Xwine-kthread --dbg-package=wine-compholio-dbg
override_dh_shlibdeps:
ifeq ($(DEB_HOST_ARCH),amd64)
dh_shlibdeps -l $(CURDIR)/debian/tmp/opt/wine-compholio/lib64/
else
dh_shlibdeps -l $(CURDIR)/debian/tmp/opt/wine-compholio/lib/
endif

View File

@@ -16,52 +16,19 @@ for FILE in patches/*/*.def; do
PATCH_DATA="${PATCH_DATA}+ { \"${UUID}:${REVISION}\", \"${AUTHOR}\", \"${TITLE}\" },";
done
PATCH_LINES=$(echo "${PATCH_DATA}" | grep -c '\n');
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

View File

@@ -1,4 +1,4 @@
#!/bin/bash
#!/usr/bin/env bash
# Setup parser variables
nogit=0
@@ -78,10 +78,16 @@ done
# Redirect to git apply if available
if [ "$nogit" -eq 0 ] && command -v git >/dev/null 2>&1; then
exec git apply "$@"
exec git apply --whitespace=nowarn "$@"
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{

4
debian/wine-compholio-amd64.install vendored Normal file
View File

@@ -0,0 +1,4 @@
/opt/wine-compholio/lib64/libwine.so*
/opt/wine-compholio/lib64/wine
/opt/wine-compholio/bin/wine64
/opt/wine-compholio/bin/wine64-preloader

1
debian/wine-compholio-dev.install vendored Normal file
View File

@@ -0,0 +1 @@
/opt/wine-compholio/include

4
debian/wine-compholio-i386.install vendored Normal file
View File

@@ -0,0 +1,4 @@
/opt/wine-compholio/lib/libwine.so*
/opt/wine-compholio/lib/wine
/opt/wine-compholio/bin/wine
/opt/wine-compholio/bin/wine-preloader

4
debian/wine-compholio.docs vendored Normal file
View File

@@ -0,0 +1,4 @@
documentation/README.*
ANNOUNCE
AUTHORS
README

2
debian/wine-compholio.install vendored Normal file
View File

@@ -0,0 +1,2 @@
/opt/wine-compholio/bin
/opt/wine-compholio/share

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,3 @@
Revision: 1
Author: Sebastian Lackner
Title: Add commandline option --patches to show the patch list.

View File

@@ -0,0 +1,3 @@
Revision: 1
Author: Michael MĂĽller
Title: Add commandline option --check-libs to test if shared libraries are installed.

View File

@@ -0,0 +1,77 @@
From a0625ca7d07703028fdad511c37c587e213ff481 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 3 Apr 2014 09:21:51 -0600
Subject: server: Implement socket-specific ioctl() routine.
---
server/sock.c | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/server/sock.c b/server/sock.c
index 5ffb1fe..3eb1bdf 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -49,6 +49,8 @@
#include "windef.h"
#include "winternl.h"
#include "winerror.h"
+#define USE_WS_PREFIX
+#include "winsock2.h"
#include "process.h"
#include "file.h"
@@ -83,9 +85,6 @@
#define FD_WINE_RAW 0x80000000
#define FD_WINE_INTERNAL 0xFFFF0000
-/* Constants for WSAIoctl() */
-#define WSA_FLAG_OVERLAPPED 0x01
-
struct sock
{
struct object obj; /* object header */
@@ -117,6 +116,8 @@ static void sock_destroy( struct object *obj );
static int sock_get_poll_events( struct fd *fd );
static void sock_poll_event( struct fd *fd, int event );
static enum server_fd_type sock_get_fd_type( struct fd *fd );
+static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async,
+ int blocking, const void *data, data_size_t size );
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
static void sock_reselect_async( struct fd *fd, struct async_queue *queue );
static void sock_cancel_async( struct fd *fd, struct process *process, struct thread *thread, client_ptr_t iosb );
@@ -151,7 +152,7 @@ static const struct fd_ops sock_fd_ops =
sock_poll_event, /* poll_event */
no_flush, /* flush */
sock_get_fd_type, /* get_fd_type */
- default_fd_ioctl, /* ioctl */
+ sock_ioctl, /* ioctl */
sock_queue_async, /* queue_async */
sock_reselect_async, /* reselect_async */
sock_cancel_async /* cancel_async */
@@ -518,6 +519,23 @@ static enum server_fd_type sock_get_fd_type( struct fd *fd )
return FD_TYPE_SOCKET;
}
+obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
+ int blocking, const void *data, data_size_t size )
+{
+ struct sock *sock = get_fd_user( fd );
+
+ assert( sock->obj.ops == &sock_ops );
+
+ switch(code)
+ {
+ case WS_SIO_ADDRESS_LIST_CHANGE:
+ /* intentional fallthrough, not yet supported */
+ default:
+ set_error( STATUS_NOT_SUPPORTED );
+ return 0;
+ }
+}
+
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
{
struct sock *sock = get_fd_user( fd );
--
1.7.9.5

View File

@@ -1,101 +0,0 @@
From a1ad64b059de5325b15ed09a39083f5eb973a2f6 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Wed, 12 Feb 2014 13:46:28 -0700
Subject: ws2_32: Ask the server to process unsupported WSAIoctl operations.
---
dlls/ws2_32/socket.c | 60 ++++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 53 insertions(+), 7 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 1c558bf..fe5577c 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -3668,6 +3668,40 @@ static const char *debugstr_wsaioctl(DWORD ioctl)
(USHORT)(ioctl & 0xffff));
}
+/* do an ioctl call through the server */
+static DWORD server_ioctl_sock( SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size,
+ LPVOID out_buff, DWORD out_size, LPDWORD ret_size,
+ LPWSAOVERLAPPED overlapped,
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE completion )
+{
+ HANDLE event = overlapped ? overlapped->hEvent : 0;
+ HANDLE handle = SOCKET2HANDLE( s );
+ struct ws2_async *wsa;
+ NTSTATUS status;
+ PIO_STATUS_BLOCK io;
+
+ if (!(wsa = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(*wsa) )))
+ return WSA_NOT_ENOUGH_MEMORY;
+ wsa->hSocket = handle;
+ wsa->user_overlapped = overlapped;
+ wsa->completion_func = completion;
+ io = (overlapped ? (PIO_STATUS_BLOCK)overlapped : &wsa->local_iosb);
+
+ status = NtDeviceIoControlFile( handle, event, (PIO_APC_ROUTINE)ws2_async_apc, wsa, io, code,
+ in_buff, in_size, out_buff, out_size );
+ if (status == STATUS_NOT_SUPPORTED)
+ {
+ FIXME("Unsupported ioctl %x (device=%x access=%x func=%x method=%x)\n",
+ code, code >> 16, (code >> 14) & 3, (code >> 2) & 0xfff, code & 3);
+ }
+ else if (status == STATUS_SUCCESS)
+ *ret_size = io->Information; /* "Information" is the size written to the output buffer */
+
+ if (status != STATUS_PENDING) RtlFreeHeap( GetProcessHeap(), 0, wsa );
+
+ return NtStatusToWSAError( status );
+}
+
/**********************************************************************
* WSAIoctl (WS2_32.50)
*
@@ -3859,12 +3893,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
break;
}
- case WS_SIO_ADDRESS_LIST_CHANGE:
- FIXME("-> SIO_ADDRESS_LIST_CHANGE request: stub\n");
- /* FIXME: error and return code depend on whether socket was created
- * with WSA_FLAG_OVERLAPPED, but there is no easy way to get this */
- break;
-
case WS_SIO_ADDRESS_LIST_QUERY:
{
DWORD size;
@@ -4100,11 +4128,29 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
WSASetLastError(WSAEOPNOTSUPP);
return SOCKET_ERROR;
default:
- FIXME("unsupported WS_IOCTL cmd (%s)\n", debugstr_wsaioctl(code));
status = WSAEOPNOTSUPP;
break;
}
+ if (status == WSAEOPNOTSUPP)
+ {
+ status = server_ioctl_sock(s, code, in_buff, in_size, out_buff, out_size, &total,
+ overlapped, completion);
+ if (status != WSAEOPNOTSUPP)
+ {
+ if (status == 0 || status == WSA_IO_PENDING)
+ TRACE("-> %s request\n", debugstr_wsaioctl(code));
+ else
+ ERR("-> %s request failed with status 0x%x\n", debugstr_wsaioctl(code), status);
+
+ /* overlapped and completion operations will be handled by the server */
+ completion = NULL;
+ overlapped = NULL;
+ }
+ else
+ FIXME("unsupported WS_IOCTL cmd (%s)\n", debugstr_wsaioctl(code));
+ }
+
if (completion)
{
FIXME( "completion routine %p not supported\n", completion );
--
1.7.9.5

View File

@@ -0,0 +1,145 @@
From 864781654bfbb059a351fdcda6773e2857019278 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Tue, 6 May 2014 08:39:18 -0600
Subject: server: Add socket-side support for the interface change
notification object.
---
server/sock.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 86 insertions(+), 1 deletion(-)
diff --git a/server/sock.c b/server/sock.c
index 3eb1bdf..ad20a69 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -106,12 +106,18 @@ struct sock
struct sock *deferred; /* socket that waits for a deferred accept */
struct async_queue *read_q; /* queue for asynchronous reads */
struct async_queue *write_q; /* queue for asynchronous writes */
+ struct async_queue *ifchange_q; /* queue for interface change notifications */
+ struct object *ifchange_obj; /* the interface change notification object */
+ struct list ifchange_entry; /* entry in ifchange notification list */
};
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_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 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 );
@@ -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 */
+ sock_add_ifchange( sock, async_data );
+ return 0;
default:
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 );
+ sock_destroy_ifchange_q( sock );
if (sock->event) release_object( sock->event );
if (sock->fd)
{
@@ -636,6 +644,8 @@ static void init_sock(struct sock *sock)
sock->deferred = NULL;
sock->read_q = NULL;
sock->write_q = NULL;
+ sock->ifchange_q = NULL;
+ sock->ifchange_obj = NULL;
memset( sock->errors, 0, sizeof(sock->errors) );
}
@@ -924,6 +934,81 @@ static void sock_set_error(void)
set_error( sock_get_ntstatus( errno ) );
}
+/* add interface change notification to a socket */
+static void 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;
+
+ if (!(async = create_async( current, ifchange_q, async_data )))
+ {
+ if (!async_queued( ifchange_q ))
+ sock_destroy_ifchange_q( sock );
+
+ set_error( STATUS_NO_MEMORY );
+ return;
+ }
+
+ release_object( async );
+ set_error( STATUS_PENDING );
+}
+
+/* stub ifchange object */
+static struct object *get_ifchange( void )
+{
+ set_error( STATUS_NOT_SUPPORTED );
+ return NULL;
+}
+
+/* stub ifchange add socket to list */
+static void ifchange_add_sock( struct object *obj, struct sock *sock )
+{
+}
+
+/* create a new ifchange queue for a specific socket or, if one already exists, reuse the existing one */
+static struct async_queue *sock_get_ifchange_q( struct sock *sock )
+{
+ struct object *ifchange = NULL;
+ struct fd *fd;
+
+ if (sock->ifchange_q) /* reuse existing ifchange_q for this socket */
+ return sock->ifchange_q;
+
+ if (!(ifchange = get_ifchange()))
+ return NULL;
+
+ /* create the ifchange notification queue */
+ fd = ifchange->ops->get_fd( ifchange );
+ sock->ifchange_q = create_async_queue( fd );
+ release_object( fd );
+ if (!sock->ifchange_q)
+ {
+ release_object( ifchange );
+ set_error( STATUS_NO_MEMORY );
+ return NULL;
+ }
+
+ /* add the socket to the ifchange notification list */
+ ifchange_add_sock( ifchange, sock );
+ sock->ifchange_obj = ifchange;
+ return sock->ifchange_q;
+}
+
+/* destroy an existing ifchange queue for a specific socket */
+static void sock_destroy_ifchange_q( struct sock *sock )
+{
+ if (sock->ifchange_q)
+ {
+ list_remove( &sock->ifchange_entry );
+ free_async_queue( sock->ifchange_q );
+ sock->ifchange_q = NULL;
+ release_object( sock->ifchange_obj );
+ }
+}
+
/* create a socket */
DECL_HANDLER(create_socket)
{
--
1.7.9.5

View File

@@ -1,481 +0,0 @@
From 60f7d242951be1980501f45922dbee5480ac2810 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Tue, 31 Dec 2013 18:36:58 -0700
Subject: server: Implement an interface change notification object.
---
server/event.c | 13 +++
server/named_pipe.c | 13 ---
server/object.h | 1 +
server/sock.c | 324 ++++++++++++++++++++++++++++++++++++++++++++++++++-
4 files changed, 334 insertions(+), 17 deletions(-)
diff --git a/server/event.c b/server/event.c
index b8515af..e8a3888 100644
--- a/server/event.c
+++ b/server/event.c
@@ -124,6 +124,19 @@ struct event *create_event( struct directory *root, const struct unicode_str *na
return event;
}
+obj_handle_t alloc_wait_event( struct process *process )
+{
+ obj_handle_t handle = 0;
+ struct event *event = create_event( NULL, NULL, 0, 1, 0, NULL );
+
+ if (event)
+ {
+ handle = alloc_handle( process, event, EVENT_ALL_ACCESS, 0 );
+ release_object( event );
+ }
+ return handle;
+}
+
struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access )
{
return (struct event *)get_handle_obj( process, handle, access, &event_ops );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 4c85104..6ba2145 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -587,19 +587,6 @@ static enum server_fd_type pipe_client_get_fd_type( struct fd *fd )
return FD_TYPE_PIPE;
}
-static obj_handle_t alloc_wait_event( struct process *process )
-{
- obj_handle_t handle = 0;
- struct event *event = create_event( NULL, NULL, 0, 1, 0, NULL );
-
- if (event)
- {
- handle = alloc_handle( process, event, EVENT_ALL_ACCESS, 0 );
- release_object( event );
- }
- return handle;
-}
-
static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
int blocking, const void *data, data_size_t size )
{
diff --git a/server/object.h b/server/object.h
index bb3ff21..bad162f 100644
--- a/server/object.h
+++ b/server/object.h
@@ -159,6 +159,7 @@ extern struct event *create_event( struct directory *root, const struct unicode_
const struct security_descriptor *sd );
extern struct keyed_event *create_keyed_event( struct directory *root, const struct unicode_str *name,
unsigned int attr, const struct security_descriptor *sd );
+extern obj_handle_t alloc_wait_event( struct process *process );
extern struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access );
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 1a3a8f7..9c8284d 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -23,6 +23,7 @@
#include "config.h"
+#include <limits.h>
#include <assert.h>
#include <fcntl.h>
#include <stdarg.h>
@@ -44,11 +45,17 @@
#include <time.h>
#include <unistd.h>
+#ifdef HAVE_LINUX_RTNETLINK_H
+# include <linux/rtnetlink.h>
+#endif
+
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "windef.h"
#include "winternl.h"
#include "winerror.h"
+#define USE_WS_PREFIX
+#include "winsock2.h"
#include "process.h"
#include "file.h"
@@ -83,9 +90,6 @@
#define FD_WINE_RAW 0x80000000
#define FD_WINE_INTERNAL 0xFFFF0000
-/* Constants for WSAIoctl() */
-#define WSA_FLAG_OVERLAPPED 0x01
-
struct sock
{
struct object obj; /* object header */
@@ -107,16 +111,28 @@ struct sock
struct sock *deferred; /* socket that waits for a deferred accept */
struct async_queue *read_q; /* queue for asynchronous reads */
struct async_queue *write_q; /* queue for asynchronous writes */
+ struct async_queue *ifchange_q; /* queue for interface change notifications */
+ struct list ifchange_entry; /* entry in ifchange notification list */
};
+#ifdef HAVE_LINUX_RTNETLINK_H
+/* only keep one ifchange object around, all sockets waiting for wakeups will look to it */
+static struct object *ifchange_object = NULL;
+
+static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data );
+#endif
+
static void sock_dump( struct object *obj, int verbose );
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 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 );
static enum server_fd_type sock_get_fd_type( struct fd *fd );
+static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async,
+ int blocking, const void *data, data_size_t size );
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count );
static void sock_reselect_async( struct fd *fd, struct async_queue *queue );
static void sock_cancel_async( struct fd *fd, struct process *process, struct thread *thread, client_ptr_t iosb );
@@ -151,7 +167,7 @@ static const struct fd_ops sock_fd_ops =
sock_poll_event, /* poll_event */
no_flush, /* flush */
sock_get_fd_type, /* get_fd_type */
- default_fd_ioctl, /* ioctl */
+ sock_ioctl, /* ioctl */
sock_queue_async, /* queue_async */
sock_reselect_async, /* reselect_async */
sock_cancel_async /* cancel_async */
@@ -518,6 +534,41 @@ static enum server_fd_type sock_get_fd_type( struct fd *fd )
return FD_TYPE_SOCKET;
}
+obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
+ int blocking, const void *data, data_size_t size )
+{
+#ifdef HAVE_LINUX_RTNETLINK_H
+ struct sock *sock = get_fd_user( fd );
+ obj_handle_t wait_handle = 0;
+ async_data_t new_data;
+
+ 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:
+ if (sock_add_ifchange( sock, async_data ))
+ {
+ set_error( STATUS_PENDING );
+ return wait_handle;
+ }
+ break;
+ default:
+ /* handled by default_fd_ioctl */
+ break;
+ }
+ close_handle( current->process, wait_handle );
+#endif
+ return default_fd_ioctl(fd, code, async_data, blocking, data, size);
+}
+
static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count )
{
struct sock *sock = get_fd_user( fd );
@@ -592,6 +643,7 @@ static void sock_destroy( struct object *obj )
free_async_queue( sock->read_q );
free_async_queue( sock->write_q );
+ sock_destroy_ifchange_q( sock );
if (sock->event) release_object( sock->event );
if (sock->fd)
{
@@ -618,6 +670,7 @@ static void init_sock(struct sock *sock)
sock->deferred = NULL;
sock->read_q = NULL;
sock->write_q = NULL;
+ sock->ifchange_q = NULL;
memset( sock->errors, 0, sizeof(sock->errors) );
}
@@ -906,6 +959,269 @@ static void sock_set_error(void)
set_error( sock_get_ntstatus( errno ) );
}
+#ifdef HAVE_LINUX_RTNETLINK_H
+
+static void ifchange_dump( struct object *obj, int verbose );
+static struct fd *ifchange_get_fd( struct object *obj );
+static void ifchange_destroy( struct object *obj );
+
+static int ifchange_get_poll_events( struct fd *fd );
+static void ifchange_poll_event( struct fd *fd, int event );
+static void ifchange_reselect_async( struct fd *fd, struct async_queue *queue );
+
+struct ifchange
+{
+ struct object obj; /* object header */
+ struct fd *fd; /* interface change file descriptor */
+ struct list sockets; /* list of sockets to send interface change notifications */
+};
+
+static const struct object_ops ifchange_ops =
+{
+ sizeof(struct ifchange), /* size */
+ ifchange_dump, /* dump */
+ no_get_type, /* get_type */
+ add_queue, /* add_queue */
+ NULL, /* remove_queue */
+ NULL, /* signaled */
+ no_satisfied, /* satisfied */
+ no_signal, /* signal */
+ ifchange_get_fd, /* get_fd */
+ default_fd_map_access, /* map_access */
+ default_get_sd, /* get_sd */
+ default_set_sd, /* set_sd */
+ no_lookup_name, /* lookup_name */
+ no_open_file, /* open_file */
+ no_close_handle, /* close_handle */
+ ifchange_destroy /* destroy */
+};
+
+static const struct fd_ops ifchange_fd_ops =
+{
+ ifchange_get_poll_events, /* get_poll_events */
+ ifchange_poll_event, /* poll_event */
+ NULL, /* flush */
+ NULL, /* get_fd_type */
+ NULL, /* ioctl */
+ NULL, /* queue_async */
+ ifchange_reselect_async, /* reselect_async */
+ NULL /* cancel_async */
+};
+
+static void ifchange_dump( struct object *obj, int verbose )
+{
+ assert( obj->ops == &ifchange_ops );
+ printf( "ifchange\n" );
+}
+
+static struct fd *ifchange_get_fd( struct object *obj )
+{
+ struct ifchange *ifchange = (struct ifchange *)obj;
+ return (struct fd *)grab_object( ifchange->fd );
+}
+
+static void ifchange_destroy( struct object *obj )
+{
+ struct ifchange *ifchange = (struct ifchange *)obj;
+ assert( obj->ops == &ifchange_ops );
+
+ if (ifchange->fd)
+ {
+ /* reset the global ifchange object so that it will be recreated if it is needed again */
+ assert( obj == ifchange_object );
+ ifchange_object = NULL;
+
+ /* shut the socket down to force pending poll() calls in the client to return */
+ shutdown( get_unix_fd(ifchange->fd), SHUT_RDWR );
+ release_object( ifchange->fd );
+ }
+}
+
+static int ifchange_get_poll_events( struct fd *fd )
+{
+ return POLLIN;
+}
+
+static void ifchange_add_sock( struct object *obj, struct sock *sock )
+{
+ struct ifchange *ifchange = (struct ifchange *)obj;
+
+ list_add_tail( &ifchange->sockets, &sock->ifchange_entry );
+}
+
+/* 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 struct object *grab_ifchange( void )
+{
+ struct ifchange *ifchange;
+ struct sockaddr_nl addr;
+ int unix_fd;
+
+ if (ifchange_object)
+ {
+ /* increment the refcount for each socket that uses the ifchange object */
+ 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)
+ {
+ 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;
+ addr.nl_groups = RTMGRP_IPV4_IFADDR;
+ /* bind the socket to the special netlink kernel interface */
+ if (bind( unix_fd, (struct sockaddr *)&addr, sizeof(addr) ) == -1)
+ {
+ sock_set_error();
+ close( unix_fd );
+ return NULL;
+ }
+ if (!(ifchange = alloc_object( &ifchange_ops )))
+ {
+ set_error( STATUS_NO_MEMORY );
+ close( unix_fd );
+ return NULL;
+ }
+ list_init( &ifchange->sockets );
+ if (!(ifchange->fd = create_anonymous_fd( &ifchange_fd_ops, unix_fd, &ifchange->obj, 0 )))
+ {
+ set_error( STATUS_NO_MEMORY );
+ release_object( ifchange );
+ 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;
+ return ifchange_object;
+}
+
+/* create a new ifchange queue for a specific socket or, if one already exists, reuse the existing one */
+static struct async_queue *sock_get_ifchange_q( struct sock *sock )
+{
+ struct object *ifchange;
+ struct fd *fd;
+
+ if (sock->ifchange_q) /* reuse existing ifchange_q for this socket */
+ return sock->ifchange_q;
+
+ if (!(ifchange = grab_ifchange()))
+ return NULL;
+
+ /* create the ifchange notification queue */
+ fd = ifchange_get_fd( ifchange );
+ sock->ifchange_q = create_async_queue( fd );
+ release_object( fd );
+ if (!sock->ifchange_q)
+ {
+ set_error( STATUS_NO_MEMORY );
+ release_object( ifchange );
+ return NULL;
+ }
+
+ /* add the socket to the ifchange notification list */
+ ifchange_add_sock( ifchange, sock );
+ return sock->ifchange_q;
+}
+
+/* wake up all the sockets waiting for a change notification event */
+static void ifchange_wake_up( struct object *obj, unsigned int status )
+{
+ struct ifchange *ifchange = (struct ifchange *)obj;
+ struct list *ptr, *next;
+ assert( obj->ops == &ifchange_ops );
+ assert( obj == ifchange_object );
+
+ LIST_FOR_EACH_SAFE( ptr, next, &ifchange->sockets )
+ {
+ struct sock *sock = LIST_ENTRY( ptr, struct sock, ifchange_entry );
+
+ assert( sock->ifchange_q );
+ async_wake_up( sock->ifchange_q, status ); /* issue ifchange notification for the socket */
+ sock_destroy_ifchange_q( sock ); /* remove socket from list and decrement ifchange refcount */
+ }
+}
+
+static void ifchange_poll_event( struct fd *fd, int event )
+{
+ struct object *ifchange = get_fd_user( fd );
+ unsigned int status = STATUS_PENDING;
+ char buffer[PIPE_BUF];
+ int r;
+
+ r = recv( get_unix_fd(fd), buffer, sizeof(buffer), MSG_DONTWAIT );
+ if (r < 0)
+ {
+ if (errno == EWOULDBLOCK || errno == EAGAIN)
+ return; /* retry when poll() says the socket is ready */
+ status = sock_get_ntstatus( errno );
+ }
+ else if (r > 0)
+ {
+ struct nlmsghdr *nlh;
+
+ for (nlh = (struct nlmsghdr *)buffer; NLMSG_OK(nlh, r); nlh = NLMSG_NEXT(nlh, r))
+ {
+ if (nlh->nlmsg_type == NLMSG_DONE)
+ break;
+ if (nlh->nlmsg_type == RTM_NEWADDR || nlh->nlmsg_type == RTM_DELADDR)
+ status = STATUS_SUCCESS;
+ }
+ }
+ if (status != STATUS_PENDING)
+ ifchange_wake_up( ifchange, status );
+}
+
+static void ifchange_reselect_async( struct fd *fd, struct async_queue *queue )
+{
+ /* do nothing, this object is about to disappear */
+}
+
+/* add interface change notification to a socket */
+static int sock_add_ifchange( struct sock *sock, const async_data_t *async_data )
+{
+ struct async_queue *ifchange_q;
+ struct async *async;
+
+ if (!(ifchange_q = sock_get_ifchange_q( sock )))
+ return FALSE;
+
+ if (!(async = create_async( current, ifchange_q, async_data )))
+ {
+ if (!async_queued( ifchange_q ))
+ sock_destroy_ifchange_q( sock );
+
+ set_error( STATUS_NO_MEMORY );
+ return FALSE;
+ }
+
+ release_object( async );
+ return TRUE;
+}
+
+#endif
+
+/* destroy an existing ifchange queue for a specific socket */
+static void sock_destroy_ifchange_q( struct sock *sock )
+{
+#ifdef HAVE_LINUX_RTNETLINK_H
+ if (sock->ifchange_q)
+ {
+ assert( ifchange_object );
+
+ list_remove( &sock->ifchange_entry );
+ free_async_queue( sock->ifchange_q );
+ sock->ifchange_q = NULL;
+ release_object( ifchange_object );
+ }
+#endif
+}
+
/* create a socket */
DECL_HANDLER(create_socket)
{
--
1.7.9.5

View File

@@ -0,0 +1,148 @@
From c93a05ca0114b76c542f251de60b8c009e4a72b0 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
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 | 26 ++++++++++++++++++++------
4 files changed, 34 insertions(+), 19 deletions(-)
diff --git a/server/event.c b/server/event.c
index 4d3c562..0daa5b2 100644
--- a/server/event.c
+++ b/server/event.c
@@ -124,6 +124,19 @@ struct event *create_event( struct directory *root, const struct unicode_str *na
return event;
}
+obj_handle_t alloc_wait_event( struct process *process )
+{
+ obj_handle_t handle = 0;
+ struct event *event = create_event( NULL, NULL, 0, 1, 0, NULL );
+
+ if (event)
+ {
+ handle = alloc_handle( process, event, EVENT_ALL_ACCESS, 0 );
+ release_object( event );
+ }
+ return handle;
+}
+
struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access )
{
return (struct event *)get_handle_obj( process, handle, access, &event_ops );
diff --git a/server/named_pipe.c b/server/named_pipe.c
index 4c85104..6ba2145 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -587,19 +587,6 @@ static enum server_fd_type pipe_client_get_fd_type( struct fd *fd )
return FD_TYPE_PIPE;
}
-static obj_handle_t alloc_wait_event( struct process *process )
-{
- obj_handle_t handle = 0;
- struct event *event = create_event( NULL, NULL, 0, 1, 0, NULL );
-
- if (event)
- {
- handle = alloc_handle( process, event, EVENT_ALL_ACCESS, 0 );
- release_object( event );
- }
- return handle;
-}
-
static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data,
int blocking, const void *data, data_size_t size )
{
diff --git a/server/object.h b/server/object.h
index bb3ff21..bad162f 100644
--- a/server/object.h
+++ b/server/object.h
@@ -159,6 +159,7 @@ extern struct event *create_event( struct directory *root, const struct unicode_
const struct security_descriptor *sd );
extern struct keyed_event *create_keyed_event( struct directory *root, const struct unicode_str *name,
unsigned int attr, const struct security_descriptor *sd );
+extern obj_handle_t alloc_wait_event( struct process *process );
extern struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access );
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 ad20a69..a8a5ac3 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -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;
assert( sock->obj.ops == &sock_ops );
switch(code)
{
case WS_SIO_ADDRESS_LIST_CHANGE:
- sock_add_ifchange( sock, async_data );
- return 0;
+ 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;
default:
set_error( STATUS_NOT_SUPPORTED );
return 0;
@@ -935,13 +948,13 @@ static void sock_set_error(void)
}
/* 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

Some files were not shown because too many files have changed in this diff Show More