On 03/26/2012 10:05 PM, Gowda, Srinivas G wrote:
> 
> Hi,
> Here is the 1st of the 10 patches.
> These patches contains updates and dell specific sel additions.
> 
> 
> 
> 
> Thanks,
> G
> srinivas_g_go...@dell.com
> DELL
> 

Rewritten patch using macros.

Thanks,
G
srinivas_g_go...@dell.com
DELL
diff -Naurp ipmitool_base/lib/ipmi_sensor.c 
01-ipmitool_opensrc_update/lib/ipmi_sensor.c
--- ipmitool_base/lib/ipmi_sensor.c     2012-04-03 17:51:36.000000000 +0530
+++ 01-ipmitool_opensrc_update/lib/ipmi_sensor.c        2012-04-03 
17:51:37.000000000 +0530
@@ -675,6 +675,7 @@ __ipmi_sensor_set_threshold(struct ipmi_
 
        return 0;
 }
+#define        INVALID_THRESHOLD       "Invalid Threshold data values. Cannot 
Set Threshold Data."
 
 static int
 ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv)
@@ -684,6 +685,9 @@ ipmi_sensor_set_threshold(struct ipmi_in
        double setting1 = 0.0, setting2 = 0.0, setting3 = 0.0;
        int allUpper = 0, allLower = 0;
        int ret = 0;
+       struct ipmi_rs *rsp;
+       int i =0;
+       double val[10] = {0};
 
        struct sdr_record_list *sdr;
 
@@ -776,9 +780,16 @@ ipmi_sensor_set_threshold(struct ipmi_in
                lprintf(LOG_ERR, "Invalid sensor type %02x", sdr->type);
                return -1;
        }
-
+       
        if (allUpper) {
-               settingMask = UPPER_NON_CRIT_SPECIFIED;
+
+               if( (setting1 < setting2 ) && (setting2 < setting3) ) {
+                       settingMask = UPPER_NON_CRIT_SPECIFIED;                 
+               } else  {
+                       lprintf(LOG_ERR, "Invalid sensor data settings.");
+                       return -1;
+               }
+                       
                printf("Setting sensor \"%s\" %s threshold to %.3f\n",
                       sdr->record.full->id_string,
                       val2str(settingMask, threshold_vals), setting1);
@@ -814,7 +825,13 @@ ipmi_sensor_set_threshold(struct ipmi_in
                                                  
sdr->record.full->keys.owner_id,
                                                  sdr->record.full->keys.lun);
        } else if (allLower) {
-               settingMask = LOWER_NON_RECOV_SPECIFIED;
+               if( (setting1 < setting2 ) && (setting2 < setting3) ) {
+                       settingMask = LOWER_NON_RECOV_SPECIFIED;
+               } else  {
+                       lprintf(LOG_ERR, "Invalid sensor data settings.");
+                       return -1;
+               }
+               
                printf("Setting sensor \"%s\" %s threshold to %.3f\n",
                       sdr->record.full->id_string,
                       val2str(settingMask, threshold_vals), setting1);
@@ -850,6 +867,83 @@ ipmi_sensor_set_threshold(struct ipmi_in
                                                  
sdr->record.full->keys.owner_id,
                                                  sdr->record.full->keys.lun);
        } else {
+       
+       // Check for the Existing sensor record data.
+       /*
+        * Get current reading
+        */
+               rsp = ipmi_sdr_get_sensor_reading_ipmb(intf,
+                                              
sdr->record.full->keys.sensor_num,
+                                              sdr->record.full->keys.owner_id,
+                                              
sdr->record.full->keys.lun,sdr->record.full->keys.channel);
+               rsp = ipmi_sdr_get_sensor_thresholds(intf, 
sdr->record.full->keys.sensor_num,
+                                               
sdr->record.full->keys.owner_id, 
sdr->record.full->keys.lun,sdr->record.full->keys.channel);
+               if ((rsp == NULL) || (rsp->ccode > 0)) {
+                       lprintf(LOG_ERR, "Sensor data record not found!");
+                                       return -1;
+               }
+               for(i=1;i<=6;i++) {
+                       val[i] = sdr_convert_sensor_reading(sdr->record.full, 
rsp->data[i]);
+                       if(val[i] < 0)
+                               val[i] = 0;     
+               }
+               if( (settingMask & UPPER_NON_RECOV_SPECIFIED) ) {
+               
+                       if( (rsp->data[0] & UPPER_NON_RECOV_SPECIFIED) && 
+                               (( (rsp->data[0] & UPPER_CRIT_SPECIFIED) && ( 
setting1 <= val[5])) ||
+                                       ( (rsp->data[0] & 
UPPER_NON_CRIT_SPECIFIED) && ( setting1 <= val[4]))) )
+                       {
+                               lprintf(LOG_ERR, INVALID_THRESHOLD);
+                               return -1;
+                       }                               
+               } else if( (settingMask & UPPER_CRIT_SPECIFIED) ) {
+                       if( (rsp->data[0] & UPPER_CRIT_SPECIFIED) && 
+                               (((rsp->data[0] & UPPER_NON_RECOV_SPECIFIED)&& 
( setting1 >= val[6])) || 
+                               ((rsp->data[0] & UPPER_NON_CRIT_SPECIFIED)&&( 
setting1 <= val[4]))) )
+                       {
+                               lprintf(LOG_ERR, INVALID_THRESHOLD);
+                               return -1;
+                       }                               
+               } else if( (settingMask & UPPER_NON_CRIT_SPECIFIED) ) {
+                       if( (rsp->data[0] & UPPER_NON_CRIT_SPECIFIED) && 
+                               (((rsp->data[0] & UPPER_NON_RECOV_SPECIFIED)&&( 
setting1 >= val[6])) || 
+                               ((rsp->data[0] & UPPER_CRIT_SPECIFIED)&&( 
setting1 >= val[5])) || 
+                               ((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)&&( 
setting1 <= val[1]))) )
+                       {
+                               lprintf(LOG_ERR, INVALID_THRESHOLD);
+                               return -1;
+                       }                               
+               } else if( (settingMask & LOWER_NON_CRIT_SPECIFIED) ) {
+                       if( (rsp->data[0] & LOWER_NON_CRIT_SPECIFIED) && 
+                               (((rsp->data[0] & LOWER_CRIT_SPECIFIED)&&( 
setting1 <= val[2])) || 
+                               ((rsp->data[0] & LOWER_NON_RECOV_SPECIFIED)&&( 
setting1 <= val[3]))|| 
+                               ((rsp->data[0] & UPPER_NON_CRIT_SPECIFIED)&&( 
setting1 >= val[4]))) )
+                       {
+                               lprintf(LOG_ERR, INVALID_THRESHOLD);
+                               return -1;
+                       }                               
+               } else if( (settingMask & LOWER_CRIT_SPECIFIED) ) {
+                       if( (rsp->data[0] & LOWER_CRIT_SPECIFIED) && 
+                               (((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)&&( 
setting1 >= val[1])) || 
+                               ((rsp->data[0] & LOWER_NON_RECOV_SPECIFIED)&&( 
setting1 <= val[3]))) )
+                       {
+                               lprintf(LOG_ERR, INVALID_THRESHOLD);
+                               return -1;
+                       }                               
+               } else if( (settingMask & LOWER_NON_RECOV_SPECIFIED) ) {
+                       if( (rsp->data[0] & LOWER_NON_RECOV_SPECIFIED) && 
+                               (((rsp->data[0] & LOWER_NON_CRIT_SPECIFIED)&&( 
setting1 >= val[1])) || 
+                               ((rsp->data[0] & LOWER_CRIT_SPECIFIED)&&( 
setting1 >= val[2]))) )
+                       {
+                               lprintf(LOG_ERR, INVALID_THRESHOLD);
+                               return -1;
+                       }       
+               } else {
+                       lprintf(LOG_ERR, INVALID_THRESHOLD);
+                       return -1;
+               }
+               
+               
                printf("Setting sensor \"%s\" %s threshold to %.3f\n",
                       sdr->record.full->id_string,
                       val2str(settingMask, threshold_vals), setting1);
------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to