[#15846] Ruby M17N request — "K.Kosako" <kosako@...>

今書いているライブラリを、あらかじめRuby M17Nに対応させておこうとして、

62 messages 2002/02/04
[#15847] Re: Ruby M17N request — matz@... (Yukihiro Matsumoto) 2002/02/04

まつもと ゆきひろです

[#15854] Re: Ruby M17N request — "K.Kosako" <kosako@...> 2002/02/05

Yukihiro Matsumotoさんの<1012831868.125952.28017.nullmailer@ev.netlab.jp>から

[#16070] Re: Ruby M17N request — "K.Kosako" <kosako@...> 2002/02/25

<20020205045749.0AAA015B@helium.ruby-lang.org>から

[#16072] Re: Ruby M17N request — "Akinori MUSHA" <knu@...> 2002/02/25

At Mon, 25 Feb 2002 19:57:05 +0900,

[#16073] Re: Ruby M17N request — "Akinori MUSHA" <knu@...> 2002/02/25

At Mon, 25 Feb 2002 21:00:46 +0900,

[#16173] Re: Ruby M17N request — "Akinori MUSHA" <knu@...> 2002/03/02

At Mon, 25 Feb 2002 19:57:05 +0900,

[#16196] Oni Guruma imported into our repository — "Akinori MUSHA" <knu@...> 2002/03/04

At Sun, 3 Mar 2002 07:15:40 +0900,

[#16275] Re: Oni Guruma imported into our repository — matz@... (Yukihiro Matsumoto) 2002/03/08

まつもと ゆきひろです

[#16222] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/05

なかだです。

[#16228] Re: Oni Guruma(Re: Ruby M17N request) — "K.Kosako" <kosako@...> 2002/03/06

nobu.nakada@nifty.ne.jpさんの

[#16237] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/06

なかだです。

[#16241] Re: Oni Guruma(Re: Ruby M17N request) — "K.Kosako" <kosako@...> 2002/03/07

nobu.nakada@nifty.ne.jpさんの

[#16242] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/07

なかだです。

[#16442] Re: Oni Guruma(Re: Ruby M17N request) — nobu.nakada@... 2002/03/17

なかだです。

[#15867] [BUG?] include after module definition and extend module — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

15 messages 2002/02/08
[#15869] Re: [BUG?] include after module definition and extend module — matz@... (Yukihiro Matsumoto) 2002/02/08

まつもと ゆきひろです

[#15932] Re: [BUG?] include after module definition and extend module — keiju@... (石塚圭樹) 2002/02/18

けいじゅ@日本ラショナルソフトウェアです.

[#15938] Re: [BUG?] include after module definition and extend module — matz@... (Yukihiro Matsumoto) 2002/02/18

まつもと ゆきひろです

[#15914] making net/*.rb grok URI — "Akinori MUSHA" <knu@...>

 net/*.rb モジュール群をぜひとも標準添付となった URI クラスに

30 messages 2002/02/17
[#15915] Re: making net/*.rb grok URI — "Akinori MUSHA" <knu@...> 2002/02/17

At Mon, 18 Feb 2002 04:33:42 +0900,

[#15931] Re: making net/*.rb grok URI — Minero Aoki <aamine@...> 2002/02/18

あおきです。

[#15934] Re: making net/*.rb grok URI — "Akinori MUSHA" <knu@...> 2002/02/18

At Mon, 18 Feb 2002 15:24:22 +0900,

[#15937] Re: making net/*.rb grok URI — Minero Aoki <aamine@...> 2002/02/18

あおきです。

[#15958] Re: making net/*.rb grok URI — TAKAHASHI Masayoshi <maki@...> 2002/02/19

高橋征義です。

[#15978] Re: making net/*.rb grok URI — Tanaka Akira <akr@...17n.org> 2002/02/19

In article <200202190432.NAA18796@mx.inac.co.jp>,

[#16002] Re: making net/*.rb grok URI — TAKAHASHI Masayoshi <maki@...> 2002/02/20

高橋征義です。

[#16013] Re: making net/*.rb grok URI — Tanaka Akira <akr@...17n.org> 2002/02/20

In article <20020221020159R.maki@rubycolor.org>,

[#15988] Re: [rubyist:1097] Re: % 記法 — nobu.nakada@...

なかだです。

21 messages 2002/02/20
[#17594] Re: [rubyist:1097] Re: % 記法 — nobu.nakada@... 2002/06/26

なかだです。

[#16049] defined? autoload constant — Kazuhiro NISHIYAMA <zn@...>

西山和広です。

35 messages 2002/02/24
[#16058] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/02/25

まつもと ゆきひろです

[#16298] Re: defined? autoload constant — nobu.nakada@... 2002/03/09

なかだです。

[#16304] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/09

まつもと ゆきひろです

[#16375] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/14

けいじゅ@日本ラショナルソフトウェアです.

[#16380] Re: defined? autoload constant — nobu.nakada@... 2002/03/14

なかだです。

[#16398] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/14

けいじゅ@日本ラショナルソフトウェアです.

[#16399] Re: defined? autoload constant — nobu.nakada@... 2002/03/14

なかだです。

[#16400] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/14

けいじゅ@日本ラショナルソフトウェアです.

[#16403] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/14

まつもと ゆきひろです

[#16407] Re: defined? autoload constant — nobu.nakada@... 2002/03/15

なかだです。

[#16409] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/15

まつもと ゆきひろです

[#16481] Re: defined? autoload constant — keiju@... (石塚圭樹) 2002/03/19

けいじゅ@日本ラショナルソフトウェアです.

[#16482] Re: defined? autoload constant — matz@... (Yukihiro Matsumoto) 2002/03/19

まつもと ゆきひろです

[#16082] Array#select without block — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

14 messages 2002/02/25

[#16102] No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...>

なひです。

21 messages 2002/02/26
[#16103] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#16109] Re: No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/02/26

なひです。

[#16110] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#16117] Re: No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/02/26

なひです。

[#16127] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/26

まつもと ゆきひろです

[#16133] Re: No trace_func event at if-elsif-else line — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/02/27

なひです。

[#16135] Re: No trace_func event at if-elsif-else line — matz@... (Yukihiro Matsumoto) 2002/02/27

まつもと ゆきひろです

[#16256] Rite debug API (was Re: No trace_func event at if-elsif-else line) — "NAKAMURA, Hiroshi" <nakahiro@...> 2002/03/07

なひです。どうせ一年も先の話なのでのんびりと。

[#16258] Re: Rite debug API (was Re: No trace_func event at if-elsif-else line) — matz@... (Yukihiro Matsumoto) 2002/03/07

まつもと ゆきひろです

[#16134] Defining (Python) Source Code Encoding — TAKAHASHI Masayoshi <maki@...>

高橋征義です。ruby-list の「localized document」ともやや関係あり?

13 messages 2002/02/27

[ruby-dev:16068] UNIXSocket#{send_io,recv_io}

From: Tanaka Akira <akr@...17n.org>
Date: 2002-02-25 08:42:41 UTC
List: ruby-dev #16068
しばらく前にふと気が向いて UNIXSocket#{send_io,recv_io} というものをでっ
ちあげました。これは send_msg, recv_msg で file descriptor を異なるプ
ロセス間で送れることを利用して IO を送るというものです。まぁ、だいたい
のシステムで動くようです。

個人的にはとくに用途がないので死蔵してたんですが、気が向いたので
ruby-dev に送ってみます。興味がある人はいじくってみると面白いかも知れ
ません。

なお、socket.so のシンボルを拡張モジュールから参照する方法がわからなかっ
たのでパッチになっています。


-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)

Attachments (1)

socket-extra.diff (7.07 KB, text/x-diff)
Index: ext/socket/extconf.rb
===================================================================
RCS file: /src/ruby/ext/socket/extconf.rb,v
retrieving revision 1.19
diff -u -r1.19 extconf.rb
--- ext/socket/extconf.rb	2001/12/03 07:08:17	1.19
+++ ext/socket/extconf.rb	2002/02/25 08:31:53
@@ -2,6 +2,42 @@
 
 $CPPFLAGS += " -Dss_family=__ss_family -Dss_len=__ss_len"
 
+def have_struct_member(type, member, header=nil)
+  printf "checking for %s.%s... ", type, member
+  STDOUT.flush
+
+  libs = $libs
+  src = 
+    if /mswin32|mingw/ =~ RUBY_PLATFORM
+      r = <<"SRC"
+#include <windows.h>
+#include <winsock.h>
+SRC
+    else
+      ""
+    end
+  unless header.nil?
+    header = [header] unless header.kind_of? Array
+    header.each {|h|
+      src << <<"SRC"
+#include <#{h}>
+SRC
+    }
+  end
+  src << <<"SRC"
+int main() { return 0; }
+int s = (char *)&((#{type}*)0)->#{member} - (char *)0;
+SRC
+  r = try_link(src, libs) # xxx try_compile is not available.
+  unless r
+    print "no\n"
+    return false
+  end
+  $defs.push(format("-DHAVE_ST_%s", member.upcase))
+  print "yes\n"
+  return true
+end
+
 case RUBY_PLATFORM
 when /mswin32|mingw/
   test_func = "WSACleanup"
@@ -176,6 +212,9 @@
 have_header("netinet/tcp.h") if not /cygwin/ === RUBY_PLATFORM # for cygwin 1.1.5
 have_header("netinet/udp.h")
 
+have_struct_member('struct msghdr', 'msg_control', header=['sys/types.h', 'sys/socket.h'])
+have_struct_member('struct msghdr', 'msg_accrights', header=['sys/types.h', 'sys/socket.h'])
+
 $getaddr_info_ok = false
 if not enable_config("wide-getaddrinfo", false) and try_run(<<EOF)
 #include <sys/types.h>
@@ -329,6 +368,7 @@
 end
 
 have_header("sys/un.h")
+have_header("sys/uio.h")
 
 if have_func(test_func)
   have_func("hsterror")
Index: ext/socket/socket.c
===================================================================
RCS file: /src/ruby/ext/socket/socket.c,v
retrieving revision 1.65
diff -u -r1.65 socket.c
--- ext/socket/socket.c	2002/02/05 07:56:31	1.65
+++ ext/socket/socket.c	2002/02/25 08:31:53
@@ -20,6 +20,10 @@
 #include <unistd.h>
 #endif
 
+#ifdef HAVE_SYS_UIO_H
+#include <sys/uio.h>
+#endif
+
 #ifndef NT
 #if defined(__BEOS__)
 # include <net/socket.h>
@@ -684,6 +688,17 @@
 }
 
 static void
+thread_read_select(fd)
+    int fd;
+{
+    fd_set fds;
+
+    FD_ZERO(&fds);
+    FD_SET(fd, &fds);
+    rb_thread_select(fd+1, &fds, 0, 0, 0);
+}
+
+static void
 thread_write_select(fd)
     int fd;
 {
@@ -1382,6 +1397,161 @@
 }
 
 static VALUE
+unix_send_io(sock, val)
+    VALUE sock, val;
+{
+#if defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS)
+    int fd;
+    OpenFile *fptr;
+    struct msghdr msg;
+    struct iovec vec[1];
+    char buf[1];
+
+#if defined(HAVE_ST_MSG_CONTROL)
+    struct {
+	struct cmsghdr hdr;
+	int fd;
+    } cmsg;
+#endif
+
+    if (rb_obj_is_kind_of(val, rb_cIO)) {
+        OpenFile *valfptr;
+	GetOpenFile(val, valfptr);
+	fd = fileno(valfptr->f);
+    }
+    else if (FIXNUM_P(val)) {
+        fd = FIX2INT(val);
+    }
+    else {
+	rb_raise(rb_eTypeError, "IO nor file descriptor");
+    }
+
+    GetOpenFile(sock, fptr);
+
+    msg.msg_name = NULL;
+    msg.msg_namelen = 0;
+
+    /* Linux and Solaris doesn't work if msg_iov is NULL. */
+    buf[0] = '\0';
+    vec[0].iov_base = buf;
+    vec[0].iov_len = 1;
+    msg.msg_iov = vec;
+    msg.msg_iovlen = 1;
+
+#if defined(HAVE_ST_MSG_CONTROL)
+    msg.msg_control = (caddr_t)&cmsg;
+    msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int);
+    msg.msg_flags = 0;
+    cmsg.hdr.cmsg_len = sizeof(struct cmsghdr) + sizeof(int);
+    cmsg.hdr.cmsg_level = SOL_SOCKET;
+    cmsg.hdr.cmsg_type = SCM_RIGHTS;
+    cmsg.fd = fd;
+#else
+    msg.msg_accrights = (caddr_t)&fd;
+    msg.msg_accrightslen = sizeof(fd);
+#endif
+
+    if (sendmsg(fileno(fptr->f), &msg, 0) == -1)
+	rb_sys_fail("sendmsg(2)");
+
+    return Qnil;
+#else
+    rb_notimplement();
+#endif
+}
+
+static VALUE
+unix_recv_io(argc, argv, sock)
+    int argc;
+    VALUE *argv;
+    VALUE sock;
+{
+#if defined(HAVE_ST_MSG_CONTROL) || defined(HAVE_ST_MSG_ACCRIGHTS)
+    VALUE klass, mode;
+    OpenFile *fptr;
+    struct msghdr msg;
+    struct iovec vec[2];
+    char buf[1];
+
+    int fd;
+#if defined(HAVE_ST_MSG_CONTROL)
+    struct {
+	struct cmsghdr hdr;
+	int fd;
+    } cmsg;
+#endif
+
+    rb_scan_args(argc, argv, "02", &mode, &klass);
+    if (argc == 0)
+	mode = Qnil;
+    if (argc <= 1)
+	klass = rb_cIO;
+
+    GetOpenFile(sock, fptr);
+
+    thread_read_select(fileno(fptr->f));
+
+    msg.msg_name = NULL;
+    msg.msg_namelen = 0;
+
+    vec[0].iov_base = buf;
+    vec[0].iov_len = sizeof(buf);
+    msg.msg_iov = vec;
+    msg.msg_iovlen = 1;
+
+#if defined(HAVE_ST_MSG_CONTROL)
+    msg.msg_control = (caddr_t)&cmsg;
+    msg.msg_controllen = sizeof(struct cmsghdr) + sizeof(int);
+    msg.msg_flags = 0;
+    cmsg.hdr.cmsg_len = sizeof(struct cmsghdr) + sizeof(int);
+    cmsg.hdr.cmsg_level = SOL_SOCKET;
+    cmsg.hdr.cmsg_type = SCM_RIGHTS;
+    cmsg.fd = -1;
+#else
+    msg.msg_accrights = (caddr_t)&fd;
+    msg.msg_accrightslen = sizeof(fd);
+    fd = -1;
+#endif
+
+    if (recvmsg(fileno(fptr->f), &msg, 0) == -1)
+	rb_sys_fail("recvmsg(2)");
+
+    if (
+#if defined(HAVE_ST_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
+#else
+        msg.msg_accrightslen != sizeof(fd)
+#endif
+	) {
+	rb_raise(rb_eSocket, "File descriptor was not passed");
+    }
+
+#if defined(HAVE_ST_MSG_CONTROL)
+    fd = cmsg.fd;
+#endif
+
+    if (klass == Qnil)
+	return INT2FIX(fd);
+    else {
+	static ID for_fd = 0;
+	int ff_argc;
+	VALUE ff_argv[2];
+	if (!for_fd)
+	    for_fd = rb_intern("for_fd");
+	ff_argc = mode == Qnil ? 1 : 2;
+	ff_argv[0] = INT2FIX(fd);
+	ff_argv[1] = mode;
+        return rb_funcall2(klass, for_fd, ff_argc, ff_argv);
+    }
+#else
+    rb_notimplement();
+#endif
+}
+
+static VALUE
 unix_accept(sock)
     VALUE sock;
 {
@@ -1564,6 +1734,26 @@
 #endif
 }
 
+#ifdef HAVE_SYS_UN_H
+static VALUE
+unix_s_socketpair(argc, argv, klass)
+    int argc;
+    VALUE *argv;
+    VALUE klass;
+{
+    VALUE domain, type, protocol;
+    domain = INT2FIX(PF_UNIX);
+
+    rb_scan_args(argc, argv, "02", &type, &protocol);
+    if (argc == 0)
+	type = INT2FIX(SOCK_STREAM);
+    if (argc <= 1)
+	protocol = INT2FIX(0);
+
+    return sock_s_socketpair(klass, domain, type, protocol);
+}
+#endif
+
 static VALUE
 sock_connect(sock, addr)
     VALUE sock, addr;
@@ -2177,6 +2367,10 @@
     rb_define_method(rb_cUNIXSocket, "addr", unix_addr, 0);
     rb_define_method(rb_cUNIXSocket, "peeraddr", unix_peeraddr, 0);
     rb_define_method(rb_cUNIXSocket, "recvfrom", unix_recvfrom, -1);
+    rb_define_method(rb_cUNIXSocket, "send_io", unix_send_io, 1);
+    rb_define_method(rb_cUNIXSocket, "recv_io", unix_recv_io, -1);
+    rb_define_singleton_method(rb_cUNIXSocket, "socketpair", unix_s_socketpair, -1);
+    rb_define_singleton_method(rb_cUNIXSocket, "pair", unix_s_socketpair, -1);
 
     rb_cUNIXServer = rb_define_class("UNIXServer", rb_cUNIXSocket);
     rb_define_global_const("UNIXserver", rb_cUNIXServer);

In This Thread

Prev Next