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

cmd_domain.c

Go to the documentation of this file.
00001 /*
00002  * cmd_domain.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_mc.h>
00041 #include <OpenIPMI/ipmi_err.h>
00042 #include <OpenIPMI/ipmi_cmdlang.h>
00043 #include <OpenIPMI/ipmi_fru.h>
00044 #include <OpenIPMI/ipmi_conn.h>
00045 
00046 /* Internal includes, do not use in your programs */
00047 #include <OpenIPMI/internal/ipmi_malloc.h>
00048 
00049 /* Don't pollute the namespace iwth ipmi_fru_t. */
00050 void ipmi_cmdlang_dump_fru_info(ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru);
00051 
00052 static void
00053 domain_list_handler(ipmi_domain_t *domain, void *cb_data)
00054 {
00055     ipmi_cmd_info_t *cmd_info = cb_data;
00056     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00057     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00058 
00059     if (cmdlang->err)
00060         return;
00061 
00062     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00063 
00064     ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00065 }
00066 
00067 static void
00068 domain_list(ipmi_cmd_info_t *cmd_info)
00069 {
00070     ipmi_cmdlang_out(cmd_info, "Domains", NULL);
00071     ipmi_cmdlang_down(cmd_info);
00072     ipmi_domain_iterate_domains(domain_list_handler, cmd_info);
00073     ipmi_cmdlang_up(cmd_info);
00074 }
00075 
00076 static void
00077 domain_info(ipmi_domain_t *domain, void *cb_data)
00078 {
00079     ipmi_cmd_info_t *cmd_info = cb_data;
00080     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00081     unsigned char   guid[16];
00082 
00083     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00084 
00085     ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00086     ipmi_cmdlang_down(cmd_info);
00087     ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00088     if (ipmi_domain_get_guid(domain, guid) == 0)
00089         ipmi_cmdlang_out_binary(cmd_info, "GUID", (char *) guid, 16);
00090     ipmi_cmdlang_out(cmd_info, "Type",
00091                     ipmi_domain_get_type_string(ipmi_domain_get_type(domain)));
00092     ipmi_cmdlang_out_int(cmd_info, "SEL Rescan Time",
00093                          ipmi_domain_get_sel_rescan_time(domain));
00094     ipmi_cmdlang_out_int(cmd_info, "IPMB Rescan Time",
00095                          ipmi_domain_get_ipmb_rescan_time(domain));
00096     ipmi_cmdlang_up(cmd_info);
00097 }
00098 
00099 static void domain_con_change(ipmi_domain_t *domain,
00100                               int           err,
00101                               unsigned int  conn_num,
00102                               unsigned int  port_num,
00103                               int           still_connected,
00104                               void          *cb_data);
00105 void ipmi_cmdlang_entity_change(enum ipmi_update_e op,
00106                                 ipmi_domain_t      *domain,
00107                                 ipmi_entity_t      *entity,
00108                                 void               *cb_data);
00109 void ipmi_cmdlang_mc_change(enum ipmi_update_e op,
00110                             ipmi_domain_t      *domain,
00111                             ipmi_mc_t          *mc,
00112                             void               *cb_data);
00113 
00114 static void
00115 domain_new_done(ipmi_domain_t *domain,
00116                 int           err,
00117                 unsigned int  conn_num,
00118                 unsigned int  port_num,
00119                 int           still_connected,
00120                 void          *cb_data)
00121 {
00122     ipmi_cmd_info_t *cmd_info = cb_data;
00123     int             rv;
00124 
00125 
00126     /* This call will detect and ignore duplicates, no special
00127        handling required. */
00128     ipmi_domain_add_connect_change_handler(domain, domain_con_change, NULL);
00129 
00130     /* Remove ourselves from the connection change list.  This may fail,
00131        but that means it's already been done and we don't care. */
00132     rv = ipmi_domain_remove_connect_change_handler(domain, domain_new_done,
00133                                                    cb_data);
00134 
00135 
00136     /* Handle the rest as a normal event. */
00137     domain_con_change(domain, err, conn_num, port_num, still_connected,
00138                       NULL);
00139 
00140     /* If we get an error removing the connect change handler,
00141        that means this has already been done. */
00142     if ((!rv) && cmd_info) {
00143         char  domain_name[IPMI_DOMAIN_NAME_LEN];
00144 
00145         ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00146         ipmi_cmdlang_lock(cmd_info);
00147         ipmi_cmdlang_out(cmd_info, "Domain Created", domain_name);
00148         ipmi_cmdlang_unlock(cmd_info);
00149         ipmi_cmdlang_cmd_info_put(cmd_info);
00150     }
00151 }
00152 
00153 void
00154 domain_fully_up(ipmi_domain_t *domain, void *cb_data)
00155 {
00156     ipmi_cmd_info_t *cmd_info = cb_data;
00157     char            *errstr = NULL;
00158     int             rv = 0;
00159     ipmi_cmd_info_t *evi;
00160     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00161 
00162     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00163 
00164     evi = ipmi_cmdlang_alloc_event_info();
00165     if (!evi) {
00166         rv = ENOMEM;
00167         errstr = "Out of memory";
00168         goto out_err;
00169     }
00170 
00171     ipmi_cmdlang_out(evi, "Object Type", "Domain");
00172     ipmi_cmdlang_out(evi, "Domain", domain_name);
00173     ipmi_cmdlang_out(evi, "Operation", "Domain fully up");
00174 
00175  out_err:
00176     if (rv) {
00177         ipmi_cmdlang_global_err(domain_name,
00178                                 "cmd_domain.c(domain_fully_up)",
00179                                 errstr, rv);
00180     }
00181     if (evi)
00182         ipmi_cmdlang_cmd_info_put(evi);
00183 
00184     if (cmd_info) {
00185         ipmi_cmdlang_lock(cmd_info);
00186         ipmi_cmdlang_out(cmd_info, "Domain Created", domain_name);
00187         ipmi_cmdlang_unlock(cmd_info);
00188         ipmi_cmdlang_cmd_info_put(cmd_info);
00189     }
00190 }
00191 
00192 static void
00193 domain_new(ipmi_cmd_info_t *cmd_info)
00194 {
00195     ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00196     ipmi_args_t    *con_parms[2];
00197     int            set = 0;
00198     int            i, j;
00199     ipmi_con_t     *con[2];
00200     int            rv;
00201     char           *name;
00202     int            curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00203     int            argc = ipmi_cmdlang_get_argc(cmd_info);
00204     char           **argv = ipmi_cmdlang_get_argv(cmd_info);
00205     int            num_options = 0;
00206     ipmi_open_option_t options[10];
00207     int            wait_til_up = 0;
00208     void           *up_info = NULL;
00209     void           *con_info = NULL;
00210 
00211     if (curr_arg >= argc) {
00212         cmdlang->errstr = "No domain name entered";
00213         cmdlang->err = EINVAL;
00214         goto out;
00215     }
00216     name = argv[curr_arg];
00217     curr_arg++;
00218 
00219     while ((curr_arg < argc) && argv[curr_arg][0] == '-') {
00220         if (num_options >= 10) {
00221             cmdlang->errstr = "Too many options";
00222             cmdlang->err = EINVAL;
00223             goto out;
00224         }
00225 
00226         if (! ipmi_parse_options(options+num_options, argv[curr_arg]))
00227             num_options++;
00228         else if (strcmp(argv[curr_arg], "-wait_til_up") == 0)
00229             wait_til_up = 1;
00230         else
00231             break;
00232         curr_arg++;
00233     }
00234 
00235     rv = ipmi_parse_args(&curr_arg, argc, argv, &con_parms[set]);
00236     if (rv) {
00237         cmdlang->errstr = "First connection parms are invalid";
00238         cmdlang->err = rv;
00239         goto out;
00240     }
00241     set++;
00242 
00243     if (curr_arg < argc) {
00244         rv = ipmi_parse_args(&curr_arg, argc, argv, &con_parms[set]);
00245         if (rv) {
00246             ipmi_free_args(con_parms[0]);
00247             cmdlang->errstr = "Second connection parms are invalid";
00248             cmdlang->err = rv;
00249             goto out;
00250         }
00251         set++;
00252     }
00253 
00254     for (i=0; i<set; i++) {
00255         rv = ipmi_args_setup_con(con_parms[i],
00256                                  cmdlang->os_hnd,
00257                                  NULL,
00258                                  &con[i]);
00259         if (rv) {
00260             cmdlang->errstr = "Unable to setup connection";
00261             cmdlang->err = rv;
00262             for (j=0; j<set; j++)
00263                 ipmi_free_args(con_parms[j]);
00264             goto out;
00265         }
00266     }
00267 
00268     if (wait_til_up)
00269         up_info = cmd_info;
00270     else
00271         con_info = cmd_info;
00272 
00273     ipmi_cmdlang_cmd_info_get(cmd_info);
00274     rv = ipmi_open_domain(name, con, set, domain_new_done, con_info,
00275                           domain_fully_up, up_info,
00276                           options, num_options, NULL);
00277     if (rv) {
00278         ipmi_cmdlang_cmd_info_put(cmd_info);
00279         cmdlang->errstr = strerror(rv);
00280         cmdlang->err = rv;
00281         for (i=0; i<set; i++) {
00282             ipmi_free_args(con_parms[i]);
00283             con[i]->close_connection(con[i]);
00284         }
00285         goto out;
00286     }
00287 
00288     for (i=0; i<set; i++)
00289       ipmi_free_args(con_parms[i]);
00290 
00291  out:
00292     if (cmdlang->err)
00293         cmdlang->location = "cmd_domain.c(domain_new)";
00294 
00295     return;
00296 }
00297 
00298 
00299 static void
00300 domain_open(ipmi_cmd_info_t *cmd_info)
00301 {
00302     ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00303     ipmi_args_t    *con_parms[2];
00304     int            set = 0;
00305     int            i, j;
00306     ipmi_con_t     *con[2];
00307     int            rv;
00308     char           *name;
00309     int            curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00310     int            argc = ipmi_cmdlang_get_argc(cmd_info);
00311     char           **argv = ipmi_cmdlang_get_argv(cmd_info);
00312     int            num_options = 0;
00313     ipmi_open_option_t options[10];
00314     int            wait_til_up = 0;
00315     void           *up_info = NULL;
00316     void           *con_info = NULL;
00317 
00318     if (curr_arg >= argc) {
00319         cmdlang->errstr = "No domain name entered";
00320         cmdlang->err = EINVAL;
00321         goto out;
00322     }
00323     name = argv[curr_arg];
00324     curr_arg++;
00325 
00326     while ((curr_arg < argc) && argv[curr_arg][0] == '-') {
00327         if (num_options >= 10) {
00328             cmdlang->errstr = "Too many options";
00329             cmdlang->err = EINVAL;
00330             goto out;
00331         }
00332 
00333         if (! ipmi_parse_options(options+num_options, argv[curr_arg]))
00334             num_options++;
00335         else if (strcmp(argv[curr_arg], "-wait_til_up") == 0)
00336             wait_til_up = 1;
00337         else
00338             break;
00339         curr_arg++;
00340     }
00341 
00342     rv = ipmi_parse_args2(&curr_arg, argc, argv, &con_parms[set]);
00343     if (rv) {
00344         cmdlang->errstr = "First connection parms are invalid";
00345         cmdlang->err = rv;
00346         goto out;
00347     }
00348     set++;
00349 
00350     if (curr_arg < argc) {
00351         rv = ipmi_parse_args2(&curr_arg, argc, argv, &con_parms[set]);
00352         if (rv) {
00353             ipmi_free_args(con_parms[0]);
00354             cmdlang->errstr = "Second connection parms are invalid";
00355             cmdlang->err = rv;
00356             goto out;
00357         }
00358         set++;
00359     }
00360 
00361     for (i=0; i<set; i++) {
00362         rv = ipmi_args_setup_con(con_parms[i],
00363                                  cmdlang->os_hnd,
00364                                  NULL,
00365                                  &con[i]);
00366         if (rv) {
00367             cmdlang->errstr = "Unable to setup connection";
00368             cmdlang->err = rv;
00369             for (j=0; j<i; j++)
00370                 con[j]->close_connection(con[j]);
00371             for (j=0; j<set; j++)
00372                 ipmi_free_args(con_parms[j]);
00373             goto out;
00374         }
00375     }
00376 
00377     if (wait_til_up)
00378         up_info = cmd_info;
00379     else
00380         con_info = cmd_info;
00381 
00382     ipmi_cmdlang_cmd_info_get(cmd_info);
00383     rv = ipmi_open_domain(name, con, set, domain_new_done, con_info,
00384                           domain_fully_up, up_info,
00385                           options, num_options, NULL);
00386     if (rv) {
00387         ipmi_cmdlang_cmd_info_put(cmd_info);
00388         cmdlang->errstr = strerror(rv);
00389         cmdlang->err = rv;
00390         for (i=0; i<set; i++) {
00391             ipmi_free_args(con_parms[i]);
00392             con[i]->close_connection(con[i]);
00393         }
00394         goto out;
00395     }
00396 
00397     for (i=0; i<set; i++)
00398       ipmi_free_args(con_parms[i]);
00399 
00400  out:
00401     if (cmdlang->err)
00402         cmdlang->location = "cmd_domain.c(domain_open)";
00403 
00404     return;
00405 }
00406 
00407 void con_usage(const char *name, const char *help, void *cb_data)
00408 {
00409     ipmi_cmdlang_t *cmdlang = cb_data;
00410 
00411     cmdlang->out(cmdlang, name, help);
00412 }
00413 
00414 static void
00415 domain_open_help(ipmi_cmdlang_t *cmdlang)
00416 {
00417     ipmi_parse_args_iter_help(con_usage, cmdlang);
00418     cmdlang->out(cmdlang, "Options are:\n", ipmi_parse_options_help());
00419 }
00420 
00421 static void
00422 domain_fru_fetched(ipmi_domain_t *domain, ipmi_fru_t *fru,
00423                    int err, void *cb_data)
00424 {
00425     ipmi_cmd_info_t *cmd_info = cb_data;
00426     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00427     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00428 
00429     ipmi_cmdlang_lock(cmd_info);
00430 
00431     if (err && (ipmi_fru_get_data_length(fru) == 0)) {
00432         cmdlang->errstr = "Error fetching FRU info";
00433         cmdlang->err = err;
00434         ipmi_domain_get_name(domain, cmdlang->objstr,
00435                              cmdlang->objstr_len);
00436         cmdlang->location = "cmd_domain.c(domain_fru_fetched)";
00437         goto out;
00438     }
00439 
00440     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00441     ipmi_cmdlang_out(cmd_info, "Domain", NULL);
00442     ipmi_cmdlang_down(cmd_info);
00443     ipmi_cmdlang_out(cmd_info, "Name", domain_name);
00444     if (err)
00445         ipmi_cmdlang_out_int(cmd_info, "Warning fetching FRU", err);
00446     ipmi_cmdlang_dump_fru_info(cmd_info, fru);
00447     ipmi_cmdlang_up(cmd_info);
00448 
00449  out:
00450     ipmi_cmdlang_unlock(cmd_info);
00451     ipmi_cmdlang_cmd_info_put(cmd_info);
00452 }
00453 
00454 static void
00455 domain_fru(ipmi_domain_t *domain, void *cb_data)
00456 {
00457     ipmi_cmd_info_t *cmd_info = cb_data;
00458     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00459     int             is_logical;
00460     int             device_addr;
00461     int             device_id;
00462     int             lun;
00463     int             private_bus;
00464     int             channel;
00465     int             rv;
00466     int             curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00467     int             argc = ipmi_cmdlang_get_argc(cmd_info);
00468     char            **argv = ipmi_cmdlang_get_argv(cmd_info);
00469 
00470     if ((argc - curr_arg) < 6) {
00471         /* Not enough parameters */
00472         cmdlang->errstr = "Not enough parameters";
00473         cmdlang->err = EINVAL;
00474         goto out_err;
00475     }
00476 
00477     ipmi_cmdlang_get_bool(argv[curr_arg], &is_logical, cmd_info);
00478     if (cmdlang->err) {
00479         cmdlang->errstr = "is_logical invalid";
00480         goto out_err;
00481     }
00482     curr_arg++;
00483 
00484     ipmi_cmdlang_get_int(argv[curr_arg], &device_addr, cmd_info);
00485     if (cmdlang->err) {
00486         cmdlang->errstr = "device_address invalid";
00487         goto out_err;
00488     }
00489     curr_arg++;
00490 
00491     ipmi_cmdlang_get_int(argv[curr_arg], &device_id, cmd_info);
00492     if (cmdlang->err) {
00493         cmdlang->errstr = "device_id invalid";
00494         goto out_err;
00495     }
00496     curr_arg++;
00497 
00498     ipmi_cmdlang_get_int(argv[curr_arg], &lun, cmd_info);
00499     if (cmdlang->err) {
00500         cmdlang->errstr = "lun invalid";
00501         goto out_err;
00502     }
00503     curr_arg++;
00504 
00505     ipmi_cmdlang_get_int(argv[curr_arg], &private_bus, cmd_info);
00506     if (cmdlang->err) {
00507         cmdlang->errstr = "private_bus invalid";
00508         goto out_err;
00509     }
00510     curr_arg++;
00511 
00512     ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00513     if (cmdlang->err) {
00514         cmdlang->errstr = "channel invalid";
00515         goto out_err;
00516     }
00517     curr_arg++;
00518 
00519     ipmi_cmdlang_cmd_info_get(cmd_info);
00520     rv = ipmi_domain_fru_alloc(domain,
00521                                is_logical,
00522                                device_addr,
00523                                device_id,
00524                                lun,
00525                                private_bus,
00526                                channel,
00527                                domain_fru_fetched,
00528                                cmd_info,
00529                                NULL);
00530     if (rv) {
00531         ipmi_cmdlang_cmd_info_put(cmd_info);
00532         cmdlang->errstr = "Error allocating FRU info";
00533         cmdlang->err = rv;
00534         goto out_err;
00535     }
00536 
00537     return;
00538 
00539  out_err:
00540     ipmi_domain_get_name(domain, cmdlang->objstr,
00541                          cmdlang->objstr_len);
00542     cmdlang->location = "cmd_domain.c(domain_fru)";
00543 }
00544 
00545 static int
00546 domain_msg_handler(ipmi_domain_t *domain, ipmi_msgi_t *rspi)
00547 {
00548     ipmi_msg_t       *msg = &rspi->msg;
00549     ipmi_ipmb_addr_t *addr = (ipmi_ipmb_addr_t *) &rspi->addr;
00550     ipmi_cmd_info_t  *cmd_info = rspi->data1;
00551     char             domain_name[IPMI_DOMAIN_NAME_LEN];
00552 
00553     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00554 
00555     ipmi_cmdlang_lock(cmd_info);
00556     ipmi_cmdlang_out(cmd_info, "Response", NULL);
00557     ipmi_cmdlang_down(cmd_info);
00558     ipmi_cmdlang_out(cmd_info, "Domain", domain_name);
00559     ipmi_cmdlang_out_int(cmd_info, "channel", addr->channel);
00560     ipmi_cmdlang_out_hex(cmd_info, "ipmb", addr->slave_addr);
00561     ipmi_cmdlang_out_int(cmd_info, "LUN", addr->lun);
00562     ipmi_cmdlang_out_int(cmd_info, "NetFN", msg->netfn);
00563     ipmi_cmdlang_out_int(cmd_info, "command", msg->cmd);
00564     if (msg->data_len)
00565         ipmi_cmdlang_out_binary(cmd_info, "Data",
00566                                 (char *) msg->data, msg->data_len);
00567     ipmi_cmdlang_unlock(cmd_info);
00568     ipmi_cmdlang_up(cmd_info);
00569 
00570     ipmi_cmdlang_cmd_info_put(cmd_info);
00571 
00572     return IPMI_MSG_ITEM_NOT_USED;
00573 }
00574 
00575 static void
00576 domain_msg(ipmi_domain_t *domain, void *cb_data)
00577 {
00578     ipmi_cmd_info_t  *cmd_info = cb_data;
00579     ipmi_cmdlang_t   *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00580     int              channel;
00581     int              ipmb;
00582     int              is_broadcast = 0;
00583     int              LUN;
00584     int              NetFN;
00585     int              command;
00586     unsigned char    data[100];
00587     int              rv;
00588     int              i;
00589     ipmi_ipmb_addr_t addr;
00590     ipmi_msg_t       msg;
00591     int              curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00592     int              argc = ipmi_cmdlang_get_argc(cmd_info);
00593     char             **argv = ipmi_cmdlang_get_argv(cmd_info);
00594 
00595 
00596     if ((argc - curr_arg) < 5) {
00597         /* Not enough parameters */
00598         cmdlang->errstr = "Not enough parameters";
00599         cmdlang->err = EINVAL;
00600         goto out_err;
00601     }
00602 
00603     ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00604     if (cmdlang->err) {
00605         cmdlang->errstr = "channel invalid";
00606         goto out_err;
00607     }
00608     curr_arg++;
00609 
00610     ipmi_cmdlang_get_int(argv[curr_arg], &ipmb, cmd_info);
00611     if (cmdlang->err) {
00612         cmdlang->errstr = "ipmb invalid";
00613         goto out_err;
00614     }
00615     curr_arg++;
00616 
00617     if (ipmb == 0) {
00618         is_broadcast = 1;
00619         if ((argc - curr_arg) < 5) {
00620             /* Not enough parameters */
00621             cmdlang->errstr = "Not enough parameters";
00622             cmdlang->err = EINVAL;
00623             goto out_err;
00624         }
00625         ipmi_cmdlang_get_int(argv[curr_arg], &ipmb, cmd_info);
00626         if (cmdlang->err) {
00627             cmdlang->errstr = "ipmb invalid";
00628             goto out_err;
00629         }
00630         curr_arg++;
00631     }
00632 
00633     ipmi_cmdlang_get_int(argv[curr_arg], &LUN, cmd_info);
00634     if (cmdlang->err) {
00635         cmdlang->errstr = "LUN invalid";
00636         goto out_err;
00637     }
00638     curr_arg++;
00639 
00640     ipmi_cmdlang_get_int(argv[curr_arg], &NetFN, cmd_info);
00641     if (cmdlang->err) {
00642         cmdlang->errstr = "NetFN invalid";
00643         goto out_err;
00644     }
00645     curr_arg++;
00646 
00647     ipmi_cmdlang_get_int(argv[curr_arg], &command, cmd_info);
00648     if (cmdlang->err) {
00649         cmdlang->errstr = "command invalid";
00650         goto out_err;
00651     }
00652     curr_arg++;
00653 
00654     i = 0;
00655     while (curr_arg < argc) {
00656         ipmi_cmdlang_get_uchar(argv[curr_arg], &data[i], cmd_info);
00657         if (cmdlang->err) {
00658             cmdlang->errstr = "data invalid";
00659             goto out_err;
00660         }
00661         curr_arg++;
00662         i++;
00663     }
00664 
00665     if (is_broadcast)
00666         addr.addr_type = IPMI_IPMB_BROADCAST_ADDR_TYPE;
00667     else
00668         addr.addr_type = IPMI_IPMB_ADDR_TYPE;
00669     addr.channel = channel;
00670     addr.slave_addr = ipmb;
00671     addr.lun = LUN;
00672     msg.netfn = NetFN;
00673     msg.cmd = command;
00674     msg.data_len = i;
00675     msg.data = data;
00676 
00677     ipmi_cmdlang_cmd_info_get(cmd_info);
00678     rv = ipmi_send_command_addr(domain,
00679                                 (ipmi_addr_t *) &(addr),
00680                                 sizeof(addr),
00681                                 &msg,
00682                                 domain_msg_handler,
00683                                 cmd_info, NULL);
00684     if (rv) {
00685         ipmi_cmdlang_cmd_info_put(cmd_info);
00686         cmdlang->errstr = "Error sending message";
00687         cmdlang->err = rv;
00688         goto out_err;
00689     }
00690 
00691     return;
00692 
00693  out_err:
00694     if (cmdlang->err) {
00695         ipmi_domain_get_name(domain, cmdlang->objstr,
00696                              cmdlang->objstr_len);
00697         cmdlang->location = "cmd_domain.c(domain_msg)";
00698     }
00699 }
00700 
00701 static void
00702 scan_done(ipmi_domain_t *domain, int err, void *cb_data)
00703 {
00704     ipmi_cmd_info_t *cmd_info = cb_data;
00705     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00706     char             domain_name[IPMI_DOMAIN_NAME_LEN];
00707 
00708     ipmi_cmdlang_lock(cmd_info);
00709     if (err) {
00710         if (! cmdlang->err) {
00711             cmdlang->err = err;
00712             cmdlang->errstr = "Error scanning domain";
00713             ipmi_domain_get_name(domain, cmdlang->objstr,
00714                                  cmdlang->objstr_len);
00715             cmdlang->location = "cmd_domain.c(scan_done)";
00716         }
00717         goto out;
00718     }
00719 
00720     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00721     ipmi_cmdlang_out(cmd_info, "Scan done", domain_name);
00722 
00723  out:
00724     ipmi_cmdlang_unlock(cmd_info);
00725     ipmi_cmdlang_cmd_info_put(cmd_info);
00726 }
00727 
00728 static void
00729 domain_scan(ipmi_domain_t *domain, void *cb_data)
00730 {
00731     ipmi_cmd_info_t *cmd_info = cb_data;
00732     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00733     int             rv;
00734     int             channel;
00735     int             ipmb1, ipmb2;
00736     int             curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00737     int             argc = ipmi_cmdlang_get_argc(cmd_info);
00738     char            **argv = ipmi_cmdlang_get_argv(cmd_info);
00739 
00740     if ((argc - curr_arg) < 2) {
00741         /* Not enough parameters */
00742         cmdlang->errstr = "Not enough parameters";
00743         cmdlang->err = EINVAL;
00744         goto out_err;
00745     }
00746 
00747     ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info);
00748     if (cmdlang->err) {
00749         cmdlang->errstr = "channel invalid";
00750         goto out_err;
00751     }
00752     curr_arg++;
00753 
00754     ipmi_cmdlang_get_int(argv[curr_arg], &ipmb1, cmd_info);
00755     if (cmdlang->err) {
00756         cmdlang->errstr = "ipmb1 invalid";
00757         goto out_err;
00758     }
00759     curr_arg++;
00760 
00761     if (curr_arg < argc) {
00762         ipmi_cmdlang_get_int(argv[curr_arg], &ipmb2, cmd_info);
00763         if (cmdlang->err) {
00764             cmdlang->errstr = "ipmb2 invalid";
00765             goto out_err;
00766         }
00767         curr_arg++;
00768     } else
00769         ipmb2 = ipmb1;
00770 
00771     ipmi_cmdlang_cmd_info_get(cmd_info);
00772     rv = ipmi_start_ipmb_mc_scan(domain, channel, ipmb1, ipmb2,
00773                                  scan_done, cmd_info);
00774     if (rv) {
00775         ipmi_cmdlang_cmd_info_put(cmd_info);
00776         cmdlang->errstr = "Error requesting scan";
00777         cmdlang->err = rv;
00778         goto out_err;
00779     }
00780     
00781  out_err:
00782     if (cmdlang->err) {
00783         ipmi_domain_get_name(domain, cmdlang->objstr,
00784                              cmdlang->objstr_len);
00785         cmdlang->location = "cmd_domain.c(domain_scan)";
00786     }
00787 }
00788 
00789 static void
00790 domain_rescan_sels_done(ipmi_domain_t *domain, int err, void *cb_data)
00791 {
00792     ipmi_cmd_info_t *cmd_info = cb_data;
00793     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00794     char             domain_name[IPMI_DOMAIN_NAME_LEN];
00795 
00796     ipmi_cmdlang_lock(cmd_info);
00797     if (err) {
00798         if (! cmdlang->err) {
00799             cmdlang->err = err;
00800             cmdlang->errstr = "Error scanning SELs";
00801             ipmi_domain_get_name(domain, cmdlang->objstr,
00802                                  cmdlang->objstr_len);
00803             cmdlang->location = "cmd_domain.c(sel_rescan_done)";
00804         }
00805         goto out;
00806     }
00807 
00808     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00809     ipmi_cmdlang_out(cmd_info, "SEL Rescan done", domain_name);
00810 
00811  out:
00812     ipmi_cmdlang_unlock(cmd_info);
00813     ipmi_cmdlang_cmd_info_put(cmd_info);
00814 }
00815 
00816 static void
00817 domain_rescan_sels(ipmi_domain_t *domain, void *cb_data)
00818 {
00819     ipmi_cmd_info_t *cmd_info = cb_data;
00820     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00821     int             rv;
00822 
00823     ipmi_cmdlang_cmd_info_get(cmd_info);
00824     rv = ipmi_domain_reread_sels(domain, domain_rescan_sels_done, cmd_info);
00825     if (rv) {
00826         ipmi_cmdlang_cmd_info_put(cmd_info);
00827         cmdlang->errstr = "Error requesting SEL rescan";
00828         cmdlang->err = rv;
00829         goto out_err;
00830     }
00831     
00832  out_err:
00833     if (cmdlang->err) {
00834         ipmi_domain_get_name(domain, cmdlang->objstr,
00835                              cmdlang->objstr_len);
00836         cmdlang->location = "cmd_domain.c(domain_rescan_sels)";
00837     }
00838 }
00839 
00840 static void
00841 domain_presence(ipmi_domain_t *domain, void *cb_data)
00842 {
00843     ipmi_cmd_info_t *cmd_info = cb_data;
00844     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00845     int             rv;
00846     char             domain_name[IPMI_DOMAIN_NAME_LEN];
00847 
00848     rv = ipmi_detect_domain_presence_changes(domain, 1);
00849     if (rv) {
00850         cmdlang->err = rv;
00851         ipmi_domain_get_name(domain, cmdlang->objstr,
00852                              cmdlang->objstr_len);
00853         cmdlang->location = "cmd_domain.c(domain_presence)";
00854         goto out;
00855     }
00856     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00857     ipmi_cmdlang_out(cmd_info, "Presence check started", domain_name);
00858  out:
00859     return;
00860 }
00861 
00862 static void
00863 domain_sel_rescan_time(ipmi_domain_t *domain, void *cb_data)
00864 {
00865     ipmi_cmd_info_t *cmd_info = cb_data;
00866     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00867     int             time;
00868     int             curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00869     int             argc = ipmi_cmdlang_get_argc(cmd_info);
00870     char            **argv = ipmi_cmdlang_get_argv(cmd_info);
00871     char             domain_name[IPMI_DOMAIN_NAME_LEN];
00872 
00873     if ((argc - curr_arg) < 1) {
00874         /* Not enough parameters */
00875         cmdlang->errstr = "Not enough parameters";
00876         cmdlang->err = EINVAL;
00877         goto out_err;
00878     }
00879 
00880     ipmi_cmdlang_get_int(argv[curr_arg], &time, cmd_info);
00881     if (cmdlang->err) {
00882         cmdlang->errstr = "time invalid";
00883         goto out_err;
00884     }
00885     curr_arg++;
00886 
00887     ipmi_domain_set_sel_rescan_time(domain, time);
00888 
00889     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00890     ipmi_cmdlang_out(cmd_info, "Domain SEL rescan time set", domain_name);
00891 
00892  out_err:
00893     if (cmdlang->err) {
00894         ipmi_domain_get_name(domain, cmdlang->objstr,
00895                              cmdlang->objstr_len);
00896         cmdlang->location = "cmd_domain.c(domain_sel_rescan_time)";
00897     }
00898 }
00899 
00900 
00901 static void
00902 domain_ipmb_rescan_time(ipmi_domain_t *domain, void *cb_data)
00903 {
00904     ipmi_cmd_info_t *cmd_info = cb_data;
00905     ipmi_cmdlang_t  *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00906     int             time;
00907     int             curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info);
00908     int             argc = ipmi_cmdlang_get_argc(cmd_info);
00909     char            **argv = ipmi_cmdlang_get_argv(cmd_info);
00910     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00911 
00912     if ((argc - curr_arg) < 1) {
00913         cmdlang->errstr = "Not enough parameters";
00914         cmdlang->err = EINVAL;
00915         goto out_err;
00916     }
00917 
00918     ipmi_cmdlang_get_int(argv[curr_arg], &time, cmd_info);
00919     if (cmdlang->err) {
00920         cmdlang->errstr = "time invalid";
00921         goto out_err;
00922     }
00923     curr_arg++;
00924 
00925     ipmi_domain_set_ipmb_rescan_time(domain, time);
00926 
00927     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00928     ipmi_cmdlang_out(cmd_info, "Domain IPMB rescan time set", domain_name);
00929 
00930  out_err:
00931     if (cmdlang->err) {
00932         ipmi_domain_get_name(domain, cmdlang->objstr,
00933                              cmdlang->objstr_len);
00934         cmdlang->location = "cmd_domain.c(domain_ipmb_rescan_time)";
00935     }
00936 }
00937 
00938 static void
00939 handle_stat(ipmi_domain_t *domain, ipmi_domain_stat_t *stat, void *cb_data)
00940 {
00941     ipmi_cmd_info_t *cmd_info = cb_data;
00942     const char      *name = ipmi_domain_stat_get_name(stat);
00943     const char      *inst = ipmi_domain_stat_get_instance(stat);
00944     char            *s = ipmi_mem_alloc(strlen(name) + strlen(inst) + 2);
00945 
00946     if (!s)
00947         return;
00948     sprintf(s, "%s %s", name, inst);
00949     ipmi_cmdlang_out_int(cmd_info, s, ipmi_domain_stat_get(stat));
00950     ipmi_mem_free(s);
00951 }
00952 
00953 static void
00954 domain_stats(ipmi_domain_t *domain, void *cb_data)
00955 {
00956     ipmi_cmd_info_t *cmd_info = cb_data;
00957     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00958 
00959     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
00960     ipmi_cmdlang_out(cmd_info, "Domain statistics", NULL);
00961     ipmi_cmdlang_down(cmd_info);
00962     ipmi_cmdlang_out(cmd_info, "Domain", domain_name);
00963     ipmi_domain_stat_iterate(domain, NULL, NULL, handle_stat, cmd_info);
00964     ipmi_cmdlang_up(cmd_info);
00965 }
00966 
00967 typedef struct domain_close_info_s
00968 {
00969     char            domain_name[IPMI_DOMAIN_NAME_LEN];
00970     ipmi_cmd_info_t *cmd_info;
00971 } domain_close_info_t;
00972 
00973 static void
00974 final_close(void *cb_data)
00975 {
00976     domain_close_info_t *info = cb_data;
00977     ipmi_cmd_info_t *cmd_info = info->cmd_info;
00978 
00979     ipmi_cmdlang_lock(cmd_info);
00980     ipmi_cmdlang_out(cmd_info, "Domain closed", info->domain_name);
00981     ipmi_cmdlang_unlock(cmd_info);
00982 
00983     ipmi_mem_free(info);
00984 
00985     ipmi_cmdlang_cmd_info_put(cmd_info);
00986 }
00987 
00988 static void
00989 domain_close(ipmi_domain_t *domain, void *cb_data)
00990 {
00991     ipmi_cmd_info_t     *cmd_info = cb_data;
00992     ipmi_cmdlang_t      *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00993     int                 rv;
00994     domain_close_info_t *info = cb_data;
00995 
00996     info = ipmi_mem_alloc(sizeof(*info));
00997     if (!info) {
00998         cmdlang->errstr = "Out of memory";
00999         cmdlang->err = ENOMEM;
01000         goto out_err;
01001     }
01002     ipmi_domain_get_name(domain, info->domain_name, sizeof(info->domain_name));
01003     info->cmd_info = cmd_info;
01004 
01005     ipmi_cmdlang_cmd_info_get(cmd_info);
01006     rv = ipmi_domain_close(domain, final_close, info);
01007     if (rv) {
01008         ipmi_cmdlang_cmd_info_put(cmd_info);
01009         cmdlang->errstr = "Unable to close domain";
01010         cmdlang->err = rv;
01011         goto out_err;
01012     }
01013     return;
01014 
01015  out_err:
01016     ipmi_domain_get_name(domain, cmdlang->objstr,
01017                          cmdlang->objstr_len);
01018     cmdlang->location = "cmd_domain.c(domain_close)";
01019 }
01020 
01021 
01022 /**********************************************************************
01023  *
01024  * Domain event handling.
01025  *
01026  **********************************************************************/
01027 
01028 static void
01029 domain_event_handler(ipmi_domain_t *domain,
01030                      ipmi_event_t  *event,
01031                      void          *cb_data)
01032 {
01033     char            *errstr = NULL;
01034     int             rv = 0;
01035     ipmi_cmd_info_t *evi;
01036 
01037     evi = ipmi_cmdlang_alloc_event_info();
01038     if (!evi) {
01039         rv = ENOMEM;
01040         errstr = "Out of memory";
01041         goto out_err;
01042     }
01043 
01044     ipmi_cmdlang_out(evi, "Object Type", "Event");
01045     ipmi_cmdlang_event_out(event, evi);
01046 
01047  out_err:
01048     if (rv) {
01049         char domain_name[IPMI_DOMAIN_NAME_LEN];
01050 
01051         ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01052         ipmi_cmdlang_global_err(domain_name,
01053                                 "cmd_domain.c(domain_event_handler)",
01054                                 errstr, rv);
01055     }
01056     if (evi)
01057         ipmi_cmdlang_cmd_info_put(evi);
01058 }
01059 
01060 static void
01061 domain_con_change(ipmi_domain_t *domain,
01062                   int           err,
01063                   unsigned int  conn_num,
01064                   unsigned int  port_num,
01065                   int           still_connected,
01066                   void          *cb_data)
01067 {
01068     char            *errstr;
01069     int             rv = 0;
01070     ipmi_cmd_info_t *evi;
01071     char            domain_name[IPMI_DOMAIN_NAME_LEN];
01072 
01073     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01074 
01075     evi = ipmi_cmdlang_alloc_event_info();
01076     if (!evi) {
01077         rv = ENOMEM;
01078         errstr = "Out of memory";
01079         goto out_err;
01080     }
01081 
01082     ipmi_cmdlang_out(evi, "Object Type", "Domain");
01083     ipmi_cmdlang_out(evi, "Name", domain_name);
01084     ipmi_cmdlang_out(evi, "Operation", "Connection Change");
01085     ipmi_cmdlang_out_int(evi, "Connection Number", conn_num);
01086     ipmi_cmdlang_out_int(evi, "Port Number", port_num);
01087     ipmi_cmdlang_out_bool(evi, "Any Connection Up", still_connected);
01088     ipmi_cmdlang_out_int(evi, "Error", err);
01089 
01090     if (err) {
01091         char errval[128];
01092         ipmi_cmdlang_out(evi, "Error String",
01093                          ipmi_get_error_string(err, errval, sizeof(errval)));
01094         
01095     }
01096     errstr = NULL; /* Get rid of warning */
01097 
01098  out_err:
01099     if (rv) {
01100         ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01101         ipmi_cmdlang_global_err(domain_name, "cmd_domain.c(domain_con_change)",
01102                                 errstr, rv);
01103     }
01104     if (evi)
01105         ipmi_cmdlang_cmd_info_put(evi);
01106 }
01107 
01108 void
01109 domain_change(ipmi_domain_t      *domain,
01110               enum ipmi_update_e op,
01111               void               *cb_data)
01112 {
01113     ipmi_cmd_info_t *evi;
01114     int             rv = 0;
01115     char            *errstr = NULL;
01116     char            domain_name[IPMI_DOMAIN_NAME_LEN];
01117 
01118     evi = ipmi_cmdlang_alloc_event_info();
01119     if (!evi) {
01120         rv = ENOMEM;
01121         errstr = "Out of memory";
01122         goto out_err;
01123     }
01124 
01125     ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
01126 
01127 
01128     ipmi_cmdlang_out(evi, "Object Type", "Domain");
01129     ipmi_cmdlang_out(evi, "Name", domain_name);
01130 
01131     switch (op) {
01132     case IPMI_ADDED:
01133         ipmi_cmdlang_out(evi, "Operation", "Add");
01134         if (ipmi_cmdlang_get_evinfo()) {
01135             ipmi_cmdlang_down(evi);
01136             domain_info(domain, evi);
01137             ipmi_cmdlang_up(evi);
01138         }
01139         /* Register handlers. */
01140         rv = ipmi_domain_add_event_handler(domain, domain_event_handler, NULL);
01141         if (rv) {
01142             errstr = "ipmi_register_for_events";
01143             goto out_err;
01144         }
01145 
01146         rv = ipmi_domain_enable_events(domain);
01147         if (rv) {
01148             errstr = "ipmi_domain_enable_events";
01149             goto out_err;
01150         }
01151 
01152         rv = ipmi_domain_add_entity_update_handler(domain,
01153                                                    ipmi_cmdlang_entity_change,
01154                                                    domain);
01155         if (rv) {
01156             errstr = "ipmi_bmc_set_entity_update_handler";
01157             goto out_err;
01158         }
01159 
01160         rv = ipmi_domain_add_mc_updated_handler(domain,
01161                                                 ipmi_cmdlang_mc_change,
01162                                                 domain);
01163         if (rv) {
01164             errstr = "ipmi_bmc_set_entity_update_handler";
01165             goto out_err;
01166         }
01167         break;
01168 
01169     case IPMI_DELETED:
01170         ipmi_cmdlang_out(evi, "Operation", "Delete");
01171         break;
01172 
01173     default:
01174         break;
01175     }
01176 
01177  out_err:
01178     /* FIXME - should we shut the connection down on errors? */
01179     if (rv) {
01180         ipmi_cmdlang_global_err(domain_name, "cmd_domain.c(domain_change)",
01181                                 errstr, rv);
01182     }
01183     if (evi)
01184         ipmi_cmdlang_cmd_info_put(evi);
01185 }
01186 
01187 static void
01188 get_mc_name(ipmi_mc_t *mc, void *cb_data)
01189 {
01190     char *mc_name = cb_data;
01191 
01192     ipmi_mc_get_name(mc, mc_name, IPMI_MC_NAME_LEN);
01193 }
01194 
01195 void
01196 ipmi_cmdlang_event_out(ipmi_event_t    *event,
01197                        ipmi_cmd_info_t *cmd_info)
01198 {
01199     ipmi_mcid_t     mcid;
01200     char            mc_name[IPMI_MC_NAME_LEN];
01201     unsigned int    len;
01202     int             rv;
01203 
01204     mcid = ipmi_event_get_mcid(event);
01205     rv = ipmi_mc_pointer_cb(mcid, get_mc_name, mc_name);
01206     if (rv) {
01207         /* The MC went away, that's actually ok, just ignore it. */
01208         ipmi_cmdlang_cmd_info_put(cmd_info);
01209         return;
01210     }
01211 
01212     ipmi_cmdlang_out(cmd_info, "MC", mc_name);
01213     ipmi_cmdlang_out_int(cmd_info, "Record ID",
01214                          ipmi_event_get_record_id(event));
01215     ipmi_cmdlang_out_int(cmd_info, "Event type", ipmi_event_get_type(event));
01216     ipmi_cmdlang_out_time(cmd_info, "Timestamp",
01217                           ipmi_event_get_timestamp(event));
01218     len = ipmi_event_get_data_len(event);
01219     if (len) {
01220         unsigned char *data;
01221         data = ipmi_mem_alloc(len);
01222         if (!data)
01223             return;
01224         len = ipmi_event_get_data(event, data, 0, len);
01225         ipmi_cmdlang_out_binary(cmd_info, "Data", (char *) data, len);
01226         ipmi_mem_free(data);
01227     }
01228 }
01229 
01230 static ipmi_cmdlang_cmd_t *domain_cmds;
01231 
01232 static ipmi_cmdlang_init_t cmds_domain[] =
01233 {
01234     { "domain", NULL,
01235       "- Commands dealing with domains",
01236       NULL, NULL, &domain_cmds},
01237     { "list", &domain_cmds,
01238       "- List all the domains in the system",
01239       domain_list, NULL,  NULL },
01240     { "info", &domain_cmds,
01241       "<domain> - Dump information about a domain",
01242       ipmi_cmdlang_domain_handler, domain_info, NULL },
01243     { "new", &domain_cmds,
01244       "Obsolete, use domain open",
01245       domain_new, NULL, NULL },
01246     { "open", &domain_cmds,
01247       "<domain name> [<options>] <domain parms> [<domain parms>]- Set up a"
01248       " new domain u