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

cmd_domain.c File Reference

#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <OpenIPMI/ipmiif.h>
#include <OpenIPMI/ipmi_mc.h>
#include <OpenIPMI/ipmi_err.h>
#include <OpenIPMI/ipmi_cmdlang.h>
#include <OpenIPMI/ipmi_fru.h>
#include <OpenIPMI/ipmi_conn.h>
#include <OpenIPMI/internal/ipmi_malloc.h>

Go to the source code of this file.

Classes

struct  domain_close_info_s

Defines

#define CMDS_DOMAIN_LEN   (sizeof(cmds_domain)/sizeof(ipmi_cmdlang_init_t))

Typedefs

typedef domain_close_info_s domain_close_info_t

Functions

void ipmi_cmdlang_dump_fru_info (ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru)
static void domain_list_handler (ipmi_domain_t *domain, void *cb_data)
static void domain_list (ipmi_cmd_info_t *cmd_info)
static void domain_info (ipmi_domain_t *domain, void *cb_data)
static void domain_con_change (ipmi_domain_t *domain, int err, unsigned int conn_num, unsigned int port_num, int still_connected, void *cb_data)
void ipmi_cmdlang_entity_change (enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_entity_t *entity, void *cb_data)
void ipmi_cmdlang_mc_change (enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data)
static void domain_new_done (ipmi_domain_t *domain, int err, unsigned int conn_num, unsigned int port_num, int still_connected, void *cb_data)
void domain_fully_up (ipmi_domain_t *domain, void *cb_data)
static void domain_new (ipmi_cmd_info_t *cmd_info)
static void domain_open (ipmi_cmd_info_t *cmd_info)
void con_usage (const char *name, const char *help, void *cb_data)
static void domain_open_help (ipmi_cmdlang_t *cmdlang)
static void domain_fru_fetched (ipmi_domain_t *domain, ipmi_fru_t *fru, int err, void *cb_data)
static void domain_fru (ipmi_domain_t *domain, void *cb_data)
static int domain_msg_handler (ipmi_domain_t *domain, ipmi_msgi_t *rspi)
static void domain_msg (ipmi_domain_t *domain, void *cb_data)
static void scan_done (ipmi_domain_t *domain, int err, void *cb_data)
static void domain_scan (ipmi_domain_t *domain, void *cb_data)
static void domain_rescan_sels_done (ipmi_domain_t *domain, int err, void *cb_data)
static void domain_rescan_sels (ipmi_domain_t *domain, void *cb_data)
static void domain_presence (ipmi_domain_t *domain, void *cb_data)
static void domain_sel_rescan_time (ipmi_domain_t *domain, void *cb_data)
static void domain_ipmb_rescan_time (ipmi_domain_t *domain, void *cb_data)
static void handle_stat (ipmi_domain_t *domain, ipmi_domain_stat_t *stat, void *cb_data)
static void domain_stats (ipmi_domain_t *domain, void *cb_data)
static void final_close (void *cb_data)
static void domain_close (ipmi_domain_t *domain, void *cb_data)
static void domain_event_handler (ipmi_domain_t *domain, ipmi_event_t *event, void *cb_data)
void domain_change (ipmi_domain_t *domain, enum ipmi_update_e op, void *cb_data)
static void get_mc_name (ipmi_mc_t *mc, void *cb_data)
void ipmi_cmdlang_event_out (ipmi_event_t *event, ipmi_cmd_info_t *cmd_info)
int ipmi_cmdlang_domain_init (os_handler_t *os_hnd)

Variables

static ipmi_cmdlang_cmd_tdomain_cmds
static ipmi_cmdlang_init_t cmds_domain []


Define Documentation

#define CMDS_DOMAIN_LEN   (sizeof(cmds_domain)/sizeof(ipmi_cmdlang_init_t))
 

Definition at line 1288 of file cmd_domain.c.

Referenced by ipmi_cmdlang_domain_init().


Typedef Documentation

typedef struct domain_close_info_s domain_close_info_t
 


Function Documentation

void con_usage const char *  name,
const char *  help,
void *  cb_data
 

Definition at line 407 of file cmd_domain.c.

References cmdlang, and ipmi_cmdlang_s::out.

Referenced by domain_open_help(), and usage().

00408 {
00409     ipmi_cmdlang_t *cmdlang = cb_data;
00410 
00411     cmdlang->out(cmdlang, name, help);
00412 }

void domain_change ipmi_domain_t domain,
enum ipmi_update_e  op,
void *  cb_data
 

Definition at line 1109 of file cmd_domain.c.

