static int add_config_from_dir(const char *dir) { int count, res, i; struct dirent **namelist; count = scandir(dir, &namelist, config_file_filter, (int (*)(const struct dirent **, const struct dirent **))alphasort); if (count < 0) { /* Do not return an error if directory does not exist */ if (errno == ENOENT) return 0; sensors_parse_error_wfn(strerror(errno), NULL, 0); return -SENSORS_ERR_PARSE; } for (res = 0, i = 0; !res && i < count; i++) { int len; char path[PATH_MAX]; FILE *input; struct stat st; len = snprintf(path, sizeof(path), "%s/%s", dir, namelist[i]->d_name); if (len < 0 || len >= (int)sizeof(path)) { res = -SENSORS_ERR_PARSE; continue; } /* Only accept regular files */ if (stat(path, &st) < 0 || !S_ISREG(st.st_mode)) continue; input = fopen(path, "r"); if (input) { res = parse_config(input, path); fclose(input); } else { res = -SENSORS_ERR_PARSE; sensors_parse_error_wfn(strerror(errno), path, 0); } } /* Free memory allocated by scandir() */ for (i = 0; i < count; i++) free(namelist[i]); free(namelist); return res; }
/* Execute all set statements for this particular chip. The chip may not contain wildcards! This function will return 0 on success, and <0 on failure. */ static int sensors_do_this_chip_sets(const sensors_chip_name *name) { const sensors_chip_features *chip_features; sensors_chip *chip; double value; int i; int err = 0, res; const sensors_subfeature *subfeature; chip_features = sensors_lookup_chip(name); /* Can't fail */ for (chip = NULL; (chip = sensors_for_all_config_chips(name, chip));) for (i = 0; i < chip->sets_count; i++) { subfeature = sensors_lookup_subfeature_name(chip_features, chip->sets[i].name); if (!subfeature) { sensors_parse_error_wfn("Unknown feature name", chip->sets[i].line.filename, chip->sets[i].line.lineno); err = -SENSORS_ERR_NO_ENTRY; continue; } res = sensors_eval_expr(chip_features, chip->sets[i].value, 0, 0, &value); if (res) { sensors_parse_error_wfn("Error parsing expression", chip->sets[i].line.filename, chip->sets[i].line.lineno); err = res; continue; } if ((res = sensors_set_value(name, subfeature->number, value))) { sensors_parse_error_wfn("Failed to set value", chip->sets[i].line.filename, chip->sets[i].line.lineno); err = res; continue; } } return err; }
int sensors_init(FILE *input) { int res; if (!sensors_init_sysfs()) return -SENSORS_ERR_KERNEL; if ((res = sensors_read_sysfs_bus()) || (res = sensors_read_sysfs_chips())) goto exit_cleanup; if (input) { res = parse_config(input, NULL); if (res) goto exit_cleanup; } else { const char* name; /* No configuration provided, use default */ input = fopen(name = DEFAULT_CONFIG_FILE, "r"); if (!input && errno == ENOENT) input = fopen(name = ALT_CONFIG_FILE, "r"); if (input) { res = parse_config(input, name); fclose(input); if (res) goto exit_cleanup; } else if (errno != ENOENT) { sensors_parse_error_wfn(strerror(errno), name, 0); res = -SENSORS_ERR_PARSE; goto exit_cleanup; } /* Also check for files in default directory */ res = add_config_from_dir(DEFAULT_CONFIG_DIR); if (res) goto exit_cleanup; } return 0; exit_cleanup: sensors_cleanup(); return res; }