NOTE: This change log section represents git commits in range 'v2.6.0..HEAD' (commits '8103b4e5c..0e051f9f6').

2026-04-07  Jim Klimov <jimklimov+nut@gmail.com>

	* docs/maintainer-guide.txt: add "make -j 8 distcheck-completeness"
	  into the mix
	* NEWS.adoc: fix indentation [#3395]
	* docs/nut.dict: add APC models from recent NEWS.adoc bumps [#3227,
	  #3395]
	* docs/maintainer-guide.txt: clarify last check of driver version
	  bumps
	* docs/Makefile.am: spellcheck: fix tracking of FAILED state for
	  SPELLCHECK_NOEXT_DOCS_FIRST [#2871]

2026-04-06  Jim Klimov <jimklimov+nut@gmail.com>

	* NEWS.adoc: note dual-byte command support in apcsmart [#3327]
	* drivers/apc_modbus.c: apc_modbus_outlet_cmd_suffixes[]: avoid
	  literal 0 as initializer for enum-typed field [#3395]
	* drivers/dstate.c: fix whitespaces around parentheses and commas
	  (WIN32) [#3302]
	* drivers/dstate.c: fix style of CreateNamedPipe() etc. args for
	  maintainability [#3302]

2026-04-05  Jim Klimov <jimklimov+nut@gmail.com>

	* .github/workflows/01-make-dist.yml: convert tarball URL messages to
	  one-line markup [#1400]
	* common/wincompat.c: use TABs in variable declarations [#3302]
	* common/wincompat.c: move variable declarations to top of methods
	  [#3302]
	* common/wincompat.c: settle on pipe_full_name variable names; fix
	  style of CreateNamedPipe() etc. args for maintainability [#3302]
	* common/wincompat.c: fix whitespaces around parentheses and commas
	  [#3302]
	* common/wincompat.c, include/wincompat.h: fix (C) heading [#3302]

2026-04-04  Jim Klimov <jimklimov+nut@gmail.com>

	* .github/workflows/00-preclean.yml: Introduce GHA workflow to clean
	  away Appveyor Bot PR comments upon re-pushes [#1400]
	* appveyor.yml: do not repeat commit info in 7Z URL message [#1400]
	  It is also misleading in PR builds
	* appveyor.yml: customize GH notification message template and add a
	  message when 7Z is generated [#1400]
	* .github/workflows/01-make-dist.yml: add GH notifications for
	  download URL [#1400]

2026-04-04  Axel Gembe <axel@gembe.net>

	* NEWS.adoc, drivers/apc_modbus.c, drivers/apc_modbus.h: apc_modbus:
	  Fix outlet group command handling to be dynamic  Replace hardcoded
	  outlet group commands with dynamic detection and handling based on
	  the `SOGRelayConfigSetting` register. This ensures commands and
	  variables are only exposed for outlet groups that are actually
	  present on the UPS.  Key changes:  - Add `APC_VF_UNAVAILABLE` flag
	  to mark registers for absent outlet groups - Add outlet group info
	  table tracking presence and target bits for each group (`MOG`,
	  `SOG0` to `SOG2`) - Dynamically enumerate `outlet.group.N.id`,
	  `outlet.group.N.designator` and `outlet.group.N.status` variables
	  based on detected groups - Replace static outlet command entries
	  with `_apc_modbus_handle_outlet_cmd()` which parses `load.*`,
	  `shutdown.*`, and `outlet.group.N.*` commands at runtime - Global
	  `load.*` and `shutdown.*` commands now target all available outlet
	  groups instead of only the main outlet group (`MOG`) - Add
	  `outlet.group.N.*` commands (`load.off`, `load.on`, `load.cycle`,
	  etc.) for each detected group - Update `upsdrv_shutdown()` to use
	  the unified command handler - Add `OutletStatus_BF` bitfield
	  definitions to header  This fixes issues where commands were
	  exposed for non-existent outlet groups and ensures load/shutdown
	  operations affect all outlets on UPS units with switched outlet
	  groups.
	* NEWS.adoc, drivers/apc_modbus.c: apc_modbus: Add outlet group
	  timers  Values of SOG[0..2].TurnOffCountdown_EN for easier
	  diagnostics.
	* configure.ac: autotools: pass tar-pax to AM_INIT_AUTOMAKE  Running
	  `make distcheck` using a user account with a large UID produces:
	  ``` tardir=nut-2.8.4.0.6314 && ${TAR-tar} chof - "$tardir" | eval
	  GZIP= gzip -9 -c >nut-2.8.4.0.6314.tar.gz tar: value 1968000001 out
	  of uid_t range 0..2097151 tar: Exiting with failure status due to
	  previous errors ```  To fix this we can pass `tar-pax` to
	  `AM_INIT_AUTOMAKE`. This tells automake to use POSIX 1003.1-2001
	  PAX format for `.tar` archives, which supports a larger UID range.

2026-04-03  Jim Klimov <jimklimov+nut@gmail.com>

	* docs/Makefile.am, docs/images/nut-logo-256x256.png: Add
	  docs/images/nut-logo-256x256.png rendition and distribute this and
	  nut-logo.svg per se
	* UPGRADING.adoc, data/htmlcgi/Makefile.am, data/htmlcgi/index.html,
	  docs/Makefile.am, docs/images/{nut-logo.png => nut-logo-60x60.png},
	  docs/images/{nut.svg => nut-logo-original-A4.svg},
	  docs/images/{nut-squared.svg => nut-logo.svg}, docs/nut.dict:
	  Rename "nut.svg" and other logo variants more structurally
	* clients/upsmon.c, NEWS.adoc: loadconfig(): extend the special
	  message for lack of POWERDOWNFLAG on upsmon non-PRIMARY instances,
	  stress if this server is fed by an UPS it is PRIMARY for [#3391]
	* docs/config-notes.txt: more clarifications about POWERDOWNFLAG file
	  [#3391]
	* clients/upsmon.c: loadconfig(): add a special message for lack of
	  POWERDOWNFLAG on upsmon PRIMARY instances [#3391]

2026-04-02  Dan Langille <dan@langille.org>

	* docs/config-notes.txt: Adjust POWERDOWNFLAG explantion of temp file
	  system  Make it easier for readers.

2026-04-01  Jim Klimov <jimklimov+nut@gmail.com>

	* clients/upsclient.c: update comments about "built-in(blocking)"
	  connect timeout default [#2847]
	* NEWS.adoc, clients/upscmd.c, clients/upsrw.c, docs/nut.dict:
	  clients/ups{cmd,rw}.c: make the "OK" without "TRACKING" warning
	  visible; introduce NUT_QUIET_OK_NOTRACKING to hide it though
	  [#3383]
	* drivers/upsdrvctl.c: fix broken debug message and update comments

2026-03-31  Jim Klimov <jimklimov+nut@gmail.com>

	* clients/upsclient.c, clients/upsclient.h, docs/man/Makefile.am,
	  docs/man/upscli_readline.txt, docs/man/upscli_sendline.txt:
	  Introduce upscli_sendline_timeout_may_disconnect() and
	  upscli_readline_timeout_may_disconnect() [#3302]
	* clients/upsclient.c:
	  upscli_sendline_timeout()/upscli_readline_timeout(): report
	  "disconnecting" explicitly [#3379]
	* clients/upsclient.c: upscli_sslinit(): track and report
	  upscli_strerror() from read/write failures more diligently, and
	  handle "ERR*" replies with separate logging [#3379, #3331]
	* clients/upsclient.c: upscli_select_write()/upscli_select_read():
	  track and report errno from select/read/write failures more
	  diligently [#3379, #3331]
	* clients/upsclient.c: net_read()/net_write(): set
	  ups->upserror=UPSCLI_ERR_SSLERR when (Open)SSL read/write fails
	  during/despite retry loop [#3331]
	* clients/upsclient.c: pepper read/write and SSL init operations with
	  debug messages, update comments [#3331]
	* server/upsd.c: client_disconnect(): sleep a bit if dropping a
	  semi-initialised SSL client [#3331]
	* server/netssl.c: net_starttls(): update comment about
	  SSL_ForceHandshake() [#3331]
	* server/netssl.c: net_starttls(): debug-trace calls into NSS, to
	  profile their timing [#3379, #3331]
	* clients/upsclient.c: upscli_strerror(): detail NSS errors more
	  [#3379, #3331]
	* common/common.c: xbasename_no_ext(): use ubiquitous strcasecmp()
	  for "nut.exe" [#3379]

2026-03-30  Jim Klimov <jimklimov+nut@gmail.com>

	* drivers/dstate.c: send_to_one(): revise log messages [#3302]
	* docs/config-prereqs.txt, docs/nut.dict: docs/config-prereqs.txt:
	  update MSYS2 chapter with notes on symlink enablement
	* AUTHORS, NEWS.adoc, docs/FAQ.txt, docs/configure.txt,
	  docs/developers.txt, docs/documentation.txt, docs/download.txt,
	  docs/man/NUT-Monitor.txt, docs/man/generic_modbus.txt,
	  docs/man/nut-scanner.txt, docs/man/nut.conf.txt, docs/man/nut.txt,
	  docs/man/nutupsdrv.txt, docs/nut-names.txt, docs/nut.dict,
	  docs/solaris-usb.txt: docs/*: update dictionary and rephrase clumsy
	  texts, cater to MSYS2 aspell defaults
	* tools/nutconf/nutconf-cli.cpp: fix NULL=>nullptr [#3379]
	* drivers/dummy-ups.c, drivers/main.c, drivers/main.h:
	  drivers/main.{c,h}, drivers/dummy-ups.c: introduce
	  *upsdrv_callback_setproctag and upsdrv_setproctag() [#3379]
	* drivers/dummy-ups.c: fix upsdrv_tweak_prognames() to only set
	  upscli procname/proctag with duplicates if cookies differ [#3378,
	  #3379]
	* drivers/dummy-ups.c: diligently call upscli_cleanup() to minimize
	  valgrind alerts [#3378, #3379]
	* NEWS.adoc, clients/Makefile.am, clients/upsc.c,
	  clients/upsclient.c, clients/upsclient.h, clients/upscmd.c,
	  clients/upsimage.c, clients/upslog.c, clients/upsmon.c,
	  clients/upsrw.c, clients/upsset.c, clients/upsstats.c,
	  common/common.c, docs/man/Makefile.am, ...evel.txt =>
	  nutscan_upslog_set_debug_level.txt}, ...level.txt =>
	  upscli_upslog_set_debug_level.txt}, docs/nut.dict,
	  drivers/dummy-ups.c, include/common.h,
	  tools/nut-scanner/nut-scanner.c, tools/nut-scanner/nutscan-init.c,
	  tools/nut-scanner/nutscan-init.h, tools/nut-scanner/scan_nut.c,
	  tools/nutconf/nutconf-cli.cpp: Rename libnutscan and libupsclient
	  API methods related to logging with libname_upslog_ prefix; use
	  cookies to differentiate library run-time instances; update
	  consumers accordingly [#3378, #3379]
	* clients/upsc.c, clients/upscmd.c, clients/upsimage.c,
	  clients/upslog.c, clients/upsrw.c, clients/upsset.c,
	  clients/upsstats.c: clients/*.c: diligently call upscli_cleanup()
	  to minimize valgrind alerts [#3378, #3379]

2026-03-29  Jim Klimov <jimklimov+nut@gmail.com>

	* common/common.c: satisfy compilers where default char is signed
	  [#3379]
	* drivers/main.c: setproctag(prognames[0]) as soon as we can, so
	  CLI/CONF processing is better traceable [#3379]
	* drivers/dummy-ups.c: as a libupsclient consumer, use
	  upscli_upslog_start_sync() and upscli_setprocname() to initialize
	  consistent logging [#3379]
	* clients/upsc.c, clients/upscmd.c, clients/upsimage.c,
	  clients/upslog.c, clients/upsmon.c, clients/upsrw.c,
	  clients/upsset.c, clients/upsstats.c: clients/*.c: redefine
	  setproctag() to cover both in-program common code and libupsclient
	  copy [#3379, #3378]
	* clients/upsc.c, clients/upscmd.c, clients/upsimage.c,
	  clients/upslog.c, clients/upsmon.c, clients/upsrw.c,
	  clients/upsset.c, clients/upsstats.c,
	  tools/nut-scanner/nut-scanner.c, tools/nutconf/nutconf-cli.cpp: NUT
	  consumers of libupsclient/libnutscan: call *_setprocname() early to
	  avoid re-getting the value in the library copy of the code [#3379]
	* clients/upsclient.c, clients/upsclient.h, common/common.c,
	  docs/man/Makefile.am, docs/man/nutscan_set_debug_level.txt,
	  docs/man/upscli_set_debug_level.txt, docs/nut.dict,
	  include/common.h, tools/nut-scanner/nutscan-init.c,
	  tools/nut-scanner/nutscan-init.h, tools/nut-scanner/scan_nut.c: NUT
	  common code, libupsclient, libnutscan: expose setmyprocname() to
	  initialize libs quietly where we can [#3379]
	* clients/upsc.c: revise main processing loop to setproctag(prog)
	  once instead of NULL [#3378]
	* common/common.c: proctag_cleanup()/procname_cleanup(): log
	  "finished" messages with odd markup at lower verbosity [#3379]
	* clients/upsc.c, clients/upscmd.c, clients/upsimage.c,
	  clients/upslog.c, clients/upsmon.c, clients/upsrw.c,
	  clients/upsset.c, clients/upsstats.c: clients/*.c: for consumers of
	  libupsclient, start with initialization of shared logging time
	  stamps [#3378, #3379]
	* drivers/main.c: fix preprocessor macro indentation of
	  DRIVERS_MAIN_WITHOUT_MAIN
	* common/common.c: proctag_cleanup()/procname_cleanup(): simplify
	  "starting"/"finished" log messages [#3379]
	* common/common.c: proctag_cleanup(): clarify in log messages if it
	  is the library unloading [#3379]
	* tools/nutconf/nutconf-cli.cpp: hack for early enough nutscan_free()
	  to yield reasonable debug logs is no longer needde [#3384]
	* common/common.c: introduce nut_common_atexit() to clean-up once and
	  in a deterministic order [#3384]
	* tools/nutconf/nutconf-cli.cpp: limit calls to nutscan_* to builds
	  WITH_NUTSCANNER, and call nutscan_free() explicitly when debugging
	  (so logs make better sense) [#3379]
	* common/common.c: debug-log registrations of atexit() handlers
	  [#3384]
	* common/common.c: track procname_cleanup_registered; report what
	  context a proctag_cleanup() and/or procname_cleanup() ran for; do
	  not run cleaners twice [#3379]
	* common/common.c: vupslog(): handle reported invalid inputs for
	  vsnprintf() gracefully [#3379, #317]  Not each failed situation is
	  a cause for (unlimited) memory extension.
	* tools/nut-scanner/nutscan-init.c: debug-log starting/ending of
	  nutscan_init()/nutscan_free() [#3379]

2026-03-28  Jim Klimov <jimklimov+nut@gmail.com>

	* common/common.c: ensure that proctag_cleanup() does its work before
	  procname_cleanup() [#3379]
	* common/common.c: vupslog(): only warn about buffer realloc at high
	  verbosity or big previous bufsize; prefix with [D0] [#3379, #317]
	* common/common.c: xbasename_no_ext(): keep or even add ext for
	  "nut.exe" in WIN32 builds [#3378]
	* tools/nut-scanner/scan_nut.c: nutscan_upscli*(): avoid calls after
	  libupsclient was unloaded [#3379]
	* common/common.c: debug first run of setproctag() and runs of
	  proctag_cleanup() [#3379]
	* clients/upsclient.c, common/common.c,
	  tools/nut-scanner/nutscan-init.c: Introduce private
	  setproctag_lib() for libupsclient and libnutscan [#3379]
	* .gitignore, Makefile.am, NEWS.adoc: Makefile.am, NEWS.adoc: Added
	  `make .libs-dev-PATH` recipe to help devs and CI [#3379]
	* Makefile.am: add {all,check,install}-quick goals integrated with
	  NUT CI envvars for limited parallelism [#2871]

2026-03-27  Jim Klimov <jimklimov+nut@gmail.com>

	* tools/nutconf/nutconf-cli.cpp: init common timestamps with
	  *upslog_start_sync() [#3378]
	* docs/man/Makefile.am, docs/man/nutscan_set_debug_level.txt,
	  tools/nut-scanner/nutscan-init.c, tools/nut-scanner/nutscan-init.h,
	  tools/nut-scanner/scan_nut.c: tools/nut-scanner/*, docs: expose
	  nutscan_upslog_start_sync() [#3378]
	* clients/upsclient.c, clients/upsclient.h, docs/man/Makefile.am,
	  docs/man/upscli_set_debug_level.txt,
	  tools/nut-scanner/nutscan-init.c: clients/upsclient.{c,h}, docs:
	  expose upscli_upslog_start_sync() [#3378]
	* common/common.c, include/common.h: refactor with
	  upslog_start_sync() [#3379]
	* tools/nutconf/nutconf-cli.cpp: convert to using
	  nutscan_setproctag() instead of directly setproctag() [#3378,
	  #3379]
	* tools/nut-scanner/nut-scanner.c: convert to using
	  nutscan_setproctag() instead of directly setproctag() [#3378,
	  #3379]
	* docs/man/Makefile.am, docs/man/nutscan_set_debug_level.txt,
	  tools/nut-scanner/nutscan-init.c, tools/nut-scanner/nutscan-init.h,
	  tools/nut-scanner/scan_nut.c: tools/nut-scanner/*, docs: expose
	  nutscan_{g,s}etproctag() [#3379]
	* clients/upsclient.c, clients/upsclient.h, common/common.c,
	  docs/man/Makefile.am, docs/man/upscli_set_debug_level.txt:
	  clients/upsclient.{c,h}, docs: expose upscli_{g,s}etproctag()
	  [#3379]
	* NEWS.adoc, docs/man/nutconf.txt, tools/nutconf/nutconf-cli.cpp:
	  tools/nutconf/nutconf-cli.cpp, docs: support "-D" and
	  `NUT_DEBUG_LEVEL` with `nutconf`; fix processing of short
	  (single-char) optargs even if stacked after one dash [#3378]
	* tools/nut-scanner/nut-scanner.c: stop using nut_debug_level
	  directly: call nutscan_set_debug_level() now [#3378]
	* docs/man/Makefile.am, docs/man/nutscan_set_debug_level.txt,
	  tools/nut-scanner/nutscan-init.c, tools/nut-scanner/nutscan-init.h,
	  tools/nut-scanner/scan_nut.c: tools/nut-scanner/*, docs/man/*:
	  introduce nutscan_{g,s}et_debug_level() [#3378]
	* clients/upslog.c: handle "-D" option before others, so it can
	  impact help() and version() more naturally (regardless of CLI
	  argument order) [#3378]
	* drivers/main.c: refactor to use getprogname_argv0_default(), get
	  rid of WIN32 hacks [#3378]
	* tools/nutconf/nutconf-cli.cpp: refactor to use
	  getprogname_argv0_default() for "nutconf" [#3378]
	* tools/nut-scanner/nut-scanner.c, tools/nut-scanner/Makefile.am:
	  refactor to use getprogname_argv0_default() [#3378]
	* clients/upsc.c, clients/upscmd.c, clients/upslog.c,
	  clients/upsmon.c, clients/upsrw.c, clients/upssched.c,
	  scripts/Windows/wininit.c, server/pipedebug.c, server/sockdebug.c,
	  server/upsd.c: Refactor various NUT programs to use
	  getprogname_argv0_default(), and with safer access to argv[0]
	  [#3378]
	* common/common.c, include/common.h: introduce
	  xbasename_no_ext_default() and getprogname_argv0_default() to
	  refactor NUT programs later [#3378]
	* drivers/main.c: rename "drv_pipe_name" for maintainability (WIN32)
	  [#3302]
	* drivers/main.c: comment the complexity of many debug-level vars
	  [#3378]
	* drivers/main.c: define optstring near help_msg() to match other
	  sources [#3378]
	* server/upsd.c: refactor with xbasename_no_ext() [#3373]
	* drivers/main.c: refactor with xbasename_no_ext() [#3373]
	* clients/upsmon.c: refactor with xbasename_no_ext() [#3373]
	* common/common.c, include/common.h: introduce xbasename_no_ext() to
	  refactor setproctag() and other code later [#3302, #3368, #3373]
	* NEWS.adoc: rephrase change about upsset [#3164]
	* NEWS.adoc, clients/upsc.c, clients/upscmd.c, clients/upsrw.c,
	  docs/man/upsc.txt, docs/man/upscmd.txt, docs/man/upsrw.txt:
	  clients/ups{c,cmd,rw}.c, man pages, NEWS.adoc: add "-D" option
	  support [#3378]
	* clients/upsc.c, clients/upscmd.c, clients/upslog.c,
	  clients/upsmon.c, clients/upsrw.c, clients/upssched.c,
	  drivers/main.c, drivers/upsdrvctl.c, scripts/Windows/wininit.c,
	  server/upsd.c: Clients and daemons with command-line options:
	  converge to using opt_ret=getopt(...), use a different variable for
	  unrelated iteration [#3378]
	* clients/upsc.c, clients/upscmd.c, clients/upsrw.c:
	  clients/ups{c,cmd,rw}.c: converge to naming the help() method same
	  way as other programs [#3778]
	* clients/upsc.c, clients/upscmd.c, clients/upslog.c,
	  clients/upsmon.c, clients/upsrw.c, clients/upssched.c,
	  drivers/upsdrvctl.c, scripts/Windows/wininit.c, server/upsd.c:
	  Clients and daemons with command-line options: converge to using
	  getopt(...optstring) with the latter defined near the help/usage
	  method [#3378]
	* clients/upsc.c: move usage() to top like in other clients [#3378]

2026-03-27  Axel Gembe <axel@gembe.net>

	* NEWS.adoc, drivers/apc_modbus.c: apc_modbus: Fix log message
	  register range

2026-03-26  Jim Klimov <jimklimov+nut@gmail.com>

	* server/conf.c: parse_upsd_conf_args(): debug-log keywords that are
	  recognized, but pertain to another build configuration [#3331]
	* clients/nutclient.cpp: resync nss_error() implementation with
	  server/netssl.c [#3302, #1711]
	* clients/upsclient.c: resync nss_error() implementation with
	  server/netssl.c [#3302, #1711]
	* server/netssl.c: nss_error(): wrap printout lines to help sync with
	  other variants of this code
	* server/netssl.c: nss_error(): only allocate buffer for
	  PR_GetErrorText() when projected err_len>0, and request the right
	  size right away
	* server/upsd.c: mainloop(): add a comment for future rework of WIN32
	  loop [#3302, #3365, #3376]
	* server/upsd.c: mainloop(): log incoming connections/data events for
	  POSIX and WIN32, revise logging disconnect events for POSIX [#3302]
	* server/upsd.c: mainloop(): log how many hits polling returned
	  (POSIX), or that it failed and we would sleep 0.1s [#3302]
	* docs/FAQ.txt: stress that MODE from nut.conf is important for
	  nutshutdown hook script [#3364]
	* docs/FAQ.txt, docs/nut.dict: docs/FAQ.txt: update about generated
	  tarballs [#1400]
	* common/nutstream.cpp: NutSocket::Address::Address() copier:
	  sanity-check that socklen_t is in size_t range [#1651]

2026-03-25  Jim Klimov <jimklimov+nut@gmail.com>

	* server/netssl.c: try to get PR_ErrorToName()/PR_ErrorToString() for
	  actionable error messages [#3302, #1711]
	* drivers/dummy-ups.c: pepper parse_data_file() with debug tracing
	  logs [#3368]
	* tests/NIT/nit.sh: revise certutil signing to satisfy python 3.13+
	  [#1711, #1600]
	* Makefile.am: rename "generated-headers-with-a-touch" =>
	  "generated-sources-with-a-touch" as more generic
	* Makefile.am: fix typo (generated-generated) in rule names

2026-03-24  Jim Klimov <jimklimov+nut@gmail.com>

	* clients/upsclient.c: upscli_disconnect(): after LOGOUT, let the
	  server say OK Goodbye [#3302, #1711]
	* server/upsd.c: mainloop(): report chosen/seen socket counts per
	  type (driver, client...) [#3302]
	* common/common.c: hide `if (strlen(EXEEXT))` from
	  "-Wunreachable-code" [#3302]  On platforms without EXEEXT the
	  compiler is smart enough to say this is always false.
	* tools/nut-scanner/nut-scanner.c: revise use of setproctag()
	  avoiding pthreads so far [#3302, #3368]
	* tools/nut-scanner/nut-scanner.c, tools/nut-scanner/Makefile.am: PoC
	  using setproctag() [#3302, #3368]  Did not work for parallel
	  scanning threads where it would be most useful, because they are in
	  same process space...
	* clients/upsc.c, clients/upscmd.c, clients/upsrw.c: setproctag()
	  initially and flip to specified upsname later [#3302, #3368]
	* clients/upslog.c: use setproctag() to identify the client in debug
	  logs [#3302, #3368]
	* server/upsd.c: use setproctag() to identify upsd in debug logs
	  [#3302, #3368]
	* drivers/main.c: use setproctag() to identify upsname in debug logs
	  [#3302, #3368]
	* NEWS.adoc, common/common.c, conf/nut.conf.sample,
	  docs/man/nut.conf.txt, docs/nut.dict, scripts/systemd/README.adoc,
	  tests/NIT/nit.sh: Introduce NUT_DEBUG_PROCNAME envvar (handled for
	  debug logging if setproctag() is called) [#3302, #3368]
	* tests/NIT/nit.sh: request NSS server cert with SubjAltName
	  extension [#1711]
	* tests/NIT/nit.sh: bump NUT_DEFAULT_CONNECT_TIMEOUT when testing
	  with a swarm of clients/drivers [#3302]
	* clients/nutclient.cpp: Socket(): consider
	  NUT_DEFAULT_CONNECT_TIMEOUT envvar [#2847, #2869]
	* scripts/python/module/PyNUT.py.in: consider
	  NUT_DEFAULT_CONNECT_TIMEOUT envvar [#2847, #2869]
	* tests/NIT/nit.sh: work around crashes and serial number clashes
	  with certutil on some platforms; report success in crypto setup
	  [#1711]
	* tests/NIT/nit.sh: die() not exit() upon hiccups in SSL setup to
	  help troubleshoot [#1711]
	* tests/NIT/nit.sh: setenv_ssl_cppnit()/setenv_ssl_python(): neuter
	  NUT_SSL etc. even if inherited from caller (earlier `. NIT.env`),
	  but current setup is unwilling [#1711, #1599, #1600]
	* tests/NIT/nit.sh: our MAXCONN requirement scales much faster than
	  thought initially [#3302]  Each swarm `upslog` client monitors all
	  UPSes, establishing a new TCP connection to `upsd` for each
	  discovered device.

2026-03-23  Jim Klimov <jimklimov+nut@gmail.com>

	* common/common.c: background(): when reporting "Startup successful",
	  also report getmyprocbasename() [#1711]  In particular, help
	  discern replies from the drivers launched by upsdrvctl en masse.
	* Makefile.am, docs/man/Makefile.am: apply ticks similar to those for
	  generated headers to generated linkman*.txt snippets, to avoid
	  re-evaluating them verbosely in parallel/recursive builds [#2871]
	* .gitignore: GitIgnore .all.*-generated.timestamp files [#2871]
	* docs/FAQ.txt: expand the section on driver inability to connect to
	  a device [#3356]
	* Makefile.am: fix "make check" done from scratch [#2871, #3039]  *
	  Goal for "generated-headers-with-a-touch" stepped on "all" done as
	  part of "check". * Not using `+` prefix in that goal was not right
	  too. * Made cleanup dependencies separate for all/check/install
	  recursive rules.
	* Makefile.am: revise tracing of SUBDIR-MAKE reports to make them
	  consitent and easier for troubleshooting [#2871, #3039]
	* docs/Makefile.am: spellcheck: prioritize certain
	  SPELLCHECK_NOEXT_DOCS_FIRST (if present) even before parallel rules
	  [#2871]
	* docs/Makefile.am: spellcheck: debug SPELLCHECK_SRCDIR and
	  SPELLCHECK_SRC values [#2871]
	* docs/Makefile.am: move NEWS.adoc and UPGRADING.adoc to top of
	  SPELLCHECK_SRC_DEFAULT and comment why they may not be the first
	  checked anyway [#2871]
	* Makefile.am: reformat spellcheck rule shell scriptlet
	* NEWS.adoc: highlight that PR #3233 also fixes fallout of #3008

2026-03-22  Jim Klimov <jimklimov+nut@gmail.com>

	* server/upsd.c: mainloop(): revise chunked select - first try with
	  zero timeout (pick already waiting connections), only then try
	  time-waited select [#3302]
	* tests/NIT/nit.sh, NEWS.adoc: introduce `UPSLOG_SWARM_COUNT` for
	  clients [#3302]
	* common/common.c: vupslog(): Ensure line buffering for sane logs on
	  Windows console
	* clients/nutclient.h: drop commented-away undefine of NSS/OPENSSL
	  when building without SSL_CXX [#1599]
	* clients/nutclient.cpp: fix includes for non-NSS builds [#1599]
	* configure.ac: extend detection of LIBSSL_CXXFLAGS on MSYS2 [#1599]
	* clients/Makefile.am, clients/nutclient.cpp, clients/nutclient.h,
	  configure.ac, tests/Makefile.am, tests/cpputest-client.cpp:
	  configure.ac, clients/nutclient.{cpp,h}, tests/cpputest-client.cpp,
	  clients/Makefile.am, tests/Makefile.am: introduce separate automake
	  condition and macro WITH_SSL_CXX [#1599, #1711]
	* configure.ac, m4/nut_compiler_family.m4: configure.ac: generalize
	  fix for LIBSSL_CXXFLAGS when -isystem is involved [#1599, #1711]
	* configure.ac, clients/Makefile.am, tests/Makefile.am: refactor with
	  LIBSSL_CXXFLAGS [#1711, #1599]
	* conf/ups.conf.sample: clarify run-time group nuances [#3356]

2026-03-21  Jim Klimov <jimklimov+nut@gmail.com>

	* tests/NIT/nit.sh: adjust testcase expectations to possibility of
	  DUMMY_UPS_SWARM_COUNT>0 [#3302]
	* tests/NIT/nit.sh: bump MAXCONN in upsd.conf with non-trivial
	  DUMMY_UPS_SWARM_COUNT [#3302]
	* server/upsd.c: fix looping over more than MAXSYSCONN FDs [#3302]
	* tests/NIT/nit.sh: customize a short maxstartdelay=1 for upsdrvctl
	  [#3302]
	* drivers/upsdrvctl.c: more logging around forkexec() and
	  sleeps/waits involved [#3302]
	* tests/NIT/nit.sh, NEWS.adoc: add optional DUMMY_UPS_SWARM_COUNT
	  support to start hundreds of drivers to see what happens [#3302]
	* NEWS.adoc: fix typo
	* NEWS.adoc, docs/nut.dict: NEWS.adoc: Adjusted C++ header search
	  path on Termux [#3353]
	* clients/nutclient.cpp, tests/cpputest-client.cpp: per CodeQL, "new"
	  may be toxic in this context [#1599, #3353]  Warning Incorrect
	  allocation-error handling This allocation cannot return null. This
	  check is unnecessary.  cpp/incorrect-allocation-error-handling:
	  Different overloads of the new operator handle allocation failures
	  in different ways. If new T fails for some type T, it throws a
	  std::bad_alloc exception, but new(std::nothrow) T returns a null
	  pointer. If the programmer does not use the corresponding method of
	  error handling, allocation failure may go unhandled and could cause
	  the program to behave in unexpected ways.
	* clients/nutclient.h: use a simpler way to construct SSLConfig* from
	  char* (even if nullptr) [#1599]
	* tests/cpputest-client.cpp: setupClientSSL(): avoid mixing char* and
	  std::string& [#1599, #1711]

2026-03-20  Jim Klimov <jimklimov+nut@gmail.com>

	* tests/cpputest-client.cpp: fix use of new SSLConfig_NSS() [#1599,
	  #1711]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: fix destructor for concrete SSLConfig
	  class [#1599]
	* clients/nutclient.cpp, clients/nutclient.h,
	  tests/cpputest-client.cpp: clients/nutclient.h,
	  tests/cpputest-client.cpp: hide
	  setSSLConfig_NSS()/setSSLConfig_OpenSSL() backend-specific methods
	  (APIs may evolve, SSLConfig classes should be more flexible)
	  [#1599, #1711]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: introduce the SSLConfig helper class
	  family to future-proof passing OpenSSL or NSS (or other backend)
	  options to TcpClient::setSSLConfig() and constructor [#1599]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: drop TcpClient constructors with a list
	  of options for (Open)SSL [#1599]
	* clients/nutclient.cpp, clients/nutclient.h, docs/man/Makefile.am,
	  docs/man/libnutclient_tcp.txt, tests/NIT/nit.sh,
	  tests/cpputest-client.cpp: clients/nutclient.{cpp,h}, docs, tests:
	  there is no separate CERTIDENT_PASS in NSS; there is a database
	  prefix however [#1599, #1711]
	* tests/Makefile.am: add LIBSSL_LIBS to consumers of libnutclient
	  [#1599, #1711]

2026-03-19  Jim Klimov <jimklimov+nut@gmail.com>

	* docs/man/Makefile.am: refactor with $(LIBNUTCLIENT_TCP_DEPS_SUB)
	  [#1599]
	* clients/nutclient.cpp: fix some NULL=>nullptr cases [#1599]
	* configure.ac: fix C++ builds in Termux environment [#1599, #1711]
	  Inspired by https://github.com/termux/termux-packages/issues/23578
	  and https://github.com/termux/termux-packages/pulls/23579
	* docs/config-prereqs.txt: add openssl and nss tools as footprint for
	  Fedora 43 setup [#1711]
	* tests/NIT/nit.sh: abort if WITH_SSL_TESTS=required-conditional (and
	  NUT was built with SSL support) but needed third-party tooling was
	  not found for SSL setup [#1711]
	* tests/NIT/nit.sh, tests/NIT/Makefile.am: add support for
	  WITH_SSL_TESTS=required (to abort if NUT was built without SSL
	  support) [#1711]
	* tests/NIT/nit.sh: add localhost IP addresses as DNS.* aliases, for
	  older Python libs [#1711, #1600]
	* tests/NIT/nit.sh: use "openssl req -config" instead of "-extfile"
	  for self-signed CA cert [#1711]
	* tests/NIT/nit.sh, tests/NIT/Makefile.am: when generating test
	  certificates, exit() upon errors; invert
	  WITHOUT_SSL_TESTS=>WITH_SSL_TESTS with more options [#1711]
	  Support now `make check-NIT WITH_SSL_TESTS=required-conditional` to
	  fail fast if crypto material setup failed (ignored if built without
	  SSL).

2026-03-18  Jim Klimov <jimklimov+nut@gmail.com>

	* docs/man/Makefile.am: fix LIBNUTCLIENT_TCP_DEPS which can get
	  generated empty [#1599]
	* configure.ac, docs/configure.txt: configure.ac: support
	  --with-ssl=(nss|openssl) as used in GitHub actions for a while but
	  in vain [#1711]
	* tests/NIT/nit.sh: setenv_ssl_python(): fix typos in message [#1600,
	  #1711]
	* tests/NIT/nit.sh: remove TESTCERT_PATHs before setting them up
	  [#1711]
	* tests/NIT/nit.sh: extend rootca.pem generation with common
	  extensions required nowadays by many crypto implementations [#1711]
	* scripts/python/module/test_nutclient.py.in: fix NUT_FORCESSL and
	  NUT_CERTVERIFY to accept numbers [#1711, #1600]
	* scripts/python/module/PyNUT.py.in,
	  scripts/python/module/test_nutclient.py.in:
	  scripts/python/module/*: introduce support for NUT_KEYPASS (envvar
	  and python OpenSSL handling) [#1600, #1711]
	* tests/NIT/nit.sh: setenv_ssl_python(): fix NUT_FORCESSL and
	  NUT_CERTVERIFY to be numbers [#1711, #1600]

2026-03-17  Jim Klimov <jimklimov+nut@gmail.com>

	* clients/nutclient.cpp, clients/nutclient.h, docs/man/Makefile.am,
	  docs/man/libnutclient_tcp.txt, tests/cpputest-client.cpp:
	  libnutclient (C++): introduce key_pass and its OpenSSL handling;
	  separate config/autocall methods for OpenSSL and NSS [#1599, #1711]
	* tests/cpputest-client.cpp: ingest envvars for setSSLConfig_NSS()
	  [#1599, #1711]
	* tests/cpputest-client.cpp: refactor with setupClientSSL(); support
	  KEY_PASS [#1599, #1711]
	* tests/NIT/nit.sh: separate setenv_ssl_cppnit() from
	  setenv_ssl_python() [#1599, #1600, #1711]
	* clients/nutclient.cpp, clients/nutclient.h, docs/man/Makefile.am,
	  docs/man/libnutclient_tcp.txt: libnutclient (C++): introduce
	  nutclient_tcp_get_ssl_caps() and TcpClient::getSslCaps() [#1599,
	  #1711]
	* tests/cpputest-client.cpp: report SSL setup before connection
	  attempt (which can throw exceptions) [#1599, #1711]
	* docs/man/Makefile.am, docs/man/libnutclient_tcp.txt, docs/nut.dict:
	  docs/man/Makefile.am, docs/man/libnutclient_tcp.txt: add basic
	  mention of new SSL-related methods [#1599]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: TcpClient: internally handle SSL-related
	  file fields as std::string, not char* [#1599]
	* clients/Makefile.am, clients/nutclient.cpp, clients/nutclient.h,
	  tests/Makefile.am: clients/nutclient.cpp: complete (more of) NSS
	  support [#1599]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: TcpClient: add individual setters for
	  SSL options [#1599]
	* tests/cpputest-client.cpp: update tests to match recent library
	  changes [#1599, #1711]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: add a TCPClient::connect() variant with
	  explicit try_ssl option [#1599]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: revise TCPClient constructor with
	  auto-connect, variant with SSL options, to include them all [#1599]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: rename use_ssl => try_ssl as sounds more
	  relevant [#1599]
	* clients/nutclient.cpp, clients/nutclient.h,
	  tests/cpputest-client.cpp: clients/nutclient.{cpp,h},
	  tests/cpputest-client.cpp: do not reset ssl options in
	  TcpClient::connect() [#1599, #1711]
	* clients/nutclient.cpp, clients/nutclient.h,
	  tests/cpputest-client.cpp: clients/nutclient.{cpp,h},
	  tests/cpputest-client.cpp: pass force_ssl as part of setSSLConfig()
	  [#1599, #1711]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: introduce SSLException* family for
	  startTLS() specific troubles [#1599]
	* clients/Makefile.am: bump libnutclient ABI version [#1599]
	* clients/nutclient.cpp: Socket::startTLS(): SSL args are only unused
	  in builds without SSL [#1599]
	* clients/nutclient.cpp: clients/nutclient.{cpp,h}: handle certverify
	  with NSS callbacks [#1599, #1711]
	* clients/nutclient.cpp, clients/nutclient.h:
	  clients/nutclient.{cpp,h}: add certverify to constructor and
	  connect() calls [#1599, #1711]
	* clients/nutclient.cpp, clients/nutclient.h,
	  tests/cpputest-client.cpp: clients/nutclient.{cpp,h},
	  tests/cpputest-client.cpp: add getters for SSL configuration,
	  report it in tests [#1711, #1599]
	* tests/NIT/nit.sh: use setenv_ssl_python() also for cppnit [#1711,
	  #1599]
	* tests/NIT/nit.sh: get_group_id(): always return a number (even if
	  -1)

2026-03-16  Jim Klimov <jimklimov+nut@gmail.com>

	* NEWS.adoc, clients/Makefile.am, clients/nutclient.cpp,
	  clients/nutclient.h, tests/cpputest-client.cpp: Introduce
	  libnutclient C++ support for SSL (NUT STARTTLS) and tests [#1599,
	  #1711]
	* NEWS.adoc: document PyNUTClient extension to use STARTTLS and added
	  NIT tests [#1711, #3329, #1600]
	* tests/NIT/nit.sh: add SSL support into tests for PyNUTClient
	  [#1711, #1600]
	* scripts/python/module/PyNUT.py.in,
	  scripts/python/module/README.adoc,
	  scripts/python/module/test_nutclient.py.in:
	  scripts/python/module/*: add STARTTLS configurability (force,
	  verify, key/cert file locations) [#1711, #3329, #1600]
	* docs/nut.dict, scripts/python/module/PyNUT.py.in,
	  scripts/python/module/README.adoc,
	  scripts/python/module/test_nutclient.py.in:
	  scripts/python/module/*: add basic support for STARTTLS [#1711,
	  #3329, #1600]
	* tests/NIT/nit.sh: when providing rootca.pem as CERTHASH(.0)
	  file(s), fall back from symlink to hardlink to copy [#1711]
	* clients/upsclient.c, server/netssl.c: ssl_error(): return 0 for
	  retriable SSL_ERROR_WANT_{WRITE,READ}, log less loudly [#3331]
	* server/netssl.c, clients/upsclient.c: fix SSL read/write on
	  non-blocking sockets [#3331]  Apply same retry detection and loop
	  logic as for handshake; standardize on `SSL_IO_MAX_RETRIES`
	  constant name for these operations.
	* server/netssl.c: debug-log progress through ssl_init() and
	  ssl_cleanup(), and reasons to abort net_starttls()
	* drivers/libwinhid.c: fix use of usb_ctrl_char{,buf} instead of
	  unsigned char *, to match libusb{0,1} built alongside [#3335]

2026-03-14  Jim Klimov <jimklimov+nut@gmail.com>

	* Jenkinsfile-dynamatrix: leave a commented-away toggle for
	  dynamatrixGlobalState.enableDebugTraceResolver

2026-03-12  Jim Klimov <jimklimov+nut@gmail.com>

	* docs/security.txt: refer to NIT script for practical setup of
	  OpenSSL/NSS CA and server/client certs [#3330]
	* NEWS.adoc: clarify that winhid backend is currently for read-only
	  operations [#3335]

2026-03-10  Yifeng Li <tomli@tomli.me>

	* drivers/huawei-ups2000.c: huawei-ups2000: promote driver to
	  DRV_BETA.  huawei-ups2000 has served many users for 4 years,
	  multiple problems have been identified and fixed. It's now
	  appropriate to promote the driver's status to DRV_BETA.  Bump the
	  version number too although there's no code change to avoid
	  confusions, since development build with the DRV_EXPERIMENTAL flag
	  exists.

2026-03-10  Jim Klimov <jimklimov+nut@gmail.com>

	* drivers/arduino-hid.c, drivers/belkin-hid.c,
	  drivers/powervar-hid.c: add debug-log about imposing non-default
	  USB endpoint/index settings [#2821]
	* drivers/belkin-hid.c, tests/getexponenttest-belkin-hid.c,
	  NEWS.adoc: default USB ID 10af:0002 to usb_hid_rep_index=1 [#3345]

2026-03-09  Yifeng Li <tomli@tomli.me>

	* docs/man/huawei-ups2000.txt: huawei-ups2000.txt: document drivers
	  and fixed bugs.  This commit adds more information for
	  USB-to-serial driver installation, including Windows driver
	  requirements and URLs. All fixed historical bugs of huawei-ups2000
	  have also been recorded, which should help users to troubleshoot
	  their problems found in old versions of NUT.

2026-03-09  Owen Li <admin@iloli.ch>

	* NEWS.adoc: Small change for news

2026-03-08  Jim Klimov <jimklimov+nut@gmail.com>

	* tests/NIT/Makefile.am: Revert "tests/NIT/Makefile.am: OpenSSL
	  remains flaky on many platforms, work on actual code may be needed
	  to rectify it after all [#3331, #1711]"  This reverts commit
	  af5da88033992f8c0d23e39c86bacf39c5cd7cae due to added support for
	  WANT_READ/WANT_WRITE in OpenSSL handshake.
	* NEWS.adoc, clients/upsclient.c, server/netssl.c: server/netssl.c,
	  clients/upsclient.c: fix SSL handshake on non-blocking sockets
	  [#3331]  The TLS handshake functions `SSL_accept()` (server) and
	  `SSL_connect()` (client) require a retry loop when the underlying
	  socket is in non-blocking mode.  When either function returns '-1'
	  with an error code of `SSL_ERROR_WANT_READ` or
	  `SSL_ERROR_WANT_WRITE`, it is signalling a non-fatal "not done yet"
	  condition: the handshake needs more I/O turns to complete.  The
	  correct response is to wait for the socket fd to become ready in
	  the indicated direction and then call the same function again with
	  the same SSL object (this is explicitly documented in OpenSSL for
	  every version since 0.9.x and the API contract has never changed).
	  Previously both call sites used a single-shot switch/case pattern
	  that treated these non-fatal WANT_READ/WANT_WRITE returns as fatal
	  errors, tearing down the connection immediately.  On Linux the
	  loopback socket is fast enough that the handshake *nearly always*
	  completes in the first call, masking the bug.  On BSD (FreeBSD,
	  OpenBSD, NetBSD), macOS, and illumos-based systems (OmniOS,
	  OpenIndiana) the loopback socket behaves differently and
	  WANT_READ/WANT_WRITE are returned regularly, causing CI failures on
	  all of those platforms regardless of compiler, C standard dialect,
	  or OpenSSL version used.  The fix is identical for all supported
	  OpenSSL versions (0.9.x / 1.0.x / 1.1.x / 3.x): the
	  `SSL_ERROR_WANT_*` codes and the required retry semantics have been
	  stable since the library's inception.  No NSS changes are needed:
	  NSS uses `SSL_ForceHandshake()` which is already blocking-by-design
	  through NSPR.  Fixes issues (re-)discovered and/or confirmed by
	  work on PR #3330 for issue
	  https://github.com/networkupstools/nut/issues/1711  Tested-on:
	  Linux (passes), macOS 12, FreeBSD 12, NetBSD 11, OpenBSD 6.5,
	  OmniOS (amd64+i386), OpenIndiana (amd64+i386) - all compilers
	  and C standard dialects in the CI matrix. Co-authored-by: Claude
	  Sonnet 4.6

2026-03-07  Jim Klimov <jimklimov+nut@gmail.com>

	* clients/upsmon.c: track when previous loop cycle started [#1833]
	* docs/man/usbhid-ups.txt, docs/nut.dict, drivers/usbhid-ups.c:
	  drivers/usbhid-ups.c, docs: rename "experimentalhid" to "winhid"
	  [#3335]
	* NEWS.adoc, docs/nut.dict: add a news entry about WinHID backend
	  support for usbhid-ups [#3335]
	* clients/upsmon.c: report delta-time also in fallback logging
	  [#1833]
	* clients/upsmon.c: report time elapsed since previous loop cycle
	  start when we are processing OS wake-up after sleep [#1833]
	* clients/upsmon.c: log more visibly if we had a time-jump [#1833]
	* drivers/mge-hid.c: style typo fix
	* drivers/mge-hid.c: add outlet.3.* readings for devices that serve
	  them
	* Makefile.am: refactor generation of headers and their touchfiles
	  into a reusable goal; apply for faster `make check(-recursive)` and
	  `install(-recursive)` [#3039]
	* drivers/mge-hid.c: update comments about outlets/groups, fix an
	  apparent typo

2026-03-06  Jim Klimov <jimklimov+nut@gmail.com>

	* common/Makefile.am: fix typo about common-nut_version.c hack
	  [#3330]

2026-03-05  Jim Klimov <jimklimov+nut@gmail.com>

	* clients/Makefile.am: fix dependency between upsclient.c and
	  nut_version.h [#3328]
	* clients/Makefile.am: libupsclient-version.h: sanity-check that
	  input file libupsclient.la exists and is not empty [#3330]

2026-03-04  Owen Li <admin@iloli.ch>

	* docs/nut.dict: dict fix
	* docs/man/usbhid-ups.txt, drivers/libwinhid.c, drivers/libwinhid.h,
	  drivers/usbhid-ups.c: Code Refactor
	* drivers/libwinhid.c, drivers/libwinhid.h, drivers/usbhid-ups.c:
	  typo and indent fix, major enhancement on string descriptor reading

2026-03-04  Jim Klimov <jimklimov+nut@gmail.com>

	* NEWS.adoc, UPGRADING.adoc: update document intro paragraphs
	* Makefile.am: apply generated header touchfiles also to default
	  sequential `make all` [#3039]
	* Makefile.am: refactor generated header touchfiles into reusable
	  goals [#3039]
	* Makefile.am: libupsclient-version.h: fix typo for working subdir
	* include/Makefile.am: nut_version.h: do not skip if
	  NUT_VERSION_H_GENERATED==false even if touch-file exists [#3039]

2026-03-03  Owen Li <admin@iloli.ch>

	* drivers/libwinhid.c, drivers/usbhid-ups.c: Add HidD_GetFeature Data
	  Processing, Padding under certain conditions, reorder HID parsing
	  index

2026-03-03  Jim Klimov <jimklimov+nut@gmail.com>

	* drivers/snmp-ups.c: quiesce "Warning: type error exception ..." in
	  nut_snmp_get()=>nut_snmp_walk() when we fall back to using the
	  numeric value from last OID section [#1358]
	* drivers/snmp-ups.c: nut_snmp_walk(): log status and
	  response->errstat also (especially) when snmp_synch_response()
	  failed [#1358]
	* NEWS.adoc, docs/nut.dict, drivers/snmp-ups.c: drivers/snmp-ups.c,
	  NEWS.adoc: quiesce "unhandled ASN 0x80 received from ..." when we
	  fall back to using the numeric value from last OID section [#1358]
	* drivers/snmp-ups.h: rephrase comment for SU_FLAG_MAPPING_HANDLED
	  [#3095]
	* Makefile.am, clients/.gitignore, clients/Makefile.am:
	  clients/Makefile.am: do not regenerate libupsclient-version.h each
	  time we evaluate libupsclient.la rule [#3039, #3223, #1484]
	* Makefile.am, include/.gitignore, include/Makefile.am: Makefile.am,
	  include/Makefile.am: introduce
	  include/.all.nut_version-generated.timestamp touch-file to quickly
	  skip nut_version.h regeneration even if we configure
	  --enable-force-nut-version (default) [#3039, #3223]
	* Makefile.am: rearrange *CLEANFILES to be initialized on top of file
	  and added to along the way

2026-03-02  Owen Li <admin@iloli.ch>

	* drivers/Makefile.am, drivers/libwinhid.c, drivers/libwinhid.h,
	  drivers/usbhid-ups.c: init version of POC

2026-03-02  Jim Klimov <jimklimov+nut@gmail.com>

	* tests/NIT/Makefile.am: OpenSSL remains flaky on many platforms,
	  work on actual code may be needed to rectify it after all [#3331,
	  #1711]
	* server/netssl.c: revise comments/indentations of #ifdef et al, and
	  coding style [#3328]
	* conf/upsstats-modern-single.html.sample.in, docs/nut.dict: complete
	  the CSS/JS graph auto-adjustment to voltage/temperature scales
	  [#3318]
	* clients/upsstats.c, docs/man/upsstats.html.txt: add support for
	  @IFEQ upsstats.use_celsius (0|1)@ [#3318]

2026-03-01  Jim Klimov <jimklimov+nut@gmail.com>

	* tests/NIT/Makefile.am: re-allow running OpenSSL tests by default
	  [#1711]
	* tests/NIT/nit.sh: fix use of CERTPATH with OpenSSL tests [#1711]
	* clients/upsclient.c: report in log if Certificate verification (by
	  client) succeeded [#1711]
	* tests/NIT/nit.sh: disable NUT_QUIET_INIT_SSL when we actually test
	  SSL [#1711]
	* appveyor.yml: pass NUT_SSL_VARIANTS=nss to the builds, so we have
	  some known-functional SSL support in the NUT for Windows pre-built
	  tarballs [#3328, #1711]
	* ci_build.sh, scripts/Windows/build-mingw-nut.sh, NEWS.adoc:
	  introduce more generally useful support for NUT_SSL_VARIANTS
	  [#1711]
	* common/common-nut_version.c: add comments to clarify
	  LIBNUTPRIVATE_UPS_VERSION vs UPS_VERSION [#2800]
	* m4/ax_c_pragmas.m4, drivers/main.c: handle "-Wmissing-braces" for
	  upsdrv_callback_t init [#2800]

2026-02-28  Jim Klimov <jimklimov+nut@gmail.com>

	* docs/security.txt, docs/nut.dict: add a note on checking SSL
	  support in run-time build of NUT [#3328]
	* tests/NIT/Makefile.am: default to run WITHOUT_SSL_TESTS for OpenSSL
	  builds [#1711, #3331]
	* tests/NIT/nit.sh: add a way to run WITHOUT_SSL_TESTS on platforms
	  known to currently fail them [#1711]
	* tests/NIT/nit.sh: fix running OpenSSL tests on Windows [#1711]
	  Avoid MSYS2 mangling of cert request subject separated by slashes
	  as if it were a Unix-style path, before it even gets to `openssl`.
	* clients/upsc.c, clients/upscmd.c, clients/upsimage.c,
	  clients/upslog.c, clients/upsrw.c, clients/upsset.c,
	  clients/upsstats.c, drivers/dummy-ups.c,
	  tools/nut-scanner/scan_nut.c: clients/*.c, drivers/dummy-ups.c,
	  tools/nut-scanner/scan_nut.c: fix libupsclient consumers to use
	  upscli_set_debug_level() where available [#1711, #2800, #3330]
	* clients/upsmon.c: use `upscli_set_debug_level(nut_debug_level)`
	  wherever we change nut_debug_level [#1711, #2800, #3330]
	* NEWS.adoc, UPGRADING.adoc, clients/Makefile.am,
	  clients/upsclient.c, clients/upsclient.h, docs/man/Makefile.am,
	  docs/man/upscli_set_debug_level.txt, docs/nut.dict:
	  clients/upsclient.{c,h}, docs: introduce upscli_set_debug_level()
	  and a getter to fix shared-private-library builds [#2800, #1711]
	  Surprise (not really, had similar with libnutscanner, but solved
	  differently) - at least WIN32 builds require that all symbols are
	  inside a library we build, so tend to include the binary code
	  regardless of sort-of-shared linking. As the result, we end up
	  linking upsmon etc. with two DLL libraries each carrying its
	  nut_debug_level (and methods that work with it).
	* appveyor.yml: enable possibility of NSS builds (and confirm
	  OpenSSL) for Windows with Appveyor CI [#1711]
	* Makefile.am, clients/Makefile.am, drivers/Makefile.am,
	  tools/nut-scanner/Makefile.am, tools/nutconf/Makefile.am:
	  */Makefile.am: revise libupsclient* dependencies to honour
	  ENABLE_SHARED_PRIVATE_LIBS [#2800, #3328]  In some builds,
	  nut_debug_level of the client program and the library was different
	  because it was not dynamically linked to private properly.
	  drivers/Makefile.am: rectify dependencies using libcommonclient.la
	* include/common.h: indent #ifdef contents
	* docs/config-prereqs.txt: add a reason for "fightwarn" branch
	  mention

2026-02-27  Jim Klimov <jimklimov+nut@gmail.com>

	* tests/NIT/nit.sh: adjust TESTCERT_PATH_* to WIN32 runs if needed
	  [#1711]
	* clients/upsclient.c: upscli_strerror(): revise failure logging with
	  NSS [#1711, #3329]  The NSS library can return error codes with
	  empty strings attached, log some reasonable info then.
	* clients/upsc.c: revise failure logging [#1711]
	* server/netssl.c: net_starttls(): reject clients without any cert if
	  WITH_CLIENT_CERTIFICATE_VALIDATION earlier and more visibly [#3329]
	* server/upsd.c: mainloop(POSIX): log in more detail why we
	  disconnect a socket [#1711]
	* docs/config-prereqs.txt: add packages for `openssl` and `certutil`
	  where currently missing, to NIT-test SSL support on as many
	  platforms as we can [#1711]

2026-02-26  Owen Li <admin@iloli.ch>

	* drivers/apcsmart.c: quick change to make codescan happy

2026-02-26  Jim Klimov <jimklimov+nut@gmail.com>

	* NEWS.adoc, conf/upsd.conf.sample, docs/man/upsd.conf.txt,
	  docs/security.txt, server/conf.c, server/netssl.c: server/conf.c
	  and docs: Extended processing of `CERTREQUEST` setting to handle
	  numeric or specific string values, to match both ways of reading
	  ambiguous documentation [#3330]
	* NEWS.adoc, conf/upsd.conf.sample, configure.ac, docs/configure.txt,
	  docs/man/upsd.conf.txt, docs/security.txt: configure.ac and docs:
	  introduce --with-ssl-client-validation option [#3330, #3329]
	* tests/NIT/nit.sh: leave a commented stub for OpenSSL SSL_CERT_DIR
	  hackery [#1711]
	* tests/NIT/nit.sh: fix running as a script from root or tests
	  directory [#3294]
	* tests/NIT/nit.sh: add server/client-side SSL configs for tests with
	  upsd-client interaction [#3328, #1711]
	* tests/NIT/nit.sh: populate OpenSSL and/or Mozilla NSS keystores if
	  we can test those [#3328, #1711]
	* tests/NIT/nit.sh: generatecfg_upsd_add_SSL(),
	  generatecfg_upsmon_add_SSL(): cross-link server/client capabilities
	  to set expectations in configs [#3328, #1711]
