0001
0002 #include <sys/types.h>
0003 #include <sys/stat.h>
0004 #include <fcntl.h>
0005
0006 #ifndef O_DIRECT
0007 #define O_DIRECT 00040000
0008 #endif
0009
0010 #ifndef O_DIRECTORY
0011 #define O_DIRECTORY 00200000
0012 #endif
0013
0014 #ifndef O_NOATIME
0015 #define O_NOATIME 01000000
0016 #endif
0017
0018 #ifndef O_TMPFILE
0019 #define O_TMPFILE 020000000
0020 #endif
0021
0022 #undef O_LARGEFILE
0023 #define O_LARGEFILE 00100000
0024
0025 size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
0026 {
0027 const char *prefix = "O_";
0028 int printed = 0;
0029
0030 if ((flags & O_ACCMODE) == O_RDONLY)
0031 printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", "RDONLY");
0032 if (flags == 0)
0033 return printed;
0034 #define P_FLAG(n) \
0035 if (flags & O_##n) { \
0036 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
0037 flags &= ~O_##n; \
0038 }
0039
0040 P_FLAG(RDWR);
0041 P_FLAG(APPEND);
0042 P_FLAG(ASYNC);
0043 P_FLAG(CLOEXEC);
0044 P_FLAG(CREAT);
0045 P_FLAG(DIRECT);
0046 P_FLAG(DIRECTORY);
0047 P_FLAG(EXCL);
0048 P_FLAG(LARGEFILE);
0049 P_FLAG(NOFOLLOW);
0050 P_FLAG(TMPFILE);
0051 P_FLAG(NOATIME);
0052 P_FLAG(NOCTTY);
0053 #ifdef O_NONBLOCK
0054 P_FLAG(NONBLOCK);
0055 #elif O_NDELAY
0056 P_FLAG(NDELAY);
0057 #endif
0058 #ifdef O_PATH
0059 P_FLAG(PATH);
0060 #endif
0061 #ifdef O_DSYNC
0062 if ((flags & O_SYNC) == O_SYNC)
0063 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", "SYNC");
0064 else {
0065 P_FLAG(DSYNC);
0066 }
0067 #else
0068 P_FLAG(SYNC);
0069 #endif
0070 P_FLAG(TRUNC);
0071 P_FLAG(WRONLY);
0072 #undef P_FLAG
0073
0074 if (flags)
0075 printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
0076
0077 return printed;
0078 }
0079
0080 size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
0081 {
0082 int flags = arg->val;
0083
0084 if (!(flags & O_CREAT))
0085 arg->mask |= 1 << (arg->idx + 1);
0086
0087 return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
0088 }