summaryrefslogtreecommitdiff
path: root/lib/ipmi_sel.c
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2016-05-08 22:59:02 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2016-05-08 22:59:02 +0200
commit342ebce798fe98ede64939a49bbc3770d8214649 (patch)
treeb55927f05ec0d294ababcb2b4519b7e1a628d5f8 /lib/ipmi_sel.c
parent97d6a2e491c6ed08473beb2c4bac47c5cbc1201a (diff)
Imported Upstream version 1.8.17upstream/1.8.17
Diffstat (limited to 'lib/ipmi_sel.c')
-rw-r--r--lib/ipmi_sel.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/lib/ipmi_sel.c b/lib/ipmi_sel.c
index 5df66a7..b6629a2 100644
--- a/lib/ipmi_sel.c
+++ b/lib/ipmi_sel.c
@@ -29,8 +29,10 @@
* LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
* EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*/
+#define _BSD_SOURCE
#include <string.h>
+#include <strings.h>
#include <math.h>
#define __USE_XOPEN /* glibc2 needs this for strptime */
#include <time.h>
@@ -43,6 +45,7 @@
#include <ipmitool/ipmi_mc.h>
#include <ipmitool/ipmi_intf.h>
#include <ipmitool/ipmi_sel.h>
+#include <ipmitool/ipmi_sel_supermicro.h>
#include <ipmitool/ipmi_sdr.h>
#include <ipmitool/ipmi_fru.h>
#include <ipmitool/ipmi_sensor.h>
@@ -419,7 +422,12 @@ ipmi_sel_add_entries_fromfile(struct ipmi_intf * intf, const char * filename)
memset(&sel_event, 0, sizeof(struct sel_event_record));
sel_event.record_id = 0x0000;
sel_event.record_type = 0x02;
- sel_event.sel_type.standard_type.gen_id = 0x00;
+ /*
+ * IPMI spec §32.1 generator ID
+ * Bit 0 = 1 "Software defined"
+ * Bit 1-7: SWID (IPMI spec §5.5), using 2 = "System management software"
+ */
+ sel_event.sel_type.standard_type.gen_id = 0x41;
sel_event.sel_type.standard_type.evm_rev = rqdata[0];
sel_event.sel_type.standard_type.sensor_type = rqdata[1];
sel_event.sel_type.standard_type.sensor_num = rqdata[2];
@@ -1461,11 +1469,14 @@ ipmi_sel_get_info(struct ipmi_intf * intf)
if (rsp == NULL) {
lprintf(LOG_ERR, "Get SEL Info command failed");
return -1;
- }
- if (rsp->ccode > 0) {
+ } else if (rsp->ccode > 0) {
lprintf(LOG_ERR, "Get SEL Info command failed: %s",
val2str(rsp->ccode, completion_code_vals));
return -1;
+ } else if (rsp->data_len != 14) {
+ lprintf(LOG_ERR, "Get SEL Info command failed: "
+ "Invalid data length %d", rsp->data_len);
+ return (-1);
}
if (verbose > 2)
printbuf(rsp->data, rsp->data_len, "sel_info");
@@ -2731,24 +2742,26 @@ ipmi_sel_set_time(struct ipmi_intf * intf, const char * time_string)
{
//modify UTC time to local time expressed in number of seconds from 1/1/70 0:0:0 1970 GMT
struct tm * tm_tmp = {0};
- int gt_year,gt_yday,gt_hour,lt_year,lt_yday,lt_hour;
+ int gt_year,gt_yday,gt_hour,gt_min,lt_year,lt_yday,lt_hour,lt_min;
int delta_hour;
tm_tmp=gmtime(&t);
gt_year=tm_tmp->tm_year;
gt_yday=tm_tmp->tm_yday;
gt_hour=tm_tmp->tm_hour;
+ gt_min=tm_tmp->tm_min;
memset(&*tm_tmp, 0, sizeof(struct tm));
tm_tmp=localtime(&t);
lt_year=tm_tmp->tm_year;
lt_yday=tm_tmp->tm_yday;
lt_hour=tm_tmp->tm_hour;
+ lt_min=tm_tmp->tm_min;
delta_hour=lt_hour - gt_hour;
if ( (lt_year > gt_year) || ((lt_year == gt_year) && (lt_yday > gt_yday)) )
delta_hour += 24;
if ( (lt_year < gt_year) || ((lt_year == gt_year) && (lt_yday < gt_yday)) )
delta_hour -= 24;
- t += (delta_hour * 60 * 60);
+ t += (delta_hour * 60 * 60) + (lt_min - gt_min) * 60;
}
timei = (uint32_t)t;