open_flags.c (1852B)
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 25size_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 80size_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}