1 // SPDX-License-Identifier: GPL-2.0 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) 26 { 27 int printed = 0; 28 29 if (flags == 0) 30 return scnprintf(bf, size, "RDONLY"); 31 #define P_FLAG(n) \ 32 if (flags & O_##n) { \ 33 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ 34 flags &= ~O_##n; \ 35 } 36 37 P_FLAG(RDWR); 38 P_FLAG(APPEND); 39 P_FLAG(ASYNC); 40 P_FLAG(CLOEXEC); 41 P_FLAG(CREAT); 42 P_FLAG(DIRECT); 43 P_FLAG(DIRECTORY); 44 P_FLAG(EXCL); 45 P_FLAG(LARGEFILE); 46 P_FLAG(NOFOLLOW); 47 P_FLAG(TMPFILE); 48 P_FLAG(NOATIME); 49 P_FLAG(NOCTTY); 50 #ifdef O_NONBLOCK 51 P_FLAG(NONBLOCK); 52 #elif O_NDELAY 53 P_FLAG(NDELAY); 54 #endif 55 #ifdef O_PATH 56 P_FLAG(PATH); 57 #endif 58 #ifdef O_DSYNC 59 if ((flags & O_SYNC) == O_SYNC) 60 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", "SYNC"); 61 else { 62 P_FLAG(DSYNC); 63 } 64 #else 65 P_FLAG(SYNC); 66 #endif 67 P_FLAG(TRUNC); 68 P_FLAG(WRONLY); 69 #undef P_FLAG 70 71 if (flags) 72 printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags); 73 74 return printed; 75 } 76 77 size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg) 78 { 79 int flags = arg->val; 80 81 if (!(flags & O_CREAT)) 82 arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */ 83 84 return open__scnprintf_flags(flags, bf, size); 85 } 86