open_flags.c 1.4 KB

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