~ubuntu-branches/ubuntu/intrepid/openipmi/intrepid

« back to all changes in this revision

Viewing changes to cmdlang/out_fru.c

  • Committer: Bazaar Package Importer
  • Author(s): Noèl Köthe
  • Date: 2005-07-04 21:29:17 UTC
  • Revision ID: james.westby@ubuntu.com-20050704212917-igddk5jawjmhrlay
Tags: upstream-2.0.1
Import upstream version 2.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * out_fru.c
 
3
 *
 
4
 * A command interpreter for OpenIPMI
 
5
 *
 
6
 * Author: MontaVista Software, Inc.
 
7
 *         Corey Minyard <minyard@mvista.com>
 
8
 *         source@mvista.com
 
9
 *
 
10
 * Copyright 2004 MontaVista Software Inc.
 
11
 *
 
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.
 
16
 *
 
17
 *
 
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.
 
28
 *
 
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.
 
32
 */
 
33
 
 
34
#include <errno.h>
 
35
#include <string.h>
 
36
#include <OpenIPMI/ipmi_bits.h>
 
37
#include <OpenIPMI/ipmi_fru.h>
 
38
#include <OpenIPMI/ipmi_cmdlang.h>
 
39
 
 
40
/* Internal includes, do not use in your programs */
 
41
#include <OpenIPMI/internal/ipmi_malloc.h>
 
42
 
 
43
static void
 
44
fru_out_data(ipmi_cmd_info_t *cmd_info, unsigned char type,
 
45
             char *buf, unsigned int len)
 
46
{
 
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);
 
56
    } else {
 
57
        ipmi_cmdlang_out(cmd_info, "Type", "unknown");
 
58
    }
 
59
}
 
60
 
 
61
void
 
62
ipmi_cmdlang_dump_fru_info(ipmi_cmd_info_t *cmd_info, ipmi_fru_t *fru)
 
63
{
 
64
    ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
 
65
    int                       rv;
 
66
    int                       i;
 
67
    int                       num, onum;
 
68
    char                      *name;
 
69
    enum ipmi_fru_data_type_e dtype;
 
70
    int                       intval;
 
71
    time_t                    time;
 
72
    char                      *data;
 
73
    unsigned int              data_len;
 
74
    unsigned int              num_multi;
 
75
    char                      fru_name[IPMI_FRU_NAME_LEN];
 
76
 
 
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);
 
81
 
 
82
    num = 0;
 
83
    for (i=0; ;) {
 
84
        onum = num;
 
85
        data = NULL;
 
86
        rv = ipmi_fru_get(fru, i, &name, &num, &dtype, &intval, &time,
 
87
                          &data, &data_len);
 
88
        if (rv == EINVAL)
 
89
            break;
 
90
        else if ((rv == ENOSYS) || (rv == E2BIG)) {
 
91
            i++;
 
92
            num = 0;
 
93
            continue;
 
94
        } else if (rv) {
 
95
            cmdlang->err = rv;
 
96
            cmdlang->errstr = strerror(rv);
 
97
            goto out_err;
 
98
        }
 
99
 
 
100
        ipmi_cmdlang_out(cmd_info, "Record", NULL);
 
101
        ipmi_cmdlang_down(cmd_info);
 
102
        ipmi_cmdlang_out(cmd_info, "Name", name);
 
103
        if (num != onum) {
 
104
            ipmi_cmdlang_out_int(cmd_info, "Number", onum);
 
105
            if (num == -1) {
 
106
                i++;
 
107
                num = 0;
 
108
            }
 
109
        } else {
 
110
            i++;
 
111
            num = 0;
 
112
        }
 
113
        switch(dtype) {
 
114
        case IPMI_FRU_DATA_INT:
 
115
            ipmi_cmdlang_out(cmd_info, "Type", "integer");
 
116
            ipmi_cmdlang_out_int(cmd_info, "Data", intval);
 
117
            break;
 
118
 
 
119
        case IPMI_FRU_DATA_TIME:
 
120
            ipmi_cmdlang_out(cmd_info, "Type", "integer");
 
121
            ipmi_cmdlang_out_long(cmd_info, "Data", (long) time);
 
122
            break;
 
123
 
 
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);
 
127
            break;
 
128
 
 
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);
 
132
            break;
 
133
 
 
134
        case IPMI_FRU_DATA_ASCII:
 
135
            ipmi_cmdlang_out(cmd_info, "Type", "ascii");
 
136
            ipmi_cmdlang_out(cmd_info, "Data", data);
 
137
            break;
 
138
 
 
139
        default:
 
140
            ipmi_cmdlang_out(cmd_info, "Type", "unknown");
 
141
            break;
 
142
        }
 
143
        ipmi_cmdlang_up(cmd_info);
 
144
 
 
145
        if (data)
 
146
            ipmi_fru_data_free(data);
 
147
    }
 
148
 
 
149
    num_multi = ipmi_fru_get_num_multi_records(fru);
 
150
    for (i=0; i<num_multi; i++) {
 
151
        unsigned char type, ver;
 
152
        unsigned int  len;
 
153
        char          *data = NULL;
 
154
 
 
155
        rv = ipmi_fru_get_multi_record_type(fru, i, &type);
 
156
        if (!rv)
 
157
            rv = ipmi_fru_get_multi_record_format_version(fru, i, &ver);
 
158
        if (!rv)
 
159
            rv = ipmi_fru_get_multi_record_data_len(fru, i, &len);
 
160
        if (!rv) {
 
161
            data = ipmi_mem_alloc(len);
 
162
            if (!data) {
 
163
                cmdlang->err = ENOMEM;
 
164
                cmdlang->errstr = "Out of memory";
 
165
                goto out_err;
 
166
            }
 
167
            rv = ipmi_fru_get_multi_record_data(fru, i, data, &len);
 
168
            if (rv)
 
169
                ipmi_mem_free(data);
 
170
        }
 
171
 
 
172
        if (rv) {
 
173
            cmdlang->err = rv;
 
174
            cmdlang->errstr = "Error getting FRU info";
 
175
            goto out_err;
 
176
        }
 
177
 
 
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);
 
184
        ipmi_mem_free(data);
 
185
    }
 
186
 
 
187
 out_err:
 
188
    ipmi_cmdlang_up(cmd_info);
 
189
    if (cmdlang->err)
 
190
        cmdlang->location = "cmd_domain.c(dump_fru_info)";
 
191
}