File: interprocess_mutex.c

package info (click to toggle)
putty 0.83-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 13,216 kB
  • sloc: ansic: 148,476; python: 8,466; perl: 1,830; makefile: 128; sh: 117
file content (48 lines) | stat: -rw-r--r-- 1,154 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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 (should_have_security() && !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);
}