References domain_event_handler(), domain_info(), IPMI_ADDED, ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_down(), ipmi_cmdlang_entity_change(), ipmi_cmdlang_get_evinfo(), ipmi_cmdlang_global_err(), ipmi_cmdlang_mc_change(), ipmi_cmdlang_out(), ipmi_cmdlang_up(), IPMI_DELETED, ipmi_domain_add_entity_update_handler(), ipmi_domain_add_event_handler(), ipmi_domain_add_mc_updated_handler(), ipmi_domain_enable_events(), ipmi_domain_get_name(), and IPMI_DOMAIN_NAME_LEN.

Referenced by ipmi_cmdlang_domain_init().

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 }

static void domain_close ipmi_domain_t domain,
void *  cb_data
[static]
 

Definition at line 989 of file cmd_domain.c.

References cmdlang, ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, final_close(), ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_get(), ipmi_cmdlang_cmd_info_put(), ipmi_domain_close(), ipmi_domain_get_name(), ipmi_mem_alloc(), ipmi_cmdlang_s::location, ipmi_cmdlang_s::objstr, and ipmi_cmdlang_s::objstr_len.

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 }

static void domain_con_change ipmi_domain_t domain,
int  err,
unsigned int  conn_num,
unsigned int  port_num,
int  still_connected,
void *  cb_data
[static]
 

Definition at line 1061 of file cmd_domain.c.

References ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_global_err(), ipmi_cmdlang_out(), ipmi_cmdlang_out_bool(), ipmi_cmdlang_out_int(), ipmi_domain_get_name(), IPMI_DOMAIN_NAME_LEN, and ipmi_get_error_string().

Referenced by domain_new_done().

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 }

static void domain_event_handler ipmi_domain_t domain,
ipmi_event_t event,
void *  cb_data
[static]
 

Definition at line 1029 of file cmd_domain.c.

References ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_event_out(), ipmi_cmdlang_global_err(), ipmi_cmdlang_out(), ipmi_domain_get_name(), and IPMI_DOMAIN_NAME_LEN.

Referenced by domain_change().

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 }

static void domain_fru ipmi_domain_t domain,
void *  cb_data
[static]
 

Definition at line 455 of file cmd_domain.c.

References cmdlang, domain_fru_fetched(), ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_get(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_get_argc(), ipmi_cmdlang_get_argv(), ipmi_cmdlang_get_bool(), ipmi_cmdlang_get_curr_arg(), ipmi_cmdlang_get_int(), ipmi_domain_fru_alloc(), ipmi_domain_get_name(), ipmi_cmdlang_s::location, ipmi_cmdlang_s::objstr, and ipmi_cmdlang_s::objstr_len.

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 }

static void domain_fru_fetched ipmi_domain_t domain,
ipmi_fru_t fru,
int  err,
void *  cb_data
[static]
 

Definition at line 422 of file cmd_domain.c.

References cmdlang, ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_down(), ipmi_cmdlang_dump_fru_info(), ipmi_cmdlang_lock(), ipmi_cmdlang_out(), ipmi_cmdlang_out_int(), ipmi_cmdlang_unlock(), ipmi_cmdlang_up(), ipmi_domain_get_name(), IPMI_DOMAIN_NAME_LEN, ipmi_fru_get_data_length(), ipmi_cmdlang_s::location, ipmi_cmdlang_s::objstr, and ipmi_cmdlang_s::objstr_len.

Referenced by domain_fru().

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 }

void domain_fully_up ipmi_domain_t domain,
void *  cb_data
 

Definition at line 154 of file cmd_domain.c.

References ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_global_err(), ipmi_cmdlang_lock(), ipmi_cmdlang_out(), ipmi_cmdlang_unlock(), ipmi_domain_get_name(), and IPMI_DOMAIN_NAME_LEN.

Referenced by _ipmi_put_domain_fully_up(), domain_new(), and domain_open().

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 }

static void domain_info ipmi_domain_t domain,
void *  cb_data
[static]
 

Definition at line 77 of file cmd_domain.c.

References ipmi_cmdlang_down(), ipmi_cmdlang_out(), ipmi_cmdlang_out_binary(), ipmi_cmdlang_out_int(), ipmi_cmdlang_up(), ipmi_domain_get_guid(), ipmi_domain_get_ipmb_rescan_time(), ipmi_domain_get_name(), ipmi_domain_get_sel_rescan_time(), ipmi_domain_get_type(), ipmi_domain_get_type_string(), and IPMI_DOMAIN_NAME_LEN.

Referenced by domain_change().

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 }

static void domain_ipmb_rescan_time ipmi_domain_t domain,
void *  cb_data
[static]
 

Definition at line 902 of file cmd_domain.c.

