static SaErrorT thres_cpy(ipmi_sensor_t *sensor, const SaHpiSensorReadingT reading, unsigned int event, ipmi_thresholds_t *info) { int val; int rv; if (!reading.IsSupported) { return SA_OK; } if ((rv = ipmi_sensor_threshold_settable(sensor, event, &val))) { dbg("ipmi_sensor_threshold_settable error = %d", rv); return SA_ERR_HPI_INVALID_CMD; } if (!val) { dbg("ipmi threshold 0x%x isn't settable", event); return SA_ERR_HPI_INVALID_DATA; } switch (reading.Type) { /*Fix Me* case...*/ case SAHPI_SENSOR_READING_TYPE_INT64: case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if(ipmi_threshold_set(info, sensor, event, reading.Value.SensorFloat64)) { return SA_OK; } break; } return SA_OK; }
static void sensor_set_thresholds(ipmi_sensor_t *sensor, void *cb_data) { ipmi_cmd_info_t *cmd_info = cb_data; ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); int rv; int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info); int argc = ipmi_cmdlang_get_argc(cmd_info); char **argv = ipmi_cmdlang_get_argv(cmd_info); ipmi_thresholds_t *th = NULL; enum ipmi_thresh_e thresh; double val; if ((argc - curr_arg) < 1) { /* Not enough parameters */ cmdlang->errstr = "Not enough parameters"; cmdlang->err = EINVAL; goto out_err; } th = ipmi_mem_alloc(ipmi_thresholds_size()); if (!th) { cmdlang->errstr = "Out of memory"; cmdlang->err = ENOMEM; goto out_err; } ipmi_thresholds_init(th); while (curr_arg < argc) { ipmi_cmdlang_get_threshold(argv[curr_arg], &thresh, cmd_info); if (cmdlang->err) { cmdlang->errstr = "Invalid threshold"; goto out_err; } curr_arg++; ipmi_cmdlang_get_double(argv[curr_arg], &val, cmd_info); if (cmdlang->err) { cmdlang->errstr = "Invalid threshold value"; goto out_err; } curr_arg++; rv = ipmi_threshold_set(th, sensor, thresh, val); if (rv) { cmdlang->errstr = "Error setting value"; cmdlang->err = rv; goto out_err; } } ipmi_cmdlang_cmd_info_get(cmd_info); rv = ipmi_sensor_set_thresholds(sensor, th, sensor_set_thresholds_done, cmd_info); if (rv) { ipmi_cmdlang_cmd_info_put(cmd_info); cmdlang->err = rv; cmdlang->errstr = "Error setting thresholds"; goto out_err; } ipmi_mem_free(th); return; out_err: ipmi_sensor_get_name(sensor, cmdlang->objstr, cmdlang->objstr_len); cmdlang->location = "cmd_sensor.c(sensor_set_thresholds)"; if (th) ipmi_mem_free(th); }