|
Packit Service |
ed0f68 |
/*
|
|
Packit Service |
ed0f68 |
* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
|
|
Packit Service |
ed0f68 |
*
|
|
Packit Service |
ed0f68 |
* Redistribution and use in source and binary forms, with or without
|
|
Packit Service |
ed0f68 |
* modification, are permitted provided that the following conditions
|
|
Packit Service |
ed0f68 |
* are met:
|
|
Packit Service |
ed0f68 |
*
|
|
Packit Service |
ed0f68 |
* Redistribution of source code must retain the above copyright
|
|
Packit Service |
ed0f68 |
* notice, this list of conditions and the following disclaimer.
|
|
Packit Service |
ed0f68 |
*
|
|
Packit Service |
ed0f68 |
* Redistribution in binary form must reproduce the above copyright
|
|
Packit Service |
ed0f68 |
* notice, this list of conditions and the following disclaimer in the
|
|
Packit Service |
ed0f68 |
* documentation and/or other materials provided with the distribution.
|
|
Packit Service |
ed0f68 |
*
|
|
Packit Service |
ed0f68 |
* Neither the name of Sun Microsystems, Inc. or the names of
|
|
Packit Service |
ed0f68 |
* contributors may be used to endorse or promote products derived
|
|
Packit Service |
ed0f68 |
* from this software without specific prior written permission.
|
|
Packit Service |
ed0f68 |
*
|
|
Packit Service |
ed0f68 |
* This software is provided "AS IS," without a warranty of any kind.
|
|
Packit Service |
ed0f68 |
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
|
|
Packit Service |
ed0f68 |
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
|
|
Packit Service |
ed0f68 |
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
|
|
Packit Service |
ed0f68 |
* SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
|
|
Packit Service |
ed0f68 |
* FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
|
Packit Service |
ed0f68 |
* OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
|
|
Packit Service |
ed0f68 |
* SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
|
|
Packit Service |
ed0f68 |
* OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
|
|
Packit Service |
ed0f68 |
* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
|
|
Packit Service |
ed0f68 |
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
|
|
Packit Service |
ed0f68 |
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
Packit Service |
ed0f68 |
*/
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
#include <stdlib.h>
|
|
Packit Service |
ed0f68 |
#include <stdio.h>
|
|
Packit Service |
ed0f68 |
#include <string.h>
|
|
Packit Service |
ed0f68 |
#include <sys/types.h>
|
|
Packit Service |
ed0f68 |
#include <sys/socket.h>
|
|
Packit Service |
ed0f68 |
#include <netinet/in.h>
|
|
Packit Service |
ed0f68 |
#include <arpa/inet.h>
|
|
Packit Service |
ed0f68 |
#include <errno.h>
|
|
Packit Service |
ed0f68 |
#include <unistd.h>
|
|
Packit Service |
ed0f68 |
#include <signal.h>
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
#include <ipmitool/ipmi.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/ipmi_intf.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/helper.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/log.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/ipmi_lanp.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/ipmi_session.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/ipmi_strings.h>
|
|
Packit Service |
ed0f68 |
#include <ipmitool/bswap.h>
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
typedef enum {
|
|
Packit Service |
ed0f68 |
IPMI_SESSION_REQUEST_CURRENT = 0,
|
|
Packit Service |
ed0f68 |
IPMI_SESSION_REQUEST_ALL,
|
|
Packit Service |
ed0f68 |
IPMI_SESSION_REQUEST_BY_ID,
|
|
Packit Service |
ed0f68 |
IPMI_SESSION_REQUEST_BY_HANDLE
|
|
Packit Service |
ed0f68 |
} Ipmi_Session_Request_Type;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
/*
|
|
Packit Service |
ed0f68 |
* print_session_info_csv
|
|
Packit Service |
ed0f68 |
*/
|
|
Packit Service |
ed0f68 |
static void
|
|
Packit Service |
ed0f68 |
print_session_info_csv(const struct get_session_info_rsp * session_info,
|
|
Packit Service |
ed0f68 |
int data_len)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
char buffer[18];
|
|
Packit Service |
ed0f68 |
uint16_t console_port_tmp;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("%d", session_info->session_handle);
|
|
Packit Service |
ed0f68 |
printf(",%d", session_info->session_slot_count);
|
|
Packit Service |
ed0f68 |
printf(",%d", session_info->active_session_count);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (data_len == 3)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* There is no session data here*/
|
|
Packit Service |
ed0f68 |
printf("\n");
|
|
Packit Service |
ed0f68 |
return;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf(",%d", session_info->user_id);
|
|
Packit Service |
ed0f68 |
printf(",%s", val2str(session_info->privilege_level, ipmi_privlvl_vals));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf(",%s", session_info->auxiliary_data?
|
|
Packit Service |
ed0f68 |
"IPMIv2/RMCP+" : "IPMIv1.5");
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf(",0x%02x", session_info->channel_number);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (data_len == 18)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* We have 802.3 LAN data */
|
|
Packit Service |
ed0f68 |
printf(",%s",
|
|
Packit Service |
ed0f68 |
inet_ntop(AF_INET,
|
|
Packit Service |
ed0f68 |
&(session_info->channel_data.lan_data.console_ip),
|
|
Packit Service |
ed0f68 |
buffer,
|
|
Packit Service |
ed0f68 |
16));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf(",%s", mac2str(
|
|
Packit Service |
ed0f68 |
session_info->channel_data.lan_data.console_mac));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
console_port_tmp = session_info->channel_data.lan_data.console_port;
|
|
Packit Service |
ed0f68 |
#if WORDS_BIGENDIAN
|
|
Packit Service |
ed0f68 |
console_port_tmp = BSWAP_16(console_port_tmp);
|
|
Packit Service |
ed0f68 |
#endif
|
|
Packit Service |
ed0f68 |
printf(",%d", console_port_tmp);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
else if ((data_len == 12) || (data_len == 14))
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* Channel async serial/modem */
|
|
Packit Service |
ed0f68 |
printf(",%s",
|
|
Packit Service |
ed0f68 |
val2str(session_info->channel_data.modem_data.session_channel_activity_type,
|
|
Packit Service |
ed0f68 |
ipmi_channel_activity_type_vals));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf(",%d",
|
|
Packit Service |
ed0f68 |
session_info->channel_data.modem_data.destination_selector);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf(",%s",
|
|
Packit Service |
ed0f68 |
inet_ntop(AF_INET,
|
|
Packit Service |
ed0f68 |
&(session_info->channel_data.modem_data.console_ip),
|
|
Packit Service |
ed0f68 |
buffer,
|
|
Packit Service |
ed0f68 |
16));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (data_len == 14)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* Connection is PPP */
|
|
Packit Service |
ed0f68 |
console_port_tmp = session_info->channel_data.lan_data.console_port;
|
|
Packit Service |
ed0f68 |
#if WORDS_BIGENDIAN
|
|
Packit Service |
ed0f68 |
console_port_tmp = BSWAP_16(console_port_tmp);
|
|
Packit Service |
ed0f68 |
#endif
|
|
Packit Service |
ed0f68 |
printf(",%d", console_port_tmp);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("\n");
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
/*
|
|
Packit Service |
ed0f68 |
* print_session_info_verbose
|
|
Packit Service |
ed0f68 |
*/
|
|
Packit Service |
ed0f68 |
static void
|
|
Packit Service |
ed0f68 |
print_session_info_verbose(const struct get_session_info_rsp * session_info,
|
|
Packit Service |
ed0f68 |
int data_len)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
char buffer[18];
|
|
Packit Service |
ed0f68 |
uint16_t console_port_tmp;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("session handle : %d\n", session_info->session_handle);
|
|
Packit Service |
ed0f68 |
printf("slot count : %d\n", session_info->session_slot_count);
|
|
Packit Service |
ed0f68 |
printf("active sessions : %d\n", session_info->active_session_count);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (data_len == 3)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* There is no session data here */
|
|
Packit Service |
ed0f68 |
printf("\n");
|
|
Packit Service |
ed0f68 |
return;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("user id : %d\n", session_info->user_id);
|
|
Packit Service |
ed0f68 |
printf("privilege level : %s\n",
|
|
Packit Service |
ed0f68 |
val2str(session_info->privilege_level, ipmi_privlvl_vals));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("session type : %s\n", session_info->auxiliary_data?
|
|
Packit Service |
ed0f68 |
"IPMIv2/RMCP+" : "IPMIv1.5");
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("channel number : 0x%02x\n", session_info->channel_number);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (data_len == 18)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* We have 802.3 LAN data */
|
|
Packit Service |
ed0f68 |
printf("console ip : %s\n",
|
|
Packit Service |
ed0f68 |
inet_ntop(AF_INET,
|
|
Packit Service |
ed0f68 |
&(session_info->channel_data.lan_data.console_ip),
|
|
Packit Service |
ed0f68 |
buffer,
|
|
Packit Service |
ed0f68 |
16));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("console mac : %s\n", mac2str(
|
|
Packit Service |
ed0f68 |
session_info->channel_data.lan_data.console_mac));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
console_port_tmp = session_info->channel_data.lan_data.console_port;
|
|
Packit Service |
ed0f68 |
#if WORDS_BIGENDIAN
|
|
Packit Service |
ed0f68 |
console_port_tmp = BSWAP_16(console_port_tmp);
|
|
Packit Service |
ed0f68 |
#endif
|
|
Packit Service |
ed0f68 |
printf("console port : %d\n", console_port_tmp);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
else if ((data_len == 12) || (data_len == 14))
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* Channel async serial/modem */
|
|
Packit Service |
ed0f68 |
printf("Session/Channel Activity Type : %s\n",
|
|
Packit Service |
ed0f68 |
val2str(session_info->channel_data.modem_data.session_channel_activity_type,
|
|
Packit Service |
ed0f68 |
ipmi_channel_activity_type_vals));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("Destination selector : %d\n",
|
|
Packit Service |
ed0f68 |
session_info->channel_data.modem_data.destination_selector);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("console ip : %s\n",
|
|
Packit Service |
ed0f68 |
inet_ntop(AF_INET,
|
|
Packit Service |
ed0f68 |
&(session_info->channel_data.modem_data.console_ip),
|
|
Packit Service |
ed0f68 |
buffer,
|
|
Packit Service |
ed0f68 |
16));
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (data_len == 14)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
/* Connection is PPP */
|
|
Packit Service |
ed0f68 |
console_port_tmp = session_info->channel_data.lan_data.console_port;
|
|
Packit Service |
ed0f68 |
#if WORDS_BIGENDIAN
|
|
Packit Service |
ed0f68 |
console_port_tmp = BSWAP_16(console_port_tmp);
|
|
Packit Service |
ed0f68 |
#endif
|
|
Packit Service |
ed0f68 |
printf("console port : %d\n", console_port_tmp);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
printf("\n");
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
static void print_session_info(const struct get_session_info_rsp * session_info,
|
|
Packit Service |
ed0f68 |
int data_len)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
if (csv_output)
|
|
Packit Service |
ed0f68 |
print_session_info_csv(session_info, data_len);
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
print_session_info_verbose(session_info, data_len);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
/*
|
|
Packit Service |
ed0f68 |
* ipmi_get_session_info
|
|
Packit Service |
ed0f68 |
*
|
|
Packit Service |
ed0f68 |
* returns 0 on success
|
|
Packit Service |
ed0f68 |
* -1 on error
|
|
Packit Service |
ed0f68 |
*/
|
|
Packit Service |
ed0f68 |
int
|
|
Packit Service |
ed0f68 |
ipmi_get_session_info(struct ipmi_intf * intf,
|
|
Packit Service |
ed0f68 |
Ipmi_Session_Request_Type session_request_type,
|
|
Packit Service |
ed0f68 |
uint32_t id_or_handle)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
int i, retval = 0;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
struct ipmi_rs * rsp;
|
|
Packit Service |
ed0f68 |
struct ipmi_rq req;
|
|
Packit Service |
ed0f68 |
uint8_t rqdata[5]; // max length of the variable length request
|
|
Packit Service |
ed0f68 |
struct get_session_info_rsp session_info;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
memset(&req, 0, sizeof(req));
|
|
Packit Service |
ed0f68 |
memset(&session_info, 0, sizeof(session_info));
|
|
Packit Service |
ed0f68 |
req.msg.netfn = IPMI_NETFN_APP; // 0x06
|
|
Packit Service |
ed0f68 |
req.msg.cmd = IPMI_GET_SESSION_INFO; // 0x3D
|
|
Packit Service |
ed0f68 |
req.msg.data = rqdata;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
switch (session_request_type)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_CURRENT:
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_BY_ID:
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_BY_HANDLE:
|
|
Packit Service |
ed0f68 |
switch (session_request_type)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_CURRENT:
|
|
Packit Service |
ed0f68 |
rqdata[0] = 0x00;
|
|
Packit Service |
ed0f68 |
req.msg.data_len = 1;
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_BY_ID:
|
|
Packit Service |
ed0f68 |
rqdata[0] = 0xFF;
|
|
Packit Service |
ed0f68 |
rqdata[1] = id_or_handle & 0x000000FF;
|
|
Packit Service |
ed0f68 |
rqdata[2] = (id_or_handle >> 8) & 0x000000FF;
|
|
Packit Service |
ed0f68 |
rqdata[3] = (id_or_handle >> 16) & 0x000000FF;
|
|
Packit Service |
ed0f68 |
rqdata[4] = (id_or_handle >> 24) & 0x000000FF;
|
|
Packit Service |
ed0f68 |
req.msg.data_len = 5;
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_BY_HANDLE:
|
|
Packit Service |
ed0f68 |
rqdata[0] = 0xFE;
|
|
Packit Service |
ed0f68 |
rqdata[1] = (uint8_t)id_or_handle;
|
|
Packit Service |
ed0f68 |
req.msg.data_len = 2;
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_ALL:
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
rsp = intf->sendrecv(intf, &req;;
|
|
Packit Service |
ed0f68 |
if (rsp == NULL)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Get Session Info command failed");
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else if (rsp->ccode > 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Get Session Info command failed: %s",
|
|
Packit Service |
ed0f68 |
val2str(rsp->ccode, completion_code_vals));
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (retval < 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
if ((session_request_type == IPMI_SESSION_REQUEST_CURRENT) &&
|
|
Packit Service |
ed0f68 |
(strncmp(intf->name, "lan", 3) != 0))
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "It is likely that the channel in use "
|
|
Packit Service |
ed0f68 |
"does not support sessions");
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
memcpy(&session_info, rsp->data, rsp->data_len);
|
|
Packit Service |
ed0f68 |
print_session_info(&session_info, rsp->data_len);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
case IPMI_SESSION_REQUEST_ALL:
|
|
Packit Service |
ed0f68 |
req.msg.data_len = 1;
|
|
Packit Service |
ed0f68 |
i = 1;
|
|
Packit Service |
ed0f68 |
do
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
rqdata[0] = i++;
|
|
Packit Service |
ed0f68 |
rsp = intf->sendrecv(intf, &req;;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (rsp == NULL)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Get Session Info command failed");
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else if (rsp->ccode > 0 && rsp->ccode != 0xCC && rsp->ccode != 0xCB)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Get Session Info command failed: %s",
|
|
Packit Service |
ed0f68 |
val2str(rsp->ccode, completion_code_vals));
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else if (rsp->data_len < 3)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
memcpy(&session_info, rsp->data, rsp->data_len);
|
|
Packit Service |
ed0f68 |
print_session_info(&session_info, rsp->data_len);
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
} while (i <= session_info.session_slot_count);
|
|
Packit Service |
ed0f68 |
break;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
return retval;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
static void
|
|
Packit Service |
ed0f68 |
printf_session_usage(void)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_NOTICE, "Session Commands: info <active | all | id 0xnnnnnnnn | handle 0xnn>");
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
int
|
|
Packit Service |
ed0f68 |
ipmi_session_main(struct ipmi_intf * intf, int argc, char ** argv)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
int retval = 0;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (argc == 0 || strncmp(argv[0], "help", 4) == 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else if (strncmp(argv[0], "info", 4) == 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if ((argc < 2) || strncmp(argv[1], "help", 4) == 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
Ipmi_Session_Request_Type session_request_type = 0;
|
|
Packit Service |
ed0f68 |
uint32_t id_or_handle = 0;
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (strncmp(argv[1], "active", 6) == 0)
|
|
Packit Service |
ed0f68 |
session_request_type = IPMI_SESSION_REQUEST_CURRENT;
|
|
Packit Service |
ed0f68 |
else if (strncmp(argv[1], "all", 3) == 0)
|
|
Packit Service |
ed0f68 |
session_request_type = IPMI_SESSION_REQUEST_ALL;
|
|
Packit Service |
ed0f68 |
else if (strncmp(argv[1], "id", 2) == 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
if (argc >= 3)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
session_request_type = IPMI_SESSION_REQUEST_BY_ID;
|
|
Packit Service |
ed0f68 |
if (str2uint(argv[2], &id_or_handle) != 0) {
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "HEX number expected, but '%s' given.",
|
|
Packit Service |
ed0f68 |
argv[2]);
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Missing id argument");
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else if (strncmp(argv[1], "handle", 6) == 0)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
if (argc >= 3)
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
session_request_type = IPMI_SESSION_REQUEST_BY_HANDLE;
|
|
Packit Service |
ed0f68 |
if (str2uint(argv[2], &id_or_handle) != 0) {
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "HEX number expected, but '%s' given.",
|
|
Packit Service |
ed0f68 |
argv[2]);
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Missing handle argument");
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Invalid SESSION info parameter: %s", argv[1]);
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
if (retval == 0)
|
|
Packit Service |
ed0f68 |
retval = ipmi_get_session_info(intf,
|
|
Packit Service |
ed0f68 |
session_request_type,
|
|
Packit Service |
ed0f68 |
id_or_handle);
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
else
|
|
Packit Service |
ed0f68 |
{
|
|
Packit Service |
ed0f68 |
lprintf(LOG_ERR, "Invalid SESSION command: %s", argv[0]);
|
|
Packit Service |
ed0f68 |
printf_session_usage();
|
|
Packit Service |
ed0f68 |
retval = -1;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|
|
Packit Service |
ed0f68 |
return retval;
|
|
Packit Service |
ed0f68 |
}
|
|
Packit Service |
ed0f68 |
|