162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1
262306a36Sopenharmony_ci#include <sys/types.h>
362306a36Sopenharmony_ci#include <sys/socket.h>
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#ifndef MSG_PROBE
662306a36Sopenharmony_ci#define MSG_PROBE		     0x10
762306a36Sopenharmony_ci#endif
862306a36Sopenharmony_ci#ifndef MSG_WAITFORONE
962306a36Sopenharmony_ci#define MSG_WAITFORONE		   0x10000
1062306a36Sopenharmony_ci#endif
1162306a36Sopenharmony_ci#ifndef MSG_BATCH
1262306a36Sopenharmony_ci#define MSG_BATCH		   0x40000
1362306a36Sopenharmony_ci#endif
1462306a36Sopenharmony_ci#ifndef MSG_ZEROCOPY
1562306a36Sopenharmony_ci#define MSG_ZEROCOPY		 0x4000000
1662306a36Sopenharmony_ci#endif
1762306a36Sopenharmony_ci#ifndef MSG_SPLICE_PAGES
1862306a36Sopenharmony_ci#define MSG_SPLICE_PAGES	0x8000000
1962306a36Sopenharmony_ci#endif
2062306a36Sopenharmony_ci#ifndef MSG_FASTOPEN
2162306a36Sopenharmony_ci#define MSG_FASTOPEN		0x20000000
2262306a36Sopenharmony_ci#endif
2362306a36Sopenharmony_ci#ifndef MSG_CMSG_CLOEXEC
2462306a36Sopenharmony_ci# define MSG_CMSG_CLOEXEC	0x40000000
2562306a36Sopenharmony_ci#endif
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic size_t syscall_arg__scnprintf_msg_flags(char *bf, size_t size,
2862306a36Sopenharmony_ci					       struct syscall_arg *arg)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	bool show_prefix = arg->show_string_prefix;
3162306a36Sopenharmony_ci	const char *prefix = "MSG_";
3262306a36Sopenharmony_ci	int printed = 0, flags = arg->val;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	if (flags == 0)
3562306a36Sopenharmony_ci		return scnprintf(bf, size, "NONE");
3662306a36Sopenharmony_ci#define	P_MSG_FLAG(n) \
3762306a36Sopenharmony_ci	if (flags & MSG_##n) { \
3862306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
3962306a36Sopenharmony_ci		flags &= ~MSG_##n; \
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	P_MSG_FLAG(OOB);
4362306a36Sopenharmony_ci	P_MSG_FLAG(PEEK);
4462306a36Sopenharmony_ci	P_MSG_FLAG(DONTROUTE);
4562306a36Sopenharmony_ci	P_MSG_FLAG(CTRUNC);
4662306a36Sopenharmony_ci	P_MSG_FLAG(PROBE);
4762306a36Sopenharmony_ci	P_MSG_FLAG(TRUNC);
4862306a36Sopenharmony_ci	P_MSG_FLAG(DONTWAIT);
4962306a36Sopenharmony_ci	P_MSG_FLAG(EOR);
5062306a36Sopenharmony_ci	P_MSG_FLAG(WAITALL);
5162306a36Sopenharmony_ci	P_MSG_FLAG(FIN);
5262306a36Sopenharmony_ci	P_MSG_FLAG(SYN);
5362306a36Sopenharmony_ci	P_MSG_FLAG(CONFIRM);
5462306a36Sopenharmony_ci	P_MSG_FLAG(RST);
5562306a36Sopenharmony_ci	P_MSG_FLAG(ERRQUEUE);
5662306a36Sopenharmony_ci	P_MSG_FLAG(NOSIGNAL);
5762306a36Sopenharmony_ci	P_MSG_FLAG(MORE);
5862306a36Sopenharmony_ci	P_MSG_FLAG(WAITFORONE);
5962306a36Sopenharmony_ci	P_MSG_FLAG(BATCH);
6062306a36Sopenharmony_ci	P_MSG_FLAG(ZEROCOPY);
6162306a36Sopenharmony_ci	P_MSG_FLAG(SPLICE_PAGES);
6262306a36Sopenharmony_ci	P_MSG_FLAG(FASTOPEN);
6362306a36Sopenharmony_ci	P_MSG_FLAG(CMSG_CLOEXEC);
6462306a36Sopenharmony_ci#undef P_MSG_FLAG
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	if (flags)
6762306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	return printed;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define SCA_MSG_FLAGS syscall_arg__scnprintf_msg_flags
73