open_flags.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-License-Identifier: LGPL-2.1
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #ifndef O_DIRECT
  6. #define O_DIRECT 00040000
  7. #endif
  8. #ifndef O_DIRECTORY
  9. #define O_DIRECTORY 00200000
  10. #endif
  11. #ifndef O_NOATIME
  12. #define O_NOATIME 01000000
  13. #endif
  14. #ifndef O_TMPFILE
  15. #define O_TMPFILE 020000000
  16. #endif
  17. #undef O_LARGEFILE
  18. #define O_LARGEFILE 00100000
  19. size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix)
  20. {
  21. const char *prefix = "O_";
  22. int printed = 0;
  23. if ((flags & O_ACCMODE) == O_RDONLY)
  24. printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", "RDONLY");
  25. if (flags == 0)
  26. return printed;
  27. #define P_FLAG(n) \
  28. if (flags & O_##n) { \
  29. printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
  30. flags &= ~O_##n; \
  31. }
  32. P_FLAG(RDWR);
  33. P_FLAG(APPEND);
  34. P_FLAG(ASYNC);
  35. P_FLAG(CLOEXEC);
  36. P_FLAG(CREAT);
  37. P_FLAG(DIRECT);
  38. P_FLAG(DIRECTORY);
  39. P_FLAG(EXCL);
  40. P_FLAG(LARGEFILE);
  41. P_FLAG(NOFOLLOW);
  42. P_FLAG(TMPFILE);
  43. P_FLAG(NOATIME);
  44. P_FLAG(NOCTTY);
  45. #ifdef O_NONBLOCK
  46. P_FLAG(NONBLOCK);
  47. #elif O_NDELAY
  48. P_FLAG(NDELAY);
  49. #endif
  50. #ifdef O_PATH
  51. P_FLAG(PATH);
  52. #endif
  53. #ifdef O_DSYNC
  54. if ((flags & O_SYNC) == O_SYNC)
  55. printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", "SYNC");
  56. else {
  57. P_FLAG(DSYNC);
  58. }
  59. #else
  60. P_FLAG(SYNC);
  61. #endif
  62. P_FLAG(TRUNC);
  63. P_FLAG(WRONLY);
  64. #undef P_FLAG
  65. if (flags)
  66. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
  67. return printed;
  68. }
  69. size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg)
  70. {
  71. int flags = arg->val;
  72. if (!(flags & O_CREAT))
  73. arg->mask |= 1 << (arg->idx + 1); /* Mask the mode parm */
  74. return open__scnprintf_flags(flags, bf, size, arg->show_string_prefix);
  75. }