00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <errno.h>
00035 #include <string.h>
00036 #include <values.h>
00037 #include <OpenIPMI/ipmi_bits.h>
00038 #include <OpenIPMI/ipmi_fru.h>
00039 #include <OpenIPMI/ipmi_cmdlang.h>
00040
00041
00042 #include <OpenIPMI/internal/ipmi_malloc.h>
00043
00044 static int
00045 traverse_fru_node_tree(ipmi_cmd_info_t *cmd_info,
00046 ipmi_fru_node_t *node,
00047 int length)
00048 {
00049 const char *name;
00050 unsigned int i;
00051 enum ipmi_fru_data_type_e dtype;
00052 int intval, rv;
00053 time_t time;
00054 double floatval;
00055 char *data;
00056 unsigned int data_len;
00057 ipmi_fru_node_t *sub_node;
00058
00059 for (i=0; i<length; i++) {
00060 data = NULL;
00061 rv = ipmi_fru_node_get_field(node, i, &name, &dtype, &intval, &time,
00062 &floatval, &data, &data_len, &sub_node);
00063 if (rv == EINVAL)
00064 break;
00065 else if (rv)
00066 continue;
00067
00068 if (name) {
00069 ipmi_cmdlang_out(cmd_info, "Field", NULL);
00070 ipmi_cmdlang_down(cmd_info);
00071 ipmi_cmdlang_out(cmd_info, "Name", name);
00072 } else {
00073 ipmi_cmdlang_out(cmd_info, "Element", NULL);
00074 ipmi_cmdlang_down(cmd_info);
00075 ipmi_cmdlang_out_int(cmd_info, "Index", i);
00076 }
00077
00078 switch (dtype) {
00079 case IPMI_FRU_DATA_INT:
00080 ipmi_cmdlang_out(cmd_info, "Type", "integer");
00081 ipmi_cmdlang_out_int(cmd_info, "Data", intval);
00082 break;
00083
00084 case IPMI_FRU_DATA_TIME:
00085 ipmi_cmdlang_out(cmd_info, "Type", "integer");
00086 ipmi_cmdlang_out_long(cmd_info, "Data", (long) time);
00087 break;
00088
00089 case IPMI_FRU_DATA_BINARY:
00090 ipmi_cmdlang_out(cmd_info, "Type", "binary");
00091 ipmi_cmdlang_out_binary(cmd_info, "Data", data, data_len);
00092 break;
00093
00094 case IPMI_FRU_DATA_UNICODE:
00095 ipmi_cmdlang_out(cmd_info, "Type", "unicode");
00096 ipmi_cmdlang_out_unicode(cmd_info, "Data", data, data_len);
00097 break;
00098
00099 case IPMI_FRU_DATA_ASCII:
00100 ipmi_cmdlang_out(cmd_info, "Type", "ascii");
00101 ipmi_cmdlang_out(cmd_info, "Data", data);
00102 break;
00103
00104 case IPMI_FRU_DATA_BOOLEAN:
00105 ipmi_cmdlang_out(cmd_info, "Type", "boolean");
00106 ipmi_cmdlang_out_bool(cmd_info, "Data", intval);
00107 break;
00108
00109 case IPMI_FRU_DATA_FLOAT:
00110 ipmi_cmdlang_out(cmd_info, "Type", "float");
00111 ipmi_cmdlang_out_double(cmd_info, "Data", floatval);
00112 break;
00113
00114 case IPMI_FRU_DATA_SUB_NODE:
00115 if (intval == -1)
00116 ipmi_cmdlang_out(cmd_info, "Record", NULL);
00117 else
00118 ipmi_cmdlang_out(cmd_info, "Array", NULL);
00119 ipmi_cmdlang_down(cmd_info);
00120 if (intval != -1)
00121 ipmi_cmdlang_out_int(cmd_info, "Element Count", intval);
00122 else
00123 intval = MAXINT;
00124 traverse_fru_node_tree(cmd_info, sub_node, MAXINT);
00125 ipmi_cmdlang_up(cmd_info);
00126 break;
00127
00128 default:
00129 ipmi_cmdlang_out(cmd_info, "Type", "unknown");
00130 break;
00131 }
00132
00133 ipmi_cmdlang_up(cmd_info);
00134 if (data)
00135 ipmi_fru_data_free(data);
00136 }
00137
00138 ipmi_fru_put_node(node);
00139
00140 return 0;
00141 }
00142
00143 void
00144 ipmi_cmdlang_dump_fru_info(ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru)
00145 {
00146 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
00147 int rv;
00148 char fru_name[IPMI_FRU_NAME_LEN];
00149 ipmi_fru_node_t *node;
00150 const char *type;
00151
00152 ipmi_cmdlang_out(cmd_info, "FRU", NULL);
00153 ipmi_cmdlang_down(cmd_info);
00154 ipmi_fru_get_name(fru, fru_name, sizeof(fru_name));
00155 ipmi_cmdlang_out(cmd_info, "Name", fru_name);
00156
00157 rv = ipmi_fru_get_root_node(fru, &type, &node);
00158 if (!rv) {
00159 ipmi_cmdlang_out(cmd_info, "Type", type);
00160 rv = traverse_fru_node_tree(cmd_info, node, MAXINT);
00161 if (rv)
00162 cmdlang->errstr = "Error traversing FRU node tree";
00163 } else {
00164 cmdlang->errstr = "Error getting root node of FRU";
00165 }
00166
00167 ipmi_cmdlang_up(cmd_info);
00168 if (rv) {
00169 cmdlang->err = rv;
00170 cmdlang->location = "cmd_domain.c(dump_fru_info)";
00171 }
00172 }