This new function reports whether ambient caps are available, and should
be quick because the result is cached.
return 0;
}
+
+bool ambient_capabilities_supported(void) {
+ static int cache = -1;
+
+ if (cache >= 0)
+ return cache;
+
+ /* If PR_CAP_AMBIENT returns something valid, or an unexpected error code we assume that ambient caps are
+ * available. */
+
+ cache = prctl(PR_CAP_AMBIENT, PR_CAP_AMBIENT_IS_SET, CAP_KILL, 0, 0) >= 0 ||
+ !IN_SET(errno, EINVAL, EOPNOTSUPP, ENOSYS);
+
+ return cache;
+}
m = (UINT64_C(1) << (cap_last_cap() + 1)) - 1;
return (caps & m) == m;
}
+
+bool ambient_capabilities_supported(void);
log_parse_environment();
log_open();
+ log_info("have ambient caps: %s", yes_no(ambient_capabilities_supported()));
+
if (getuid() != 0)
return EXIT_TEST_SKIP;