static zbx_ipmi_control_t *allocate_ipmi_control(zbx_ipmi_host_t *h, ipmi_control_t *control) { size_t sz; zbx_ipmi_control_t *c; char *c_name = NULL; sz = (size_t)ipmi_control_get_id_length(control); c_name = zbx_malloc(c_name, sz + 1); ipmi_control_get_id(control, c_name, sz); zabbix_log(LOG_LEVEL_DEBUG, "In allocate_ipmi_control() %s@[%s]:%d", c_name, h->ip, h->port); h->control_count++; sz = h->control_count * sizeof(zbx_ipmi_control_t); if (NULL == h->controls) h->controls = zbx_malloc(h->controls, sz); else h->controls = zbx_realloc(h->controls, sz); c = &h->controls[h->control_count - 1]; memset(c, 0, sizeof(zbx_ipmi_control_t)); c->control = control; c->c_name = c_name; c->num_values = ipmi_control_get_num_vals(control); sz = sizeof(int) * c->num_values; c->val = zbx_malloc(c->val, sz); memset(c->val, 0, sz); return c; }
static void __get_control_leds_state(ipmi_control_t *control, int err, ipmi_light_setting_t *settings, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int len, res ,val; if (err) { dbg("__get_control_leds_state: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { dbg("IPMI plug-in only support OEM control now"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (settings == (ipmi_light_setting_t *)NULL) { dbg("__get_control_leds_state: settings = NULL"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } len = ipmi_control_get_num_vals(control); info->state->StateUnion.Oem.BodyLength = len; res = ipmi_light_setting_get_color(settings, 0, &val); info->state->StateUnion.Oem.Body[0] = val; info->done = 1; }
static void __get_control_state(ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (err || !val) { dbg("__get_control_state: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { dbg("IPMI plug-in only support OEM control now"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (err || !val) { dbg("__get_control_state: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } info->state->StateUnion.Oem.BodyLength = ipmi_control_get_num_vals(control); memcpy(&info->state->StateUnion.Oem.Body[0], val, info->state->StateUnion.Oem.BodyLength); info->done = 1; }
static void _set_control_state(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (info->state->StateUnion.Oem.BodyLength != ipmi_control_get_num_vals(control)) { dbg("control number is not equal to supplied data"); info->done = -1; info->err = SA_ERR_HPI_INVALID_PARAMS; return; } if (ipmi_control_light_set_with_setting(control)) { ipmi_light_setting_t *setting; setting = ipmi_alloc_light_settings(1); ipmi_light_setting_set_local_control(setting, 0, 1); ipmi_light_setting_set_color(setting, 0, info->state->StateUnion.Oem.Body[0]); ipmi_control_set_light(control, setting, __set_control_state, cb_data); ipmi_free_light_settings(setting); } else { ipmi_control_set_val(control, /* compile error */ // (int *)&info->state->StateUnion.Oem.Body[0], (int *)(void *)&info->state->StateUnion.Oem.Body[0], __set_control_state, info); } }
static void _set_control_state(ipmi_control_t *control, void *cb_data) { struct ohoi_control_info *info = cb_data; if (info->state->StateUnion.Oem.BodyLength != ipmi_control_get_num_vals(control)) { dbg("control number is not equal to supplied data"); info->done = -1; return; } ipmi_control_set_val(control, (int *)&info->state->StateUnion.Oem.Body[0], __set_control_state, info); }
static void __get_control_state(ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_control_info *info = cb_data; if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { dbg("IPMI plug-in only support OEM control now"); return; } info->state->StateUnion.Oem.BodyLength = ipmi_control_get_num_vals(control); memcpy(&info->state->StateUnion.Oem.Body[0], val, info->state->StateUnion.Oem.BodyLength); info->done = 1; }