version 1.2, 2015/04/20 18:10:13
|
version 1.3, 2015/04/20 18:19:56
|
|
|
#include <MI.h> | #include <MI.h> |
#include <common.h> | #include <common.h> |
#include <base/paths.h> | #include <base/paths.h> |
#include <base/dir.h> |
#include <pal/dir.h> |
#include <base/strings.h> |
#include <pal/strings.h> |
#include <base/batch.h> | #include <base/batch.h> |
#include <base/strarr.h> | #include <base/strarr.h> |
#include <base/stringarray.h> | #include <base/stringarray.h> |
|
|
| |
extern MI_Server* __mi_server; | extern MI_Server* __mi_server; |
| |
#define PROVIDER_ID "2FDB5542-5896-45D5-9BE9-DC04430AAABE" |
#define T MI_T |
|
|
|
#define PROVIDER_ID MI_T("2FDB5542-5896-45D5-9BE9-DC04430AAABE") |
|
|
|
MI_Char** Listdir(const char* path) |
|
{ |
|
Dir* dir; |
|
MI_Char** arr; |
|
|
|
dir = Dir_Open(path); |
|
if (!dir) |
|
return NULL; |
|
|
|
arr = ZArr(); |
|
if (!arr) |
|
{ |
|
Dir_Close(dir); |
|
return NULL; |
|
} |
|
|
|
for (;;) |
|
{ |
|
DirEnt* ent = Dir_Read(dir); |
|
MI_Char path[PAL_MAX_PATH_SIZE]; |
|
MI_Char** oldArr = arr; |
|
|
|
|
|
if (!ent) |
|
break; |
|
|
|
if (strcmp(ent->name, ".") == 0 || strcmp(ent->name, "..") == 0) |
|
continue; |
|
|
|
TcsStrlcpy(path, ent->name, MI_COUNT(path)); |
|
#ifdef _PREFAST_ |
|
#pragma prefast(push) |
|
#pragma prefast(disable:26018) |
|
/* Prefast is getting confused with the fact that ZArrCat can return NULL for first parameter */ |
|
#endif |
|
ZArrCat(&arr, path); |
|
#ifdef _PREFAST_ |
|
#pragma prefast(pop) |
|
#endif |
|
if (!arr) |
|
{ |
|
ZArrFree(oldArr); |
|
Dir_Close(dir); |
|
return NULL; |
|
} |
|
} |
|
|
|
Dir_Close(dir); |
|
return arr; |
|
} |
| |
static MI_Result _MakeInstance(Identify* inst, MI_Context* context) | static MI_Result _MakeInstance(Identify* inst, MI_Context* context) |
{ | { |
|
MI_Char buf[1024]; |
|
|
ProvMgrFT* ft = (ProvMgrFT*)__mi_server->serverFT - 1; | ProvMgrFT* ft = (ProvMgrFT*)__mi_server->serverFT - 1; |
| |
if (ft->magic != PROVMGRFT_MAGIC) | if (ft->magic != PROVMGRFT_MAGIC) |
|
|
Identify_Construct(inst, context); | Identify_Construct(inst, context); |
| |
Identify_Set_InstanceID(inst, PROVIDER_ID); | Identify_Set_InstanceID(inst, PROVIDER_ID); |
|
|
|
#if defined(_MSC_VER) |
Identify_Set_ProductName(inst, CONFIG_PRODUCT); | Identify_Set_ProductName(inst, CONFIG_PRODUCT); |
Identify_Set_ProductVendor(inst, "Microsoft"); |
#else |
|
TcsStrlcpy(buf, CONFIG_PRODUCT, MI_COUNT(buf)); |
|
Identify_Set_ProductName(inst, buf); |
|
#endif |
|
|
|
Identify_Set_ProductVendor(inst, T("Microsoft")); |
|
|
Identify_Set_ProductVersionMajor(inst, CONFIG_MAJOR); | Identify_Set_ProductVersionMajor(inst, CONFIG_MAJOR); |
|
|
Identify_Set_ProductVersionMinor(inst, CONFIG_MINOR); | Identify_Set_ProductVersionMinor(inst, CONFIG_MINOR); |
|
|
Identify_Set_ProductVersionRevision(inst, CONFIG_REVISION); | Identify_Set_ProductVersionRevision(inst, CONFIG_REVISION); |
|
|
|
#if defined(_MSC_VER) |
Identify_Set_ProductVersionString(inst, CONFIG_VERSION); | Identify_Set_ProductVersionString(inst, CONFIG_VERSION); |
Identify_Set_Platform(inst, CONFIG_PLATFORM); |
#else |
Identify_Set_OperatingSystem(inst, CONFIG_OS); |
TcsStrlcpy(buf, CONFIG_VERSION, MI_COUNT(buf)); |
Identify_Set_Architecture(inst, CONFIG_ARCH); |
Identify_Set_ProductVersionString(inst, buf); |
Identify_Set_Compiler(inst, CONFIG_COMPILER); |
#endif |
Identify_Set_ConfigPrefix(inst, CONFIG_PREFIX); |
|
Identify_Set_ConfigLibDir(inst, CONFIG_LIBDIR); |
TcsStrlcpy(buf, CONFIG_PLATFORM, MI_COUNT(buf)); |
Identify_Set_ConfigBinDir(inst, CONFIG_BINDIR); |
Identify_Set_Platform(inst, buf); |
Identify_Set_ConfigIncludeDir(inst, CONFIG_INCLUDEDIR); |
|
Identify_Set_ConfigDataDir(inst, CONFIG_DATADIR); |
TcsStrlcpy(buf, CONFIG_OS, MI_COUNT(buf)); |
Identify_Set_ConfigLocalStateDir(inst, CONFIG_LOCALSTATEDIR); |
Identify_Set_OperatingSystem(inst, buf); |
Identify_Set_ConfigSysConfDir(inst, CONFIG_SYSCONFDIR); |
|
Identify_Set_ConfigProviderDir(inst, CONFIG_SYSCONFDIR); |
TcsStrlcpy(buf, CONFIG_ARCH, MI_COUNT(buf)); |
Identify_Set_ConfigLogFile(inst, GetPath(ID_LOGFILE)); |
Identify_Set_Architecture(inst, buf); |
Identify_Set_ConfigPIDFile(inst, GetPath(ID_PIDFILE)); |
|
Identify_Set_ConfigRegisterDir(inst, GetPath(ID_REGISTERDIR)); |
TcsStrlcpy(buf, CONFIG_COMPILER, MI_COUNT(buf)); |
Identify_Set_ConfigSchemaDir(inst, GetPath(ID_SCHEMADIR)); |
Identify_Set_Compiler(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_COMPILER, MI_COUNT(buf)); |
|
Identify_Set_ConfigPrefix(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_LIBDIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigLibDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_BINDIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigBinDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_INCLUDEDIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigIncludeDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_DATADIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigDataDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_LOCALSTATEDIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigLocalStateDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_SYSCONFDIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigSysConfDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, CONFIG_SYSCONFDIR, MI_COUNT(buf)); |
|
Identify_Set_ConfigProviderDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, OMI_GetPath(ID_LOGFILE), MI_COUNT(buf)); |
|
Identify_Set_ConfigLogFile(inst, buf); |
|
|
|
TcsStrlcpy(buf, OMI_GetPath(ID_PIDFILE), MI_COUNT(buf)); |
|
Identify_Set_ConfigPIDFile(inst, buf); |
|
|
|
TcsStrlcpy(buf, OMI_GetPath(ID_REGISTERDIR), MI_COUNT(buf)); |
|
Identify_Set_ConfigRegisterDir(inst, buf); |
|
|
|
TcsStrlcpy(buf, OMI_GetPath(ID_SCHEMADIR), MI_COUNT(buf)); |
|
Identify_Set_ConfigSchemaDir(inst, buf); |
| |
/* Identify.SystemName */ | /* Identify.SystemName */ |
{ | { |
|
|
typedef const char* (*GetPathFunc)(PathID id); | typedef const char* (*GetPathFunc)(PathID id); |
GetPathFunc func; | GetPathFunc func; |
| |
if ((func = (GetPathFunc)ft->FindSymbol("GetPath"))) |
if ((func = (GetPathFunc)ft->FindSymbol("OMI_GetPath"))) |
{ | { |
char** data = Listdir(func(ID_REGISTERDIR)); |
MI_Char** data = Listdir(func(ID_REGISTERDIR)); |
| |
if (data) | if (data) |
{ | { |
Identify_Set_ConfigNameSpaces( | Identify_Set_ConfigNameSpaces( |
inst, (const char**)data, (MI_Uint32)StrArrLen(data)); |
inst, (const MI_Char**)data, (MI_Uint32)ZArrLen(data)); |
| |
StrArrFree(data); |
ZArrFree(data); |
} | } |
} | } |
} | } |
|
|
{ | { |
if (!instanceName || | if (!instanceName || |
!instanceName->InstanceID.exists || | !instanceName->InstanceID.exists || |
strcmp(PROVIDER_ID,instanceName->InstanceID.value) != 0) |
Tcscmp(PROVIDER_ID, instanceName->InstanceID.value) != 0) |
{ | { |
MI_PostResult(context, MI_RESULT_NOT_FOUND); | MI_PostResult(context, MI_RESULT_NOT_FOUND); |
return; | return; |
|
|
{ | { |
MI_PostResult(context, MI_RESULT_NOT_SUPPORTED); | MI_PostResult(context, MI_RESULT_NOT_SUPPORTED); |
} | } |
|
|