Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package netperfmeter for openSUSE:Factory checked in at 2026-08-01 18:35:44 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/netperfmeter (Old) and /work/SRC/openSUSE:Factory/.netperfmeter.new.16738 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "netperfmeter" Sat Aug 1 18:35:44 2026 rev:9 rq:1368985 version:2.0.10 Changes: -------- --- /work/SRC/openSUSE:Factory/netperfmeter/netperfmeter.changes 2026-07-13 14:29:10.109676598 +0200 +++ /work/SRC/openSUSE:Factory/.netperfmeter.new.16738/netperfmeter.changes 2026-08-01 18:38:22.006494564 +0200 @@ -1,0 +2,9 @@ +Sat Aug 1 08:42:38 UTC 2026 - Martin Hauke <[email protected]> + +- Update to version 2.0.10 + * Bugfix: need to check for null-pointer, since host can be NULL. + * Updated QUIC setup scripts. + * QUIC configuration improvements. + * Improved check for enhanced getopt. + +------------------------------------------------------------------- Old: ---- netperfmeter-2.0.9.tar.xz netperfmeter-2.0.9.tar.xz.asc New: ---- netperfmeter-2.0.10.tar.xz netperfmeter-2.0.10.tar.xz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ netperfmeter.spec ++++++ --- /var/tmp/diff_new_pack.m0Xh3M/_old 2026-08-01 18:38:22.602515063 +0200 +++ /var/tmp/diff_new_pack.m0Xh3M/_new 2026-08-01 18:38:22.606515201 +0200 @@ -18,7 +18,7 @@ %define services netperfmeter.service netperfmeter-module-loader.service Name: netperfmeter -Version: 2.0.9 +Version: 2.0.10 Release: 0 Summary: Network performance meter for the UDP, TCP, SCTP and DCCP protocols License: GPL-3.0-or-later ++++++ netperfmeter-2.0.9.tar.xz -> netperfmeter-2.0.10.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/CMakeLists.txt new/netperfmeter-2.0.10/CMakeLists.txt --- old/netperfmeter-2.0.9/CMakeLists.txt 2026-07-11 13:21:18.000000000 +0200 +++ new/netperfmeter-2.0.10/CMakeLists.txt 2026-07-31 12:49:37.000000000 +0200 @@ -30,7 +30,7 @@ SET(BUILD_MAJOR "2") SET(BUILD_MINOR "0") -SET(BUILD_PATCH "9") +SET(BUILD_PATCH "10") SET(BUILD_VERSION ${BUILD_MAJOR}.${BUILD_MINOR}.${BUILD_PATCH}) @@ -83,7 +83,7 @@ ############################################################################# -#### OS DEPENDENT #### +#### OS-DEPENDENT #### ############################################################################# IF (CMAKE_SYSTEM_NAME MATCHES "Linux") @@ -92,8 +92,14 @@ MESSAGE(STATUS "${CMAKE_SYSTEM_NAME} supported") ELSEIF (CMAKE_SYSTEM_NAME MATCHES "NetBSD") MESSAGE(STATUS "${CMAKE_SYSTEM_NAME} supported") + IF(NOT DEFINED CMAKE_INSTALL_RPATH_USE_LINK_PATH) + SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON) + ENDIF() + # SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_FULL_LIBDIR}") ELSEIF (CMAKE_SYSTEM_NAME MATCHES "OpenBSD") MESSAGE(STATUS "${CMAKE_SYSTEM_NAME} supported") +ELSEIF (CMAKE_SYSTEM_NAME MATCHES "SunOS") + MESSAGE(STATUS "${CMAKE_SYSTEM_NAME} supported") ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Darwin") MESSAGE(STATUS "${CMAKE_SYSTEM_NAME} supported") ELSE() @@ -201,6 +207,29 @@ # ====== Threads ============================================================ FIND_PACKAGE(Threads REQUIRED) +# ====== Solaris: libsocket and libnsl ====================================== +IF (CMAKE_SYSTEM_NAME MATCHES "SunOS") + FIND_LIBRARY(SOCKET_LIBRARY socket REQUIRED) + FIND_LIBRARY(NSL_LIBRARY nsl REQUIRED) + FIND_LIBRARY(KSTAT_LIBRARY kstat REQUIRED) +ENDIF() + +# ====== NetBSD: liberty ==================================================== +IF (CMAKE_SYSTEM_NAME MATCHES "NetBSD") + FIND_LIBRARY(LIBIBERTY_LIBRARY NAMES iberty PATHS /usr/pkg/lib) + FIND_PATH(LIBIBERTY_INCLUDE_DIR NAMES libiberty.h PATHS /usr/pkg/include) + IF ((LIBIBERTY_LIBRARY) AND (LIBIBERTY_INCLUDE_DIR)) + ADD_DEFINITIONS(-DHAVE_LIBIBERTY) + MESSAGE(STATUS "Libiberty library found:") + MESSAGE(STATUS " LIBIBERTY_LIBRARY: ${LIBIBERTY_LIBRARY}") + MESSAGE(STATUS " LIBIBERTY_INCLUDE_DIR: ${LIBIBERTY_INCLUDE_DIR}") + ELSE() + MESSAGE(FATAL_ERROR + "Cannot find Libiberty library! Try:\n" + " * NetBSD: sudo pkgin -y install liberty") + ENDIF() +ENDIF() + # ====== libbz2 ============================================================= FIND_LIBRARY(BZ2_LIBRARY NAMES bz2) FIND_PATH(BZ2_INCLUDE_DIR NAMES bzlib.h) @@ -213,11 +242,12 @@ "Cannot find BZip2 library! Try:\n" " * Ubuntu/Debian: sudo apt install -y libbz2-dev\n" " * Fedora: sudo dnf install -y bzip2-devel\n" - " * OpenSUSE: sudo zypper install -y libbz2-devel\n" + " * SuSE: sudo zypper install -y libbz2-devel\n" " * Alpine: sudo apk add bzip2-dev\n" " * FreeBSD: sudo pkg install -y bzip2\n" " * NetBSD: (should be installed by default)\n" " * OpenBSD: (should be installed by default)\n" + " * Solaris: sudo pkg install bzip2\n" " * Apple: brew install bzip2") ENDIF() @@ -350,22 +380,6 @@ ENDIF() ENDIF() -# ====== Liberty ============================================================ -IF (CMAKE_SYSTEM_NAME MATCHES "NetBSD") - FIND_LIBRARY(LIBIBERTY_LIBRARY NAMES iberty PATHS /usr/pkg/lib) - FIND_PATH(LIBIBERTY_INCLUDE_DIR NAMES libiberty.h PATHS /usr/pkg/include) - IF ((LIBIBERTY_LIBRARY) AND (LIBIBERTY_INCLUDE_DIR)) - ADD_DEFINITIONS(-DHAVE_LIBIBERTY) - MESSAGE(STATUS "Libiberty library found:") - MESSAGE(STATUS " LIBIBERTY_LIBRARY: ${LIBIBERTY_LIBRARY}") - MESSAGE(STATUS " LIBIBERTY_INCLUDE_DIR: ${LIBIBERTY_INCLUDE_DIR}") - ELSE() - MESSAGE(FATAL_ERROR - "Cannot find Libiberty library! Try:\n" - " * NetBSD: sudo pkgin -y install liberty") - ENDIF() -ENDIF() - # ====== Graphics tools for icons and logo ================================== IF (WITH_ICONS) MESSAGE("Building with icons (WITH_ICONS=${WITH_ICONS})") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/ChangeLog new/netperfmeter-2.0.10/ChangeLog --- old/netperfmeter-2.0.9/ChangeLog 2026-07-11 13:21:19.000000000 +0200 +++ new/netperfmeter-2.0.10/ChangeLog 2026-07-31 12:49:37.000000000 +0200 @@ -1,3 +1,111 @@ +commit 11c6dc78853f203a3d967c8002a3f327410d725f +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 28 14:40:04 2026 +0200 + + Improved check for enhanced getopt. + +commit 80eecb2405fe0cb32cf0173cbf4d8b1cb7ea288d +Author: Thomas Dreibholz <[email protected]> +Date: Mon Jul 27 15:52:14 2026 +0200 + + Minor CMakeLists.txt clean-up. + +commit 33e798223c9ac91685e62be998a01b0c1f99f760 +Author: Thomas Dreibholz <[email protected]> +Date: Mon Jul 27 15:51:41 2026 +0200 + + QUIC configuration improvements. + +commit 5528699e0c3b24d862144594a55e258c7e6787c3 +Author: Thomas Dreibholz <[email protected]> +Date: Sun Jul 26 23:13:10 2026 +0200 + + Improved documentation. + +commit d7d53ec354b43f57062e74e1b1340654706c41d2 +Author: Thomas Dreibholz <[email protected]> +Date: Sun Jul 26 23:13:00 2026 +0200 + + Updated QUIC setup scripts. + +commit ae56081266e37c3683d2729c3f82b0845270aa7e +Author: Thomas Dreibholz <[email protected]> +Date: Sun Jul 26 22:51:53 2026 +0200 + + Bugfix: need to check for null-pointer, since host can be NULL. + +commit fb35aa73a95c3d6a4c897adcdf2dd27689170483 +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 14:23:29 2026 +0200 + + Minor clean-ups. + +commit fa2b1d1a693ef1e2f9ec025cafd2f787763faa37 +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 13:59:41 2026 +0200 + + CMakeLists.txt clean-ups. + +commit dec9de6a4a907e3b22e29591388b362425778b3b +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 13:56:57 2026 +0200 + + Added Solaris support to CMakeLists.txt. + +commit ecd2638dc17ce367558d4cb3ef3cfcba1d7ea9c3 +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 11:33:42 2026 +0200 + + Added missing Solaris parts. + +commit 6cc75b1c383ee373dabbaf10146f406979df79ed +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 11:32:15 2026 +0200 + + Another Solaris build update. + +commit c833ace33db8bc23f79a385ee202b1453c865894 +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 11:31:37 2026 +0200 + + Minor updates for building under Solaris. + +commit 7d4823464b791cd0bac9cd27b67ca38faaed49ec +Author: Thomas Dreibholz <[email protected]> +Date: Tue Jul 21 10:58:44 2026 +0200 + + Added Solaris support. + +commit 84becda425597ca5779700af49bd17593689aa95 +Author: Thomas Dreibholz <[email protected]> +Date: Sat Jul 18 16:44:16 2026 +0200 + + Updated build helper script. + +commit 105e55dc5f0c5028ce23f97c5c5eb09a7b2de453 +Author: Thomas Dreibholz <[email protected]> +Date: Sat Jul 18 15:26:50 2026 +0200 + + Further NetBSD improvements in CMakeLists.txt. + +commit 0585fc16e1134c7f8ef106ddaa10c21f7354a19d +Author: Thomas Dreibholz <[email protected]> +Date: Sat Jul 18 15:13:08 2026 +0200 + + Updated build helper script. + +commit 38d92137e4f0bddfd7ac63a732c2f9f8ffbe153e +Author: Thomas Dreibholz <[email protected]> +Date: Sat Jul 18 15:00:58 2026 +0200 + + CMakeLists.txt fix for NetBSD: need to set CMAKE_INSTALL_RPATH_USE_LINK_PATH if necessary. + +commit 7c26eec091cb989f163d9ee7ca6b2c0fc46c99c4 +Author: Thomas Dreibholz <[email protected]> +Date: Sat Jul 11 13:21:19 2026 +0200 + + New release netperfmeter-2.0.9. + commit 95090e53e0e13cb387e8519c01009d47397baf28 Author: Thomas Dreibholz <[email protected]> Date: Mon Jul 6 12:10:52 2026 +0200 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/README.md new/netperfmeter-2.0.10/README.md --- old/netperfmeter-2.0.9/README.md 2026-07-03 10:11:27.000000000 +0200 +++ new/netperfmeter-2.0.10/README.md 2026-07-27 09:59:00.000000000 +0200 @@ -419,16 +419,14 @@ * `TestCA/server.domain.example/server.domain.example.key`: The server key. * `TestCA/server.domain.example/server.domain.example.crt`: The corresponding server certificate. - The server certificate can be verified using the CA certificate: + The [X.509-Tools](https://www.nntb.no/~dreibh/system-tools/index.html#x.509-tools) from the [System-Tools](https://www.nntb.no/~dreibh/system-tools/) package provide further helpful utilities to handle X.509 certificates. Particularly, [Check-Certificate](https://www.nntb.no/~dreibh/system-tools/#check-certificate) verifies a certificate and its chain from a trusted CA certificate. With X.509-Tools installed, the server certificate can be verified using the CA certificate: ```bash - ./check-certificate \ + check-certificate \ TestCA/TestLevel1/certs/TestLevel1.crt \ TestCA/server.domain.example/server.domain.example.crt ``` - The [X.509-Tools](https://www.nntb.no/~dreibh/system-tools/index.html#x.509-tools) provide further helpful utilities to handle X.509 certificates. - * Run a passive instance (i.e. server side), using base port 9000, and specifying server key, server certificate, as well as root CA certificate: ```bash diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/autogen.sh new/netperfmeter-2.0.10/autogen.sh --- old/netperfmeter-2.0.9/autogen.sh 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/autogen.sh 2026-07-19 13:57:38.000000000 +0200 @@ -79,7 +79,7 @@ UNAME="$(uname)" case "${UNAME}" in - Linux) + Linux|SunOS) installPrefix="/usr" ;; NetBSD) @@ -120,7 +120,9 @@ elif [ "${UNAME}" == "FreeBSD" ] ; then CORES="$(sysctl -n hw.ncpu || echo "1")" elif [ "${UNAME}" == "NetBSD" ] || [ "${UNAME}" == "OpenBSD" ] ; then - CORES="$(sysctl -n hw.ncpuonline || echo "1")" + CORES="$(/sbin/sysctl -n hw.ncpuonline || echo "1")" + elif [ "${UNAME}" == "SunOS" ] ; then + CORES="$(psrinfo -t)" elif [ "${UNAME}" == "Darwin" ] ; then CORES="$(sysctl -n machdep.cpu.core_count)" else @@ -132,4 +134,4 @@ # ====== Build ============================================================== echo "Starting build using up to ${CORES} cores ..." -${COMMAND} make -j"${CORES}" +${COMMAND} make -j "${CORES}" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/debian/changelog new/netperfmeter-2.0.10/debian/changelog --- old/netperfmeter-2.0.9/debian/changelog 2026-07-11 13:21:18.000000000 +0200 +++ new/netperfmeter-2.0.10/debian/changelog 2026-07-31 12:49:37.000000000 +0200 @@ -1,3 +1,9 @@ +netperfmeter (2.0.10-1ubuntu1) unstable; urgency=medium + + * New upstream release. + + -- Thomas Dreibholz <[email protected]> Fri, 31 Jul 2026 12:49:37 +0200 + netperfmeter (2.0.9-1ubuntu1) unstable; urgency=medium * New upstream release. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/freebsd/netperfmeter/Makefile new/netperfmeter-2.0.10/freebsd/netperfmeter/Makefile --- old/netperfmeter-2.0.9/freebsd/netperfmeter/Makefile 2026-07-11 13:21:18.000000000 +0200 +++ new/netperfmeter-2.0.10/freebsd/netperfmeter/Makefile 2026-07-31 12:49:37.000000000 +0200 @@ -1,5 +1,5 @@ PORTNAME= netperfmeter -DISTVERSION= 2.0.9 +DISTVERSION= 2.0.10 CATEGORIES= benchmarks MASTER_SITES= https://www.nntb.no/~dreibh/netperfmeter/download/ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/rpm/netperfmeter.spec new/netperfmeter-2.0.10/rpm/netperfmeter.spec --- old/netperfmeter-2.0.9/rpm/netperfmeter.spec 2026-07-11 13:21:18.000000000 +0200 +++ new/netperfmeter-2.0.10/rpm/netperfmeter.spec 2026-07-31 12:49:37.000000000 +0200 @@ -1,5 +1,5 @@ Name: netperfmeter -Version: 2.0.9 +Version: 2.0.10 Release: 1 Summary: Network performance meter for the UDP, TCP, MPTCP, SCTP and DCCP protocols License: GPL-3.0-or-later @@ -304,6 +304,8 @@ %changelog +* Fri Jul 31 2026 Thomas Dreibholz <[email protected]> - 2.0.10-1 +- New upstream release. * Sat Jul 11 2026 Thomas Dreibholz <[email protected]> - 2.0.9-1 - New upstream release. * Wed Jul 01 2026 Thomas Dreibholz <[email protected]> - 2.0.8-1 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/CMakeLists.txt new/netperfmeter-2.0.10/src/CMakeLists.txt --- old/netperfmeter-2.0.9/src/CMakeLists.txt 2026-07-03 10:11:27.000000000 +0200 +++ new/netperfmeter-2.0.10/src/CMakeLists.txt 2026-07-23 17:49:42.000000000 +0200 @@ -82,7 +82,7 @@ transfer.h ) TARGET_INCLUDE_DIRECTORIES(netperfmeter PRIVATE ${BZ2_INCLUDE_DIR} ${SCTP_INCLUDE_DIR} ${QUIC_INCLUDE_DIR} ${LIBIBERTY_INCLUDE_DIR}) -TARGET_LINK_LIBRARIES(netperfmeter ${BZ2_LIBRARY} ${SCTP_LIBRARY} ${QUIC_LIBRARY} ${LIBIBERTY_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) +TARGET_LINK_LIBRARIES(netperfmeter ${BZ2_LIBRARY} ${SCTP_LIBRARY} ${QUIC_LIBRARY} ${LIBIBERTY_LIBRARY} ${KSTAT_LIBRARY} ${SOCKET_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) INSTALL(TARGETS netperfmeter RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) INSTALL(FILES netperfmeter.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) INSTALL(FILES netperfmeter.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mime/packages) @@ -207,7 +207,7 @@ # ====== Test Programs ====================================================== # ADD_EXECUTABLE(t1 t1.cc assure.cc cpustatus.cc loglevel.cc tools.cc mutex.cc) -# TARGET_LINK_LIBRARIES(t1 ${SCTP_LIBRARY}) +# TARGET_LINK_LIBRARIES(t1 ${SCTP_LIBRARY} ${KSTAT_LIBRARY} ${SOCKET_LIBRARY}) # ADD_EXECUTABLE(qs qs.cc assure.cc loglevel.cc tools.cc mutex.cc) # TARGET_LINK_LIBRARIES(qs ${SCTP_LIBRARY} ${QUIC_LIBRARY}) # ADD_EXECUTABLE(qc qc.cc assure.cc loglevel.cc tools.cc mutex.cc) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/cpustatus.cc new/netperfmeter-2.0.10/src/cpustatus.cc --- old/netperfmeter-2.0.9/src/cpustatus.cc 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/src/cpustatus.cc 2026-07-23 17:49:42.000000000 +0200 @@ -45,6 +45,9 @@ #include <sys/sysctl.h> #elif defined(__APPLE__) #include <mach/mach.h> +#elif defined(__sun__) +#include <kstat.h> +#include <sys/sysinfo.h> #endif @@ -67,6 +70,12 @@ "User", "Nice", "System", "Spinning", "Interrupt", "Idle" }; +#elif defined(__sun__) +#define IDLE_INDEX 3 +const char* CPUStatus::CpuStateNames[] = { + "User", "System", "Wait", "Idle" +}; + #elif defined(__APPLE__) #define IDLE_INDEX 2 const char* CPUStatus::CpuStateNames[] = { @@ -123,6 +132,13 @@ }; CPUs = (unsigned int)hinfo.max_cpus; +#elif defined(__sun) || defined(__sun__) + CpuStates = 4; + CPUs = sysconf(_SC_NPROCESSORS_CONF); + if(CPUs < 1) { + CPUs = 1; + } + #else #error Missing case! #endif @@ -267,6 +283,29 @@ } vm_deallocate(mach_task_self(), (vm_address_t)processorInfoArray, infoCount * sizeof(integer_t)); +#elif defined(__sun) || defined(__sun__) + kstat_ctl_t* kc = kstat_open(); + if(kc == nullptr) { + LOG_FATAL + stdlog << "Unable to open kstat!" << "\n"; + LOG_END_FATAL + } + + unsigned int cpuIndex = 0; + for(kstat_t* ksp = kc->kc_chain; (ksp != nullptr) && (cpuIndex < CPUs); ksp = ksp->ks_next) { + if(strcmp(ksp->ks_module, "cpu_stat") == 0) { + if(kstat_read(kc, ksp, nullptr) != -1) { + const cpu_stat_t* cs = static_cast<cpu_stat_t*>(ksp->ks_data); + const unsigned int base = (cpuIndex + 1) * CpuStates; + CpuTimes[base + 0] = cs->cpu_sysinfo.cpu[CPU_USER]; + CpuTimes[base + 1] = cs->cpu_sysinfo.cpu[CPU_KERNEL]; + CpuTimes[base + 2] = cs->cpu_sysinfo.cpu[CPU_WAIT]; + CpuTimes[base + 3] = cs->cpu_sysinfo.cpu[CPU_IDLE]; + cpuIndex++; + } + } + } + kstat_close(kc); #endif // ------ Compute total values ------------------------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/cpustatus.h new/netperfmeter-2.0.10/src/cpustatus.h --- old/netperfmeter-2.0.9/src/cpustatus.h 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/src/cpustatus.h 2026-07-23 17:49:42.000000000 +0200 @@ -73,7 +73,7 @@ typedef unsigned long long tick_t; #elif defined(__NetBSD__) typedef uint64_t tick_t; -#elif defined(__FreeBSD__) || defined(__OpenBSD__) +#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun__) typedef unsigned long tick_t; #elif defined(__APPLE__) typedef unsigned int tick_t; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/flow.cc new/netperfmeter-2.0.10/src/flow.cc --- old/netperfmeter-2.0.9/src/flow.cc 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/src/flow.cc 2026-07-27 15:50:47.000000000 +0200 @@ -542,6 +542,42 @@ return false; } } +#if defined(HAVE_QUIC) + else if(TrafficSpec.Protocol == IPPROTO_QUIC) { + quic_config quicCnfig; + socklen_t quicCnfigLength = sizeof(quicCnfig); + if(ext_getsockopt(socketDescriptor, SOL_QUIC, QUIC_SOCKOPT_CONFIG, &quicCnfig, &quicCnfigLength) < 0) { + + LOG_ERROR + stdlog << format("Failed to obtain configuration (QUIC_SOCKOPT_CONFIG option) on QUIC socket %d: %s!", + socketDescriptor, strerror(errno)) << "\n"; + LOG_END + return false; + } + const char* congestionControl = TrafficSpec.CongestionControl.c_str(); + if( (strcmp(congestionControl, "reno") == 0) || (strcmp(congestionControl, "default") == 0) ) { + quicCnfig.congestion_control_algo = QUIC_CONG_ALG_RENO; + } + else if(strcmp(congestionControl, "cubic") == 0) { + quicCnfig.congestion_control_algo = QUIC_CONG_ALG_CUBIC; + } + else { + LOG_ERROR + stdlog << format("Invalid congestion control %s for QUIC requested on socket %d", + congestionControl, socketDescriptor) << "\n"; + LOG_END + return false; + } + if(ext_setsockopt(socketDescriptor, SOL_QUIC, QUIC_SOCKOPT_CONFIG, &quicCnfig, quicCnfigLength) < 0) { + + LOG_ERROR + stdlog << format("Failed to set configuration (QUIC_SOCKOPT_CONFIG option) on QUIC socket %d: %s!", + socketDescriptor, strerror(errno)) << "\n"; + LOG_END + return false; + } + } +#endif #endif return true; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/loglevel.cc new/netperfmeter-2.0.10/src/loglevel.cc --- old/netperfmeter-2.0.9/src/loglevel.cc 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/src/loglevel.cc 2026-07-23 17:49:42.000000000 +0200 @@ -42,7 +42,7 @@ unsigned int gLogLevel = LOGLEVEL_INFO; bool gColorMode = true; bool gCloseStdLog = false; -char gHostName[256] = { 0x00 }; +char gHostName[258] = { 0x00 }; Mutex gLogMutex; @@ -85,7 +85,7 @@ << "\n\n"; } - utsname hostInfo; + struct utsname hostInfo; if(uname(&hostInfo) != 0) { safestrcpy(gHostName, "?", sizeof(gHostName)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/loglevel.h new/netperfmeter-2.0.10/src/loglevel.h --- old/netperfmeter-2.0.9/src/loglevel.h 2026-05-08 08:50:40.000000000 +0200 +++ new/netperfmeter-2.0.10/src/loglevel.h 2026-07-23 17:49:42.000000000 +0200 @@ -48,7 +48,7 @@ extern unsigned int gLogLevel; extern bool gColorMode; extern bool gCloseStdLog; -extern char gHostName[256]; +extern char gHostName[258]; extern Mutex gLogMutex; #define stdlog (*gStdLog) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/netperfmeter.cc new/netperfmeter-2.0.10/src/netperfmeter.cc --- old/netperfmeter-2.0.9/src/netperfmeter.cc 2026-07-06 13:07:31.000000000 +0200 +++ new/netperfmeter-2.0.10/src/netperfmeter.cc 2026-07-27 09:59:00.000000000 +0200 @@ -302,7 +302,7 @@ gLocalDataAddresses = 0; char* address = optarg; while(gLocalDataAddresses < MAX_LOCAL_ADDRESSES) { - char* idx = index(address, ','); + char* idx = strchr(address, ','); if(idx) { *idx = 0x00; } @@ -325,7 +325,7 @@ gLocalControlAddresses = 0; char* address = optarg; while(gLocalControlAddresses < MAX_LOCAL_ADDRESSES) { - char* idx = index(address, ','); + char* idx = strchr(address, ','); if(idx) { *idx = 0x00; } @@ -986,7 +986,7 @@ error = quic_session_set_alpn(session, alpns, strlen(alpns)); } if(!error) { - error = gnutls_server_name_set(session, GNUTLS_NAME_DNS, host, strlen(host)); + error = gnutls_server_name_set(session, GNUTLS_NAME_DNS, host, (host != NULL) ? strlen(host) : 0); } if(!error) { gnutls_session_set_verify_cert(session, host, 0); @@ -2285,7 +2285,7 @@ if(argc - optind != 1) { usage(argv[0], 1); } - const unsigned int localPort = (index(argv[optind], ':') == nullptr) ? + const unsigned int localPort = (strchr(argv[optind], ':') == nullptr) ? atol(argv[optind]) : 0; const bool inPassiveMode = (localPort >= 1) && (localPort < 65535); if( (!inPassiveMode) && (gAssocSpecs.size() < 1) ) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/pdfembedfonts new/netperfmeter-2.0.10/src/pdfembedfonts --- old/netperfmeter-2.0.9/src/pdfembedfonts 2026-07-03 10:11:27.000000000 +0200 +++ new/netperfmeter-2.0.10/src/pdfembedfonts 2026-07-28 14:39:26.000000000 +0200 @@ -53,6 +53,9 @@ OpenBSD) GETOPT="$(command -v gnugetopt || true)" ;; + SunOS) + GETOPT="$(PATH="/usr/gnu/bin:${PATH}" command -v getopt || true)" + ;; Darwin) GETOPT="$(env PATH="/opt/homebrew/opt/gnu-getopt/bin:${PATH}" command -v getopt || true)" ;; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/plot-netperfmeter-results new/netperfmeter-2.0.10/src/plot-netperfmeter-results --- old/netperfmeter-2.0.9/src/plot-netperfmeter-results 2026-07-03 10:11:27.000000000 +0200 +++ new/netperfmeter-2.0.10/src/plot-netperfmeter-results 2026-07-28 14:39:34.000000000 +0200 @@ -60,6 +60,9 @@ OpenBSD) GETOPT="$(command -v gnugetopt || true)" ;; + SunOS) + GETOPT="$(PATH="/usr/gnu/bin:${PATH}" command -v getopt || true)" + ;; Darwin) GETOPT="$(env PATH="/opt/homebrew/opt/gnu-getopt/bin:${PATH}" command -v getopt || true)" ;; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/quic-setup/CertificateHelper.py new/netperfmeter-2.0.10/src/quic-setup/CertificateHelper.py --- old/netperfmeter-2.0.9/src/quic-setup/CertificateHelper.py 2026-07-03 10:11:27.000000000 +0200 +++ new/netperfmeter-2.0.10/src/quic-setup/CertificateHelper.py 2026-07-27 09:59:00.000000000 +0200 @@ -29,6 +29,7 @@ import ipaddress import os +import platform import re import shlex import shutil @@ -41,11 +42,11 @@ if sys.version_info < MIN_PYTHON: sys.exit('Python %s.%s or later is required!' % MIN_PYTHON) -# This library also requires the netifaces package: +# This library also requires the psutil package: try: - import netifaces + import psutil except ImportError: - sys.exit('The Python netifaces package is required!') + sys.exit('The Python psutil package is required!') from typing import Final from enum import Enum @@ -84,6 +85,25 @@ VerboseMode : bool = True +# ###### Find OpenSSL ####################################################### +system : Final[str] = platform.system() +currentPath : Final[str] = os.environ.get('PATH', '') + +if system == 'Darwin': + searchPath = f'/opt/homebrew/opt/openssl/bin{os.pathsep}{currentPath}' + opensslExecutable = shutil.which('openssl', path = searchPath) +elif system == 'SunOS': + searchPath = f'/usr/openssl/3/bin{os.pathsep}{currentPath}' + opensslExecutable = shutil.which('openssl', path = searchPath) +else: + opensslExecutable = shutil.which('openssl') + +if not opensslExecutable: + print('ERROR: OpenSSL is not installed!', file = sys.stderr) + sys.exit(1) + +# print(f'Using OpenSSL executable {opensslExecutable}!') + # ###### Execute command #################################################### def execute(command : str, mayFail : bool = False) -> int: @@ -122,15 +142,15 @@ subjectAltName = subjectAltName + ',DNS:' + fqdn # ------ Add all IP addresses -------------------------------------- - interfaces = netifaces.interfaces() - for family in [ netifaces.AF_INET, netifaces.AF_INET6 ]: - for interface in interfaces: - interfaceAddresses = netifaces.ifaddresses(interface).get(family) - if interfaceAddresses: - for interfaceAddress in interfaceAddresses: - address = ipaddress.ip_address(interfaceAddress['addr']) - if (not address.is_link_local) and (not address.is_loopback): - addresses.add(address) + interfaces = psutil.net_if_addrs() + for interface in interfaces: + interfaceAddresses = interfaces[interface] + for interfaceAddress in interfaceAddresses: + if ( (interfaceAddress.family == socket.AF_INET) or + (interfaceAddress.family == socket.AF_INET6) ): + address = ipaddress.ip_address(interfaceAddress.address) + if (not address.is_link_local) and (not address.is_loopback): + addresses.add(address) # ====== Look up addresses ============================================ elif hint == 'LOOKUP': @@ -456,7 +476,7 @@ raise Exception('Unsupported key algorithm!') execute(f"""\ -openssl genpkey \ +{opensslExecutable} genpkey \ {algorithmOptions} \ -aes256 \ -out {shlex.quote(self.KeyFileName + '.tmp')} \ @@ -479,7 +499,7 @@ if not os.path.isfile(self.CertFileName): sys.stdout.write('\x1b[33mGenerating self-signed root CA certificate ' + self.CertFileName + ' ...\x1b[0m\n') execute(f"""\ -openssl req \ +{opensslExecutable} req \ -x509 -new \ -config {shlex.quote(self.ConfigFileName)} \ -extensions v3_ca \ @@ -510,7 +530,7 @@ csrFileName : Final[str] = self.CertFileName + '.csr' sys.stdout.write('\x1b[33mGenerating CSR ' + csrFileName + ' ...\x1b[0m\n') execute(f"""\ -openssl req \ +{opensslExecutable} req \ -new \ -config {shlex.quote(self.ConfigFileName)} \ -extensions v3_ca \ @@ -526,7 +546,7 @@ tmpCertFileName = self.CertFileName + '.tmp' execute(f"""\ -openssl ca \ +{opensslExecutable} ca \ -batch \ -notext \ -config {shlex.quote(parentCA.ConfigFileName)} \ @@ -556,7 +576,7 @@ # all certificates of the chain. # -> https://stackoverflow.com/questions/25482199/verify-a-certificate-chain-using-openssl-verify command : str = f"""\ -openssl verify \ +{opensslExecutable} verify \ -verbose \ -CAfile {shlex.quote(self.RootCA.CertFileName)}""" if self.ParentCA: @@ -573,7 +593,7 @@ # ====== Print certificate ============================================ if VerboseMode: execute(f"""\ -openssl x509 \ +{opensslExecutable} x509 \ -noout \ -subject \ -in {shlex.quote(self.CertFileName)}""") @@ -590,7 +610,7 @@ tmpCertFileName = certificate.CertFileName + '.tmp' execute(f"""\ -openssl ca \ +{opensslExecutable} ca \ -batch \ -notext \ -config {shlex.quote(self.ConfigFileName)} \ @@ -615,7 +635,7 @@ sys.stdout.write('\x1b[33mVerifying certificate ' + certificate.CertFileName + ' ...\x1b[0m\n') assert self.RootCA is not None result = execute(f"""\ -openssl verify \ +{opensslExecutable} verify \ -verbose \ -crl_check \ -CAfile {shlex.quote(self.RootCA.CertFileName)} \ @@ -630,7 +650,7 @@ sys.stdout.write('\x1b[33mRevoking CA ' + ca.CertFileName + ' ...\x1b[0m\n') assert os.path.isfile(ca.CertFileName) result = execute(f"""\ -openssl ca \ +{opensslExecutable} ca \ -revoke {shlex.quote(ca.CertFileName)} \ -config {shlex.quote(self.ConfigFileName)} \ -passin file:{shlex.quote(self.PasswordFileName)}""") @@ -646,7 +666,7 @@ sys.stdout.write('\x1b[33mRevoking certificate ' + certificate.CertFileName + ' ...\x1b[0m\n') assert os.path.isfile(self.CertFileName) result = execute(f"""\ -openssl ca \ +{opensslExecutable} ca \ -revoke {shlex.quote(certificate.CertFileName)} \ -config {shlex.quote(certificate.CA.ConfigFileName)} \ -passin file:{shlex.quote(certificate.CA.PasswordFileName)}""") @@ -661,7 +681,7 @@ def generateCRL(self) -> None: sys.stdout.write('\x1b[33mGenerating CRL ' + self.CRLFileName + ' ...\x1b[0m\n') execute(f"""\ -openssl ca \ +{opensslExecutable} ca \ -gencrl \ -config {shlex.quote(self.ConfigFileName)} \ -passin file:{shlex.quote(self.PasswordFileName)} \ @@ -761,7 +781,7 @@ raise Exception('Unsupported key algorithm!') execute(f"""\ -openssl genpkey \ +{opensslExecutable} genpkey \ {algorithmOptions} \ -out {shlex.quote(keyFileName + '.tmp')} && \ mv {shlex.quote(keyFileName + '.tmp')} {shlex.quote(keyFileName)}""") @@ -777,7 +797,7 @@ csrFileName : Final[str] = os.path.join(self.Directory, safeName + '.csr') sys.stdout.write('\x1b[33mGenerating CSR ' + csrFileName + ' ...\x1b[0m\n') execute(f"""\ -openssl req \ +{opensslExecutable} req \ -new \ -config {shlex.quote(self.CA.ConfigFileName)} \ -extensions {shlex.quote(self.Extension)} \ @@ -802,7 +822,7 @@ # ====== Verify certificate =========================================== # Print certificate: execute(f"""\ -openssl x509 \ +{opensslExecutable} x509 \ -noout \ -subject \ -in {shlex.quote(self.CertFileName)}""") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/quic-setup/view-certificate new/netperfmeter-2.0.10/src/quic-setup/view-certificate --- old/netperfmeter-2.0.9/src/quic-setup/view-certificate 2026-07-03 10:11:27.000000000 +0200 +++ new/netperfmeter-2.0.10/src/quic-setup/view-certificate 1970-01-01 01:00:00.000000000 +0100 @@ -1,203 +0,0 @@ -#!/usr/bin/env bash -# ========================================================================== -# ____ _ _____ _ -# / ___| _ _ ___| |_ ___ _ __ ___ |_ _|__ ___ | |___ -# \___ \| | | / __| __/ _ \ '_ ` _ \ _____| |/ _ \ / _ \| / __| -# ___) | |_| \__ \ || __/ | | | | |_____| | (_) | (_) | \__ \ -# |____/ \__, |___/\__\___|_| |_| |_| |_|\___/ \___/|_|___/ -# |___/ -# --- System-Tools --- -# https://www.nntb.no/~dreibh/system-tools/ -# ========================================================================== -# -# X.509 Certificate Viewer -# Copyright (C) 2025-2026 by Thomas Dreibholz -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. -# -# Contact: [email protected] - -# Bash options: -set -euo pipefail - -# gettext options: -export TEXTDOMAIN="view-certificate" -# export TEXTDOMAINDIR="${PWD}/locale" # Default: "/usr/share/locale" - -# shellcheck disable=SC1091 -. gettext.sh - - -# ###### Usage ############################################################## -usage () { - local exitCode="$1" - echo >&2 "$(gettext "Usage:") $0 [-h|--help] [-v|--version] certificate [...]" - exit "${exitCode}" -} - - -# ###### Version ############################################################ -version () { - echo "view-certificate @BUILD_MAJOR@.@BUILD_MINOR@.@BUILD_PATCH@" - exit 0 -} - - -# ###### Print date in current locale and current time zone ################# -print-date () -{ - local input="$1" - local unixTS - local datetime - if date --version >/dev/null 2>&1; then - unixTS="$(date -d "${input}" +"%s")" - datetime="$(date -d "@${unixTS}" +"%c %Z")" - else - unixTS="$(LC_ALL=C.UTF-8 date -j -f "%b %d %T %Y %Z" "${input}" +"%s")" - datetime="$(date -r "${unixTS}" +"%c %Z")" - fi - echo "${datetime}" -} - - - -# ###### Main program ####################################################### - -# ====== Handle arguments =================================================== -GETOPT="$(PATH=/usr/local/bin:${PATH} which getopt || true)" -options="$(${GETOPT} -o hv --long help,version -a -- "$@")" -# shellcheck disable=SC2181 -if [[ $? -ne 0 ]]; then - usage 1 -fi -eval set -- "${options}" - -while [ $# -gt 0 ] ; do - case "$1" in - -h | --help) - usage 0 - # shift - ;; - -v | --version) - version - # shift - ;; - --) - shift - break - ;; - esac -done -if [ $# -lt 1 ] ; then - usage 1 -fi - -# ====== Check availability of tools ======================================== -OPENSSL="$(which openssl || true)" -if [ "${OPENSSL}" == "" ] ; then - gettext >&2 "ERROR: OpenSSL is not installed!" - echo >&2 - exit 1 -fi - -# ====== Check each certificate ============================================= -while [ $# -gt 0 ] ; do - - # ====== Look for certificate ============================================ - CERTIFICATE_FILE="$1" - shift - if [ "${CERTIFICATE_FILE}" == "-" ] ; then - CERTIFICATE_FILE="/dev/stdin" - fi - if [ ! -e "${CERTIFICATE_FILE}" ] ; then - eval_gettext >&2 "ERROR: Unable to find certificate file \${CERTIFICATE_FILE}!" - echo >&2 - exit 1 - fi - - # ====== Display certificate details ===================================== - echo -e "\e[34m$(eval_gettext "Certificate in \${CERTIFICATE_FILE}:")\e[0m" - "${OPENSSL}" x509 -in "${CERTIFICATE_FILE}" -noout -subject -dates -ext subjectAltName,basicConstraints,keyUsage,extendedKeyUsage,subjectKeyIdentifier,authorityKeyIdentifier | ( - validityFrom="?" - validityTo="?" - subject="?" - declare -A extensions=( - ["Subject Alternative Name"]="(none)" - ["Key Usage"]="(none)" - ["Basic Constraints"]="(none)" - ["Extended Key Usage"]="(none)" - ["Subject Key Identifier"]="(none)" - ["Authority Key Identifier"]="(none)" - ) - while read -r line ; do - if [[ "${line}" =~ ^(subject=)(.*)$ ]] ; then - # Subject with underlined CN: - # shellcheck disable=SC2001 - subject="$(echo "${BASH_REMATCH[2]}" | sed -e 's/\(CN = \)\([^,]*\)/\x1b[4m\1\2\x1b[24m/')" - elif [[ "${line}" =~ ^(notBefore=)(.*)$ ]] ; then - validityFrom="$(print-date "${BASH_REMATCH[2]}")" - elif [[ "${line}" =~ ^(notAfter=)(.*)$ ]] ; then - validityTo="$(print-date "${BASH_REMATCH[2]}")" - elif [[ "${line}" =~ ^([ \t]*)(X509v3 )(.*)(:[[:space:]]*)(.*)$ ]] ; then - extension="${BASH_REMATCH[3]}" - critical="${BASH_REMATCH[5]}" - if [ "${critical}" != "" ] ; then - extensions["${extension}"]="\\e[4m${critical}:\\e[24m " - else - extensions["${extension}"]="" - fi - elif [ "${extension}" != "" ] && [[ "${line}" =~ ^([[:space:]]*)(.*)$ ]] ; then - extensions["${extension}"]+="${BASH_REMATCH[2]}" - extension="" - fi - done - label="$(gettext "%-25s")" - printf "\e[33m${label} \e[35m%s\e[0m\n" \ - "$(gettext "Subject:")" "$(echo -e "${subject}")" - printf "\e[33m${label} \e[35m%s\e[0m\n" \ - "$(gettext "Subject Alt Name:")" "${extensions["Subject Alternative Name"]}" - printf "\e[33m${label} \e[36m%s — %s\e[0m\n" \ - "$(gettext "Validity:")" "${validityFrom}" "${validityTo}" - for extension in "Basic Constraints" \ - "Key Usage" "Extended Key Usage" \ - "Subject Key Identifier" "Authority Key Identifier" ; do - printf "\e[33m${label} \e[33m%s\e[0m\n" \ - "${extension}:" "$(echo -e "${extensions["${extension}"]}")" - done - ) - echo -en "\e[0m" - - # ====== Display certificate hierarchy =================================== - echo -e "\e[34m$(eval_gettext "Hierarchy in \${CERTIFICATE_FILE}"):\e[0m" - "${OPENSSL}" crl2pkcs7 -nocrl -certfile "${CERTIFICATE_FILE}" | \ - "${OPENSSL}" pkcs7 -print_certs -noout | ( - entry=0 - while read -r line ; do - if [[ "${line}" =~ ^(subject=)(.*)$ ]] ; then - # Subject with underlined CN: - # shellcheck disable=SC2001 - subject="$(echo "${BASH_REMATCH[2]}" | sed -e 's/\(CN = \)\([^,]*\)/\x1b[4m\1\2\x1b[24m/')" - - entry=$((entry + 1)) - echo -en " \x1b[33m$(eval_gettext "#\${entry}.") " - if [ ${entry} -eq 1 ] ; then - echo -e "\e[35m${subject}\e[0m" - else - echo -e "\e[37m${subject}\e[0m" - fi - fi - done - ) - -done diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/runtimeestimator.cc new/netperfmeter-2.0.10/src/runtimeestimator.cc --- old/netperfmeter-2.0.9/src/runtimeestimator.cc 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/src/runtimeestimator.cc 2026-07-23 17:49:42.000000000 +0200 @@ -38,7 +38,7 @@ #include <endian.h> #elif defined(__FreeBSD__) || defined(__NetBSD__) #include <sys/endian.h> -#elif defined(__OpenBSD__) +#elif defined(__OpenBSD__) || defined(__sun__) #include <endian.h> #elif defined(__APPLE__) #include <libkern/OSByteOrder.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/netperfmeter-2.0.9/src/tools.h new/netperfmeter-2.0.10/src/tools.h --- old/netperfmeter-2.0.9/src/tools.h 2026-06-23 13:11:41.000000000 +0200 +++ new/netperfmeter-2.0.10/src/tools.h 2026-07-23 17:49:42.000000000 +0200 @@ -44,7 +44,7 @@ #include <ext_socket.h> // Endianess conversions: htobe*(), be*toh(): -#if defined(__linux__) || defined(__OpenBSD__) +#if defined(__linux__) || defined(__OpenBSD__) || defined(__sun__) #include <endian.h> #elif defined(__FreeBSD__) || defined(__NetBSD__) #include <sys/endian.h>
