309 lines
8 KiB
C
309 lines
8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
tcreate.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Test for cluster object creation APIs
|
||
|
|
||
|
Author:
|
||
|
|
||
|
John Vert (jvert) 3-May-1996
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
#include "windows.h"
|
||
|
#include "cluster.h"
|
||
|
#include "stdio.h"
|
||
|
#include "stdlib.h"
|
||
|
|
||
|
LPWSTR ClusterName=NULL;
|
||
|
BOOL DoGroup=FALSE;
|
||
|
BOOL DoResource=FALSE;
|
||
|
int FirstParam=0;
|
||
|
LPWSTR Name=NULL;
|
||
|
LPWSTR GroupName=NULL;
|
||
|
LPWSTR ResourceType=NULL;
|
||
|
|
||
|
CHAR UsageText[] =
|
||
|
"TCREATE [-c cluster] type name [resourcegroup resourcetype]\n"
|
||
|
" [-p paramkey:paramname \"paramvalue\"]\n"
|
||
|
" cluster\tspecifies the name of the cluster to connect to\n"
|
||
|
" type\t\teither \"group\" or \"resource\"\n"
|
||
|
" name\t\tthe friendly name of the object\n"
|
||
|
" resourcegroup\tthe name of the group the resource should be created in.\n"
|
||
|
" resourcetype\tthe type of resource to be created\n";
|
||
|
|
||
|
|
||
|
void
|
||
|
Usage(
|
||
|
void
|
||
|
)
|
||
|
{
|
||
|
fprintf(stderr, UsageText);
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
LPWSTR
|
||
|
GetString(
|
||
|
IN LPSTR String
|
||
|
)
|
||
|
{
|
||
|
LPWSTR wString;
|
||
|
DWORD Length;
|
||
|
|
||
|
Length = strlen(String)+1;
|
||
|
|
||
|
wString = malloc(Length*sizeof(WCHAR));
|
||
|
if (wString == NULL) {
|
||
|
fprintf(stderr, "GetString couldn't malloc %d bytes\n",Length*sizeof(WCHAR));
|
||
|
}
|
||
|
mbstowcs(wString, String, Length);
|
||
|
return(wString);
|
||
|
}
|
||
|
|
||
|
void
|
||
|
SetParam(
|
||
|
IN HRESOURCE hRes,
|
||
|
IN LPSTR KeyName,
|
||
|
IN LPSTR ValueName,
|
||
|
IN LPSTR ValueData
|
||
|
)
|
||
|
{
|
||
|
HKEY Key;
|
||
|
HKEY Key2;
|
||
|
HKEY ParamKey;
|
||
|
LONG Status;
|
||
|
LPWSTR wKeyName, wValueName, wValueData;
|
||
|
DWORD Disposition;
|
||
|
DWORD IntCount;
|
||
|
DWORD Number = FALSE;
|
||
|
DWORD Value;
|
||
|
CHAR TestValue[16];
|
||
|
|
||
|
//
|
||
|
// See if we got a number, instead of a string.
|
||
|
//
|
||
|
IntCount = sscanf( ValueData, "%d", &Value );
|
||
|
if ( IntCount == 1 ) {
|
||
|
sprintf( TestValue, "%d\0", Value );
|
||
|
if ( strcmp(TestValue, ValueData) == 0 ) {
|
||
|
Number = TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
wKeyName = GetString(KeyName);
|
||
|
wValueName = GetString(ValueName);
|
||
|
wValueData = GetString(ValueData);
|
||
|
Key = GetClusterResourceKey(hRes, KEY_READ | KEY_WRITE);
|
||
|
if (Key == NULL) {
|
||
|
fprintf(stderr, "GetResourceKey failed %d\n", GetLastError());
|
||
|
return;
|
||
|
}
|
||
|
Status = ClusterRegOpenKey(Key, L"Parameters", KEY_WRITE, &Key2);
|
||
|
if (Status != ERROR_SUCCESS) {
|
||
|
fprintf(stderr, "SetParam: Couldn't open Parameters key error %d\n", Status);
|
||
|
} else {
|
||
|
Status = ClusterRegCreateKey(Key2,
|
||
|
wKeyName,
|
||
|
0,
|
||
|
KEY_WRITE,
|
||
|
NULL,
|
||
|
&ParamKey,
|
||
|
&Disposition);
|
||
|
if (Status != ERROR_SUCCESS) {
|
||
|
fprintf(stderr, "SetParam: Couldn't create key %ws error %d\n", wKeyName,Status);
|
||
|
} else {
|
||
|
if ( Number ) {
|
||
|
Status = ClusterRegSetValue(ParamKey,
|
||
|
wValueName,
|
||
|
REG_DWORD,
|
||
|
(CONST BYTE *)&Value,
|
||
|
sizeof(Value));
|
||
|
} else {
|
||
|
Status = ClusterRegSetValue(ParamKey,
|
||
|
wValueName,
|
||
|
REG_SZ,
|
||
|
(CONST BYTE *)wValueData,
|
||
|
(lstrlenW(wValueData)+1)*sizeof(WCHAR));
|
||
|
}
|
||
|
if (Status != ERROR_SUCCESS) {
|
||
|
fprintf(stderr, "SetParam: Couldn't set value %ws in key %ws, error %lx\n",
|
||
|
wValueName, wKeyName, Status);
|
||
|
}
|
||
|
ClusterRegCloseKey(ParamKey);
|
||
|
}
|
||
|
ClusterRegCloseKey(Key2);
|
||
|
}
|
||
|
|
||
|
ClusterRegCloseKey(Key);
|
||
|
free(wKeyName);
|
||
|
free(wValueName);
|
||
|
free(wValueData);
|
||
|
|
||
|
}
|
||
|
|
||
|
void
|
||
|
ParseArgs(
|
||
|
int argc,
|
||
|
char *argv[]
|
||
|
)
|
||
|
{
|
||
|
int i;
|
||
|
DWORD ArgsSeen=0;
|
||
|
|
||
|
for (i=1;i<argc;i++) {
|
||
|
if ((argv[i][0] == '-') ||
|
||
|
(argv[i][0] == '/')) {
|
||
|
switch (argv[i][1]) {
|
||
|
case 'c':
|
||
|
if (++i == argc) {
|
||
|
Usage();
|
||
|
}
|
||
|
ClusterName = GetString(argv[i]);
|
||
|
break;
|
||
|
case 'p':
|
||
|
if ((i+2) >= argc) {
|
||
|
Usage();
|
||
|
}
|
||
|
FirstParam = i+1;
|
||
|
return;
|
||
|
default:
|
||
|
Usage();
|
||
|
break;
|
||
|
}
|
||
|
} else {
|
||
|
switch (ArgsSeen) {
|
||
|
case 0:
|
||
|
//
|
||
|
// type
|
||
|
//
|
||
|
if (_stricmp(argv[i], "group")==0) {
|
||
|
DoGroup = TRUE;
|
||
|
} else if (_stricmp(argv[i], "resource") == 0) {
|
||
|
DoResource = TRUE;
|
||
|
} else {
|
||
|
Usage();
|
||
|
}
|
||
|
ArgsSeen++;
|
||
|
break;
|
||
|
case 1:
|
||
|
Name = GetString(argv[i]);
|
||
|
ArgsSeen++;
|
||
|
break;
|
||
|
case 2:
|
||
|
if (DoGroup) {
|
||
|
Usage();
|
||
|
} else {
|
||
|
GroupName = GetString(argv[i]);
|
||
|
}
|
||
|
ArgsSeen++;
|
||
|
break;
|
||
|
case 3:
|
||
|
ResourceType = GetString(argv[i]);
|
||
|
ArgsSeen++;
|
||
|
break;
|
||
|
default:
|
||
|
Usage();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (DoGroup) {
|
||
|
if (ArgsSeen != 2) {
|
||
|
Usage();
|
||
|
}
|
||
|
} else if (DoResource) {
|
||
|
if (ArgsSeen != 4) {
|
||
|
Usage();
|
||
|
}
|
||
|
} else {
|
||
|
Usage();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_cdecl
|
||
|
main (argc, argv)
|
||
|
int argc;
|
||
|
char *argv[];
|
||
|
{
|
||
|
HCLUSTER hClus;
|
||
|
HGROUP hGroup;
|
||
|
HRESOURCE hResource;
|
||
|
LPSTR KeyName, ParamName;
|
||
|
LPSTR ParamValue;
|
||
|
|
||
|
ParseArgs(argc, argv);
|
||
|
|
||
|
hClus = OpenCluster(ClusterName);
|
||
|
if (hClus == NULL) {
|
||
|
fprintf(stderr,
|
||
|
"OpenCluster %ws failed %d\n",
|
||
|
(ClusterName == NULL) ? L"(NULL)" : ClusterName,
|
||
|
GetLastError());
|
||
|
return(0);
|
||
|
}
|
||
|
|
||
|
if (DoGroup) {
|
||
|
hGroup = CreateClusterGroup(hClus, Name);
|
||
|
if (hGroup == NULL) {
|
||
|
fprintf(stderr,
|
||
|
"CreateGroup %ws failed %d\n", Name, GetLastError());
|
||
|
return(0);
|
||
|
}
|
||
|
} else if (DoResource) {
|
||
|
hGroup = OpenClusterGroup(hClus, GroupName);
|
||
|
if (hGroup == NULL) {
|
||
|
fprintf(stderr,
|
||
|
"OpenGroup %ws failed %d\n", GroupName, GetLastError());
|
||
|
return(0);
|
||
|
}
|
||
|
hResource = CreateClusterResource(hGroup,
|
||
|
Name,
|
||
|
ResourceType,
|
||
|
0);
|
||
|
if (hResource == NULL) {
|
||
|
fprintf(stderr,
|
||
|
"CreateResource %ws failed %d\n", Name, GetLastError());
|
||
|
return(0);
|
||
|
}
|
||
|
while (FirstParam != 0) {
|
||
|
//
|
||
|
// FirstParam is the keyname:paramname.
|
||
|
// FirstParam+1 is the paramvalue
|
||
|
//
|
||
|
KeyName = argv[FirstParam];
|
||
|
ParamValue = argv[FirstParam+1];
|
||
|
ParamName = strchr(KeyName,':');
|
||
|
if (ParamName == NULL) {
|
||
|
Usage();
|
||
|
}
|
||
|
*ParamName++ = '\0';
|
||
|
|
||
|
SetParam(hResource, KeyName, ParamName, ParamValue);
|
||
|
FirstParam += 2;
|
||
|
|
||
|
if (FirstParam == argc) {
|
||
|
break;
|
||
|
}
|
||
|
if (_stricmp(argv[FirstParam], "-p") != 0) {
|
||
|
Usage();
|
||
|
}
|
||
|
if (FirstParam+2 >= argc) {
|
||
|
fprintf(stderr, "firstparam %d, argc %d\n",FirstParam,argc);
|
||
|
Usage();
|
||
|
}
|
||
|
FirstParam+=1;
|
||
|
}
|
||
|
} else {
|
||
|
Usage();
|
||
|
}
|
||
|
|
||
|
return(0);
|
||
|
}
|
||
|
|