diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-04-25 11:00:37 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-04-25 11:00:37 +0000 |
commit | 32b6bd32328a3e3404a8aad53f53243d29c758ae (patch) | |
tree | 84d0ddb0847571ba2c5accbb2436f1e8ac0b6d55 /ext/socket/socket.c | |
parent | 909f0b13b75a38c40b9c1ac9dac89a81c4ddb64d (diff) |
* ext/socket/socket.c (unix_send_io, unix_recv_io): use CMSG_DATA to
align file descriptor appropriately.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@12218 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/socket/socket.c')
-rw-r--r-- | ext/socket/socket.c | 24 |
1 files changed, 12 insertions, 12 deletions
diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 4c23a1c178..179c13fce5 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1956,7 +1956,7 @@ unix_send_io(sock, val) #if FD_PASSING_BY_MSG_CONTROL struct { struct cmsghdr hdr; - int fd; + char pad[8+sizeof(int)+8]; } cmsg; #endif @@ -1986,12 +1986,12 @@ unix_send_io(sock, val) #if FD_PASSING_BY_MSG_CONTROL msg.msg_control = (caddr_t)&cmsg; - msg.msg_controllen = CMSG_SPACE(sizeof(int)); + msg.msg_controllen = CMSG_LEN(sizeof(int)); msg.msg_flags = 0; cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int)); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_RIGHTS; - cmsg.fd = fd; + *(int *)CMSG_DATA(&cmsg.hdr) = fd; #else msg.msg_accrights = (caddr_t)&fd; msg.msg_accrightslen = sizeof(fd); @@ -2037,7 +2037,7 @@ unix_recv_io(argc, argv, sock) #if FD_PASSING_BY_MSG_CONTROL struct { struct cmsghdr hdr; - int fd; + char pad[8+sizeof(int)+8]; } cmsg; #endif @@ -2066,7 +2066,7 @@ unix_recv_io(argc, argv, sock) cmsg.hdr.cmsg_len = CMSG_LEN(sizeof(int)); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_RIGHTS; - cmsg.fd = -1; + *(int *)CMSG_DATA(&cmsg.hdr) = -1; #else msg.msg_accrights = (caddr_t)&fd; msg.msg_accrightslen = sizeof(fd); @@ -2079,22 +2079,22 @@ unix_recv_io(argc, argv, sock) #if FD_PASSING_BY_MSG_CONTROL if (msg.msg_controllen != CMSG_SPACE(sizeof(int))) { rb_raise(rb_eSocket, - "file descriptor was not passed (msg_controllen : %d != %d)", + "file descriptor was not passed (msg_controllen=%d, %d expected)", msg.msg_controllen, CMSG_SPACE(sizeof(int))); } - if (cmsg.hdr.cmsg_len != CMSG_SPACE(0) + sizeof(int)) { + if (cmsg.hdr.cmsg_len != CMSG_LEN(sizeof(int))) { rb_raise(rb_eSocket, - "file descriptor was not passed (cmsg_len : %d != %d)", - cmsg.hdr.cmsg_len, CMSG_SPACE(0) + sizeof(int)); + "file descriptor was not passed (cmsg_len=%d, %d expected)", + cmsg.hdr.cmsg_len, CMSG_LEN(sizeof(int))); } if (cmsg.hdr.cmsg_level != SOL_SOCKET) { rb_raise(rb_eSocket, - "file descriptor was not passed (cmsg_level : %d != %d)", + "file descriptor was not passed (cmsg_level=%d, %d expected)", cmsg.hdr.cmsg_level, SOL_SOCKET); } if (cmsg.hdr.cmsg_type != SCM_RIGHTS) { rb_raise(rb_eSocket, - "file descriptor was not passed (cmsg_type : %d != %d)", + "file descriptor was not passed (cmsg_type=%d, %d expected)", cmsg.hdr.cmsg_type, SCM_RIGHTS); } #else @@ -2106,7 +2106,7 @@ unix_recv_io(argc, argv, sock) #endif #if FD_PASSING_BY_MSG_CONTROL - fd = cmsg.fd; + fd = *(int *)CMSG_DATA(&cmsg.hdr); #endif if (klass == Qnil) |