From: Michal Privoznik <mprivozn(a)redhat.com>
Currently, when somebody wants to debug the NSS plugin, they have
to change a line in libvirt_nss.h (to enable debug printings) and
recompile the module. This may work for us, developers, but we
can not expect this from users.
For now, this turns debug printings unconditionally on. Making it
conditional on an envvar is handled in the next commit.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
build-aux/syntax-check.mk | 2 +-
tools/nss/libvirt_nss.h | 30 +--------------
tools/nss/libvirt_nss_log.c | 76 +++++++++++++++++++++++++++++++++++++
tools/nss/libvirt_nss_log.h | 38 +++++++++++++++++++
tools/nss/meson.build | 1 +
5 files changed, 117 insertions(+), 30 deletions(-)
create mode 100644 tools/nss/libvirt_nss_log.c
create mode 100644 tools/nss/libvirt_nss_log.h
diff --git a/build-aux/syntax-check.mk b/build-aux/syntax-check.mk
index 1303a0ce7e..541b2c5016 100644
--- a/build-aux/syntax-check.mk
+++ b/build-aux/syntax-check.mk
@@ -1421,7 +1421,7 @@ exclude_file_name_regexp--sc_prohibit_canonicalize_file_name = \
^(build-aux/syntax-check\.mk|tests/virfilemock\.c)$$
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
-
^(docs/advanced-tests\.rst|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c|tools/nss/libvirt_nss(_leases|_macs)?\.[ch])$$
+
^(docs/advanced-tests\.rst|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c|tools/nss/libvirt_nss(_leases|_log|_macs)?\.[ch])$$
exclude_file_name_regexp--sc_prohibit_readlink = \
^src/(util/virutil|lxc/lxc_container)\.c$$
diff --git a/tools/nss/libvirt_nss.h b/tools/nss/libvirt_nss.h
index 84db044409..e09fce9715 100644
--- a/tools/nss/libvirt_nss.h
+++ b/tools/nss/libvirt_nss.h
@@ -31,35 +31,7 @@
#include <netdb.h>
#include <stdlib.h>
-
-#if 0
-# include <errno.h>
-# include <stdio.h>
-# include <string.h>
-# define NULLSTR(s) ((s) ? (s) : "<null>")
-# define ERROR(...) \
-do { \
- int saved_errno = errno; \
- const size_t ebuf_size = 512; \
- g_autofree char *ebuf = calloc(ebuf_size, sizeof(*ebuf)); \
- if (ebuf) \
- strerror_r(saved_errno, ebuf, ebuf_size); \
- fprintf(stderr, "ERROR %s:%d : ", __FUNCTION__, __LINE__); \
- fprintf(stderr, __VA_ARGS__); \
- fprintf(stderr, " : %s\n", NULLSTR(ebuf)); \
- fprintf(stderr, "\n"); \
-} while (0)
-
-# define DEBUG(...) \
-do { \
- fprintf(stderr, "DEBUG %s:%d : ", __FUNCTION__, __LINE__); \
- fprintf(stderr, __VA_ARGS__); \
- fprintf(stderr, "\n"); \
-} while (0)
-#else
-# define ERROR(...) do { } while (0)
-# define DEBUG(...) do { } while (0)
-#endif
+#include "libvirt_nss_log.h"
#if !defined(LIBVIRT_NSS_GUEST)
# define NSS_NAME(s) _nss_libvirt_##s##_r
diff --git a/tools/nss/libvirt_nss_log.c b/tools/nss/libvirt_nss_log.c
new file mode 100644
index 0000000000..0863897c07
--- /dev/null
+++ b/tools/nss/libvirt_nss_log.c
@@ -0,0 +1,76 @@
+/*
+ * libvirt_nss_log: Logging for Name Service Switch plugin
+ *
+ * Copyright (C) 2025 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "libvirt_nss_log.h"
+#include "libvirt_nss.h"
+
+#define NULLSTR(s) ((s) ? (s) : "<null>")
+
+static const char * __attribute__((returns_nonnull))
+nssLogPriorityToString(nssLogPriority prio)
+{
+ switch (prio) {
+ case NSS_DEBUG:
+ return "DEBUG";
+ case NSS_ERROR:
+ return "ERROR";
+ }
+
+ return "";
+}
+
+void
+nssLog(nssLogPriority prio,
+ const char *func,
+ int linenr,
+ const char *fmt, ...)
+{
+ int saved_errno = errno;
+ const size_t ebuf_size = 512;
+ g_autofree char *ebuf = NULL;
+ va_list ap;
+
+ fprintf(stderr, "%s %s:%d : ", nssLogPriorityToString(prio), func,
linenr);
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+
+ switch (prio) {
+ case NSS_DEBUG:
+ break;
+
+ case NSS_ERROR:
+ ebuf = calloc(ebuf_size, sizeof(*ebuf));
+ if (ebuf)
+ strerror_r(saved_errno, ebuf, ebuf_size);
+ fprintf(stderr, " : %s", NULLSTR(ebuf));
+ break;
+ }
+
+ fprintf(stderr, "\n");
+}
diff --git a/tools/nss/libvirt_nss_log.h b/tools/nss/libvirt_nss_log.h
new file mode 100644
index 0000000000..bac64d4bc7
--- /dev/null
+++ b/tools/nss/libvirt_nss_log.h
@@ -0,0 +1,38 @@
+/*
+ * libvirt_nss_log: Logging for Name Service Switch plugin
+ *
+ * Copyright (C) 2025 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <
http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+typedef enum {
+ NSS_DEBUG,
+ NSS_ERROR,
+} nssLogPriority;
+
+#define DEBUG(...) \
+ nssLog(NSS_DEBUG, __FUNCTION__, __LINE__, __VA_ARGS__)
+
+#define ERROR(...) \
+ nssLog(NSS_ERROR, __FUNCTION__, __LINE__, __VA_ARGS__)
+
+void
+nssLog(nssLogPriority prio,
+ const char *func,
+ int linenr,
+ const char *fmt, ...) __attribute__ ((format(printf, 4, 5)));
diff --git a/tools/nss/meson.build b/tools/nss/meson.build
index 38bba2d616..5893952adc 100644
--- a/tools/nss/meson.build
+++ b/tools/nss/meson.build
@@ -13,6 +13,7 @@ endif
nss_sources = [
'libvirt_nss.c',
'libvirt_nss_leases.c',
+ 'libvirt_nss_log.c',
]
nss_guest_sources = [
--
2.49.0