diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | ext/socket/socket.c | 42 | ||||
-rw-r--r-- | test/socket/test_unix.rb | 26 |
3 files changed, 48 insertions, 25 deletions
@@ -1,3 +1,8 @@ +Sat Jul 2 22:41:04 2005 Tanaka Akira <akr@m17n.org> + + * ext/socket/socket.c (unix_send_io, unix_recv_io): support x86-64 and + IA64. + Sat Jul 2 17:06:23 2005 Tanaka Akira <akr@m17n.org> * defines.h (FLUSH_REGISTER_WINDOWS): defined for IA64. diff --git a/ext/socket/socket.c b/ext/socket/socket.c index 867088f084..4fb2ea899d 100644 --- a/ext/socket/socket.c +++ b/ext/socket/socket.c @@ -1779,9 +1779,9 @@ unix_send_io(sock, val) #if FD_PASSING_BY_MSG_CONTROL msg.msg_control = (caddr_t)&cmsg; - msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int); + msg.msg_controllen = CMSG_SPACE(sizeof(int)); msg.msg_flags = 0; - cmsg.hdr.cmsg_len = sizeof(struct cmsghdr) + sizeof(int); + cmsg.hdr.cmsg_len = CMSG_SPACE(0) + sizeof(int); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_RIGHTS; cmsg.fd = fd; @@ -1841,9 +1841,9 @@ unix_recv_io(argc, argv, sock) #if FD_PASSING_BY_MSG_CONTROL msg.msg_control = (caddr_t)&cmsg; - msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int); + msg.msg_controllen = CMSG_SPACE(sizeof(int)); msg.msg_flags = 0; - cmsg.hdr.cmsg_len = sizeof(struct cmsghdr) + sizeof(int); + cmsg.hdr.cmsg_len = CMSG_SPACE(0) + sizeof(int); cmsg.hdr.cmsg_level = SOL_SOCKET; cmsg.hdr.cmsg_type = SCM_RIGHTS; cmsg.fd = -1; @@ -1856,18 +1856,34 @@ unix_recv_io(argc, argv, sock) if (recvmsg(fptr->fd, &msg, 0) == -1) rb_sys_fail("recvmsg(2)"); - if ( #if FD_PASSING_BY_MSG_CONTROL - msg.msg_controllen != sizeof(struct cmsghdr) + sizeof(int) || - cmsg.hdr.cmsg_len != sizeof(struct cmsghdr) + sizeof(int) || - cmsg.hdr.cmsg_level != SOL_SOCKET || - cmsg.hdr.cmsg_type != SCM_RIGHTS + if (msg.msg_controllen != CMSG_SPACE(sizeof(int))) { + rb_raise(rb_eSocket, + "file descriptor was not passed (msg_controllen : %d != %d)", + msg.msg_controllen, CMSG_SPACE(sizeof(int))); + } + if (cmsg.hdr.cmsg_len != CMSG_SPACE(0) + sizeof(int)) { + rb_raise(rb_eSocket, + "file descriptor was not passed (cmsg_len : %d != %d)", + cmsg.hdr.cmsg_len, CMSG_SPACE(0) + sizeof(int)); + } + if (cmsg.hdr.cmsg_level != SOL_SOCKET) { + rb_raise(rb_eSocket, + "file descriptor was not passed (cmsg_level : %d != %d)", + 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)", + cmsg.hdr.cmsg_type, SCM_RIGHTS); + } #else - msg.msg_accrightslen != sizeof(fd) -#endif - ) { - rb_raise(rb_eSocket, "file descriptor was not passed"); + if (msg.msg_accrightslen != sizeof(fd)) { + rb_raise(rb_eSocket, + "file descriptor was not passed (accrightslen) : %d != %d", + msg.msg_accrightslen, sizeof(fd)); } +#endif #if FD_PASSING_BY_MSG_CONTROL fd = cmsg.fd; diff --git a/test/socket/test_unix.rb b/test/socket/test_unix.rb index 1314fca1f8..b1c0a38537 100644 --- a/test/socket/test_unix.rb +++ b/test/socket/test_unix.rb @@ -9,20 +9,22 @@ class TestUNIXSocket < Test::Unit::TestCase r1, w = IO.pipe s1, s2 = UNIXSocket.pair begin - s1.send_io r1 + s1.send_io(nil) rescue NotImplementedError - s1.close assert_raise(NotImplementedError) { s2.recv_io } - return + rescue TypeError + s1.send_io(r1) + r2 = s2.recv_io + assert_equal(r1.stat.ino, r2.stat.ino) + assert_not_equal(r1.fileno, r2.fileno) + w.syswrite "a" + assert_equal("a", r2.sysread(10)) + ensure + s1.close + s2.close + w.close + r1.close + r2.close if r2 && !r2.closed? end - r2 = s2.recv_io - assert_equal(r1.stat.ino, r2.stat.ino) - assert_not_equal(r1.fileno, r2.fileno) - ensure - s1.close if s1 - s2.close if s2 - r1.close if r1 - r2.close if r2 - w.close if w end end if defined?(UNIXSocket) |