mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/socket/socket.c (unix_send_io, unix_recv_io): support x86-64 and
IA64. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8702 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
bd5487e383
commit
ddbe529c62
3 changed files with 49 additions and 26 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>
|
Sat Jul 2 17:06:23 2005 Tanaka Akira <akr@m17n.org>
|
||||||
|
|
||||||
* defines.h (FLUSH_REGISTER_WINDOWS): defined for IA64.
|
* defines.h (FLUSH_REGISTER_WINDOWS): defined for IA64.
|
||||||
|
|
|
@ -1779,9 +1779,9 @@ unix_send_io(sock, val)
|
||||||
|
|
||||||
#if FD_PASSING_BY_MSG_CONTROL
|
#if FD_PASSING_BY_MSG_CONTROL
|
||||||
msg.msg_control = (caddr_t)&cmsg;
|
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;
|
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_level = SOL_SOCKET;
|
||||||
cmsg.hdr.cmsg_type = SCM_RIGHTS;
|
cmsg.hdr.cmsg_type = SCM_RIGHTS;
|
||||||
cmsg.fd = fd;
|
cmsg.fd = fd;
|
||||||
|
@ -1841,9 +1841,9 @@ unix_recv_io(argc, argv, sock)
|
||||||
|
|
||||||
#if FD_PASSING_BY_MSG_CONTROL
|
#if FD_PASSING_BY_MSG_CONTROL
|
||||||
msg.msg_control = (caddr_t)&cmsg;
|
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;
|
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_level = SOL_SOCKET;
|
||||||
cmsg.hdr.cmsg_type = SCM_RIGHTS;
|
cmsg.hdr.cmsg_type = SCM_RIGHTS;
|
||||||
cmsg.fd = -1;
|
cmsg.fd = -1;
|
||||||
|
@ -1856,18 +1856,34 @@ unix_recv_io(argc, argv, sock)
|
||||||
if (recvmsg(fptr->fd, &msg, 0) == -1)
|
if (recvmsg(fptr->fd, &msg, 0) == -1)
|
||||||
rb_sys_fail("recvmsg(2)");
|
rb_sys_fail("recvmsg(2)");
|
||||||
|
|
||||||
if (
|
|
||||||
#if FD_PASSING_BY_MSG_CONTROL
|
#if FD_PASSING_BY_MSG_CONTROL
|
||||||
msg.msg_controllen != sizeof(struct cmsghdr) + sizeof(int) ||
|
if (msg.msg_controllen != CMSG_SPACE(sizeof(int))) {
|
||||||
cmsg.hdr.cmsg_len != sizeof(struct cmsghdr) + sizeof(int) ||
|
rb_raise(rb_eSocket,
|
||||||
cmsg.hdr.cmsg_level != SOL_SOCKET ||
|
"file descriptor was not passed (msg_controllen : %d != %d)",
|
||||||
cmsg.hdr.cmsg_type != SCM_RIGHTS
|
msg.msg_controllen, CMSG_SPACE(sizeof(int)));
|
||||||
#else
|
|
||||||
msg.msg_accrightslen != sizeof(fd)
|
|
||||||
#endif
|
|
||||||
) {
|
|
||||||
rb_raise(rb_eSocket, "file descriptor was not passed");
|
|
||||||
}
|
}
|
||||||
|
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
|
||||||
|
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
|
#if FD_PASSING_BY_MSG_CONTROL
|
||||||
fd = cmsg.fd;
|
fd = cmsg.fd;
|
||||||
|
|
|
@ -9,20 +9,22 @@ class TestUNIXSocket < Test::Unit::TestCase
|
||||||
r1, w = IO.pipe
|
r1, w = IO.pipe
|
||||||
s1, s2 = UNIXSocket.pair
|
s1, s2 = UNIXSocket.pair
|
||||||
begin
|
begin
|
||||||
s1.send_io r1
|
s1.send_io(nil)
|
||||||
rescue NotImplementedError
|
rescue NotImplementedError
|
||||||
s1.close
|
|
||||||
assert_raise(NotImplementedError) { s2.recv_io }
|
assert_raise(NotImplementedError) { s2.recv_io }
|
||||||
return
|
rescue TypeError
|
||||||
end
|
s1.send_io(r1)
|
||||||
r2 = s2.recv_io
|
r2 = s2.recv_io
|
||||||
assert_equal(r1.stat.ino, r2.stat.ino)
|
assert_equal(r1.stat.ino, r2.stat.ino)
|
||||||
assert_not_equal(r1.fileno, r2.fileno)
|
assert_not_equal(r1.fileno, r2.fileno)
|
||||||
|
w.syswrite "a"
|
||||||
|
assert_equal("a", r2.sysread(10))
|
||||||
ensure
|
ensure
|
||||||
s1.close if s1
|
s1.close
|
||||||
s2.close if s2
|
s2.close
|
||||||
r1.close if r1
|
w.close
|
||||||
r2.close if r2
|
r1.close
|
||||||
w.close if w
|
r2.close if r2 && !r2.closed?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end if defined?(UNIXSocket)
|
end if defined?(UNIXSocket)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue