diff options
Diffstat (limited to 'src/basic/socket-util.h')
-rw-r--r-- | src/basic/socket-util.h | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/basic/socket-util.h b/src/basic/socket-util.h index 7d504319a8..b323b1b99f 100644 --- a/src/basic/socket-util.h +++ b/src/basic/socket-util.h @@ -183,17 +183,22 @@ int flush_accept(int fd); * riscv32. */ #define CMSG_TYPED_DATA(cmsg, type) \ ({ \ - struct cmsghdr *_cmsg = cmsg; \ - assert_cc(__alignof__(type) <= __alignof__(struct cmsghdr)); \ + struct cmsghdr *_cmsg = (cmsg); \ + assert_cc(alignof(type) <= alignof(struct cmsghdr)); \ _cmsg ? CAST_ALIGN_PTR(type, CMSG_DATA(_cmsg)) : (type*) NULL; \ }) struct cmsghdr* cmsg_find(struct msghdr *mh, int level, int type, socklen_t length); +void* cmsg_find_and_copy_data(struct msghdr *mh, int level, int type, void *buf, size_t buf_len); /* Type-safe, dereferencing version of cmsg_find() */ #define CMSG_FIND_DATA(mh, level, type, ctype) \ CMSG_TYPED_DATA(cmsg_find(mh, level, type, CMSG_LEN(sizeof(ctype))), ctype) +/* Type-safe version of cmsg_find_and_copy_data() */ +#define CMSG_FIND_AND_COPY_DATA(mh, level, type, ctype) \ + (ctype*) cmsg_find_and_copy_data(mh, level, type, &(ctype){}, sizeof(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" * structures. */ |