/* This file is part of cmpiLinux_FanProvider.
*
* cmpiLinux_FanProvider is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* cmpiLinux_FanProvider is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with cmpiLinux_FanProvider. If not, see
* .
*/
#include
#include
#include
#include
#include
#include
#include
#include "cmpiLinux_FanCommon.h"
#define UNUSED(x) ((void) (x))
static CMPIArray * _get_OperationalStatus(
CMPIBroker const *_broker,
CMPIStatus *rc,
struct cim_fan const *sptr)
{
CMPIArray *res = CMNewArray(_broker, 2, CMPI_uint16, rc);
unsigned short val;
if (!res) {
CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED,
"CMNewArray(_broker, 2, CMPI_uint16, rc)");
_OSBASE_TRACE(2, ("--- _get_OperationalStatus failed: %s",
CMGetCharPtr(rc->msg)));
}else {
val = sptr->fault ? 3:1; // Error : OK
*rc = CMSetArrayElementAt(res, 0, (CMPIValue*)(&val), CMPI_uint16);
if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) {
val = 4; // Stressed
*rc = CMSetArrayElementAt(res, 1, (CMPIValue*)(&val), CMPI_uint16);
}
}
return res;
}
static CMPIArray * _get_StatusDescriptions(
CMPIBroker const *_broker,
CMPIStatus *rc,
struct cim_fan const *sptr)
{
CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc);
if (!res) {
CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED,
"CMNewArray(_broker, 2, CMPI_string, rc)");
_OSBASE_TRACE(2, ("--- _get_StatusDescriptions failed: %s",
CMGetCharPtr(rc->msg)));
}else {
*rc = CMSetArrayElementAt(res, 0, sptr->fault ?
"Chip indicates, that fan is in fault state."
" Possible causes are open diodes, unconnected fan etc."
" Thus the measurement for this channel should not be trusted."
: "Fan seems to be functioning correctly.", CMPI_chars);
if (!rc->rc && (sptr->alarm || sptr->alarm_min || sptr->alarm_max)) {
char buf[100];
snprintf(buf, 100, "These alarm flags are set by the fan's chip:"
" alarm=%s, min_alarm=%s, max_alarm=%s",
sptr->alarm ? "1":"0",
sptr->alarm_min ? "1":"0",
sptr->alarm_max ? "1":"0");
CMSetArrayElementAt(res, 1, buf, CMPI_chars);
}
}
return res;
}
static CMPIArray * _get_OtherIdentifyingInfo(
CMPIBroker const *_broker,
CMPIStatus *rc,
struct cim_fan const *sptr)
{
CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc);
if (!res) {
CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED,
"CMNewArray(_broker, 2, CMPI_string, rc)");
_OSBASE_TRACE(2, ("--- _get_OtherIdentifyingInfo failed: %s",
CMGetCharPtr(rc->msg)));
}else {
CMSetArrayElementAt(res, 0, sptr->chip_name, CMPI_chars);
CMSetArrayElementAt(res, 1, sptr->sys_path, CMPI_chars);
}
return res;
}
static CMPIArray * _get_IdentifyingDescriptions(
CMPIBroker const *_broker,
CMPIStatus *rc)
{
CMPIArray *res = CMNewArray(_broker, 2, CMPI_string, rc);
if (!res) {
CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED,
"CMNewArray(_broker, 2, CMPI_string, rc)");
_OSBASE_TRACE(2, ("--- _get_IdentifyingDescriptions failed: %s",
CMGetCharPtr(rc->msg)));
}else {
CMSetArrayElementAt(res, 0,
"ChipName - name of fan's chip.", CMPI_chars);
CMSetArrayElementAt(res, 1,
"SysPath - system path of fan's chip.", CMPI_chars);
}
return res;
}
CMPIObjectPath * _makePath_FanCommon(
char const *class_name,
CMPIBroker const *_broker,
CMPIContext const *ctx,
CMPIObjectPath const *cop,
struct cim_fan *sptr,
CMPIStatus *rc)
{
UNUSED(ctx);
CMPIObjectPath * op = NULL;
_OSBASE_TRACE(2,("--- _makePath_FanCommon() called"));
op = CMNewObjectPath(_broker, CMGetCharPtr(CMGetNameSpace(cop, rc)),
class_name, rc);
if (CMIsNullObject(op)) {
CMSetStatusWithChars(_broker, rc, CMPI_RC_ERR_FAILED,
"Create CMPIObjectPath failed");
_OSBASE_TRACE(2, ("--- _makePath_FanCommon() failed : %s",
CMGetCharPtr(rc->msg)));
}else {
CMAddKey(op, "CreationClassName", class_name, CMPI_chars);
CMAddKey(op, "SystemCreationClassName", CSCreationClassName,
CMPI_chars);
CMAddKey(op, "SystemName", get_system_name(), CMPI_chars);
CMAddKey(op, "DeviceID", sptr->device_id, CMPI_chars);
}
_OSBASE_TRACE(2, ("--- _makePath_FanCommon() exited"));
return op;
}
CMPIInstance * _makeInst_FanCommon(
char const *class_name,
CMPIBroker const *_broker,
CMPIContext const *ctx,
CMPIObjectPath const *cop,
char const **properties,
struct cim_fan *sptr,
CMPIStatus *rc,
CMPIObjectPath **op)
{
UNUSED(ctx);
CMPIInstance *ci = NULL;
CMPIValue val;
uint16_t uint16;
char const *keys[] = {
"CreationClassName",
"SystemCreationClassName",
"SystemName",
"DeviceID",
NULL
};
char buf[200];
_OSBASE_TRACE(2, ("--- _makeInst_FanCommon() called"));
/* the sblim-cmpi-base package offers some tool methods to get common
* system data
*/
if( !get_system_name() ) {
CMSetStatusWithChars( _broker, rc,
CMPI_RC_ERR_FAILED, "no host name found" );
_OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s",
CMGetCharPtr(rc->msg)));
return NULL;
}
if( !get_os_name() ) {
CMSetStatusWithChars( _broker, rc,
CMPI_RC_ERR_FAILED, "no OS name found" );
_OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s",
CMGetCharPtr(rc->msg)));
return NULL;
}
*op = CMNewObjectPath(_broker, CMGetCharPtr(CMGetNameSpace(cop, rc)),
class_name, rc);
if (CMIsNullObject(*op)) {
CMSetStatusWithChars(_broker, rc,
CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed.");
_OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s",
CMGetCharPtr(rc->msg)));
return NULL;
}
ci = CMNewInstance(_broker, *op, rc);
if (CMIsNullObject(ci)) {
CMSetStatusWithChars(_broker, rc,
CMPI_RC_ERR_FAILED, "Create CMPIObjectPath failed.");
_OSBASE_TRACE(2, ("--- _makeInst_FanCommon() failed : %s",
CMGetCharPtr(rc->msg)));
return NULL;
}
CMSetPropertyFilter(ci, properties, keys);
//* keys ******************************************************************
CMSetProperty(ci, "CreationClassName", class_name, CMPI_chars);
CMSetProperty(ci, "SystemCreationClassName", CSCreationClassName,
CMPI_chars);
CMSetProperty(ci, "SystemName", get_system_name(), CMPI_chars);
CMSetProperty(ci, "DeviceID", sptr->device_id, CMPI_chars);
// other properties *******************************************************
// ManagedElement
CMSetProperty(ci, "Caption", "Computer's fan", CMPI_chars);
CMSetProperty(ci, "Description", "Computer's fan.", CMPI_chars);
snprintf(buf, 200, "Fan \"%s\" on chip \"%s\"", sptr->name,
sptr->chip_name);
CMSetProperty(ci, "ElementName", buf, CMPI_chars);
// ManagedSystemElement
CMSetProperty(ci, "Name", sptr->name, CMPI_chars);
val.array = _get_OperationalStatus(_broker, rc, sptr);
CMSetProperty(ci, "OperationalStatus", &val, CMPI_uint16A);
val.array = _get_StatusDescriptions(_broker, rc, sptr);
CMSetProperty(ci, "StatusDescriptions", &val, CMPI_stringA);
uint16 = sptr->fault ? 20:5; // Major failure : OK
CMSetProperty(ci, "HealthState", &uint16, CMPI_uint16);
uint16 = sptr->fault ? 5:16; // Stopped : In Service
CMSetProperty(ci, "OperatingStatus", &uint16, CMPI_uint16);
uint16 = sptr->fault ? 3:1; // Error : OK
CMSetProperty(ci, "PrimaryStatus", &uint16, CMPI_uint16);
// EnabledLogicalElement
val.array = _get_OtherIdentifyingInfo(_broker, rc, sptr);
CMSetProperty(ci, "OtherIdentifyingInfo", &val, CMPI_stringA);
val.array = _get_IdentifyingDescriptions(_broker, rc);
CMSetProperty(ci, "IdentifyingDescriptions", &val, CMPI_stringA);
_OSBASE_TRACE(2, ("--- _makeInst_FanCommon() exited"));
return ci;
}