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