From: Lennart Poettering Date: Thu, 8 Dec 2022 16:48:34 +0000 (+0100) Subject: socket-util: add CMSG_TYPED_DATA() as type-safe wrapper around CMSG_DATA() X-Git-Tag: v253-rc1~326^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b6256af75e0609e451198ed90c293efd50827ab3;p=thirdparty%2Fsystemd.git socket-util: add CMSG_TYPED_DATA() as type-safe wrapper around CMSG_DATA() --- diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 2e36e1a56b6..0b8d53e8954 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -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"