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
53 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
f352182c20 | ||
|
7bb4be5d03 | ||
|
ef956caf59 | ||
|
8e45d4c99f | ||
|
004109b3bd | ||
|
dd5b1514b2 | ||
|
34a6c25071 | ||
|
6dc4078d74 | ||
|
6fcc7f732d | ||
|
997c04f7f8 | ||
|
658fe4e3ae | ||
|
40aaeb61f8 | ||
|
6274002623 | ||
|
24af73d1d2 | ||
|
155a364280 | ||
|
9c1492069b | ||
|
c3d5bcab99 | ||
|
c3052d2e31 | ||
|
87fd81b9d8 | ||
|
062426558b | ||
|
1c6aeef3b4 | ||
|
f7de528788 | ||
|
8d45dc126d | ||
|
1a0d969d12 | ||
|
a926ab3deb | ||
|
d31a32b073 | ||
|
c21aa8beb3 | ||
|
67079f94ae | ||
|
c1dccff70a | ||
|
7b41306c4b | ||
|
2d7390de4b | ||
|
28bbb866f2 | ||
|
fc5a6b8c45 | ||
|
7398e80556 | ||
|
25bf8fbc02 | ||
|
b741e7191b | ||
|
aa76a0b8d2 | ||
|
d38c90ec2a | ||
|
44bba738bb | ||
|
264b4b3cab | ||
|
e63f3b7958 | ||
|
545aaf4153 | ||
|
6eb246a811 | ||
|
cd9fa06fcb | ||
|
33b3e62fc1 | ||
|
5808f78d07 | ||
|
8fa329cfe2 | ||
|
6cc7c450bf | ||
|
2aa8fe4524 | ||
|
3c0f6ef05f | ||
|
5a6af8c89c | ||
|
4c9309d05a | ||
|
5583aa9cc7 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +0,0 @@
|
||||
*~
|
14
README.md
14
README.md
@@ -2,3 +2,17 @@ wine-compholio-daily
|
||||
====================
|
||||
|
||||
Daily updates for the Wine "Compholio" Edition.
|
||||
|
||||
Current patches include:
|
||||
* Support for interface change notifications (http://bugs.winehq.org/show_bug.cgi?id=32328)
|
||||
* Support for stored file ACLs (http://bugs.winehq.org/show_bug.cgi?id=31858)
|
||||
* Support for Junction Points (http://bugs.winehq.org/show_bug.cgi?id=12401)
|
||||
* Support for TransmitFile (http://bugs.winehq.org/show_bug.cgi?id=5048)
|
||||
* Support for access security with named pipes (http://bugs.winehq.org/show_bug.cgi?id=34098)
|
||||
* Support for GetVolumePathName
|
||||
* 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)
|
||||
* Workaround for shlwapi URLs with relative paths
|
||||
* Support for PulseAudio backend for audio
|
||||
|
48
debian/changelog
vendored
48
debian/changelog
vendored
@@ -1,8 +1,54 @@
|
||||
wine-compholio (1.7.12-1) unstable; urgency=low
|
||||
* Fixed PulseAudio patches to apply with 'git am'.
|
||||
* Fixed PulseAudio driver configure file for upstream Wine 1.7.12.
|
||||
* Fixed PulseAudio driver pthread dependency for upstream Wine 1.7.12.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 07 Feb 2014 17:52:32 -0700
|
||||
|
||||
wine-compholio (1.7.12) unstable; urgency=low
|
||||
* Added new patches to support GetVolumePathName.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 07 Feb 2014 14:57:33 -0700
|
||||
|
||||
wine-compholio (1.7.11) unstable; urgency=low
|
||||
* Added SRWLock patch.
|
||||
* Added new patches to support TransmitFile.
|
||||
* Added new patches to support Junction Points.
|
||||
* Moved pipelight-specific patches to a separate folder.
|
||||
* Removed SRWLock patch included in upstream Wine 1.7.11.
|
||||
* Reduced SetTimer minimum limitation from 15 ms to 5 ms.
|
||||
* Added support for security access parameters for named pipes.
|
||||
* Added WINE_STRICT_DRAW_ORDERING command line environment variable.
|
||||
* Fixed a path length bug in the ACL inheritance patch (assumed DOS limitation).
|
||||
* Added some workarounds for shlwapi url functions not handling relative paths well.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 17 Jan 2014 12:27:32 -0700
|
||||
|
||||
wine-compholio (1.7.10) unstable; urgency=low
|
||||
* Removed monitor enumeration patch included in upstream Wine 1.7.10.
|
||||
* Updated SIO_ADDRESS_LIST_CHANGE patch with latest proposed version.
|
||||
* Added new patch to support linux windowlessmode (required for Qt5 browsers).
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 03 Jan 2014 12:19:14 -0700
|
||||
|
||||
wine-compholio (1.7.9) unstable; urgency=low
|
||||
* Added a new patch for windowless mode for Qt5 browsers.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 27 Dec 2013 12:03:22 -0700
|
||||
|
||||
wine-compholio (1.7.8-1) unstable; urgency=low
|
||||
* Fixed several build problems.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Sat, 07 Dec 2013 10:49:03 -0700
|
||||
|
||||
wine-compholio (1.7.8) unstable; urgency=low
|
||||
* Added PulseAudio support patches.
|
||||
* Updated SIO_ADDRESS_LIST_CHANGE patches.
|
||||
* Separated out patches into logical subfolders.
|
||||
* Updated XEMBED patch to work with latest upstream Wine.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 06 Dec 2013 13:26:24 -0700
|
||||
|
||||
wine-compholio (1.7.7) unstable; urgency=low
|
||||
* Remove patches included in upstream Wine 1.7.7.
|
||||
* Rebase ACL extended attribute patches against upstream Wine 1.7.7.
|
||||
* Rebase SIO_ADDRESS_LIST_CHANGE patches against upstream Wine 1.7.7.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 22 Nov 2013 10:35:07 -0700
|
||||
* Added the ability to return the list of patches with "wine --patches".
|
||||
* Added a patch to workaround a Silverlight issue with multiple monitors.
|
||||
-- Erich E. Hoover <erich.e.hoover@gmail.com> Fri, 22 Nov 2013 14:24:53 -0700
|
||||
|
||||
wine-compholio (1.7.6-1) unstable; urgency=low
|
||||
* Work around a build problem with Wine 1.7.6.
|
||||
|
1
debian/control
vendored
1
debian/control
vendored
@@ -50,6 +50,7 @@ Build-Depends: autotools-dev,
|
||||
libncurses5-dev [i386] | libncurses-dev [i386],
|
||||
libopenal-dev (>= 1:1.12) | ubuntu-desktop (<< 1.207),
|
||||
libpng12-dev,
|
||||
libpulse-dev,
|
||||
libssl-dev,
|
||||
libstdc++6-4.5-dev | libstdc++-dev,
|
||||
libtiff4-dev,
|
||||
|
11
debian/rules
vendored
11
debian/rules
vendored
@@ -64,8 +64,10 @@ ifneq "$(wildcard /usr/share/misc/config.guess)" ""
|
||||
endif
|
||||
|
||||
# Apply our patches to Wine
|
||||
for FILE in `ls $(CURDIR)/patches`; do \
|
||||
patch -N -p0 --strip=1 < $(CURDIR)/patches/$$FILE || exit 1; \
|
||||
for DIR in $$(find $(CURDIR)/patches/ -type d | sort); do \
|
||||
for FILE in $$(ls $$DIR | sort | grep '\.patch$$'); do \
|
||||
patch -N -p0 --strip=1 < $$DIR/$$FILE || exit 1; \
|
||||
done \
|
||||
done
|
||||
|
||||
# Update the configure script
|
||||
@@ -74,7 +76,8 @@ endif
|
||||
# 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 $(CONFFLAGS)
|
||||
|
||||
|
||||
# Update the wineserver protocol request data
|
||||
./tools/make_requests
|
||||
|
||||
build: build-stamp
|
||||
|
||||
@@ -117,7 +120,7 @@ binary-arch: build install
|
||||
dh_testdir
|
||||
dh_testroot
|
||||
# dh_installchangelogs ChangeLog
|
||||
dh_installdocs
|
||||
# dh_installdocs
|
||||
dh_installexamples
|
||||
# dh_install
|
||||
# dh_installmenu
|
||||
|
@@ -1,15 +1,19 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATCH_DATA="";
|
||||
for FILE in patches/*.patch; do
|
||||
MD5SUM=$(md5sum "${FILE}" | sed 's| .*||g');
|
||||
AUTHOR=$(cat "${FILE}" | sed -n 's|From: \([^<]*\).*|\1|p' | sed -e 's|"||g' -e 's| $||g');
|
||||
TITLE=$(cat "${FILE}" | sed -n '1!N; s|Subject: \(.*\)\n|\1|p');
|
||||
for FILE in patches/*/*.def; do
|
||||
UUID=$(echo "${FILE}" | sed -e 's|^.*/||g' -e 's|\.def$||g');
|
||||
REVISION=$(cat "${FILE}" | sed -n 's|Revision: \(.*\)|\1|p');
|
||||
AUTHOR=$(cat "${FILE}" | sed -n 's|Author: \(.*\)|\1|p');
|
||||
TITLE=$(cat "${FILE}" | sed -n 's|Title: \(.*\)|\1|p');
|
||||
if [ "${AUTHOR}" = "" ] && [ "${TITLE}" = "" ]; then
|
||||
continue;
|
||||
fi
|
||||
if [ "${PATCH_DATA}" != "" ]; then
|
||||
PATCH_DATA="${PATCH_DATA}
|
||||
";
|
||||
fi
|
||||
PATCH_DATA="${PATCH_DATA}+ { \"${MD5SUM}\", \"${AUTHOR}\", \"${TITLE}\" },";
|
||||
PATCH_DATA="${PATCH_DATA}+ { \"${UUID}:${REVISION}\", \"${AUTHOR}\", \"${TITLE}\" },";
|
||||
done
|
||||
PATCH_LINES=$(echo "${PATCH_DATA}" | grep -c '\n');
|
||||
PATCH_LINES=$((${PATCH_LINES}+20));
|
||||
|
@@ -1,5 +1,36 @@
|
||||
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..751a9e7 100644
|
||||
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)
|
||||
@@ -16,7 +47,7 @@ index a273502..751a9e7 100644
|
||||
+};
|
||||
+
|
||||
+/* return the applied non-standard patches */
|
||||
+const struct wine_patch * wine_get_patches(void)
|
||||
+const void * wine_get_patches(void)
|
||||
+{
|
||||
+ return &wine_patch_data[0];
|
||||
+}
|
||||
@@ -52,7 +83,7 @@ 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,13 @@ static inline void reserve_area( void *addr, size_t size )
|
||||
@@ -79,6 +79,12 @@ static inline void reserve_area( void *addr, size_t size )
|
||||
|
||||
#endif /* __APPLE__ */
|
||||
|
||||
@@ -61,7 +92,6 @@ index ac67290..516fd82 100644
|
||||
+ const char *author;
|
||||
+ const char *title;
|
||||
+};
|
||||
+extern void * CDECL wine_get_patches(void);
|
||||
+
|
||||
/***********************************************************************
|
||||
* check_command_line
|
||||
@@ -82,7 +112,7 @@ index ac67290..516fd82 100644
|
||||
}
|
||||
+ if (!strcmp( argv[1], "--patches" ))
|
||||
+ {
|
||||
+ struct wine_patch *wine_patch_data = wine_get_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,
|
||||
@@ -93,3 +123,15 @@ index ac67290..516fd82 100644
|
||||
}
|
||||
|
||||
|
||||
diff --git a/include/wine/library.h b/include/wine/library.h
|
||||
index 242bb69..aa9e585 100644
|
||||
--- a/include/wine/library.h
|
||||
+++ b/include/wine/library.h
|
||||
@@ -43,6 +43,7 @@ extern const char *wine_get_data_dir(void);
|
||||
extern const char *wine_get_server_dir(void);
|
||||
extern const char *wine_get_user_name(void);
|
||||
extern const char *wine_get_version(void);
|
||||
+extern const void *wine_get_patches(void);
|
||||
extern const char *wine_get_build_id(void);
|
||||
extern void wine_init_argv0_path( const char *argv0 );
|
||||
extern void wine_exec_wine_binary( const char *name, char **argv, const char *env_var );
|
||||
|
@@ -1,163 +0,0 @@
|
||||
From 4c261ca7ce6d73f0820106804797dcc7f0912b62 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Mon, 11 Nov 2013 00:18:31 +0100
|
||||
Subject: quartz/tests: Add tests for IVMRMonitorConfig
|
||||
|
||||
---
|
||||
dlls/quartz/tests/Makefile.in | 1 +
|
||||
dlls/quartz/tests/monitorconfig.c | 131 +++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 132 insertions(+)
|
||||
create mode 100644 dlls/quartz/tests/monitorconfig.c
|
||||
|
||||
diff --git a/dlls/quartz/tests/Makefile.in b/dlls/quartz/tests/Makefile.in
|
||||
index ae5fbac..94b2f44 100644
|
||||
--- a/dlls/quartz/tests/Makefile.in
|
||||
+++ b/dlls/quartz/tests/Makefile.in
|
||||
@@ -8,6 +8,7 @@ C_SRCS = \
|
||||
filtermapper.c \
|
||||
memallocator.c \
|
||||
misc.c \
|
||||
+ monitorconfig.c \
|
||||
referenceclock.c \
|
||||
videorenderer.c
|
||||
|
||||
diff --git a/dlls/quartz/tests/monitorconfig.c b/dlls/quartz/tests/monitorconfig.c
|
||||
new file mode 100644
|
||||
index 0000000..3a18460
|
||||
--- /dev/null
|
||||
+++ b/dlls/quartz/tests/monitorconfig.c
|
||||
@@ -0,0 +1,131 @@
|
||||
+/*
|
||||
+ * MonitorConfig unit tests for Quartz
|
||||
+ *
|
||||
+ * Copyright (C) 2013 Sebastian Lackner
|
||||
+ *
|
||||
+ * This library is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU Lesser General Public
|
||||
+ * License as published by the Free Software Foundation; either
|
||||
+ * version 2.1 of the License, or (at your option) any later version.
|
||||
+ *
|
||||
+ * This library is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ * Lesser General Public License for more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU Lesser General Public
|
||||
+ * License along with this library; if not, write to the Free Software
|
||||
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
+ */
|
||||
+
|
||||
+#define COBJMACROS
|
||||
+
|
||||
+#include "wine/test.h"
|
||||
+#include "dshow.h"
|
||||
+
|
||||
+static void test_monitorconfig_setmonitor(void)
|
||||
+{
|
||||
+ HRESULT hr;
|
||||
+ IUnknown *pVMR = NULL;
|
||||
+ IVMRMonitorConfig *pMonitorConfig = NULL;
|
||||
+ VMRGUID guid;
|
||||
+
|
||||
+ hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER,
|
||||
+ &IID_IUnknown, (LPVOID*)&pVMR);
|
||||
+ ok(hr == S_OK, "CoCreateInstance failed with %x.\n", hr);
|
||||
+ ok(pVMR != NULL, "pVMR is NULL.\n");
|
||||
+ if (!pVMR) goto out;
|
||||
+
|
||||
+ hr = IUnknown_QueryInterface(pVMR, &IID_IVMRMonitorConfig, (LPVOID*)&pMonitorConfig);
|
||||
+ ok(hr == S_OK, "IUnknown_QueryInterface returned %x.\n", hr);
|
||||
+ ok(pMonitorConfig != NULL, "pMonitorConfig is NULL.\n");
|
||||
+ if (!pMonitorConfig) goto out;
|
||||
+
|
||||
+ memset(&guid, 0, sizeof(guid));
|
||||
+ guid.pGUID = NULL; /* default DirectDraw device */
|
||||
+ hr = IVMRMonitorConfig_SetMonitor(pMonitorConfig, &guid);
|
||||
+ ok(hr == S_OK, "SetMonitor failed with %x.\n", hr);
|
||||
+
|
||||
+ memset(&guid, 255, sizeof(guid));
|
||||
+ hr = IVMRMonitorConfig_GetMonitor(pMonitorConfig, &guid);
|
||||
+ ok(hr == S_OK, "GetMonitor failed with %x.\n", hr);
|
||||
+ ok(guid.pGUID == NULL, "GetMonitor returned guid.pGUID = %p, expected NULL.\n", guid.pGUID);
|
||||
+
|
||||
+ memset(&guid, 0, sizeof(guid));
|
||||
+ guid.pGUID = NULL; /* default DirectDraw device */
|
||||
+ hr = IVMRMonitorConfig_SetDefaultMonitor(pMonitorConfig, &guid);
|
||||
+ ok(hr == S_OK, "SetDefaultMonitor failed with %x.\n", hr);
|
||||
+
|
||||
+ memset(&guid, 255, sizeof(guid));
|
||||
+ hr = IVMRMonitorConfig_GetDefaultMonitor(pMonitorConfig, &guid);
|
||||
+ ok(hr == S_OK, "GetDefaultMonitor failed with %x.\n", hr);
|
||||
+ ok(guid.pGUID == NULL, "GetDefaultMonitor returned guid.pGUID = %p, expected NULL.\n", guid.pGUID);
|
||||
+
|
||||
+out:
|
||||
+ if (pMonitorConfig) IVMRMonitorConfig_Release(pMonitorConfig);
|
||||
+ if (pVMR) IUnknown_Release(pVMR);
|
||||
+}
|
||||
+
|
||||
+static void test_monitorconfig_getavailablemonitors(void)
|
||||
+{
|
||||
+ HRESULT hr;
|
||||
+ IUnknown *pVMR = NULL;
|
||||
+ IVMRMonitorConfig *pMonitorConfig = NULL;
|
||||
+ VMRMONITORINFO info[8];
|
||||
+ DWORD numdev_total, numdev;
|
||||
+
|
||||
+ hr = CoCreateInstance(&CLSID_VideoMixingRenderer, NULL, CLSCTX_INPROC_SERVER,
|
||||
+ &IID_IUnknown, (LPVOID*)&pVMR);
|
||||
+ ok(hr == S_OK, "CoCreateInstance failed with %x.\n", hr);
|
||||
+ ok(pVMR != NULL, "pVMR is NULL.\n");
|
||||
+ if (!pVMR) goto out;
|
||||
+
|
||||
+ hr = IUnknown_QueryInterface(pVMR, &IID_IVMRMonitorConfig, (LPVOID*)&pMonitorConfig);
|
||||
+ ok(hr == S_OK, "IUnknown_QueryInterface returned %x.\n", hr);
|
||||
+ ok(pMonitorConfig != NULL, "pMonitorConfig is NULL.\n");
|
||||
+ if (!pMonitorConfig) goto out;
|
||||
+
|
||||
+ /* call without any arguments */
|
||||
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, NULL, 0, NULL);
|
||||
+ ok(hr == E_POINTER, "GetAvailableMonitors returned %x, expected E_POINTER.\n", hr);
|
||||
+
|
||||
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, 0, &numdev_total);
|
||||
+ ok(hr == E_INVALIDARG, "GetAvailableMonitors returned %x, expected E_INVALIDARG.\n", hr);
|
||||
+
|
||||
+ numdev_total = 0;
|
||||
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, NULL, 0, &numdev_total);
|
||||
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
|
||||
+ ok(numdev_total > 0, "GetAvailableMonitors returned numdev_total = %d, expected > 0.\n", numdev_total);
|
||||
+
|
||||
+ if (numdev_total > 1)
|
||||
+ {
|
||||
+ /* return just the first monitor */
|
||||
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, 1, &numdev);
|
||||
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
|
||||
+ ok(numdev == 1, "GetAvailableMonitors returned numdev = %d, expected 1.\n", numdev);
|
||||
+ }
|
||||
+
|
||||
+ /* don't request information for more monitors than memory available */
|
||||
+ if (numdev_total > sizeof(info)/sizeof(VMRMONITORINFO))
|
||||
+ numdev_total = sizeof(info)/sizeof(VMRMONITORINFO);
|
||||
+
|
||||
+ hr = IVMRMonitorConfig_GetAvailableMonitors(pMonitorConfig, info, numdev_total, &numdev);
|
||||
+ ok(hr == S_OK, "GetAvailableMonitors failed with %x.\n", hr);
|
||||
+ ok(numdev == numdev_total, "GetAvailableMonitors returned numdev = %d, expected %d.\n", numdev, numdev_total);
|
||||
+
|
||||
+ /* TODO: Add test for content of info */
|
||||
+
|
||||
+out:
|
||||
+ if (pMonitorConfig) IVMRMonitorConfig_Release(pMonitorConfig);
|
||||
+ if (pVMR) IUnknown_Release(pVMR);
|
||||
+}
|
||||
+
|
||||
+START_TEST(monitorconfig)
|
||||
+{
|
||||
+ CoInitialize(NULL);
|
||||
+
|
||||
+ test_monitorconfig_setmonitor();
|
||||
+ test_monitorconfig_getavailablemonitors();
|
||||
+
|
||||
+ CoUninitialize();
|
||||
+}
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -1,14 +1,14 @@
|
||||
From c1f305f001257ac6bc215abd34c1577e7d9bf7f2 Mon Sep 17 00:00:00 2001
|
||||
From 362ec39591ce54bcb5ce825c1baab8f5d0885193 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Fri, 4 Oct 2013 08:10:20 -0600
|
||||
Date: Thu, 5 Dec 2013 13:32:34 -0700
|
||||
Subject: ws2_32: Ask the server to process unsupported WSAIoctl operations.
|
||||
|
||||
---
|
||||
dlls/ws2_32/socket.c | 47 ++++++++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 44 insertions(+), 3 deletions(-)
|
||||
dlls/ws2_32/socket.c | 56 +++++++++++++++++++++++++++++++++++++++++++-------
|
||||
1 file changed, 49 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
|
||||
index 679258b..44a9093 100644
|
||||
index 304b0eb..170dde7 100644
|
||||
--- a/dlls/ws2_32/socket.c
|
||||
+++ b/dlls/ws2_32/socket.c
|
||||
@@ -3608,6 +3608,36 @@ static const char *debugstr_wsaioctl(DWORD ioctl)
|
||||
@@ -48,19 +48,25 @@ index 679258b..44a9093 100644
|
||||
/**********************************************************************
|
||||
* WSAIoctl (WS2_32.50)
|
||||
*
|
||||
@@ -3800,9 +3830,8 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
|
||||
@@ -3799,12 +3829,6 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
|
||||
break;
|
||||
}
|
||||
|
||||
case WS_SIO_ADDRESS_LIST_CHANGE:
|
||||
- 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 */
|
||||
+ TRACE("-> SIO_ADDRESS_LIST_CHANGE request\n");
|
||||
+ status = WSAEOPNOTSUPP; /* this operation needs to be handled by the server */
|
||||
break;
|
||||
|
||||
- break;
|
||||
-
|
||||
case WS_SIO_ADDRESS_LIST_QUERY:
|
||||
@@ -4045,6 +4074,18 @@ INT WINAPI WSAIoctl(SOCKET s, DWORD code, LPVOID in_buff, DWORD in_size, LPVOID
|
||||
{
|
||||
DWORD size;
|
||||
@@ -4040,11 +4064,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;
|
||||
}
|
||||
|
||||
@@ -70,10 +76,17 @@ index 679258b..44a9093 100644
|
||||
+ 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)
|
File diff suppressed because it is too large
Load Diff
@@ -8,10 +8,10 @@ Subject: ws2_32: Add an interactive test for interface change notifications.
|
||||
1 file changed, 68 insertions(+)
|
||||
|
||||
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
|
||||
index ac6ee10..b6da0e7 100644
|
||||
index 0abf732..4703e59 100644
|
||||
--- a/dlls/ws2_32/tests/sock.c
|
||||
+++ b/dlls/ws2_32/tests/sock.c
|
||||
@@ -6225,6 +6225,73 @@ static void test_sioRoutingInterfaceQuery(void)
|
||||
@@ -6487,6 +6487,73 @@ static void test_sioRoutingInterfaceQuery(void)
|
||||
closesocket(sock);
|
||||
}
|
||||
|
||||
@@ -85,14 +85,14 @@ index ac6ee10..b6da0e7 100644
|
||||
static void test_synchronous_WSAIoctl(void)
|
||||
{
|
||||
HANDLE previous_port, io_port;
|
||||
@@ -7101,6 +7168,7 @@ START_TEST( sock )
|
||||
@@ -7570,6 +7637,7 @@ START_TEST( sock )
|
||||
test_ConnectEx();
|
||||
|
||||
test_sioRoutingInterfaceQuery();
|
||||
+ test_sioAddressListChange();
|
||||
|
||||
test_WSAAsyncGetServByPort();
|
||||
test_WSAAsyncGetServByName();
|
||||
test_WSALookupService();
|
||||
|
||||
--
|
||||
1.7.9.5
|
||||
|
@@ -0,0 +1,3 @@
|
||||
Revision: 1
|
||||
Author: Erich E. Hoover
|
||||
Title: Implement SIO_ADDRESS_LIST_CHANGE.
|
@@ -1,6 +1,6 @@
|
||||
From 78a5ebb94f3717bedd77f7c096e8fce1e9a640d1 Mon Sep 17 00:00:00 2001
|
||||
From acc6aac3356b0ec9024362488016945b76f67111 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Mon, 18 Nov 2013 18:12:05 -0700
|
||||
Date: Sat, 11 Jan 2014 09:18:16 -0700
|
||||
Subject: server: Store and return security attributes with extended file
|
||||
attributes.
|
||||
|
||||
@@ -14,10 +14,10 @@ Subject: server: Store and return security attributes with extended file
|
||||
6 files changed, 269 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 98a73f2..bb03667 100644
|
||||
index dcabb55..fc8bd5c 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -71,6 +71,7 @@ AC_ARG_WITH(pthread, AS_HELP_STRING([--without-pthread],[do not use the pthrea
|
||||
@@ -73,6 +73,7 @@ AC_ARG_WITH(pthread, AS_HELP_STRING([--without-pthread],[do not use the pthrea
|
||||
AC_ARG_WITH(sane, AS_HELP_STRING([--without-sane],[do not use SANE (scanner support)]))
|
||||
AC_ARG_WITH(tiff, AS_HELP_STRING([--without-tiff],[do not use TIFF]))
|
||||
AC_ARG_WITH(v4l, AS_HELP_STRING([--without-v4l],[do not use v4l1 (v4l support)]))
|
||||
@@ -25,7 +25,7 @@ index 98a73f2..bb03667 100644
|
||||
AC_ARG_WITH(xcomposite,AS_HELP_STRING([--without-xcomposite],[do not use the Xcomposite extension]),
|
||||
[if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi])
|
||||
AC_ARG_WITH(xcursor, AS_HELP_STRING([--without-xcursor],[do not use the Xcursor extension]),
|
||||
@@ -666,6 +667,11 @@ AC_CHECK_HEADERS([libprocstat.h],,,
|
||||
@@ -665,6 +666,11 @@ AC_CHECK_HEADERS([libprocstat.h],,,
|
||||
#include <sys/socket.h>
|
||||
#endif])
|
||||
|
||||
@@ -38,10 +38,10 @@ index 98a73f2..bb03667 100644
|
||||
|
||||
AC_SUBST(dlldir,"\${libdir}/wine")
|
||||
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
|
||||
index fe31b5c..7d28c05 100644
|
||||
index 2efe80e..297cf96 100644
|
||||
--- a/dlls/advapi32/tests/security.c
|
||||
+++ b/dlls/advapi32/tests/security.c
|
||||
@@ -3088,10 +3088,10 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -3105,10 +3105,10 @@ static void test_CreateDirectoryA(void)
|
||||
bret = pGetAce(pDacl, 0, (VOID **)&ace);
|
||||
ok(bret, "Failed to get Current User ACE.\n");
|
||||
bret = EqualSid(&ace->SidStart, user_sid);
|
||||
@@ -56,7 +56,7 @@ index fe31b5c..7d28c05 100644
|
||||
ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%x != 0x1f01ff)\n",
|
||||
ace->Mask);
|
||||
}
|
||||
@@ -3100,10 +3100,10 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -3117,10 +3117,10 @@ static void test_CreateDirectoryA(void)
|
||||
bret = pGetAce(pDacl, 1, (VOID **)&ace);
|
||||
ok(bret, "Failed to get Administators Group ACE.\n");
|
||||
bret = EqualSid(&ace->SidStart, admin_sid);
|
||||
@@ -71,7 +71,7 @@ index fe31b5c..7d28c05 100644
|
||||
ok(ace->Mask == 0x1f01ff, "Administators Group ACE has unexpected mask (0x%x != 0x1f01ff)\n",
|
||||
ace->Mask);
|
||||
}
|
||||
@@ -3277,7 +3277,7 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
@@ -3294,7 +3294,7 @@ 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);
|
||||
@@ -80,7 +80,7 @@ index fe31b5c..7d28c05 100644
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%x != 0x1f01ff)\n",
|
||||
@@ -3288,8 +3288,7 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
@@ -3305,8 +3305,7 @@ static void test_GetNamedSecurityInfoA(void)
|
||||
bret = pGetAce(pDacl, 1, (VOID **)&ace);
|
||||
ok(bret, "Failed to get Administators Group ACE.\n");
|
||||
bret = EqualSid(&ace->SidStart, admin_sid);
|
||||
@@ -90,7 +90,7 @@ index fe31b5c..7d28c05 100644
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Administators Group ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
ok(ace->Mask == 0x1f01ff || broken(ace->Mask == GENERIC_ALL) /* win2k */,
|
||||
@@ -3943,7 +3942,7 @@ static void test_GetSecurityInfo(void)
|
||||
@@ -3960,7 +3959,7 @@ 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);
|
||||
@@ -99,7 +99,7 @@ index fe31b5c..7d28c05 100644
|
||||
ok(((ACE_HEADER *)ace)->AceFlags == 0,
|
||||
"Current User ACE has unexpected flags (0x%x != 0x0)\n", ((ACE_HEADER *)ace)->AceFlags);
|
||||
ok(ace->Mask == 0x1f01ff, "Current User ACE has unexpected mask (0x%x != 0x1f01ff)\n",
|
||||
@@ -3954,7 +3953,7 @@ static void test_GetSecurityInfo(void)
|
||||
@@ -3971,7 +3970,7 @@ static void test_GetSecurityInfo(void)
|
||||
bret = pGetAce(pDacl, 1, (VOID **)&ace);
|
||||
ok(bret, "Failed to get Administators Group ACE.\n");
|
||||
bret = EqualSid(&ace->SidStart, admin_sid);
|
@@ -1,18 +1,18 @@
|
||||
From 5e49f53a4bd591e67c9b7c4fdaf46933e319f9aa Mon Sep 17 00:00:00 2001
|
||||
From b5efc991444e6539adf73f42b44e333b8aa7de2f Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Mon, 18 Nov 2013 18:15:20 -0700
|
||||
Date: Mon, 13 Jan 2014 18:32:05 -0700
|
||||
Subject: ntdll: Inherit security attributes from parent directories.
|
||||
|
||||
---
|
||||
dlls/advapi32/tests/security.c | 40 ++++++++++++++++++-
|
||||
dlls/ntdll/file.c | 85 +++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 123 insertions(+), 2 deletions(-)
|
||||
dlls/ntdll/file.c | 83 +++++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 121 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
|
||||
index 7d28c05..a8d136b 100644
|
||||
index 297cf96..4b1c5a2 100644
|
||||
--- a/dlls/advapi32/tests/security.c
|
||||
+++ b/dlls/advapi32/tests/security.c
|
||||
@@ -3013,10 +3013,11 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -3030,10 +3030,11 @@ static void test_CreateDirectoryA(void)
|
||||
ACL_SIZE_INFORMATION acl_size;
|
||||
ACCESS_ALLOWED_ACE *ace;
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
@@ -25,7 +25,7 @@ index 7d28c05..a8d136b 100644
|
||||
DWORD error;
|
||||
PACL pDacl;
|
||||
|
||||
@@ -3108,6 +3109,43 @@ static void test_CreateDirectoryA(void)
|
||||
@@ -3125,6 +3126,43 @@ static void test_CreateDirectoryA(void)
|
||||
ace->Mask);
|
||||
}
|
||||
|
||||
@@ -70,10 +70,10 @@ index 7d28c05..a8d136b 100644
|
||||
HeapFree(GetProcessHeap(), 0, user);
|
||||
bret = RemoveDirectoryA(tmpdir);
|
||||
diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
|
||||
index 1de2c61..8948bb7 100644
|
||||
index d2efcc1..bdcaab4 100644
|
||||
--- a/dlls/ntdll/file.c
|
||||
+++ b/dlls/ntdll/file.c
|
||||
@@ -103,6 +103,81 @@ mode_t FILE_umask = 0;
|
||||
@@ -103,6 +103,79 @@ mode_t FILE_umask = 0;
|
||||
|
||||
static const WCHAR ntfsW[] = {'N','T','F','S'};
|
||||
|
||||
@@ -86,10 +86,10 @@ index 1de2c61..8948bb7 100644
|
||||
+{
|
||||
+ SECURITY_INFORMATION info = OWNER_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION
|
||||
+ |DACL_SECURITY_INFORMATION|SACL_SECURITY_INFORMATION;
|
||||
+ WCHAR *p, parent[UNICODE_STRING_MAX_CHARS];
|
||||
+ PSECURITY_DESCRIPTOR parentsd = NULL;
|
||||
+ ACL_SIZE_INFORMATION acl_size;
|
||||
+ BOOLEAN present, defaulted;
|
||||
+ WCHAR *p, parent[MAX_PATH];
|
||||
+ OBJECT_ATTRIBUTES pattr;
|
||||
+ UNICODE_STRING parentW;
|
||||
+ IO_STATUS_BLOCK io;
|
||||
@@ -102,11 +102,9 @@ index 1de2c61..8948bb7 100644
|
||||
+ parentW.Buffer = parent;
|
||||
+ parentW.Length = filenameW->Length;
|
||||
+ memcpy(parentW.Buffer, filenameW->Buffer, filenameW->Length);
|
||||
+ if ((p = strrchrW(parent, '\\')) != NULL)
|
||||
+ {
|
||||
+ p[0] = 0;
|
||||
+ parentW.Length = (p-parent)*sizeof(WCHAR);
|
||||
+ }
|
||||
+ if ((p = strrchrW(parent, '\\')) == NULL) return NULL;
|
||||
+ p[0] = 0;
|
||||
+ parentW.Length = (p-parent)*sizeof(WCHAR);
|
||||
+ memset(&pattr, 0x0, sizeof(pattr));
|
||||
+ pattr.Length = sizeof(pattr);
|
||||
+ pattr.Attributes = OBJ_CASE_INSENSITIVE;
|
||||
@@ -155,7 +153,7 @@ index 1de2c61..8948bb7 100644
|
||||
/**************************************************************************
|
||||
* FILE_CreateFile (internal)
|
||||
* Open a file.
|
||||
@@ -161,10 +236,18 @@ static NTSTATUS FILE_CreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATT
|
||||
@@ -161,10 +234,18 @@ static NTSTATUS FILE_CreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATT
|
||||
{
|
||||
struct security_descriptor *sd;
|
||||
struct object_attributes objattr;
|
@@ -0,0 +1,3 @@
|
||||
Revision: 1
|
||||
Author: Erich E. Hoover
|
||||
Title: Store and return security attributes with extended file attributes.
|
@@ -0,0 +1,3 @@
|
||||
Revision: 1
|
||||
Author: Erich E. Hoover
|
||||
Title: Allow string comparison with linguistic casing.
|
@@ -1,6 +1,6 @@
|
||||
From c80b095c919dcc976955f258fe177a2b24fd8dea Mon Sep 17 00:00:00 2001
|
||||
From 90f7d78cf1ee2bf4329b298cb24e0e5145637557 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Mon, 28 Oct 2013 00:39:17 +0100
|
||||
Date: Fri, 22 Nov 2013 18:54:18 +0100
|
||||
Subject: winex11: Enable/disable windows when they are (un)mapped by foreign
|
||||
applications
|
||||
|
||||
@@ -9,10 +9,10 @@ Subject: winex11: Enable/disable windows when they are (un)mapped by foreign
|
||||
1 file changed, 17 insertions(+)
|
||||
|
||||
diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
|
||||
index df27468..9d958c0 100644
|
||||
index 767c003..f39b922 100644
|
||||
--- a/dlls/winex11.drv/event.c
|
||||
+++ b/dlls/winex11.drv/event.c
|
||||
@@ -929,6 +929,7 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
|
||||
@@ -922,6 +922,7 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
|
||||
static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
|
||||
{
|
||||
struct x11drv_win_data *data;
|
||||
@@ -20,9 +20,9 @@ index df27468..9d958c0 100644
|
||||
|
||||
if (event->xany.window == x11drv_thread_data()->clip_window)
|
||||
{
|
||||
@@ -943,7 +944,12 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
|
||||
@@ -936,7 +937,12 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
|
||||
if (hwndFocus && IsChild( hwnd, hwndFocus ))
|
||||
set_input_focus( hwnd );
|
||||
set_input_focus( data );
|
||||
}
|
||||
+
|
||||
+ is_embedded = data->embedded;
|
||||
@@ -33,20 +33,21 @@ index df27468..9d958c0 100644
|
||||
}
|
||||
|
||||
|
||||
@@ -952,7 +958,18 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
|
||||
@@ -945,8 +951,19 @@ static void X11DRV_MapNotify( HWND hwnd, XEvent *event )
|
||||
*/
|
||||
static void X11DRV_UnmapNotify( HWND hwnd, XEvent *event )
|
||||
{
|
||||
+ struct x11drv_win_data *data;
|
||||
+ BOOL is_embedded;
|
||||
+
|
||||
if (event->xany.window == x11drv_thread_data()->clip_window) clipping_cursor = 0;
|
||||
if (event->xany.window == x11drv_thread_data()->clip_window)
|
||||
clipping_cursor = FALSE;
|
||||
+
|
||||
+ if (!(data = get_win_data( hwnd ))) return;
|
||||
+
|
||||
+ is_embedded = data->embedded;
|
||||
+ release_win_data( data );
|
||||
+
|
||||
+
|
||||
+ if (is_embedded)
|
||||
+ EnableWindow( hwnd, FALSE );
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user