* Re: [lm-sensors] [PATCH 3/8] sensord: Introduce struct
@ 2009-04-19 8:06 Jean Delvare
2009-04-21 7:37 ` Andre Prendel
0 siblings, 1 reply; 2+ messages in thread
From: Jean Delvare @ 2009-04-19 8:06 UTC (permalink / raw)
To: lm-sensors
Hi Andre,
On Mon, 6 Apr 2009 09:57:09 +0200, Andre Prendel wrote:
> Introduce struct sensord_arguments.
>
> This structure encapsulate all the variables holding the commandline
> arguments. So we get rid of plenty of extern variables. This reduces
> namespace collisions and unifies access.
Good idea.
> ---
>
> args.c | 100 +++++++++++++++++++++++++++++---------------------------------
> args.h | 30 ++++++++++++++++++
> rrd.c | 49 +++++++++++++++++-------------
> sense.c | 6 +--
> sensord.c | 57 +++++++++++++++++++----------------
> sensord.h | 18 -----------
> 6 files changed, 140 insertions(+), 120 deletions(-)
>
> --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> +++ quilt-sensors/prog/sensord/args.h 2009-04-05 17:12:32.000000000 +0200
> @@ -0,0 +1,30 @@
> +#ifndef SENSORD_ARGS_H
> +#define SENSORD_ARGS_H
> +
> +#include <lib/sensors.h>
> +
> +#define MAX_CHIP_NAMES 32
> +
> +struct sensord_arguments {
> + int isDaemon;
> + const char *cfgFile;
> + const char *pidFile;
> + const char *rrdFile;
> + const char *cgiDir;
> + int scanTime;
> + int logTime;
> + int rrdTime;
> + int rrdNoAverage;
> + int syslogFacility;
> + int doScan;
> + int doSet;
> + int doCGI;
> + int doLoad;
> + int debug;
> + sensors_chip_name chipNames[MAX_CHIP_NAMES];
> + int numChipNames;
> +};
> +
> +extern struct sensord_arguments sensord_args;
> +
> +#endif /* SENSORD_ARGS_H */
>
> --- quilt-sensors.orig/prog/sensord/args.c 2009-04-04 18:25:19.000000000 +0200
> +++ quilt-sensors/prog/sensord/args.c 2009-04-05 17:15:55.000000000 +0200
> @@ -27,29 +27,19 @@
> #include <getopt.h>
> #include <syslog.h>
>
> +#include "args.h"
> #include "sensord.h"
> #include "lib/error.h"
> #include "version.h"
>
> -#define MAX_CHIP_NAMES 32
> -
> -int isDaemon = 0;
> -const char *sensorsCfgFile = NULL;
> -const char *pidFile = "/var/run/sensord.pid";
> -const char *rrdFile = NULL;
> -const char *cgiDir = NULL;
> -int scanTime = 60;
> -int logTime = 30 * 60;
> -int rrdTime = 5 * 60;
> -int rrdNoAverage = 0;
> -int syslogFacility = LOG_LOCAL4;
> -int doScan = 0;
> -int doSet = 0;
> -int doCGI = 0;
> -int doLoad = 0;
> -int debug = 0;
> -sensors_chip_name chipNames[MAX_CHIP_NAMES];
> -int numChipNames = 0;
> +struct sensord_arguments sensord_args = {
> + .isDaemon = 0,
I'm curious why you initialize this field to 0 explicitly and none of
the other 0 fields? I'm fairly certain global variables are initialized
to 0 by the compiler so the above isn't needed.
> + .pidFile = "/var/run/sensord.pid",
> + .scanTime = 60,
> + .logTime = 30 * 60,
> + .rrdTime = 5 * 60,
> + .syslogFacility = LOG_LOCAL4,
> +};
>
> static int parseTime(char *arg)
> {
> @@ -170,12 +160,12 @@
> const char *shortOptions;
> const struct option *longOptions;
>
> - isDaemon = (argv[0][strlen (argv[0]) - 1] = 'd');
> - if (!isDaemon) {
> + sensord_args.isDaemon = (argv[0][strlen (argv[0]) - 1] = 'd');
> + if (!sensord_args.isDaemon) {
> fprintf(stderr, "Sensord no longer runs as an commandline"
> " application.\n");
> - return -1;
> - }
> + return -1;
> + }
You're adding leading spaces!
>
> shortOptions = daemonShortOptions;
> longOptions = daemonLongOptions;
> @@ -184,48 +174,49 @@
> != EOF) {
> switch(c) {
> case 'i':
> - if ((scanTime = parseTime(optarg)) < 0)
> + if ((sensord_args.scanTime = parseTime(optarg)) < 0)
> return -1;
> break;
> case 'l':
> - if ((logTime = parseTime(optarg)) < 0)
> + if ((sensord_args.logTime = parseTime(optarg)) < 0)
> return -1;
> break;
> case 't':
> - if ((rrdTime = parseTime(optarg)) < 0)
> + if ((sensord_args.rrdTime = parseTime(optarg)) < 0)
> return -1;
> break;
> case 'T':
> - rrdNoAverage = 1;
> + sensord_args.rrdNoAverage = 1;
> break;
> case 'f':
> - if ((syslogFacility = parseFacility(optarg)) < 0)
> + sensord_args.syslogFacility = parseFacility(optarg);
> + if (sensord_args.syslogFacility < 0)
> return -1;
> break;
> case 'a':
> - if (isDaemon)
> - doLoad = 1;
> + if (sensord_args.isDaemon)
> + sensord_args.doLoad = 1;
> else
> - doScan = 1;
> + sensord_args.doScan = 1;
> break;
> case 's':
> - doSet = 1;
> + sensord_args.doSet = 1;
> break;
> case 'c':
> - sensorsCfgFile = optarg;
> + sensord_args.cfgFile = optarg;
> break;
> case 'p':
> - pidFile = optarg;
> + sensord_args.pidFile = optarg;
> break;
> case 'r':
> - rrdFile = optarg;
> + sensord_args.rrdFile = optarg;
> break;
> case 'd':
> - debug = 1;
> + sensord_args.debug = 1;
> break;
> case 'g':
> - doCGI = 1;
> - cgiDir = optarg;
> + sensord_args.doCGI = 1;
> + sensord_args.cgiDir = optarg;
> break;
> case 'v':
> printf("sensord version %s\n", LM_VERSION);
> @@ -250,37 +241,38 @@
> }
> }
>
> - if (doScan && doSet) {
> + if (sensord_args.doScan && sensord_args.doSet) {
> fprintf(stderr,
> "Error: Incompatible --set and --alarm-scan.\n");
> return -1;
> }
>
> - if (rrdFile && doSet) {
> + if (sensord_args.rrdFile && sensord_args.doSet) {
> fprintf(stderr,
> "Error: Incompatible --set and --rrd-file.\n");
> return -1;
> }
>
> - if (doScan && rrdFile) {
> + if (sensord_args.doScan && sensord_args.rrdFile) {
> fprintf(stderr,
> "Error: Incompatible --rrd-file and --alarm-scan.\n");
> return -1;
> }
>
> - if (doCGI && !rrdFile) {
> + if (sensord_args.doCGI && !sensord_args.rrdFile) {
> fprintf(stderr,
> "Error: Incompatible --rrd-cgi without --rrd-file.\n");
> return -1;
> }
>
> - if (rrdFile && !rrdTime) {
> + if (sensord_args.rrdFile && !sensord_args.rrdTime) {
> fprintf(stderr,
> "Error: Incompatible --rrd-file without --rrd-interval.\n");
> return -1;
> }
>
> - if (!logTime && !scanTime && !rrdFile) {
> + if (!sensord_args.logTime && !sensord_args.scanTime &&
> + !sensord_args.rrdFile) {
> fprintf(stderr,
> "Error: No logging, alarm or RRD scanning.\n");
> return -1;
> @@ -292,11 +284,12 @@
> int parseChips(int argc, char **argv)
> {
> if (optind = argc) {
> - chipNames[0].prefix = SENSORS_CHIP_NAME_PREFIX_ANY;
> - chipNames[0].bus.type = SENSORS_BUS_TYPE_ANY;
> - chipNames[0].bus.nr = SENSORS_BUS_NR_ANY;
> - chipNames[0].addr = SENSORS_CHIP_NAME_ADDR_ANY;
> - numChipNames = 1;
> + sensord_args.chipNames[0].prefix > + SENSORS_CHIP_NAME_PREFIX_ANY;
> + sensord_args.chipNames[0].bus.type = SENSORS_BUS_TYPE_ANY;
> + sensord_args.chipNames[0].bus.nr = SENSORS_BUS_NR_ANY;
> + sensord_args.chipNames[0].addr = SENSORS_CHIP_NAME_ADDR_ANY;
> + sensord_args.numChipNames = 1;
> } else {
> int i, n = argc - optind, err;
> if (n > MAX_CHIP_NAMES) {
> @@ -305,15 +298,18 @@
> }
> for (i = 0; i < n; ++ i) {
> char *arg = argv[optind + i];
> - if ((err = sensors_parse_chip_name(arg,
> - chipNames + i))) {
> +
> + err = sensors_parse_chip_name(arg,
> + sensord_args.chipNames +
> + i);
> + if (err) {
> fprintf(stderr,
> "Invalid chip name `%s': %s\n", arg,
> sensors_strerror(err));
> return -1;
> }
> }
> - numChipNames = n;
> + sensord_args.numChipNames = n;
> }
> return 0;
> }
>
> --- quilt-sensors.orig/prog/sensord/rrd.c 2009-04-04 18:25:19.000000000 +0200
> +++ quilt-sensors/prog/sensord/rrd.c 2009-04-05 17:11:30.000000000 +0200
> @@ -43,6 +43,7 @@
>
> #include <rrd.h>
>
> +#include "args.h"
> #include "sensord.h"
>
> #define DO_READ 0
> @@ -141,9 +142,9 @@
> const sensors_chip_name *chip;
> int i, j, ret = 0, num = 0;
>
> - for (j = 0; (ret = 0) && (j < numChipNames); ++ j) {
> + for (j = 0; (ret = 0) && (j < sensord_args.numChipNames); ++ j) {
> i = 0;
> - while ((ret = 0) && ((chip = sensors_get_detected_chips(&chipNames[j], &i)) != NULL)) {
> + while ((ret = 0) && ((chip = sensors_get_detected_chips(&sensord_args.chipNames[j], &i)) != NULL)) {
> int index0, chipindex = -1;
>
> /* Trick: we compare addresses here. We know it works
> @@ -223,8 +224,8 @@
> * number of seconds downtime during which average be used
> * instead of unknown
> */
> - sprintf(ptr, "DS:%s:GAUGE:%d:%s:%s", rawLabel, 5 * rrdTime,
> - min, max);
> + sprintf(ptr, "DS:%s:GAUGE:%d:%s:%s", rawLabel, 5 *
> + sensord_args.rrdTime, min, max);
> }
> return 0;
> }
> @@ -234,7 +235,7 @@
> int ret = 0;
> struct ds data = { 0, argv};
> ret = applyToFeatures(rrdGetSensors_DS, &data);
> - if (!ret && doLoad)
> + if (!ret && sensord_args.doLoad)
> ret = rrdGetSensors_DS(&data, LOADAVG, LOAD_AVERAGE, NULL);
> return ret ? -1 : data.num;
> }
> @@ -245,12 +246,12 @@
> struct stat tmp;
>
> sensorLog(LOG_DEBUG, "sensor RRD init");
> - if (stat(rrdFile, &tmp)) {
> + if (stat(sensord_args.rrdFile, &tmp)) {
> if (errno = ENOENT) {
> char stepBuff[STEP_BUFF], rraBuff[RRA_BUFF];
> int argc = 4, num;
> const char *argv[6 + MAX_RRD_SENSORS] = {
> - "sensord", rrdFile, "-s", stepBuff
> + "sensord", sensord_args.rrdFile, "-s", stepBuff
> };
>
> sensorLog(LOG_INFO, "creating round robin database");
> @@ -258,17 +259,21 @@
> if (num = 0) {
> sensorLog(LOG_ERR,
> "Error creating RRD: %s: %s",
> - rrdFile, "No sensors detected");
> + sensord_args.rrdFile,
> + "No sensors detected");
> ret = 2;
> } else if (num < 0) {
> ret = -num;
> } else {
> - sprintf(stepBuff, "%d", rrdTime);
> + sprintf(stepBuff, "%d", sensord_args.rrdTime);
> sprintf(rraBuff, "RRA:%s:%f:%d:%d",
> - rrdNoAverage?"LAST":"AVERAGE",
> + sensord_args.rrdNoAverage ? "LAST" :
> + "AVERAGE",
> 0.5 /* fraction of non-unknown samples needed per entry */,
> 1 /* samples per entry */,
> - 7 * 24 * 60 * 60 / rrdTime /* 1 week */);
> + 7 * 24 * 60 * 60 /
> + sensord_args.rrdTime /* 1 week */);
> +
> argc += num;
> argv[argc ++] = rraBuff;
> argv[argc] = NULL;
> @@ -276,12 +281,13 @@
> (char **) /* WEAK */ argv))) {
> sensorLog(LOG_ERR,
> "Error creating RRD file: %s: %s",
> - rrdFile, rrd_get_error());
> + sensord_args.rrdFile,
> + rrd_get_error());
> }
> }
> } else {
> sensorLog(LOG_ERR, "Error stat()ing RRD: %s: %s",
> - rrdFile, strerror(errno));
> + sensord_args.rrdFile, strerror(errno));
> ret = 1;
> }
> }
> @@ -310,8 +316,8 @@
> struct gr *data = (struct gr *) _data;
> (void) label; /* no warning */
> if (!feature || (feature->rrd && (feature->type = data->type)))
> - printf("\n\tDEF:%s=%s:%s:AVERAGE", rawLabel, rrdFile,
> - rawLabel);
> + printf("\n\tDEF:%s=%s:%s:AVERAGE", rawLabel,
> + sensord_args.rrdFile, rawLabel);
> return 0;
> }
>
> @@ -420,7 +426,8 @@
> int rrdUpdate(void)
> {
> int ret = rrdChips ();
> - if (!ret && doLoad) {
> +
> + if (!ret && sensord_args.doLoad) {
> FILE *loadavg;
> if (!(loadavg = fopen("/proc/loadavg", "r"))) {
> sensorLog(LOG_ERR,
> @@ -442,11 +449,11 @@
> }
> if (!ret) {
> const char *argv[] = {
> - "sensord", rrdFile, rrdBuff, NULL
> + "sensord", sensord_args.rrdFile, rrdBuff, NULL
> };
> if ((ret = rrd_update(3, (char **) /* WEAK */ argv))) {
> sensorLog(LOG_ERR, "Error updating RRD file: %s: %s",
> - rrdFile, rrd_get_error());
> + sensord_args.rrdFile, rrd_get_error());
> }
> }
> sensorLog(LOG_DEBUG, "sensor rrd updated");
> @@ -463,17 +470,17 @@
> while (graph->type != DataType_other) {
> printf("<H2>%s</H2>\n", graph->h2);
> printf("<P>\n<RRD::GRAPH %s/%s.png\n\t--imginfo '<IMG SRC=" WWWDIR "/%%s WIDTH=%%lu HEIGHT=%%lu>'\n\t-a PNG\n\t-h 200 -w 800\n",
> - cgiDir, graph->image);
> + sensord_args.cgiDir, graph->image);
> printf("\t--lazy\n\t-v '%s'\n\t-t '%s'\n\t-x '%s'\n\t%s",
> graph->axisTitle, graph->title, graph->axisDefn,
> graph->options);
> if (!ret)
> ret = applyToFeatures(rrdCGI_DEF, graph);
> - if (!ret && doLoad && graph->loadAvg)
> + if (!ret && sensord_args.doLoad && graph->loadAvg)
> ret = rrdCGI_DEF(graph, LOADAVG, LOAD_AVERAGE, NULL);
> if (!ret)
> ret = applyToFeatures(rrdCGI_LINE, graph);
> - if (!ret && doLoad && graph->loadAvg)
> + if (!ret && sensord_args.doLoad && graph->loadAvg)
> ret = rrdCGI_LINE(graph, LOADAVG, LOAD_AVERAGE, NULL);
> printf (">\n</P>\n");
> ++ graph;
>
> --- quilt-sensors.orig/prog/sensord/sensord.c 2009-04-04 18:25:19.000000000 +0200
> +++ quilt-sensors/prog/sensord/sensord.c 2009-04-05 17:11:30.000000000 +0200
> @@ -33,6 +33,7 @@
> #include <sys/types.h>
> #include <sys/stat.h>
>
> +#include "args.h"
> #include "sensord.h"
>
> static int logOpened = 0;
> @@ -52,7 +53,7 @@
> vsnprintf(buffer, LOG_BUFFER, fmt, ap);
> buffer[LOG_BUFFER] = '\0';
> va_end(ap);
> - if (debug || (priority < LOG_DEBUG)) {
> + if (sensord_args.debug || (priority < LOG_DEBUG)) {
> if (logOpened) {
> syslog(priority, "%s", buffer);
> } else {
> @@ -83,31 +84,33 @@
> * First RRD update at next RRD timeslot to prevent failures due
> * one timeslot updated twice on restart for example.
> */
> - int rrdValue = rrdTime - time(NULL) % rrdTime;
> + int rrdValue = sensord_args.rrdTime - time(NULL) %
> + sensord_args.rrdTime;
>
> sensorLog(LOG_INFO, "sensord started");
>
> while (!done) {
> if (reload) {
> - ret = reloadLib(sensorsCfgFile);
> + ret = reloadLib(sensord_args.cfgFile);
> if (ret)
> sensorLog(LOG_NOTICE,
> "config reload error (%d)", ret);
> reload = 0;
> }
> - if (scanTime && (scanValue <= 0)) {
> + if (sensord_args.scanTime && (scanValue <= 0)) {
> if ((ret = scanChips()))
> sensorLog(LOG_NOTICE,
> "sensor scan error (%d)", ret);
> - scanValue += scanTime;
> + scanValue += sensord_args.scanTime;
> }
> - if (logTime && (logValue <= 0)) {
> + if (sensord_args.logTime && (logValue <= 0)) {
> if ((ret = readChips()))
> sensorLog(LOG_NOTICE,
> "sensor read error (%d)", ret);
> - logValue += logTime;
> + logValue += sensord_args.logTime;
> }
> - if (rrdTime && rrdFile && (rrdValue <= 0)) {
> + if (sensord_args.rrdTime && sensord_args.rrdFile &&
> + (rrdValue <= 0)) {
> if ((ret = rrdUpdate()))
> sensorLog(LOG_NOTICE,
> "rrd update error (%d)", ret);
> @@ -116,12 +119,14 @@
> * same method as in RRD instead of simply adding the
> * interval.
> */
> - rrdValue = rrdTime - time(NULL) % rrdTime;
> + rrdValue = sensord_args.rrdTime - time(NULL) %
> + sensord_args.rrdTime;
> }
> if (!done) {
> - int a = logTime ? logValue : INT_MAX;
> - int b = scanTime ? scanValue : INT_MAX;
> - int c = (rrdTime && rrdFile) ? rrdValue : INT_MAX;
> + int a = sensord_args.logTime ? logValue : INT_MAX;
> + int b = sensord_args.scanTime ? scanValue : INT_MAX;
> + int c = (sensord_args.rrdTime && sensord_args.rrdFile)
> + ? rrdValue : INT_MAX;
> int sleepTime = (a < b) ? ((a < c) ? a : c) :
> ((b < c) ? b : c);
> sleep(sleepTime);
> @@ -138,7 +143,7 @@
>
> static void openLog(void)
> {
> - openlog("sensord", 0, syslogFacility);
> + openlog("sensord", 0, sensord_args.syslogFacility);
> logOpened = 1;
> }
>
> @@ -153,16 +158,16 @@
> exit(EXIT_FAILURE);
> }
>
> - if (!(stat(pidFile, &fileStat)) &&
> + if (!(stat(sensord_args.pidFile, &fileStat)) &&
> ((!S_ISREG(fileStat.st_mode)) || (fileStat.st_size > 11))) {
> fprintf(stderr,
> "Error: PID file `%s' already exists and looks suspicious.\n",
> - pidFile);
> + sensord_args.pidFile);
> exit(EXIT_FAILURE);
> }
>
> - if (!(file = fopen(pidFile, "w"))) {
> - fprintf(stderr, "fopen(\"%s\"): %s\n", pidFile,
> + if (!(file = fopen(sensord_args.pidFile, "w"))) {
> + fprintf(stderr, "fopen(\"%s\"): %s\n", sensord_args.pidFile,
> strerror(errno));
> exit(EXIT_FAILURE);
> }
> @@ -197,7 +202,7 @@
>
> static void undaemonize(void)
> {
> - unlink(pidFile);
> + unlink(sensord_args.pidFile);
> closelog();
> }
>
> @@ -209,27 +214,27 @@
> parseChips(argc, argv))
> exit(EXIT_FAILURE);
>
> - if (loadLib(sensorsCfgFile))
> + if (loadLib(sensord_args.cfgFile))
> exit(EXIT_FAILURE);
>
> - if (isDaemon)
> + if (sensord_args.isDaemon)
> openLog();
> - if (rrdFile)
> + if (sensord_args.rrdFile)
> ret = rrdInit();
>
> if (ret) {
> - } else if (doCGI) {
> + } else if (sensord_args.doCGI) {
> ret = rrdCGI();
> - } else if (isDaemon) {
> + } else if (sensord_args.isDaemon) {
> daemonize();
> ret = sensord();
> undaemonize();
> } else {
> - if (doSet)
> + if (sensord_args.doSet)
> ret = setChips();
> - else if (doScan)
> + else if (sensord_args.doScan)
> ret = scanChips();
> - else if (rrdFile)
> + else if (sensord_args.rrdFile)
> ret = rrdUpdate();
> else
> ret = readChips();
>
> --- quilt-sensors.orig/prog/sensord/sense.c 2009-04-04 18:25:19.000000000 +0200
> +++ quilt-sensors/prog/sensord/sense.c 2009-04-04 18:25:22.000000000 +0200
> @@ -26,6 +26,7 @@
> #include <string.h>
> #include <syslog.h>
>
> +#include "args.h"
> #include "sensord.h"
> #include "lib/error.h"
>
> @@ -189,11 +190,10 @@
> const sensors_chip_name *chip;
> int i, j, ret = 0;
>
> - for (j = 0; (ret = 0) && (j < numChipNames); ++ j) {
> + for (j = 0; (ret = 0) && (j < sensord_args.numChipNames); ++ j) {
> i = 0;
> while ((ret = 0) &&
> - ((chip = sensors_get_detected_chips(&chipNames[j], &i))
> - != NULL)) {
> + ((chip = sensors_get_detected_chips(&sensord_args.chipNames[j], &i)) != NULL)) {
> ret = doChip(chip, action);
> }
> }
>
> --- quilt-sensors.orig/prog/sensord/sensord.h 2009-04-04 18:25:19.000000000 +0200
> +++ quilt-sensors/prog/sensord/sensord.h 2009-04-04 18:25:22.000000000 +0200
> @@ -27,24 +27,6 @@
>
> /* from args.c */
>
> -extern int isDaemon;
> -extern const char *sensorsCfgFile;
> -extern const char *pidFile;
> -extern const char *rrdFile;
> -extern const char *cgiDir;
> -extern int scanTime;
> -extern int logTime;
> -extern int rrdTime;
> -extern int rrdNoAverage;
> -extern int syslogFacility;
> -extern int doScan;
> -extern int doSet;
> -extern int doCGI;
> -extern int doLoad;
> -extern int debug;
> -extern sensors_chip_name chipNames[];
> -extern int numChipNames;
> -
> extern int parseArgs(int argc, char **argv);
> extern int parseChips(int argc, char **argv);
>
All the rest looks OK to me.
--
Jean Delvare
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [lm-sensors] [PATCH 3/8] sensord: Introduce struct
2009-04-19 8:06 [lm-sensors] [PATCH 3/8] sensord: Introduce struct Jean Delvare
@ 2009-04-21 7:37 ` Andre Prendel
0 siblings, 0 replies; 2+ messages in thread
From: Andre Prendel @ 2009-04-21 7:37 UTC (permalink / raw)
To: lm-sensors
On Sun, Apr 19, 2009 at 10:06:09AM +0200, Jean Delvare wrote:
> Hi Andre,
>
> On Mon, 6 Apr 2009 09:57:09 +0200, Andre Prendel wrote:
> > Introduce struct sensord_arguments.
> >
> > This structure encapsulate all the variables holding the commandline
> > arguments. So we get rid of plenty of extern variables. This reduces
> > namespace collisions and unifies access.
>
> Good idea.
>
> > ---
> >
> > args.c | 100 +++++++++++++++++++++++++++++---------------------------------
> > args.h | 30 ++++++++++++++++++
> > rrd.c | 49 +++++++++++++++++-------------
> > sense.c | 6 +--
> > sensord.c | 57 +++++++++++++++++++----------------
> > sensord.h | 18 -----------
> > 6 files changed, 140 insertions(+), 120 deletions(-)
> >
> > --- /dev/null 1970-01-01 00:00:00.000000000 +0000
> > +++ quilt-sensors/prog/sensord/args.h 2009-04-05 17:12:32.000000000 +0200
> > @@ -0,0 +1,30 @@
> > +#ifndef SENSORD_ARGS_H
> > +#define SENSORD_ARGS_H
> > +
> > +#include <lib/sensors.h>
> > +
> > +#define MAX_CHIP_NAMES 32
> > +
> > +struct sensord_arguments {
> > + int isDaemon;
> > + const char *cfgFile;
> > + const char *pidFile;
> > + const char *rrdFile;
> > + const char *cgiDir;
> > + int scanTime;
> > + int logTime;
> > + int rrdTime;
> > + int rrdNoAverage;
> > + int syslogFacility;
> > + int doScan;
> > + int doSet;
> > + int doCGI;
> > + int doLoad;
> > + int debug;
> > + sensors_chip_name chipNames[MAX_CHIP_NAMES];
> > + int numChipNames;
> > +};
> > +
> > +extern struct sensord_arguments sensord_args;
> > +
> > +#endif /* SENSORD_ARGS_H */
> >
> > --- quilt-sensors.orig/prog/sensord/args.c 2009-04-04 18:25:19.000000000 +0200
> > +++ quilt-sensors/prog/sensord/args.c 2009-04-05 17:15:55.000000000 +0200
> > @@ -27,29 +27,19 @@
> > #include <getopt.h>
> > #include <syslog.h>
> >
> > +#include "args.h"
> > #include "sensord.h"
> > #include "lib/error.h"
> > #include "version.h"
> >
> > -#define MAX_CHIP_NAMES 32
> > -
> > -int isDaemon = 0;
> > -const char *sensorsCfgFile = NULL;
> > -const char *pidFile = "/var/run/sensord.pid";
> > -const char *rrdFile = NULL;
> > -const char *cgiDir = NULL;
> > -int scanTime = 60;
> > -int logTime = 30 * 60;
> > -int rrdTime = 5 * 60;
> > -int rrdNoAverage = 0;
> > -int syslogFacility = LOG_LOCAL4;
> > -int doScan = 0;
> > -int doSet = 0;
> > -int doCGI = 0;
> > -int doLoad = 0;
> > -int debug = 0;
> > -sensors_chip_name chipNames[MAX_CHIP_NAMES];
> > -int numChipNames = 0;
> > +struct sensord_arguments sensord_args = {
> > + .isDaemon = 0,
>
> I'm curious why you initialize this field to 0 explicitly and none of
> the other 0 fields? I'm fairly certain global variables are initialized
> to 0 by the compiler so the above isn't needed.
You're right. I dont know why I have done this. Will fix it.
>
> > + .pidFile = "/var/run/sensord.pid",
> > + .scanTime = 60,
> > + .logTime = 30 * 60,
> > + .rrdTime = 5 * 60,
> > + .syslogFacility = LOG_LOCAL4,
> > +};
> >
> > static int parseTime(char *arg)
> > {
> > @@ -170,12 +160,12 @@
> > const char *shortOptions;
> > const struct option *longOptions;
> >
> > - isDaemon = (argv[0][strlen (argv[0]) - 1] = 'd');
> > - if (!isDaemon) {
> > + sensord_args.isDaemon = (argv[0][strlen (argv[0]) - 1] = 'd');
> > + if (!sensord_args.isDaemon) {
> > fprintf(stderr, "Sensord no longer runs as an commandline"
> > " application.\n");
> > - return -1;
> > - }
> > + return -1;
> > + }
>
> You're adding leading spaces!
>
> >
> > shortOptions = daemonShortOptions;
> > longOptions = daemonLongOptions;
> > @@ -184,48 +174,49 @@
> > != EOF) {
> > switch(c) {
> > case 'i':
> > - if ((scanTime = parseTime(optarg)) < 0)
> > + if ((sensord_args.scanTime = parseTime(optarg)) < 0)
> > return -1;
> > break;
> > case 'l':
> > - if ((logTime = parseTime(optarg)) < 0)
> > + if ((sensord_args.logTime = parseTime(optarg)) < 0)
> > return -1;
> > break;
> > case 't':
> > - if ((rrdTime = parseTime(optarg)) < 0)
> > + if ((sensord_args.rrdTime = parseTime(optarg)) < 0)
> > return -1;
> > break;
> > case 'T':
> > - rrdNoAverage = 1;
> > + sensord_args.rrdNoAverage = 1;
> > break;
> > case 'f':
> > - if ((syslogFacility = parseFacility(optarg)) < 0)
> > + sensord_args.syslogFacility = parseFacility(optarg);
> > + if (sensord_args.syslogFacility < 0)
> > return -1;
> > break;
> > case 'a':
> > - if (isDaemon)
> > - doLoad = 1;
> > + if (sensord_args.isDaemon)
> > + sensord_args.doLoad = 1;
> > else
> > - doScan = 1;
> > + sensord_args.doScan = 1;
> > break;
> > case 's':
> > - doSet = 1;
> > + sensord_args.doSet = 1;
> > break;
> > case 'c':
> > - sensorsCfgFile = optarg;
> > + sensord_args.cfgFile = optarg;
> > break;
> > case 'p':
> > - pidFile = optarg;
> > + sensord_args.pidFile = optarg;
> > break;
> > case 'r':
> > - rrdFile = optarg;
> > + sensord_args.rrdFile = optarg;
> > break;
> > case 'd':
> > - debug = 1;
> > + sensord_args.debug = 1;
> > break;
> > case 'g':
> > - doCGI = 1;
> > - cgiDir = optarg;
> > + sensord_args.doCGI = 1;
> > + sensord_args.cgiDir = optarg;
> > break;
> > case 'v':
> > printf("sensord version %s\n", LM_VERSION);
> > @@ -250,37 +241,38 @@
> > }
> > }
> >
> > - if (doScan && doSet) {
> > + if (sensord_args.doScan && sensord_args.doSet) {
> > fprintf(stderr,
> > "Error: Incompatible --set and --alarm-scan.\n");
> > return -1;
> > }
> >
> > - if (rrdFile && doSet) {
> > + if (sensord_args.rrdFile && sensord_args.doSet) {
> > fprintf(stderr,
> > "Error: Incompatible --set and --rrd-file.\n");
> > return -1;
> > }
> >
> > - if (doScan && rrdFile) {
> > + if (sensord_args.doScan && sensord_args.rrdFile) {
> > fprintf(stderr,
> > "Error: Incompatible --rrd-file and --alarm-scan.\n");
> > return -1;
> > }
> >
> > - if (doCGI && !rrdFile) {
> > + if (sensord_args.doCGI && !sensord_args.rrdFile) {
> > fprintf(stderr,
> > "Error: Incompatible --rrd-cgi without --rrd-file.\n");
> > return -1;
> > }
> >
> > - if (rrdFile && !rrdTime) {
> > + if (sensord_args.rrdFile && !sensord_args.rrdTime) {
> > fprintf(stderr,
> > "Error: Incompatible --rrd-file without --rrd-interval.\n");
> > return -1;
> > }
> >
> > - if (!logTime && !scanTime && !rrdFile) {
> > + if (!sensord_args.logTime && !sensord_args.scanTime &&
> > + !sensord_args.rrdFile) {
> > fprintf(stderr,
> > "Error: No logging, alarm or RRD scanning.\n");
> > return -1;
> > @@ -292,11 +284,12 @@
> > int parseChips(int argc, char **argv)
> > {
> > if (optind = argc) {
> > - chipNames[0].prefix = SENSORS_CHIP_NAME_PREFIX_ANY;
> > - chipNames[0].bus.type = SENSORS_BUS_TYPE_ANY;
> > - chipNames[0].bus.nr = SENSORS_BUS_NR_ANY;
> > - chipNames[0].addr = SENSORS_CHIP_NAME_ADDR_ANY;
> > - numChipNames = 1;
> > + sensord_args.chipNames[0].prefix > > + SENSORS_CHIP_NAME_PREFIX_ANY;
> > + sensord_args.chipNames[0].bus.type = SENSORS_BUS_TYPE_ANY;
> > + sensord_args.chipNames[0].bus.nr = SENSORS_BUS_NR_ANY;
> > + sensord_args.chipNames[0].addr = SENSORS_CHIP_NAME_ADDR_ANY;
> > + sensord_args.numChipNames = 1;
> > } else {
> > int i, n = argc - optind, err;
> > if (n > MAX_CHIP_NAMES) {
> > @@ -305,15 +298,18 @@
> > }
> > for (i = 0; i < n; ++ i) {
> > char *arg = argv[optind + i];
> > - if ((err = sensors_parse_chip_name(arg,
> > - chipNames + i))) {
> > +
> > + err = sensors_parse_chip_name(arg,
> > + sensord_args.chipNames +
> > + i);
> > + if (err) {
> > fprintf(stderr,
> > "Invalid chip name `%s': %s\n", arg,
> > sensors_strerror(err));
> > return -1;
> > }
> > }
> > - numChipNames = n;
> > + sensord_args.numChipNames = n;
> > }
> > return 0;
> > }
> >
> > --- quilt-sensors.orig/prog/sensord/rrd.c 2009-04-04 18:25:19.000000000 +0200
> > +++ quilt-sensors/prog/sensord/rrd.c 2009-04-05 17:11:30.000000000 +0200
> > @@ -43,6 +43,7 @@
> >
> > #include <rrd.h>
> >
> > +#include "args.h"
> > #include "sensord.h"
> >
> > #define DO_READ 0
> > @@ -141,9 +142,9 @@
> > const sensors_chip_name *chip;
> > int i, j, ret = 0, num = 0;
> >
> > - for (j = 0; (ret = 0) && (j < numChipNames); ++ j) {
> > + for (j = 0; (ret = 0) && (j < sensord_args.numChipNames); ++ j) {
> > i = 0;
> > - while ((ret = 0) && ((chip = sensors_get_detected_chips(&chipNames[j], &i)) != NULL)) {
> > + while ((ret = 0) && ((chip = sensors_get_detected_chips(&sensord_args.chipNames[j], &i)) != NULL)) {
> > int index0, chipindex = -1;
> >
> > /* Trick: we compare addresses here. We know it works
> > @@ -223,8 +224,8 @@
> > * number of seconds downtime during which average be used
> > * instead of unknown
> > */
> > - sprintf(ptr, "DS:%s:GAUGE:%d:%s:%s", rawLabel, 5 * rrdTime,
> > - min, max);
> > + sprintf(ptr, "DS:%s:GAUGE:%d:%s:%s", rawLabel, 5 *
> > + sensord_args.rrdTime, min, max);
> > }
> > return 0;
> > }
> > @@ -234,7 +235,7 @@
> > int ret = 0;
> > struct ds data = { 0, argv};
> > ret = applyToFeatures(rrdGetSensors_DS, &data);
> > - if (!ret && doLoad)
> > + if (!ret && sensord_args.doLoad)
> > ret = rrdGetSensors_DS(&data, LOADAVG, LOAD_AVERAGE, NULL);
> > return ret ? -1 : data.num;
> > }
> > @@ -245,12 +246,12 @@
> > struct stat tmp;
> >
> > sensorLog(LOG_DEBUG, "sensor RRD init");
> > - if (stat(rrdFile, &tmp)) {
> > + if (stat(sensord_args.rrdFile, &tmp)) {
> > if (errno = ENOENT) {
> > char stepBuff[STEP_BUFF], rraBuff[RRA_BUFF];
> > int argc = 4, num;
> > const char *argv[6 + MAX_RRD_SENSORS] = {
> > - "sensord", rrdFile, "-s", stepBuff
> > + "sensord", sensord_args.rrdFile, "-s", stepBuff
> > };
> >
> > sensorLog(LOG_INFO, "creating round robin database");
> > @@ -258,17 +259,21 @@
> > if (num = 0) {
> > sensorLog(LOG_ERR,
> > "Error creating RRD: %s: %s",
> > - rrdFile, "No sensors detected");
> > + sensord_args.rrdFile,
> > + "No sensors detected");
> > ret = 2;
> > } else if (num < 0) {
> > ret = -num;
> > } else {
> > - sprintf(stepBuff, "%d", rrdTime);
> > + sprintf(stepBuff, "%d", sensord_args.rrdTime);
> > sprintf(rraBuff, "RRA:%s:%f:%d:%d",
> > - rrdNoAverage?"LAST":"AVERAGE",
> > + sensord_args.rrdNoAverage ? "LAST" :
> > + "AVERAGE",
> > 0.5 /* fraction of non-unknown samples needed per entry */,
> > 1 /* samples per entry */,
> > - 7 * 24 * 60 * 60 / rrdTime /* 1 week */);
> > + 7 * 24 * 60 * 60 /
> > + sensord_args.rrdTime /* 1 week */);
> > +
> > argc += num;
> > argv[argc ++] = rraBuff;
> > argv[argc] = NULL;
> > @@ -276,12 +281,13 @@
> > (char **) /* WEAK */ argv))) {
> > sensorLog(LOG_ERR,
> > "Error creating RRD file: %s: %s",
> > - rrdFile, rrd_get_error());
> > + sensord_args.rrdFile,
> > + rrd_get_error());
> > }
> > }
> > } else {
> > sensorLog(LOG_ERR, "Error stat()ing RRD: %s: %s",
> > - rrdFile, strerror(errno));
> > + sensord_args.rrdFile, strerror(errno));
> > ret = 1;
> > }
> > }
> > @@ -310,8 +316,8 @@
> > struct gr *data = (struct gr *) _data;
> > (void) label; /* no warning */
> > if (!feature || (feature->rrd && (feature->type = data->type)))
> > - printf("\n\tDEF:%s=%s:%s:AVERAGE", rawLabel, rrdFile,
> > - rawLabel);
> > + printf("\n\tDEF:%s=%s:%s:AVERAGE", rawLabel,
> > + sensord_args.rrdFile, rawLabel);
> > return 0;
> > }
> >
> > @@ -420,7 +426,8 @@
> > int rrdUpdate(void)
> > {
> > int ret = rrdChips ();
> > - if (!ret && doLoad) {
> > +
> > + if (!ret && sensord_args.doLoad) {
> > FILE *loadavg;
> > if (!(loadavg = fopen("/proc/loadavg", "r"))) {
> > sensorLog(LOG_ERR,
> > @@ -442,11 +449,11 @@
> > }
> > if (!ret) {
> > const char *argv[] = {
> > - "sensord", rrdFile, rrdBuff, NULL
> > + "sensord", sensord_args.rrdFile, rrdBuff, NULL
> > };
> > if ((ret = rrd_update(3, (char **) /* WEAK */ argv))) {
> > sensorLog(LOG_ERR, "Error updating RRD file: %s: %s",
> > - rrdFile, rrd_get_error());
> > + sensord_args.rrdFile, rrd_get_error());
> > }
> > }
> > sensorLog(LOG_DEBUG, "sensor rrd updated");
> > @@ -463,17 +470,17 @@
> > while (graph->type != DataType_other) {
> > printf("<H2>%s</H2>\n", graph->h2);
> > printf("<P>\n<RRD::GRAPH %s/%s.png\n\t--imginfo '<IMG SRC=" WWWDIR "/%%s WIDTH=%%lu HEIGHT=%%lu>'\n\t-a PNG\n\t-h 200 -w 800\n",
> > - cgiDir, graph->image);
> > + sensord_args.cgiDir, graph->image);
> > printf("\t--lazy\n\t-v '%s'\n\t-t '%s'\n\t-x '%s'\n\t%s",
> > graph->axisTitle, graph->title, graph->axisDefn,
> > graph->options);
> > if (!ret)
> > ret = applyToFeatures(rrdCGI_DEF, graph);
> > - if (!ret && doLoad && graph->loadAvg)
> > + if (!ret && sensord_args.doLoad && graph->loadAvg)
> > ret = rrdCGI_DEF(graph, LOADAVG, LOAD_AVERAGE, NULL);
> > if (!ret)
> > ret = applyToFeatures(rrdCGI_LINE, graph);
> > - if (!ret && doLoad && graph->loadAvg)
> > + if (!ret && sensord_args.doLoad && graph->loadAvg)
> > ret = rrdCGI_LINE(graph, LOADAVG, LOAD_AVERAGE, NULL);
> > printf (">\n</P>\n");
> > ++ graph;
> >
> > --- quilt-sensors.orig/prog/sensord/sensord.c 2009-04-04 18:25:19.000000000 +0200
> > +++ quilt-sensors/prog/sensord/sensord.c 2009-04-05 17:11:30.000000000 +0200
> > @@ -33,6 +33,7 @@
> > #include <sys/types.h>
> > #include <sys/stat.h>
> >
> > +#include "args.h"
> > #include "sensord.h"
> >
> > static int logOpened = 0;
> > @@ -52,7 +53,7 @@
> > vsnprintf(buffer, LOG_BUFFER, fmt, ap);
> > buffer[LOG_BUFFER] = '\0';
> > va_end(ap);
> > - if (debug || (priority < LOG_DEBUG)) {
> > + if (sensord_args.debug || (priority < LOG_DEBUG)) {
> > if (logOpened) {
> > syslog(priority, "%s", buffer);
> > } else {
> > @@ -83,31 +84,33 @@
> > * First RRD update at next RRD timeslot to prevent failures due
> > * one timeslot updated twice on restart for example.
> > */
> > - int rrdValue = rrdTime - time(NULL) % rrdTime;
> > + int rrdValue = sensord_args.rrdTime - time(NULL) %
> > + sensord_args.rrdTime;
> >
> > sensorLog(LOG_INFO, "sensord started");
> >
> > while (!done) {
> > if (reload) {
> > - ret = reloadLib(sensorsCfgFile);
> > + ret = reloadLib(sensord_args.cfgFile);
> > if (ret)
> > sensorLog(LOG_NOTICE,
> > "config reload error (%d)", ret);
> > reload = 0;
> > }
> > - if (scanTime && (scanValue <= 0)) {
> > + if (sensord_args.scanTime && (scanValue <= 0)) {
> > if ((ret = scanChips()))
> > sensorLog(LOG_NOTICE,
> > "sensor scan error (%d)", ret);
> > - scanValue += scanTime;
> > + scanValue += sensord_args.scanTime;
> > }
> > - if (logTime && (logValue <= 0)) {
> > + if (sensord_args.logTime && (logValue <= 0)) {
> > if ((ret = readChips()))
> > sensorLog(LOG_NOTICE,
> > "sensor read error (%d)", ret);
> > - logValue += logTime;
> > + logValue += sensord_args.logTime;
> > }
> > - if (rrdTime && rrdFile && (rrdValue <= 0)) {
> > + if (sensord_args.rrdTime && sensord_args.rrdFile &&
> > + (rrdValue <= 0)) {
> > if ((ret = rrdUpdate()))
> > sensorLog(LOG_NOTICE,
> > "rrd update error (%d)", ret);
> > @@ -116,12 +119,14 @@
> > * same method as in RRD instead of simply adding the
> > * interval.
> > */
> > - rrdValue = rrdTime - time(NULL) % rrdTime;
> > + rrdValue = sensord_args.rrdTime - time(NULL) %
> > + sensord_args.rrdTime;
> > }
> > if (!done) {
> > - int a = logTime ? logValue : INT_MAX;
> > - int b = scanTime ? scanValue : INT_MAX;
> > - int c = (rrdTime && rrdFile) ? rrdValue : INT_MAX;
> > + int a = sensord_args.logTime ? logValue : INT_MAX;
> > + int b = sensord_args.scanTime ? scanValue : INT_MAX;
> > + int c = (sensord_args.rrdTime && sensord_args.rrdFile)
> > + ? rrdValue : INT_MAX;
> > int sleepTime = (a < b) ? ((a < c) ? a : c) :
> > ((b < c) ? b : c);
> > sleep(sleepTime);
> > @@ -138,7 +143,7 @@
> >
> > static void openLog(void)
> > {
> > - openlog("sensord", 0, syslogFacility);
> > + openlog("sensord", 0, sensord_args.syslogFacility);
> > logOpened = 1;
> > }
> >
> > @@ -153,16 +158,16 @@
> > exit(EXIT_FAILURE);
> > }
> >
> > - if (!(stat(pidFile, &fileStat)) &&
> > + if (!(stat(sensord_args.pidFile, &fileStat)) &&
> > ((!S_ISREG(fileStat.st_mode)) || (fileStat.st_size > 11))) {
> > fprintf(stderr,
> > "Error: PID file `%s' already exists and looks suspicious.\n",
> > - pidFile);
> > + sensord_args.pidFile);
> > exit(EXIT_FAILURE);
> > }
> >
> > - if (!(file = fopen(pidFile, "w"))) {
> > - fprintf(stderr, "fopen(\"%s\"): %s\n", pidFile,
> > + if (!(file = fopen(sensord_args.pidFile, "w"))) {
> > + fprintf(stderr, "fopen(\"%s\"): %s\n", sensord_args.pidFile,
> > strerror(errno));
> > exit(EXIT_FAILURE);
> > }
> > @@ -197,7 +202,7 @@
> >
> > static void undaemonize(void)
> > {
> > - unlink(pidFile);
> > + unlink(sensord_args.pidFile);
> > closelog();
> > }
> >
> > @@ -209,27 +214,27 @@
> > parseChips(argc, argv))
> > exit(EXIT_FAILURE);
> >
> > - if (loadLib(sensorsCfgFile))
> > + if (loadLib(sensord_args.cfgFile))
> > exit(EXIT_FAILURE);
> >
> > - if (isDaemon)
> > + if (sensord_args.isDaemon)
> > openLog();
> > - if (rrdFile)
> > + if (sensord_args.rrdFile)
> > ret = rrdInit();
> >
> > if (ret) {
> > - } else if (doCGI) {
> > + } else if (sensord_args.doCGI) {
> > ret = rrdCGI();
> > - } else if (isDaemon) {
> > + } else if (sensord_args.isDaemon) {
> > daemonize();
> > ret = sensord();
> > undaemonize();
> > } else {
> > - if (doSet)
> > + if (sensord_args.doSet)
> > ret = setChips();
> > - else if (doScan)
> > + else if (sensord_args.doScan)
> > ret = scanChips();
> > - else if (rrdFile)
> > + else if (sensord_args.rrdFile)
> > ret = rrdUpdate();
> > else
> > ret = readChips();
> >
> > --- quilt-sensors.orig/prog/sensord/sense.c 2009-04-04 18:25:19.000000000 +0200
> > +++ quilt-sensors/prog/sensord/sense.c 2009-04-04 18:25:22.000000000 +0200
> > @@ -26,6 +26,7 @@
> > #include <string.h>
> > #include <syslog.h>
> >
> > +#include "args.h"
> > #include "sensord.h"
> > #include "lib/error.h"
> >
> > @@ -189,11 +190,10 @@
> > const sensors_chip_name *chip;
> > int i, j, ret = 0;
> >
> > - for (j = 0; (ret = 0) && (j < numChipNames); ++ j) {
> > + for (j = 0; (ret = 0) && (j < sensord_args.numChipNames); ++ j) {
> > i = 0;
> > while ((ret = 0) &&
> > - ((chip = sensors_get_detected_chips(&chipNames[j], &i))
> > - != NULL)) {
> > + ((chip = sensors_get_detected_chips(&sensord_args.chipNames[j], &i)) != NULL)) {
> > ret = doChip(chip, action);
> > }
> > }
> >
> > --- quilt-sensors.orig/prog/sensord/sensord.h 2009-04-04 18:25:19.000000000 +0200
> > +++ quilt-sensors/prog/sensord/sensord.h 2009-04-04 18:25:22.000000000 +0200
> > @@ -27,24 +27,6 @@
> >
> > /* from args.c */
> >
> > -extern int isDaemon;
> > -extern const char *sensorsCfgFile;
> > -extern const char *pidFile;
> > -extern const char *rrdFile;
> > -extern const char *cgiDir;
> > -extern int scanTime;
> > -extern int logTime;
> > -extern int rrdTime;
> > -extern int rrdNoAverage;
> > -extern int syslogFacility;
> > -extern int doScan;
> > -extern int doSet;
> > -extern int doCGI;
> > -extern int doLoad;
> > -extern int debug;
> > -extern sensors_chip_name chipNames[];
> > -extern int numChipNames;
> > -
> > extern int parseArgs(int argc, char **argv);
> > extern int parseChips(int argc, char **argv);
> >
>
> All the rest looks OK to me.
>
> --
> Jean Delvare
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-04-21 7:37 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-19 8:06 [lm-sensors] [PATCH 3/8] sensord: Introduce struct Jean Delvare
2009-04-21 7:37 ` Andre Prendel
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.