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 | ab7060e502fd05f0b78c9c9fbb960f374bb82c8b (patch) | |
tree | 9d644dbe6db75e125cafcfcf5526fe2aca0a116b /Modules | |
parent | da752d80c812bbb519adbaf60808d2161c0bf7fb (diff) | |
download | cpython-ab7060e502fd05f0b78c9c9fbb960f374bb82c8b.zip cpython-ab7060e502fd05f0b78c9c9fbb960f374bb82c8b.tar.gz cpython-ab7060e502fd05f0b78c9c9fbb960f374bb82c8b.tar.bz2 |
Close #12950: multiprocessing "test_fd_transfer" fails under OpenIndiana
Diffstat (limited to 'Modules')
-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 9de9279..bc635da 100644 --- a/Modules/_multiprocessing/multiprocessing.c +++ b/Modules/_multiprocessing/multiprocessing.c @@ -97,31 +97,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 @@ -138,20 +144,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; |