Main Page | Class List | Directories | File List | Class Members | File Members

cmd_sensor.c

Go to the documentation of this file.
00001 /*
00002  * cmd_sensor.c
00003  *
00004  * A command interpreter for OpenIPMI
00005  *
00006  * Author: MontaVista Software, Inc.
00007  *         Corey Minyard <minyard@mvista.com>
00008  *         source@mvista.com
00009  *
00010  * Copyright 2004 MontaVista Software Inc.
00011  *
00012  *  This program is free software; you can redistribute it and/or
00013  *  modify it under the terms of the GNU Lesser General Public License
00014  *  as published by the Free Software Foundation; either version 2 of
00015  *  the License, or (at your option) any later version.
00016  *
00017  *
00018  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
00019  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00020  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
00021  *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
00022  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00023  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
00024  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00025  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
00026  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
00027  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00028  *
00029  *  You should have received a copy of the GNU Lesser General Public
00030  *  License along with this program; if not, write to the Free
00031  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
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 /* Internal includes, do not use in your programs */
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         /* FIXME - no accuracy handling */
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         /* FALLTHRU */
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         /* Not enough parameters */
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         /* Not enough parameters */
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         /* Not enough parameters */
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,