1 | // SPDX-License-Identifier: LGPL-2.1 |
2 | |
3 | #include "trace/beauty/beauty.h" |
4 | #include <linux/kernel.h> |
5 | #include <uapi/linux/fcntl.h> |
6 | |
7 | #ifndef LOCK_MAND |
8 | #define LOCK_MAND 32 |
9 | #endif |
10 | |
11 | #ifndef LOCK_READ |
12 | #define LOCK_READ 64 |
13 | #endif |
14 | |
15 | #ifndef LOCK_WRITE |
16 | #define LOCK_WRITE 128 |
17 | #endif |
18 | |
19 | #ifndef LOCK_RW |
20 | #define LOCK_RW 192 |
21 | #endif |
22 | |
23 | size_t syscall_arg__scnprintf_flock(char *bf, size_t size, struct syscall_arg *arg) |
24 | { |
25 | bool show_prefix = arg->show_string_prefix; |
26 | const char *prefix = "LOCK_" ; |
27 | int printed = 0, op = arg->val; |
28 | |
29 | if (op == 0) |
30 | return scnprintf(buf: bf, size, fmt: "NONE" ); |
31 | #define P_CMD(cmd) \ |
32 | if ((op & LOCK_##cmd) == LOCK_##cmd) { \ |
33 | printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #cmd); \ |
34 | op &= ~LOCK_##cmd; \ |
35 | } |
36 | |
37 | P_CMD(SH); |
38 | P_CMD(EX); |
39 | P_CMD(NB); |
40 | P_CMD(UN); |
41 | P_CMD(MAND); |
42 | P_CMD(RW); |
43 | P_CMD(READ); |
44 | P_CMD(WRITE); |
45 | #undef P_OP |
46 | |
47 | if (op) |
48 | printed += scnprintf(buf: bf + printed, size: size - printed, fmt: "%s%#x" , printed ? "|" : "" , op); |
49 | |
50 | return printed; |
51 | } |
52 | |