]> git.ipfire.org Git - oddments/collecty.git/commitdiff
sources: sensors: Remove the extra callback
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 23 Oct 2025 16:32:58 +0000 (16:32 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 23 Oct 2025 16:32:58 +0000 (16:32 +0000)
We can just directly send the map to the collection function.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/daemon/sources/sensors.c

index 0652a3715282bb206665e32ba250f7d4200d6745..61150d66869bd911ec245032884b4a771429a78f 100644 (file)
@@ -69,11 +69,81 @@ static int __sensors_make_name(char* name, size_t length, const char* chip, cons
        return 0;
 }
 
-typedef int (*find_sensors_callback)(td_ctx* ctx, td_source* source,
-       const sensors_chip_name* chip, const sensors_feature* feature, td_metrics* metrics);
+typedef struct sensors_value {
+       // Field
+       const char* field;
+
+       // Type
+       sensors_subfeature_type type;
+} sensors_value;
+
+static int read_values(td_ctx* ctx, const sensors_chip_name* chip,
+               const sensors_feature* feature, td_metrics* metrics, const sensors_value* values) {
+       const sensors_subfeature* subfeature = NULL;
+       double value = 0;
+       int index = 0;
+       int r;
+
+       // Iterate over all subfeatures
+       for (;;) {
+               subfeature = sensors_get_all_subfeatures(chip, feature, &index);
+               if (!subfeature)
+                       break;
+
+               // Search for any matching values and read them
+               for (const sensors_value* v = values; v->field; v++) {
+                       if (subfeature->type == v->type) {
+                               // Read the value
+                               r = sensors_get_value(chip, subfeature->number, &value);
+                               if (r < 0)
+                                       return r;
+
+                               // Convert some temperature values from Celsius to Kelvin
+                               switch (v->type) {
+                                       case SENSORS_SUBFEATURE_TEMP_INPUT:
+                                       case SENSORS_SUBFEATURE_TEMP_MAX:
+                                       case SENSORS_SUBFEATURE_TEMP_MAX_HYST:
+                                       case SENSORS_SUBFEATURE_TEMP_MIN:
+                                       case SENSORS_SUBFEATURE_TEMP_CRIT:
+                                       case SENSORS_SUBFEATURE_TEMP_CRIT_HYST:
+                                       case SENSORS_SUBFEATURE_TEMP_LCRIT:
+                                       case SENSORS_SUBFEATURE_TEMP_EMERGENCY:
+                                       case SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST:
+                                       case SENSORS_SUBFEATURE_TEMP_LOWEST:
+                                       case SENSORS_SUBFEATURE_TEMP_HIGHEST:
+                                       case SENSORS_SUBFEATURE_TEMP_ALARM:
+                                       case SENSORS_SUBFEATURE_TEMP_MAX_ALARM:
+                                       case SENSORS_SUBFEATURE_TEMP_MIN_ALARM:
+                                       case SENSORS_SUBFEATURE_TEMP_CRIT_ALARM:
+                                       case SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM:
+                                       case SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM:
+                                       case SENSORS_SUBFEATURE_TEMP_FAULT:
+                                       case SENSORS_SUBFEATURE_TEMP_TYPE:
+                                       case SENSORS_SUBFEATURE_TEMP_OFFSET:
+                                       case SENSORS_SUBFEATURE_TEMP_BEEP:
+                                               value += 273.15;
+                                               break;
 
-static int find_sensors(td_ctx* ctx, td_source* source,
-               sensors_feature_type type, find_sensors_callback callback) {
+                                       default:
+                                               break;
+                               }
+
+                               // Push the value
+                               r = td_metrics_push_float(metrics, v->field, value);
+                               if (r < 0)
+                                       return r;
+
+                               // We are done for this subfeature
+                               break;
+                       }
+               }
+       }
+
+       return 0;
+}
+
+static int read_sensors(td_ctx* ctx, td_source* source,
+               sensors_feature_type type, const sensors_value* values) {
        const sensors_feature* feature = NULL;
        const sensors_chip_name* chip = NULL;
        td_metrics* metrics = NULL;
@@ -131,8 +201,8 @@ static int find_sensors(td_ctx* ctx, td_source* source,
                        if (r < 0)
                                goto ERROR;
 
-                       // Call the callback
-                       r = callback(ctx, source, chip, feature, metrics);
+                       // Read the values
+                       r = read_values(ctx, chip, feature, metrics, values);
                        if (r < 0)
                                goto ERROR;
 
@@ -157,85 +227,11 @@ ERROR:
        return r;
 }
 
-typedef struct sensors_value {
-       // Field
-       const char* field;
-
-       // Type
-       sensors_subfeature_type type;
-} sensors_value;
-
-static int read_sensors(td_ctx* ctx, const sensors_chip_name* chip,
-               const sensors_feature* feature, td_metrics* metrics, sensors_value* values) {
-       const sensors_subfeature* subfeature = NULL;
-       double value = 0;
-       int index = 0;
-       int r;
-
-       // Iterate over all subfeatures
-       for (;;) {
-               subfeature = sensors_get_all_subfeatures(chip, feature, &index);
-               if (!subfeature)
-                       break;
-
-               // Search for any matching values and read them
-               for (sensors_value* v = values; v->field; v++) {
-                       if (subfeature->type == v->type) {
-                               // Read the value
-                               r = sensors_get_value(chip, subfeature->number, &value);
-                               if (r < 0)
-                                       return r;
-
-                               // Convert some temperature values from Celsius to Kelvin
-                               switch (v->type) {
-                                       case SENSORS_SUBFEATURE_TEMP_INPUT:
-                                       case SENSORS_SUBFEATURE_TEMP_MAX:
-                                       case SENSORS_SUBFEATURE_TEMP_MAX_HYST:
-                                       case SENSORS_SUBFEATURE_TEMP_MIN:
-                                       case SENSORS_SUBFEATURE_TEMP_CRIT:
-                                       case SENSORS_SUBFEATURE_TEMP_CRIT_HYST:
-                                       case SENSORS_SUBFEATURE_TEMP_LCRIT:
-                                       case SENSORS_SUBFEATURE_TEMP_EMERGENCY:
-                                       case SENSORS_SUBFEATURE_TEMP_EMERGENCY_HYST:
-                                       case SENSORS_SUBFEATURE_TEMP_LOWEST:
-                                       case SENSORS_SUBFEATURE_TEMP_HIGHEST:
-                                       case SENSORS_SUBFEATURE_TEMP_ALARM:
-                                       case SENSORS_SUBFEATURE_TEMP_MAX_ALARM:
-                                       case SENSORS_SUBFEATURE_TEMP_MIN_ALARM:
-                                       case SENSORS_SUBFEATURE_TEMP_CRIT_ALARM:
-                                       case SENSORS_SUBFEATURE_TEMP_EMERGENCY_ALARM:
-                                       case SENSORS_SUBFEATURE_TEMP_LCRIT_ALARM:
-                                       case SENSORS_SUBFEATURE_TEMP_FAULT:
-                                       case SENSORS_SUBFEATURE_TEMP_TYPE:
-                                       case SENSORS_SUBFEATURE_TEMP_OFFSET:
-                                       case SENSORS_SUBFEATURE_TEMP_BEEP:
-                                               value += 273.15;
-                                               break;
-
-                                       default:
-                                               break;
-                               }
-
-                               // Push the value
-                               r = td_metrics_push_float(metrics, v->field, value);
-                               if (r < 0)
-                                       return r;
-
-                               // We are done for this subfeature
-                               break;
-                       }
-               }
-       }
-
-       return 0;
-}
-
 /*
        (Voltage) Input
 */
-static int read_input_sensors(td_ctx* ctx, td_source* source, const sensors_chip_name* chip,
-               const sensors_feature* feature, td_metrics* metrics) {
-       sensors_value values[] = {
+static int sensors_input_heartbeat(td_ctx* ctx, td_source* source) {
+       const sensors_value values[] = {
                { "current",     SENSORS_SUBFEATURE_IN_INPUT },
                { "min",         SENSORS_SUBFEATURE_IN_MIN },
                { "max",         SENSORS_SUBFEATURE_IN_MAX },
@@ -253,12 +249,7 @@ static int read_input_sensors(td_ctx* ctx, td_source* source, const sensors_chip
                { NULL },
        };
 
-       // Read values
-       return read_sensors(ctx, chip, feature, metrics, values);
-}
-
-static int sensors_input_heartbeat(td_ctx* ctx, td_source* source) {
-       return find_sensors(ctx, source, SENSORS_FEATURE_IN, read_input_sensors);
+       return read_sensors(ctx, source, SENSORS_FEATURE_IN, values);
 }
 
 const td_source_impl sensors_input_source = {
@@ -290,8 +281,7 @@ const td_source_impl sensors_input_source = {
 /*
        Temperature
 */
-static int read_temp_sensors(td_ctx* ctx, td_source* source, const sensors_chip_name* chip,
-               const sensors_feature* feature, td_metrics* metrics) {
+static int sensors_temp_heartbeat(td_ctx* ctx, td_source* source) {
        sensors_value values[] = {
                { "current",         SENSORS_SUBFEATURE_TEMP_INPUT },
                { "max",             SENSORS_SUBFEATURE_TEMP_MAX },
@@ -318,12 +308,7 @@ static int read_temp_sensors(td_ctx* ctx, td_source* source, const sensors_chip_
                { NULL },
        };
 
-       // Read values
-       return read_sensors(ctx, chip, feature, metrics, values);
-}
-
-static int sensors_temp_heartbeat(td_ctx* ctx, td_source* source) {
-       return find_sensors(ctx, source, SENSORS_FEATURE_TEMP, read_temp_sensors);
+       return read_sensors(ctx, source, SENSORS_FEATURE_TEMP, values);
 }
 
 const td_source_impl sensors_temp_source = {