From 8199abde46ecb9cc5b0ea5e2c4456c219ecd4bef Mon Sep 17 00:00:00 2001 From: Frodo Looijaard Date: Fri, 24 Dec 1999 22:44:41 +0000 Subject: [PATCH] New sensors.conf keyword 'ignore' This often-asked for, long-planned and somewhat-forgotten feature makes it possible to tell libsensors-linked applications (like the sensors program) that certain features should not be displayed. This is very nice for things like unconnected temperature sensors or fans. Modifications to the library code, to the sensors program and to the documentation and example sensors.conf file. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@676 7894878c-1315-0410-8ee3-d5d059ff63e0 --- etc/sensors.conf.eg | 7 +- lib/Module.mk | 4 +- lib/access.c | 50 ++- lib/conf-lex.l | 5 + lib/conf-parse.y | 17 + lib/data.h | 9 + lib/init.c | 11 + lib/sensors.conf.5 | 19 +- lib/sensors.h | 8 +- prog/sensors/chips.c | 894 +++++++++++++++++++++++++------------------ 10 files changed, 648 insertions(+), 376 deletions(-) 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);