#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_t * | domain_cmds |
| static ipmi_cmdlang_init_t | cmds_domain [] |
|
|
Definition at line 1288 of file cmd_domain.c. Referenced by ipmi_cmdlang_domain_init(). |
|
|
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||||||
|
||||||||||||
|
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 }
|
|
||||||||||||
|
||||||||||||
|
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 }
|
|
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||
|
|
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 }
|
|
||||||||||||||||||||||||||||
|
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 }
|
|
|
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(), |