summaryrefslogtreecommitdiff
path: root/sysutils/nut
diff options
context:
space:
mode:
Diffstat (limited to 'sysutils/nut')
-rw-r--r--sysutils/nut/Makefile2
-rw-r--r--sysutils/nut/files/patch-clients_upslog.c166
-rw-r--r--sysutils/nut/files/patch-docs_man_upslog.816
-rw-r--r--sysutils/nut/files/patch-include_nut__stdint.h31
4 files changed, 214 insertions, 1 deletions
diff --git a/sysutils/nut/Makefile b/sysutils/nut/Makefile
index 4409b60de0af..e388164c19b6 100644
--- a/sysutils/nut/Makefile
+++ b/sysutils/nut/Makefile
@@ -1,6 +1,6 @@
PORTNAME= nut
PORTVERSION= 2.8.0
-PORTREVISION= 6
+PORTREVISION= 7
CATEGORIES= sysutils
MASTER_SITES= http://www.networkupstools.org/source/${PORTVERSION:R}/
diff --git a/sysutils/nut/files/patch-clients_upslog.c b/sysutils/nut/files/patch-clients_upslog.c
new file mode 100644
index 000000000000..1602d8b65067
--- /dev/null
+++ b/sysutils/nut/files/patch-clients_upslog.c
@@ -0,0 +1,166 @@
+--- clients/upslog.c.orig 2022-08-26 15:25:00.233023000 -0700
++++ clients/upslog.c 2022-08-26 15:26:30.983822000 -0700
+@@ -32,6 +32,10 @@
+ */
+
+ #include "common.h"
++#include <signal.h>
++#include <unistd.h>
++#include <sys/types.h>
++#include <sys/wait.h>
+ #include "nut_platform.h"
+ #include "upsclient.h"
+
+@@ -41,17 +45,32 @@
+ #include "upslog.h"
+
+ static int reopen_flag = 0, exit_flag = 0;
++ static int wait_status;
+ static uint16_t port;
+ static char *upsname, *hostname;
+ static UPSCONN_t ups;
+
+ static FILE *logfile;
+- static const char *logfn, *monhost;
++ static char *logfn, *monhost;
+ static sigset_t nut_upslog_sigmask;
+ static char logbuffer[LARGEBUF], *logformat;
+
+ static flist_t *fhead = NULL;
++ struct monhost_child {
++ char *monhost;
++ char *logfn;
++ char *pidfilebase;
++ pid_t pid;
++ struct monhost_child *next;
++ };
++ static struct monhost_child *monhost_child_anchor = NULL;
++ static struct monhost_child *monhost_child_current = NULL;
++ static struct monhost_child *monhost_child_prev = NULL;
++ static struct sigaction upslog_sigaction;
++ static int trapped_signals[] = { SIGHUP, SIGINT, SIGTERM, SIGCHLD };
++ static pid_t daemon_pid;
+
++
+ #define DEFAULT_LOGFORMAT "%TIME @Y@m@d @H@M@S% %VAR battery.charge% " \
+ "%VAR input.voltage% %VAR ups.load% [%VAR ups.status%] " \
+ "%VAR ups.temperature% %VAR input.frequency%"
+@@ -131,6 +150,8 @@
+ printf(" -p <pidbase> - Base name for PID file (defaults to \"%s\")\n", prog);
+ printf(" -s <ups> - Monitor UPS <ups> - <upsname>@<host>[:<port>]\n");
+ printf(" - Example: -s myups@server\n");
++ printf(" -m <tuple> - Monitor UPS <ups,logfile,pidfile>,\n");
++ printf(" - Example: -m myups@server,/var/log/myups.log,/var/run/myups.pid\n");
+ printf(" -u <user> - Switch to <user> if started as root\n");
+
+ printf("\n");
+@@ -393,9 +414,25 @@
+ * -u <username>
+ */
+
++static void term_handler(int signo)
++{
++ if (signo != SIGCHLD && monhost_child_anchor != NULL) {
++ for (monhost_child_current = monhost_child_anchor;
++ monhost_child_current != NULL;
++ monhost_child_current = monhost_child_current->next
++ ) {
++ kill(monhost_child_current->pid, signo);
++ }
++
++ if (signo != SIGHUP)
++ fatalx(EXIT_FAILURE, "Killed by user");
++ }
++}
++
+ int main(int argc, char **argv)
+ {
+ int interval = 30, i, foreground = -1;
++ size_t monhost_len = 0, mh;
+ const char *prog = xbasename(argv[0]);
+ time_t now, nextpoll = 0;
+ const char *user = NULL;
+@@ -407,7 +444,7 @@
+
+ printf("Network UPS Tools %s %s\n", prog, UPS_VERSION);
+
+- while ((i = getopt(argc, argv, "+hs:l:i:f:u:Vp:FB")) != -1) {
++ while ((i = getopt(argc, argv, "+hs:l:i:f:u:Vp:FBm:")) != -1) {
+ switch(i) {
+ case 'h':
+ help(prog);
+@@ -415,6 +452,33 @@
+ break;
+ #endif
+
++ case 'm': { /* var scope */
++ char *m_arg, *s;
++
++ monhost_child_prev = monhost_child_current;
++ monhost_child_current = xmalloc(sizeof(struct monhost_child));
++ if (monhost_child_anchor == NULL)
++ monhost_child_anchor = monhost_child_current;
++ else
++ monhost_child_prev->next = monhost_child_current;
++ monhost_child_current->next = NULL;
++ monhost_len++;
++
++ /* Be sure to not mangle original optarg, nor rely on its longevity */
++ s = xstrdup(optarg);
++ m_arg = s;
++ monhost_child_current->monhost = xstrdup(strsep(&m_arg, ","));
++ if (!m_arg)
++ fatalx(EXIT_FAILURE, "Argument '-m upsspec,logfile,pidfile' requires exactly 3 components in the tuple");
++ monhost_child_current->logfn = xstrdup(strsep(&m_arg, ","));
++ if (!m_arg)
++ fatalx(EXIT_FAILURE, "Argument '-m upsspec,logfile,pidfile' requires exactly 3 components in the tuple");
++ monhost_child_current->pidfilebase = xstrdup(strsep(&m_arg, ","));
++ if (m_arg) /* Had a third comma - also unexpected! */
++ fatalx(EXIT_FAILURE, "Argument '-m upsspec,logfile,pidfile' requires exactly 3 components in the tuple");
++ free(s);
++ } /* var scope */
++ break;
+ case 's':
+ monhost = optarg;
+ break;
+@@ -477,6 +541,40 @@
+
+ for (i = 3; i < argc; i++)
+ snprintfcat(logformat, LARGEBUF, "%s ", argv[i]);
++ }
++
++ if (monhost_child_anchor != NULL) {
++ if (foreground > 0)
++ daemon_pid = 0;
++ else
++ daemon_pid = fork();
++ if (!daemon_pid) {
++ for (monhost_child_current = monhost_child_anchor;
++ monhost_child_current != NULL;
++ monhost_child_current = monhost_child_current->next) {
++ if ((monhost_child_current->pid = fork()) == 0) {
++ monhost = monhost_child_current->monhost;
++ logfn = monhost_child_current->logfn;
++ pidfilebase = monhost_child_current->pidfilebase;
++ foreground = 1;
++ break;
++ }
++ }
++ if (monhost_child_anchor->pid) { /* parent */
++ for (mh = 0; mh < sizeof(trapped_signals)/sizeof(trapped_signals[0]); mh++) {
++ upslog_sigaction.sa_handler = &term_handler;
++ sigfillset(&upslog_sigaction.sa_mask);
++ upslog_sigaction.sa_flags = SA_NOCLDSTOP | SA_NOCLDWAIT;
++ sigaction(trapped_signals[mh], &upslog_sigaction, NULL);
++ }
++ become_user(get_user_pwent(user));
++ writepid(pidfilebase);
++ while(wait(&wait_status) > 0);
++ exit(EXIT_SUCCESS);
++ }
++ } else {
++ exit(EXIT_SUCCESS);
++ }
+ }
+
+ if (!monhost)
diff --git a/sysutils/nut/files/patch-docs_man_upslog.8 b/sysutils/nut/files/patch-docs_man_upslog.8
new file mode 100644
index 000000000000..10335395cea9
--- /dev/null
+++ b/sysutils/nut/files/patch-docs_man_upslog.8
@@ -0,0 +1,16 @@
+--- docs/man/upslog.8.orig 2022-04-26 15:07:16.000000000 -0700
++++ docs/man/upslog.8 2022-08-24 07:39:07.356811000 -0700
+@@ -134,6 +134,13 @@
+ upsname[@hostname[:port]]\&. The default hostname is "localhost"\&.
+ .RE
+ .PP
++\fB\-m\fR \fItuple\fR
++.RS 4
++Monitor multiple UPSs. The format for this option is a tuple of
++ups, logfile, and pidfile separated by commas. An example would be:
++`upsname@hostname:9999,/var/log/nut/cps.log,/var/run/cps.pid`
++.RE
++.PP
+ \fB\-u\fR \fIusername\fR
+ .RS 4
+ If started as root, upslog will
diff --git a/sysutils/nut/files/patch-include_nut__stdint.h b/sysutils/nut/files/patch-include_nut__stdint.h
new file mode 100644
index 000000000000..fdd2bd783c61
--- /dev/null
+++ b/sysutils/nut/files/patch-include_nut__stdint.h
@@ -0,0 +1,31 @@
+--- include/nut_stdint.h.orig 2022-08-24 07:49:23.934399000 -0700
++++ include/nut_stdint.h 2022-08-24 07:56:48.050406000 -0700
+@@ -52,6 +52,28 @@
+ #endif
+
+ /* Printing format for size_t and ssize_t */
++#ifndef PRIuSIZE
++# ifdef PRIsize
++# define PRIuSIZE PRIsize
++# else
++# if defined(__MINGW32__) || defined (WIN32)
++# define PRIuSIZE "llu"
++# else
++# define PRIuSIZE "zu"
++# endif
++# endif
++#endif
++
++#ifndef PRIxSIZE
++# if defined(__MINGW32__) || defined (WIN32)
++# define PRIxSIZE "llx"
++# else
++# define PRIxSIZE "zx"
++# endif
++#endif
++
++/* Note: Windows headers are known to define at least "d" values,
++ * so macros below revolve around that and not "i" directly */
+ #ifndef PRIsize
+ # if defined(__MINGW32__)
+ # define PRIsize "u"