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