From 1c1aaf6223ce41bb12bbb6799ab36a10949e21d3 Mon Sep 17 00:00:00 2001
From: Daniil Vinogradov <xitrix@bk.ru>
Date: Wed, 8 Mar 2023 14:57:38 +0100
Subject: [PATCH] added definitions to /sys/socket.h
---
nx/external/bsd/include/sys/socket.h | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/nx/external/bsd/include/sys/socket.h b/nx/external/bsd/include/sys/socket.h
index c8195dc2..d52ec8b9 100644
--- a/nx/external/bsd/include/sys/socket.h
+++ b/nx/external/bsd/include/sys/socket.h
@@ -440,6 +440,30 @@ struct cmsghdr {
// socket credential stuff, we don't need this
// cmsg macros, uses some obscure macro
+#define __ALIGNBYTES32 (sizeof(__uint32_t) - 1)
+#define __ALIGN32(p) ((__size_t)((char *)(__size_t)(p) + __ALIGNBYTES32) &~ __ALIGNBYTES32)
+
+/*
+ * RFC 2292 requires to check msg_controllen, in case that the kernel returns
+ * an empty list for some reasons.
+ */
+#define CMSG_FIRSTHDR(mhdr) \
+ ((mhdr)->msg_controllen >= sizeof(struct cmsghdr) ? \
+ (struct cmsghdr *)(mhdr)->msg_control : \
+ (struct cmsghdr *)NULL)
+
+
+/*
+ * Given pointer to struct cmsghdr, return pointer to next cmsghdr
+ * RFC 2292 says that CMSG_NXTHDR(mhdr, NULL) is equivalent to CMSG_FIRSTHDR(mhdr)
+ */
+#define CMSG_NXTHDR(mhdr, cmsg) \
+ (((char *)(cmsg) + __ALIGN32((cmsg)->cmsg_len) + \
+ __ALIGN32(sizeof(struct cmsghdr)) > \
+ ((char *)(mhdr)->msg_control) + (mhdr)->msg_controllen) ? \
+ (struct cmsghdr *)NULL : \
+ (struct cmsghdr *)((char *)(cmsg) + __ALIGN32((cmsg)->cmsg_len)))
+
/* "Socket"-level control message types: */
#define SCM_RIGHTS 0x01 /* access rights (array of int) */
#if __BSD_VISIBLE