00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <errno.h>
00035 #include <string.h>
00036 #include <ctype.h>
00037 #include <stdlib.h>
00038 #include <stdio.h>
00039 #include <OpenIPMI/ipmiif.h>
00040 #include <OpenIPMI/ipmi_cmdlang.h>
00041
00042
00043 #include <OpenIPMI/internal/ipmi_malloc.h>
00044
00045 static void
00046 sensor_list_handler(ipmi_entity_t *entity, ipmi_sensor_t *sensor,
00047 void *cb_data)
00048 {
00049 ipmi_cmd_info_t *cmd_info = cb_data;
00050 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00051 char sensor_name[IPMI_SENSOR_NAME_LEN];
00052
00053 if (cmdlang->err)
00054 return;
00055
00056 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00057
00058 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00059 }
00060
00061 static void
00062 sensor_list(ipmi_entity_t *entity, void *cb_data)
00063 {
00064 ipmi_cmd_info_t *cmd_info = cb_data;
00065 char entity_name[IPMI_ENTITY_NAME_LEN];
00066
00067 ipmi_entity_get_name(entity, entity_name, sizeof(entity_name));
00068 ipmi_cmdlang_out(cmd_info, "Entity", NULL);
00069 ipmi_cmdlang_down(cmd_info);
00070 ipmi_cmdlang_out(cmd_info, "Name", entity_name);
00071 ipmi_cmdlang_out(cmd_info, "Sensors", NULL);
00072 ipmi_cmdlang_down(cmd_info);
00073 ipmi_entity_iterate_sensors(entity, sensor_list_handler, cmd_info);
00074 ipmi_cmdlang_up(cmd_info);
00075 ipmi_cmdlang_up(cmd_info);
00076 }
00077
00078 static void
00079 sensor_dump(ipmi_sensor_t *sensor, ipmi_cmd_info_t *cmd_info)
00080 {
00081 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00082 int num, lun;
00083 char *str;
00084 const char *cstr;
00085 int event_support;
00086 int event_reading_type;
00087 int len;
00088 int rv;
00089 int val;
00090
00091 event_reading_type = ipmi_sensor_get_event_reading_type(sensor);
00092
00093 ipmi_sensor_get_num(sensor, &lun, &num);
00094 ipmi_cmdlang_out_int(cmd_info, "LUN", lun);
00095 ipmi_cmdlang_out_int(cmd_info, "Number", num);
00096 ipmi_cmdlang_out_int(cmd_info, "Event Reading Type",
00097 ipmi_sensor_get_event_reading_type(sensor));
00098 ipmi_cmdlang_out(cmd_info, "Event Reading Type Name",
00099 ipmi_sensor_get_event_reading_type_string(sensor));
00100 ipmi_cmdlang_out_int(cmd_info, "Type",
00101 ipmi_sensor_get_sensor_type(sensor));
00102 ipmi_cmdlang_out(cmd_info, "Type Name",
00103 ipmi_sensor_get_sensor_type_string(sensor));
00104 val = ipmi_sensor_get_sensor_direction(sensor);
00105 if (val != IPMI_SENSOR_DIRECTION_UNSPECIFIED)
00106 ipmi_cmdlang_out(cmd_info, "Direction",
00107 ipmi_get_sensor_direction_string(val));
00108
00109 event_support = ipmi_sensor_get_event_support(sensor);
00110 switch (event_support) {
00111 case IPMI_EVENT_SUPPORT_PER_STATE:
00112 ipmi_cmdlang_out(cmd_info, "Event Support", "per state");
00113 break;
00114 case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR:
00115 ipmi_cmdlang_out(cmd_info, "Event Support", "entire sensor");
00116 break;
00117 case IPMI_EVENT_SUPPORT_GLOBAL_ENABLE:
00118 ipmi_cmdlang_out(cmd_info, "Event Support", "global");
00119 break;
00120 default:
00121 break;
00122 }
00123
00124 ipmi_cmdlang_out_bool(cmd_info, "Init Scanning",
00125 ipmi_sensor_get_sensor_init_scanning(sensor));
00126 ipmi_cmdlang_out_bool(cmd_info, "Init Events",
00127 ipmi_sensor_get_sensor_init_events(sensor));
00128 ipmi_cmdlang_out_bool(cmd_info, "Init Thresholds",
00129 ipmi_sensor_get_sensor_init_thresholds(sensor));
00130 ipmi_cmdlang_out_bool(cmd_info, "Init Hysteresis",
00131 ipmi_sensor_get_sensor_init_hysteresis(sensor));
00132 ipmi_cmdlang_out_bool(cmd_info, "Init Type",
00133 ipmi_sensor_get_sensor_init_type(sensor));
00134 ipmi_cmdlang_out_bool(cmd_info, "Init Power Up Events",
00135 ipmi_sensor_get_sensor_init_pu_events(sensor));
00136 ipmi_cmdlang_out_bool(cmd_info, "Init Power Up Scanning",
00137 ipmi_sensor_get_sensor_init_pu_scanning(sensor));
00138
00139 ipmi_cmdlang_out_bool(cmd_info, "Ignore If No Entity",
00140 ipmi_sensor_get_ignore_if_no_entity(sensor));
00141 ipmi_cmdlang_out_bool(cmd_info, "Auto Rearm",
00142 ipmi_sensor_get_supports_auto_rearm(sensor));
00143 ipmi_cmdlang_out_int(cmd_info, "OEM1",
00144 ipmi_sensor_get_oem1(sensor));
00145
00146 len = ipmi_sensor_get_id_length(sensor);
00147 if (len) {
00148 str = ipmi_mem_alloc(len);
00149 if (!str) {
00150 cmdlang->err = ENOMEM;
00151 cmdlang->errstr = "Out of memory";
00152 goto out_err;
00153 }
00154 len = ipmi_sensor_get_id(sensor, str, len);
00155 ipmi_cmdlang_out_type(cmd_info, "Id",
00156 ipmi_sensor_get_id_type(sensor),
00157 str, len);
00158 ipmi_mem_free(str);
00159 }
00160
00161 if (event_reading_type == IPMI_EVENT_READING_TYPE_THRESHOLD) {
00162 int access = ipmi_sensor_get_threshold_access(sensor);
00163 enum ipmi_thresh_e thresh;
00164 enum ipmi_event_value_dir_e value_dir;
00165 enum ipmi_event_dir_e dir;
00166 int rv;
00167 char th_name[50];
00168 double dval;
00169
00170 ipmi_cmdlang_out(cmd_info, "Threshold Access",
00171 ipmi_get_threshold_access_support_string(access));
00172
00173 for (thresh = IPMI_LOWER_NON_CRITICAL;
00174 thresh <= IPMI_UPPER_NON_RECOVERABLE;
00175 thresh++)
00176 {
00177 rv = ipmi_sensor_threshold_reading_supported(sensor, thresh, &val);
00178 if ((rv) || !val)
00179 continue;
00180
00181 ipmi_cmdlang_out(cmd_info, "Threshold", NULL);
00182 ipmi_cmdlang_down(cmd_info);
00183 ipmi_cmdlang_out(cmd_info, "Name",
00184 ipmi_get_threshold_string(thresh));
00185 rv = ipmi_sensor_threshold_readable(sensor, thresh, &val);
00186 if (rv)
00187 val = 0;
00188 ipmi_cmdlang_out_bool(cmd_info, "Readable", val);
00189 rv = ipmi_sensor_threshold_settable(sensor, thresh, &val);
00190 if (rv)
00191 val = 0;
00192 ipmi_cmdlang_out_bool(cmd_info, "Settable", val);
00193
00194 for (value_dir = IPMI_GOING_LOW;
00195 value_dir <= IPMI_GOING_HIGH;
00196 value_dir++)
00197 {
00198 for (dir = IPMI_ASSERTION;
00199 dir <= IPMI_DEASSERTION;
00200 dir++)
00201 {
00202 rv = ipmi_sensor_threshold_event_supported(sensor,
00203 thresh,
00204 value_dir,
00205 dir,
00206 &val);
00207 if (rv || !val) continue;
00208
00209 snprintf(th_name, sizeof(th_name), "%s %s",
00210 ipmi_get_value_dir_string(value_dir),
00211 ipmi_get_event_dir_string(dir));
00212 ipmi_cmdlang_out(cmd_info, "Supports", th_name);
00213 }
00214 }
00215 ipmi_cmdlang_up(cmd_info);
00216 }
00217
00218 val = ipmi_sensor_get_hysteresis_support(sensor);
00219 ipmi_cmdlang_out(cmd_info, "Hysteresis Support",
00220 ipmi_get_hysteresis_support_string(val));
00221
00222 #if 0
00223
00224 int ipmi_sensor_get_accuracy(ipmi_sensor_t *sensor, int val,
00225 double *accuracy);
00226 #endif
00227
00228 rv = ipmi_sensor_get_nominal_reading(sensor, &dval);
00229 if (!rv)
00230 ipmi_cmdlang_out_double(cmd_info, "Nominal Reading", dval);
00231 rv = ipmi_sensor_get_normal_max(sensor, &dval);
00232 if (!rv)
00233 ipmi_cmdlang_out_double(cmd_info, "Normal Max", dval);
00234 rv = ipmi_sensor_get_normal_min(sensor, &dval);
00235 if (!rv)
00236 ipmi_cmdlang_out_double(cmd_info, "Normal Min", dval);
00237 rv = ipmi_sensor_get_sensor_max(sensor, &dval);
00238 if (!rv)
00239 ipmi_cmdlang_out_double(cmd_info, "Sensor Max", dval);
00240 rv = ipmi_sensor_get_sensor_min(sensor, &dval);
00241 if (!rv)
00242 ipmi_cmdlang_out_double(cmd_info, "Sensor Min", dval);
00243
00244 ipmi_cmdlang_out_int(cmd_info, "Base Unit",
00245 ipmi_sensor_get_base_unit(sensor));
00246 ipmi_cmdlang_out(cmd_info, "Base Unit Name",
00247 ipmi_sensor_get_base_unit_string(sensor));
00248 cstr = ipmi_sensor_get_rate_unit_string(sensor);
00249 if (strlen(cstr)) {
00250 ipmi_cmdlang_out_int(cmd_info, "Rate Unit",
00251 ipmi_sensor_get_rate_unit(sensor));
00252 ipmi_cmdlang_out(cmd_info, "Rate Unit Name", cstr);
00253 }
00254 switch (ipmi_sensor_get_modifier_unit_use(sensor)) {
00255 case IPMI_MODIFIER_UNIT_BASE_DIV_MOD:
00256 ipmi_cmdlang_out(cmd_info, "Modifier Use", "/");
00257 ipmi_cmdlang_out_int(cmd_info, "Modifier Unit",
00258 ipmi_sensor_get_modifier_unit(sensor));
00259 ipmi_cmdlang_out(cmd_info, "Modifier Unit Name",
00260 ipmi_sensor_get_modifier_unit_string(sensor));
00261 break;
00262
00263 case IPMI_MODIFIER_UNIT_BASE_MULT_MOD:
00264 ipmi_cmdlang_out(cmd_info, "Modifier Use", "*");
00265 ipmi_cmdlang_out_int(cmd_info, "Modifier Unit",
00266 ipmi_sensor_get_modifier_unit(sensor));
00267 ipmi_cmdlang_out(cmd_info, "Modifier Unit Name",
00268 ipmi_sensor_get_modifier_unit_string(sensor));
00269 break;
00270
00271 default:
00272 break;
00273 }
00274 if (ipmi_sensor_get_percentage(sensor))
00275 ipmi_cmdlang_out(cmd_info, "Percentage", "%");
00276 } else {
00277 int event;
00278 enum ipmi_event_dir_e dir;
00279
00280 for (event=0; event<15; event++) {
00281 rv = ipmi_sensor_discrete_event_readable(sensor, event, &val);
00282 if (rv || !val)
00283 continue;
00284 ipmi_cmdlang_out(cmd_info, "Event", NULL);
00285 ipmi_cmdlang_down(cmd_info);
00286 ipmi_cmdlang_out_int(cmd_info, "Offset", event);
00287 cstr = ipmi_sensor_reading_name_string(sensor, event);
00288 if (strcmp(cstr, "unknown") != 0)
00289 ipmi_cmdlang_out(cmd_info, "Name", cstr);
00290
00291 for (dir = IPMI_ASSERTION;
00292 dir <= IPMI_DEASSERTION;
00293 dir++)
00294 {
00295 rv = ipmi_sensor_discrete_event_supported(sensor,
00296 event,
00297 dir,
00298 &val);
00299 if (rv || !val) continue;
00300
00301 ipmi_cmdlang_out(cmd_info, "Supports",
00302 ipmi_get_event_dir_string(dir));
00303 }
00304 ipmi_cmdlang_up(cmd_info);
00305 }
00306 }
00307 return;
00308
00309 out_err:
00310 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00311 cmdlang->objstr_len);
00312 cmdlang->location = "cmd_sensor.c(sensor_dump)";
00313 }
00314
00315 static void
00316 sensor_info(ipmi_sensor_t *sensor, void *cb_data)
00317 {
00318 ipmi_cmd_info_t *cmd_info = cb_data;
00319 char sensor_name[IPMI_SENSOR_NAME_LEN];
00320
00321 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00322
00323 ipmi_cmdlang_out(cmd_info, "Sensor", NULL);
00324 ipmi_cmdlang_down(cmd_info);
00325 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00326 sensor_dump(sensor, cmd_info);
00327 ipmi_cmdlang_up(cmd_info);
00328 }
00329
00330 static void
00331 read_sensor(ipmi_sensor_t *sensor,
00332 int err,
00333 enum ipmi_value_present_e value_present,
00334 unsigned int raw_val,
00335 double val,
00336 ipmi_states_t *states,
00337 void *cb_data)
00338 {
00339 ipmi_cmd_info_t *cmd_info = cb_data;
00340 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00341 enum ipmi_thresh_e thresh;
00342 char sensor_name[IPMI_SENSOR_NAME_LEN];
00343 int rv;
00344
00345 ipmi_cmdlang_lock(cmd_info);
00346 if (err) {
00347 cmdlang->errstr = "Error reading sensor";
00348 cmdlang->err = err;
00349 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00350 cmdlang->objstr_len);
00351 cmdlang->location = "cmd_sensor.c(read_sensor)";
00352 goto out;
00353 }
00354
00355 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00356
00357 ipmi_cmdlang_out(cmd_info, "Sensor", NULL);
00358 ipmi_cmdlang_down(cmd_info);
00359 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00360
00361 ipmi_cmdlang_out_bool(cmd_info, "Event Messages Enabled",
00362 ipmi_is_event_messages_enabled(states));
00363 ipmi_cmdlang_out_bool(cmd_info, "Sensor Scanning Enabled",
00364 ipmi_is_sensor_scanning_enabled(states));
00365 ipmi_cmdlang_out_bool(cmd_info, "Initial Update In Progress",
00366 ipmi_is_initial_update_in_progress(states));
00367
00368 switch (value_present) {
00369 case IPMI_BOTH_VALUES_PRESENT:
00370 ipmi_cmdlang_out_double(cmd_info, "Value", val);
00371
00372 case IPMI_RAW_VALUE_PRESENT:
00373 ipmi_cmdlang_out_hex(cmd_info, "Raw Value", raw_val);
00374 default:
00375 break;
00376 }
00377
00378 for (thresh = IPMI_LOWER_NON_CRITICAL;
00379 thresh <= IPMI_UPPER_NON_RECOVERABLE;
00380 thresh++)
00381 {
00382 int ival;
00383
00384 rv = ipmi_sensor_threshold_reading_supported(sensor, thresh, &ival);
00385 if ((rv) || !ival)
00386 continue;
00387
00388 ipmi_cmdlang_out(cmd_info, "Threshold", NULL);
00389 ipmi_cmdlang_down(cmd_info);
00390 ipmi_cmdlang_out(cmd_info, "Name",
00391 ipmi_get_threshold_string(thresh));
00392 ipmi_cmdlang_out_bool(cmd_info, "Out Of Range",
00393 ipmi_is_threshold_out_of_range(states, thresh));
00394 ipmi_cmdlang_up(cmd_info);
00395 }
00396 ipmi_cmdlang_up(cmd_info);
00397
00398 out:
00399 ipmi_cmdlang_unlock(cmd_info);
00400 ipmi_cmdlang_cmd_info_put(cmd_info);
00401 }
00402
00403 static void
00404 read_sensor_states(ipmi_sensor_t *sensor,
00405 int err,
00406 ipmi_states_t *states,
00407 void *cb_data)
00408 {
00409 ipmi_cmd_info_t *cmd_info = cb_data;
00410 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00411 int i;
00412 char sensor_name[IPMI_SENSOR_NAME_LEN];
00413 int rv;
00414
00415 ipmi_cmdlang_lock(cmd_info);
00416 if (err) {
00417 cmdlang->errstr = "Error reading sensor";
00418 cmdlang->err = err;
00419 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00420 cmdlang->objstr_len);
00421 cmdlang->location = "cmd_sensor.c(read_sensor_states)";
00422 goto out;
00423 }
00424
00425 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00426
00427 ipmi_cmdlang_out(cmd_info, "Sensor", NULL);
00428 ipmi_cmdlang_down(cmd_info);
00429 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00430
00431 ipmi_cmdlang_out_bool(cmd_info, "Event Messages Enabled",
00432 ipmi_is_event_messages_enabled(states));
00433 ipmi_cmdlang_out_bool(cmd_info, "Sensor Scanning Enabled",
00434 ipmi_is_sensor_scanning_enabled(states));
00435 ipmi_cmdlang_out_bool(cmd_info, "Initial Update In Progress",
00436 ipmi_is_initial_update_in_progress(states));
00437 for (i=0; i<15; i++) {
00438 int ival;
00439 const char *str;
00440
00441 rv = ipmi_sensor_discrete_event_readable(sensor, i, &ival);
00442 if ((rv) || !ival)
00443 continue;
00444
00445 ipmi_cmdlang_out(cmd_info, "Event", NULL);
00446 ipmi_cmdlang_down(cmd_info);
00447 ipmi_cmdlang_out_int(cmd_info, "Offset", i);
00448 str = ipmi_sensor_reading_name_string(sensor, i);
00449 if (strcmp(str, "unknown") != 0)
00450 ipmi_cmdlang_out(cmd_info, "Name", str);
00451 ipmi_cmdlang_out_bool(cmd_info, "Set", ipmi_is_state_set(states, i));
00452 ipmi_cmdlang_up(cmd_info);
00453 }
00454 ipmi_cmdlang_up(cmd_info);
00455
00456 out:
00457 ipmi_cmdlang_unlock(cmd_info);
00458 ipmi_cmdlang_cmd_info_put(cmd_info);
00459 }
00460
00461 static void
00462 sensor_get(ipmi_sensor_t *sensor, void *cb_data)
00463 {
00464 ipmi_cmd_info_t *cmd_info = cb_data;
00465 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00466 int rv;
00467
00468 ipmi_cmdlang_cmd_info_get(cmd_info);
00469 if (ipmi_sensor_get_event_reading_type(sensor)
00470 == IPMI_EVENT_READING_TYPE_THRESHOLD)
00471 {
00472 rv = ipmi_sensor_get_reading(sensor, read_sensor, cmd_info);
00473 } else {
00474 rv = ipmi_sensor_get_states(sensor, read_sensor_states, cmd_info);
00475 }
00476 if (rv) {
00477 ipmi_cmdlang_cmd_info_put(cmd_info);
00478 cmdlang->err = rv;
00479 cmdlang->errstr = "Error reading sensor";
00480 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00481 cmdlang->objstr_len);
00482 cmdlang->location = "cmd_sensor.c(sensor_get)";
00483 }
00484 }
00485
00486 static void
00487 sensor_rearm_done(ipmi_sensor_t *sensor,
00488 int err,
00489 void *cb_data)
00490 {
00491 ipmi_cmd_info_t *cmd_info = cb_data;
00492 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00493 char sensor_name[IPMI_SENSOR_NAME_LEN];
00494
00495 ipmi_cmdlang_lock(cmd_info);
00496 if (err) {
00497 cmdlang->errstr = "Error rearming sensor";
00498 cmdlang->err = err;
00499 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00500 cmdlang->objstr_len);
00501 cmdlang->location = "cmd_sensor.c(sensor_rearm_done)";
00502 goto out;
00503 }
00504
00505 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00506 ipmi_cmdlang_out(cmd_info, "Rearm done", sensor_name);
00507
00508 out:
00509 ipmi_cmdlang_unlock(cmd_info);
00510 ipmi_cmdlang_cmd_info_put(cmd_info);
00511 }
00512
00513 static void
00514 sensor_rearm(ipmi_sensor_t *sensor, void *cb_data)
00515 {
00516 ipmi_cmd_info_t *cmd_info = cb_data;
00517 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00518 int rv;
00519 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00520 int argc = ipmi_cmdlang_get_argc(cmd_info);
00521 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00522 int global;
00523 ipmi_event_state_t *s = NULL;
00524
00525 if ((argc - curr_arg) < 1) {
00526 cmdlang->errstr = "Not enough parameters";
00527 cmdlang->err = EINVAL;
00528 goto out_err;
00529 }
00530
00531 if (strcmp(argv[curr_arg], "global") == 0) {
00532 global = 1;
00533 } else {
00534 global = 0;
00535 s = ipmi_mem_alloc(ipmi_event_state_size());
00536 if (!s) {
00537 cmdlang->errstr = "Out of memory";
00538 cmdlang->err = ENOMEM;
00539 goto out_err;
00540 }
00541 ipmi_event_state_init(s);
00542
00543 if (ipmi_sensor_get_event_reading_type(sensor)
00544 == IPMI_EVENT_READING_TYPE_THRESHOLD)
00545 {
00546 enum ipmi_thresh_e thresh;
00547 enum ipmi_event_value_dir_e value_dir;
00548 enum ipmi_event_dir_e dir;
00549
00550 while (curr_arg < argc) {
00551 ipmi_cmdlang_get_threshold_ev(argv[curr_arg], &thresh,
00552 &value_dir, &dir, cmd_info);
00553 if (cmdlang->err) {
00554 goto out_err;
00555 }
00556 ipmi_threshold_event_set(s, thresh, value_dir, dir);
00557 curr_arg++;
00558 }
00559 } else {
00560 int offset;
00561 enum ipmi_event_dir_e dir;
00562
00563 while (curr_arg < argc) {
00564 ipmi_cmdlang_get_discrete_ev(argv[curr_arg], &offset,
00565 &dir, cmd_info);
00566 if (cmdlang->err) {
00567 goto out_err;
00568 }
00569 ipmi_discrete_event_set(s, offset, dir);
00570 curr_arg++;
00571 }
00572 }
00573 }
00574
00575 ipmi_cmdlang_cmd_info_get(cmd_info);
00576 rv = ipmi_sensor_rearm(sensor, global, s, sensor_rearm_done, cmd_info);
00577 if (rv) {
00578 ipmi_cmdlang_cmd_info_put(cmd_info);
00579 cmdlang->err = rv;
00580 cmdlang->errstr = "Error rearming sensor";
00581 goto out_err;
00582 }
00583
00584 if (s)
00585 ipmi_mem_free(s);
00586 return;
00587
00588 out_err:
00589 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00590 cmdlang->objstr_len);
00591 cmdlang->location = "cmd_sensor.c(sensor_rearm)";
00592 if (s)
00593 ipmi_mem_free(s);
00594 }
00595
00596 static void
00597 sensor_get_thresholds_done(ipmi_sensor_t *sensor,
00598 int err,
00599 ipmi_thresholds_t *th,
00600 void *cb_data)
00601 {
00602 ipmi_cmd_info_t *cmd_info = cb_data;
00603 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00604 char sensor_name[IPMI_SENSOR_NAME_LEN];
00605 enum ipmi_thresh_e thresh;
00606 int rv;
00607
00608 ipmi_cmdlang_lock(cmd_info);
00609 if (err) {
00610 cmdlang->errstr = "Error reading sensor thresholds";
00611 cmdlang->err = err;
00612 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00613 cmdlang->objstr_len);
00614 cmdlang->location = "cmd_sensor.c(sensor_get_thresholds_done)";
00615 goto out;
00616 }
00617
00618 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00619 ipmi_cmdlang_out(cmd_info, "Sensor", NULL);
00620 ipmi_cmdlang_down(cmd_info);
00621 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00622
00623 for (thresh = IPMI_LOWER_NON_CRITICAL;
00624 thresh <= IPMI_UPPER_NON_RECOVERABLE;
00625 thresh++)
00626 {
00627 int ival;
00628 double dval;
00629
00630 rv = ipmi_sensor_threshold_reading_supported(sensor, thresh, &ival);
00631 if ((rv) || !ival)
00632 continue;
00633
00634 ipmi_cmdlang_out(cmd_info, "Threshold", NULL);
00635 ipmi_cmdlang_down(cmd_info);
00636 ipmi_cmdlang_out(cmd_info, "Name",
00637 ipmi_get_threshold_string(thresh));
00638 rv = ipmi_threshold_get(th, thresh, &dval);
00639 if (rv)
00640 continue;
00641 ipmi_cmdlang_out_double(cmd_info, "Value", dval);
00642 ipmi_cmdlang_up(cmd_info);
00643 }
00644 ipmi_cmdlang_up(cmd_info);
00645
00646 out:
00647 ipmi_cmdlang_unlock(cmd_info);
00648 ipmi_cmdlang_cmd_info_put(cmd_info);
00649 }
00650
00651 static void
00652 sensor_get_thresholds(ipmi_sensor_t *sensor, void *cb_data)
00653 {
00654 ipmi_cmd_info_t *cmd_info = cb_data;
00655 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00656 int rv;
00657
00658 ipmi_cmdlang_cmd_info_get(cmd_info);
00659 rv = ipmi_sensor_get_thresholds(sensor, sensor_get_thresholds_done,
00660 cmd_info);
00661 if (rv) {
00662 ipmi_cmdlang_cmd_info_put(cmd_info);
00663 cmdlang->err = rv;
00664 cmdlang->errstr = "Error getting thresholds";
00665 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00666 cmdlang->objstr_len);
00667 cmdlang->location = "cmd_sensor.c(sensor_get_thresholds)";
00668 }
00669 }
00670
00671 static void
00672 sensor_set_thresholds_done(ipmi_sensor_t *sensor,
00673 int err,
00674 void *cb_data)
00675 {
00676 ipmi_cmd_info_t *cmd_info = cb_data;
00677 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00678 char sensor_name[IPMI_SENSOR_NAME_LEN];
00679
00680 ipmi_cmdlang_lock(cmd_info);
00681 if (err) {
00682 cmdlang->errstr = "Error setting sensor thresholds";
00683 cmdlang->err = err;
00684 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00685 cmdlang->objstr_len);
00686 cmdlang->location = "cmd_sensor.c(sensor_set_thresholds_done)";
00687 goto out;
00688 }
00689
00690 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00691 ipmi_cmdlang_out(cmd_info, "Thresholds set", sensor_name);
00692
00693 out:
00694 ipmi_cmdlang_unlock(cmd_info);
00695 ipmi_cmdlang_cmd_info_put(cmd_info);
00696 }
00697
00698 static void
00699 sensor_set_thresholds(ipmi_sensor_t *sensor, void *cb_data)
00700 {
00701 ipmi_cmd_info_t *cmd_info = cb_data;
00702 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00703 int rv;
00704 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00705 int argc = ipmi_cmdlang_get_argc(cmd_info);
00706 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00707 ipmi_thresholds_t *th = NULL;
00708 enum ipmi_thresh_e thresh;
00709 double val;
00710
00711 if ((argc - curr_arg) < 1) {
00712
00713 cmdlang->errstr = "Not enough parameters";
00714 cmdlang->err = EINVAL;
00715 goto out_err;
00716 }
00717
00718 th = ipmi_mem_alloc(ipmi_thresholds_size());
00719 if (!th) {
00720 cmdlang->errstr = "Out of memory";
00721 cmdlang->err = ENOMEM;
00722 goto out_err;
00723 }
00724 ipmi_thresholds_init(th);
00725 while (curr_arg < argc) {
00726 ipmi_cmdlang_get_threshold(argv[curr_arg], &thresh, cmd_info);
00727 if (cmdlang->err) {
00728 cmdlang->errstr = "Invalid threshold";
00729 goto out_err;
00730 }
00731 curr_arg++;
00732
00733 ipmi_cmdlang_get_double(argv[curr_arg], &val, cmd_info);
00734 if (cmdlang->err) {
00735 cmdlang->errstr = "Invalid threshold value";
00736 goto out_err;
00737 }
00738 curr_arg++;
00739
00740 rv = ipmi_threshold_set(th, sensor, thresh, val);
00741 if (rv) {
00742 cmdlang->errstr = "Error setting value";
00743 cmdlang->err = rv;
00744 goto out_err;
00745 }
00746 }
00747
00748 ipmi_cmdlang_cmd_info_get(cmd_info);
00749 rv = ipmi_sensor_set_thresholds(sensor, th, sensor_set_thresholds_done,
00750 cmd_info);
00751 if (rv) {
00752 ipmi_cmdlang_cmd_info_put(cmd_info);
00753 cmdlang->err = rv;
00754 cmdlang->errstr = "Error setting thresholds";
00755 goto out_err;
00756 }
00757 ipmi_mem_free(th);
00758 return;
00759
00760 out_err:
00761 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00762 cmdlang->objstr_len);
00763 cmdlang->location = "cmd_sensor.c(sensor_set_thresholds)";
00764 if (th)
00765 ipmi_mem_free(th);
00766 }
00767
00768 static void
00769 sensor_get_hysteresis_done(ipmi_sensor_t *sensor,
00770 int err,
00771 unsigned int positive_hysteresis,
00772 unsigned int negative_hysteresis,
00773 void *cb_data)
00774 {
00775 ipmi_cmd_info_t *cmd_info = cb_data;
00776 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00777 char sensor_name[IPMI_SENSOR_NAME_LEN];
00778
00779 ipmi_cmdlang_lock(cmd_info);
00780 if (err) {
00781 cmdlang->errstr = "Error reading sensor hysteresis";
00782 cmdlang->err = err;
00783 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00784 cmdlang->objstr_len);
00785 cmdlang->location = "cmd_sensor.c(sensor_get_hysteresis_done)";
00786 goto out;
00787 }
00788
00789 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00790 ipmi_cmdlang_out(cmd_info, "Sensor", NULL);
00791 ipmi_cmdlang_down(cmd_info);
00792 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00793
00794 ipmi_cmdlang_out_int(cmd_info, "Positive Hysteresis",
00795 positive_hysteresis);
00796 ipmi_cmdlang_out_int(cmd_info, "Negative Hysteresis",
00797 negative_hysteresis);
00798
00799 ipmi_cmdlang_up(cmd_info);
00800
00801
00802 out:
00803 ipmi_cmdlang_unlock(cmd_info);
00804 ipmi_cmdlang_cmd_info_put(cmd_info);
00805 }
00806
00807 static void
00808 sensor_get_hysteresis(ipmi_sensor_t *sensor, void *cb_data)
00809 {
00810 ipmi_cmd_info_t *cmd_info = cb_data;
00811 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00812 int rv;
00813
00814 ipmi_cmdlang_cmd_info_get(cmd_info);
00815 rv = ipmi_sensor_get_hysteresis(sensor, sensor_get_hysteresis_done,
00816 cmd_info);
00817 if (rv) {
00818 ipmi_cmdlang_cmd_info_put(cmd_info);
00819 cmdlang->err = rv;
00820 cmdlang->errstr = "Error getting hysteresis";
00821 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00822 cmdlang->objstr_len);
00823 cmdlang->location = "cmd_sensor.c(sensor_get_hysteresis)";
00824 }
00825 }
00826
00827 static void
00828 sensor_set_hysteresis_done(ipmi_sensor_t *sensor,
00829 int err,
00830 void *cb_data)
00831 {
00832 ipmi_cmd_info_t *cmd_info = cb_data;
00833 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00834 char sensor_name[IPMI_SENSOR_NAME_LEN];
00835
00836 ipmi_cmdlang_lock(cmd_info);
00837 if (err) {
00838 cmdlang->errstr = "Error setting sensor hysteresis";
00839 cmdlang->err = err;
00840 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00841 cmdlang->objstr_len);
00842 cmdlang->location = "cmd_sensor.c(sensor_set_hysteresis_done)";
00843 goto out;
00844 }
00845
00846 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00847 ipmi_cmdlang_out(cmd_info, "Hysteresis set", sensor_name);
00848
00849 out:
00850 ipmi_cmdlang_unlock(cmd_info);
00851 ipmi_cmdlang_cmd_info_put(cmd_info);
00852 }
00853
00854 static void
00855 sensor_set_hysteresis(ipmi_sensor_t *sensor, void *cb_data)
00856 {
00857 ipmi_cmd_info_t *cmd_info = cb_data;
00858 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00859 int rv;
00860 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00861 int argc = ipmi_cmdlang_get_argc(cmd_info);
00862 char **argv = ipmi_cmdlang_get_argv(cmd_info);
00863 int pos, neg;
00864
00865 if ((argc - curr_arg) < 2) {
00866
00867 cmdlang->errstr = "Not enough parameters";
00868 cmdlang->err = EINVAL;
00869 goto out_err;
00870 }
00871
00872 ipmi_cmdlang_get_int(argv[curr_arg], &pos, cmd_info);
00873 if (cmdlang->err) {
00874 cmdlang->errstr = "Invalid positive hysteresis";
00875 goto out_err;
00876 }
00877 curr_arg++;
00878
00879 ipmi_cmdlang_get_int(argv[curr_arg], &neg, cmd_info);
00880 if (cmdlang->err) {
00881 cmdlang->errstr = "Invalid negative hysteresis";
00882 goto out_err;
00883 }
00884 curr_arg++;
00885
00886 ipmi_cmdlang_cmd_info_get(cmd_info);
00887 rv = ipmi_sensor_set_hysteresis(sensor, pos, neg,
00888 sensor_set_hysteresis_done, cmd_info);
00889 if (rv) {
00890 ipmi_cmdlang_cmd_info_put(cmd_info);
00891 cmdlang->err = rv;
00892 cmdlang->errstr = "Error setting hysteresis";
00893 goto out_err;
00894 }
00895
00896 out_err:
00897 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00898 cmdlang->objstr_len);
00899 cmdlang->location = "cmd_sensor.c(sensor_set_hysteresis)";
00900 }
00901
00902 static void
00903 sensor_get_event_enables_done(ipmi_sensor_t *sensor,
00904 int err,
00905 ipmi_event_state_t *states,
00906 void *cb_data)
00907 {
00908 ipmi_cmd_info_t *cmd_info = cb_data;
00909 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00910 char sensor_name[IPMI_SENSOR_NAME_LEN];
00911 int rv;
00912 int val;
00913
00914 ipmi_cmdlang_lock(cmd_info);
00915 if (err) {
00916 cmdlang->errstr = "Error reading sensor event enables";
00917 cmdlang->err = err;
00918 ipmi_sensor_get_name(sensor, cmdlang->objstr,
00919 cmdlang->objstr_len);
00920 cmdlang->location = "cmd_sensor.c(sensor_get_event_enables_done)";
00921 goto out;
00922 }
00923
00924 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
00925 ipmi_cmdlang_out(cmd_info, "Sensor", NULL);
00926 ipmi_cmdlang_down(cmd_info);
00927 ipmi_cmdlang_out(cmd_info, "Name", sensor_name);
00928
00929 ipmi_cmdlang_out_bool(cmd_info, "Event Messages Enabled",
00930 ipmi_event_state_get_events_enabled(states));
00931 ipmi_cmdlang_out_bool(cmd_info, "Sensor Scanning Enabled",
00932 ipmi_event_state_get_scanning_enabled(states));
00933 ipmi_cmdlang_out_bool(cmd_info, "Busy",
00934 ipmi_event_state_get_busy(states));
00935
00936 if (ipmi_sensor_get_event_reading_type(sensor)
00937 == IPMI_EVENT_READING_TYPE_THRESHOLD)
00938 {
00939 enum ipmi_thresh_e thresh;
00940 enum ipmi_event_value_dir_e value_dir;
00941 enum ipmi_event_dir_e dir;
00942
00943 for (thresh = IPMI_LOWER_NON_CRITICAL;
00944 thresh <= IPMI_UPPER_NON_RECOVERABLE;
00945 thresh++)
00946 {
00947 for (value_dir = IPMI_GOING_LOW;
00948 value_dir <= IPMI_GOING_HIGH;
00949 value_dir++)
00950 {
00951 for (dir = IPMI_ASSERTION;
00952 dir <= IPMI_DEASSERTION;
00953 dir++)
00954 {
00955 char th_name[50];
00956
00957 rv = ipmi_sensor_threshold_event_supported(sensor,
00958 thresh,
00959 value_dir,
00960 dir,
00961 &val);
00962 if (rv || !val) continue;
00963
00964 ipmi_cmdlang_out(cmd_info, "Threshold", NULL);
00965 ipmi_cmdlang_down(cmd_info);
00966 snprintf(th_name, sizeof(th_name), "%s %s %s",
00967 ipmi_get_threshold_string(thresh),
00968 ipmi_get_value_dir_string(value_dir),
00969 ipmi_get_event_dir_string(dir));
00970 ipmi_cmdlang_out(cmd_info, "Name", th_name);
00971 ipmi_cmdlang_out_bool(cmd_info, "Enabled",
00972 ipmi_is_threshold_event_set
00973 (states, thresh, value_dir, dir));
00974 ipmi_cmdlang_up(cmd_info);
00975 }
00976 }
00977 }
00978 } else {
00979 int offset;
00980 const char *str;
00981
00982 for (offset=0; offset<15; offset++) {
00983 rv = ipmi_sensor_discrete_event_readable(sensor, offset, &val);
00984 if (rv || !val)
00985 continue;
00986 ipmi_cmdlang_out(cmd_info, "Event", NULL);
00987 ipmi_cmdlang_down(cmd_info);
00988 ipmi_cmdlang_out_int(cmd_info, "Offset", offset);
00989 str = ipmi_sensor_reading_name_string(sensor, offset);
00990 if (strcmp(str, "unknown") != 0)
00991 ipmi_cmdlang_out(cmd_info, "Name", str);
00992
00993 rv = ipmi_sensor_discrete_event_supported(sensor,
00994 offset,
00995 IPMI_ASSERTION,
00996 &val);
00997 if (!rv && val) {
00998 ipmi_cmdlang_out_bool(cmd_info, "Assertion Enabled",
00999 ipmi_is_discrete_event_set
01000 (states, offset, IPMI_ASSERTION));
01001 }
01002 rv = ipmi_sensor_discrete_event_supported(sensor,
01003 offset,
01004 IPMI_DEASSERTION,
01005 &val);
01006 if (!rv && val) {
01007 ipmi_cmdlang_out_bool(cmd_info, "Deassertion Enabled",
01008 ipmi_is_discrete_event_set
01009 (states, offset, IPMI_DEASSERTION));
01010 }
01011 ipmi_cmdlang_up(cmd_info);
01012 }
01013 }
01014
01015 ipmi_cmdlang_up(cmd_info);
01016
01017
01018 out:
01019 ipmi_cmdlang_unlock(cmd_info);
01020 ipmi_cmdlang_cmd_info_put(cmd_info);
01021 }
01022
01023 static void
01024 sensor_get_event_enables(ipmi_sensor_t *sensor, void *cb_data)
01025 {
01026 ipmi_cmd_info_t *cmd_info = cb_data;
01027 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
01028 int rv;
01029
01030 ipmi_cmdlang_cmd_info_get(cmd_info);
01031 rv = ipmi_sensor_get_event_enables(sensor, sensor_get_event_enables_done,
01032 cmd_info);
01033 if (rv) {
01034 ipmi_cmdlang_cmd_info_put(cmd_info);
01035 cmdlang->err = rv;
01036 cmdlang->errstr = "Error getting event enables";
01037 ipmi_sensor_get_name(sensor, cmdlang->objstr,
01038 cmdlang->objstr_len);
01039 cmdlang->location = "cmd_sensor.c(sensor_get_event_enables)";
01040 }
01041 }
01042
01043 static void
01044 sensor_set_event_enables_done(ipmi_sensor_t *sensor,
01045 int err,
01046 void *cb_data)
01047 {
01048 ipmi_cmd_info_t *cmd_info = cb_data;
01049 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
01050 char sensor_name[IPMI_SENSOR_NAME_LEN];
01051
01052 ipmi_cmdlang_lock(cmd_info);
01053 if (err) {
01054 cmdlang->errstr = "Error setting event enables";
01055 cmdlang->err = err;
01056 ipmi_sensor_get_name(sensor, cmdlang->objstr,
01057 cmdlang->objstr_len);
01058 cmdlang->location = "cmd_sensor.c(sensor_set_event_enables_done)";
01059 goto out;
01060 }
01061
01062 ipmi_sensor_get_name(sensor, sensor_name, sizeof(sensor_name));
01063 ipmi_cmdlang_out(cmd_info, "Event enables set", sensor_name);
01064
01065 out:
01066 ipmi_cmdlang_unlock(cmd_info);
01067 ipmi_cmdlang_cmd_info_put(cmd_info);
01068 }
01069
01070 enum ev_en_kind { ev_en_set, ev_en_enable, ev_en_disable };
01071
01072 static void
01073 mod_event_enables(ipmi_sensor_t *sensor, void *cb_data, enum ev_en_kind kind)
01074 {
01075 ipmi_cmd_info_t *cmd_info = cb_data;
01076 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
01077 int rv;
01078 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
01079 int argc = ipmi_cmdlang_get_argc(cmd_info);
01080 char **argv = ipmi_cmdlang_get_argv(cmd_info);
01081 ipmi_event_state_t *s = NULL;
01082
01083 if ((argc - curr_arg) < 2) {
01084
01085 cmdlang->errstr = "Not enough parameters";
01086 cmdlang->err = EINVAL;
01087 goto out_err;
01088 }
01089
01090 s = ipmi_mem_alloc(ipmi_states_size());
01091 if (!s) {
01092 cmdlang->errstr = "Out of memory";
01093 cmdlang->err = ENOMEM;
01094 goto out_err;
01095 }
01096 ipmi_event_state_init(s);
01097
01098 if (strcmp(argv[curr_arg], "msg") == 0)
01099 ipmi_event_state_set_events_enabled(s, 1);
01100 else if (strcmp(argv[curr_arg], "nomsg") == 0)
01101 ipmi_event_state_set_events_enabled(s, 0);
01102 else {
01103 cmdlang->errstr = "Invalid message enable setting";
01104 cmdlang->err = EINVAL;
01105 goto out_err;
01106 }
01107 curr_arg++;
01108
01109 if (strcmp(argv[curr_arg], "scan") == 0)
01110 ipmi_event_state_set_scanning_enabled(s, 1);
01111 else if (strcmp(argv[curr_arg], "noscan") == 0)
01112 ipmi_event_state_set_scanning_enabled(s, 0);
01113 else {
01114 cmdlang->errstr = "Invalid scanning enable setting";
01115 cmdlang->err = EINVAL;
01116 goto out_err;
01117 }
01118 curr_arg++;
01119
01120 if (ipmi_sensor_get_event_reading_type(sensor)
01121 == IPMI_EVENT_READING_TYPE_THRESHOLD)
01122 {
01123 while (curr_arg < argc) {
01124 enum ipmi_thresh_e thresh;
01125 enum ipmi_event_value_dir_e value_dir;
01126 enum ipmi_event_dir_e dir;
01127
01128 ipmi_cmdlang_get_threshold_ev(argv[curr_arg], &thresh,
01129 &value_dir, &dir, cmd_info);
01130 if (cmdlang->err) {
01131 goto out_err;
01132 }
01133 ipmi_threshold_event_set(s, thresh, value_dir, dir);
01134 curr_arg++;
01135 }
01136 } else {
01137 while (curr_arg < argc) {
01138 int offset;
01139 enum ipmi_event_dir_e dir;
01140
01141 ipmi_cmdlang_get_discrete_ev(argv[curr_arg], &offset,
01142 &dir, cmd_info);
01143 if (cmdlang->err) {
01144 goto out_err;
01145 }
01146 ipmi_discrete_event_set(s, offset, dir);
01147 curr_arg++;
01148 }
01149 }
01150
01151 ipmi_cmdlang_cmd_info_get(cmd_info);
01152 switch (kind) {
01153 case ev_en_set:
01154 rv = ipmi_sensor_set_event_enables(sensor, s,
01155 sensor_set_event_enables_done,
01156 cmd_info);
01157 break;
01158 case ev_en_enable:
01159 rv = ipmi_sensor_enable_events(sensor, s,
01160 sensor_set_event_enables_done,
01161 cmd_info);
01162 break;
01163 case ev_en_disable:
01164 rv = ipmi_sensor_disable_events(sensor, s,
01165 sensor_set_event_enables_done,