mode_t.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <unistd.h>
  5. /* From include/linux/stat.h */
  6. #ifndef S_IRWXUGO
  7. #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO)
  8. #endif
  9. #ifndef S_IALLUGO
  10. #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
  11. #endif
  12. #ifndef S_IRUGO
  13. #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH)
  14. #endif
  15. #ifndef S_IWUGO
  16. #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH)
  17. #endif
  18. #ifndef S_IXUGO
  19. #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH)
  20. #endif
  21. static size_t syscall_arg__scnprintf_mode_t(char *bf, size_t size, struct syscall_arg *arg)
  22. {
  23. int printed = 0, mode = arg->val;
  24. #define P_MODE(n) \
  25. if ((mode & S_##n) == S_##n) { \
  26. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  27. mode &= ~S_##n; \
  28. }
  29. P_MODE(IALLUGO);
  30. P_MODE(IRWXUGO);
  31. P_MODE(IRUGO);
  32. P_MODE(IWUGO);
  33. P_MODE(IXUGO);
  34. P_MODE(IFMT);
  35. P_MODE(IFSOCK);
  36. P_MODE(IFLNK);
  37. P_MODE(IFREG);
  38. P_MODE(IFBLK);
  39. P_MODE(IFDIR);
  40. P_MODE(IFCHR);
  41. P_MODE(IFIFO);
  42. P_MODE(ISUID);
  43. P_MODE(ISGID);
  44. P_MODE(ISVTX);
  45. P_MODE(IRWXU);
  46. P_MODE(IRUSR);
  47. P_MODE(IWUSR);
  48. P_MODE(IXUSR);
  49. P_MODE(IRWXG);
  50. P_MODE(IRGRP);
  51. P_MODE(IWGRP);
  52. P_MODE(IXGRP);
  53. P_MODE(IRWXO);
  54. P_MODE(IROTH);
  55. P_MODE(IWOTH);
  56. P_MODE(IXOTH);
  57. #undef P_MODE
  58. if (mode)
  59. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", mode);
  60. return printed;
  61. }
  62. #define SCA_MODE_T syscall_arg__scnprintf_mode_t