From e013035f526f87050149c39d41fbf1af02447cee Mon Sep 17 00:00:00 2001 From: ruang Date: Tue, 8 Oct 2024 19:35:53 +0800 Subject: [PATCH 1/7] Create 2024-10-08-19-31-26.gh-issue-122153.LArURA.rst --- .../next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst diff --git a/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst b/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst new file mode 100644 index 00000000000000..bf757cf3017fb0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst @@ -0,0 +1 @@ +:mod:`socket` supports `sendmsg`, `recvmsg` on `windows` From 22a8b9754e74dc6c04a8df556236aaa6b61f4163 Mon Sep 17 00:00:00 2001 From: ruang Date: Tue, 8 Oct 2024 19:37:00 +0800 Subject: [PATCH 2/7] Change NEWS --- .../next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst b/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst index bf757cf3017fb0..212883c0c21be4 100644 --- a/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst +++ b/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst @@ -1 +1 @@ -:mod:`socket` supports `sendmsg`, `recvmsg` on `windows` +:mod:`socket` supports :meth:`sendmsg`, :meth:`recvmsg` on `windows` From 810f83830fb94acd38695f877ea023df05121c1f Mon Sep 17 00:00:00 2001 From: ruang Date: Wed, 9 Oct 2024 16:39:06 +0800 Subject: [PATCH 3/7] Add ws2 header file --- Modules/socketmodule.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h index 09fd70f351f1d8..a904ada17f866d 100644 --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -12,6 +12,8 @@ #else /* MS_WINDOWS */ # include +# include +# include /* * If Windows has bluetooth support, include bluetooth constants. From 71762ecdeed2e8d5fe3956929b70c1cca05191b3 Mon Sep 17 00:00:00 2001 From: ruang Date: Wed, 9 Oct 2024 18:54:53 +0800 Subject: [PATCH 4/7] Migrate to windows platform --- Modules/socketmodule.c | 177 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 174 insertions(+), 3 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 3ffdaa45f16ac7..7d7987c5a11cac 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -461,7 +461,13 @@ remove_unusable_flags(PyObject *m) #endif // HAVE_GETNAMEINFO #ifdef MS_WINDOWS -#define SOCKETCLOSE closesocket +typedef SSIZE_T ssize_t; +#define CMSG_LEN WSA_CMSG_LEN +#define CMSG_DATA WSA_CMSG_DATA +#define CMSG_SPACE WSA_CMSG_SPACE +#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR +#define CMSG_NXTHDR WSA_CMSG_NXTHDR +#define SOCKETCLOSE closesocket #endif #ifdef MS_WIN32 @@ -2755,14 +2761,22 @@ get_CMSG_SPACE(size_t length, size_t *result) pointer in msg->msg_control with at least "space" bytes after it, and its cmsg_len member inside the buffer. */ static int +#ifdef MS_WINDOWS +cmsg_min_space(WSAMSG *msg, WSACMSGHDR *cmsgh, size_t space) +#else cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) +#endif /* !MS_WINDOWS */ { size_t cmsg_offset; static const size_t cmsg_len_end = (offsetof(struct cmsghdr, cmsg_len) + sizeof(cmsgh->cmsg_len)); /* Note that POSIX allows msg_controllen to be of signed type. */ +#ifdef MS_WINDOWS + if (cmsgh == NULL || &msg->Control == NULL) +#else if (cmsgh == NULL || msg->msg_control == NULL) +#endif /* !MS_WINDOWS */ return 0; /* Note that POSIX allows msg_controllen to be of a signed type. This is annoying under OS X as it's unsigned there and so it triggers a @@ -2777,7 +2791,11 @@ cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wtype-limits" #endif +#ifdef MS_WINDOWS + if (msg->Control.len < 0) +#else if (msg->msg_controllen < 0) +#endif /* !MS_WINDOWS */ return 0; #if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))) #pragma GCC diagnostic pop @@ -2787,9 +2805,15 @@ cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) #endif if (space < cmsg_len_end) space = cmsg_len_end; +#ifdef MS_WINDOWS + cmsg_offset = (char*)cmsgh - (char*)msg->Control.buf; + return (cmsg_offset <= (size_t)-1 - space && + cmsg_offset + space <= msg->Control.len); +#else cmsg_offset = (char *)cmsgh - (char *)msg->msg_control; return (cmsg_offset <= (size_t)-1 - space && cmsg_offset + space <= msg->msg_controllen); +#endif /* !MS_WINDOWS */ } /* If pointer CMSG_DATA(cmsgh) is in buffer msg->msg_control, set @@ -2797,17 +2821,28 @@ cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) true; otherwise, return false. Assumes cmsgh, msg->msg_control and msg->msg_controllen are valid. */ static int +#ifdef MS_WINDOWS +get_cmsg_data_space(WSAMSG * msg, WSACMSGHDR *cmsgh, size_t* space) +#else get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) +#endif /* !MS_WINDOWS */ { size_t data_offset; char *data_ptr; if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; +#ifdef MS_WINDOWS + data_offset = data_ptr - (char*)msg->Control.buf; + if (data_offset > msg->Control.len) + return 0; + *space = msg->Control.len - data_offset; +#else data_offset = data_ptr - (char *)msg->msg_control; if (data_offset > msg->msg_controllen) return 0; *space = msg->msg_controllen - data_offset; +#endif /* !MS_WINDOWS */ return 1; } @@ -4000,7 +4035,11 @@ Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address i CMSG_LEN(). See the comment near get_CMSG_LEN(). */ #ifdef CMSG_LEN struct sock_recvmsg { +#ifdef MS_WINDOWS + WSAMSG *msg; +#else struct msghdr *msg; +#endif /* !MS_WINDOWS */ int flags; ssize_t result; }; @@ -4010,7 +4049,17 @@ sock_recvmsg_impl(PySocketSockObject *s, void *data) { struct sock_recvmsg *ctx = data; +#ifdef MS_WINDOWS + DWORD ret; + LPFN_WSARECVMSG recvmsg; + int status = WSAIoctl(s->sock_fd, SIO_GET_EXTENSION_FUNCTION_POINTER, + &(GUID)WSAID_WSARECVMSG, sizeof((GUID)WSAID_WSARECVMSG), + &recvmsg, sizeof(recvmsg), + &ret, NULL, NULL); + ctx->result = recvmsg(s->sock_fd, ctx->msg, &ret, NULL, NULL); +#else ctx->result = recvmsg(s->sock_fd, ctx->msg, ctx->flags); +#endif /* !MS_WINDOWS */ return (ctx->result >= 0); } @@ -4025,13 +4074,23 @@ sock_recvmsg_impl(PySocketSockObject *s, void *data) * SCM_RIGHTS. */ static PyObject * +#ifdef MS_WINDOWS +sock_recvmsg_guts(PySocketSockObject *s, WSABUF *iov, int iovlen, + int flags, Py_ssize_t controllen, + PyObject *(*makeval)(ssize_t, void *), void *makeval_data) +#else sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen, int flags, Py_ssize_t controllen, PyObject *(*makeval)(ssize_t, void *), void *makeval_data) +#endif /* !MS_WINDOWS */ { sock_addr_t addrbuf; socklen_t addrbuflen; +#ifdef MS_WINDOWS + WSAMSG msg = {0}; +#else struct msghdr msg = {0}; +#endif /* !MS_WINDWS */ PyObject *cmsg_list = NULL, *retval = NULL; void *controlbuf = NULL; struct cmsghdr *cmsgh; @@ -4064,12 +4123,21 @@ sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen, goto finally; } +#ifdef MS_WINDOWS + msg.name = SAS2SA(&addrbuf); + msg.namelen = addrbuflen; + msg.lpBuffers = iov; + msg.dwBufferCount = iovlen; + msg.Control.buf = controlbuf; + msg.Control.len = controllen; +#else msg.msg_name = SAS2SA(&addrbuf); msg.msg_namelen = addrbuflen; msg.msg_iov = iov; msg.msg_iovlen = iovlen; msg.msg_control = controlbuf; msg.msg_controllen = controllen; +#endif /* !MS_WINDOWS */ ctx.msg = &msg; ctx.flags = flags; @@ -4081,7 +4149,11 @@ sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen, goto err_closefds; /* Check for empty ancillary data as old CMSG_FIRSTHDR() implementations didn't do so. */ +#ifdef MS_WINDOWS + for (cmsgh = ((msg.Control.len > 0) ? CMSG_FIRSTHDR(&msg) : NULL); +#else for (cmsgh = ((msg.msg_controllen > 0) ? CMSG_FIRSTHDR(&msg) : NULL); +#endif /* !MS_WINDOWS */ cmsgh != NULL; cmsgh = CMSG_NXTHDR(&msg, cmsgh)) { PyObject *bytes, *tuple; int tmp; @@ -4118,10 +4190,17 @@ sock_recvmsg_guts(PySocketSockObject *s, struct iovec *iov, int iovlen, retval = Py_BuildValue("NOiN", (*makeval)(ctx.result, makeval_data), cmsg_list, +#ifdef MS_WINDOWS + (int)msg.dwFlags, + makesockaddr(s->sock_fd, SAS2SA(&addrbuf), + ((msg.namelen > addrbuflen) ? + addrbuflen : msg.namelen), +#else (int)msg.msg_flags, makesockaddr(s->sock_fd, SAS2SA(&addrbuf), ((msg.msg_namelen > addrbuflen) ? addrbuflen : msg.msg_namelen), +#endif /* !MS_WINDOWS */ s->sock_proto)); if (retval == NULL) goto err_closefds; @@ -4174,7 +4253,11 @@ sock_recvmsg(PySocketSockObject *s, PyObject *args) { Py_ssize_t bufsize, ancbufsize = 0; int flags = 0; +#ifdef MS_WINDOWS + WSABUF iov; +#else struct iovec iov; +#endif /* !MS_WINDOWS */ PyObject *buf = NULL, *retval = NULL; if (!PyArg_ParseTuple(args, "n|ni:recvmsg", &bufsize, &ancbufsize, &flags)) @@ -4186,8 +4269,13 @@ sock_recvmsg(PySocketSockObject *s, PyObject *args) } if ((buf = PyBytes_FromStringAndSize(NULL, bufsize)) == NULL) return NULL; +#ifdef MS_WINDOWS + iov.buf = PyBytes_AS_STRING(buf); + iov.len = bufsize; +#else iov.iov_base = PyBytes_AS_STRING(buf); iov.iov_len = bufsize; +#endif /* !MS_WINDOWS */ /* Note that we're passing a pointer to *our pointer* to the bytes object here (&buf); makeval_recvmsg() may incref the object, or @@ -4241,7 +4329,11 @@ sock_recvmsg_into(PySocketSockObject *s, PyObject *args) { Py_ssize_t ancbufsize = 0; int flags = 0; +#ifdef MS_WINDOWS + WSABUF *iovs = NULL; +#else struct iovec *iovs = NULL; +#endif /* !MS_WINDOWS */ Py_ssize_t i, nitems, nbufs = 0; Py_buffer *bufs = NULL; PyObject *buffers_arg, *fast, *retval = NULL; @@ -4262,8 +4354,13 @@ sock_recvmsg_into(PySocketSockObject *s, PyObject *args) /* Fill in an iovec for each item, and save the Py_buffer structs to release afterwards. */ +#ifdef MS_WINDOWS + if (nitems > 0 && ((iovs = PyMem_New(WSABUF, nitems)) == NULL || + (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) { +#else if (nitems > 0 && ((iovs = PyMem_New(struct iovec, nitems)) == NULL || (bufs = PyMem_New(Py_buffer, nitems)) == NULL)) { +#endif /* !MS_WINDOWS */ PyErr_NoMemory(); goto finally; } @@ -4273,8 +4370,13 @@ sock_recvmsg_into(PySocketSockObject *s, PyObject *args) "of single-segment read-write buffers", &bufs[nbufs])) goto finally; +#ifdef MS_WINDOWS + iovs[nbufs].buf = bufs[nbufs].buf; + iovs[nbufs].len = bufs[nbufs].len; +#else iovs[nbufs].iov_base = bufs[nbufs].buf; iovs[nbufs].iov_len = bufs[nbufs].len; +#endif /* !MS_WINDOWS */ } retval = sock_recvmsg_guts(s, iovs, nitems, flags, ancbufsize, @@ -4559,18 +4661,33 @@ For IP sockets, the address is a pair (hostaddr, port)."); CMSG_LEN(). See the comment near get_CMSG_LEN(). */ #ifdef CMSG_LEN struct sock_sendmsg { +#ifdef MS_WINDOWS + WSAMSG *msg; +#else struct msghdr *msg; +#endif /* !MS_WINDOWS */ int flags; ssize_t result; }; static int +#ifdef MS_WINDOWS +sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg, + WSAMSG *msg, + Py_buffer **databufsout, Py_ssize_t *ndatabufsout) +#else sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg, struct msghdr *msg, - Py_buffer **databufsout, Py_ssize_t *ndatabufsout) { + Py_buffer **databufsout, Py_ssize_t *ndatabufsout) +#endif /* !MS_WINDOWS */ +{ Py_ssize_t ndataparts, ndatabufs = 0; int result = -1; +#ifdef MS_WINDOWS + WSABUF *iovs = NULL; +#else struct iovec *iovs = NULL; +#endif /* !MS_WINDOWS */ PyObject *data_fast = NULL; Py_buffer *databufs = NULL; @@ -4589,14 +4706,27 @@ sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg, goto finally; } +#ifdef MS_WINDOWS + msg->dwBufferCount = ndataparts; +#else msg->msg_iovlen = ndataparts; +#endif /* !MS_WINDOWS */ if (ndataparts > 0) { +#ifdef MS_WINDOWS + iovs = PyMem_New(WSABUF, ndataparts); + if (iovs == NULL) { + PyErr_NoMemory(); + goto finally; + } + msg->lpBuffers = iovs; +#else iovs = PyMem_New(struct iovec, ndataparts); if (iovs == NULL) { PyErr_NoMemory(); goto finally; } msg->msg_iov = iovs; +#endif /* !MS_WINDOWS */ databufs = PyMem_New(Py_buffer, ndataparts); if (databufs == NULL) { @@ -4610,8 +4740,13 @@ sock_sendmsg_iovec(PySocketSockObject *s, PyObject *data_arg, "bytes-like objects", &databufs[ndatabufs])) goto finally; +#ifdef MS_WINDOWS + iovs[ndatabufs].buf = databufs[ndatabufs].buf; + iovs[ndatabufs].len = databufs[ndatabufs].len; +#else iovs[ndatabufs].iov_base = databufs[ndatabufs].buf; iovs[ndatabufs].iov_len = databufs[ndatabufs].len; +#endif /* !MS_WINDOWS */ } result = 0; finally: @@ -4626,7 +4761,18 @@ sock_sendmsg_impl(PySocketSockObject *s, void *data) { struct sock_sendmsg *ctx = data; +#ifdef MS_WINDOWS + DWORD ret; + LPFN_WSASENDMSG sendmsg; + int status = WSAIoctl(s->sock_fd, SIO_GET_EXTENSION_FUNCTION_POINTER, + &(GUID)WSAID_WSASENDMSG, sizeof((GUID)WSAID_WSASENDMSG), + &sendmsg, sizeof(sendmsg), + &ret, NULL, NULL); + ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags, &ret, + NULL, NULL); +#else ctx->result = sendmsg(s->sock_fd, ctx->msg, ctx->flags); +#endif /* !MS_WINDOWS */ return (ctx->result >= 0); } @@ -4638,7 +4784,11 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) Py_ssize_t i, ndatabufs = 0, ncmsgs, ncmsgbufs = 0; Py_buffer *databufs = NULL; sock_addr_t addrbuf; +#ifdef MS_WINDOWS + WSAMSG msg; +#else struct msghdr msg; +#endif /* !MS_WINDOWS */ struct cmsginfo { int level; int type; @@ -4668,8 +4818,13 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) if (PySys_Audit("socket.sendmsg", "OO", s, addr_arg) < 0) { return NULL; } +#ifdef MS_WINDOWS + msg.name = &addrbuf; + msg.namelen = addrlen; +#else msg.msg_name = &addrbuf; msg.msg_namelen = addrlen; +#endif /* !MS_WINDOWS */ } else { if (PySys_Audit("socket.sendmsg", "OO", s, Py_None) < 0) { return NULL; @@ -4702,7 +4857,11 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) #endif /* Save level, type and Py_buffer for each control message, and calculate total size. */ +#ifdef MS_WINDOWS + if (ncmsgs > 0 && (cmsgs = PyMem_New(WSACMSGHDR, ncmsgs)) == NULL) { +#else if (ncmsgs > 0 && (cmsgs = PyMem_New(struct cmsginfo, ncmsgs)) == NULL) { +#endif /* !MS_WINDOWS */ PyErr_NoMemory(); goto finally; } @@ -4736,16 +4895,24 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) /* Construct ancillary data block from control message info. */ if (ncmsgbufs > 0) { +#ifdef MS_WINDOWS + WSACMSGHDR *cmsgh = NULL; +#else struct cmsghdr *cmsgh = NULL; +#endif /* !MS_WINDOWS */ controlbuf = PyMem_Malloc(controllen); if (controlbuf == NULL) { PyErr_NoMemory(); goto finally; } +#ifdef MS_WINDOWS + msg.Control.buf = controlbuf; + msg.Control.len = controllen; +#else msg.msg_control = controlbuf; - msg.msg_controllen = controllen; +#endif /* MS_WINDOWS */ /* Need to zero out the buffer as a workaround for glibc's CMSG_NXTHDR() implementation. After getting the pointer to @@ -4809,7 +4976,11 @@ sock_sendmsg(PySocketSockObject *s, PyObject *args) PyBuffer_Release(&cmsgs[i].data); PyMem_Free(cmsgs); Py_XDECREF(cmsg_fast); +#ifdef MS_WINDOWS + PyMem_Free(msg.lpBuffers); +#else PyMem_Free(msg.msg_iov); +#endif /* !MS_WINDOWS */ for (i = 0; i < ndatabufs; i++) { PyBuffer_Release(&databufs[i]); } From 3ce216e2fe5bc35788b6b643b3e1983b327752c1 Mon Sep 17 00:00:00 2001 From: ruang Date: Wed, 9 Oct 2024 19:15:58 +0800 Subject: [PATCH 5/7] Change NEWS --- .../Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst b/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst index 212883c0c21be4..800481c407e5b7 100644 --- a/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst +++ b/Misc/NEWS.d/next/Library/2024-10-08-19-31-26.gh-issue-122153.LArURA.rst @@ -1 +1,2 @@ -:mod:`socket` supports :meth:`sendmsg`, :meth:`recvmsg` on `windows` +:mod:`socket` supports :meth:`socket.socket.sendmsg`, +:meth:`socket.socket.recvmsg` on windows. From 623303d3b05e653552f12dc0b288943a28136b54 Mon Sep 17 00:00:00 2001 From: ruang Date: Wed, 9 Oct 2024 20:51:36 +0800 Subject: [PATCH 6/7] Add os platform condition --- Lib/asyncio/selector_events.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index f94bf10b4225e7..8212f8c8dff5e2 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -32,12 +32,15 @@ _HAS_SENDMSG = hasattr(socket.socket, 'sendmsg') -if _HAS_SENDMSG: +if _HAS_SENDMSG and os.name == 'posix': try: SC_IOV_MAX = os.sysconf('SC_IOV_MAX') except OSError: # Fallback to send _HAS_SENDMSG = False +else: + # XXX Will it be too big? + SC_IOV_MAX = 1024 def _test_selector_event(selector, fd, event): # Test if the selector is monitoring 'event' events From 59c068cea8a20c318aa13a21cfc877672967c2ec Mon Sep 17 00:00:00 2001 From: ruang Date: Wed, 9 Oct 2024 21:55:01 +0800 Subject: [PATCH 7/7] Change get_cmsg_data_space --- Modules/socketmodule.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 7d7987c5a11cac..d97d2b1c53d6a6 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -462,10 +462,15 @@ remove_unusable_flags(PyObject *m) #ifdef MS_WINDOWS typedef SSIZE_T ssize_t; +# undef CMSG_LEN #define CMSG_LEN WSA_CMSG_LEN +# undef CMSG_DATA #define CMSG_DATA WSA_CMSG_DATA +# undef CMSG_SPACE #define CMSG_SPACE WSA_CMSG_SPACE +# undef CMSG_FIRSTHDR #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR +# undef CMSG_NXTHDR #define CMSG_NXTHDR WSA_CMSG_NXTHDR #define SOCKETCLOSE closesocket #endif @@ -2822,7 +2827,7 @@ cmsg_min_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t space) msg->msg_controllen are valid. */ static int #ifdef MS_WINDOWS -get_cmsg_data_space(WSAMSG * msg, WSACMSGHDR *cmsgh, size_t* space) +get_cmsg_data_space(WSAMSG *msg, WSACMSGHDR *cmsgh, size_t *space) #else get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) #endif /* !MS_WINDOWS */ @@ -2833,7 +2838,7 @@ get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) if ((data_ptr = (char *)CMSG_DATA(cmsgh)) == NULL) return 0; #ifdef MS_WINDOWS - data_offset = data_ptr - (char*)msg->Control.buf; + data_offset = data_ptr - (char *)msg->Control.buf; if (data_offset > msg->Control.len) return 0; *space = msg->Control.len - data_offset; @@ -2854,7 +2859,11 @@ get_cmsg_data_space(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *space) valid, set *data_len to the length contained in the buffer and return 1. */ static int +#ifdef MS_WINDOWS +get_cmsg_data_len(WSAMSG *msg, WSACMSGHDR *cmsgh, size_t *data_len) +#else get_cmsg_data_len(struct msghdr *msg, struct cmsghdr *cmsgh, size_t *data_len) +#endif /* !MS_WINDOWS */ { size_t space, cmsg_data_len;