Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: LGPL-2.1
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); /* Mask the mode parm */
0086 
0087     return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
0088 }