1 /*
2 * cmd_conn.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 <ctype.h>
37 #include <stdlib.h>
38 #include <stdio.h>
39 #include <OpenIPMI/ipmiif.h>
40 #include <OpenIPMI/ipmi_cmdlang.h>
41
42 static void
con_list_handler(ipmi_domain_t * domain,int conn,void * cb_data)43 con_list_handler(ipmi_domain_t *domain, int conn, void *cb_data)
44 {
45 ipmi_cmd_info_t *cmd_info = cb_data;
46 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
47 char conn_name[IPMI_DOMAIN_NAME_LEN+20];
48 int p;
49
50 if (cmdlang->err)
51 return;
52
53 p = ipmi_domain_get_name(domain, conn_name, sizeof(conn_name));
54 snprintf(conn_name+p, sizeof(conn_name)-p, ".%d", conn);
55 ipmi_cmdlang_out(cmd_info, "Name", conn_name);
56 }
57
58 static void
con_list(ipmi_domain_t * domain,void * cb_data)59 con_list(ipmi_domain_t *domain, void *cb_data)
60 {
61 ipmi_cmd_info_t *cmd_info = cb_data;
62 char domain_name[IPMI_DOMAIN_NAME_LEN];
63
64 ipmi_domain_get_name(domain, domain_name, sizeof(domain_name));
65 ipmi_cmdlang_out(cmd_info, "Domain", NULL);
66 ipmi_cmdlang_down(cmd_info);
67 ipmi_cmdlang_out(cmd_info, "Name", domain_name);
68 ipmi_cmdlang_out(cmd_info, "Connections", NULL);
69 ipmi_cmdlang_down(cmd_info);
70 ipmi_domain_iterate_connections(domain, con_list_handler, cb_data);
71 ipmi_cmdlang_up(cmd_info);
72 ipmi_cmdlang_up(cmd_info);
73 }
74
75 static void
con_info(ipmi_domain_t * domain,int conn,void * cb_data)76 con_info(ipmi_domain_t *domain, int conn, void *cb_data)
77 {
78 ipmi_cmd_info_t *cmd_info = cb_data;
79 char conn_name[IPMI_DOMAIN_NAME_LEN+20];
80 int p;
81 int rv;
82 unsigned int val;
83 unsigned int num;
84 unsigned int port;
85 char buf[256];
86 int len;
87
88 rv = ipmi_domain_is_connection_active(domain, conn, &val);
89 if (rv)
90 return;
91
92 p = ipmi_domain_get_name(domain, conn_name, sizeof(conn_name));
93 snprintf(conn_name+p, sizeof(conn_name)-p, ".%d", conn);
94
95 ipmi_cmdlang_out(cmd_info, "Connection", NULL);
96 ipmi_cmdlang_down(cmd_info);
97 ipmi_cmdlang_out(cmd_info, "Name", conn_name);
98 ipmi_cmdlang_out_bool(cmd_info, "Active", val);
99 rv = ipmi_domain_is_connection_up(domain, conn, &val);
100 if (!rv)
101 ipmi_cmdlang_out_bool(cmd_info, "Up", val);
102 rv = ipmi_domain_num_connection_ports(domain, conn, &num);
103 if (!rv) {
104 for (port=0; port<num; port++) {
105 rv = ipmi_domain_is_connection_port_up(domain,
106 conn,
107 port,
108 &val);
109 if (!rv) {
110 ipmi_cmdlang_out(cmd_info, "Port", NULL);
111 ipmi_cmdlang_down(cmd_info);
112 ipmi_cmdlang_out_int(cmd_info, "Number", port);
113 len = sizeof(buf);
114 rv = ipmi_domain_get_port_info(domain, conn, port, buf, &len);
115 if (!rv)
116 ipmi_cmdlang_out(cmd_info, "Info", buf);
117 ipmi_cmdlang_out_bool(cmd_info, "Up", val);
118 ipmi_cmdlang_up(cmd_info);
119 }
120 }
121 }
122 ipmi_cmdlang_up(cmd_info);
123 }
124
125 static void
con_activate(ipmi_domain_t * domain,int conn,void * cb_data)126 con_activate(ipmi_domain_t *domain, int conn, void *cb_data)
127 {
128 ipmi_cmd_info_t *cmd_info = cb_data;
129 ipmi_cmdlang_t *cmdlang = ipmi_cmdinfo_get_cmdlang(cmd_info);
130 int rv;
131 char conn_name[IPMI_DOMAIN_NAME_LEN+20];
132 int p;
133
134 rv = ipmi_domain_activate_connection(domain, conn);
135 if (rv) {
136 cmdlang->errstr = "Unable to activate connection";
137 cmdlang->err = rv;
138 ipmi_domain_get_name(domain, cmdlang->objstr,
139 cmdlang->objstr_len);
140 cmdlang->location = "cmd_conn.c(con_activate)";
141 }
142
143 p = ipmi_domain_get_name(domain, conn_name, sizeof(conn_name));
144 snprintf(conn_name+p, sizeof(conn_name)-p, ".%d", conn);
145 ipmi_cmdlang_out(cmd_info, "Connection activated", conn_name);
146 }
147
148 static ipmi_cmdlang_cmd_t *conn_cmds;
149
150 static ipmi_cmdlang_init_t cmds_conn[] =
151 {
152 { "con", NULL,
153 "- Commands dealing with connections",
154 NULL, NULL, &conn_cmds},
155 { "list", &conn_cmds,
156 "<domain> - List all the connection in the domain",
157 ipmi_cmdlang_domain_handler, con_list, NULL },
158 { "info", &conn_cmds,
159 "<connection> - Dump information about a connection",
160 ipmi_cmdlang_connection_handler, con_info, NULL },
161 { "activate", &conn_cmds,
162 "<connection> - Dump information about a connection",
163 ipmi_cmdlang_connection_handler, con_activate, NULL },
164 };
165 #define CMDS_CONN_LEN (sizeof(cmds_conn)/sizeof(ipmi_cmdlang_init_t))
166
167 int
ipmi_cmdlang_con_init(os_handler_t * os_hnd)168 ipmi_cmdlang_con_init(os_handler_t *os_hnd)
169 {
170 return ipmi_cmdlang_reg_table(cmds_conn, CMDS_CONN_LEN);
171 }
172