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 8 #include "trace/beauty/beauty.h" 9 #include <linux/kernel.h> 10 #include <sys/types.h> 11 #include <linux/fcntl.h> 12 #include <linux/stat.h> 13 14 #ifndef STATX_MNT_ID 15 #define STATX_MNT_ID 0x00001000U 16 #endif 17 #ifndef STATX_DIOALIGN 18 #define STATX_DIOALIGN 0x00002000U 19 #endif 20 #ifndef STATX_MNT_ID_UNIQUE 21 #define STATX_MNT_ID_UNIQUE 0x00004000U 22 #endif 23 24 size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg) 25 { 26 bool show_prefix = arg->show_string_prefix; 27 const char *prefix = "AT_"; 28 int printed = 0, flags = arg->val; 29 30 if (flags == 0) 31 return scnprintf(bf, size, "%s%s", show_prefix ? "AT_STATX_" : "", "SYNC_AS_STAT"); 32 #define P_FLAG(n) \ 33 if (flags & AT_##n) { \ 34 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ 35 flags &= ~AT_##n; \ 36 } 37 38 P_FLAG(SYMLINK_NOFOLLOW); 39 P_FLAG(REMOVEDIR); 40 P_FLAG(SYMLINK_FOLLOW); 41 P_FLAG(NO_AUTOMOUNT); 42 P_FLAG(EMPTY_PATH); 43 P_FLAG(STATX_FORCE_SYNC); 44 P_FLAG(STATX_DONT_SYNC); 45 46 #undef P_FLAG 47 48 if (flags) 49 printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags); 50 51 return printed; 52 } 53 54 size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg) 55 { 56 bool show_prefix = arg->show_string_prefix; 57 const char *prefix = "STATX_"; 58 int printed = 0, flags = arg->val; 59 60 #define P_FLAG(n) \ 61 if (flags & STATX_##n) { \ 62 printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \ 63 flags &= ~STATX_##n; \ 64 } 65 66 P_FLAG(TYPE); 67 P_FLAG(MODE); 68 P_FLAG(NLINK); 69 P_FLAG(UID); 70 P_FLAG(GID); 71 P_FLAG(ATIME); 72 P_FLAG(MTIME); 73 P_FLAG(CTIME); 74 P_FLAG(INO); 75 P_FLAG(SIZE); 76 P_FLAG(BLOCKS); 77 P_FLAG(BTIME); 78 P_FLAG(MNT_ID); 79 P_FLAG(DIOALIGN); 80 P_FLAG(MNT_ID_UNIQUE); 81 82 #undef P_FLAG 83 84 if (flags) 85 printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags); 86 87 return printed; 88 } 89