Re: [PATCH 2/4] include: Add macros for retrieving control message headers.
Erich Hoover <ehoover(a)mines.edu> writes:
@@ -185,6 +185,25 @@ VOID WINAPI GetAcceptExSockaddrs(PVOID, DWORD, DWORD, DWORD, struct WS(sockaddr) BOOL WINAPI TransmitFile(SOCKET, HANDLE, DWORD, DWORD, LPOVERLAPPED, LPTRANSMIT_FILE_BUFFERS, DWORD); INT WINAPI WSARecvEx(SOCKET, char *, INT, INT *);
+/* + * Macros for retrieving control message data returned by WSARecvMsg() + */ +#define WSA_CMSG_DATA(cmsg) ((UCHAR*)((WSACMSGHDR*)(cmsg)+1)) +#define WSA_CMSG_FIRSTHDR(mhdr) \ + ((size_t) (mhdr)->Control.len >= sizeof(WSACMSGHDR) \ + ? (WSACMSGHDR *) (mhdr)->Control.buf : (WSACMSGHDR *) 0) +#define WSA_CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \ + & (size_t) ~(sizeof (size_t) - 1)) +static inline WSACMSGHDR *WSA_CMSG_NXTHDR(WSAMSG *msg, WSACMSGHDR *cmsg) +{ + if ((size_t)(msg)->Control.len<sizeof(WSACMSGHDR)) return 0; + cmsg = (WSACMSGHDR*)((unsigned char*)cmsg + WSA_CMSG_ALIGN(cmsg->cmsg_len)); + if ((unsigned char*)(cmsg+1) > ((unsigned char*)msg->Control.buf + msg->Control.len) + || ((unsigned char*)cmsg + WSA_CMSG_ALIGN(cmsg->cmsg_len) > ((unsigned char *)msg->Control.buf + msg->Control.len)) ) + return 0; + return cmsg; +}
This should go into ws2def.h. Also WSA_CMSG_NXTHDR is supposed to be a macro, not an inline function. -- Alexandre Julliard julliard(a)winehq.org
participants (1)
-
Alexandre Julliard