teknoraver / rpms / systemd

Forked from rpms/systemd 5 months ago
Clone

Blame 0002-sysusers-emit-audit-events-for-user-and-group-creati.patch

Zbigniew Jędrzejewski-Szmek d0973d
From 398049208b4aae5f2a9f0d4914dee6ab6e101118 Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek d0973d
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek d0973d
Date: Fri, 10 Jan 2025 15:35:13 +0100
Zbigniew Jędrzejewski-Szmek d0973d
Subject: [PATCH 2/2] sysusers: emit audit events for user and group creation
Zbigniew Jędrzejewski-Szmek d0973d
Zbigniew Jędrzejewski-Szmek d0973d
Background: Fedora/RHEL are switching to sysusers.d metadata for creation of
Zbigniew Jędrzejewski-Szmek d0973d
users and groups for system users defined by packages
Zbigniew Jędrzejewski-Szmek d0973d
(https://fedoraproject.org/wiki/Changes/RPMSuportForSystemdSysusers).
Zbigniew Jędrzejewski-Szmek d0973d
Packages carry sysusers files. During package installation, rpm calls an
Zbigniew Jędrzejewski-Szmek d0973d
program to execute on this config. This program may either be
Zbigniew Jędrzejewski-Szmek d0973d
/usr/lib/rpm/sysusers.sh which calls useradd/groupadd, or
Zbigniew Jędrzejewski-Szmek d0973d
/usr/bin/systemd-sysusers. To match the functionality provided by
Zbigniew Jędrzejewski-Szmek d0973d
useradd/groupadd from the shadow-utils project, systemd-sysusers must emit
Zbigniew Jędrzejewski-Szmek d0973d
audit events so that it provides a drop-in replacement.
Zbigniew Jędrzejewski-Szmek d0973d
Zbigniew Jędrzejewski-Szmek d0973d
systemd-sysuers will emit audit events AUDIT_ADD_USER/AUDIT_ADD_GROUP when
Zbigniew Jędrzejewski-Szmek d0973d
adding users and groups. The operation "names" are copied from shadow-utils in
Zbigniew Jędrzejewski-Szmek d0973d
Fedora (which has a patch to change them from the upstream version), so the
Zbigniew Jędrzejewski-Szmek d0973d
format of the events that is generated on success should be identical.
Zbigniew Jędrzejewski-Szmek d0973d
Zbigniew Jędrzejewski-Szmek d0973d
The helper code is shared between sysusers and utmp-wtmp. I changed the
Zbigniew Jędrzejewski-Szmek d0973d
audit_fd variable to be unconditional. This way we can avoid ugly iffdefery
Zbigniew Jędrzejewski-Szmek d0973d
every time the variable would be used. The cost is that 4 bytes of unused
Zbigniew Jędrzejewski-Szmek d0973d
storage might be present. This is negligible, and the compiler might even be
Zbigniew Jędrzejewski-Szmek d0973d
able to optimize that away if it inlines things.
Zbigniew Jędrzejewski-Szmek d0973d
---
Zbigniew Jędrzejewski-Szmek d0973d
 src/basic/audit-util.h        | 33 +++++++++++++++++++++
Zbigniew Jędrzejewski-Szmek d0973d
 src/sysusers/meson.build      |  2 ++
Zbigniew Jędrzejewski-Szmek d0973d
 src/sysusers/sysusers.c       | 56 +++++++++++++++++++++++++++++++++++
Zbigniew Jędrzejewski-Szmek d0973d
 src/update-utmp/update-utmp.c | 23 ++------------
Zbigniew Jędrzejewski-Szmek d0973d
 4 files changed, 94 insertions(+), 20 deletions(-)
Zbigniew Jędrzejewski-Szmek d0973d
Zbigniew Jędrzejewski-Szmek d0973d
diff --git a/src/basic/audit-util.h b/src/basic/audit-util.h
Zbigniew Jędrzejewski-Szmek d0973d
index 9a74e4f102..d8ecf14f69 100644
Zbigniew Jędrzejewski-Szmek d0973d
--- a/src/basic/audit-util.h
Zbigniew Jędrzejewski-Szmek d0973d
+++ b/src/basic/audit-util.h
Zbigniew Jędrzejewski-Szmek d0973d
@@ -1,10 +1,16 @@
Zbigniew Jędrzejewski-Szmek d0973d
 /* SPDX-License-Identifier: LGPL-2.1-or-later */
Zbigniew Jędrzejewski-Szmek d0973d
 #pragma once
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
+#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
+#  include <libaudit.h>
Zbigniew Jędrzejewski-Szmek d0973d
+#endif
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
 #include <stdbool.h>
Zbigniew Jędrzejewski-Szmek d0973d
 #include <stdint.h>
Zbigniew Jędrzejewski-Szmek d0973d
 #include <sys/types.h>
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
+#include "errno-util.h"
Zbigniew Jędrzejewski-Szmek d0973d
+#include "log.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "pidref.h"
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
 #define AUDIT_SESSION_INVALID UINT32_MAX
Zbigniew Jędrzejewski-Szmek d0973d
@@ -17,3 +23,30 @@ bool use_audit(void);
Zbigniew Jędrzejewski-Szmek d0973d
 static inline bool audit_session_is_valid(uint32_t id) {
Zbigniew Jędrzejewski-Szmek d0973d
         return id > 0 && id != AUDIT_SESSION_INVALID;
Zbigniew Jędrzejewski-Szmek d0973d
 }
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+/* The wrappers for audit_open() and audit_close() are inline functions so that we don't get a spurious
Zbigniew Jędrzejewski-Szmek d0973d
+ * linkage to libaudit in libbasic, but we also don't need to create a separate source file for two very
Zbigniew Jędrzejewski-Szmek d0973d
+ * short functions. */
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+static inline int close_audit_fd(int fd) {
Zbigniew Jędrzejewski-Szmek d0973d
+#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
+        if (fd >= 0)
Zbigniew Jędrzejewski-Szmek d0973d
+                audit_close(fd);
Zbigniew Jędrzejewski-Szmek d0973d
+#else
Zbigniew Jędrzejewski-Szmek d0973d
+        assert(fd < 0);
Zbigniew Jędrzejewski-Szmek d0973d
+#endif
Zbigniew Jędrzejewski-Szmek d0973d
+        return -EBADF;
Zbigniew Jędrzejewski-Szmek d0973d
+}
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+static inline int open_audit_fd_or_warn(void) {
Zbigniew Jędrzejewski-Szmek d0973d
+        int fd = -EBADF;
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
+        /* If the kernel lacks netlink or audit support, don't worry about it. */
Zbigniew Jędrzejewski-Szmek d0973d
+        fd = audit_open();
Zbigniew Jędrzejewski-Szmek d0973d
+        if (fd < 0)
Zbigniew Jędrzejewski-Szmek d0973d
+                return log_full_errno(ERRNO_IS_NOT_SUPPORTED(errno) ? LOG_DEBUG : LOG_WARNING,
Zbigniew Jędrzejewski-Szmek d0973d
+                                      errno, "Failed to connect to audit log, ignoring: %m");
Zbigniew Jędrzejewski-Szmek d0973d
+#endif
Zbigniew Jędrzejewski-Szmek d0973d
+        return fd;
Zbigniew Jędrzejewski-Szmek d0973d
+}
Zbigniew Jędrzejewski-Szmek d0973d
diff --git a/src/sysusers/meson.build b/src/sysusers/meson.build
Zbigniew Jędrzejewski-Szmek d0973d
index 123ff41d3f..c968f55110 100644
Zbigniew Jędrzejewski-Szmek d0973d
--- a/src/sysusers/meson.build
Zbigniew Jędrzejewski-Szmek d0973d
+++ b/src/sysusers/meson.build
Zbigniew Jędrzejewski-Szmek d0973d
@@ -9,6 +9,7 @@ executables += [
Zbigniew Jędrzejewski-Szmek d0973d
                 'name' : 'systemd-sysusers',
Zbigniew Jędrzejewski-Szmek d0973d
                 'public' : true,
Zbigniew Jędrzejewski-Szmek d0973d
                 'sources' : files('sysusers.c'),
Zbigniew Jędrzejewski-Szmek d0973d
+                'dependencies' : libaudit,
Zbigniew Jędrzejewski-Szmek d0973d
         },
Zbigniew Jędrzejewski-Szmek d0973d
         executable_template + {
Zbigniew Jędrzejewski-Szmek d0973d
                 'name' : 'systemd-sysusers.standalone',
Zbigniew Jędrzejewski-Szmek d0973d
@@ -20,6 +21,7 @@ executables += [
Zbigniew Jędrzejewski-Szmek d0973d
                         libshared_static,
Zbigniew Jędrzejewski-Szmek d0973d
                         libsystemd_static,
Zbigniew Jędrzejewski-Szmek d0973d
                 ],
Zbigniew Jędrzejewski-Szmek d0973d
+                'dependencies' : libaudit,
Zbigniew Jędrzejewski-Szmek d0973d
                 'build_by_default' : have_standalone_binaries,
Zbigniew Jędrzejewski-Szmek d0973d
                 'install' : have_standalone_binaries,
Zbigniew Jędrzejewski-Szmek d0973d
         },
Zbigniew Jędrzejewski-Szmek d0973d
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
Zbigniew Jędrzejewski-Szmek d0973d
index 44253483db..84eb9fc0c3 100644
Zbigniew Jędrzejewski-Szmek d0973d
--- a/src/sysusers/sysusers.c
Zbigniew Jędrzejewski-Szmek d0973d
+++ b/src/sysusers/sysusers.c
Zbigniew Jędrzejewski-Szmek d0973d
@@ -3,6 +3,7 @@
Zbigniew Jędrzejewski-Szmek d0973d
 #include <getopt.h>
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
 #include "alloc-util.h"
Zbigniew Jędrzejewski-Szmek d0973d
+#include "audit-util.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "build.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "chase.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "conf-files.h"
Zbigniew Jędrzejewski-Szmek d0973d
@@ -106,6 +107,8 @@ STATIC_DESTRUCTOR_REGISTER(arg_image, freep);
Zbigniew Jędrzejewski-Szmek d0973d
 STATIC_DESTRUCTOR_REGISTER(arg_image_policy, image_policy_freep);
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
 typedef struct Context {
Zbigniew Jędrzejewski-Szmek d0973d
+        int audit_fd;
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
         OrderedHashmap *users, *groups;
Zbigniew Jędrzejewski-Szmek d0973d
         OrderedHashmap *todo_uids, *todo_gids;
Zbigniew Jędrzejewski-Szmek d0973d
         OrderedHashmap *members;
Zbigniew Jędrzejewski-Szmek d0973d
@@ -126,6 +129,8 @@ typedef struct Context {
Zbigniew Jędrzejewski-Szmek d0973d
 static void context_done(Context *c) {
Zbigniew Jędrzejewski-Szmek d0973d
         assert(c);
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
+        c->audit_fd = close_audit_fd(c->audit_fd);
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
         ordered_hashmap_free(c->groups);
Zbigniew Jędrzejewski-Szmek d0973d
         ordered_hashmap_free(c->users);
Zbigniew Jędrzejewski-Szmek d0973d
         ordered_hashmap_free(c->members);
Zbigniew Jędrzejewski-Szmek d0973d
@@ -163,6 +168,48 @@ static void maybe_emit_login_defs_warning(Context *c) {
Zbigniew Jędrzejewski-Szmek d0973d
         c->login_defs_need_warning = false;
Zbigniew Jędrzejewski-Szmek d0973d
 }
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
+static void log_audit_accounts(Context *c, ItemType what) {
Zbigniew Jędrzejewski-Szmek d0973d
+#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
+        assert(c);
Zbigniew Jędrzejewski-Szmek d0973d
+        assert(IN_SET(what, ADD_USER, ADD_GROUP));
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+        if (arg_dry_run || c->audit_fd < 0)
Zbigniew Jędrzejewski-Szmek d0973d
+                return;
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+        Item *i;
Zbigniew Jędrzejewski-Szmek d0973d
+        int type = what == ADD_USER ? AUDIT_ADD_USER : AUDIT_ADD_GROUP;
Zbigniew Jędrzejewski-Szmek d0973d
+        const char *op = what == ADD_USER ? "adding-user" : "adding-group";
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+        /* Notes:
Zbigniew Jędrzejewski-Szmek d0973d
+         *
Zbigniew Jędrzejewski-Szmek d0973d
+         * The op must not contain whitespace. The format with a dash matches what Fedora shadow-utils uses.
Zbigniew Jędrzejewski-Szmek d0973d
+         *
Zbigniew Jędrzejewski-Szmek d0973d
+         * We send id == -1, even though we know the number, in particular on success. This is because if we
Zbigniew Jędrzejewski-Szmek d0973d
+         * send the id, the generated audit message will not contain the name. The name seems more useful
Zbigniew Jędrzejewski-Szmek d0973d
+         * than the number, hence send just the name:
Zbigniew Jędrzejewski-Szmek d0973d
+         *
Zbigniew Jędrzejewski-Szmek d0973d
+         * type=ADD_USER msg=audit(01/10/2025 16:02:00.639:3854) :
Zbigniew Jędrzejewski-Szmek d0973d
+         *   pid=3846380 uid=root auid=zbyszek ses=2 msg='op=adding-user id=unknown(952) exe=systemd-sysusers ... res=success'
Zbigniew Jędrzejewski-Szmek d0973d
+         * vs.
Zbigniew Jędrzejewski-Szmek d0973d
+         * type=ADD_USER msg=audit(01/10/2025 16:03:15.457:3908) :
Zbigniew Jędrzejewski-Szmek d0973d
+         *   pid=3846607 uid=root auid=zbyszek ses=2 msg='op=adding-user acct=foo5 exe=systemd-sysusers ... res=success'
Zbigniew Jędrzejewski-Szmek d0973d
+         */
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
+        ORDERED_HASHMAP_FOREACH(i, what == ADD_USER ? c->todo_uids : c->todo_gids)
Zbigniew Jędrzejewski-Szmek d0973d
+                audit_log_acct_message(
Zbigniew Jędrzejewski-Szmek d0973d
+                                c->audit_fd,
Zbigniew Jędrzejewski-Szmek d0973d
+                                type,
Zbigniew Jędrzejewski-Szmek d0973d
+                                program_invocation_short_name,
Zbigniew Jędrzejewski-Szmek d0973d
+                                op,
Zbigniew Jędrzejewski-Szmek d0973d
+                                i->name,
Zbigniew Jędrzejewski-Szmek d0973d
+                                /* id= */ (unsigned) -1,
Zbigniew Jędrzejewski-Szmek d0973d
+                                /* host= */ NULL,
Zbigniew Jędrzejewski-Szmek d0973d
+                                /* addr= */ NULL,
Zbigniew Jędrzejewski-Szmek d0973d
+                                /* tty= */ NULL,
Zbigniew Jędrzejewski-Szmek d0973d
+                                /* success= */ 1);
Zbigniew Jędrzejewski-Szmek d0973d
+#endif
Zbigniew Jędrzejewski-Szmek d0973d
+}
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
 static int load_user_database(Context *c) {
Zbigniew Jędrzejewski-Szmek d0973d
         _cleanup_fclose_ FILE *f = NULL;
Zbigniew Jędrzejewski-Szmek d0973d
         const char *passwd_path;
Zbigniew Jędrzejewski-Szmek d0973d
@@ -971,6 +1018,8 @@ static int write_files(Context *c) {
Zbigniew Jędrzejewski-Szmek d0973d
                                                group_tmp, group_path);
Zbigniew Jędrzejewski-Szmek d0973d
                 group_tmp = mfree(group_tmp);
Zbigniew Jędrzejewski-Szmek d0973d
         }
Zbigniew Jędrzejewski-Szmek d0973d
+        /* OK, we have written the group entries successfully */
Zbigniew Jędrzejewski-Szmek d0973d
+        log_audit_accounts(c, ADD_GROUP);
Zbigniew Jędrzejewski-Szmek d0973d
         if (gshadow) {
Zbigniew Jędrzejewski-Szmek d0973d
                 r = rename_and_apply_smack_floor_label(gshadow_tmp, gshadow_path);
Zbigniew Jędrzejewski-Szmek d0973d
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek d0973d
@@ -988,6 +1037,8 @@ static int write_files(Context *c) {
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
                 passwd_tmp = mfree(passwd_tmp);
Zbigniew Jędrzejewski-Szmek d0973d
         }
Zbigniew Jędrzejewski-Szmek d0973d
+        /* OK, we have written the user entries successfully */
Zbigniew Jędrzejewski-Szmek d0973d
+        log_audit_accounts(c, ADD_USER);
Zbigniew Jędrzejewski-Szmek d0973d
         if (shadow) {
Zbigniew Jędrzejewski-Szmek d0973d
                 r = rename_and_apply_smack_floor_label(shadow_tmp, shadow_path);
Zbigniew Jędrzejewski-Szmek d0973d
                 if (r < 0)
Zbigniew Jędrzejewski-Szmek d0973d
@@ -2232,6 +2283,7 @@ static int run(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek d0973d
 #endif
Zbigniew Jędrzejewski-Szmek d0973d
         _cleanup_close_ int lock = -EBADF;
Zbigniew Jędrzejewski-Szmek d0973d
         _cleanup_(context_done) Context c = {
Zbigniew Jędrzejewski-Szmek d0973d
+                .audit_fd = -EBADF,
Zbigniew Jędrzejewski-Szmek d0973d
                 .search_uid = UID_INVALID,
Zbigniew Jędrzejewski-Szmek d0973d
         };
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
@@ -2281,6 +2333,10 @@ static int run(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek d0973d
         assert(!arg_image);
Zbigniew Jędrzejewski-Szmek d0973d
 #endif
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
+        /* Prepare to emit audit events, but only if we're operating on the host system. */
Zbigniew Jędrzejewski-Szmek d0973d
+        if (!arg_root)
Zbigniew Jędrzejewski-Szmek d0973d
+                c.audit_fd = open_audit_fd_or_warn();
Zbigniew Jędrzejewski-Szmek d0973d
+
Zbigniew Jędrzejewski-Szmek d0973d
         /* If command line arguments are specified along with --replace, read all configuration files and
Zbigniew Jędrzejewski-Szmek d0973d
          * insert the positional arguments at the specified place. Otherwise, if command line arguments are
Zbigniew Jędrzejewski-Szmek d0973d
          * specified, execute just them, and finally, without --replace= or any positional arguments, just
Zbigniew Jędrzejewski-Szmek d0973d
diff --git a/src/update-utmp/update-utmp.c b/src/update-utmp/update-utmp.c
Zbigniew Jędrzejewski-Szmek d0973d
index a10e6d478a..6df9414063 100644
Zbigniew Jędrzejewski-Szmek d0973d
--- a/src/update-utmp/update-utmp.c
Zbigniew Jędrzejewski-Szmek d0973d
+++ b/src/update-utmp/update-utmp.c
Zbigniew Jędrzejewski-Szmek d0973d
@@ -5,12 +5,9 @@
Zbigniew Jędrzejewski-Szmek d0973d
 #include <sys/types.h>
Zbigniew Jędrzejewski-Szmek d0973d
 #include <unistd.h>
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
-#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
-#include <libaudit.h>
Zbigniew Jędrzejewski-Szmek d0973d
-#endif
Zbigniew Jędrzejewski-Szmek d0973d
-
Zbigniew Jędrzejewski-Szmek d0973d
 #include "sd-bus.h"
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
+#include "audit-util.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "alloc-util.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "bus-error.h"
Zbigniew Jędrzejewski-Szmek d0973d
 #include "bus-locator.h"
Zbigniew Jędrzejewski-Szmek d0973d
@@ -30,20 +27,14 @@
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
 typedef struct Context {
Zbigniew Jędrzejewski-Szmek d0973d
         sd_bus *bus;
Zbigniew Jędrzejewski-Szmek d0973d
-#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
         int audit_fd;
Zbigniew Jędrzejewski-Szmek d0973d
-#endif
Zbigniew Jędrzejewski-Szmek d0973d
 } Context;
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
 static void context_clear(Context *c) {
Zbigniew Jędrzejewski-Szmek d0973d
         assert(c);
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
         c->bus = sd_bus_flush_close_unref(c->bus);
Zbigniew Jędrzejewski-Szmek d0973d
-#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
-        if (c->audit_fd >= 0)
Zbigniew Jędrzejewski-Szmek d0973d
-                audit_close(c->audit_fd);
Zbigniew Jędrzejewski-Szmek d0973d
-        c->audit_fd = -EBADF;
Zbigniew Jędrzejewski-Szmek d0973d
-#endif
Zbigniew Jędrzejewski-Szmek d0973d
+        c->audit_fd = close_audit_fd(c->audit_fd);
Zbigniew Jędrzejewski-Szmek d0973d
 }
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
 static int get_startup_monotonic_time(Context *c, usec_t *ret) {
Zbigniew Jędrzejewski-Szmek d0973d
@@ -256,22 +247,14 @@ static int run(int argc, char *argv[]) {
Zbigniew Jędrzejewski-Szmek d0973d
         };
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
         _cleanup_(context_clear) Context c = {
Zbigniew Jędrzejewski-Szmek d0973d
-#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
                 .audit_fd = -EBADF,
Zbigniew Jędrzejewski-Szmek d0973d
-#endif
Zbigniew Jędrzejewski-Szmek d0973d
         };
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
         log_setup();
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
         umask(0022);
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
-#if HAVE_AUDIT
Zbigniew Jędrzejewski-Szmek d0973d
-        /* If the kernel lacks netlink or audit support, don't worry about it. */
Zbigniew Jędrzejewski-Szmek d0973d
-        c.audit_fd = audit_open();
Zbigniew Jędrzejewski-Szmek d0973d
-        if (c.audit_fd < 0)
Zbigniew Jędrzejewski-Szmek d0973d
-                log_full_errno(IN_SET(errno, EAFNOSUPPORT, EPROTONOSUPPORT) ? LOG_DEBUG : LOG_WARNING,
Zbigniew Jędrzejewski-Szmek d0973d
-                               errno, "Failed to connect to audit log, ignoring: %m");
Zbigniew Jędrzejewski-Szmek d0973d
-#endif
Zbigniew Jędrzejewski-Szmek d0973d
+        c.audit_fd = open_audit_fd_or_warn();
Zbigniew Jędrzejewski-Szmek d0973d
 
Zbigniew Jędrzejewski-Szmek d0973d
         return dispatch_verb(argc, argv, verbs, &c);
Zbigniew Jędrzejewski-Szmek d0973d
 }
Zbigniew Jędrzejewski-Szmek d0973d
-- 
Zbigniew Jędrzejewski-Szmek d0973d
2.47.1
Zbigniew Jędrzejewski-Szmek d0973d