From 49344ef205c2ad296d1d3e979ee9d48e7bb76a53 Mon Sep 17 00:00:00 2001 From: Andre Prendel Date: Wed, 13 May 2009 16:04:51 +0000 Subject: [PATCH] sensord: Introduce struct sensord_args. 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. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@5719 7894878c-1315-0410-8ee3-d5d059ff63e0 --- prog/sensord/args.c | 83 ++++++++++++++++++++---------------------- prog/sensord/rrd.c | 49 ++++++++++++++----------- prog/sensord/sense.c | 6 +-- prog/sensord/sensord.c | 47 +++++++++++++----------- prog/sensord/sensord.h | 16 -------- 5 files changed, 97 insertions(+), 104 deletions(-) diff --git a/prog/sensord/args.c b/prog/sensord/args.c index 8df56107..fe019dd3 100644 --- a/prog/sensord/args.c +++ b/prog/sensord/args.c @@ -27,27 +27,18 @@ #include #include +#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 doCGI = 0; -int doLoad = 0; -int debug = 0; -sensors_chip_name chipNames[MAX_CHIP_NAMES]; -int numChipNames = 0; +struct sensord_arguments sensord_args = { + .pidFile = "/var/run/sensord.pid", + .scanTime = 60, + .logTime = 30 * 60, + .rrdTime = 5 * 60, + .syslogFacility = LOG_LOCAL4, +}; static int parseTime(char *arg) { @@ -148,53 +139,54 @@ int parseArgs(int argc, char **argv) { int c; - 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; - } + } while ((c = getopt_long(argc, argv, shortOptions, longOptions, NULL)) != 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': - doLoad = 1; + sensord_args.doLoad = 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); @@ -219,19 +211,20 @@ int parseArgs(int argc, char **argv) } } - 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; @@ -243,11 +236,12 @@ int parseArgs(int argc, char **argv) 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) { @@ -256,15 +250,18 @@ int parseChips(int argc, char **argv) } 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; } diff --git a/prog/sensord/rrd.c b/prog/sensord/rrd.c index 11f1e3cb..e1557102 100644 --- a/prog/sensord/rrd.c +++ b/prog/sensord/rrd.c @@ -43,6 +43,7 @@ #include +#include "args.h" #include "sensord.h" #define DO_READ 0 @@ -141,9 +142,9 @@ static int applyToFeatures(FeatureFN fn, void *data) 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 @@ static int rrdGetSensors_DS(void *_data, const char *rawLabel, * 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 @@ static int rrdGetSensors(const char **argv) 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 @@ int rrdInit(void) 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 @@ int rrdInit(void) 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 @@ int rrdInit(void) (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 @@ static int rrdCGI_DEF(void *_data, const char *rawLabel, const char *label, 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 @@ static struct gr graphs[] = { 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 @@ int rrdUpdate(void) } 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 @@ int rrdCGI(void) while (graph->type != DataType_other) { printf("

%s

\n", graph->h2); printf("

\n'\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

\n"); ++ graph; diff --git a/prog/sensord/sense.c b/prog/sensord/sense.c index 5f0cbb78..0cd32e70 100644 --- a/prog/sensord/sense.c +++ b/prog/sensord/sense.c @@ -26,6 +26,7 @@ #include #include +#include "args.h" #include "sensord.h" #include "lib/error.h" @@ -189,11 +190,10 @@ static int doChips(int action) 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); } } diff --git a/prog/sensord/sensord.c b/prog/sensord/sensord.c index fa5fc607..198717c7 100644 --- a/prog/sensord/sensord.c +++ b/prog/sensord/sensord.c @@ -33,6 +33,7 @@ #include #include +#include "args.h" #include "sensord.h" static int logOpened = 0; @@ -52,7 +53,7 @@ void sensorLog(int priority, const char *fmt, ...) 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 @@ static int sensord(void) * 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 @@ static int sensord(void) * 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 int sensord(void) static void openLog(void) { - openlog("sensord", 0, syslogFacility); + openlog("sensord", 0, sensord_args.syslogFacility); logOpened = 1; } @@ -153,16 +158,16 @@ static void daemonize(void) 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 daemonize(void) static void undaemonize(void) { - unlink(pidFile); + unlink(sensord_args.pidFile); closelog(); } @@ -209,18 +214,18 @@ int main(int argc, char **argv) parseChips(argc, argv)) exit(EXIT_FAILURE); - if (loadLib(sensorsCfgFile)) + if (loadLib(sensord_args.cfgFile)) exit(EXIT_FAILURE); openLog(); - if (rrdFile) { + if (sensord_args.rrdFile) { ret = rrdInit(); if (ret) exit(EXIT_FAILURE); } - if (doCGI) { + if (sensord_args.doCGI) { ret = rrdCGI(); } else { daemonize(); diff --git a/prog/sensord/sensord.h b/prog/sensord/sensord.h index e4ef83dc..61994ead 100644 --- a/prog/sensord/sensord.h +++ b/prog/sensord/sensord.h @@ -27,22 +27,6 @@ extern void sensorLog(int priority, const char *fmt, ...); /* 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 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);