diff options
Diffstat (limited to 'usr/src/lib/libipmi/common/ipmi_misc.c')
-rw-r--r-- | usr/src/lib/libipmi/common/ipmi_misc.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/usr/src/lib/libipmi/common/ipmi_misc.c b/usr/src/lib/libipmi/common/ipmi_misc.c index f83e9e1802..221093e630 100644 --- a/usr/src/lib/libipmi/common/ipmi_misc.c +++ b/usr/src/lib/libipmi/common/ipmi_misc.c @@ -20,8 +20,8 @@ */ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, Joyent, Inc. */ - #include <libipmi.h> #include <stdio.h> #include <string.h> @@ -222,3 +222,35 @@ ipmi_chassis_identify(ipmi_handle_t *ihp, boolean_t enable) return (0); } + +/* + * calller is responsible for free'ing returned structure + */ +ipmi_chassis_status_t * +ipmi_chassis_status(ipmi_handle_t *ihp) +{ + ipmi_cmd_t cmd, *rsp; + ipmi_chassis_status_t *chs; + + cmd.ic_netfn = IPMI_NETFN_CHASSIS; + cmd.ic_lun = 0; + cmd.ic_cmd = IPMI_CMD_GET_CHASSIS_STATUS; + cmd.ic_data = NULL; + cmd.ic_dlen = 0; + + if ((rsp = ipmi_send(ihp, &cmd)) == NULL) + return (NULL); + + if (rsp->ic_dlen < sizeof (ipmi_chassis_status_t)) { + (void) ipmi_set_error(ihp, EIPMI_BAD_RESPONSE_LENGTH, NULL); + return (NULL); + } + + if ((chs = ipmi_alloc(ihp, sizeof (ipmi_chassis_status_t))) == NULL) { + /* ipmi errno set */ + return (NULL); + } + + (void) memcpy(chs, rsp->ic_data, sizeof (ipmi_chassis_status_t)); + return (chs); +} |