162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * trace/beauty/statx.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "trace/beauty/beauty.h"
962306a36Sopenharmony_ci#include <linux/kernel.h>
1062306a36Sopenharmony_ci#include <sys/types.h>
1162306a36Sopenharmony_ci#include <uapi/linux/fcntl.h>
1262306a36Sopenharmony_ci#include <uapi/linux/stat.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	bool show_prefix = arg->show_string_prefix;
1762306a36Sopenharmony_ci	const char *prefix = "AT_";
1862306a36Sopenharmony_ci	int printed = 0, flags = arg->val;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if (flags == 0)
2162306a36Sopenharmony_ci		return scnprintf(bf, size, "%s%s", show_prefix ? "AT_STATX_" : "", "SYNC_AS_STAT");
2262306a36Sopenharmony_ci#define	P_FLAG(n) \
2362306a36Sopenharmony_ci	if (flags & AT_##n) { \
2462306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
2562306a36Sopenharmony_ci		flags &= ~AT_##n; \
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	P_FLAG(SYMLINK_NOFOLLOW);
2962306a36Sopenharmony_ci	P_FLAG(REMOVEDIR);
3062306a36Sopenharmony_ci	P_FLAG(SYMLINK_FOLLOW);
3162306a36Sopenharmony_ci	P_FLAG(NO_AUTOMOUNT);
3262306a36Sopenharmony_ci	P_FLAG(EMPTY_PATH);
3362306a36Sopenharmony_ci	P_FLAG(STATX_FORCE_SYNC);
3462306a36Sopenharmony_ci	P_FLAG(STATX_DONT_SYNC);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#undef P_FLAG
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	if (flags)
3962306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	return printed;
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	bool show_prefix = arg->show_string_prefix;
4762306a36Sopenharmony_ci	const char *prefix = "STATX_";
4862306a36Sopenharmony_ci	int printed = 0, flags = arg->val;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define	P_FLAG(n) \
5162306a36Sopenharmony_ci	if (flags & STATX_##n) { \
5262306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
5362306a36Sopenharmony_ci		flags &= ~STATX_##n; \
5462306a36Sopenharmony_ci	}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	P_FLAG(TYPE);
5762306a36Sopenharmony_ci	P_FLAG(MODE);
5862306a36Sopenharmony_ci	P_FLAG(NLINK);
5962306a36Sopenharmony_ci	P_FLAG(UID);
6062306a36Sopenharmony_ci	P_FLAG(GID);
6162306a36Sopenharmony_ci	P_FLAG(ATIME);
6262306a36Sopenharmony_ci	P_FLAG(MTIME);
6362306a36Sopenharmony_ci	P_FLAG(CTIME);
6462306a36Sopenharmony_ci	P_FLAG(INO);
6562306a36Sopenharmony_ci	P_FLAG(SIZE);
6662306a36Sopenharmony_ci	P_FLAG(BLOCKS);
6762306a36Sopenharmony_ci	P_FLAG(BTIME);
6862306a36Sopenharmony_ci	P_FLAG(MNT_ID);
6962306a36Sopenharmony_ci	P_FLAG(DIOALIGN);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#undef P_FLAG
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	if (flags)
7462306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	return printed;
7762306a36Sopenharmony_ci}
78