2 * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org>
3 * Copyright (c) 2015-2018 The strace developers.
6 * SPDX-License-Identifier: GPL-2.0-or-later
10 #include <sys/personality.h>
13 # define linux_type_str "0"
14 # define good_type_str "0x6"
15 # define bad_type_str "0x1f"
16 # define good_flags_str "0x7000000"
17 # define bad_flags_str "0x10000"
18 # define good_bad_flags_str "0x7010000"
20 # define linux_type_str "0 /\\* PER_LINUX \\*/"
21 # define good_type_str "0x6 /\\* PER_BSD \\*/"
22 # define bad_type_str "0x1f /\\* PER_\\?\\?\\? \\*/"
23 # define good_flags_str \
24 "0x7000000 /\\* SHORT_INODE\\|WHOLE_SECONDS\\|STICKY_TIMEOUTS \\*/"
25 # define bad_flags_str "0x10000"
26 # define good_bad_flags_str \
27 "0x7010000 /\\* SHORT_INODE\\|WHOLE_SECONDS\\|STICKY_TIMEOUTS" \
30 # define linux_type_str "PER_LINUX"
31 # define good_type_str "PER_BSD"
32 # define bad_type_str "0x1f /\\* PER_\\?\\?\\? \\*/"
33 # define good_flags_str "SHORT_INODE\\|WHOLE_SECONDS\\|STICKY_TIMEOUTS"
34 # define bad_flags_str "0x10000"
35 # define good_bad_flags_str \
36 "SHORT_INODE\\|WHOLE_SECONDS\\|STICKY_TIMEOUTS\\|0x10000"
41 const unsigned int good_type = PER_BSD;
43 const unsigned int bad_type = 0x1f;
45 const unsigned int good_flags =
46 SHORT_INODE | WHOLE_SECONDS | STICKY_TIMEOUTS;
48 const unsigned int bad_flags = 0x10000;
50 const unsigned int saved_pers = personality(0xffffffff);
51 printf("personality\\(0xffffffff\\) = %#x \\([^)]*\\)\n", saved_pers);
54 personality(PER_LINUX);
55 printf("personality\\(%s\\) = %#x \\([^)]*\\)\n",
56 linux_type_str, saved_pers);
58 personality(0xffffffff);
59 printf("personality\\(0xffffffff\\) = 0 \\(%s\\)\n", linux_type_str);
61 personality(good_flags);
62 printf("personality\\(%s\\|%s\\) = 0 \\(%s\\)\n",
63 linux_type_str, good_flags_str, linux_type_str);
65 personality(bad_flags);
66 printf("personality\\(%s\\|%s\\)"
67 " = %#x \\(%s\\|%s\\)\n",
68 linux_type_str, bad_flags_str,
69 good_flags, linux_type_str, good_flags_str);
71 personality(good_flags | bad_flags);
72 printf("personality\\(%s\\|%s\\)"
73 " = %#x \\(%s\\|%s\\)\n",
74 linux_type_str, good_bad_flags_str,
75 bad_flags, linux_type_str, bad_flags_str);
77 /* another valid type */
78 personality(good_type);
79 printf("personality\\(%s\\) = %#x \\(%s\\|%s\\)\n",
80 good_type_str, good_flags | bad_flags,
81 linux_type_str, good_bad_flags_str);
83 personality(good_type | good_flags);
84 printf("personality\\(%s\\|%s\\) = %#x \\(%s\\)\n",
85 good_type_str, good_flags_str, good_type, good_type_str);
87 personality(good_type | bad_flags);
88 printf("personality\\(%s\\|%s\\) = %#x \\(%s\\|%s\\)\n",
89 good_type_str, bad_flags_str, good_type | good_flags,
90 good_type_str, good_flags_str);
92 personality(good_type | good_flags | bad_flags);
93 printf("personality\\(%s\\|%s\\) = %#x \\(%s\\|%s\\)\n",
94 good_type_str, good_bad_flags_str,
95 good_type | bad_flags,
96 good_type_str, bad_flags_str);
99 personality(bad_type);
100 printf("personality\\(%s\\) = %#x \\(%s\\|%s\\)\n",
101 bad_type_str, good_type | good_flags | bad_flags,
102 good_type_str, good_bad_flags_str);
104 personality(bad_type | good_flags);
105 printf("personality\\(%s\\|%s\\) = %#x \\(%s\\)\n",
106 bad_type_str, good_flags_str, bad_type, bad_type_str);
108 personality(bad_type | bad_flags);
109 printf("personality\\(%s\\|%s\\) = %#x \\(%s\\|%s\\)\n",
110 bad_type_str, bad_flags_str, bad_type | good_flags,
111 bad_type_str, good_flags_str);
113 personality(bad_type | good_flags | bad_flags);
114 printf("personality\\(%s\\|%s\\) = %#x \\(%s\\|%s\\)\n",
115 bad_type_str, good_bad_flags_str,
116 bad_type | bad_flags, bad_type_str, bad_flags_str);
118 personality(saved_pers);
119 printf("personality\\([^)]*\\) = %#x \\(%s\\|%s\\)\n",
120 bad_type | good_flags | bad_flags,
121 bad_type_str, good_bad_flags_str);