0001
0002 #include <sys/types.h>
0003 #include <sys/stat.h>
0004 #include <unistd.h>
0005
0006
0007 #ifndef S_IRWXUGO
0008 #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
0009 #endif
0010 #ifndef S_IALLUGO
0011 #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
0012 #endif
0013 #ifndef S_IRUGO
0014 #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
0015 #endif
0016 #ifndef S_IWUGO
0017 #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
0018 #endif
0019 #ifndef S_IXUGO
0020 #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
0021 #endif
0022
0023 static size_t syscall_arg__scnprintf_mode_t(char *bf, size_t size, struct syscall_arg *arg)
0024 {
0025 bool show_prefix = arg->show_string_prefix;
0026 const char *prefix = "S_";
0027 int printed = 0, mode = arg->val;
0028
0029 #define P_MODE(n) \
0030 if ((mode & S_##n) == S_##n) { \
0031 printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
0032 mode &= ~S_##n; \
0033 }
0034
0035 P_MODE(IALLUGO);
0036 P_MODE(IRWXUGO);
0037 P_MODE(IRUGO);
0038 P_MODE(IWUGO);
0039 P_MODE(IXUGO);
0040 P_MODE(IFMT);
0041 P_MODE(IFSOCK);
0042 P_MODE(IFLNK);
0043 P_MODE(IFREG);
0044 P_MODE(IFBLK);
0045 P_MODE(IFDIR);
0046 P_MODE(IFCHR);
0047 P_MODE(IFIFO);
0048 P_MODE(ISUID);
0049 P_MODE(ISGID);
0050 P_MODE(ISVTX);
0051 P_MODE(IRWXU);
0052 P_MODE(IRUSR);
0053 P_MODE(IWUSR);
0054 P_MODE(IXUSR);
0055 P_MODE(IRWXG);
0056 P_MODE(IRGRP);
0057 P_MODE(IWGRP);
0058 P_MODE(IXGRP);
0059 P_MODE(IRWXO);
0060 P_MODE(IROTH);
0061 P_MODE(IWOTH);
0062 P_MODE(IXOTH);
0063 #undef P_MODE
0064
0065 if (mode)
0066 printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", mode);
0067
0068 return printed;
0069 }
0070
0071 #define SCA_MODE_T syscall_arg__scnprintf_mode_t