]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
socket-util: add CMSG_TYPED_DATA() as type-safe wrapper around CMSG_DATA()
authorLennart Poettering <lennart@poettering.net>
Thu, 8 Dec 2022 16:48:34 +0000 (17:48 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 8 Dec 2022 16:48:34 +0000 (17:48 +0100)
src/basic/socket-util.h

index 2e36e1a56b6af9cec567fd73fab7b707af3c196e..0b8d53e8954257d03a3b523c2fe41b8a7170220f 100644 (file)
@@ -175,15 +175,17 @@ int flush_accept(int fd);
 #define CMSG_FOREACH(cmsg, mh)                                          \
         for ((cmsg) = CMSG_FIRSTHDR(mh); (cmsg); (cmsg) = CMSG_NXTHDR((mh), (cmsg)))
 
+#define CMSG_TYPED_DATA(cmsg, type)                                     \
+        ({                                                              \
+                struct cmsghdr *_cmsg = cmsg;                           \
+                _cmsg ? CAST_ALIGN_PTR(type, CMSG_DATA(_cmsg)) : (type*) NULL; \
+        })
+
 struct cmsghdr* cmsg_find(struct msghdr *mh, int level, int type, socklen_t length);
 
 /* Type-safe, dereferencing version of cmsg_find() */
-#define CMSG_FIND_DATA(mh, level, type, ctype) \
-        ({                                                            \
-                struct cmsghdr *_found;                               \
-                _found = cmsg_find(mh, level, type, CMSG_LEN(sizeof(ctype))); \
-                (ctype*) (_found ? CMSG_DATA(_found) : NULL);         \
-        })
+#define CMSG_FIND_DATA(mh, level, type, ctype)                          \
+        CMSG_TYPED_DATA(cmsg_find(mh, level, type, CMSG_LEN(sizeof(ctype))), ctype)
 
 /* Resolves to a type that can carry cmsghdr structures. Make sure things are properly aligned, i.e. the type
  * itself is placed properly in memory and the size is also aligned to what's appropriate for "cmsghdr"