From bf6b390274048f73207324dbe2f1a0fefa43f1ee Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Wed, 18 Jun 2025 08:49:29 +0200 Subject: [PATCH] nss: Move logging into a separate file and turn it temporarily on MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Ján Tomko --- build-aux/syntax-check.mk | 2 +- tools/nss/libvirt_nss.h | 30 +---------------- tools/nss/libvirt_nss_log.c | 65 +++++++++++++++++++++++++++++++++++++ tools/nss/libvirt_nss_log.h | 25 ++++++++++++++ tools/nss/meson.build | 1 + 5 files changed, 93 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 27eabe6565..4ba059b56b 100644 --- a/build-aux/syntax-check.mk +++ b/build-aux/syntax-check.mk @@ -1430,7 +1430,7 @@ exclude_file_name_regexp--sc_prohibit_realpath = \ ^(build-aux/syntax-check\.mk|src/cpu_map/sync_qemu_features_i386\.py|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 #include - -#if 0 -# include -# include -# include -# define NULLSTR(s) ((s) ? (s) : "") -# 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..672a170542 --- /dev/null +++ b/tools/nss/libvirt_nss_log.c @@ -0,0 +1,65 @@ +/* + * libvirt_nss_log: Logging for Name Service Switch plugin + * + * Copyright (C) 2025 Red Hat, Inc. + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include + +#undef _GNU_SOURCE + +#include +#include +#include +#include + +#include "libvirt_nss_log.h" +#include "libvirt_nss.h" + +#define NULLSTR(s) ((s) ? (s) : "") + +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..d99d88e711 --- /dev/null +++ b/tools/nss/libvirt_nss_log.h @@ -0,0 +1,25 @@ +/* + * libvirt_nss_log: Logging for Name Service Switch plugin + * + * Copyright (C) 2025 Red Hat, Inc. + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#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.47.2