windows-nt/Source/XPSP1/NT/base/cluster/service/gs/quorm.c
2020-09-26 16:20:57 +08:00

105 lines
1.7 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
quorum.c
Abstract:
Implements quorum for cm, uses UNC file for now
Author:
Ahmed Mohamed (ahmedm) 12, 01, 2000
Revision History:
--*/
#include <nt.h>
#include <ntdef.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
//#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
// Quorum stuff
static HANDLE DlmQhd = 0;
static char *default_qfile="\\DosDevices\\UNC\\ahmedm\\tmp\\gs.qrm";
extern char *WINAPI config_get_qfile();
BOOLEAN
QuormAcquire()
{
OBJECT_ATTRIBUTES objattrs;
UNICODE_STRING cwspath;
NTSTATUS status;
IO_STATUS_BLOCK iostatus;
WCHAR buf[128];
int n;
char *qfile;
if (DlmQhd)
return TRUE;
qfile = config_get_qfile();
if (!qfile) {
qfile = default_qfile;
}
// no-quorum is specified
if (qfile[0] == '\0')
return TRUE;
// convert to unicode
n = MultiByteToWideChar(CP_ACP, 0, qfile, strlen(qfile), buf, sizeof(buf));
buf[n] = buf[n+1] = '\0';
RtlInitUnicodeString(&cwspath, buf);
InitializeObjectAttributes(&objattrs, &cwspath, OBJ_CASE_INSENSITIVE,
NULL, NULL);
status = NtCreateFile(&DlmQhd,
SYNCHRONIZE | DELETE,
&objattrs,
&iostatus,
0,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_CREATE,
FILE_DELETE_ON_CLOSE | FILE_NON_DIRECTORY_FILE,
NULL,
0);
if (status != STATUS_SUCCESS) {
if (status != STATUS_OBJECT_NAME_COLLISION) {
printf("Quorm '%s' failed %x\n", qfile, status);
}
return FALSE;
}
return TRUE;
}
void
QuormInit()
{
DlmQhd = 0;
}
void
QuormRelease()
{
if (DlmQhd) {
NtClose(DlmQhd);
DlmQhd = 0;
}
}