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