aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/socket/socket.c42
-rw-r--r--test/socket/test_unix.rb26
3 files changed, 48 insertions, 25 deletions
diff --git a/ChangeLog b/ChangeLog
index 2a1e4d70cd..90cc7b2b66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)