aboutsummaryrefslogtreecommitdiffstats
path: root/meta-networking/recipes-protocols/net-snmp/net-snmp
diff options
context:
space:
mode:
Diffstat (limited to 'meta-networking/recipes-protocols/net-snmp/net-snmp')
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0001-Android-Fix-the-build.patch83
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-add-knob-whether-nlist.h-are-checked.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-add-knob-whether-nlist.h-are-checked.patch)21
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-fix-compile-error-disable-des.patch62
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0002-configure-fix-a-cc-check-issue.patch28
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0002-net-snmp-fix-libtool-finish.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/fix-libtool-finish.patch)12
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0003-testing-add-the-output-format-for-ptest.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-testing-add-the-output-format-for-ptest.patch)6
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0004-config_os_headers-Error-Fix.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/0001-config_os_headers-Error-Fix.patch)12
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0005-snmplib-keytools.c-Don-t-check-for-return-from-EVP_M.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/0001-snmplib-keytools.c-Don-t-check-for-return-from-EVP_M.patch)28
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0006-get_pid_from_inode-Include-limit.h.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/0001-get_pid_from_inode-Include-limit.h.patch)10
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0007-configure-fix-incorrect-variable.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/0004-configure-fix-incorrect-variable.patch)10
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0008-net-snmp-fix-engineBoots-value-on-SIGHUP.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-5.7.2-fix-engineBoots-value-on-SIGHUP.patch)33
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0009-net-snmp-fix-for-disable-des.patch (renamed from meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-fix-for-disable-des.patch)10
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0010-net-snmp-Reproducibility-Don-t-check-build-host-for.patch34
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0011-ac_add_search_path.m4-keep-consistent-between-32bit-.patch40
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/0012-Fix-configuration-of-NETSNMP_FD_MASK_TYPE.patch43
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-accept-configure-options-from-env.patch15
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-have-printcap.patch19
-rw-r--r--[-rwxr-xr-x]meta-networking/recipes-protocols/net-snmp/net-snmp/run-ptest0
-rw-r--r--meta-networking/recipes-protocols/net-snmp/net-snmp/systemd-support.patch1652
19 files changed, 283 insertions, 1835 deletions
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-Android-Fix-the-build.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-Android-Fix-the-build.patch
new file mode 100644
index 0000000000..097d9f83cd
--- /dev/null
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-Android-Fix-the-build.patch
@@ -0,0 +1,83 @@
+From b4598662a39ff6974119c900ea56a4d020eac366 Mon Sep 17 00:00:00 2001
+From: Bart Van Assche <bvanassche@acm.org>
+Date: Wed, 20 Dec 2023 13:08:06 -0800
+Subject: [PATCH] Android: Fix the build
+
+Include <sys/select.h> for the fd_set type. In the configure script,
+check whether 'unsigned long' is the underlying type of fd_set. Use
+u_long instead of ulong.
+
+Upstream-Status: Backport [https://github.com/net-snmp/net-snmp/commit/b4598662a39ff6974119c900ea56a4d020eac366]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ agent/mibgroup/ip-mib/data_access/ipaddress_linux.c | 4 ++--
+ configure | 2 +-
+ configure.d/config_project_types | 2 +-
+ include/net-snmp/types.h | 3 +++
+ 4 files changed, 7 insertions(+), 4 deletions(-)
+
+diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_linux.c b/agent/mibgroup/ip-mib/data_access/ipaddress_linux.c
+index b38beb57dd..232202d0f9 100644
+--- a/agent/mibgroup/ip-mib/data_access/ipaddress_linux.c
++++ b/agent/mibgroup/ip-mib/data_access/ipaddress_linux.c
+@@ -50,7 +50,7 @@ int _load_v6(netsnmp_container *container, int idx_offset);
+ int
+ netsnmp_access_ipaddress_extra_prefix_info(int index,
+ u_long *preferedlt,
+- ulong *validlt,
++ u_long *validlt,
+ char *addr);
+ #endif
+
+@@ -523,7 +523,7 @@ out:
+
+ int
+ netsnmp_access_ipaddress_extra_prefix_info(int index, u_long *preferedlt,
+- ulong *validlt, char *addr)
++ u_long *validlt, char *addr)
+ {
+
+ struct {
+diff --git a/configure b/configure
+index e7bf859bba..48abcbab11 100755
+--- a/configure
++++ b/configure
+@@ -31577,7 +31577,7 @@ CFLAGS="$CFLAGS -Werror"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the type of fd_set::fds_bits" >&5
+ printf %s "checking for the type of fd_set::fds_bits... " >&6; }
+-for type in __fd_mask __int32_t long\ int unknown; do
++for type in __fd_mask __int32_t long 'unsigned long' unknown; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+
+diff --git a/configure.d/config_project_types b/configure.d/config_project_types
+index a78e8ebb06..ac958d6712 100644
+--- a/configure.d/config_project_types
++++ b/configure.d/config_project_types
+@@ -66,7 +66,7 @@ netsnmp_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -Werror"
+
+ AC_MSG_CHECKING([for the type of fd_set::fds_bits])
+-for type in __fd_mask __int32_t long\ int unknown; do
++for type in __fd_mask __int32_t long 'unsigned long' unknown; do
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+ #include <sys/select.h>
+ #include <stddef.h>
+diff --git a/include/net-snmp/types.h b/include/net-snmp/types.h
+index b78f53ffd7..6228170e5f 100644
+--- a/include/net-snmp/types.h
++++ b/include/net-snmp/types.h
+@@ -23,6 +23,9 @@
+ #endif
+
+ #include <sys/types.h>
++#ifdef __ANDROID__
++#include <sys/select.h>
++#endif
+
+ #if defined(WIN32) && !defined(cygwin)
+ typedef HANDLE netsnmp_pid_t;
+--
+2.44.0
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-add-knob-whether-nlist.h-are-checked.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-add-knob-whether-nlist.h-are-checked.patch
index 74b0c12e05..ea9dccac28 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-add-knob-whether-nlist.h-are-checked.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-add-knob-whether-nlist.h-are-checked.patch
@@ -1,35 +1,38 @@
-net-snmp: add knob whether nlist.h are checked
+From 787269b337e70f073e194c3b361eaf4d5f2291ce Mon Sep 17 00:00:00 2001
+From: Chong Lu <Chong.Lu@windriver.com>
+Date: Thu, 28 May 2020 09:46:34 -0500
+Subject: [PATCH] net-snmp: add knob whether nlist.h are checked
Previously, it still was checked when there was no nlish.h in sysroots directory.
Add knob to decide whether nlist.h are checked or not.
-Upstream-status: Pending
+Upstream-Status: Pending
Signed-off-by: Chong Lu <Chong.Lu@windriver.com>
---
- configure.d/config_os_headers | 2 ++
+ configure.d/config_os_headers | 2 ++
1 file changed, 2 insertions(+)
diff --git a/configure.d/config_os_headers b/configure.d/config_os_headers
-index d903f58..a05d30e 100644
+index 584064e..c0688f8 100644
--- a/configure.d/config_os_headers
+++ b/configure.d/config_os_headers
-@@ -31,6 +31,7 @@ AC_CHECK_HEADERS([getopt.h pthread.h regex.h ] dnl
- [sys/un.h ])
+@@ -37,6 +37,7 @@ AC_CHECK_HEADERS([getopt.h pthread.h regex.h ] dnl
+ [sys/timeb.h ])
# Library and Agent:
+if test "x$with_elf" != "xno"; then
AC_CHECK_HEADERS([nlist.h],,,[
AC_INCLUDES_DEFAULT
[
-@@ -38,6 +39,7 @@ AC_INCLUDES_DEFAULT
+@@ -44,6 +45,7 @@ AC_INCLUDES_DEFAULT
#define LIBBSD_DISABLE_DEPRECATED 1
#endif
]])
+fi
# Library:
- AC_CHECK_HEADERS([fcntl.h io.h kstat.h ] dnl
+ AC_CHECK_HEADERS([crt_externs.h ] dnl
--
-1.7.9.5
+2.25.1
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-fix-compile-error-disable-des.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-fix-compile-error-disable-des.patch
deleted file mode 100644
index 7e686ce7fe..0000000000
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-net-snmp-fix-compile-error-disable-des.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From e38c508ef401593b1d4fe42b62e42a49cfec82af Mon Sep 17 00:00:00 2001
-From: Changqing Li <changqing.li@windriver.com>
-Date: Tue, 26 Feb 2019 14:26:07 +0800
-Subject: [PATCH] net-snmp: fix compile error with --disable-des
-
-| scapi.c: In function 'sc_encrypt':
-| scapi.c:1256:5: error: 'pad_size' undeclared (first use in this function); did you mean 'dysize'?
-| pad_size = pai->pad_size;
-| ^~~~~~~~
-| dysize
-
-pad_size is defined only without --disable-des
-[snip]
-#ifndef NETSNMP_DISABLE_DES
- int pad, plast, pad_size = 0;
-
-but used when disable-des,
-[snip]
- QUITFUN(SNMPERR_GENERR, sc_encrypt_quit);
- }
- pad_size = pai->pad_size;
-
- memset(my_iv, 0, sizeof(my_iv));
-
-#ifndef NETSNMP_DISABLE_DES
- if (USM_CREATE_USER_PRIV_DES == (pai->type & USM_PRIV_MASK_ALG)) {
-
- /*
-
-fix by move it into #ifndef NETSNMP_DISABLE_DES
-
-Upstream-Status: Submitted [https://sourceforge.net/p/net-snmp/bugs/2927/]
-
-Signed-off-by: Changqing Li <changqing.li@windriver.com>
----
- snmplib/scapi.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/snmplib/scapi.c b/snmplib/scapi.c
-index 43caddf..c09deb0 100644
---- a/snmplib/scapi.c
-+++ b/snmplib/scapi.c
-@@ -1253,7 +1253,6 @@ sc_encrypt(const oid * privtype, size_t privtypelen,
-
- QUITFUN(SNMPERR_GENERR, sc_encrypt_quit);
- }
-- pad_size = pai->pad_size;
-
- memset(my_iv, 0, sizeof(my_iv));
-
-@@ -1263,6 +1262,8 @@ sc_encrypt(const oid * privtype, size_t privtypelen,
- /*
- * now calculate the padding needed
- */
-+
-+ pad_size = pai->pad_size;
- pad = pad_size - (ptlen % pad_size);
- plast = (int) ptlen - (pad_size - pad);
- if (pad == pad_size)
---
-2.7.4
-
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0002-configure-fix-a-cc-check-issue.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0002-configure-fix-a-cc-check-issue.patch
deleted file mode 100644
index 4782714d57..0000000000
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/0002-configure-fix-a-cc-check-issue.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-From a3631df3d6743113e1cd63579925e15bcce85868 Mon Sep 17 00:00:00 2001
-From: Wenlin Kang <wenlin.kang@windriver.com>
-Date: Wed, 24 May 2017 16:45:34 +0800
-Subject: [PATCH 2/4] configure: fix a cc check issue.
-
-When has "." in cc value, the expression
-$myperl -V:cc | $myperl -n -e 'print if (s/^\s*cc=.([-=\w\s\/]+).;\s*/$1/);'
-can't get corretly the cc's value.
-
-Signed-off-by: Wenlin Kang <wenlin.kang@windriver.com>
-
----
- configure.d/config_project_perl_python | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/configure.d/config_project_perl_python b/configure.d/config_project_perl_python
-index 475c843..22d2ad3 100644
---- a/configure.d/config_project_perl_python
-+++ b/configure.d/config_project_perl_python
-@@ -87,7 +87,7 @@ if test "x$install_perl" != "xno" ; then
- if test "x$enable_perl_cc_checks" != "xno" ; then
- AC_MSG_CHECKING([for Perl cc])
- changequote(, )
-- PERLCC=`$myperl -V:cc | $myperl -n -e 'print if (s/^\s*cc=.([-=\w\s\/]+).;\s*/$1/);'`
-+ PERLCC=`$myperl -V:cc | $myperl -n -e 'print if (s/^\s*cc=.([-=\.\w\s\/]+).;\s*/$1/);'`
- changequote([, ])
- if test "x$PERLCC" != "x" ; then
- AC_MSG_RESULT([$PERLCC])
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/fix-libtool-finish.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0002-net-snmp-fix-libtool-finish.patch
index fc3ac2a4ba..e951537b04 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/fix-libtool-finish.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0002-net-snmp-fix-libtool-finish.patch
@@ -1,4 +1,4 @@
-From 0becb4843a40910d5ec9aa11969d4905a22037cf Mon Sep 17 00:00:00 2001
+From 5f002c3cc46ecf4d4a29571309f2cc0d3d34330f Mon Sep 17 00:00:00 2001
From: "Roy.Li" <rongqing.li@windriver.com>
Date: Fri, 16 Jan 2015 14:14:01 +0800
Subject: [PATCH] net-snmp: fix "libtool --finish"
@@ -14,17 +14,16 @@ rpm-postinst for each recipe while do_package, in package.bbclass.
Upstream-Status: Inappropriate [cross compile specific]
Signed-off-by: Roy.Li <rongqing.li@windriver.com>
-
---
Makefile.top | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile.top b/Makefile.top
-index 5d4f9bc..d0ed31c 100644
+index d1b3923..53e0392 100644
--- a/Makefile.top
+++ b/Makefile.top
-@@ -89,7 +89,7 @@ LIBREVISION = 0
- LIB_LD_CMD = $(LIBTOOL) --mode=link $(LINKCC) $(CFLAGS) -rpath $(libdir) -version-info $(LIBCURRENT):$(LIBREVISION):$(LIBAGE) -o
+@@ -89,7 +89,7 @@ LIBREVISION = 1
+ LIB_LD_CMD = $(LIBTOOL) --mode=link $(LINKCC) $(CFLAGS) -rpath $(libdir) -version-info $(LIBCURRENT):$(LIBREVISION):$(LIBAGE) @LD_NO_UNDEFINED@ -o
LIB_EXTENSION = la
LIB_VERSION =
-LIB_LDCONFIG_CMD = $(LIBTOOL) --mode=finish $(INSTALL_PREFIX)$(libdir)
@@ -32,3 +31,6 @@ index 5d4f9bc..d0ed31c 100644
LINK = $(LIBTOOL) --mode=link $(LINKCC)
# RANLIB = @RANLIB@
RANLIB = :
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-testing-add-the-output-format-for-ptest.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0003-testing-add-the-output-format-for-ptest.patch
index 7cbaf0bc50..ab54492934 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-testing-add-the-output-format-for-ptest.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0003-testing-add-the-output-format-for-ptest.patch
@@ -1,4 +1,4 @@
-From 827fe3b0253aab33472828f40ad05934cc0261b8 Mon Sep 17 00:00:00 2001
+From 2a1a2b58af09c6c03026474f1fd0db7d36e977c7 Mon Sep 17 00:00:00 2001
From: Jackie Huang <jackie.huang@windriver.com>
Date: Wed, 14 Jan 2015 15:10:06 +0800
Subject: [PATCH] testing: add the output format for ptest
@@ -6,7 +6,6 @@ Subject: [PATCH] testing: add the output format for ptest
Upstream-Status: Inappropriate [OE specific]
Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
-
---
testing/RUNTESTS | 4 ++++
1 file changed, 4 insertions(+)
@@ -33,3 +32,6 @@ index 6715831..a2b6fb8 100755
done
if [ -f failed_tests ]; then
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-config_os_headers-Error-Fix.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0004-config_os_headers-Error-Fix.patch
index bfc55a08ac..e2269bc3e8 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-config_os_headers-Error-Fix.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0004-config_os_headers-Error-Fix.patch
@@ -1,4 +1,4 @@
-From 7ae2ce8dbf1c54d4e2db4a5f49397a239baadc49 Mon Sep 17 00:00:00 2001
+From b1c941c20577578aa5ff3450d9d8d7a23c55d14a Mon Sep 17 00:00:00 2001
From: Li xin <lixin.fnst@cn.fujitsu.com>
Date: Fri, 21 Aug 2015 18:23:13 +0900
Subject: [PATCH] config_os_headers: Error Fix
@@ -10,19 +10,18 @@ conftest.c:168:17: fatal error: pkg.h: No such file or directory
#include <pkg.h>
^
-Upstream-Status: pending
+Upstream-Status: Pending
Signed-off-by: Li Xin <lixin.fnst@cn.fujitsu.com>
-
---
configure.d/config_os_headers | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure.d/config_os_headers b/configure.d/config_os_headers
-index af99746..83b2e31 100644
+index c0688f8..f68713c 100644
--- a/configure.d/config_os_headers
+++ b/configure.d/config_os_headers
-@@ -489,8 +489,8 @@ then
+@@ -395,8 +395,8 @@ then
unset ac_cv_header_pkg_h
netsnmp_save_CPPFLAGS="$CPPFLAGS"
netsnmp_save_LDFLAGS="$LDFLAGS"
@@ -33,3 +32,6 @@ index af99746..83b2e31 100644
AC_CHECK_HEADERS(pkg.h,
NETSNMP_SEARCH_LIBS(pkg_init, pkg,
AC_DEFINE(HAVE_LIBPKG, 1, [define if you have BSD pkg-ng])))
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-snmplib-keytools.c-Don-t-check-for-return-from-EVP_M.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0005-snmplib-keytools.c-Don-t-check-for-return-from-EVP_M.patch
index 778b40188b..7a6b35460e 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-snmplib-keytools.c-Don-t-check-for-return-from-EVP_M.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0005-snmplib-keytools.c-Don-t-check-for-return-from-EVP_M.patch
@@ -1,31 +1,37 @@
-From 89538a973119f1bf976b3a6df157ea940cf32eb5 Mon Sep 17 00:00:00 2001
+From c790411f9aa82064fea9bbf23b499fb6b7f22c4f Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Fri, 18 Sep 2015 00:28:45 -0400
Subject: [PATCH] snmplib/keytools.c: Don't check for return from
-
EVP_MD_CTX_init()
EVP_MD_CTX_init() API returns void, it fixes errors with new compilers
snmplib/keytools.c: In function 'generate_Ku': error: invalid use of void expression
-Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
---
- snmplib/keytools.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
+ snmplib/keytools.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/snmplib/keytools.c b/snmplib/keytools.c
-index 2cf0240..50fd3ea 100644
+index 388e655..5a66898 100644
--- a/snmplib/keytools.c
+++ b/snmplib/keytools.c
-@@ -186,8 +186,7 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
+@@ -183,10 +183,7 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
ctx = EVP_MD_CTX_create();
#else
ctx = malloc(sizeof(*ctx));
-- if (!EVP_MD_CTX_init(ctx))
-- return SNMPERR_GENERR;
+- if (!EVP_MD_CTX_init(ctx)) {
+- rval = SNMPERR_GENERR;
+- goto generate_Ku_quit;
+- }
+ EVP_MD_CTX_init(ctx);
#endif
- if (!EVP_DigestInit(ctx, hashfn))
- return SNMPERR_GENERR;
+ if (!EVP_DigestInit(ctx, hashfn)) {
+ rval = SNMPERR_GENERR;
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-get_pid_from_inode-Include-limit.h.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0006-get_pid_from_inode-Include-limit.h.patch
index bf133b3e37..6a0161ae27 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/0001-get_pid_from_inode-Include-limit.h.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0006-get_pid_from_inode-Include-limit.h.patch
@@ -1,4 +1,4 @@
-From 98c6edba4835b515d933542411d80879327eee16 Mon Sep 17 00:00:00 2001
+From 95868615a04b4a6f0dd5997c9726422828426116 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Fri, 22 Jul 2016 18:34:39 +0000
Subject: [PATCH] get_pid_from_inode: Include limit.h
@@ -8,13 +8,12 @@ PATH_MAX and NAME_MAX are required by this file
Upstream-Status: Pending
Signed-off-by: Khem Raj <raj.khem@gmail.com>
-
---
agent/mibgroup/util_funcs/get_pid_from_inode.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/agent/mibgroup/util_funcs/get_pid_from_inode.c b/agent/mibgroup/util_funcs/get_pid_from_inode.c
-index aee907d..7abaec2 100644
+index 5788e1d..ea380a6 100644
--- a/agent/mibgroup/util_funcs/get_pid_from_inode.c
+++ b/agent/mibgroup/util_funcs/get_pid_from_inode.c
@@ -6,6 +6,7 @@
@@ -23,5 +22,8 @@ index aee907d..7abaec2 100644
#include <ctype.h>
+#include <limits.h>
#include <stdio.h>
- #if HAVE_STDLIB_H
+ #ifdef HAVE_STDLIB_H
#include <stdlib.h>
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0004-configure-fix-incorrect-variable.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0007-configure-fix-incorrect-variable.patch
index a3d84b291b..5d394eec14 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/0004-configure-fix-incorrect-variable.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0007-configure-fix-incorrect-variable.patch
@@ -1,20 +1,19 @@
-From f3c5cd4df7ce8e5639c99b7b918e41fb89e969e3 Mon Sep 17 00:00:00 2001
+From 385fa343cf178ccfe2c9a9fd7795d0db3c959fdd Mon Sep 17 00:00:00 2001
From: Wenlin Kang <wenlin.kang@windriver.com>
Date: Wed, 24 May 2017 17:10:20 +0800
-Subject: [PATCH 4/4] configure: fix incorrect variable
+Subject: [PATCH] configure: fix incorrect variable
For cross compile platform, this variable will not be correct, so fix it.
Upstream-Status: Inappropriate [cross compile specific]
Signed-off-by: Wenlin Kang <wenlin.kang@windriver.com>
-
---
Makefile.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile.in b/Makefile.in
-index 9dbdde1..5fdc760 100644
+index 1c1182e..f947b8c 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -173,7 +173,7 @@ OTHERCLEANTODOS=perlclean @PYTHONCLEANTARGS@ cleanfeatures perlcleanfeatures pyt
@@ -26,3 +25,6 @@ index 9dbdde1..5fdc760 100644
if test $$? != 0 ; then \
exit 1 ; \
fi
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-5.7.2-fix-engineBoots-value-on-SIGHUP.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0008-net-snmp-fix-engineBoots-value-on-SIGHUP.patch
index 5cbb60d8e5..a57c4c8f14 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-5.7.2-fix-engineBoots-value-on-SIGHUP.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0008-net-snmp-fix-engineBoots-value-on-SIGHUP.patch
@@ -1,35 +1,35 @@
-From d619cd9fc01f336ff0ff55b18f9112789eb4d84c Mon Sep 17 00:00:00 2001
-From: Marian Florea <marian.florea@windriver.com>
-Date: Thu, 20 Jul 2017 16:55:24 +0800
+From b5cbe0953a7e7a3c77c7ec69dfe81254475f08c0 Mon Sep 17 00:00:00 2001
+From: Zheng Ruoqin <zhengrq.fnst@fujitsu.com>
+Date: Wed, 9 Jun 2021 15:47:30 +0900
Subject: [PATCH] net snmp: fix engineBoots value on SIGHUP
Upstream-Status: Pending
Signed-off-by: Marian Florea <marian.florea@windriver.com>
Signed-off-by: Li Zhou <li.zhou@windriver.com>
-
+Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
---
agent/snmpd.c | 1 +
snmplib/snmpv3.c | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/agent/snmpd.c b/agent/snmpd.c
-index 6566354..eb0d4b4 100644
+index fe31c87..d9f68dd 100644
--- a/agent/snmpd.c
+++ b/agent/snmpd.c
-@@ -1239,6 +1239,7 @@ receive(void)
- snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
- netsnmp_get_version());
- update_config();
-+ snmp_store(app_name);
- send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 3);
- #if HAVE_SIGHOLD
- sigrelse(SIGHUP);
+@@ -1169,6 +1169,7 @@ snmpd_reconfig(void)
+ snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
+ netsnmp_get_version());
+ update_config();
++ snmp_store(app_name);
+ send_easy_trap(SNMP_TRAP_ENTERPRISESPECIFIC, 3);
+ #ifdef HAVE_SIGPROCMASK
+ ret = sigprocmask(SIG_UNBLOCK, &set, NULL);
diff --git a/snmplib/snmpv3.c b/snmplib/snmpv3.c
-index 771ba3b..5de05e7 100644
+index be9256f..d17d2e3 100644
--- a/snmplib/snmpv3.c
+++ b/snmplib/snmpv3.c
-@@ -1060,9 +1060,9 @@ init_snmpv3_post_config(int majorid, int minorid, void *serverarg,
+@@ -1071,9 +1071,9 @@ init_snmpv3_post_config(int majorid, int minorid, void *serverarg,
/*
* if our engineID has changed at all, the boots record must be set to 1
*/
@@ -41,3 +41,6 @@ index 771ba3b..5de05e7 100644
engineBoots = 1;
}
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-fix-for-disable-des.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0009-net-snmp-fix-for-disable-des.patch
index 4cd8fd1e46..36a676fb02 100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/net-snmp-fix-for-disable-des.patch
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0009-net-snmp-fix-for-disable-des.patch
@@ -1,4 +1,4 @@
-From 068952c0e0cdda5a91250b91c5fcc9b85b43daab Mon Sep 17 00:00:00 2001
+From aa1f157c675da248ed186e020d17cb2528d0be12 Mon Sep 17 00:00:00 2001
From: Jackie Huang <jackie.huang@windriver.com>
Date: Thu, 22 Jun 2017 10:25:08 +0800
Subject: [PATCH] net-snmp: fix for --disable-des
@@ -9,16 +9,15 @@ the --disable-des works correctly.
Upstream-Status: Submitted [net-snmp-coders@lists.sourceforge.net]
Signed-off-by: Jackie Huang <jackie.huang@windriver.com>
-
---
snmplib/scapi.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/snmplib/scapi.c b/snmplib/scapi.c
-index 8ad1d70..43caddf 100644
+index ac77004..7545bfa 100644
--- a/snmplib/scapi.c
+++ b/snmplib/scapi.c
-@@ -84,7 +84,9 @@ netsnmp_feature_child_of(usm_scapi, usm_support)
+@@ -86,7 +86,9 @@ netsnmp_feature_child_of(usm_scapi, usm_support);
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
@@ -28,3 +27,6 @@ index 8ad1d70..43caddf 100644
#ifdef HAVE_AES
#include <openssl/aes.h>
#endif
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0010-net-snmp-Reproducibility-Don-t-check-build-host-for.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0010-net-snmp-Reproducibility-Don-t-check-build-host-for.patch
new file mode 100644
index 0000000000..246ce2b8d9
--- /dev/null
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0010-net-snmp-Reproducibility-Don-t-check-build-host-for.patch
@@ -0,0 +1,34 @@
+From a96140995d10660046146d9fa75faa5f7faabab0 Mon Sep 17 00:00:00 2001
+From: "douglas.royds" <douglas.royds@taitradio.com>
+Date: Wed, 21 Nov 2018 13:52:18 +1300
+Subject: [PATCH] net-snmp: Reproducibility: Don't check build host for
+
+Reproducible build: Don't check for /etc/printcap on the build machine when
+cross-compiling. Use AC_CHECK_FILE to set the cached variable
+ac_cv_file__etc_printcap instead. When cross-compiling, this variable should be
+set in the environment to "yes" or "no" as appropriate for the target platform.
+
+Upstream-Status: Pending
+---
+ configure.d/config_os_misc4 | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/configure.d/config_os_misc4 b/configure.d/config_os_misc4
+index 4c445d6..099257f 100644
+--- a/configure.d/config_os_misc4
++++ b/configure.d/config_os_misc4
+@@ -99,9 +99,9 @@ if test x$LPSTAT_PATH != x; then
+ [Path to the lpstat command])
+ AC_DEFINE(HAVE_LPSTAT, 1, [Set if the lpstat command is available])
+ fi
+-if test -r /etc/printcap; then
++AC_CHECK_FILE([/etc/printcap],
+ AC_DEFINE(HAVE_PRINTCAP, 1, [Set if /etc/printcap exists])
+-fi
++)
+
+
+ # Check ps args
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0011-ac_add_search_path.m4-keep-consistent-between-32bit-.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0011-ac_add_search_path.m4-keep-consistent-between-32bit-.patch
new file mode 100644
index 0000000000..1e845c4e63
--- /dev/null
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0011-ac_add_search_path.m4-keep-consistent-between-32bit-.patch
@@ -0,0 +1,40 @@
+From 85a6c5017a2cd18a5a66afcb3f6a02276c101ad0 Mon Sep 17 00:00:00 2001
+From: Mingli Yu <mingli.yu@windriver.com>
+Date: Fri, 29 Jan 2021 08:49:15 +0000
+Subject: [PATCH] ac_add_search_path.m4: keep consistent between 32bit and
+ 64bit
+
+With configure option "--with-openssl=${STAGING_EXECPREFIXDIR}", it behaves
+differently between 32bit and 64bit system as the openssl lib resides under
+/build/tmp/work/corei7-64-wrs-linux/net-snmp/5.9-r0/recipe-sysroot/usr/lib64
+for 64bit system, but resides under [1] for 32bit system.
+
+So add the patch to fix the gap between 32bit and 64bit system.
+
+[1] /build/tmp/work/corei7-64-wrs-linux/net-snmp/5.9-r0/recipe-sysroot/usr/lib
+
+Upstream-Status: Inappropriate [configuration specific]
+
+Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
+---
+ m4/ac_add_search_path.m4 | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/m4/ac_add_search_path.m4 b/m4/ac_add_search_path.m4
+index 8e0a819..e9585bc 100644
+--- a/m4/ac_add_search_path.m4
++++ b/m4/ac_add_search_path.m4
+@@ -3,8 +3,8 @@ dnl Add a search path to the LIBS and CPPFLAGS variables
+ dnl
+ AC_DEFUN([AC_ADD_SEARCH_PATH],[
+ if test "x$1" != x -a -d $1; then
+- if test -d $1/lib; then
+- LDFLAGS="-L$1/lib $LDFLAGS"
++ if test -d $1/${libdir:5}; then
++ LDFLAGS="-L$1/${libdir:5} $LDFLAGS"
+ fi
+ if test -d $1/include; then
+ CPPFLAGS="-I$1/include $CPPFLAGS"
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/0012-Fix-configuration-of-NETSNMP_FD_MASK_TYPE.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/0012-Fix-configuration-of-NETSNMP_FD_MASK_TYPE.patch
new file mode 100644
index 0000000000..9d4b769930
--- /dev/null
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/0012-Fix-configuration-of-NETSNMP_FD_MASK_TYPE.patch
@@ -0,0 +1,43 @@
+From 21ea0b9ce5cc9445f7ffd7a9020b816681e16284 Mon Sep 17 00:00:00 2001
+From: Adam Gajda <adgajda@users.noreply.github.com>
+Date: Mon, 2 Oct 2023 16:40:31 +0200
+Subject: [PATCH] Fix configuration of NETSNMP_FD_MASK_TYPE
+
+Upstream-Status: Backport
+[https://github.com/net-snmp/net-snmp/commit/af1b7f77975bbb2fcbdb3f005f8cb010d1d33cd3]
+
+Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
+---
+ configure | 2 +-
+ configure.d/config_project_types | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/configure b/configure
+index 907d441..f4468c6 100755
+--- a/configure
++++ b/configure
+@@ -31638,7 +31638,7 @@ CFLAGS="$CFLAGS -Werror"
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the type of fd_set::fds_bits" >&5
+ printf %s "checking for the type of fd_set::fds_bits... " >&6; }
+-for type in __fd_mask __int32_t unknown; do
++for type in __fd_mask __int32_t long\ int unknown; do
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+
+diff --git a/configure.d/config_project_types b/configure.d/config_project_types
+index 1b4c66b..a78e8eb 100644
+--- a/configure.d/config_project_types
++++ b/configure.d/config_project_types
+@@ -66,7 +66,7 @@ netsnmp_save_CFLAGS=$CFLAGS
+ CFLAGS="$CFLAGS -Werror"
+
+ AC_MSG_CHECKING([for the type of fd_set::fds_bits])
+-for type in __fd_mask __int32_t unknown; do
++for type in __fd_mask __int32_t long\ int unknown; do
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
+ #include <sys/select.h>
+ #include <stddef.h>
+--
+2.25.1
+
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-accept-configure-options-from-env.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-accept-configure-options-from-env.patch
deleted file mode 100644
index b0dbf5ad36..0000000000
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-accept-configure-options-from-env.patch
+++ /dev/null
@@ -1,15 +0,0 @@
-Reproducible build: To avoid build host paths being written into binaries,
-accept NETSNMP_CONFIGURE_OPTIONS from the environment.
-NETSNMP_CONFIGURE_OPTIONS can be set either null or to a fixed value.
-
---- net-snmp-5.8.original/configure.ac 2018-11-20 17:41:39.926529072 +1300
-+++ net-snmp-5.8/configure.ac 2018-11-20 17:54:44.488180224 +1300
-@@ -28,7 +28,7 @@
- #
- # save the configure arguments
- #
--AC_DEFINE_UNQUOTED(NETSNMP_CONFIGURE_OPTIONS,"$ac_configure_args",
-+AC_DEFINE_UNQUOTED(NETSNMP_CONFIGURE_OPTIONS,"${NETSNMP_CONFIGURE_OPTIONS-$ac_configure_args}",
- [configure options specified])
- CONFIGURE_OPTIONS="\"$ac_configure_args\""
- AC_SUBST(CONFIGURE_OPTIONS)
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-have-printcap.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-have-printcap.patch
deleted file mode 100644
index 4316c7a713..0000000000
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/reproducibility-have-printcap.patch
+++ /dev/null
@@ -1,19 +0,0 @@
-Reproducible build: Don't check for /etc/printcap on the build machine when
-cross-compiling. Use AC_CHECK_FILE to set the cached variable
-ac_cv_file__etc_printcap instead. When cross-compiling, this variable should be
-set in the environment to "yes" or "no" as appropriate for the target platform.
-
---- net-snmp-5.8.original/configure.d/config_os_misc4 2018-11-20 17:05:03.986274522 +1300
-+++ net-snmp-5.8/configure.d/config_os_misc4 2018-11-20 17:08:32.250700448 +1300
-@@ -116,9 +116,9 @@
- [Path to the lpstat command])
- AC_DEFINE(HAVE_LPSTAT, 1, [Set if the lpstat command is available])
- fi
--if test -r /etc/printcap; then
-+AC_CHECK_FILE([/etc/printcap],
- AC_DEFINE(HAVE_PRINTCAP, 1, [Set if /etc/printcap exists])
--fi
-+)
-
-
- # Check ps args
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/run-ptest b/meta-networking/recipes-protocols/net-snmp/net-snmp/run-ptest
index 76514c202e..76514c202e 100755..100644
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/run-ptest
+++ b/meta-networking/recipes-protocols/net-snmp/net-snmp/run-ptest
diff --git a/meta-networking/recipes-protocols/net-snmp/net-snmp/systemd-support.patch b/meta-networking/recipes-protocols/net-snmp/net-snmp/systemd-support.patch
deleted file mode 100644
index c6af8c0f33..0000000000
--- a/meta-networking/recipes-protocols/net-snmp/net-snmp/systemd-support.patch
+++ /dev/null
@@ -1,1652 +0,0 @@
-From 0cad0c6c36af2a2d589563804c9ed2b37b7085fb Mon Sep 17 00:00:00 2001
-From: Li xin <lixin.fnst@cn.fujitsu.com>
-Date: Fri, 21 Aug 2015 14:37:02 +0900
-Subject: [PATCH] ystemd support backported from the master branch as of
- 23/04/2012 (post 5.7.1, pre 5.8).
-
-The following commits have been cherry-picked:
-
-19499c3c90bf9d7b2b9e5d08baa26cc6bba28a11
-fef6cddfdb94da1a6b1fb768af62918b80f11fd3
-0641e43c694c485cbbffef0556efc4641bd3ff50
-76530a89f1c8bbd0b63acce63e10d5d4812a1a16 (conflict resolved)
-bf108d7f1354f6276fc43c129963f2c49b9fc242
-3692875172352f72cf3afd0d35f355e83d7e421b
-74412748067c685e1d8ab6ed3bcc3ca9c2774844
-86132e3f1e6ef7b4e0b96d8fa24e37c81b71b0e0
-63557cf8986a33dba1d4429b583a901361052c4f
-
-Upstream-Status: Backport
-
-Signed-off-by: Thomas Fitzsimmons <fitzsim@cisco.com>
----
- README.systemd | 41 +++
- agent/snmpd.c | 33 +-
- apps/snmptrapd.c | 32 +-
- configure.d/config_modules_lib | 8 +
- configure.d/config_project_with_enable | 9 +
- dist/snmpd.servic | 18 +
- dist/snmpd.socket | 17 +
- dist/snmptrapd.service | 16 +
- dist/snmptrapd.socket | 14 +
- include/net-snmp/library/sd-daemon.h | 290 ++++++++++++++++
- snmplib/sd-daemon.c | 532 +++++++++++++++++++++++++++++
- snmplib/transports/snmpTCPDomain.c | 43 ++-
- snmplib/transports/snmpTCPIPv6Domain.c | 46 ++-
- snmplib/transports/snmpUDPIPv4BaseDomain.c | 33 +-
- snmplib/transports/snmpUDPIPv6Domain.c | 34 +-
- snmplib/transports/snmpUnixDomain.c | 66 ++--
- win32/libsnmp/Makefile.in | 6 +
- win32/net-snmp/net-snmp-config.h | 2 +
- win32/net-snmp/net-snmp-config.h.in | 2 +
- 19 files changed, 1176 insertions(+), 66 deletions(-)
- create mode 100644 README.systemd
- create mode 100644 dist/snmpd.servic
- create mode 100644 dist/snmpd.socket
- create mode 100644 dist/snmptrapd.service
- create mode 100644 dist/snmptrapd.socket
- create mode 100644 include/net-snmp/library/sd-daemon.h
- create mode 100644 snmplib/sd-daemon.c
-
-diff --git a/README.systemd b/README.systemd
-new file mode 100644
-index 0000000..dba15d1
---- /dev/null
-+++ b/README.systemd
-@@ -0,0 +1,41 @@
-+README.systemd
-+--------------
-+Net-SNMP provides two daemons, which support systemd system manager.
-+See http://www.freedesktop.org/wiki/Software/systemd to learn how
-+systemd works. Both socket activation and notification is supported by these
-+daemons.
-+
-+To enable systemd support, the sources must be compiled with
-+--with-systemd configure option.
-+
-+snmpd - The SNMP agent
-+----------------------
-+Socket activation od snmpd daemon is implemented, but it's discouraged.
-+The reason is simple - snmpd not only listens and processes SNMP requests
-+from network, but also gathers system statistics counters, sends traps and
-+communicates with subagents. It even opens few netlink sockets.
-+
-+In other words, snmpd should run from system start to properly work.
-+This can be done in two ways:
-+1) either as snmpd service unit with 'Type=notification' and without a socket
-+ unit
-+2) or as snmpd service unit with 'Type=simple', appropriate socket socket unit
-+ and the snmpd service enabled. This way systemd creates the snmpd listening
-+ socket early during boot and passes the sockets to snmpd slightly later
-+ (but still during machine boot). This way systemd can paralelize start of
-+ services, which depend on snmpd. Admins must adjust the socket file manually,
-+ depending if the snmpd support AgentX, IPv6, SMUX etc.
-+
-+snmpd should be started with '-f' command line parameter to disable forking -
-+systemd does that for us automatically.
-+
-+
-+snmptrapd - The trap processing daemon
-+--------------------------------------
-+snmptrapd supports full socket activation and also notification (if needed).
-+Both 'Type=simple' (with appropriate socket unit) and 'Type=notify' services
-+will work. Again, '-f' parameter should be provided on snmptrapd command line.
-+
-+If integration with SNMP agent using AgentX protocol is enabled, snmptrapd should
-+start during boot and not after first SNMP trap arrives. Same rules as for snmpd
-+applies then.
-diff --git a/agent/snmpd.c b/agent/snmpd.c
-index cfc7bce..116ee5c 100644
---- a/agent/snmpd.c
-+++ b/agent/snmpd.c
-@@ -164,6 +164,10 @@ typedef long fd_mask;
-
- #endif
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- netsnmp_feature_want(logging_file)
- netsnmp_feature_want(logging_stdio)
- netsnmp_feature_want(logging_syslog)
-@@ -443,19 +447,29 @@ main(int argc, char *argv[])
- int agent_mode = -1;
- char *pid_file = NULL;
- char option_compatability[] = "-Le";
-+#ifndef WIN32
-+ int prepared_sockets = 0;
-+#endif
- #if HAVE_GETPID
- int fd;
- FILE *PID;
- #endif
-
- #ifndef WIN32
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /* check if systemd has sockets for us and don't close them */
-+ prepared_sockets = netsnmp_sd_listen_fds(0);
-+#endif /* NETSNMP_NO_SYSTEMD */
-+
- /*
- * close all non-standard file descriptors we may have
- * inherited from the shell.
- */
-- for (i = getdtablesize() - 1; i > 2; --i) {
-- (void) close(i);
-- }
-+ if (!prepared_sockets) {
-+ for (i = getdtablesize() - 1; i > 2; --i) {
-+ (void) close(i);
-+ }
-+}
- #endif /* #WIN32 */
-
- /*
-@@ -1107,6 +1121,19 @@ main(int argc, char *argv[])
- netsnmp_addrcache_initialise();
-
- /*
-+ * Let systemd know we're up.
-+ */
-+#ifndef NETSNMP_NO_SYSTEMD
-+ netsnmp_sd_notify(1, "READY=1\n");
-+ if (prepared_sockets)
-+ /*
-+ * Clear the environment variable, we already processed all the sockets
-+ * by now.
-+ */
-+ netsnmp_sd_listen_fds(1);
-+#endif
-+
-+ /*
- * Forever monitor the dest_port for incoming PDUs.
- */
- DEBUGMSGTL(("snmpd/main", "We're up. Starting to process data.\n"));
-diff --git a/apps/snmptrapd.c b/apps/snmptrapd.c
-index bce0d47..c6a74ec 100644
---- a/apps/snmptrapd.c
-+++ b/apps/snmptrapd.c
-@@ -125,6 +125,10 @@ SOFTWARE.
-
- #include <net-snmp/net-snmp-features.h>
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- #ifndef BSD4_3
- #define BSD4_2
- #endif
-@@ -657,16 +661,25 @@ main(int argc, char *argv[])
- int agentx_subagent = 1;
- #endif
- netsnmp_trapd_handler *traph;
-+#ifndef WIN32
-+ int prepared_sockets = 0;
-+#endif
-
-
- #ifndef WIN32
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /* check if systemd has sockets for us and don't close them */
-+ prepared_sockets = netsnmp_sd_listen_fds(0);
-+#endif
- /*
- * close all non-standard file descriptors we may have
- * inherited from the shell.
- */
-- for (i = getdtablesize() - 1; i > 2; --i) {
-- (void) close(i);
-- }
-+ if (!prepared_sockets) {
-+ for (i = getdtablesize() - 1; i > 2; --i) {
-+ (void) close(i);
-+ }
-+}
- #endif /* #WIN32 */
-
- #ifdef SIGTERM
-@@ -1318,6 +1331,19 @@ main(int argc, char *argv[])
- #endif
- #endif
-
-+ /*
-+ * Let systemd know we're up.
-+ */
-+#ifndef NETSNMP_NO_SYSTEMD
-+ netsnmp_sd_notify(1, "READY=1\n");
-+ if (prepared_sockets)
-+ /*
-+ * Clear the environment variable, we already processed all the sockets
-+ * by now.
-+ */
-+ netsnmp_sd_listen_fds(1);
-+#endif
-+
- #ifdef WIN32SERVICE
- trapd_status = SNMPTRAPD_RUNNING;
- #endif
-diff --git a/configure.d/config_modules_lib b/configure.d/config_modules_lib
-index 362ba0a..bb69daa 100644
---- a/configure.d/config_modules_lib
-+++ b/configure.d/config_modules_lib
-@@ -53,6 +53,14 @@ if test "x$PARTIALTARGETOS" = "xmingw32" -o "x$PARTIALTARGETOS" = "xmingw32msvc"
- other_ftobjs_list="$other_ftobjs_list winpipe.ft"
- fi
-
-+# Linux systemd
-+if test "x$with_systemd" == "xyes"; then
-+ other_src_list="$other_src_list sd-daemon.c"
-+ other_objs_list="$other_objs_list sd-daemon.o"
-+ other_lobjs_list="$other_lobjs_list sd-daemon.lo"
-+ other_ftobjs_list="$other_ftobjs_list sd-daemon.ft"
-+fi
-+
- AC_SUBST(other_src_list)
- AC_SUBST(other_objs_list)
- AC_SUBST(other_lobjs_list)
-diff --git a/configure.d/config_project_with_enable b/configure.d/config_project_with_enable
-index 61ba026..d782d12 100644
---- a/configure.d/config_project_with_enable
-+++ b/configure.d/config_project_with_enable
-@@ -690,6 +690,15 @@ if test "x$with_dummy_values" != "xyes"; then
- data for])
- fi
-
-+NETSNMP_ARG_WITH(systemd,
-+[ --with-systemd Provide systemd support. See README.systemd
-+ for details.])
-+# Define unless specifically suppressed (i.e., option defaults to false).
-+if test "x$with_systemd" != "xyes"; then
-+ AC_DEFINE(NETSNMP_NO_SYSTEMD, 1,
-+ [If you don't want to integrate with systemd.])
-+fi
-+
- NETSNMP_ARG_ENABLE(set-support,
- [ --disable-set-support Do not allow SNMP set requests.])
- if test "x$enable_set_support" = "xno"; then
-diff --git a/dist/snmpd.servic b/dist/snmpd.servic
-new file mode 100644
-index 0000000..31391e5
---- /dev/null
-+++ b/dist/snmpd.servic
-@@ -0,0 +1,18 @@
-+#
-+# SNMP agent service file for systemd
-+#
-+#
-+# The service should be enabled, i.e. snmpd should start during machine boot.
-+# Socket activation shall not be used. See README.systemd for details.
-+
-+[Unit]
-+Description=Simple Network Management Protocol (SNMP) daemon.
-+After=syslog.target network.target
-+
-+[Service]
-+# Type=notify is also supported. It should be set when snmpd.socket is not used.
-+Type=simple
-+ExecStart=/usr/sbin/snmpd -f
-+
-+[Install]
-+WantedBy=multi-user.target
-diff --git a/dist/snmpd.socket b/dist/snmpd.socket
-new file mode 100644
-index 0000000..7f3a2d9
---- /dev/null
-+++ b/dist/snmpd.socket
-@@ -0,0 +1,17 @@
-+[Unit]
-+Description=Socket listening for SNMP and AgentX messages
-+
-+[Socket]
-+ListenDatagram=0.0.0.0:161
-+# Uncomment other listening addresses as needed - TCP, UDP6, TCP6.
-+# It must match listening addresses/ports defined in snmpd.service
-+# or snmpd.conf.
-+# ListenStream=0.0.0.0:161
-+# ListenDatagram=[::]:161
-+# ListenStream=[::]:161
-+#
-+# Uncomment AgentX socket if snmpd.conf enables AgentX protocol.
-+# ListenStream=/var/agentx/master
-+
-+[Install]
-+WantedBy=sockets.target
-diff --git a/dist/snmptrapd.service b/dist/snmptrapd.service
-new file mode 100644
-index 0000000..e88a5b4
---- /dev/null
-+++ b/dist/snmptrapd.service
-@@ -0,0 +1,16 @@
-+#
-+# SNMP trap-processing service file for systemd
-+#
-+
-+[Unit]
-+Description=Simple Network Management Protocol (SNMP) Trap daemon.
-+After=syslog.target network.target
-+
-+[Service]
-+# Type=notify is also supported. It should be set when snmptrapd.socket is not
-+# used.
-+Type=simple
-+ExecStart=/usr/sbin/snmptrapd -f
-+
-+[Install]
-+WantedBy=multi-user.target
-diff --git a/dist/snmptrapd.socket b/dist/snmptrapd.socket
-new file mode 100644
-index 0000000..2d24fb8
---- /dev/null
-+++ b/dist/snmptrapd.socket
-@@ -0,0 +1,14 @@
-++[Unit]
-++Description=Socket listening for SNMP trap messages
-++
-++[Socket]
-++ListenDatagram=0.0.0.0:162
-++# Uncomment other listening addresses as needed - TCP, UDP6, TCP6.
-++# It must match listening addresses/ports defined in snmptrapd.service
-++# or snmptrapd.conf.
-++# ListenStream=0.0.0.0:162
-++# ListenDatagram=[::]:162
-++# ListenStream=[::]:162
-++
-++[Install]
-++WantedBy=sockets.target
-diff --git a/include/net-snmp/library/sd-daemon.h b/include/net-snmp/library/sd-daemon.h
-new file mode 100644
-index 0000000..85274c9
---- /dev/null
-+++ b/include/net-snmp/library/sd-daemon.h
-@@ -0,0 +1,290 @@
-+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-+
-+#ifndef SNMPD_SD_DAEMON_H
-+#define SNMPD_SD_DAEMON_H
-+
-+/***
-+ Copyright 2010 Lennart Poettering
-+
-+ Permission is hereby granted, free of charge, to any person
-+ obtaining a copy of this software and associated documentation files
-+ (the "Software"), to deal in the Software without restriction,
-+ including without limitation the rights to use, copy, modify, merge,
-+ publish, distribute, sublicense, and/or sell copies of the Software,
-+ and to permit persons to whom the Software is furnished to do so,
-+ subject to the following conditions:
-+
-+ The above copyright notice and this permission notice shall be
-+ included in all copies or substantial portions of the Software.
-+
-+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ SOFTWARE.
-+***/
-+
-+#ifdef HAVE_SYS_TYPES_H
-+#include <sys/types.h>
-+#endif
-+#ifdef HAVE_INTTYPES_H
-+#include <inttypes.h>
-+#endif
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+/*
-+ Reference implementation of a few systemd related interfaces for
-+ writing daemons. These interfaces are trivial to implement. To
-+ simplify porting we provide this reference implementation.
-+ Applications are welcome to reimplement the algorithms described
-+ here if they do not want to include these two source files.
-+
-+ The following functionality is provided:
-+
-+ - Support for logging with log levels on stderr
-+ - File descriptor passing for socket-based activation
-+ - Daemon startup and status notification
-+ - Detection of systemd boots
-+
-+ You may compile this with -DDISABLE_SYSTEMD to disable systemd
-+ support. This makes all those calls NOPs that are directly related to
-+ systemd (i.e. only sd_is_xxx() will stay useful).
-+
-+ Since this is drop-in code we don't want any of our symbols to be
-+ exported in any case. Hence we declare hidden visibility for all of
-+ them.
-+
-+ You may find an up-to-date version of these source files online:
-+
-+ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.h
-+ http://cgit.freedesktop.org/systemd/plain/src/sd-daemon.c
-+
-+ This should compile on non-Linux systems, too, but with the
-+ exception of the sd_is_xxx() calls all functions will become NOPs.
-+
-+ See sd-daemon(7) for more information.
-+*/
-+
-+#ifndef _sd_printf_attr_
-+#if __GNUC__ >= 4
-+#define _sd_printf_attr_(a,b) __attribute__ ((format (printf, a, b)))
-+#else
-+#define _sd_printf_attr_(a,b)
-+#endif
-+#endif
-+
-+/*
-+ Log levels for usage on stderr:
-+
-+ fprintf(stderr, SD_NOTICE "Hello World!\n");
-+
-+ This is similar to printk() usage in the kernel.
-+*/
-+#define SD_EMERG "<0>" /* system is unusable */
-+#define SD_ALERT "<1>" /* action must be taken immediately */
-+#define SD_CRIT "<2>" /* critical conditions */
-+#define SD_ERR "<3>" /* error conditions */
-+#define SD_WARNING "<4>" /* warning conditions */
-+#define SD_NOTICE "<5>" /* normal but significant condition */
-+#define SD_INFO "<6>" /* informational */
-+#define SD_DEBUG "<7>" /* debug-level messages */
-+
-+/* The first passed file descriptor is fd 3 */
-+#define SD_LISTEN_FDS_START 3
-+
-+/*
-+ Returns how many file descriptors have been passed, or a negative
-+ errno code on failure. Optionally, removes the $LISTEN_FDS and
-+ $LISTEN_PID file descriptors from the environment (recommended, but
-+ problematic in threaded environments). If r is the return value of
-+ this function you'll find the file descriptors passed as fds
-+ SD_LISTEN_FDS_START to SD_LISTEN_FDS_START+r-1. Returns a negative
-+ errno style error code on failure. This function call ensures that
-+ the FD_CLOEXEC flag is set for the passed file descriptors, to make
-+ sure they are not passed on to child processes. If FD_CLOEXEC shall
-+ not be set, the caller needs to unset it after this call for all file
-+ descriptors that are used.
-+
-+ See sd_listen_fds(3) for more information.
-+*/
-+int netsnmp_sd_listen_fds(int unset_environment);
-+
-+/*
-+ Helper call for identifying a passed file descriptor. Returns 1 if
-+ the file descriptor is a FIFO in the file system stored under the
-+ specified path, 0 otherwise. If path is NULL a path name check will
-+ not be done and the call only verifies if the file descriptor
-+ refers to a FIFO. Returns a negative errno style error code on
-+ failure.
-+
-+ See sd_is_fifo(3) for more information.
-+*/
-+int netsnmp_sd_is_fifo(int fd, const char *path);
-+
-+/*
-+ Helper call for identifying a passed file descriptor. Returns 1 if
-+ the file descriptor is a special character device on the file
-+ system stored under the specified path, 0 otherwise.
-+ If path is NULL a path name check will not be done and the call
-+ only verifies if the file descriptor refers to a special character.
-+ Returns a negative errno style error code on failure.
-+
-+ See sd_is_special(3) for more information.
-+*/
-+int netsnmp_sd_is_special(int fd, const char *path);
-+
-+/*
-+ Helper call for identifying a passed file descriptor. Returns 1 if
-+ the file descriptor is a socket of the specified family (AF_INET,
-+ ...) and type (SOCK_DGRAM, SOCK_STREAM, ...), 0 otherwise. If
-+ family is 0 a socket family check will not be done. If type is 0 a
-+ socket type check will not be done and the call only verifies if
-+ the file descriptor refers to a socket. If listening is > 0 it is
-+ verified that the socket is in listening mode. (i.e. listen() has
-+ been called) If listening is == 0 it is verified that the socket is
-+ not in listening mode. If listening is < 0 no listening mode check
-+ is done. Returns a negative errno style error code on failure.
-+
-+ See sd_is_socket(3) for more information.
-+*/
-+int netsnmp_sd_is_socket(int fd, int family, int type, int listening);
-+
-+/*
-+ Helper call for identifying a passed file descriptor. Returns 1 if
-+ the file descriptor is an Internet socket, of the specified family
-+ (either AF_INET or AF_INET6) and the specified type (SOCK_DGRAM,
-+ SOCK_STREAM, ...), 0 otherwise. If version is 0 a protocol version
-+ check is not done. If type is 0 a socket type check will not be
-+ done. If port is 0 a socket port check will not be done. The
-+ listening flag is used the same way as in sd_is_socket(). Returns a
-+ negative errno style error code on failure.
-+
-+ See sd_is_socket_inet(3) for more information.
-+*/
-+int netsnmp_sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port);
-+
-+/*
-+ Helper call for identifying a passed file descriptor. Returns 1 if
-+ the file descriptor is an AF_UNIX socket of the specified type
-+ (SOCK_DGRAM, SOCK_STREAM, ...) and path, 0 otherwise. If type is 0
-+ a socket type check will not be done. If path is NULL a socket path
-+ check will not be done. For normal AF_UNIX sockets set length to
-+ 0. For abstract namespace sockets set length to the length of the
-+ socket name (including the initial 0 byte), and pass the full
-+ socket path in path (including the initial 0 byte). The listening
-+ flag is used the same way as in sd_is_socket(). Returns a negative
-+ errno style error code on failure.
-+
-+ See sd_is_socket_unix(3) for more information.
-+*/
-+int netsnmp_sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length);
-+
-+/*
-+ Informs systemd about changed daemon state. This takes a number of
-+ newline separated environment-style variable assignments in a
-+ string. The following variables are known:
-+
-+ READY=1 Tells systemd that daemon startup is finished (only
-+ relevant for services of Type=notify). The passed
-+ argument is a boolean "1" or "0". Since there is
-+ little value in signaling non-readiness the only
-+ value daemons should send is "READY=1".
-+
-+ STATUS=... Passes a single-line status string back to systemd
-+ that describes the daemon state. This is free-from
-+ and can be used for various purposes: general state
-+ feedback, fsck-like programs could pass completion
-+ percentages and failing programs could pass a human
-+ readable error message. Example: "STATUS=Completed
-+ 66% of file system check..."
-+
-+ ERRNO=... If a daemon fails, the errno-style error code,
-+ formatted as string. Example: "ERRNO=2" for ENOENT.
-+
-+ BUSERROR=... If a daemon fails, the D-Bus error-style error
-+ code. Example: "BUSERROR=org.freedesktop.DBus.Error.TimedOut"
-+
-+ MAINPID=... The main pid of a daemon, in case systemd did not
-+ fork off the process itself. Example: "MAINPID=4711"
-+
-+ Daemons can choose to send additional variables. However, it is
-+ recommended to prefix variable names not listed above with X_.
-+
-+ Returns a negative errno-style error code on failure. Returns > 0
-+ if systemd could be notified, 0 if it couldn't possibly because
-+ systemd is not running.
-+
-+ Example: When a daemon finished starting up, it could issue this
-+ call to notify systemd about it:
-+
-+ sd_notify(0, "READY=1");
-+
-+ See sd_notifyf() for more complete examples.
-+
-+ See sd_notify(3) for more information.
-+*/
-+int netsnmp_sd_notify(int unset_environment, const char *state);
-+
-+/*
-+ Similar to sd_notify() but takes a format string.
-+
-+ Example 1: A daemon could send the following after initialization:
-+
-+ sd_notifyf(0, "READY=1\n"
-+ "STATUS=Processing requests...\n"
-+ "MAINPID=%lu",
-+ (unsigned long) getpid());
-+
-+ Example 2: A daemon could send the following shortly before
-+ exiting, on failure:
-+
-+ sd_notifyf(0, "STATUS=Failed to start up: %s\n"
-+ "ERRNO=%i",
-+ strerror(errno),
-+ errno);
-+
-+ See sd_notifyf(3) for more information.
-+*/
-+int netsnmp_sd_notifyf(int unset_environment, const char *format, ...) _sd_printf_attr_(2,3);
-+
-+/*
-+ Returns > 0 if the system was booted with systemd. Returns < 0 on
-+ error. Returns 0 if the system was not booted with systemd. Note
-+ that all of the functions above handle non-systemd boots just
-+ fine. You should NOT protect them with a call to this function. Also
-+ note that this function checks whether the system, not the user
-+ session is controlled by systemd. However the functions above work
-+ for both user and system services.
-+
-+ See sd_booted(3) for more information.
-+*/
-+int netsnmp_sd_booted(void);
-+
-+/**
-+ * Find an socket with given parameters. See man sd_is_socket_inet for
-+ * description of the arguments.
-+ *
-+ * Returns the file descriptor if it is found, 0 otherwise.
-+ */
-+int netsnmp_sd_find_inet_socket(int family, int type, int listening, int port);
-+
-+/**
-+ * Find an unix socket with given parameters. See man sd_is_socket_unix for
-+ * description of the arguments.
-+ *
-+ * Returns the file descriptor if it is found, 0 otherwise.
-+ */
-+int
-+netsnmp_sd_find_unix_socket(int type, int listening, const char *path);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif /* SNMPD_SD_DAEMON_H */
-diff --git a/snmplib/sd-daemon.c b/snmplib/sd-daemon.c
-new file mode 100644
-index 0000000..42dba29
---- /dev/null
-+++ b/snmplib/sd-daemon.c
-@@ -0,0 +1,532 @@
-+/*
-+ * Systemd integration parts.
-+ *
-+ * Most of this file is directly copied from systemd sources.
-+ * Changes:
-+ * - all functions were renamed to have netsnmp_ prefix
-+ * - includes were changed to match Net-SNMP style.
-+ * - removed gcc export macros
-+ * - removed POSIX message queues
-+ */
-+
-+#include <net-snmp/net-snmp-config.h>
-+#include <net-snmp/net-snmp-features.h>
-+#include <net-snmp/types.h>
-+#include <net-snmp/library/snmp_debug.h>
-+
-+#ifndef NETSNMP_NO_SYSTEMD
-+
-+/***
-+ Copyright 2010 Lennart Poettering
-+
-+ Permission is hereby granted, free of charge, to any person
-+ obtaining a copy of this software and associated documentation files
-+ (the "Software"), to deal in the Software without restriction,
-+ including without limitation the rights to use, copy, modify, merge,
-+ publish, distribute, sublicense, and/or sell copies of the Software,
-+ and to permit persons to whom the Software is furnished to do so,
-+ subject to the following conditions:
-+
-+ The above copyright notice and this permission notice shall be
-+ included in all copies or substantial portions of the Software.
-+
-+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-+ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-+ SOFTWARE.
-+***/
-+
-+#ifndef _GNU_SOURCE
-+#define _GNU_SOURCE
-+#endif
-+
-+#include <sys/types.h>
-+#include <sys/stat.h>
-+#include <sys/socket.h>
-+#include <sys/un.h>
-+#include <sys/fcntl.h>
-+#include <netinet/in.h>
-+#include <stdlib.h>
-+#include <errno.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include <stdarg.h>
-+#include <stdio.h>
-+#include <stddef.h>
-+#include <limits.h>
-+
-+#include <net-snmp/library/sd-daemon.h>
-+
-+int netsnmp_sd_listen_fds(int unset_environment) {
-+
-+ int r, fd;
-+ const char *e;
-+ char *p = NULL;
-+ unsigned long l;
-+
-+ if (!(e = getenv("LISTEN_PID"))) {
-+ r = 0;
-+ goto finish;
-+ }
-+
-+ errno = 0;
-+ l = strtoul(e, &p, 10);
-+
-+ if (errno != 0) {
-+ r = -errno;
-+ goto finish;
-+ }
-+
-+ if (!p || *p || l <= 0) {
-+ r = -EINVAL;
-+ goto finish;
-+ }
-+
-+ /* Is this for us? */
-+ if (getpid() != (pid_t) l) {
-+ r = 0;
-+ goto finish;
-+ }
-+
-+ if (!(e = getenv("LISTEN_FDS"))) {
-+ r = 0;
-+ goto finish;
-+ }
-+
-+ errno = 0;
-+ l = strtoul(e, &p, 10);
-+
-+ if (errno != 0) {
-+ r = -errno;
-+ goto finish;
-+ }
-+
-+ if (!p || *p) {
-+ r = -EINVAL;
-+ goto finish;
-+ }
-+
-+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + (int) l; fd ++) {
-+ int flags;
-+
-+ if ((flags = fcntl(fd, F_GETFD)) < 0) {
-+ r = -errno;
-+ goto finish;
-+ }
-+
-+ if (flags & FD_CLOEXEC)
-+ continue;
-+
-+ if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) < 0) {
-+ r = -errno;
-+ goto finish;
-+ }
-+ }
-+
-+ r = (int) l;
-+
-+finish:
-+ if (unset_environment) {
-+ unsetenv("LISTEN_PID");
-+ unsetenv("LISTEN_FDS");
-+ }
-+
-+ return r;
-+}
-+
-+int netsnmp_sd_is_fifo(int fd, const char *path) {
-+ struct stat st_fd;
-+
-+ if (fd < 0)
-+ return -EINVAL;
-+
-+ memset(&st_fd, 0, sizeof(st_fd));
-+ if (fstat(fd, &st_fd) < 0)
-+ return -errno;
-+
-+ if (!S_ISFIFO(st_fd.st_mode))
-+ return 0;
-+
-+ if (path) {
-+ struct stat st_path;
-+
-+ memset(&st_path, 0, sizeof(st_path));
-+ if (stat(path, &st_path) < 0) {
-+
-+ if (errno == ENOENT || errno == ENOTDIR)
-+ return 0;
-+
-+ return -errno;
-+ }
-+
-+ return
-+ st_path.st_dev == st_fd.st_dev &&
-+ st_path.st_ino == st_fd.st_ino;
-+ }
-+
-+ return 1;
-+}
-+
-+int netsnmp_sd_is_special(int fd, const char *path) {
-+ struct stat st_fd;
-+
-+ if (fd < 0)
-+ return -EINVAL;
-+
-+ if (fstat(fd, &st_fd) < 0)
-+ return -errno;
-+
-+ if (!S_ISREG(st_fd.st_mode) && !S_ISCHR(st_fd.st_mode))
-+ return 0;
-+
-+ if (path) {
-+ struct stat st_path;
-+
-+ if (stat(path, &st_path) < 0) {
-+
-+ if (errno == ENOENT || errno == ENOTDIR)
-+ return 0;
-+
-+ return -errno;
-+ }
-+
-+ if (S_ISREG(st_fd.st_mode) && S_ISREG(st_path.st_mode))
-+ return
-+ st_path.st_dev == st_fd.st_dev &&
-+ st_path.st_ino == st_fd.st_ino;
-+ else if (S_ISCHR(st_fd.st_mode) && S_ISCHR(st_path.st_mode))
-+ return st_path.st_rdev == st_fd.st_rdev;
-+ else
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+static int sd_is_socket_internal(int fd, int type, int listening) {
-+ struct stat st_fd;
-+
-+ if (fd < 0 || type < 0)
-+ return -EINVAL;
-+
-+ if (fstat(fd, &st_fd) < 0)
-+ return -errno;
-+
-+ if (!S_ISSOCK(st_fd.st_mode))
-+ return 0;
-+
-+ if (type != 0) {
-+ int other_type = 0;
-+ socklen_t l = sizeof(other_type);
-+
-+ if (getsockopt(fd, SOL_SOCKET, SO_TYPE, &other_type, &l) < 0)
-+ return -errno;
-+
-+ if (l != sizeof(other_type))
-+ return -EINVAL;
-+
-+ if (other_type != type)
-+ return 0;
-+ }
-+
-+ if (listening >= 0) {
-+ int accepting = 0;
-+ socklen_t l = sizeof(accepting);
-+
-+ if (getsockopt(fd, SOL_SOCKET, SO_ACCEPTCONN, &accepting, &l) < 0)
-+ return -errno;
-+
-+ if (l != sizeof(accepting))
-+ return -EINVAL;
-+
-+ if (!accepting != !listening)
-+ return 0;
-+ }
-+
-+ return 1;
-+}
-+
-+union sockaddr_union {
-+ struct sockaddr sa;
-+ struct sockaddr_in in4;
-+ struct sockaddr_in6 in6;
-+ struct sockaddr_un un;
-+ struct sockaddr_storage storage;
-+};
-+
-+int netsnmp_sd_is_socket(int fd, int family, int type, int listening) {
-+ int r;
-+
-+ if (family < 0)
-+ return -EINVAL;
-+
-+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
-+ return r;
-+
-+ if (family > 0) {
-+ union sockaddr_union sockaddr;
-+ socklen_t l;
-+
-+ memset(&sockaddr, 0, sizeof(sockaddr));
-+ l = sizeof(sockaddr);
-+
-+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
-+ return -errno;
-+
-+ if (l < sizeof(sa_family_t))
-+ return -EINVAL;
-+
-+ return sockaddr.sa.sa_family == family;
-+ }
-+
-+ return 1;
-+}
-+
-+int netsnmp_sd_is_socket_inet(int fd, int family, int type, int listening, uint16_t port) {
-+ union sockaddr_union sockaddr;
-+ socklen_t l;
-+ int r;
-+
-+ if (family != 0 && family != AF_INET && family != AF_INET6)
-+ return -EINVAL;
-+
-+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
-+ return r;
-+
-+ memset(&sockaddr, 0, sizeof(sockaddr));
-+ l = sizeof(sockaddr);
-+
-+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
-+ return -errno;
-+
-+ if (l < sizeof(sa_family_t))
-+ return -EINVAL;
-+
-+ if (sockaddr.sa.sa_family != AF_INET &&
-+ sockaddr.sa.sa_family != AF_INET6)
-+ return 0;
-+
-+ if (family > 0)
-+ if (sockaddr.sa.sa_family != family)
-+ return 0;
-+
-+ if (port > 0) {
-+ if (sockaddr.sa.sa_family == AF_INET) {
-+ if (l < sizeof(struct sockaddr_in))
-+ return -EINVAL;
-+
-+ return htons(port) == sockaddr.in4.sin_port;
-+ } else {
-+ if (l < sizeof(struct sockaddr_in6))
-+ return -EINVAL;
-+
-+ return htons(port) == sockaddr.in6.sin6_port;
-+ }
-+ }
-+
-+ return 1;
-+}
-+
-+int netsnmp_sd_is_socket_unix(int fd, int type, int listening, const char *path, size_t length) {
-+ union sockaddr_union sockaddr;
-+ socklen_t l;
-+ int r;
-+
-+ if ((r = sd_is_socket_internal(fd, type, listening)) <= 0)
-+ return r;
-+
-+ memset(&sockaddr, 0, sizeof(sockaddr));
-+ l = sizeof(sockaddr);
-+
-+ if (getsockname(fd, &sockaddr.sa, &l) < 0)
-+ return -errno;
-+
-+ if (l < sizeof(sa_family_t))
-+ return -EINVAL;
-+
-+ if (sockaddr.sa.sa_family != AF_UNIX)
-+ return 0;
-+
-+ if (path) {
-+ if (length <= 0)
-+ length = strlen(path);
-+
-+ if (length <= 0)
-+ /* Unnamed socket */
-+ return l == offsetof(struct sockaddr_un, sun_path);
-+
-+ if (path[0])
-+ /* Normal path socket */
-+ return
-+ (l >= offsetof(struct sockaddr_un, sun_path) + length + 1) &&
-+ memcmp(path, sockaddr.un.sun_path, length+1) == 0;
-+ else
-+ /* Abstract namespace socket */
-+ return
-+ (l == offsetof(struct sockaddr_un, sun_path) + length) &&
-+ memcmp(path, sockaddr.un.sun_path, length) == 0;
-+ }
-+
-+ return 1;
-+}
-+
-+int netsnmp_sd_notify(int unset_environment, const char *state) {
-+ int fd = -1, r;
-+ struct msghdr msghdr;
-+ struct iovec iovec;
-+ union sockaddr_union sockaddr;
-+ const char *e;
-+
-+ if (!state) {
-+ r = -EINVAL;
-+ goto finish;
-+ }
-+
-+ if (!(e = getenv("NOTIFY_SOCKET")))
-+ return 0;
-+
-+ /* Must be an abstract socket, or an absolute path */
-+ if ((e[0] != '@' && e[0] != '/') || e[1] == 0) {
-+ r = -EINVAL;
-+ goto finish;
-+ }
-+
-+ if ((fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0)) < 0) {
-+ r = -errno;
-+ goto finish;
-+ }
-+
-+ memset(&sockaddr, 0, sizeof(sockaddr));
-+ sockaddr.sa.sa_family = AF_UNIX;
-+ strncpy(sockaddr.un.sun_path, e, sizeof(sockaddr.un.sun_path));
-+
-+ if (sockaddr.un.sun_path[0] == '@')
-+ sockaddr.un.sun_path[0] = 0;
-+
-+ memset(&iovec, 0, sizeof(iovec));
-+ iovec.iov_base = (char *)state;
-+ iovec.iov_len = strlen(state);
-+
-+ memset(&msghdr, 0, sizeof(msghdr));
-+ msghdr.msg_name = &sockaddr;
-+ msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) + strlen(e);
-+
-+ if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
-+ msghdr.msg_namelen = sizeof(struct sockaddr_un);
-+
-+ msghdr.msg_iov = &iovec;
-+ msghdr.msg_iovlen = 1;
-+
-+ if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0) {
-+ r = -errno;
-+ goto finish;
-+ }
-+
-+ r = 1;
-+
-+finish:
-+ if (unset_environment)
-+ unsetenv("NOTIFY_SOCKET");
-+
-+ if (fd >= 0)
-+ close(fd);
-+
-+ return r;
-+}
-+
-+int netsnmp_sd_notifyf(int unset_environment, const char *format, ...) {
-+ va_list ap;
-+ char *p = NULL;
-+ int r;
-+
-+ va_start(ap, format);
-+ r = vasprintf(&p, format, ap);
-+ va_end(ap);
-+
-+ if (r < 0 || !p)
-+ return -ENOMEM;
-+
-+ r = netsnmp_sd_notify(unset_environment, p);
-+ free(p);
-+
-+ return r;
-+}
-+
-+int netsnmp_sd_booted(void) {
-+ struct stat a, b;
-+
-+ /* We simply test whether the systemd cgroup hierarchy is
-+ * mounted */
-+
-+ if (lstat("/sys/fs/cgroup", &a) < 0)
-+ return 0;
-+
-+ if (lstat("/sys/fs/cgroup/systemd", &b) < 0)
-+ return 0;
-+
-+ return a.st_dev != b.st_dev;
-+}
-+
-+/* End of original sd-daemon.c from systemd sources */
-+
-+int
-+netsnmp_sd_find_inet_socket(int family, int type, int listening, int port)
-+{
-+ int count, fd;
-+
-+ count = netsnmp_sd_listen_fds(0);
-+ if (count <= 0) {
-+ DEBUGMSGTL(("systemd:find_inet_socket", "No LISTEN_FDS found.\n"));
-+ return 0;
-+ }
-+ DEBUGMSGTL(("systemd:find_inet_socket", "LISTEN_FDS reports %d sockets.\n",
-+ count));
-+
-+ for (fd = 3; fd < 3+count; fd++) {
-+ int rc = netsnmp_sd_is_socket_inet(fd, family, type, listening, port);
-+ if (rc < 0)
-+ DEBUGMSGTL(("systemd:find_inet_socket",
-+ "sd_is_socket_inet error: %d\n", rc));
-+ if (rc > 0) {
-+ DEBUGMSGTL(("systemd:find_inet_socket",
-+ "Found the socket in LISTEN_FDS\n"));
-+ return fd;
-+ }
-+ }
-+ DEBUGMSGTL(("systemd:find_inet_socket", "Socket not found in LISTEN_FDS\n"));
-+ return 0;
-+}
-+
-+int
-+netsnmp_sd_find_unix_socket(int type, int listening, const char *path)
-+{
-+ int count, fd;
-+
-+ count = netsnmp_sd_listen_fds(0);
-+ if (count <= 0) {
-+ DEBUGMSGTL(("systemd:find_unix_socket", "No LISTEN_FDS found.\n"));
-+ return 0;
-+ }
-+ DEBUGMSGTL(("systemd:find_unix_socket", "LISTEN_FDS reports %d sockets.\n",
-+ count));
-+
-+ for (fd = 3; fd < 3+count; fd++) {
-+ int rc = netsnmp_sd_is_socket_unix(fd, type, listening, path, 0);
-+ if (rc < 0)
-+ DEBUGMSGTL(("systemd:find_unix_socket",
-+ "netsnmp_sd_is_socket_unix error: %d\n", rc));
-+ if (rc > 0) {
-+ DEBUGMSGTL(("systemd:find_unix_socket",
-+ "Found the socket in LISTEN_FDS\n"));
-+ return fd;
-+ }
-+ }
-+ DEBUGMSGTL(("systemd:find_unix_socket", "Socket not found in LISTEN_FDS\n"));
-+ return 0;
-+}
-+
-+#endif /* ! NETSNMP_NO_SYSTEMD */
-diff --git a/snmplib/transports/snmpTCPDomain.c b/snmplib/transports/snmpTCPDomain.c
-index 7feb028..a41b926 100644
---- a/snmplib/transports/snmpTCPDomain.c
-+++ b/snmplib/transports/snmpTCPDomain.c
-@@ -43,6 +43,10 @@
- #include <net-snmp/library/snmpTCPBaseDomain.h>
- #include <net-snmp/library/tools.h>
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- /*
- * needs to be in sync with the definitions in snmplib/snmpUDPDomain.c
- * and perl/agent/agent.xs
-@@ -149,6 +153,7 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local)
- netsnmp_transport *t = NULL;
- netsnmp_udp_addr_pair *addr_pair = NULL;
- int rc = 0;
-+ int socket_initialized = 0;
-
- #ifdef NETSNMP_NO_LISTEN_SUPPORT
- if (local)
-@@ -178,7 +183,19 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local)
- t->domain_length =
- sizeof(netsnmp_snmpTCPDomain) / sizeof(netsnmp_snmpTCPDomain[0]);
-
-- t->sock = socket(PF_INET, SOCK_STREAM, 0);
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /*
-+ * Maybe the socket was already provided by systemd...
-+ */
-+ if (local) {
-+ t->sock = netsnmp_sd_find_inet_socket(PF_INET, SOCK_STREAM, 1,
-+ ntohs(addr->sin_port));
-+ if (t->sock)
-+ socket_initialized = 1;
-+ }
-+#endif
-+ if (!socket_initialized)
-+ t->sock = socket(PF_INET, SOCK_STREAM, 0);
- if (t->sock < 0) {
- netsnmp_transport_free(t);
- return NULL;
-@@ -215,11 +232,13 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local)
- setsockopt(t->sock, SOL_SOCKET, SO_REUSEADDR, (void *)&opt,
- sizeof(opt));
-
-- rc = bind(t->sock, (struct sockaddr *)addr, sizeof(struct sockaddr));
-- if (rc != 0) {
-- netsnmp_socketbase_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = bind(t->sock, (struct sockaddr *)addr, sizeof(struct sockaddr));
-+ if (rc != 0) {
-+ netsnmp_socketbase_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
-
- /*
-@@ -236,11 +255,13 @@ netsnmp_tcp_transport(struct sockaddr_in *addr, int local)
- * Now sit here and wait for connections to arrive.
- */
-
-- rc = listen(t->sock, NETSNMP_STREAM_QUEUE_LEN);
-- if (rc != 0) {
-- netsnmp_socketbase_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = listen(t->sock, NETSNMP_STREAM_QUEUE_LEN);
-+ if (rc != 0) {
-+ netsnmp_socketbase_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
-
- /*
-diff --git a/snmplib/transports/snmpTCPIPv6Domain.c b/snmplib/transports/snmpTCPIPv6Domain.c
-index d2e0a2d..22de6d4 100644
---- a/snmplib/transports/snmpTCPIPv6Domain.c
-+++ b/snmplib/transports/snmpTCPIPv6Domain.c
-@@ -49,6 +49,10 @@
- #include <net-snmp/library/snmpTCPBaseDomain.h>
- #include <net-snmp/library/tools.h>
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- #include "inet_ntop.h"
-
- oid netsnmp_TCPIPv6Domain[] = { TRANSPORT_DOMAIN_TCP_IPV6 };
-@@ -140,6 +144,8 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local)
- {
- netsnmp_transport *t = NULL;
- int rc = 0;
-+ char *str = NULL;
-+ int socket_initialized = 0;
-
- #ifdef NETSNMP_NO_LISTEN_SUPPORT
- if (local)
-@@ -174,7 +180,19 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local)
- t->domain = netsnmp_TCPIPv6Domain;
- t->domain_length = sizeof(netsnmp_TCPIPv6Domain) / sizeof(oid);
-
-- t->sock = socket(PF_INET6, SOCK_STREAM, 0);
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /*
-+ * Maybe the socket was already provided by systemd...
-+ */
-+ if (local) {
-+ t->sock = netsnmp_sd_find_inet_socket(PF_INET6, SOCK_STREAM, 1,
-+ ntohs(addr->sin6_port));
-+ if (t->sock)
-+ socket_initialized = 1;
-+ }
-+#endif
-+ if (!socket_initialized)
-+ t->sock = socket(PF_INET6, SOCK_STREAM, 0);
- if (t->sock < 0) {
- netsnmp_transport_free(t);
- return NULL;
-@@ -220,12 +238,14 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local)
-
- setsockopt(t->sock, SOL_SOCKET, SO_REUSEADDR, (void *)&opt, sizeof(opt));
-
-- rc = bind(t->sock, (struct sockaddr *) addr,
-- sizeof(struct sockaddr_in6));
-- if (rc != 0) {
-- netsnmp_socketbase_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = bind(t->sock, (struct sockaddr *) addr,
-+ sizeof(struct sockaddr_in6));
-+ if (rc != 0) {
-+ netsnmp_socketbase_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
-
- /*
-@@ -242,11 +262,13 @@ netsnmp_tcp6_transport(struct sockaddr_in6 *addr, int local)
- * Now sit here and wait for connections to arrive.
- */
-
-- rc = listen(t->sock, NETSNMP_STREAM_QUEUE_LEN);
-- if (rc != 0) {
-- netsnmp_socketbase_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = listen(t->sock, NETSNMP_STREAM_QUEUE_LEN);
-+ if (rc != 0) {
-+ netsnmp_socketbase_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
-
- /*
-diff --git a/snmplib/transports/snmpUDPIPv4BaseDomain.c b/snmplib/transports/snmpUDPIPv4BaseDomain.c
-index 8c0fb05..00e5bbc 100644
---- a/snmplib/transports/snmpUDPIPv4BaseDomain.c
-+++ b/snmplib/transports/snmpUDPIPv4BaseDomain.c
-@@ -40,6 +40,10 @@
-
- #include <net-snmp/library/snmpSocketBaseDomain.h>
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- #if defined(HAVE_IP_PKTINFO) || defined(HAVE_IP_RECVDSTADDR)
- int netsnmp_udpipv4_recvfrom(int s, void *buf, int len, struct sockaddr *from,
- socklen_t *fromlen, struct sockaddr *dstip,
-@@ -64,6 +68,7 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local)
- char *client_socket = NULL;
- netsnmp_indexed_addr_pair addr_pair;
- socklen_t local_addr_len;
-+ int socket_initialized = 0;
-
- #ifdef NETSNMP_NO_LISTEN_SUPPORT
- if (local)
-@@ -88,7 +93,19 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local)
- free(str);
- }
-
-- t->sock = socket(PF_INET, SOCK_DGRAM, 0);
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /*
-+ * Maybe the socket was already provided by systemd...
-+ */
-+ if (local) {
-+ t->sock = netsnmp_sd_find_inet_socket(PF_INET, SOCK_DGRAM, -1,
-+ ntohs(addr->sin_port));
-+ if (t->sock)
-+ socket_initialized = 1;
-+ }
-+#endif
-+ if (!socket_initialized)
-+ t->sock = socket(PF_INET, SOCK_DGRAM, 0);
- DEBUGMSGTL(("UDPBase", "openned socket %d as local=%d\n", t->sock, local));
- if (t->sock < 0) {
- netsnmp_transport_free(t);
-@@ -151,12 +168,14 @@ netsnmp_udpipv4base_transport(struct sockaddr_in *addr, int local)
- }
- }
- #endif /* !defined(WIN32) */
-- rc = bind(t->sock, (struct sockaddr *) addr,
-- sizeof(struct sockaddr));
-- if (rc != 0) {
-- netsnmp_socketbase_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = bind(t->sock, (struct sockaddr *) addr,
-+ sizeof(struct sockaddr));
-+ if (rc != 0) {
-+ netsnmp_socketbase_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
- t->data = NULL;
- t->data_length = 0;
-diff --git a/snmplib/transports/snmpUDPIPv6Domain.c b/snmplib/transports/snmpUDPIPv6Domain.c
-index 18de876..fd2ced4 100644
---- a/snmplib/transports/snmpUDPIPv6Domain.c
-+++ b/snmplib/transports/snmpUDPIPv6Domain.c
-@@ -67,6 +67,10 @@ static const struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;
- #include <net-snmp/library/snmpSocketBaseDomain.h>
- #include <net-snmp/library/tools.h>
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- #include "inet_ntop.h"
- #include "inet_pton.h"
-
-@@ -190,6 +194,8 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local)
- {
- netsnmp_transport *t = NULL;
- int rc = 0;
-+ char *str = NULL;
-+ int socket_initialized = 0;
-
- #ifdef NETSNMP_NO_LISTEN_SUPPORT
- if (local)
-@@ -217,7 +223,19 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local)
- t->domain_length =
- sizeof(netsnmp_UDPIPv6Domain) / sizeof(netsnmp_UDPIPv6Domain[0]);
-
-- t->sock = socket(PF_INET6, SOCK_DGRAM, 0);
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /*
-+ * Maybe the socket was already provided by systemd...
-+ */
-+ if (local) {
-+ t->sock = netsnmp_sd_find_inet_socket(PF_INET6, SOCK_DGRAM, -1,
-+ ntohs(addr->sin6_port));
-+ if (t->sock)
-+ socket_initialized = 1;
-+ }
-+#endif
-+ if (!socket_initialized)
-+ t->sock = socket(PF_INET6, SOCK_DGRAM, 0);
- if (t->sock < 0) {
- netsnmp_transport_free(t);
- return NULL;
-@@ -243,12 +261,14 @@ netsnmp_udp6_transport(struct sockaddr_in6 *addr, int local)
- }
- #endif
-
-- rc = bind(t->sock, (struct sockaddr *) addr,
-- sizeof(struct sockaddr_in6));
-- if (rc != 0) {
-- netsnmp_socketbase_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = bind(t->sock, (struct sockaddr *) addr,
-+ sizeof(struct sockaddr_in6));
-+ if (rc != 0) {
-+ netsnmp_socketbase_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
- t->local = (unsigned char*)malloc(18);
- if (t->local == NULL) {
-diff --git a/snmplib/transports/snmpUnixDomain.c b/snmplib/transports/snmpUnixDomain.c
-index 47dffc1..8f34c37 100644
---- a/snmplib/transports/snmpUnixDomain.c
-+++ b/snmplib/transports/snmpUnixDomain.c
-@@ -37,6 +37,10 @@
- #include <net-snmp/library/system.h> /* mkdirhier */
- #include <net-snmp/library/tools.h>
-
-+#ifndef NETSNMP_NO_SYSTEMD
-+#include <net-snmp/library/sd-daemon.h>
-+#endif
-+
- netsnmp_feature_child_of(transport_unix_socket_all, transport_all)
- netsnmp_feature_child_of(unix_socket_paths, transport_unix_socket_all)
-
-@@ -295,6 +299,8 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local)
- netsnmp_transport *t = NULL;
- sockaddr_un_pair *sup = NULL;
- int rc = 0;
-+ char *string = NULL;
-+ int socket_initialized = 0;
-
- #ifdef NETSNMP_NO_LISTEN_SUPPORT
- /* SPECIAL CIRCUMSTANCE: We still want AgentX to be able to operate,
-@@ -333,7 +339,18 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local)
- t->data_length = sizeof(sockaddr_un_pair);
- sup = (sockaddr_un_pair *) t->data;
-
-- t->sock = socket(PF_UNIX, SOCK_STREAM, 0);
-+#ifndef NETSNMP_NO_SYSTEMD
-+ /*
-+ * Maybe the socket was already provided by systemd...
-+ */
-+ if (local) {
-+ t->sock = netsnmp_sd_find_unix_socket(SOCK_STREAM, 1, addr->sun_path);
-+ if (t->sock)
-+ socket_initialized = 1;
-+ }
-+#endif
-+ if (!socket_initialized)
-+ t->sock = socket(PF_UNIX, SOCK_STREAM, 0);
- if (t->sock < 0) {
- netsnmp_transport_free(t);
- return NULL;
-@@ -357,25 +374,26 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local)
-
- t->flags |= NETSNMP_TRANSPORT_FLAG_LISTEN;
-
-- unlink(addr->sun_path);
-- rc = bind(t->sock, (struct sockaddr *) addr, SUN_LEN(addr));
--
-- if (rc != 0 && errno == ENOENT && create_path) {
-- rc = mkdirhier(addr->sun_path, create_mode, 1);
-+ if (!socket_initialized) {
-+ unlink(addr->sun_path);
-+ rc = bind(t->sock, (struct sockaddr *) addr, SUN_LEN(addr));
-+ if (rc != 0 && errno == ENOENT && create_path) {
-+ rc = mkdirhier(addr->sun_path, create_mode, 1);
-+ if (rc != 0) {
-+ netsnmp_unix_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
-+ rc = bind(t->sock, (struct sockaddr *) addr, SUN_LEN(addr));
-+ }
- if (rc != 0) {
-+ DEBUGMSGTL(("netsnmp_unix_transport",
-+ "couldn't bind \"%s\", errno %d (%s)\n",
-+ addr->sun_path, errno, strerror(errno)));
- netsnmp_unix_close(t);
- netsnmp_transport_free(t);
- return NULL;
- }
-- rc = bind(t->sock, (struct sockaddr *) addr, SUN_LEN(addr));
-- }
-- if (rc != 0) {
-- DEBUGMSGTL(("netsnmp_unix_transport",
-- "couldn't bind \"%s\", errno %d (%s)\n",
-- addr->sun_path, errno, strerror(errno)));
-- netsnmp_unix_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
- }
-
- /*
-@@ -391,14 +409,16 @@ netsnmp_unix_transport(struct sockaddr_un *addr, int local)
- * Now sit here and listen for connections to arrive.
- */
-
-- rc = listen(t->sock, NETSNMP_STREAM_QUEUE_LEN);
-- if (rc != 0) {
-- DEBUGMSGTL(("netsnmp_unix_transport",
-- "couldn't listen to \"%s\", errno %d (%s)\n",
-- addr->sun_path, errno, strerror(errno)));
-- netsnmp_unix_close(t);
-- netsnmp_transport_free(t);
-- return NULL;
-+ if (!socket_initialized) {
-+ rc = listen(t->sock, NETSNMP_STREAM_QUEUE_LEN);
-+ if (rc != 0) {
-+ DEBUGMSGTL(("netsnmp_unix_transport",
-+ "couldn't listen to \"%s\", errno %d (%s)\n",
-+ addr->sun_path, errno, strerror(errno)));
-+ netsnmp_unix_close(t);
-+ netsnmp_transport_free(t);
-+ return NULL;
-+ }
- }
-
- } else {
-diff --git a/win32/libsnmp/Makefile.in b/win32/libsnmp/Makefile.in
-index 98d83c8..b228d20 100644
---- a/win32/libsnmp/Makefile.in
-+++ b/win32/libsnmp/Makefile.in
-@@ -42,6 +42,7 @@ LIB32_OBJS= \
- "$(INTDIR)\read_config.obj" \
- "$(INTDIR)\readdir.obj" \
- "$(INTDIR)\scapi.obj" \
-+ "$(INTDIR)\sd-daemon.obj" \
- "$(INTDIR)\snmp-tc.obj" \
- "$(INTDIR)\snmp.obj" \
- "$(INTDIR)\snmpCallbackDomain.obj" \
-@@ -138,6 +139,11 @@ SOURCE=..\..\snmplib\asn1.c
- "$(INTDIR)\asn1.obj" : $(SOURCE) "$(INTDIR)"
- $(CPP) $(CPP_PROJ) $(SOURCE)
-
-+SOURCE=..\..\snmplib\sd-daemon.c
-+
-+"$(INTDIR)\sd-daemon.obj" : $(SOURCE) "$(INTDIR)"
-+ $(CPP) $(CPP_PROJ) $(SOURCE)
-+
-
- SOURCE=..\..\snmplib\callback.c
-
-diff --git a/win32/net-snmp/net-snmp-config.h b/win32/net-snmp/net-snmp-config.h
-index 1608563..7aec547 100644
---- a/win32/net-snmp/net-snmp-config.h
-+++ b/win32/net-snmp/net-snmp-config.h
-@@ -1717,6 +1717,8 @@ enum {
- #define DMALLOC_FUNC_CHECK
- #endif
-
-++#define NETSNMP_NO_SYSTEMD
-++
- /* #undef NETSNMP_ENABLE_LOCAL_SMUX */
-
- /* define if agentx transport is to use domain sockets only */
-diff --git a/win32/net-snmp/net-snmp-config.h.in b/win32/net-snmp/net-snmp-config.h.in
-index 9693730..96ec3d9 100644
---- a/win32/net-snmp/net-snmp-config.h.in
-+++ b/win32/net-snmp/net-snmp-config.h.in
-@@ -1717,6 +1717,8 @@ enum {
- #define DMALLOC_FUNC_CHECK
- #endif
-
-+#define NETSNMP_NO_SYSTEMD
-+
- /* #undef NETSNMP_ENABLE_LOCAL_SMUX */
-
- /* define if agentx transport is to use domain sockets only */
---
-1.8.4.2
-