1 | // SPDX-License-Identifier: LGPL-2.1 |
2 | #include <sys/types.h> |
3 | #include <sys/stat.h> |
4 | #include <fcntl.h> |
5 | |
6 | #ifndef O_DIRECT |
7 | #define O_DIRECT 00040000 |
8 | #endif |
9 | |
10 | #ifndef O_DIRECTORY |
11 | #define O_DIRECTORY 00200000 |
12 | #endif |
13 | |
14 | #ifndef O_NOATIME |
15 | #define O_NOATIME 01000000 |
16 | #endif |
17 | |
18 | #ifndef O_TMPFILE |
19 | #define O_TMPFILE 020000000 |
20 | #endif |
21 | |
22 | #undef O_LARGEFILE |
23 | #define O_LARGEFILE 00100000 |
24 | |
25 | size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix) |
26 | { |
27 | const char *prefix = "O_" ; |
28 | int printed = 0; |
29 | |
30 | if ((flags & O_ACCMODE) == O_RDONLY) |
31 | printed = scnprintf(buf: bf, size, fmt: "%s%s" , show_prefix ? prefix : "" , "RDONLY" ); |
32 | if (flags == 0) |
33 | return printed; |
34 | #define P_FLAG(n) \ |
35 | if (flags & O_##n) { \ |
36 | printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ |
37 | flags &= ~O_##n; \ |
38 | } |
39 | |
40 | P_FLAG(RDWR); |
41 | P_FLAG(APPEND); |
42 | P_FLAG(ASYNC); |
43 | P_FLAG(CLOEXEC); |
44 | P_FLAG(CREAT); |
45 | P_FLAG(DIRECT); |
46 | P_FLAG(DIRECTORY); |
47 | P_FLAG(EXCL); |
48 | P_FLAG(LARGEFILE); |
49 | P_FLAG(NOFOLLOW); |
50 | P_FLAG(TMPFILE); |
51 | P_FLAG(NOATIME); |
52 | P_FLAG(NOCTTY); |
53 | #ifdef O_NONBLOCK |
54 | P_FLAG(NONBLOCK); |
55 | #elif O_NDELAY |
56 | P_FLAG(NDELAY); |
57 | #endif |
58 | #ifdef O_PATH |
59 | P_FLAG(PATH); |
60 | #endif |
61 | #ifdef O_DSYNC |
62 | if ((flags & O_SYNC) == O_SYNC) |
63 | printed += scnprintf(buf: bf + printed, size: size - printed, fmt: "%s%s%s" , printed ? "|" : "" , show_prefix ? prefix : "" , "SYNC" ); |
64 | else { |
65 | P_FLAG(DSYNC); |
66 | } |
67 | #else |
68 | P_FLAG(SYNC); |
69 | #endif |
70 | P_FLAG(TRUNC); |
71 | P_FLAG(WRONLY); |
72 | #undef P_FLAG |
73 | |
74 | if (flags) |
75 | printed += scnprintf(buf: bf + printed, size: size - printed, fmt: "%s%#x" , printed ? "|" : "" , flags); |
76 | |
77 | return printed; |
78 | } |
79 | |
80 | size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg) |
81 | { |
82 | int flags = arg->val; |
83 | |
84 | if (!(flags & O_CREAT)) |
85 | arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */ |
86 | |
87 | return open__scnprintf_flags(flags, bf, size, show_prefix: arg->show_string_prefix); |
88 | } |
89 | |