#include <poll.h>
#include <stdio.h>
#include <sys/ioctl.h>
+#include <sys/stat.h>
#include <unistd.h>
#include "alloc-util.h"
#include "fd-util.h"
#include "format-ifname.h"
#include "format-util.h"
+#include "fs-util.h"
#include "in-addr-util.h"
#include "io-util.h"
#include "log.h"
#include "string-util.h"
#include "strv.h"
#include "sysctl-util.h"
+#include "tmpfile-util.h"
+#include "xattr-util.h"
#if ENABLE_IDN
# define IDN_FLAGS NI_IDN
return TC_PRIO_BESTEFFORT;
}
}
+
+int socket_xattr_supported(void) {
+ int r;
+
+ // FIXME: Drop this check once Linux 7.0 becomes our baseline
+
+ /* Checks if socket inodes may have xattrs on this kernel. This should pass on kernel 7.0, fail on
+ * older kernels */
+
+ static int cached = -1;
+ if (cached >= 0)
+ return cached;
+
+ const char *t;
+ r = tmp_dir(&t);
+ if (r < 0)
+ return r;
+
+ _cleanup_free_ char *sp = NULL;
+ r = tempfn_random_child(t, "sockxattrtest", &sp);
+ if (r < 0)
+ return r;
+
+ if (mknod(sp, S_IFSOCK | 0600, /* dev= */ 0) < 0)
+ return -errno;
+
+ _cleanup_(unlink_and_freep) char *sp_destroy = TAKE_PTR(sp);
+
+ /* Old kernels return EPERM. But let's also check for more appropriate error codes, to be friendly to
+ * seccomp policies */
+ r = xsetxattr(AT_FDCWD, sp_destroy, /* at_flags= */ 0, "user.testxxx", "1");
+ if (ERRNO_IS_NEG_NOT_SUPPORTED(r) || r == -EPERM)
+ return (cached = false);
+ if (r < 0)
+ return log_debug_errno(r, "Failed to set test xattr on socket inode '%s': %m", sp_destroy);
+
+ return (cached = true);
+}
#include <grp.h>
#include <linux/pkt_sched.h>
#include <netinet/ip.h>
+#include <sys/stat.h>
#include <unistd.h>
#include "alloc-util.h"
ASSERT_EQ(tos_to_priority(0xff), TC_PRIO_CONTROL);
}
+TEST(socket_xattr_supported) {
+ int r;
+
+ r = socket_xattr_supported();
+ ASSERT_OK(r);
+
+ log_info("Extended attributes on socket inodes supported: %s", yes_no(r));
+
+ /* A second call must agree with the first. */
+ ASSERT_EQ(socket_xattr_supported(), r);
+}
+
DEFINE_TEST_MAIN(LOG_DEBUG);