diff --git a/common/common.c b/common/common.c index 281865e855..85f871880a 100644 --- a/common/common.c +++ b/common/common.c @@ -369,19 +369,35 @@ const char * dflt_statepath(void) { const char * path; - if ((path = getenv("NUT_STATEPATH")) == NULL) + path = getenv("NUT_STATEPATH"); + if ( (path == NULL) || (*path == '\0') ) path = STATEPATH; return path; } -/* Return the alternate path for pid files */ +/* Return the alternate path for pid files, for processes running as non-root + * Per documentation and configure script, the fallback value is the + * state-file path as the daemon and drivers can write there too. + * Note that this differs from PIDPATH that higher-privileged daemons, such + * as upsmon, tend to use. + */ const char * altpidpath(void) { + const char * path; + + path = getenv("NUT_ALTPIDPATH"); + if ( (path == NULL) || (*path == '\0') ) + path = getenv("NUT_STATEPATH"); + + if ( (path != NULL) && (*path != '\0') ) + return path; + #ifdef ALTPIDPATH return ALTPIDPATH; #else - return dflt_statepath(); +/* We assume, here and elsewhere, that at least STATEPATH is always defined */ + return STATEPATH; #endif } diff --git a/docs/configure.txt b/docs/configure.txt index 149636e0fa..8824349bf4 100644 --- a/docs/configure.txt +++ b/docs/configure.txt @@ -358,6 +358,8 @@ Programs that normally don't have root powers, like the drivers and upsd, write their pid files here. By default this is whatever the statepath is, as those programs should be able to write there. +The NUT_ALTPIDPATH environment variable overrides this at run time. + --with-statepath=PATH Change the default location of the state sockets created by the diff --git a/docs/man/nutupsdrv.txt b/docs/man/nutupsdrv.txt index b715f01ac8..910c2ac0e2 100644 --- a/docs/man/nutupsdrv.txt +++ b/docs/man/nutupsdrv.txt @@ -153,6 +153,23 @@ ups.conf:: Required configuration file. This contains all details on which drivers to start and where the hardware is attached. +ENVIRONMENT VARIABLES +--------------------- + +*NUT_CONFPATH* is the path name of the directory that contains +`upsd.conf` and other configuration files. If this variable is not set, +*upsd* uses a built-in default, which is often `/usr/local/ups/etc`. + +*NUT_STATEPATH* is the path name of the directory in which +*upsd* keeps state information. If this variable is not set, +*upsd* uses a built-in default, which is often `/var/state/ups`. +The *STATEPATH* directive in linkman:upsd.conf[5] overrides this variable. + +*NUT_ALTPIDPATH* is the path name of the directory in which +*upsd* and drivers store .pid files. If this variable is not set, +*upsd* and drivers use either *NUT_STATEPATH* if set, or ALTPIDPATH if set, +or otherwise the built-in default *STATEPATH*. + BUGS ---- diff --git a/docs/man/upsd.txt b/docs/man/upsd.txt index 1fddadb1d5..a052e28a29 100644 --- a/docs/man/upsd.txt +++ b/docs/man/upsd.txt @@ -126,11 +126,16 @@ ENVIRONMENT VARIABLES `upsd.conf` and other configuration files. If this variable is not set, *upsd* uses a built-in default, which is often `/usr/local/ups/etc`. -*NUT_STATEPATH* is the path name of the directory in which +*NUT_STATEPATH* is the path name of the directory in which *upsd* keeps state information. If this variable is not set, *upsd* uses a built-in default, which is often `/var/state/ups`. The *STATEPATH* directive in linkman:upsd.conf[5] overrides this variable. +*NUT_ALTPIDPATH* is the path name of the directory in which +*upsd* and drivers store .pid files. If this variable is not set, +*upsd* and drivers use either *NUT_STATEPATH* if set, or ALTPIDPATH if set, +or otherwise the built-in default *STATEPATH*. + SEE ALSO -------- diff --git a/drivers/main.c b/drivers/main.c index 6c0f40af7b..6c181a70a9 100644 --- a/drivers/main.c +++ b/drivers/main.c @@ -98,7 +98,11 @@ static void help_msg(void) printf(" -s - configure directly from cmd line arguments\n"); printf(" - note: must specify all driver parameters with successive -x\n"); - printf(" - note: at least 'port' variable should be set\n\n"); + printf(" - note: at least 'port' variable should be set\n"); + printf(" - note: to explore the current values on a device from an\n"); + printf(" unprivileged user account (with sufficient media access in\n"); + printf(" the OS - e.g. to query networked devices), you can specify\n"); + printf(" '-d 1' argument and `export NUT_STATEPATH=/tmp` beforehand\n\n"); printf(" -V - print version, then exit\n"); printf(" -L - print parseable list of driver variables\n");