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