#include #include #include "Cura_Fan.h" #include "globals.h" #include "fan.h" static const CMPIBroker* _cb = NULL; #include #include #include void print_backtrace(int signal) { fprintf(stderr, "BackTrace\n"); int ppid = getpid(); int pid = fork(); if (pid == 0) { // Child process char *strpid; asprintf(&strpid, "%d", ppid); execl("/usr/bin/gdb", "/usr/bin/gdb", "-p", strpid, NULL); } else { int status; waitpid(pid, &status, 0); system("/usr/bin/pkill -9 sfcbd"); } } static void Cura_FanInitialize() { init_linux_fan_module(); signal(SIGSEGV, print_backtrace); } static CMPIStatus Cura_FanCleanup( CMPIInstanceMI* mi, const CMPIContext* cc, CMPIBoolean term) { CMReturn(CMPI_RC_OK); } static CMPIStatus Cura_FanEnumInstanceNames( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop) { return KDefaultEnumerateInstanceNames( _cb, mi, cc, cr, cop); } static CMPIStatus Cura_FanEnumInstances( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char** properties) { const char *ns = KNameSpace(cop); char buf[200]; struct fanlist *lptr = NULL; struct fanlist *fans = NULL; struct cim_fan *sptr; if (enum_all_fans(&fans)) { KReturn2(_cb, ERR_FAILED, "Could not list fans."); } // iterate fan list lptr = fans; while (lptr != NULL) { sptr = lptr->f; Cura_Fan w; Cura_Fan_Init(&w, _cb, ns); Cura_Fan_Set_CreationClassName(&w, "Cura_Fan"); Cura_Fan_Set_SystemCreationClassName(&w, get_system_creation_class_name()); Cura_Fan_Set_SystemName(&w, get_system_name()); Cura_Fan_Set_DeviceID(&w, sptr->device_id); Cura_Fan_Set_Caption(&w, "Computer's fan"); Cura_Fan_Set_Description(&w,"Computer's fan."); snprintf(buf, 200, "Fan \"%s\" on chip \"%s\"", sptr->name, sptr->chip_name); Cura_Fan_Set_ElementName(&w, buf); // ManagedSystemElement Cura_Fan_Set_Name(&w, sptr->name); Cura_Fan_Init_OperationalStatus(&w, 2); Cura_Fan_Set_OperationalStatus(&w, 0, sptr->fault ? Cura_Fan_OperationalStatus_Error : Cura_Fan_OperationalStatus_OK); if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { Cura_Fan_Set_OperationalStatus(&w, 1, Cura_Fan_OperationalStatus_Stressed); } Cura_Fan_Init_StatusDescriptions(&w, 2); Cura_Fan_Set_StatusDescriptions(&w, 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."); if (sptr->alarm || sptr->alarm_min || sptr->alarm_max) { snprintf(buf, 200, "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"); Cura_Fan_Set_StatusDescriptions(&w, 1, buf); } Cura_Fan_Set_HealthState(&w, sptr->fault ? Cura_Fan_HealthState_Major_failure : Cura_Fan_HealthState_OK); Cura_Fan_Set_OperatingStatus(&w, sptr->fault ? Cura_Fan_OperatingStatus_Stopped : Cura_Fan_OperatingStatus_In_Service); Cura_Fan_Set_PrimaryStatus(&w, sptr->fault ? Cura_Fan_PrimaryStatus_Error : Cura_Fan_PrimaryStatus_OK); // EnabledLogicalElement Cura_Fan_Init_OtherIdentifyingInfo(&w, 2); Cura_Fan_Set_OtherIdentifyingInfo(&w, 0, sptr->chip_name); Cura_Fan_Set_OtherIdentifyingInfo(&w, 1, sptr->sys_path); Cura_Fan_Init_IdentifyingDescriptions(&w, 2); Cura_Fan_Set_IdentifyingDescriptions(&w, 0, "ChipName - name of fan's chip."); Cura_Fan_Set_IdentifyingDescriptions(&w, 1, "SysPath - system path of fan's chip."); Cura_Fan_Set_ActiveCooling(&w, true); uint32_t i = 1; int index = 0; debug("accessible_features: %d", sptr->accessible_features); Cura_Fan_Init_AccessibleFeatures(&w, 8); while (i <= CIM_FAN_AF_FEATURE_MAX) { if (i & sptr->accessible_features) { Cura_Fan_Set_AccessibleFeatures(&w, index++, i); } i = i << 1; } if (sptr->accessible_features & CIM_FAN_AF_MIN_SPEED) { Cura_Fan_Set_MinSpeed(&w, (uint64_t) sptr->min_speed); } if (sptr->accessible_features & CIM_FAN_AF_MAX_SPEED) { Cura_Fan_Set_MaxSpeed(&w, (uint64_t) sptr->max_speed); } if (sptr->accessible_features & CIM_FAN_AF_DIV) { Cura_Fan_Set_Divisor(&w, sptr->divisor); } if (sptr->accessible_features & CIM_FAN_AF_PULSES) { Cura_Fan_Set_Pulses(&w, sptr->pulses); } if (sptr->accessible_features & CIM_FAN_AF_BEEP) { Cura_Fan_Set_Beep(&w, sptr->beep); } if (sptr->accessible_features & CIM_FAN_AF_ALARM) { Cura_Fan_Set_Alarm(&w, sptr->alarm); } if (sptr->accessible_features & CIM_FAN_AF_ALARM_MIN) { Cura_Fan_Set_MinAlarm(&w, sptr->alarm_min); } if (sptr->accessible_features & CIM_FAN_AF_ALARM_MAX) { Cura_Fan_Set_MaxAlarm(&w, sptr->alarm_max); } KReturnInstance(cr, w); lptr = lptr->next; } free_fanlist(fans); KReturn(OK); } static CMPIStatus Cura_FanGetInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char** properties) { return KDefaultGetInstance( _cb, mi, cc, cr, cop, properties); } static CMPIStatus Cura_FanCreateInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const CMPIInstance* ci) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Cura_FanModifyInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const CMPIInstance* ci, const char** properties) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Cura_FanDeleteInstance( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } static CMPIStatus Cura_FanExecQuery( CMPIInstanceMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char* lang, const char* query) { CMReturn(CMPI_RC_ERR_NOT_SUPPORTED); } CMInstanceMIStub( Cura_Fan, Cura_Fan, _cb, Cura_FanInitialize()) static CMPIStatus Cura_FanMethodCleanup( CMPIMethodMI* mi, const CMPIContext* cc, CMPIBoolean term) { CMReturn(CMPI_RC_OK); } static CMPIStatus Cura_FanInvokeMethod( CMPIMethodMI* mi, const CMPIContext* cc, const CMPIResult* cr, const CMPIObjectPath* cop, const char* meth, const CMPIArgs* in, CMPIArgs* out) { return Cura_Fan_DispatchMethod( _cb, mi, cc, cr, cop, meth, in, out); } CMMethodMIStub( Cura_Fan, Cura_Fan, _cb, Cura_FanInitialize()) KUint32 Cura_Fan_RequestStateChange( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, const KUint16* RequestedState, KRef* Job, const KDateTime* TimeoutPeriod, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_SetPowerState( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, const KUint16* PowerState, const KDateTime* Time, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_Reset( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_EnableDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, const KBoolean* Enabled, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_OnlineDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, const KBoolean* Online, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_QuiesceDevice( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, const KBoolean* Quiesce, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_SaveProperties( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_RestoreProperties( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KUint32 Cura_Fan_SetSpeed( const CMPIBroker* cb, CMPIMethodMI* mi, const CMPIContext* context, const Cura_FanRef* self, const KUint64* DesiredSpeed, CMPIStatus* status) { KUint32 result = KUINT32_INIT; KSetStatus(status, ERR_NOT_SUPPORTED); return result; } KONKRET_REGISTRATION( "root/cimv2", "Cura_Fan", "Cura_Fan", "instance method")