Linux Perf
open_flags.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
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)
26 {
27  int printed = 0;
28 
29  if (flags == 0)
30  return scnprintf(bf, size, "RDONLY");
31 #define P_FLAG(n) \
32  if (flags & O_##n) { \
33  printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
34  flags &= ~O_##n; \
35  }
36 
37  P_FLAG(RDWR);
38  P_FLAG(APPEND);
39  P_FLAG(ASYNC);
40  P_FLAG(CLOEXEC);
41  P_FLAG(CREAT);
42  P_FLAG(DIRECT);
43  P_FLAG(DIRECTORY);
44  P_FLAG(EXCL);
45  P_FLAG(LARGEFILE);
46  P_FLAG(NOFOLLOW);
47  P_FLAG(TMPFILE);
48  P_FLAG(NOATIME);
49  P_FLAG(NOCTTY);
50 #ifdef O_NONBLOCK
51  P_FLAG(NONBLOCK);
52 #elif O_NDELAY
53  P_FLAG(NDELAY);
54 #endif
55 #ifdef O_PATH
56  P_FLAG(PATH);
57 #endif
58 #ifdef O_DSYNC
59  if ((flags & O_SYNC) == O_SYNC)
60  printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", "SYNC");
61  else {
62  P_FLAG(DSYNC);
63  }
64 #else
65  P_FLAG(SYNC);
66 #endif
67  P_FLAG(TRUNC);
68  P_FLAG(WRONLY);
69 #undef P_FLAG
70 
71  if (flags)
72  printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
73 
74  return printed;
75 }
76 
77 size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
78 {
79  int flags = arg->val;
80 
81  if (!(flags & O_CREAT))
82  arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */
83 
84  return open__scnprintf_flags(flags, bf, size);
85 }
size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size)
Definition: open_flags.c:25
size_t size
Definition: evsel.c:60
size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
Definition: open_flags.c:77
u8 idx
Definition: beauty.h:49
u8 mask
Definition: beauty.h:50
#define P_FLAG(n)
unsigned long val
Definition: beauty.h:44
u32 flags