xref: /linux/tools/perf/trace/beauty/open_flags.c (revision 597473720f4dc69749542bfcfed4a927a43d935e)
1794f594eSArnaldo Carvalho de Melo // SPDX-License-Identifier: LGPL-2.1
29d4a94caSArnaldo Carvalho de Melo #include <sys/types.h>
39d4a94caSArnaldo Carvalho de Melo #include <sys/stat.h>
49d4a94caSArnaldo Carvalho de Melo #include <fcntl.h>
58f48df69SArnaldo Carvalho de Melo 
6ffe3a28aSArnaldo Carvalho de Melo #ifndef O_DIRECT
7ffe3a28aSArnaldo Carvalho de Melo #define O_DIRECT	00040000
8ffe3a28aSArnaldo Carvalho de Melo #endif
9ffe3a28aSArnaldo Carvalho de Melo 
10ffe3a28aSArnaldo Carvalho de Melo #ifndef O_DIRECTORY
11ffe3a28aSArnaldo Carvalho de Melo #define O_DIRECTORY	00200000
12ffe3a28aSArnaldo Carvalho de Melo #endif
13ffe3a28aSArnaldo Carvalho de Melo 
14ffe3a28aSArnaldo Carvalho de Melo #ifndef O_NOATIME
15ffe3a28aSArnaldo Carvalho de Melo #define O_NOATIME	01000000
16ffe3a28aSArnaldo Carvalho de Melo #endif
17ffe3a28aSArnaldo Carvalho de Melo 
186b3d5c97SArnaldo Carvalho de Melo #ifndef O_TMPFILE
196b3d5c97SArnaldo Carvalho de Melo #define O_TMPFILE	020000000
206b3d5c97SArnaldo Carvalho de Melo #endif
216b3d5c97SArnaldo Carvalho de Melo 
22b84148a9SArnaldo Carvalho de Melo #undef O_LARGEFILE
23b84148a9SArnaldo Carvalho de Melo #define O_LARGEFILE	00100000
24b84148a9SArnaldo Carvalho de Melo 
open__scnprintf_flags(unsigned long flags,char * bf,size_t size,bool show_prefix)25c65c83ffSArnaldo Carvalho de Melo size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
268f48df69SArnaldo Carvalho de Melo {
27c65c83ffSArnaldo Carvalho de Melo 	const char *prefix = "O_";
28b239ad28SArnaldo Carvalho de Melo 	int printed = 0;
298f48df69SArnaldo Carvalho de Melo 
30*601d66d4SArnaldo Carvalho de Melo 	if ((flags & O_ACCMODE) == O_RDONLY)
31*601d66d4SArnaldo Carvalho de Melo 		printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", "RDONLY");
328f48df69SArnaldo Carvalho de Melo 	if (flags == 0)
33*601d66d4SArnaldo Carvalho de Melo 		return printed;
348f48df69SArnaldo Carvalho de Melo #define	P_FLAG(n) \
358f48df69SArnaldo Carvalho de Melo 	if (flags & O_##n) { \
36c65c83ffSArnaldo Carvalho de Melo 		printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
378f48df69SArnaldo Carvalho de Melo 		flags &= ~O_##n; \
388f48df69SArnaldo Carvalho de Melo 	}
398f48df69SArnaldo Carvalho de Melo 
40e07f93c0SArnaldo Carvalho de Melo 	P_FLAG(RDWR);
418f48df69SArnaldo Carvalho de Melo 	P_FLAG(APPEND);
428f48df69SArnaldo Carvalho de Melo 	P_FLAG(ASYNC);
438f48df69SArnaldo Carvalho de Melo 	P_FLAG(CLOEXEC);
448f48df69SArnaldo Carvalho de Melo 	P_FLAG(CREAT);
458f48df69SArnaldo Carvalho de Melo 	P_FLAG(DIRECT);
468f48df69SArnaldo Carvalho de Melo 	P_FLAG(DIRECTORY);
478f48df69SArnaldo Carvalho de Melo 	P_FLAG(EXCL);
488f48df69SArnaldo Carvalho de Melo 	P_FLAG(LARGEFILE);
496b3d5c97SArnaldo Carvalho de Melo 	P_FLAG(NOFOLLOW);
506b3d5c97SArnaldo Carvalho de Melo 	P_FLAG(TMPFILE);
518f48df69SArnaldo Carvalho de Melo 	P_FLAG(NOATIME);
528f48df69SArnaldo Carvalho de Melo 	P_FLAG(NOCTTY);
538f48df69SArnaldo Carvalho de Melo #ifdef O_NONBLOCK
548f48df69SArnaldo Carvalho de Melo 	P_FLAG(NONBLOCK);
558f48df69SArnaldo Carvalho de Melo #elif O_NDELAY
568f48df69SArnaldo Carvalho de Melo 	P_FLAG(NDELAY);
578f48df69SArnaldo Carvalho de Melo #endif
588f48df69SArnaldo Carvalho de Melo #ifdef O_PATH
598f48df69SArnaldo Carvalho de Melo 	P_FLAG(PATH);
608f48df69SArnaldo Carvalho de Melo #endif
618f48df69SArnaldo Carvalho de Melo #ifdef O_DSYNC
628f48df69SArnaldo Carvalho de Melo 	if ((flags & O_SYNC) == O_SYNC)
63c65c83ffSArnaldo Carvalho de Melo 		printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", "SYNC");
648f48df69SArnaldo Carvalho de Melo 	else {
658f48df69SArnaldo Carvalho de Melo 		P_FLAG(DSYNC);
668f48df69SArnaldo Carvalho de Melo 	}
678f48df69SArnaldo Carvalho de Melo #else
688f48df69SArnaldo Carvalho de Melo 	P_FLAG(SYNC);
698f48df69SArnaldo Carvalho de Melo #endif
708f48df69SArnaldo Carvalho de Melo 	P_FLAG(TRUNC);
718f48df69SArnaldo Carvalho de Melo 	P_FLAG(WRONLY);
728f48df69SArnaldo Carvalho de Melo #undef P_FLAG
738f48df69SArnaldo Carvalho de Melo 
748f48df69SArnaldo Carvalho de Melo 	if (flags)
758f48df69SArnaldo Carvalho de Melo 		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
768f48df69SArnaldo Carvalho de Melo 
778f48df69SArnaldo Carvalho de Melo 	return printed;
788f48df69SArnaldo Carvalho de Melo }
798f48df69SArnaldo Carvalho de Melo 
syscall_arg__scnprintf_open_flags(char * bf,size_t size,struct syscall_arg * arg)807ee57434SArnaldo Carvalho de Melo size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
81b239ad28SArnaldo Carvalho de Melo {
82b239ad28SArnaldo Carvalho de Melo 	int flags = arg->val;
83b239ad28SArnaldo Carvalho de Melo 
84b239ad28SArnaldo Carvalho de Melo 	if (!(flags & O_CREAT))
85b239ad28SArnaldo Carvalho de Melo 		arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */
86b239ad28SArnaldo Carvalho de Melo 
87c65c83ffSArnaldo Carvalho de Melo 	return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
88b239ad28SArnaldo Carvalho de Melo }
89