4
* A command interpreter for OpenIPMI
6
* Author: MontaVista Software, Inc.
7
* Corey Minyard <minyard@mvista.com>
10
* Copyright 2004 MontaVista Software Inc.
12
* This program is free software; you can redistribute it and/or
13
* modify it under the terms of the GNU Lesser General Public License
14
* as published by the Free Software Foundation; either version 2 of
15
* the License, or (at your option) any later version.
18
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
19
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
20
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
23
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
24
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
26
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
27
* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
* You should have received a copy of the GNU Lesser General Public
30
* License along with this program; if not, write to the Free
31
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
36
#include <OpenIPMI/ipmi_bits.h>
37
#include <OpenIPMI/ipmi_fru.h>
38
#include <OpenIPMI/ipmi_cmdlang.h>
40
/* Internal includes, do not use in your programs */
41
#include <OpenIPMI/internal/ipmi_malloc.h>
44
fru_out_data(ipmi_cmd_info_t *cmd_info, unsigned char type,
45
char *buf, unsigned int len)
47
if (type == IPMI_BINARY_STR) {
48
ipmi_cmdlang_out(cmd_info, "Type", "binary");
49
ipmi_cmdlang_out_binary(cmd_info, "Data", buf, len);
50
} else if (type == IPMI_UNICODE_STR) {
51
ipmi_cmdlang_out(cmd_info, "Type", "unicode");
52
ipmi_cmdlang_out_unicode(cmd_info, "Data", buf, len);
53
} else if (type == IPMI_ASCII_STR) {
54
ipmi_cmdlang_out(cmd_info, "Type", "ascii");
55
ipmi_cmdlang_out(cmd_info, "Data", buf);
57
ipmi_cmdlang_out(cmd_info, "Type", "unknown");
62
ipmi_cmdlang_dump_fru_info(ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru)
64
ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
69
enum ipmi_fru_data_type_e dtype;
73
unsigned int data_len;
74
unsigned int num_multi;
75
char fru_name[IPMI_FRU_NAME_LEN];
77
ipmi_cmdlang_out(cmd_info, "FRU", NULL);
78
ipmi_cmdlang_down(cmd_info);
79
ipmi_fru_get_name(fru, fru_name, sizeof(fru_name));
80
ipmi_cmdlang_out(cmd_info, "Name", fru_name);
86
rv = ipmi_fru_get(fru, i, &name, &num, &dtype, &intval, &time,
90
else if ((rv == ENOSYS) || (rv == E2BIG)) {
96
cmdlang->errstr = strerror(rv);
100
ipmi_cmdlang_out(cmd_info, "Record", NULL);
101
ipmi_cmdlang_down(cmd_info);
102
ipmi_cmdlang_out(cmd_info, "Name", name);
104
ipmi_cmdlang_out_int(cmd_info, "Number", onum);
114
case IPMI_FRU_DATA_INT:
115
ipmi_cmdlang_out(cmd_info, "Type", "integer");
116
ipmi_cmdlang_out_int(cmd_info, "Data", intval);
119
case IPMI_FRU_DATA_TIME:
120
ipmi_cmdlang_out(cmd_info, "Type", "integer");
121
ipmi_cmdlang_out_long(cmd_info, "Data", (long) time);
124
case IPMI_FRU_DATA_BINARY:
125
ipmi_cmdlang_out(cmd_info, "Type", "binary");
126
ipmi_cmdlang_out_binary(cmd_info, "Data", data, data_len);
129
case IPMI_FRU_DATA_UNICODE:
130
ipmi_cmdlang_out(cmd_info, "Type", "unicode");
131
ipmi_cmdlang_out_unicode(cmd_info, "Data", data, data_len);
134
case IPMI_FRU_DATA_ASCII:
135
ipmi_cmdlang_out(cmd_info, "Type", "ascii");
136
ipmi_cmdlang_out(cmd_info, "Data", data);
140
ipmi_cmdlang_out(cmd_info, "Type", "unknown");
143
ipmi_cmdlang_up(cmd_info);
146
ipmi_fru_data_free(data);
149
num_multi = ipmi_fru_get_num_multi_records(fru);
150
for (i=0; i<num_multi; i++) {
151
unsigned char type, ver;
155
rv = ipmi_fru_get_multi_record_type(fru, i, &type);
157
rv = ipmi_fru_get_multi_record_format_version(fru, i, &ver);
159
rv = ipmi_fru_get_multi_record_data_len(fru, i, &len);
161
data = ipmi_mem_alloc(len);
163
cmdlang->err = ENOMEM;
164
cmdlang->errstr = "Out of memory";
167
rv = ipmi_fru_get_multi_record_data(fru, i, data, &len);
174
cmdlang->errstr = "Error getting FRU info";
178
ipmi_cmdlang_out(cmd_info, "Multi-record", NULL);
179
ipmi_cmdlang_down(cmd_info);
180
ipmi_cmdlang_out_int(cmd_info, "Type", type);
181
ipmi_cmdlang_out_int(cmd_info, "Number", i);
182
fru_out_data(cmd_info, IPMI_BINARY_STR, data, len);
183
ipmi_cmdlang_up(cmd_info);
188
ipmi_cmdlang_up(cmd_info);
190
cmdlang->location = "cmd_domain.c(dump_fru_info)";