statx.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // SPDX-License-Identifier: LGPL-2.1
  2. /*
  3. * trace/beauty/statx.c
  4. *
  5. * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
  6. */
  7. #include "trace/beauty/beauty.h"
  8. #include <linux/kernel.h>
  9. #include <sys/types.h>
  10. #include <uapi/linux/fcntl.h>
  11. #include <uapi/linux/stat.h>
  12. size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg)
  13. {
  14. int printed = 0, flags = arg->val;
  15. if (flags == 0)
  16. return scnprintf(bf, size, "SYNC_AS_STAT");
  17. #define P_FLAG(n) \
  18. if (flags & AT_##n) { \
  19. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  20. flags &= ~AT_##n; \
  21. }
  22. P_FLAG(SYMLINK_NOFOLLOW);
  23. P_FLAG(REMOVEDIR);
  24. P_FLAG(SYMLINK_FOLLOW);
  25. P_FLAG(NO_AUTOMOUNT);
  26. P_FLAG(EMPTY_PATH);
  27. P_FLAG(STATX_FORCE_SYNC);
  28. P_FLAG(STATX_DONT_SYNC);
  29. #undef P_FLAG
  30. if (flags)
  31. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
  32. return printed;
  33. }
  34. size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg)
  35. {
  36. int printed = 0, flags = arg->val;
  37. #define P_FLAG(n) \
  38. if (flags & STATX_##n) { \
  39. printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \
  40. flags &= ~STATX_##n; \
  41. }
  42. P_FLAG(TYPE);
  43. P_FLAG(MODE);
  44. P_FLAG(NLINK);
  45. P_FLAG(UID);
  46. P_FLAG(GID);
  47. P_FLAG(ATIME);
  48. P_FLAG(MTIME);
  49. P_FLAG(CTIME);
  50. P_FLAG(INO);
  51. P_FLAG(SIZE);
  52. P_FLAG(BLOCKS);
  53. P_FLAG(BTIME);
  54. #undef P_FLAG
  55. if (flags)
  56. printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
  57. return printed;
  58. }