]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-cap-list.c
2 This file is part of systemd.
4 Copyright 2014 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 #include <sys/prctl.h>
22 #include "alloc-util.h"
24 #include "capability-util.h"
26 #include "parse-util.h"
29 /* verify the capability parser */
30 static void test_cap_list(void) {
33 assert_se(!capability_to_name(-1));
34 assert_se(!capability_to_name(capability_list_length()));
36 for (i
= 0; i
< capability_list_length(); i
++) {
39 assert_se(n
= capability_to_name(i
));
40 assert_se(capability_from_name(n
) == i
);
41 printf("%s = %i\n", n
, i
);
44 assert_se(capability_from_name("asdfbsd") == -EINVAL
);
45 assert_se(capability_from_name("CAP_AUDIT_READ") == CAP_AUDIT_READ
);
46 assert_se(capability_from_name("cap_audit_read") == CAP_AUDIT_READ
);
47 assert_se(capability_from_name("cAp_aUdIt_rEAd") == CAP_AUDIT_READ
);
48 assert_se(capability_from_name("0") == 0);
49 assert_se(capability_from_name("15") == 15);
50 assert_se(capability_from_name("-1") == -EINVAL
);
52 for (i
= 0; i
< capability_list_length(); i
++) {
53 _cleanup_cap_free_charp_
char *a
= NULL
;
57 assert_se(a
= cap_to_name(i
));
59 /* quit the loop as soon as libcap starts returning
60 * numeric ids, formatted as strings */
61 if (safe_atou(a
, &u
) >= 0)
64 assert_se(b
= capability_to_name(i
));
66 printf("%s vs. %s\n", a
, b
);
68 assert_se(strcasecmp(a
, b
) == 0);
72 /* verify cap_last_cap() against /proc/sys/kernel/cap_last_cap */
73 static void test_last_cap_file(void) {
74 _cleanup_free_
char *content
= NULL
;
75 unsigned long val
= 0;
78 r
= read_one_line_file("/proc/sys/kernel/cap_last_cap", &content
);
81 r
= safe_atolu(content
, &val
);
84 assert_se(val
== cap_last_cap());
87 /* verify cap_last_cap() against syscall probing */
88 static void test_last_cap_probe(void) {
89 unsigned long p
= (unsigned long)CAP_LAST_CAP
;
91 if (prctl(PR_CAPBSET_READ
, p
) < 0) {
92 for (p
--; p
> 0; p
--)
93 if (prctl(PR_CAPBSET_READ
, p
) >= 0)
97 if (prctl(PR_CAPBSET_READ
, p
+1) < 0)
102 assert_se(p
== cap_last_cap());
105 int main(int argc
, char *argv
[]) {
107 test_last_cap_file();
108 test_last_cap_probe();