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. --- 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, + .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; + } 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);