summaryrefslogtreecommitdiff
path: root/util/isensor.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/isensor.c')
-rw-r--r--util/isensor.c48
1 files changed, 39 insertions, 9 deletions
diff --git a/util/isensor.c b/util/isensor.c
index 6ce290d..e5a80e0 100644
--- a/util/isensor.c
+++ b/util/isensor.c
@@ -247,7 +247,7 @@ char *decode_entity_id(int id) {
* Global Data
************************/
static char *progname = "isensor";
-static char *progver = "2.95";
+static char *progver = "2.96";
#ifdef WIN32
static char savefile[] = "%ipmiutildir%\\thresholds.cmd";
#else
@@ -1354,6 +1354,9 @@ int get_sdr_file(char *sdrfile, uchar **sdrlist)
num = 0;
while (fgets(buff, 255, fp)) { num++; }
if (fdebug) printf("Reading %d SDRs from file %s\n",num,sdrfile);
+ if ((psdrcache != NULL) && (nsdrs > 0)) { /*already have sdrcache*/
+ printf("get_sdr_file: Already have cache\n"); /*++++*/
+ }
sdrbuf = malloc(num * SDR_SZ);
if (sdrbuf == NULL) {
fclose(fp);
@@ -1402,8 +1405,10 @@ int get_sdr_cache(uchar **pret)
if ((psdrcache != NULL) && (nsdrs > 0)) { /*already have sdrcache*/
*pret = psdrcache;
if (fdebug) printf("get_sdr_cache: already have cache (%p)\n",*pret);
+ printf("get_sdr_cache: Already have cache\n"); /*++++*/
return(0);
}
+ else printf("get_sdr_cache: Allocating cache\n"); /*++++*/
rv = GetSDRRepositoryInfo(&n,&fdevsdrs);
if (rv != 0) return(rv);
@@ -1434,6 +1439,12 @@ int get_sdr_cache(uchar **pret)
if (rv == 0xC5) { set_reserve(1); i--; } /*retry*/
else break;
} else { /*success*/
+ /* if sdrlen!=len, adjust */
+ if ((len > 5) && (len != (psdr[4] + 5)) ) {
+ if (fdebug) printf("SDR[%x] adjust len from %d to %d\n",
+ recid,psdr[4]+5,len);
+ psdr[4] = len - 5;
+ }
asz += len;
if (recnext == recid) recid = 0xffff;
else recid = recnext;
@@ -1451,19 +1462,23 @@ int get_sdr_cache(uchar **pret)
int find_nsdrs(uchar *pcache)
{
int num = 0;
- int asz = 0;
+ ulong asz = 0;
int i, len;
uchar *sdr;
ushort recid;
if (pcache == NULL) return(num);
- for (i = 0; asz < sz_sdrs; i++)
+ for (i = 0; (int)asz < sz_sdrs; i++)
{
sdr = &pcache[asz];
+ if (sdr[2] != 0x51) { /* Dell SDR length error */
+ printf("SDR[%x] length error at %ld\n",recid,asz);
+ sdr = &pcache[++asz]; /*try it if off-by-one*/
+ }
len = sdr[4] + 5;
recid = sdr[0] + (sdr[1] << 8);
+ if (fdebug) printf("SDR[%x] len=%d i=%d offset=%lx\n",recid,len,i,asz);
asz += len;
- if (fdebug) printf("SDR[%x] len=%d i=%d\n", recid,len,i);
}
num = i;
return(num);
@@ -1565,6 +1580,8 @@ int find_sdr_next(uchar *psdr, uchar *pcache, ushort id)
{
// sdr = &pcache[i * SDR_SZ];
sdr = &pcache[asz];
+ if (sdr[2] != 0x51) /* Dell SDR off-by-one error */
+ sdr = &pcache[++asz];
len = sdr[4] + 5;
recid = sdr[0] + (sdr[1] << 8);
asz += len;
@@ -2974,14 +2991,15 @@ int read_sdr_binfile(char *binfile, uchar **pbufret, int *buflen)
}
}
#endif
- fp = fopen(binfile,"r");
+ fp = fopen(binfile,"rb");
if (fp == NULL) {
ret = get_LastError();
printf("Cannot open file %s, error %d\n",binfile,ret);
return(ret);
}
+ fseek(fp, 0L, SEEK_SET);
#ifndef WIN32
- {
+ { /*not windows but Linux, etc.*/
struct stat st;
/* use fstat to get file size and allocate buffer */
ret = fstat(fileno(fp), &st);
@@ -2993,15 +3011,17 @@ int read_sdr_binfile(char *binfile, uchar **pbufret, int *buflen)
}
}
#endif
- // len = nsdrs * SDR_SZ; /*estimate max size for n sdrs*/
+ /* Could estimate size for nsdrs*SDR_SZ, but we don't yet know nsdrs.
+ * It is better to use the real file size detected above. */
sz_sdrs = len;
pbuf = malloc(len);
- if (fdebug) printf("restore: malloc(%d) pbuf=%p\n",len,pbuf);
+ if (fdebug) printf("sdr_binfile: malloc(%d) pbuf=%p\n",len,pbuf);
if (pbuf == NULL) {
ret = -1;
fclose(fp);
return(ret);
}
+ psdrcache = pbuf;
/*ok, so proceed with restore*/
ret = 0;
len = (int)fread(pbuf, 1, sz_sdrs, fp);
@@ -3009,6 +3029,12 @@ int read_sdr_binfile(char *binfile, uchar **pbufret, int *buflen)
ret = get_LastError();
printf("Error %d reading file %s\n",ret,binfile);
sz_sdrs = 0; /*for safety*/
+ } else if (len < sz_sdrs) {
+ /* Show error if this happens in Windows */
+ ret = get_LastError();
+ printf("truncated fread(%s): attempted %d, got %d, error %d\n",
+ binfile,sz_sdrs,len,ret);
+ ret = 0; /*try to keep going*/
}
fclose(fp);
if (fdebug) {
@@ -3339,7 +3365,7 @@ int i_sensor(int argc, char **argv)
int len;
ret = get_sdr_cache(&pbuf);
if (ret == 0) {
- fp = fopen(binfile,"w");
+ fp = fopen(binfile,"wb");
if (fp == NULL) {
ret = get_LastError();
printf("Cannot open file %s, error %d\n",binfile,ret);
@@ -3439,6 +3465,10 @@ int i_sensor(int argc, char **argv)
recnext = sdrdata[0] + (sdrdata[1] << 8); /*same as recid*/
if (fdebug) printf("find_sdr_next(%04x): ret = %d, next=%04x\n",
recid,ret,recnext);
+ if (recid > 0 && recnext == 0) {
+ if (fdebug) printf("Error recid=%04x recnext=%04x\n",recid,recnext);
+ ret = 0; break;
+ }
sz = sdrdata[4] + 5;
} else {
ret = GetSDR(recid,&recnext,sdrdata,sizeof(sdrdata),&sz);