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