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