diff options
Diffstat (limited to 'sysutils/nut')
| -rw-r--r-- | sysutils/nut/Makefile | 2 | ||||
| -rw-r--r-- | sysutils/nut/files/patch-clients_upslog.c | 166 | ||||
| -rw-r--r-- | sysutils/nut/files/patch-docs_man_upslog.8 | 16 | ||||
| -rw-r--r-- | sysutils/nut/files/patch-include_nut__stdint.h | 31 |
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" |
