diff --git a/etc/sensors.conf.eg b/etc/sensors.conf.eg index 9654e810..5da8818d 100644 --- a/etc/sensors.conf.eg +++ b/etc/sensors.conf.eg @@ -14,7 +14,7 @@ # quotes operate like those in C. # A 'chip' line specifies what the following 'label', 'compute', 'set' and -# (not yet implemented) 'valid' lines refer to. In this case, until the +# 'ignore' lines refer to. In this case, until the # next 'chip' line, everything refers to all lm78, lm78-j and lm79 # chips. Other examples are *-isa-* for everything on the ISA bus, and # lm78-j-i2c-*-4e for all lm78-j chips on address 0x4e of any I2C bus. @@ -101,10 +101,11 @@ #set in0_max vid*1.05 #set in0_min vid*0.95 -# Invalid statements tell certain features are not wanted. User programs can +# Ignore statements tell certain features are not wanted. User programs can # still read them if they really want, though; this is just an advisory # marking. 'in0' would also invalidate 'in0_max' and 'in0_min'. -# The invalid keyword is not yet recognized by the parser. +# +#ignore in0 # There is one other feature: the 'bus' statement. An example is below. diff --git a/lib/Module.mk b/lib/Module.mk index 58b10742..c6e0d3dc 100644 --- a/lib/Module.mk +++ b/lib/Module.mk @@ -28,8 +28,8 @@ LIBMAN5DIR := $(MANDIR)/man5 LIBMAN5FILES := $(MODULE_DIR)/sensors.conf.5 # The main and minor version of the library -LIBMAINVER := 0 -LIBMINORVER := 0.2 +LIBMAINVER := 1 +LIBMINORVER := 0.0 LIBVER := $(LIBMAINVER).$(LIBMINORVER) # The static lib name, the shared lib name, and the internal ('so') name of diff --git a/lib/access.c b/lib/access.c index 4ff57840..143b6b67 100644 --- a/lib/access.c +++ b/lib/access.c @@ -130,29 +130,75 @@ int sensors_chip_name_has_wildcards(sensors_chip_name chip) /* Look up the label which belongs to this chip. Note that chip should not contain wildcard values! *result is newly allocated (free it yourself). - This function will return 0 on success, and <0 on failure. */ + This function will return 0 on success, and <0 on failure. + Changed behaviour as of libsensors.so.1: now we actually take notice + of the logical class, as documented, but not done before! */ int sensors_get_label(sensors_chip_name name, int feature, char **result) { const sensors_chip *chip; const sensors_chip_feature *featureptr; + const sensors_chip_feature *alt_featureptr; int i; + *result=NULL; if (sensors_chip_name_has_wildcards(name)) return -SENSORS_ERR_WILDCARDS; if (! (featureptr = sensors_lookup_feature_nr(name.prefix,feature))) return -SENSORS_ERR_NO_ENTRY; + if (featureptr->logical_mapping == SENSORS_NO_MAPPING) + alt_featureptr = NULL; + else if (! (alt_featureptr = + sensors_lookup_feature_nr(name.prefix, + featureptr->logical_mapping))) + return -SENSORS_ERR_NO_ENTRY; for (chip = NULL; (chip = sensors_for_all_config_chips(name,chip));) for (i = 0; i < chip->labels_count; i++) if (!strcmp(featureptr->name, chip->labels[i].name)) { + if (*result) + free(*result); + if (! (*result = strdup(chip->labels[i].value))) + sensors_fatal_error("sensors_get_label","Allocating label text"); + return 0; /* Exact match always overrules! */ + } else if (alt_featureptr && + !strcmp(alt_featureptr->name, chip->labels[i].name)) { + if (*result) + free(*result); if (! (*result = strdup(chip->labels[i].value))) sensors_fatal_error("sensors_get_label","Allocating label text"); - return 0; } if (! (*result = strdup(featureptr->name))) sensors_fatal_error("sensors_get_label","Allocating label text"); return 0; } +int sensors_get_ignored(sensors_chip_name name, int feature) +{ + const sensors_chip *chip; + const sensors_chip_feature *featureptr; + const sensors_chip_feature *alt_featureptr; + int i,res; + + res = 1; /* Default: valid */ + if (sensors_chip_name_has_wildcards(name)) + return -SENSORS_ERR_WILDCARDS; + if (! (featureptr = sensors_lookup_feature_nr(name.prefix,feature))) + return -SENSORS_ERR_NO_ENTRY; + if (featureptr->logical_mapping == SENSORS_NO_MAPPING) + alt_featureptr = NULL; + else if (! (alt_featureptr = + sensors_lookup_feature_nr(name.prefix, + featureptr->logical_mapping))) + return -SENSORS_ERR_NO_ENTRY; + for (chip = NULL; (chip = sensors_for_all_config_chips(name,chip));) + for (i = 0; i < chip->ignores_count; i++) + if (!strcmp(featureptr->name, chip->ignores[i].name)) + return 0; /* Exact match always overrules! */ + else if (alt_featureptr && + !strcmp(alt_featureptr->name, chip->ignores[i].name)) + res = 0; + return res; +} + /* Read the value of a feature of a certain chip. Note that chip should not contain wildcard values! This function will return 0 on success, and <0 on failure. */ diff --git a/lib/conf-lex.l b/lib/conf-lex.l index 0059869e..5b6e89a3 100644 --- a/lib/conf-lex.l +++ b/lib/conf-lex.l @@ -124,6 +124,11 @@ OCTESC (1[0-7]{0,2})|([2-7][0-7]?)|(0[1-7][0-7]?)|(00[1-7]) BEGIN(MIDDLE); return CHIP; } +"ignore" { + sensors_yylval.line = sensors_yylineno; + BEGIN(MIDDLE); + return IGNORE; + } /* Anything else at the beginning of a line is an error */ . { diff --git a/lib/conf-parse.y b/lib/conf-parse.y index 337d91a6..fd944aee 100644 --- a/lib/conf-parse.y +++ b/lib/conf-parse.y @@ -60,6 +60,11 @@ static sensors_chip *current_chip = NULL; ¤t_chip->computes_count,\ ¤t_chip->computes_max,\ sizeof(sensors_compute)); +#define ignore_add_el(el) sensors_add_array_el(el,\ + (void **) ¤t_chip->ignores,\ + ¤t_chip->ignores_count,\ + ¤t_chip->ignores_max,\ + sizeof(sensors_ignore)); #define chip_add_el(el) sensors_add_array_el(el,\ (void **) &sensors_config_chips,\ &sensors_config_chips_count,\ @@ -105,6 +110,7 @@ static sensors_chip *current_chip = NULL; %token SET %token CHIP %token COMPUTE +%token IGNORE %token FLOAT %token NAME %token ERROR @@ -131,6 +137,7 @@ line: bus_statement EOL | set_statement EOL | chip_statement EOL | compute_statement EOL + | ignore_statement EOL | error EOL ; @@ -175,15 +182,25 @@ compute_statement: COMPUTE function_name expression ',' expression } ; +ignore_statement: IGNORE function_name + { sensors_ignore new_el; + check_current_chip(); + new_el.lineno = $1; + new_el.name = $2; + ignore_add_el(&new_el); + } + chip_statement: CHIP chip_name_list { sensors_chip new_el; new_el.lineno = $1; new_el.labels = NULL; new_el.sets = NULL; new_el.computes = NULL; + new_el.ignores = NULL; new_el.labels_count = new_el.labels_max = 0; new_el.sets_count = new_el.sets_max = 0; new_el.computes_count = new_el.computes_max = 0; + new_el.ignores_count = new_el.ignores_max = 0; new_el.chips = $2; chip_add_el(&new_el); current_chip = sensors_config_chips + diff --git a/lib/data.h b/lib/data.h index cf523253..906deec7 100644 --- a/lib/data.h +++ b/lib/data.h @@ -79,6 +79,12 @@ typedef struct sensors_compute { int lineno; } sensors_compute; +/* Config file ignore declaration: a feature name */ +typedef struct sensors_ignore { + char *name; + int lineno; +} sensors_ignore; + /* A list of chip names, used to represent a config file chips declaration */ typedef struct sensors_chip_name_list { sensors_chip_name *fits; @@ -98,6 +104,9 @@ typedef struct sensors_chip { sensors_compute *computes; int computes_count; int computes_max; + sensors_ignore *ignores; + int ignores_count; + int ignores_max; int lineno; } sensors_chip; diff --git a/lib/init.c b/lib/init.c index 48c7d232..101a65c7 100644 --- a/lib/init.c +++ b/lib/init.c @@ -33,6 +33,7 @@ static void free_chip(sensors_chip chip); static void free_label(sensors_label label); static void free_set(sensors_set set); static void free_compute(sensors_compute compute); +static void free_ignore(sensors_ignore ignore); static void free_expr(sensors_expr *expr); int sensors_init(FILE *input) @@ -114,6 +115,11 @@ void free_chip(sensors_chip chip) free_compute(chip.computes[i]); free(chip.computes); chip.computes_count = chip.computes_max = 0; + + for (i = 0; i < chip.ignores_count; i++) + free_ignore(chip.ignores[i]); + free(chip.ignores); + chip.ignores_count = chip.ignores_max = 0; } void free_label(sensors_label label) @@ -135,6 +141,11 @@ void free_compute(sensors_compute compute) free_expr(compute.to_proc); } +void free_ignore(sensors_ignore ignore) +{ + free(ignore.name); +} + void free_expr(sensors_expr *expr) { if ((expr->kind) == sensors_kind_var) diff --git a/lib/sensors.conf.5 b/lib/sensors.conf.5 index e6b356ee..da447842 100644 --- a/lib/sensors.conf.5 +++ b/lib/sensors.conf.5 @@ -57,6 +57,9 @@ compute , .B EXPR .sp 0 +ignore +.B NAME +.sp 0 set .B NAME EXPR .RE @@ -239,7 +242,7 @@ lm78\-* .sp 0 *\-i2c\-10\-5e .sp 0 -*\-i2c\-10-\* +*\-i2c\-10\-* .sp 0 *\-i2c\-*\-5e .sp 0 @@ -283,6 +286,20 @@ statement applies, a one\-on\-one translation is used instead. The comma is an unfortunate necessity to stop the statement from becoming ambiguous. +.SS IGNORE STATEMENT +.RS +ignore fan1 +.RE + +The +.I ignore +statement is a hint that a specific feature should be ignored - probably +because it returns bogus values (for example, because a fan or temperature +sensor is not connected). + +The only argument is the feature name, which may be a feature class; +in that case the label class is used (see below). + .SS LABEL STATEMENT .RS label in3 "+5V" diff --git a/lib/sensors.h b/lib/sensors.h index 73115da9..512e55a1 100644 --- a/lib/sensors.h +++ b/lib/sensors.h @@ -69,10 +69,16 @@ extern const char *sensors_get_algorithm_name(int bus_nr); /* Look up the label which belongs to this chip. Note that chip should not contain wildcard values! *result is newly allocated (free it yourself). - This function will return 0 on success, and <0 on failure. */ + This function will return 0 on success, and <0 on failure. This + function takes logical mappings into account. */ extern int sensors_get_label(sensors_chip_name name, int feature, char **result); +/* Looks up whether a feature should be ignored. Returns <0 on failure, + 0 if it should be ignored, 1 if it is valid. This function takes + logical mappings into account. */ +extern int sensors_get_ignored(sensors_chip_name name, int fature); + /* Read the value of a feature of a certain chip. Note that chip should not contain wildcard values! This function will return 0 on success, and <0 on failure. */ diff --git a/prog/sensors/chips.c b/prog/sensors/chips.c index a0798eac..b270a277 100644 --- a/prog/sensors/chips.c +++ b/prog/sensors/chips.c @@ -55,18 +55,35 @@ void free_the_label(char **label) *label = NULL; } +int sensors_get_label_and_valid(sensors_chip_name name, int feature, char **label, + int *valid) +{ + int err; + err = sensors_get_label(name,feature,label); + if (!err) + err = sensors_get_ignored(name,feature); + if (err >= 0) { + *valid = err; + err = 0; + } + return err; +} + void print_lm75(const sensors_chip_name *name) { char *label; double cur,hyst,over; + int valid; - if (!sensors_get_label(*name,SENSORS_LM75_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM75_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM75_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_LM75_TEMP_HYST,&hyst) && !sensors_get_feature(*name,SENSORS_LM75_TEMP_OVER,&over)) { - print_label(label,10); - printf("%6.1f C (limit: %6.1f C, hysteresis: %6.1f C)\n", - cur,over,hyst); + if (valid) { + print_label(label,10); + printf("%6.1f C (limit: %6.1f C, hysteresis: %6.1f C)\n", + cur,over,hyst); + } } else printf("ERROR: Can't get temperature data!\n"); free_the_label(&label); @@ -76,7 +93,7 @@ void print_adm1021(const sensors_chip_name *name) { char *label; double cur,hyst,over; - int alarms,i; + int alarms,i,valid; if (!sensors_get_feature(*name,SENSORS_LM78_ALARMS,&cur)) alarms = cur + 0.5; @@ -85,60 +102,68 @@ void print_adm1021(const sensors_chip_name *name) alarms = 0; } - if (!sensors_get_label(*name,SENSORS_ADM1021_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM1021_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM1021_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_ADM1021_TEMP_HYST,&hyst) && !sensors_get_feature(*name,SENSORS_ADM1021_TEMP_OVER,&over)) { - print_label(label,10); - printf("%4.0f C (limit: %4.0f C, hysteresis: %4.0f C) ", - cur,over,hyst); - if (alarms & (ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW)) { - printf("ALARM ("); - i = 0; - if (alarms & ADM1021_ALARM_TEMP_LOW) { - printf("LOW"); - i++; + if (valid) { + print_label(label,10); + printf("%4.0f C (limit: %4.0f C, hysteresis: %4.0f C) ", + cur,over,hyst); + if (alarms & (ADM1021_ALARM_TEMP_HIGH | ADM1021_ALARM_TEMP_LOW)) { + printf("ALARM ("); + i = 0; + if (alarms & ADM1021_ALARM_TEMP_LOW) { + printf("LOW"); + i++; + } + if (alarms & ADM1021_ALARM_TEMP_HIGH) + printf("%sHIGH",i?",":""); + printf(")\n"); } - if (alarms & ADM1021_ALARM_TEMP_HIGH) - printf("%sHIGH",i?",":""); - printf(")\n"); } } else printf("ERROR: Can't get temperature data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM1021_REMOTE_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM1021_REMOTE_TEMP, + &label,&valid) && !sensors_get_feature(*name,SENSORS_ADM1021_REMOTE_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_ADM1021_REMOTE_TEMP_HYST,&hyst) && !sensors_get_feature(*name,SENSORS_ADM1021_REMOTE_TEMP_OVER,&over)) { - print_label(label,10); - printf("%4.0f C (limit: %4.0f C, hysteresis: %4.0f C) ", - cur,over,hyst); - if (alarms & (ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | - ADM1021_ALARM_RTEMP_NA)) { - printf("ALARM ("); - i = 0; - if (alarms & ADM1021_ALARM_RTEMP_NA) { - printf("N/A"); - i++; + if (valid) { + print_label(label,10); + printf("%4.0f C (limit: %4.0f C, hysteresis: %4.0f C) ", + cur,over,hyst); + if (alarms & (ADM1021_ALARM_RTEMP_HIGH | ADM1021_ALARM_RTEMP_LOW | + ADM1021_ALARM_RTEMP_NA)) { + printf("ALARM ("); + i = 0; + if (alarms & ADM1021_ALARM_RTEMP_NA) { + printf("N/A"); + i++; + } + if (alarms & ADM1021_ALARM_RTEMP_LOW) { + printf("%sLOW",i?",":""); + i++; + } + if (alarms & ADM1021_ALARM_RTEMP_HIGH) + printf("%sHIGH",i?",":""); + printf(")\n"); } - if (alarms & ADM1021_ALARM_RTEMP_LOW) { - printf("%sLOW",i?",":""); - i++; - } - if (alarms & ADM1021_ALARM_RTEMP_HIGH) - printf("%sHIGH",i?",":""); - printf(")\n"); } } else printf("ERROR: Can't get temperature data!\n"); free_the_label(&label); if (!strcmp(name->prefix,"adm1021")) { - if (!sensors_get_label(*name,SENSORS_ADM1021_DIE_CODE,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM1021_DIE_CODE, + &label,&valid) && !sensors_get_feature(*name,SENSORS_ADM1021_DIE_CODE,&cur)) { - print_label(label,10); - printf("%4.0f\n",cur); + if (valid) { + print_label(label,10); + printf("%4.0f\n",cur); + } } else printf("ERROR: Can't get die-code data!\n"); free_the_label(&label); @@ -150,6 +175,7 @@ void print_adm9240(const sensors_chip_name *name) char *label = NULL; double cur,min,max,fdiv; int alarms; + int valid; if (!sensors_get_feature(*name,SENSORS_ADM9240_ALARMS,&cur)) alarms = cur + 0.5; @@ -158,110 +184,132 @@ void print_adm9240(const sensors_chip_name *name) alarms = 0; } - if (!sensors_get_label(*name,SENSORS_ADM9240_IN0,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN0,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_IN0,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_IN0_MIN,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_IN0_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&ADM9240_ALARM_IN0?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&ADM9240_ALARM_IN0?"ALARM":""); + } } else printf("ERROR: Can't get IN0 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_IN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_IN1,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_IN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_IN1_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&ADM9240_ALARM_IN1?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&ADM9240_ALARM_IN1?"ALARM":""); + } } else printf("ERROR: Can't get IN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_IN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_IN2,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_IN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_IN2_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&ADM9240_ALARM_IN2?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&ADM9240_ALARM_IN2?"ALARM":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_IN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_IN3,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_IN3_MIN,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_IN3_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&ADM9240_ALARM_IN3?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&ADM9240_ALARM_IN3?"ALARM":""); + } } else printf("ERROR: Can't get IN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_IN4,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN4,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_IN4,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_IN4_MIN,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_IN4_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&ADM9240_ALARM_IN4?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&ADM9240_ALARM_IN4?"ALARM":""); + } } else printf("ERROR: Can't get IN4 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_IN5,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_IN5,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_IN5,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_IN5_MIN,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_IN5_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&ADM9240_ALARM_IN5?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&ADM9240_ALARM_IN5?"ALARM":""); + } } else printf("ERROR: Can't get IN5 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_FAN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_FAN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_FAN1,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_FAN1_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_ADM9240_FAN1_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", - cur,min,fdiv, alarms&ADM9240_ALARM_FAN1?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + cur,min,fdiv, alarms&ADM9240_ALARM_FAN1?"ALARM":""); + } } else printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_FAN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_FAN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_FAN2,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_FAN2_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_ADM9240_FAN2_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", - cur,min,fdiv, alarms&ADM9240_ALARM_FAN2?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + cur,min,fdiv, alarms&ADM9240_ALARM_FAN2?"ALARM":""); + } } else printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_ADM9240_TEMP_HYST,&min) && !sensors_get_feature(*name,SENSORS_ADM9240_TEMP_OVER,&max)) { - print_label(label,10); - printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", - cur,max,min, alarms&ADM9240_ALARM_TEMP?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", + cur,max,min, alarms&ADM9240_ALARM_TEMP?"ALARM":""); + } } else printf("ERROR: Can't get TEMP data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_VID,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_VID,&label,&valid) && !sensors_get_feature(*name,SENSORS_ADM9240_VID,&cur)) { - print_label(label,10); - printf("%+5.2f V\n",cur); + if (valid) { + print_label(label,10); + printf("%+5.2f V\n",cur); + } } free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_ADM9240_ALARMS,&label)) { - print_label(label,10); - printf("Chassis intrusion detection %s\n", - alarms & ADM9240_ALARM_CHAS?"ALARM":" "); + if (!sensors_get_label_and_valid(*name,SENSORS_ADM9240_ALARMS,&label,&valid)) { + if (valid) { + print_label(label,10); + printf("Chassis intrusion detection %s\n", + alarms & ADM9240_ALARM_CHAS?"ALARM":" "); + } } free_the_label(&label); } @@ -270,7 +318,7 @@ void print_sis5595(const sensors_chip_name *name) { char *label = NULL; double cur,min,max,fdiv; - int alarms; + int alarms,valid; if (!sensors_get_feature(*name,SENSORS_SIS5595_ALARMS,&cur)) alarms = cur + 0.5; @@ -279,75 +327,89 @@ void print_sis5595(const sensors_chip_name *name) alarms = 0; } - if (!sensors_get_label(*name,SENSORS_SIS5595_IN0,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN0,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_IN0,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_IN0_MIN,&min) && !sensors_get_feature(*name,SENSORS_SIS5595_IN0_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&SIS5595_ALARM_IN0?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&SIS5595_ALARM_IN0?"ALARM":""); + } } else printf("ERROR: Can't get IN0 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_SIS5595_IN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_IN1,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_IN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_SIS5595_IN1_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&SIS5595_ALARM_IN1?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&SIS5595_ALARM_IN1?"ALARM":""); + } } else printf("ERROR: Can't get IN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_SIS5595_IN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_IN2,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_IN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_SIS5595_IN2_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&SIS5595_ALARM_IN2?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&SIS5595_ALARM_IN2?"ALARM":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_SIS5595_IN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_IN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_IN3,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_IN3_MIN,&min) && !sensors_get_feature(*name,SENSORS_SIS5595_IN3_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&SIS5595_ALARM_IN3?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&SIS5595_ALARM_IN3?"ALARM":""); + } } else printf("ERROR: Can't get IN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_SIS5595_FAN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_FAN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_FAN1,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_FAN1_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_SIS5595_FAN1_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", - cur,min,fdiv, alarms&SIS5595_ALARM_FAN1?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + cur,min,fdiv, alarms&SIS5595_ALARM_FAN1?"ALARM":""); + } } else printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_SIS5595_FAN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_FAN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_FAN2,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_FAN2_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_SIS5595_FAN2_MIN,&min)) { + if (valid) { print_label(label,10); printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", cur,min,fdiv, alarms&SIS5595_ALARM_FAN2?"ALARM":""); + } } else printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_SIS5595_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_SIS5595_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_SIS5595_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_SIS5595_TEMP_HYST,&min) && !sensors_get_feature(*name,SENSORS_SIS5595_TEMP_OVER,&max)) { - print_label(label,10); - printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", - cur,max,min, alarms&SIS5595_ALARM_TEMP?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", + cur,max,min, alarms&SIS5595_ALARM_TEMP?"ALARM":""); + } } else printf("ERROR: Can't get TEMP data!\n"); free_the_label(&label); @@ -364,7 +426,7 @@ void print_lm78(const sensors_chip_name *name) { char *label = NULL; double cur,min,max,fdiv; - int alarms; + int alarms,valid; if (!sensors_get_feature(*name,SENSORS_LM78_ALARMS,&cur)) alarms = cur + 0.5; @@ -373,123 +435,148 @@ void print_lm78(const sensors_chip_name *name) alarms = 0; } - if (!sensors_get_label(*name,SENSORS_LM78_IN0,&label) && + + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN0,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN0,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN0_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN0_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN0?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN0?"ALARM":""); + } } else printf("ERROR: Can't get IN0 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_IN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN1,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN1_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN1?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN1?"ALARM":""); + } } else printf("ERROR: Can't get IN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_IN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN2,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN2_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN2?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN2?"ALARM":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_IN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN3,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN3_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN3_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN3?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN3?"ALARM":""); + } } else printf("ERROR: Can't get IN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_IN4,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN4,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN4,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN4_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN4_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN4?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN4?"ALARM":""); + } } else printf("ERROR: Can't get IN4 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_IN5,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN5,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN5,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN5_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN5_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN5?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN5?"ALARM":""); + } } else printf("ERROR: Can't get IN5 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_IN6,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_IN6,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_IN6,&cur) && !sensors_get_feature(*name,SENSORS_LM78_IN6_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM78_IN6_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", - cur,min,max,alarms&LM78_ALARM_IN6?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + cur,min,max,alarms&LM78_ALARM_IN6?"ALARM":""); + } } else printf("ERROR: Can't get IN6 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_FAN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_FAN1,&cur) && !sensors_get_feature(*name,SENSORS_LM78_FAN1_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_LM78_FAN1_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", - cur,min,fdiv, alarms&LM78_ALARM_FAN1?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + cur,min,fdiv, alarms&LM78_ALARM_FAN1?"ALARM":""); + } } else printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_FAN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_FAN2,&cur) && !sensors_get_feature(*name,SENSORS_LM78_FAN2_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_LM78_FAN2_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", - cur,min,fdiv, alarms&LM78_ALARM_FAN2?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + cur,min,fdiv, alarms&LM78_ALARM_FAN2?"ALARM":""); + } } else printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_FAN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_FAN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_FAN3,&cur) && !sensors_get_feature(*name,SENSORS_LM78_FAN3_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_LM78_FAN3_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", - cur,min,fdiv, alarms&LM78_ALARM_FAN3?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + cur,min,fdiv, alarms&LM78_ALARM_FAN3?"ALARM":""); + } } else printf("ERROR: Can't get FAN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_LM78_TEMP_HYST,&min) && !sensors_get_feature(*name,SENSORS_LM78_TEMP_OVER,&max)) { - print_label(label,10); - printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", - cur,max,min, alarms&LM78_ALARM_TEMP?"ALARM":""); + if (valid) { + print_label(label,10); + printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", + cur,max,min, alarms&LM78_ALARM_TEMP?"ALARM":""); + } } else printf("ERROR: Can't get TEMP data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM78_VID,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM78_VID,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM78_VID,&cur)) { - print_label(label,10); - printf("%+5.2f V\n",cur); + if (valid) { + print_label(label,10); + printf("%+5.2f V\n",cur); + } } free_the_label(&label); @@ -508,7 +595,7 @@ void print_gl518(const sensors_chip_name *name) { char *label = NULL; double cur,min,max,fdiv; - int alarms,beeps; + int alarms,beeps,valid; int is_r00; is_r00 = !strcmp(name->prefix,"gl518sm-r00"); @@ -528,132 +615,151 @@ void print_gl518(const sensors_chip_name *name) /* We need special treatment for the R00 chips, because they can't display actual readings! We hardcode this, as this is the easiest way. */ if (is_r00) { - if (!sensors_get_label(*name,SENSORS_GL518_VDD,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VDD,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VDD,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VDD_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VDD_MAX,&max)) { - print_label(label,10); - if (cur == 0.0) - printf("(n/a) "); - else - printf("%+6.2f V ",cur); - printf( "(min = %+6.2f V, max = %+6.2f V) %s %s\n", - min,max,alarms&GL518_ALARM_VDD?"ALARM":" ", - beeps&GL518_ALARM_VDD?"(beep)":""); + if (valid) { + print_label(label,10); + if (cur == 0.0) + printf("(n/a) "); + else + printf("%+6.2f V ",cur); + printf( "(min = %+6.2f V, max = %+6.2f V) %s %s\n", + min,max,alarms&GL518_ALARM_VDD?"ALARM":" ", + beeps&GL518_ALARM_VDD?"(beep)":""); + } } else printf("ERROR: Can't get VDD data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_VIN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VIN1,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VIN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VIN1_MAX,&max)) { - print_label(label,10); - if (cur == 0.0) - printf("(n/a) "); - else - printf("%+6.2f V ",cur); - printf("(min = %+6.2f V, max = %+6.2f V) %s %s\n", - min,max,alarms&GL518_ALARM_VIN1?"ALARM":" ", - beeps&GL518_ALARM_VIN1?"(beep)":""); + if (valid) { + print_label(label,10); + if (cur == 0.0) + printf("(n/a) "); + else + printf("%+6.2f V ",cur); + printf("(min = %+6.2f V, max = %+6.2f V) %s %s\n", + min,max,alarms&GL518_ALARM_VIN1?"ALARM":" ", + beeps&GL518_ALARM_VIN1?"(beep)":""); + } } else printf("ERROR: Can't get VIN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_VIN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VIN2,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VIN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VIN2_MAX,&max)) { - print_label(label,10); - if (cur == 0.0) - printf("(n/a) "); - else - printf("%+6.2f V ",cur); - printf("(min = %+6.2f V, max = %+6.2f V) %s %s\n", - min,max,alarms&GL518_ALARM_VIN2?"ALARM":" ", - beeps&GL518_ALARM_VIN2?"(beep)":""); + if (valid) { + print_label(label,10); + if (cur == 0.0) + printf("(n/a) "); + else + printf("%+6.2f V ",cur); + printf("(min = %+6.2f V, max = %+6.2f V) %s %s\n", + min,max,alarms&GL518_ALARM_VIN2?"ALARM":" ", + beeps&GL518_ALARM_VIN2?"(beep)":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); } else { - if (!sensors_get_label(*name,SENSORS_GL518_VDD,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VDD,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VDD,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VDD_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VDD_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", - cur,min,max,alarms&GL518_ALARM_VDD?"ALARM":" ", - beeps&GL518_ALARM_VDD?"(beep)":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + cur,min,max,alarms&GL518_ALARM_VDD?"ALARM":" ", + beeps&GL518_ALARM_VDD?"(beep)":""); + } } else printf("ERROR: Can't get VDD data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_VIN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VIN1,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VIN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VIN1_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", - cur,min,max,alarms&GL518_ALARM_VIN1?"ALARM":" ", - beeps&GL518_ALARM_VIN1?"(beep)":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + cur,min,max,alarms&GL518_ALARM_VIN1?"ALARM":" ", + beeps&GL518_ALARM_VIN1?"(beep)":""); + } } else printf("ERROR: Can't get VIN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_VIN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VIN2,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VIN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VIN2_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", - cur,min,max,alarms&GL518_ALARM_VIN2?"ALARM":" ", - beeps&GL518_ALARM_VIN2?"(beep)":""); + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + cur,min,max,alarms&GL518_ALARM_VIN2?"ALARM":" ", + beeps&GL518_ALARM_VIN2?"(beep)":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); } - if (!sensors_get_label(*name,SENSORS_GL518_VIN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_VIN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_VIN3,&cur) && !sensors_get_feature(*name,SENSORS_GL518_VIN3_MIN,&min) && !sensors_get_feature(*name,SENSORS_GL518_VIN3_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", - cur,min,max,alarms&GL518_ALARM_VIN3?"ALARM":" ", - beeps&GL518_ALARM_VIN3?"(beep)":""); - + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + cur,min,max,alarms&GL518_ALARM_VIN3?"ALARM":" ", + beeps&GL518_ALARM_VIN3?"(beep)":""); + } } else printf("ERROR: Can't get VIN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_FAN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_FAN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_FAN1,&cur) && !sensors_get_feature(*name,SENSORS_GL518_FAN1_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_GL518_FAN1_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", - cur,min,fdiv, alarms&GL518_ALARM_FAN1?"ALARM":" ", - beeps&GL518_ALARM_FAN1?"(beep)":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", + cur,min,fdiv, alarms&GL518_ALARM_FAN1?"ALARM":" ", + beeps&GL518_ALARM_FAN1?"(beep)":""); + } } else printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_FAN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_FAN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_FAN2,&cur) && !sensors_get_feature(*name,SENSORS_GL518_FAN2_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_GL518_FAN2_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", - cur,min,fdiv, alarms&GL518_ALARM_FAN2?"ALARM":" ", - beeps&GL518_ALARM_FAN2?"(beep)":""); + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", + cur,min,fdiv, alarms&GL518_ALARM_FAN2?"ALARM":" ", + beeps&GL518_ALARM_FAN2?"(beep)":""); + } } else printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_GL518_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_GL518_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_GL518_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_GL518_TEMP_OVER,&max) && !sensors_get_feature(*name,SENSORS_GL518_TEMP_HYST,&min)) { - print_label(label,10); - printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s %s\n", - cur,max,min, alarms&GL518_ALARM_TEMP?"ALARM":" ", - beeps&GL518_ALARM_TEMP?"(beep)":""); + if (valid) { + print_label(label,10); + printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s %s\n", + cur,max,min, alarms&GL518_ALARM_TEMP?"ALARM":" ", + beeps&GL518_ALARM_TEMP?"(beep)":""); + } } else printf("ERROR: Can't get TEMP data!\n"); free_the_label(&label); @@ -674,7 +780,7 @@ void print_lm80(const sensors_chip_name *name) { char *label = NULL; double cur,min,max,min2,max2,fdiv; - int alarms; + int alarms,valid; if (!sensors_get_feature(*name,SENSORS_LM80_ALARMS,&cur)) alarms = cur + 0.5; @@ -683,109 +789,129 @@ void print_lm80(const sensors_chip_name *name) alarms = 0; } - if (!sensors_get_label(*name,SENSORS_LM80_IN0,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN0,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN0,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN0_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN0_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN0?"ALARM":""); + } } else printf("ERROR: Can't get IN0 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_IN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN1,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN1_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN1?"ALARM":""); + } } else printf("ERROR: Can't get IN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_IN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN2,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN2_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN2?"ALARM":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_IN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN3,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN3_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN3_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN3?"ALARM":""); + } } else printf("ERROR: Can't get IN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_IN4,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN4,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN4,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN4_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN4_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN4?"ALARM":""); + } } else printf("ERROR: Can't get IN4 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_IN5,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN5,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN5,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN5_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN5_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN5?"ALARM":""); + } } else printf("ERROR: Can't get IN5 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_IN6,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_IN6,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_IN6,&cur) && !sensors_get_feature(*name,SENSORS_LM80_IN6_MIN,&min) && !sensors_get_feature(*name,SENSORS_LM80_IN6_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur,min,max,alarms&LM80_ALARM_IN6?"ALARM":""); + } } else printf("ERROR: Can't get IN6 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_FAN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_FAN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_FAN1,&cur) && !sensors_get_feature(*name,SENSORS_LM80_FAN1_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_LM80_FAN1_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", cur,min,fdiv, alarms&LM80_ALARM_FAN1?"ALARM":""); + } } else printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_FAN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_FAN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_FAN2,&cur) && !sensors_get_feature(*name,SENSORS_LM80_FAN2_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_LM80_FAN2_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s\n", cur,min,fdiv, alarms&LM80_ALARM_FAN2?"ALARM":""); + } } else printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_LM80_TEMP,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_LM80_TEMP,&label,&valid) && !sensors_get_feature(*name,SENSORS_LM80_TEMP,&cur) && !sensors_get_feature(*name,SENSORS_LM80_TEMP_HOT_HYST,&min) && !sensors_get_feature(*name,SENSORS_LM80_TEMP_HOT_MAX,&max) && !sensors_get_feature(*name,SENSORS_LM80_TEMP_OS_HYST,&min2) && !sensors_get_feature(*name,SENSORS_LM80_TEMP_OS_MAX,&max2)) { - print_label(label,10); - printf("%+3.2f C (hot:limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", + if (valid) { + print_label(label,10); + printf("%+3.2f C (hot:limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", cur,max,min, alarms&LM80_ALARM_TEMP_HOT?"ALARM":""); printf(" (os: limit = %+3.0f C, hysteresis = %+3.0f C) %s\n", max2,min2, alarms&LM80_ALARM_TEMP_HOT?"ALARM":""); + } } else printf("ERROR: Can't get TEMP data!\n"); free_the_label(&label); @@ -808,7 +934,7 @@ void print_w83781d(const sensors_chip_name *name) char *label = NULL; double cur,min,max,fdiv,sens; int alarms,beeps; - int is82d, is83s; + int is82d, is83s,valid; is82d = (!strcmp(name->prefix,"w83782d")) || (!strcmp(name->prefix,"w83627hf")) || @@ -828,194 +954,222 @@ void print_w83781d(const sensors_chip_name *name) beeps = 0; } - if (!sensors_get_label(*name,SENSORS_W83781D_IN0,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN0,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN0,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN0_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN0_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN0?"ALARM":" ", beeps&W83781D_ALARM_IN0?"(beep)":""); + } } else printf("ERROR: Can't get IN0 data!\n"); free_the_label(&label); if (!is83s) { - if (!sensors_get_label(*name,SENSORS_W83781D_IN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN1,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN1_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN1_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN1?"ALARM":" ", beeps&W83781D_ALARM_IN1?"(beep)":""); + } } else printf("ERROR: Can't get IN1 data!\n"); free_the_label(&label); } - if (!sensors_get_label(*name,SENSORS_W83781D_IN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN2,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN2_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN2_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN2?"ALARM":" ", beeps&W83781D_ALARM_IN2?"(beep)":""); + } } else printf("ERROR: Can't get IN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_IN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN3,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN3_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN3_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN3?"ALARM":" ", beeps&W83781D_ALARM_IN3?"(beep)":""); + } } else printf("ERROR: Can't get IN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_IN4,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN4,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN4,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN4_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN4_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN4?"ALARM":" ", beeps&W83781D_ALARM_IN4?"(beep)":""); + } } else printf("ERROR: Can't get IN4 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_IN5,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN5,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN5,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN5_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN5_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN5?"ALARM":" ", beeps&W83781D_ALARM_IN5?"(beep)":""); + } } else printf("ERROR: Can't get IN5 data!\n"); free_the_label(&label); if (!is83s) { - if (!sensors_get_label(*name,SENSORS_W83781D_IN6,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_IN6,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_IN6,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_IN6_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83781D_IN6_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83781D_ALARM_IN6?"ALARM":" ", beeps&W83781D_ALARM_IN6?"(beep)":""); + } } else printf("ERROR: Can't get IN6 data!\n"); free_the_label(&label); } if (is82d) { - if (!sensors_get_label(*name,SENSORS_W83782D_IN7,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83782D_IN7,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83782D_IN7,&cur) && !sensors_get_feature(*name,SENSORS_W83782D_IN7_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83782D_IN7_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83782D_ALARM_IN7?"ALARM":" ", beeps&W83782D_ALARM_IN7?"(beep)":""); + } } else printf("ERROR: Can't get IN7 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83782D_IN8,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83782D_IN8,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83782D_IN8,&cur) && !sensors_get_feature(*name,SENSORS_W83782D_IN8_MIN,&min) && !sensors_get_feature(*name,SENSORS_W83782D_IN8_MAX,&max)) { - print_label(label,10); - printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", + if (valid) { + print_label(label,10); + printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s %s\n", cur,min,max,alarms&W83782D_ALARM_IN8?"ALARM":" ", beeps&W83782D_ALARM_IN8?"(beep)":""); + } } else printf("ERROR: Can't get IN6 data!\n"); free_the_label(&label); } - if (!sensors_get_label(*name,SENSORS_W83781D_FAN1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN1,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_FAN1,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_FAN1_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_W83781D_FAN1_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", cur,min,fdiv, alarms&W83781D_ALARM_FAN1?"ALARM":" ", beeps&W83781D_ALARM_FAN1?"(beep)":""); + } } else printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_FAN2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN2,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_FAN2,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_FAN2_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_W83781D_FAN2_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", cur,min,fdiv, alarms&W83781D_ALARM_FAN2?"ALARM":" ", beeps&W83781D_ALARM_FAN2?"(beep)":""); + } } else printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_FAN3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_FAN3,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_FAN3,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_FAN3_DIV,&fdiv) && !sensors_get_feature(*name,SENSORS_W83781D_FAN3_MIN,&min)) { - print_label(label,10); - printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", + if (valid) { + print_label(label,10); + printf("%4.0f RPM (min = %4.0f RPM, div = %1.0f) %s %s\n", cur,min,fdiv, alarms&W83781D_ALARM_FAN3?"ALARM":" ", beeps&W83781D_ALARM_FAN3?"(beep)":""); + } } else printf("ERROR: Can't get FAN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_TEMP1,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP1,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP1,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP1_HYST,&min) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP1_OVER,&max)) { - if((!is82d) && (!is83s)) { - print_label(label,10); - printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s %s\n", - cur,max,min, alarms&W83781D_ALARM_TEMP1 ?"ALARM":" ", - beeps&W83781D_ALARM_TEMP1?"(beep)":""); - } else { - if(!sensors_get_feature(*name,SENSORS_W83781D_SENS1,&sens)) { + if (valid) { + if((!is82d) && (!is83s)) { print_label(label,10); - printf( -"%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C, sensor = %s) %s %s\n", - cur,max,min, - (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)? - "3904 transistor":"thermistor", - alarms&W83781D_ALARM_TEMP1?"ALARM":" ", + printf("%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C) %s %s\n", + cur,max,min, alarms&W83781D_ALARM_TEMP1 ?"ALARM":" ", beeps&W83781D_ALARM_TEMP1?"(beep)":""); } else { - printf("ERROR: Can't get TEMP1 data!\n"); + if(!sensors_get_feature(*name,SENSORS_W83781D_SENS1,&sens)) { + print_label(label,10); + printf( + "%+3.0f C (limit = %+3.0f C, hysteresis = %+3.0f C, sensor = %s) %s %s\n", + cur,max,min, + (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)? + "3904 transistor":"thermistor", + alarms&W83781D_ALARM_TEMP1?"ALARM":" ", + beeps&W83781D_ALARM_TEMP1?"(beep)":""); + } else { + printf("ERROR: Can't get TEMP1 data!\n"); + } } } } else printf("ERROR: Can't get TEMP1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name,SENSORS_W83781D_TEMP2,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP2,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP2,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP2_HYST,&min) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP2_OVER,&max)) { - if((!is82d) && (!is83s)) { - print_label(label,10); - printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s %s\n", - cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":" ", - beeps&W83781D_ALARM_TEMP23?"(beep)":""); - } else { - if(!sensors_get_feature(*name,SENSORS_W83781D_SENS2,&sens)) { + if (valid) { + if((!is82d) && (!is83s)) { print_label(label,10); - printf( -"%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s %s\n", - cur,max,min, - (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)? - "3904 transistor":"thermistor", - alarms&W83781D_ALARM_TEMP2?"ALARM":" ", - beeps&W83781D_ALARM_TEMP2?"(beep)":""); + printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s %s\n", + cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":" ", + beeps&W83781D_ALARM_TEMP23?"(beep)":""); } else { - printf("ERROR: Can't get TEMP2 data!\n"); + if(!sensors_get_feature(*name,SENSORS_W83781D_SENS2,&sens)) { + print_label(label,10); + printf( + "%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s %s\n", + cur,max,min, + (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)? + "3904 transistor":"thermistor", + alarms&W83781D_ALARM_TEMP2?"ALARM":" ", + beeps&W83781D_ALARM_TEMP2?"(beep)":""); + } else { + printf("ERROR: Can't get TEMP2 data!\n"); + } } } } else @@ -1023,27 +1177,29 @@ void print_w83781d(const sensors_chip_name *name) free_the_label(&label); if (!is83s) { - if (!sensors_get_label(*name,SENSORS_W83781D_TEMP3,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_TEMP3,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP3,&cur) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP3_HYST,&min) && !sensors_get_feature(*name,SENSORS_W83781D_TEMP3_OVER,&max)) { - if(!is82d) { - print_label(label,10); - printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s %s\n", - cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":" ", - beeps&W83781D_ALARM_TEMP23?"(beep)":""); - } else { - if(!sensors_get_feature(*name,SENSORS_W83781D_SENS3,&sens)) { + if (valid) { + if(!is82d) { print_label(label,10); - printf( -"%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s %s\n", - cur,max,min, - (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)? - "3904 transistor":"thermistor", - alarms&W83781D_ALARM_TEMP3?"ALARM":" ", - beeps&W83781D_ALARM_TEMP3?"(beep)":""); + printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s %s\n", + cur,max,min, alarms&W83781D_ALARM_TEMP23 ?"ALARM":" ", + beeps&W83781D_ALARM_TEMP23?"(beep)":""); } else { - printf("ERROR: Can't get TEMP3 data!\n"); + if(!sensors_get_feature(*name,SENSORS_W83781D_SENS3,&sens)) { + print_label(label,10); + printf( + "%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C, sensor = %s) %s %s\n", + cur,max,min, + (((int)sens)==1)?"PII/Celeron diode":(((int)sens)==2)? + "3904 transistor":"thermistor", + alarms&W83781D_ALARM_TEMP3?"ALARM":" ", + beeps&W83781D_ALARM_TEMP3?"(beep)":""); + } else { + printf("ERROR: Can't get TEMP3 data!\n"); + } } } } else @@ -1051,10 +1207,12 @@ void print_w83781d(const sensors_chip_name *name) free_the_label(&label); } - if (!sensors_get_label(*name,SENSORS_W83781D_VID,&label) && + if (!sensors_get_label_and_valid(*name,SENSORS_W83781D_VID,&label,&valid) && !sensors_get_feature(*name,SENSORS_W83781D_VID,&cur)) { - print_label(label,10); - printf("%+5.2f V\n",cur); + if (valid) { + print_label(label,10); + printf("%+5.2f V\n",cur); + } } free_the_label(&label); @@ -1082,7 +1240,7 @@ void print_maxilife(const sensors_chip_name *name) { char *label = NULL; double cur, min, max; - int alarms; + int alarms,valid; if (!sensors_get_feature(*name, SENSORS_MAXI_CG_ALARMS, &cur)) alarms = cur + 0.5; @@ -1091,11 +1249,11 @@ void print_maxilife(const sensors_chip_name *name) alarms = 0; } - if (!sensors_get_label(*name, SENSORS_MAXI_CG_TEMP1, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP1, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1_MAX, &max) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP1_HYST, &min)) { - if (cur || max || min) { + if (valid && (cur || max || min)) { print_label(label, 12); printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C)\n", cur, max, min); @@ -1104,11 +1262,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get TEMP1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_TEMP2, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP2, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2_MAX, &max) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP2_HYST, &min)) { - if (cur || max || min) { + if (valid && (cur || max || min)) { print_label(label, 12); printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n", cur, max, min, alarms&MAXI_ALARM_TEMP2 ? "ALARM" : ""); @@ -1117,11 +1275,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get TEMP2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_TEMP3, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP3, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3_MAX, &max) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP3_HYST, &min)) { - if (cur || max || min) { + if (valid && (cur || max || min)) { print_label(label, 12); printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C)\n", cur, max, min); @@ -1130,11 +1288,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get TEMP3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_TEMP4, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP4, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4_MAX, &max) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP4_HYST, &min)) { - if (cur || max || min) { + if (valid && (cur || max || min)) { print_label(label, 12); printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n", cur, max, min, alarms&MAXI_ALARM_TEMP4 ? "ALARM" : ""); @@ -1143,11 +1301,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get TEMP4 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_TEMP5, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_TEMP5, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5_MAX, &max) && !sensors_get_feature(*name, SENSORS_MAXI_CG_TEMP5_HYST, &min)) { - if (cur || max || min) { + if (valid && (cur || max || min)) { print_label(label, 12); printf("%+3.1f C (limit = %+3.1f C, hysteresis = %+3.1f C) %s\n", cur, max, min, alarms&MAXI_ALARM_TEMP5 ? "ALARM" : ""); @@ -1156,11 +1314,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get TEMP5 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_FAN1, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN1, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN1_DIV, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); if (cur < 0) printf(" OFF (min = %4.0f RPM, div = %1.0f) %s\n", @@ -1173,11 +1331,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get FAN1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_FAN2, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN2, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN2_DIV, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); if (cur < 0) printf(" OFF (min = %4.0f RPM, div = %1.0f) %s\n", @@ -1190,11 +1348,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get FAN2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_FAN3, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_FAN3, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_FAN3_DIV, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); if (cur < 0) printf(" OFF (min = %4.0f RPM, div = %1.0f) %s\n", @@ -1207,11 +1365,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get FAN3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_PLL, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_PLL, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_PLL_MAX, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); printf("%4.2f MHz (min = %4.2f MHz, max = %4.2f MHz) %s\n", cur, min, max, alarms&MAXI_ALARM_PLL ? "ALARM" : ""); @@ -1220,11 +1378,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get PLL data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_VID1, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID1, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID1_MAX, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur, min, max, alarms&MAXI_ALARM_VID1 ? "ALARM" : ""); @@ -1233,11 +1391,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get VID1 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_VID2, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID2, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID2_MAX, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur, min, max, alarms&MAXI_ALARM_VID2 ? "ALARM" : ""); @@ -1246,11 +1404,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get VID2 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_VID3, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID3, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID3_MAX, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur, min, max, alarms&MAXI_ALARM_VID3 ? "ALARM" : ""); @@ -1259,11 +1417,11 @@ void print_maxilife(const sensors_chip_name *name) printf("ERROR: Can't get VID3 data!\n"); free_the_label(&label); - if (!sensors_get_label(*name, SENSORS_MAXI_CG_VID4, &label) && + if (!sensors_get_label_and_valid(*name, SENSORS_MAXI_CG_VID4, &label,&valid) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4, &cur) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4_MIN, &min) && !sensors_get_feature(*name, SENSORS_MAXI_CG_VID4_MAX, &max)) { - if (cur || min || max) { + if (valid && (cur || min || max)) { print_label(label, 12); printf("%+6.2f V (min = %+6.2f V, max = %+6.2f V) %s\n", cur, min, max, alarms&MAXI_ALARM_VID4 ? "ALARM" : ""); @@ -1275,17 +1433,19 @@ void print_maxilife(const sensors_chip_name *name) void print_unknown_chip(const sensors_chip_name *name) { - int a,b; + int a,b,valid; const sensors_feature_data *data; char *label; double val; a=b=0; while((data=sensors_get_all_features(*name,&a,&b))) { - if (sensors_get_label(*name,data->number,&label)) { + if (sensors_get_label_and_valid(*name,data->number,&label,&valid)) { printf("ERROR: Can't get feature `%s' data!",data->name); continue; } + if (! valid) + continue; if (data->mode & SENSORS_MODE_R) { if(sensors_get_feature(*name,data->number,&val)) { printf("ERROR: Can't get feature `%s' data!",data->name);