linux/tools/perf/trace/beauty/open_flags.c
<<
>>
Prefs
   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}
  89