^(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$$
#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
--- /dev/null
+/*
+ * libvirt_nss_log: Logging for Name Service Switch plugin
+ *
+ * Copyright (C) 2025 Red Hat, Inc.
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include <config.h>
+
+#undef _GNU_SOURCE
+
+#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");
+}
--- /dev/null
+/*
+ * 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)));
nss_sources = [
'libvirt_nss.c',
'libvirt_nss_leases.c',
+ 'libvirt_nss_log.c',
]
nss_guest_sources = [