0
@@ -41,32 +41,32 @@ static VALUE mNativeSupport;
0
send_fd(VALUE self, VALUE socket_fd, VALUE fd_to_send) {
0
+ struct cmsghdr h
eader;
0
+ control.header.cmsg_len = sizeof(control);
0
+ control.header.cmsg_level = SOL_SOCKET;
0
+ control.header.cmsg_type = SCM_RIGHTS;
0
+ control.fd = NUM2INT(fd_to_send);
0
- /* Linux and Solaris doesn't work if msg_iov is NULL. */
0
- vec[0].iov_base = buf;
0
+ /* Linux and Solaris require msg_iov to be non-NULL.. */
0
+ vec.iov_len = sizeof(dummy);
0
- msg.msg_control = (caddr_t)&cmsg;
0
- msg.msg_controllen = CMSG_SPACE(sizeof(int));
0
- cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int));
0
- cmsg.hdr.cmsg_level = SOL_SOCKET;
0
- cmsg.hdr.cmsg_type = SCM_RIGHTS;
0
- cmsg.fd = NUM2INT(fd_to_send);
0
+ msg.msg_control = (caddr_t) &control;
0
+ msg.msg_controllen = sizeof(control);
0
if (sendmsg(NUM2INT(socket_fd), &msg, 0) == -1) {
0
rb_sys_fail("sendmsg(2)");
0
@@ -88,43 +88,46 @@ send_fd(VALUE self, VALUE socket_fd, VALUE fd_to_send) {
0
recv_fd(VALUE self, VALUE socket_fd) {
0
+ struct cmsghdr h
eader;
0
+ control.header.cmsg_len = sizeof(control);
0
+ control.header.cmsg_level = SOL_SOCKET;
0
+ control.header.cmsg_type = SCM_RIGHTS;
0
- vec[0].iov_base = buf;
0
- vec[0].iov_len = sizeof(buf);
0
+ vec.iov_len = sizeof(dummy);
0
- msg.msg_control = (caddr_t)&cmsg;
0
- msg.msg_controllen = CMSG_SPACE(sizeof(int));
0
- cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int));
0
- cmsg.hdr.cmsg_level = SOL_SOCKET;
0
- cmsg.hdr.cmsg_type = SCM_RIGHTS;
0
+ msg.msg_control = (caddr_t) &control;
0
+ msg.msg_controllen = sizeof(control);
0
if (recvmsg(NUM2INT(socket_fd), &msg, 0) == -1) {
0
rb_sys_fail("Cannot read file descriptor with recvmsg()");
0
- if (msg.msg_controllen != CMSG_SPACE(sizeof(int))
0
- || cmsg.hdr.cmsg_len != CMSG_SPACE(0) + sizeof(int)
0
- || cmsg.hdr.cmsg_level != SOL_SOCKET
0
- || cmsg.hdr.cmsg_type != SCM_RIGHTS) {
0
+ if (msg.msg_controllen != sizeof(control)
0
+ || control.header.cmsg_len != sizeof(control)
0
+ || control.header.cmsg_level != SOL_SOCKET
0
+ || control.header.cmsg_type != SCM_RIGHTS) {
0
rb_sys_fail("No valid file descriptor received.");
0
- return INT2NUM(c
msg.fd);
0
+ return INT2NUM(c
ontrol.fd);
Comments
No one has commented yet.