Пример #1
0
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;
}
Пример #2
0
/* 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;
}
Пример #3
0
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;
}