From e4ee28d5c84cec550f7c16dbccfc296581dbda0a Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Sun, 15 Feb 2009 17:22:38 +0000 Subject: [PATCH] Read extra configuration files from /etc/sensors.d. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@5647 7894878c-1315-0410-8ee3-d5d059ff63e0 --- CHANGES | 1 + lib/init.c | 60 +++++++++++++++++++++++++++++++++++++++++++++- lib/libsensors.3 | 16 ++++++++++--- lib/sensors.conf.5 | 20 ++++++++++++++-- 4 files changed, 91 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 51dbac75..3d069670 100644 --- a/CHANGES +++ b/CHANGES @@ -12,6 +12,7 @@ SVN-HEAD Report configuration file read errors Exit the configuration file parser sooner Free bus statements from the configuration file sooner + Read extra configuration files from /etc/sensors.d lm_sensors.init: Support new format of /etc/sysconfig/lm_sensors (#2246) Drop support for kernels 2.4 and earlier lm_sensors.init.suse: Delete (actual SuSE script is much different) diff --git a/lib/init.c b/lib/init.c index f1126dac..ca02f1c4 100644 --- a/lib/init.c +++ b/lib/init.c @@ -1,7 +1,7 @@ /* init.c - Part of libsensors, a Linux library for reading sensor data. Copyright (c) 1998, 1999 Frodo Looijaard - Copyright (C) 2007 Jean Delvare + Copyright (C) 2007, 2009 Jean Delvare This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,11 +19,16 @@ MA 02110-1301 USA. */ +/* Needed for scandir() and alphasort() */ +#define _BSD_SOURCE + +#include #include #include #include #include #include +#include #include "sensors.h" #include "data.h" #include "error.h" @@ -35,6 +40,7 @@ #define DEFAULT_CONFIG_FILE ETCDIR "/sensors3.conf" #define ALT_CONFIG_FILE ETCDIR "/sensors.conf" +#define DEFAULT_CONFIG_DIR ETCDIR "/sensors.d" /* Wrapper around sensors_yyparse(), which clears the locale so that the decimal numbers are always parsed properly. */ @@ -99,6 +105,53 @@ exit_cleanup: return err; } +static int config_file_filter(const struct dirent *entry) +{ + return (entry->d_type == DT_REG || entry->d_type == DT_LNK) + && entry->d_name[0] != '.'; /* Skip hidden files */ +} + +static int add_config_from_dir(const char *dir) +{ + int count, res, i; + struct dirent **namelist; + + count = scandir(dir, &namelist, config_file_filter, alphasort); + if (count < 0) { + sensors_parse_error(strerror(errno), 0); + return -SENSORS_ERR_PARSE; + } + + for (res = 0, i = 0; !res && i < count; i++) { + int len; + char path[PATH_MAX]; + FILE *input; + + len = snprintf(path, sizeof(path), "%s/%s", dir, + namelist[i]->d_name); + if (len < 0 || len >= (int)sizeof(path)) { + res = -SENSORS_ERR_PARSE; + continue; + } + + input = fopen(path, "r"); + if (input) { + res = parse_config(input); + fclose(input); + } else { + res = -SENSORS_ERR_PARSE; + sensors_parse_error(strerror(errno), 0); + } + } + + /* Free memory allocated by scandir() */ + for (i = 0; i < count; i++) + free(namelist[i]); + free(namelist); + + return res; +} + int sensors_init(FILE *input) { int res; @@ -129,6 +182,11 @@ int sensors_init(FILE *input) 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; diff --git a/lib/libsensors.3 b/lib/libsensors.3 index ebe33a96..e3ff0c49 100644 --- a/lib/libsensors.3 +++ b/lib/libsensors.3 @@ -1,4 +1,5 @@ -.\" Copyright 1998, 1999 Adrian Baugh +.\" Copyright (C) 1998, 1999 Adrian Baugh +.\" Copyright (C) 2007, 2009 Jean Delvare .\" based on sensors.h, part of libsensors by Frodo Looijaard .\" libsensors is distributed under the GPL .\" @@ -24,7 +25,7 @@ .\" .\" References consulted: .\" libsensors source code -.TH libsensors 3 "October 2007" "lm-sensors 3" "Linux Programmer's Manual" +.TH libsensors 3 "February 2009" "lm-sensors 3" "Linux Programmer's Manual" .SH NAME libsensors \- publicly accessible functions provided by the sensors library .SH SYNOPSIS @@ -57,7 +58,7 @@ value unequal to zero, you are in trouble; you can not assume anything will be initialized properly. If you want to reload the configuration file, call sensors_cleanup() below before calling sensors_init() again. -If FILE is NULL, the default configuration file is used (see the FILES +If FILE is NULL, the default configuration files are used (see the FILES section below). Most applications will want to do that. .B void sensors_cleanup(void); @@ -180,6 +181,15 @@ The system-wide .BR libsensors (3) configuration file. /etc/sensors3.conf is tried first, and if it doesn't exist, /etc/sensors.conf is used instead. +.RE + +.I /etc/sensors.d +.RS +A directory where you can put additional libsensors configuration files. +Files found in this directory will be processed in alphabetical order after +the default configuration file. Files with names that start with a dot are +ignored. +.RE .SH SEE ALSO sensors.conf(5) diff --git a/lib/sensors.conf.5 b/lib/sensors.conf.5 index 8db4b152..8cfdccac 100644 --- a/lib/sensors.conf.5 +++ b/lib/sensors.conf.5 @@ -1,6 +1,6 @@ .\" Copyright (C) 1998, 1999 Adrian Baugh and .\" Frodo Looijaard -.\" Copyright (C) 2008 Jean Delvare +.\" Copyright (C) 2008, 2009 Jean Delvare .\" .\" Permission is granted to make and distribute verbatim copies of this .\" manual provided the copyright notice and this permission notice are @@ -21,7 +21,7 @@ .\" .\" References consulted: .\" sensors.conf.eg by Frodo Looijaard -.TH sensors.conf 5 "December 2008" "lm-sensors 3" "Linux User's Manual" +.TH sensors.conf 5 "February 2009" "lm-sensors 3" "Linux User's Manual" .SH NAME sensors.conf \- libsensors configuration file @@ -274,6 +274,13 @@ Running .B sensors --bus-list will generate these lines for you. +In the case where multiple configuration files are used, the scope +of each +.I bus +statement is the configuration file it was defined in. This makes it +possible to have bus statements in all configuration files which will +not unexpectedly interfere with each other. + .SS STATEMENT ORDER Statements can go in any order, however it is recommended to put @@ -533,6 +540,15 @@ The system-wide .BR libsensors (3) configuration file. /etc/sensors3.conf is tried first, and if it doesn't exist, /etc/sensors.conf is used instead. +.RE + +.I /etc/sensors.d +.RS +A directory where you can put additional libsensors configuration files. +Files found in this directory will be processed in alphabetical order after +the default configuration file. Files with names that start with a dot are +ignored. +.RE .SH SEE ALSO libsensors(3)