diff options
author | Jesus Cea <jcea@jcea.es> | 2011-09-10 02:04:09 (GMT) |
---|---|---|
committer | Jesus Cea <jcea@jcea.es> | 2011-09-10 02:04:09 (GMT) |
commit | bbd8bec3892254844bd1eac71569438a0c6ef5e4 (patch) | |
tree | 5cb8e93b16bc42cc777bbd92b3d321343e4bc127 /Modules/_multiprocessing | |
parent | 54b01498e37a1d9bbad02a3e8c3c8106f68e6820 (diff) | |
download | cpython-bbd8bec3892254844bd1eac71569438a0c6ef5e4.zip cpython-bbd8bec3892254844bd1eac71569438a0c6ef5e4.tar.gz cpython-bbd8bec3892254844bd1eac71569438a0c6ef5e4.tar.bz2 |
Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Diffstat (limited to 'Modules/_multiprocessing')
-rw-r--r-- | Modules/_multiprocessing/multiprocessing.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/Modules/_multiprocessing/multiprocessing.c b/Modules/_multiprocessing/multiprocessing.c index 1987b95..f6c2259 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -86,31 +86,37 @@ ProcessingCtrlHandler(DWORD dwCtrlType) /* Functions for transferring file descriptors between processes. Reimplements some of the functionality of the fdcred module at http://www.mca-ltd.com/resources/fdcred_1.tgz. */ +/* Based in http://resin.csoft.net/cgi-bin/man.cgi?section=3&topic=CMSG_DATA */ static PyObject * multiprocessing_sendfd(PyObject *self, PyObject *args) { int conn, fd, res; - char dummy_char; - char buf[CMSG_SPACE(sizeof(int))]; - struct msghdr msg = {0}; struct iovec dummy_iov; + char dummy_char; + struct msghdr msg; struct cmsghdr *cmsg; + union { + struct cmsghdr hdr; + unsigned char buf[CMSG_SPACE(sizeof(int))]; + } cmsgbuf; if (!PyArg_ParseTuple(args, "ii", &conn, &fd)) return NULL; dummy_iov.iov_base = &dummy_char; dummy_iov.iov_len = 1; - msg.msg_control = buf; - msg.msg_controllen = sizeof(buf); + + memset(&msg, 0, sizeof(msg)); + msg.msg_control = &cmsgbuf.buf; + msg.msg_controllen = sizeof(cmsgbuf.buf); msg.msg_iov = &dummy_iov; msg.msg_iovlen = 1; + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_len = CMSG_LEN(sizeof(int)); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; - cmsg->cmsg_len = CMSG_LEN(sizeof(int)); - msg.msg_controllen = cmsg->cmsg_len; * (int *) CMSG_DATA(cmsg) = fd; Py_BEGIN_ALLOW_THREADS @@ -127,20 +133,26 @@ multiprocessing_recvfd(PyObject *self, PyObject *args) { int conn, fd, res; char dummy_char; - char buf[CMSG_SPACE(sizeof(int))]; - struct msghdr msg = {0}; struct iovec dummy_iov; + struct msghdr msg = {0}; struct cmsghdr *cmsg; + union { + struct cmsghdr hdr; + unsigned char buf[CMSG_SPACE(sizeof(int))]; + } cmsgbuf; if (!PyArg_ParseTuple(args, "i", &conn)) return NULL; dummy_iov.iov_base = &dummy_char; dummy_iov.iov_len = 1; - msg.msg_control = buf; - msg.msg_controllen = sizeof(buf); + + memset(&msg, 0, sizeof(msg)); + msg.msg_control = &cmsgbuf.buf; + msg.msg_controllen = sizeof(cmsgbuf.buf); msg.msg_iov = &dummy_iov; msg.msg_iovlen = 1; + cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; |