References cmdlang, ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_get_argc(), ipmi_cmdlang_get_argv(), ipmi_cmdlang_get_curr_arg(), ipmi_cmdlang_get_int(), ipmi_cmdlang_out(), ipmi_domain_get_name(), IPMI_DOMAIN_NAME_LEN, ipmi_domain_set_ipmb_rescan_time(), ipmi_cmdlang_s::location, ipmi_cmdlang_s::objstr, and ipmi_cmdlang_s::objstr_len.

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 }

static void domain_list ipmi_cmd_info_t cmd_info  )  [static]
 

Definition at line 68 of file cmd_domain.c.

References domain_list_handler(), ipmi_cmdlang_down(), ipmi_cmdlang_out(), ipmi_cmdlang_up(), and ipmi_domain_iterate_domains().

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 }

static void domain_list_handler ipmi_domain_t domain,
void *  cb_data
[static]
 

Definition at line 53 of file cmd_domain.c.

References cmdlang, ipmi_cmdlang_s::err, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_out(), ipmi_domain_get_name(), and IPMI_DOMAIN_NAME_LEN.

Referenced by domain_list().

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 }

static void domain_msg ipmi_domain_t domain,
void *  cb_data
[static]
 

Definition at line 576 of file cmd_domain.c.

References addr, ipmi_ipmb_addr::addr_type, ipmi_ipmb_addr::channel, ipmi_msg::cmd, cmdlang, ipmi_msg::data, ipmi_msg::data_len, domain_msg_handler(), ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, i, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_get(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_get_argc(), ipmi_cmdlang_get_argv(), ipmi_cmdlang_get_curr_arg(), ipmi_cmdlang_get_int(), ipmi_cmdlang_get_uchar(), ipmi_domain_get_name(), IPMI_IPMB_ADDR_TYPE, IPMI_IPMB_BROADCAST_ADDR_TYPE, ipmi_send_command_addr(), ipmi_cmdlang_s::location, ipmi_ipmb_addr::lun, ipmi_msg::netfn, ipmi_cmdlang_s::objstr, ipmi_cmdlang_s::objstr_len, and ipmi_ipmb_addr::slave_addr.

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 }

static int domain_msg_handler ipmi_domain_t domain,
ipmi_msgi_t rspi
[static]
 

Definition at line 546 of file cmd_domain.c.

References ipmi_msg_item_s::addr, addr, ipmi_ipmb_addr::channel, ipmi_msg::cmd, ipmi_msg::data, ipmi_msg_item_s::data1, ipmi_msg::data_len, ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_down(), ipmi_cmdlang_lock(), ipmi_cmdlang_out(), ipmi_cmdlang_out_binary(), ipmi_cmdlang_out_hex(), ipmi_cmdlang_out_int(), ipmi_cmdlang_unlock(), ipmi_cmdlang_up(), ipmi_domain_get_name(), IPMI_DOMAIN_NAME_LEN, IPMI_MSG_ITEM_NOT_USED, ipmi_ipmb_addr::lun, ipmi_msg_item_s::msg, ipmi_msg::netfn, and ipmi_ipmb_addr::slave_addr.

Referenced by domain_msg().

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 }

static void domain_new ipmi_cmd_info_t cmd_info  )  [static]
 

Definition at line 193 of file cmd_domain.c.

References ipmi_con_s::close_connection, cmdlang, con, con_info(), domain_fully_up(), domain_new_done(), ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, i, ipmi_args_setup_con(), ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_get(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_get_argc(), ipmi_cmdlang_get_argv(), ipmi_cmdlang_get_curr_arg(), ipmi_free_args(), ipmi_open_domain(), ipmi_parse_args(), ipmi_parse_options(), ipmi_cmdlang_s::location, name, and ipmi_cmdlang_s::os_hnd.

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 }

static void domain_new_done ipmi_domain_t domain,
int  err,
unsigned int  conn_num,
unsigned int  port_num,
int  still_connected,
void *  cb_data
[static]
 

Definition at line 115 of file cmd_domain.c.

References domain_con_change(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_lock(), ipmi_cmdlang_out(), ipmi_cmdlang_unlock(), ipmi_domain_add_connect_change_handler(), ipmi_domain_get_name(), IPMI_DOMAIN_NAME_LEN, and ipmi_domain_remove_connect_change_handler().

Referenced by domain_new(), and domain_open().

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 }

static void domain_open ipmi_cmd_info_t cmd_info  )  [static]
 

Definition at line 300 of file cmd_domain.c.

References ipmi_con_s::close_connection, cmdlang, con, con_info(), domain_fully_up(), domain_new_done(), ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, i, ipmi_args_setup_con(), ipmi_cmdinfo_get_cmdlang(),