#include <errno.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <stdio.h>#include <OpenIPMI/ipmiif.h>#include <OpenIPMI/ipmi_cmdlang.h>#include <OpenIPMI/ipmi_mc.h>#include <OpenIPMI/ipmi_sdr.h>#include <OpenIPMI/ipmi_err.h>#include <OpenIPMI/ipmi_msgbits.h>#include <OpenIPMI/ipmi_auth.h>#include <OpenIPMI/ipmi_user.h>#include <OpenIPMI/internal/ipmi_malloc.h>Go to the source code of this file.
Classes | |
| struct | sdr_info_s |
| struct | event_log_s |
| struct | get_chan_info_s |
| struct | set_chan_parm_s |
| struct | set_chan_info_s |
| struct | user_set_s |
Defines | |
| #define | CMDS_MC_LEN (sizeof(cmds_mc)/sizeof(ipmi_cmdlang_init_t)) |
Typedefs | |
| typedef sdr_info_s | sdr_info_t |
| typedef event_log_s | event_log_t |
| typedef get_chan_info_s | get_chan_info_t |
| typedef set_chan_parm_s | set_chan_parm_t |
| typedef set_chan_info_s | set_chan_info_t |
| typedef user_set_s | user_set_t |
Functions | |
| static void | mc_list_handler (ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data) |
| static void | mc_list (ipmi_domain_t *domain, void *cb_data) |
| static void | mc_dump (ipmi_mc_t *mc, ipmi_cmd_info_t *cmd_info) |
| static void | mc_info (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_reset_done (ipmi_mc_t *mc, int err, void *cb_data) |
| static void | mc_reset (ipmi_mc_t *mc, void *cb_data) |
| static void | set_events_enable_done (ipmi_mc_t *mc, int err, void *cb_data) |
| static void | mc_set_events_enable (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_get_events_enable (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_sel_info (ipmi_mc_t *mc, void *cb_data) |
| static void | get_sel_time_handler (ipmi_mc_t *mc, int err, unsigned long time, void *cb_data) |
| static void | mc_get_sel_time (ipmi_mc_t *mc, void *cb_data) |
| static void | set_sel_time_handler (ipmi_mc_t *mc, int err, void *cb_data) |
| static void | mc_set_sel_time (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_rescan_sel_done (ipmi_mc_t *mc, int err, void *cb_data) |
| static void | mc_rescan_sels (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_sel_rescan_time (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_msg_handler (ipmi_mc_t *mc, ipmi_msg_t *msg, void *cb_data) |
| static void | mc_msg (ipmi_mc_t *mc, void *cb_data) |
| void | sdrs_fetched (ipmi_sdr_info_t *sdrs, int err, int changed, unsigned int count, void *cb_data) |
| static void | mc_sdrs (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_got_event_log_enable (ipmi_mc_t *mc, int err, int val, void *cb_data) |
| static void | mc_get_event_log_enable (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_event_log_enable_set (ipmi_mc_t *mc, int err, void *cb_data) |
| static void | mc_set_event_log_enable (ipmi_mc_t *mc, void *cb_data) |
| static void | dump_chan_info (ipmi_mc_t *mc, ipmi_channel_info_t *info, ipmi_cmd_info_t *cmd_info) |
| static void | got_chan_info (ipmi_mc_t *mc, int err, ipmi_channel_info_t *info, void *cb_data) |
| static void | got_chan_info_multi (ipmi_mc_t *mc, int err, ipmi_channel_info_t *info, void *cb_data) |
| static void | mc_get_chan_info (ipmi_mc_t *mc, void *cb_data) |
| void | got_chan_access (ipmi_mc_t *mc, int err, ipmi_channel_access_t *info, void *cb_data) |
| static void | mc_get_chan_access (ipmi_mc_t *mc, void *cb_data) |
| void | set_chan_access2 (ipmi_mc_t *mc, int err, void *cb_data) |
| void | set_chan_access1 (ipmi_mc_t *mc, int err, ipmi_channel_access_t *info, void *cb_data) |
| static void | mc_set_chan_access (ipmi_mc_t *mc, void *cb_data) |
| static void | got_users (ipmi_mc_t *mc, int err, ipmi_user_list_t *list, void *cb_data) |
| static void | mc_user_list (ipmi_mc_t *mc, void *cb_data) |
| static void | set_user2 (ipmi_mc_t *mc, int err, void *cb_data) |
| static void | set_user1 (ipmi_mc_t *mc, int err, ipmi_user_list_t *list, void *cb_data) |
| static void | mc_user_set (ipmi_mc_t *mc, void *cb_data) |
| static void | mc_active (ipmi_mc_t *mc, int active, void *cb_data) |
| static void | mc_fully_up (ipmi_mc_t *mc, void *cb_data) |
| void | ipmi_cmdlang_mc_change (enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data) |
| int | ipmi_cmdlang_mc_init (os_handler_t *os_hnd) |
Variables | |
| static ipmi_cmdlang_cmd_t * | mc_cmds |
| static ipmi_cmdlang_cmd_t * | mc_chan_cmds |
| static ipmi_cmdlang_cmd_t * | mc_user_cmds |
| static ipmi_cmdlang_init_t | cmds_mc [] |
|
|
Definition at line 2283 of file cmd_mc.c. Referenced by ipmi_cmdlang_mc_init(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||||
|
Definition at line 938 of file cmd_mc.c. References ipmi_channel_info_get_aux_info(), ipmi_channel_info_get_channel(), ipmi_channel_info_get_medium(), ipmi_channel_info_get_protocol_type(), ipmi_channel_info_get_session_support(), ipmi_channel_info_get_vendor_id(), ipmi_channel_medium_string(), IPMI_CHANNEL_MULTI_SESSION, ipmi_channel_protocol_string(), IPMI_CHANNEL_SESSION_BASED, IPMI_CHANNEL_SESSION_LESS, IPMI_CHANNEL_SINGLE_SESSION, ipmi_cmdlang_down(), ipmi_cmdlang_lock(), ipmi_cmdlang_out(), ipmi_cmdlang_out_binary(), ipmi_cmdlang_out_int(), ipmi_cmdlang_unlock(), ipmi_cmdlang_up(), ipmi_mc_get_name(), and IPMI_MC_NAME_LEN. Referenced by got_chan_info(), and got_chan_info_multi(). 00941 { 00942 char mc_name[IPMI_MC_NAME_LEN]; 00943 char *str; 00944 unsigned int val; 00945 int rv; 00946 unsigned char data[3]; 00947 00948 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name)); 00949 00950 ipmi_cmdlang_lock(cmd_info); 00951 ipmi_cmdlang_out(cmd_info, "Channel Info", NULL); 00952 ipmi_cmdlang_down(cmd_info); 00953 ipmi_cmdlang_out(cmd_info, "MC", mc_name); 00954 rv = ipmi_channel_info_get_channel(info, &val); 00955 if (!rv) 00956 ipmi_cmdlang_out_int(cmd_info, "Channel", val); 00957 rv = ipmi_channel_info_get_medium(info, &val); 00958 if (!rv) { 00959 ipmi_cmdlang_out_int(cmd_info, "Medium", val); 00960 ipmi_cmdlang_out(cmd_info, "Medium String", 00961 ipmi_channel_medium_string(val)); 00962 } 00963 rv = ipmi_channel_info_get_protocol_type(info, &val); 00964 if (!rv) { 00965 ipmi_cmdlang_out_int(cmd_info, "Protocol Type", val); 00966 ipmi_cmdlang_out(cmd_info, "Protocol Type String", 00967 ipmi_channel_protocol_string(val)); 00968 } 00969 rv = ipmi_channel_info_get_session_support(info, &val); 00970 if (!rv) { 00971 switch (val) { 00972 case IPMI_CHANNEL_SESSION_LESS: str = "session-less"; break; 00973 case IPMI_CHANNEL_SINGLE_SESSION: str = "single-session"; break; 00974 case IPMI_CHANNEL_MULTI_SESSION: str = "multi-session"; break; 00975 case IPMI_CHANNEL_SESSION_BASED: str = "session-based"; break; 00976 default: str = "unknown"; 00977 } 00978 ipmi_cmdlang_out(cmd_info, "Session Support", str); 00979 } 00980 rv = ipmi_channel_info_get_vendor_id(info, data); 00981 if (!rv) 00982 ipmi_cmdlang_out_binary(cmd_info, "Vendor ID", (char *) data, 3); 00983 rv = ipmi_channel_info_get_aux_info(info, data); 00984 if (!rv) 00985 ipmi_cmdlang_out_binary(cmd_info, "Aux Info", (char *) data, 2); 00986 ipmi_cmdlang_up(cmd_info); 00987 ipmi_cmdlang_unlock(cmd_info); 00988 }
|
|
||||||||||||||||||||
|
||||||||||||||||||||
|
||||||||||||||||||||
|
Definition at line 991 of file cmd_mc.c. References cmdlang, dump_chan_info(), ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_put(), and ipmi_cmdlang_s::location. Referenced by ipmi_mc_channel_get_info(), and mc_get_chan_info(). 00995 { 00996 ipmi_cmd_info_t *cmd_info = cb_data; 00997 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); 00998 00999 if (err) { 01000 cmdlang->err = err; 01001 cmdlang->errstr = "Error getting channel info"; 01002 goto out_err; 01003 } 01004 01005 dump_chan_info(mc, info, cmd_info); 01006 01007 out_err: 01008 if (cmdlang->err) { 01009 cmdlang->location = "cmd_mc.c(got_chan_info)"; 01010 } 01011 01012 ipmi_cmdlang_cmd_info_put(cmd_info); 01013 }
|
|
||||||||||||||||||||
|
Definition at line 1016 of file cmd_mc.c. References dump_chan_info(), and ipmi_cmdlang_cmd_info_put(). Referenced by mc_get_chan_info(). 01020 { 01021 ipmi_cmd_info_t *cmd_info = cb_data; 01022 01023 if (err) 01024 /* Ignore this on multiple fetches, don't print an error */ 01025 goto out; 01026 01027 dump_chan_info(mc, info, cmd_info); 01028 01029 01030 out: 01031 ipmi_cmdlang_cmd_info_put(cmd_info); 01032 }
|
|
||||||||||||||||||||
|
Definition at line 1586 of file cmd_mc.c. References cmdlang, ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, i, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_down(), ipmi_cmdlang_lock(), ipmi_cmdlang_out(), ipmi_cmdlang_out_binary(), ipmi_cmdlang_out_bool(), ipmi_cmdlang_out_int(), ipmi_cmdlang_unlock(), ipmi_cmdlang_up(), ipmi_mc_get_name(), IPMI_MC_NAME_LEN, ipmi_privilege_string(), ipmi_user_free(), ipmi_user_get_access_cb_only(), ipmi_user_get_link_auth_enabled(), ipmi_user_get_msg_auth_enabled(), ipmi_user_get_name(), ipmi_user_get_num(), ipmi_user_get_privilege_limit(), ipmi_user_get_session_limit(), ipmi_user_list_get_channel(), ipmi_user_list_get_enabled_users(), ipmi_user_list_get_fixed_users(), ipmi_user_list_get_max_user(), ipmi_user_list_get_user(), ipmi_user_list_get_user_count(), ipmi_cmdlang_s::location, ipmi_cmdlang_s::objstr, and ipmi_cmdlang_s::objstr_len. Referenced by mc_user_list(). 01590 { 01591 ipmi_cmd_info_t *cmd_info = cb_data; 01592 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); 01593 ipmi_user_t *user; 01594 char mc_name[IPMI_MC_NAME_LEN]; 01595 int i, j, k; 01596 char str[17]; 01597 unsigned int count; 01598 unsigned int channel; 01599 unsigned int val; 01600 int rv; 01601 01602 if (err) { 01603 cmdlang->err = err; 01604 cmdlang->errstr = "Error getting user info"; 01605 goto out_err; 01606 } 01607 01608 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name)); 01609 01610 count = ipmi_user_list_get_user_count(list); 01611 01612 rv = ipmi_user_list_get_channel(list, &channel); 01613 if (rv) { 01614 cmdlang->err = rv; 01615 cmdlang->errstr = "Error getting channel"; 01616 goto out_err; 01617 } 01618 01619 ipmi_cmdlang_lock(cmd_info); 01620 ipmi_cmdlang_out(cmd_info, "MC", mc_name); 01621 ipmi_cmdlang_out_int(cmd_info, "Channel", channel); 01622 rv = ipmi_user_list_get_max_user(list, &val); 01623 if (!rv) 01624 ipmi_cmdlang_out_int(cmd_info, "Max User", val); 01625 rv = ipmi_user_list_get_enabled_users(list, &val); 01626 if (!rv) 01627 ipmi_cmdlang_out_int(cmd_info, "Enabled Users", val); 01628 rv = ipmi_user_list_get_fixed_users(list, &val); 01629 if (!rv) 01630 ipmi_cmdlang_out_int(cmd_info, "Fixed Users", val); 01631 for (i=0; i<count; i++) { 01632 user = ipmi_user_list_get_user(list, i); 01633 if (!user) 01634 continue; 01635 ipmi_cmdlang_out(cmd_info, "User", NULL); 01636 ipmi_cmdlang_down(cmd_info); 01637 rv = ipmi_user_get_num(user, &val); 01638 if (!rv) 01639 ipmi_cmdlang_out_int(cmd_info, "Number", val); 01640 01641 val = 17; 01642 rv = ipmi_user_get_name(user, str, &val); 01643 if (!rv) { 01644 val = 1; 01645 for (j=15; j>=0; j--) { 01646 if (str[j] != '\0') 01647 break; 01648 } 01649 for (k=0; k<=j; k++) { 01650 if (! isprint(str[k])) { 01651 val = 0; 01652 break; 01653 } 01654 } 01655 if (val) 01656 ipmi_cmdlang_out(cmd_info, "String Name", str); 01657 else 01658 ipmi_cmdlang_out_binary(cmd_info, "Binary Name", str, 16); 01659 } 01660 rv = ipmi_user_get_link_auth_enabled(user, &val); 01661 if (!rv) 01662 ipmi_cmdlang_out_bool(cmd_info, "Link Auth Enabled", val); 01663 rv = ipmi_user_get_msg_auth_enabled(user, &val); 01664 if (!rv) 01665 ipmi_cmdlang_out_bool(cmd_info, "Msg Auth Enabled", val); 01666 rv = ipmi_user_get_access_cb_only(user, &val); 01667 if (!rv) 01668 ipmi_cmdlang_out_bool(cmd_info, "Access CB Only", val); 01669 rv = ipmi_user_get_privilege_limit(user, &val); 01670 if (!rv) 01671 ipmi_cmdlang_out(cmd_info, "Privilege Limit", 01672 ipmi_privilege_string(val)); 01673 rv = ipmi_user_get_session_limit(user, &val); 01674 if (!rv) 01675 ipmi_cmdlang_out_bool(cmd_info, "Session Limit", val); 01676 ipmi_cmdlang_up(cmd_info); 01677 ipmi_user_free(user); 01678 } 01679 ipmi_cmdlang_unlock(cmd_info); 01680 ipmi_cmdlang_cmd_info_put(cmd_info); 01681 return; 01682 01683 out_err: 01684 ipmi_mc_get_name(mc, cmdlang->objstr, cmdlang->objstr_len); 01685 cmdlang->location = "cmd_mc.c(got_users)"; 01686 ipmi_cmdlang_cmd_info_put(cmd_info); 01687 }
|
|
||||||||||||||||||||
|
Definition at line 2111 of file cmd_mc.c. References IPMI_ADDED, IPMI_CHANGED, ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_get_evinfo(), ipmi_cmdlang_global_err(), ipmi_cmdlang_out(), IPMI_DELETED, ipmi_mc_add_active_handler(), ipmi_mc_add_fully_up_handler(), ipmi_mc_get_name(), IPMI_MC_NAME_LEN, mc_active(), mc_dump(), and mc_fully_up(). Referenced by domain_change(). 02115 { 02116 char *errstr; 02117 int rv; 02118 ipmi_cmd_info_t *evi; 02119 char mc_name[IPMI_MC_NAME_LEN]; 02120 02121 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name)); 02122 02123 evi = ipmi_cmdlang_alloc_event_info(); 02124 if (!evi) { 02125 errstr = "Out of memory"; 02126 rv = ENOMEM; 02127 goto out_err; 02128 } 02129 02130 ipmi_cmdlang_out(evi, "Object Type", "MC"); 02131 ipmi_cmdlang_out(evi, "Name", mc_name); 02132 02133 switch (op) { 02134 case IPMI_ADDED: 02135 ipmi_cmdlang_out(evi, "Operation", "Add"); 02136 if (ipmi_cmdlang_get_evinfo()) 02137 mc_dump(mc, evi); 02138 rv = ipmi_mc_add_active_handler(mc, mc_active, NULL); 02139 if (rv) { 02140 errstr = "ipmi_mc_add_active_handler failed"; 02141 goto out_err; 02142 } 02143 rv = ipmi_mc_add_fully_up_handler(mc, mc_fully_up, NULL); 02144 if (rv) { 02145 errstr = "ipmi_mc_add_fully_up_handler failed"; 02146 goto out_err; 02147 } 02148 break; 02149 02150 case IPMI_DELETED: 02151 ipmi_cmdlang_out(evi, "Operation", "Delete"); 02152 break; 02153 02154 case IPMI_CHANGED: 02155 ipmi_cmdlang_out(evi, "Operation", "Change"); 02156 if (ipmi_cmdlang_get_evinfo()) 02157 mc_dump(mc, evi); 02158 break; 02159 } 02160 02161 ipmi_cmdlang_cmd_info_put(evi); 02162 return; 02163 02164 out_err: 02165 if (rv) { 02166 ipmi_cmdlang_global_err(mc_name, "cmd_mc.c(ipmi_cmdlang_mc_change)", 02167 errstr, rv); 02168 } 02169 if (evi) 02170 ipmi_cmdlang_cmd_info_put(evi); 02171 }
|
|
|
Definition at line 2286 of file cmd_mc.c. References CMDS_MC_LEN, and ipmi_cmdlang_reg_table(). Referenced by ipmi_cmdlang_init(). 02287 { 02288 return ipmi_cmdlang_reg_table(cmds_mc, CMDS_MC_LEN); 02289 }
|
|
||||||||||||||||
|
Definition at line 2046 of file cmd_mc.c. References ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_global_err(), ipmi_cmdlang_out(), ipmi_cmdlang_out_bool(), ipmi_mc_get_name(), and IPMI_MC_NAME_LEN. Referenced by ipmi_cmdlang_mc_change(), and mc_change(). 02047 { 02048 char *errstr; 02049 int rv; 02050 ipmi_cmd_info_t *evi; 02051 char mc_name[IPMI_MC_NAME_LEN]; 02052 02053 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name)); 02054 02055 evi = ipmi_cmdlang_alloc_event_info(); 02056 if (!evi) { 02057 rv = ENOMEM; 02058 errstr = "Out of memory"; 02059 goto out_err; 02060 } 02061 02062 ipmi_cmdlang_out(evi, "Object Type", "MC"); 02063 ipmi_cmdlang_out(evi, "Name", mc_name); 02064 ipmi_cmdlang_out(evi, "Operation", "Active Changed"); 02065 ipmi_cmdlang_out_bool(evi, "Active", active); 02066 02067 ipmi_cmdlang_cmd_info_put(evi); 02068 return; 02069 02070 out_err: 02071 ipmi_cmdlang_global_err(mc_name, 02072 "cmd_mc.c(mc_active)", 02073 errstr, rv); 02074 if (evi) 02075 ipmi_cmdlang_cmd_info_put(evi); 02076 }
|
|
||||||||||||
|
||||||||||||||||
|
Definition at line 857 of file cmd_mc.c. References event_log_s::cmd_info, cmdlang, ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, ipmi_cmdinfo_get_cmdlang(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_down(), ipmi_cmdlang_out(), ipmi_cmdlang_up(), ipmi_mc_get_name(), IPMI_MC_NAME_LEN, ipmi_mem_free(), and ipmi_cmdlang_s::location. Referenced by mc_set_event_log_enable(). 00858 { 00859 event_log_t *info = cb_data; 00860 ipmi_cmd_info_t *cmd_info = info->cmd_info; 00861 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); 00862 char mc_name[IPMI_MC_NAME_LEN]; 00863 00864 if (err) { 00865 cmdlang->err = err; 00866 cmdlang->errstr = "Error setting event log enable"; 00867 goto out_err; 00868 } 00869 00870 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name)); 00871 ipmi_cmdlang_out(cmd_info, "Event Log Enable Set", NULL); 00872 ipmi_cmdlang_down(cmd_info); 00873 ipmi_cmdlang_out(cmd_info, "MC", mc_name); 00874 ipmi_cmdlang_up(cmd_info); 00875 00876 out_err: 00877 if (cmdlang->err) { 00878 cmdlang->location = "cmd_mc.c(mc_event_log_enable_set)"; 00879 } 00880 ipmi_cmdlang_cmd_info_put(cmd_info); 00881 ipmi_mem_free(info); 00882 }
|
|
||||||||||||
|
Definition at line 2079 of file cmd_mc.c. References ipmi_cmdlang_alloc_event_info(), ipmi_cmdlang_cmd_info_put(), ipmi_cmdlang_global_err(), ipmi_cmdlang_out(), ipmi_mc_get_name(), and IPMI_MC_NAME_LEN. Referenced by ipmi_cmdlang_mc_change(). 02080 { 02081 char *errstr; 02082 int rv; 02083 ipmi_cmd_info_t *evi; 02084 char mc_name[IPMI_MC_NAME_LEN]; 02085 02086 ipmi_mc_get_name(mc, mc_name, sizeof(mc_name)); 02087 02088 evi = ipmi_cmdlang_alloc_event_info(); 02089 if (!evi) { 02090 rv = ENOMEM; 02091 errstr = "Out of memory"; 02092 goto out_err; 02093 } 02094 02095 ipmi_cmdlang_out(evi, "Object Type", "MC"); 02096 ipmi_cmdlang_out(evi, "Name", mc_name); 02097 ipmi_cmdlang_out(evi, "Operation", "Fully Up"); 02098 02099 ipmi_cmdlang_cmd_info_put(evi); 02100 return; 02101 02102 out_err: 02103 ipmi_cmdlang_global_err(mc_name, 02104 "cmd_mc.c(mc_fully_up)", 02105 errstr, rv); 02106 if (evi) 02107 ipmi_cmdlang_cmd_info_put(evi); 02108 }
|
|
||||||||||||
|
Definition at line 1161 of file cmd_mc.c. References get_chan_info_s::cmd_info, cmdlang, ipmi_cmdlang_s::err, ipmi_cmdlang_s::errstr, got_chan_access(), 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_mc_channel_get_access(), ipmi_mc_get_name(), ipmi_mem_alloc(), ipmi_mem_free(), IPMI_SET_DEST_NON_VOLATILE, IPMI_SET_DEST_VOLATILE, ipmi_cmdlang_s::location, ipmi_cmdlang_s::objstr, ipmi_cmdlang_s::objstr_len, and get_chan_info_s::type. 01162 { 01163 ipmi_cmd_info_t *cmd_info = cb_data; 01164 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info); 01165 int rv; 01166 int curr_arg = ipmi_cmdlang_get_curr_arg(cmd_info); 01167 int argc = ipmi_cmdlang_get_argc(cmd_info); 01168 char **argv = ipmi_cmdlang_get_argv(cmd_info); 01169 int channel; 01170 get_chan_info_t *present = NULL; 01171 get_chan_info_t *non_volatile = NULL; 01172 01173 01174 if ((argc - curr_arg) < 2) { 01175 /* Not enough parameters */ 01176 cmdlang->errstr = "Not enough parameters"; 01177 cmdlang->err = EINVAL; 01178 goto out_err; 01179 } 01180 01181 ipmi_cmdlang_get_int(argv[curr_arg], &channel, cmd_info); 01182 if (cmdlang->err) { 01183 cmdlang->errstr = "channel invalid"; 01184 goto out_err; 01185 } 01186 curr_arg++; 01187 01188 if (strcmp(argv[curr_arg], "non-volatile") == 0) { 01189 non_volatile = ipmi_mem_alloc(sizeof(*non_volatile)); 01190 if (!non_volatile) { 01191 cmdlang->err = ENOMEM; 01192 cmdlang->errstr = "Out of memory"; 01193 } 01194 } else if (strcmp(argv[curr_arg], "present") == 0) { 01195 present = ipmi_mem_alloc(sizeof(*present)); 01196 if (!present) { 01197 cmdlang->err = ENOMEM; 01198 cmdlang->errstr = "Out of memory"; 01199 } 01200 } else if (strcmp(argv[curr_arg], "both") == 0) { 01201 non_volatile = ipmi_mem_alloc(sizeof(*non_volatile)); 01202 if (!non_volatile) { 01203 cmdlang->err = ENOMEM; 01204 cmdlang->errstr = "Out of memory"; 01205 } 01206 present = ipmi_mem_alloc(sizeof(*present)); 01207 if (!present) { 01208 ipmi_mem_free(non_volatile); 01209 cmdlang->err = ENOMEM; 01210 cmdlang->errstr = "Out of memory"; 01211 } 01212 } else { 01213 cmdlang->err = EINVAL; 01214 cmdlang->errstr = "fetch type invalid"; 01215 goto out_err; 01216 } 01217 01218 if (present) { 01219 present->type = "present"; 01220 present->cmd_info = cmd_info; 01221 01222 ipmi_cmdlang_cmd_info_get(cmd_info); 01223 rv = ipmi_mc_channel_get_access(mc, channel, 01224 IPMI_SET_DEST_VOLATILE, 01225 got_chan_access, 01226 present); 01227 if (rv) { 01228 ipmi_cmdlang_cmd_info_put(cmd_info); 01229 cmdlang->err = rv; 01230 cmdlang->errstr = "Could not send command to get present value"; 01231 ipmi_mem_free(present); 01232 present = NULL; 01233 } 01234 } 01235 01236 if (non_volatile) { 01237 non_volatile->type = "non-volatile"; 01238 non_volatile->cmd_info = cmd_info; 01239 01240 ipmi_cmdlang_cmd_info_get(cmd_info); 01241 rv = ipmi_mc_channel_get_access(mc, channel, 01242 IPMI_SET_DEST_NON_VOLATILE, 01243 got_chan_access, 01244 non_volatile); 01245 if (rv) { 01246 ipmi_cmdlang_cmd_info_put(cmd_info); 01247 cmdlang->err = rv; 01248 cmdlang->errstr = "Could not send command to get non-volatile" 01249 " value"; 01250 ipmi_mem_free(non_volatile); 01251 non_volatile = NULL; 01252 } 01253 } 01254 01255 if ((present == NULL) && (non_volatile == NULL)) 01256 goto out_err; 01257 01258 return; 01259 01260 out_err: 01261 ipmi_mc_get_name(mc, cmdlang->objstr, cmdlang->objstr_len); 01262 cmdlang->location = "cmd_mc.c(mc_get_chan_access)"; 01263 }
|
|
||||||||||||