mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 01:18:00 +00:00
Windows: factor out mutex lock/unlock from sharing.c.
This will let me reuse them easily in Pageant setup.
This commit is contained in:
parent
d0b609c68a
commit
a2de0a8b7d
@ -13,6 +13,7 @@ add_sources_from_current_dir(utils
|
||||
utils/getdlgitemtext_alloc.c
|
||||
utils/get_system_dir.c
|
||||
utils/get_username.c
|
||||
utils/interprocess_mutex.c
|
||||
utils/is_console_handle.c
|
||||
utils/load_system32_dll.c
|
||||
utils/ltime.c
|
||||
|
@ -740,4 +740,7 @@ void plug_closing_winsock_error(Plug *plug, DWORD error);
|
||||
|
||||
SeatPromptResult make_spr_sw_abort_winerror(const char *prefix, DWORD error);
|
||||
|
||||
HANDLE lock_interprocess_mutex(const char *mutexname, char **error);
|
||||
void unlock_interprocess_mutex(HANDLE mutex);
|
||||
|
||||
#endif /* PUTTY_WINDOWS_PLATFORM_H */
|
||||
|
@ -36,8 +36,6 @@ int platform_ssh_share(const char *pi_name, Conf *conf,
|
||||
char *name, *mutexname, *pipename;
|
||||
HANDLE mutex;
|
||||
Socket *retsock;
|
||||
PSECURITY_DESCRIPTOR psd;
|
||||
PACL acl;
|
||||
|
||||
/*
|
||||
* Transform the platform-independent version of the connection
|
||||
@ -57,39 +55,12 @@ int platform_ssh_share(const char *pi_name, Conf *conf,
|
||||
* Make a mutex name out of the connection identifier, and lock it
|
||||
* while we decide whether to be upstream or downstream.
|
||||
*/
|
||||
{
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
|
||||
mutexname = make_name(CONNSHARE_MUTEX_PREFIX, name);
|
||||
if (!make_private_security_descriptor(MUTEX_ALL_ACCESS,
|
||||
&psd, &acl, logtext)) {
|
||||
sfree(mutexname);
|
||||
sfree(name);
|
||||
return SHARE_NONE;
|
||||
}
|
||||
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.nLength = sizeof(sa);
|
||||
sa.lpSecurityDescriptor = psd;
|
||||
sa.bInheritHandle = false;
|
||||
|
||||
mutex = CreateMutex(&sa, false, mutexname);
|
||||
|
||||
if (!mutex) {
|
||||
*logtext = dupprintf("CreateMutex(\"%s\") failed: %s",
|
||||
mutexname, win_strerror(GetLastError()));
|
||||
sfree(mutexname);
|
||||
sfree(name);
|
||||
LocalFree(psd);
|
||||
LocalFree(acl);
|
||||
return SHARE_NONE;
|
||||
}
|
||||
|
||||
mutexname = make_name(CONNSHARE_MUTEX_PREFIX, name);
|
||||
mutex = lock_interprocess_mutex(mutexname, logtext);
|
||||
if (!mutex) {
|
||||
sfree(mutexname);
|
||||
LocalFree(psd);
|
||||
LocalFree(acl);
|
||||
|
||||
WaitForSingleObject(mutex, INFINITE);
|
||||
sfree(name);
|
||||
return SHARE_NONE;
|
||||
}
|
||||
|
||||
pipename = make_name(CONNSHARE_PIPE_PREFIX, name);
|
||||
@ -103,8 +74,7 @@ int platform_ssh_share(const char *pi_name, Conf *conf,
|
||||
*logtext = pipename;
|
||||
*sock = retsock;
|
||||
sfree(name);
|
||||
ReleaseMutex(mutex);
|
||||
CloseHandle(mutex);
|
||||
unlock_interprocess_mutex(mutex);
|
||||
return SHARE_DOWNSTREAM;
|
||||
}
|
||||
sfree(*ds_err);
|
||||
|
48
windows/utils/interprocess_mutex.c
Normal file
48
windows/utils/interprocess_mutex.c
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Lock and unlock a mutex with a globally visible name. Used to
|
||||
* synchronise between unrelated processes, such as two
|
||||
* connection-sharing PuTTYs deciding which will be the upstream.
|
||||
*/
|
||||
|
||||
#include "putty.h"
|
||||
#include "security-api.h"
|
||||
|
||||
HANDLE lock_interprocess_mutex(const char *mutexname, char **error)
|
||||
{
|
||||
PSECURITY_DESCRIPTOR psd = NULL;
|
||||
PACL acl = NULL;
|
||||
HANDLE mutex = NULL;
|
||||
|
||||
if (!make_private_security_descriptor(MUTEX_ALL_ACCESS,
|
||||
&psd, &acl, error))
|
||||
goto out;
|
||||
|
||||
SECURITY_ATTRIBUTES sa;
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
sa.nLength = sizeof(sa);
|
||||
sa.lpSecurityDescriptor = psd;
|
||||
sa.bInheritHandle = false;
|
||||
|
||||
mutex = CreateMutex(&sa, false, mutexname);
|
||||
if (!mutex) {
|
||||
*error = dupprintf("CreateMutex(\"%s\") failed: %s",
|
||||
mutexname, win_strerror(GetLastError()));
|
||||
goto out;
|
||||
}
|
||||
|
||||
WaitForSingleObject(mutex, INFINITE);
|
||||
|
||||
out:
|
||||
if (psd)
|
||||
LocalFree(psd);
|
||||
if (acl)
|
||||
LocalFree(acl);
|
||||
|
||||
return mutex;
|
||||
}
|
||||
|
||||
void unlock_interprocess_mutex(HANDLE mutex)
|
||||
{
|
||||
ReleaseMutex(mutex);
|
||||
CloseHandle(mutex);
|
||||
}
|
Loading…
Reference in New Issue
Block a user