[#15701] Ruby 1.9.0-1 snapshot released — Yukihiro Matsumoto <matz@...>
Hi,
[#15704] Proc#curry doesn't work on func which produces func — Lin Jen-Shin <godfat@...>
Proc#curry doesn't work on function which produces function,
Hi,
>>>>> "Y" == Yusuke ENDOH <mame@tsg.ne.jp> writes:
[#15707] Schedule for the 1.8.7 release — "Akinori MUSHA" <knu@...>
Hi, developers,
On Sat, Mar 01, 2008 at 08:58:00PM +0900, Akinori MUSHA wrote:
Hi,
At Fri, 21 Mar 2008 23:16:54 +0900,
At Mon, 24 Mar 2008 21:39:45 +0900,
[#15709] capitalize and downcase — Trans <transfire@...>
I've always wondered why String#capitalize downcases the whole string
[#15713] Ruby String hash key overflow when converting to Fixnum. — "Chiyuan Zhang" <pluskid@...>
Hi, all! I've opened a issue at rubyforge:
[#15728] Question on build process - skipping unsupported extensions — Daniel Berger <djberg96@...>
Hi,
[#15740] Copy-on-write friendly garbage collector — Hongli Lai <hongli@...99.net>
Hi.
Hi,
Yukihiro Matsumoto wrote:
Hi.
Hongli Lai wrote:
Hi.
Hi,
I believe I managed to close the performance gap to only 6% slower than
Daniel DeLorme wrote:
[#15746] Am I misinterpreting the new keyword arguments to IO.foreach and friends? — Dave Thomas <dave@...>
I was expecting this to pass lines to the block:
[#15756] embedding Ruby 1.9.0 inside pthread — "Suraj Kurapati" <sunaku@...>
Hello,
Hi,
Hi,
Yukihiro Matsumoto wrote:
Suraj N. Kurapati wrote:
Hi,
Nobuyoshi Nakada wrote:
Suraj N. Kurapati wrote:
Hongli Lai wrote:
[#15775] next(n), succ(n) ? — Trans <transfire@...>
Can anyone see any reason against adding an optional parameter to
[#15778] Named captures and regular captures — Dave Thomas <dave@...>
It seems that once you have a named capture in a regular expression,
[#15783] Adding startup and shutdown to Test::Unit — Daniel Berger <Daniel.Berger@...>
Hi all,
Daniel Berger wrote:
On Wed, Mar 05, 2008 at 07:52:40AM +0900, Daniel Berger wrote:
[#15835] TimeoutError in core, timeouts for ConditionVariable#wait — MenTaLguY <mental@...>
I've been reworking JRuby's stdlib to improve performance and fix
On Sun, 2008-03-09 at 12:13 +0900, MenTaLguY wrote:
[#15837] Correct procedure for patch review? — Hongli Lai <hongli@...99.net>
Hi.
[#15838] Bug in Fixnum#& with respect to coercion into a bignum — Dirkjan Bussink <d.bussink@...>
Hello all,
[#15855] Ruby 1.8.6 trace return line numbers wrong — "Rocky Bernstein" <rocky.bernstein@...>
Consider this program:
[#15860] Webrick directory traversal exploit on UNIX — Jos Backus <jos@...>
DSecRG Advisory #DSECRG-08-026 aka -018 describes a remote directory traversal
[#15871] Sparc architecture optimizations — Thomas Enebo <Thomas.Enebo@...>
Someone at Sun has been looking at Ruby on Sparc:
Thomas Enebo wrote:
Hello Ruby-core,
Hi,
Yukihiro Matsumoto wrote:
Prashant Srinivasan wrote:
[#15880] Ruby 1.8.6 binding value after "if" expression evaluation — "Rocky Bernstein" <rocky.bernstein@...>
Here's another trace hook weirdness that I've encountered.
Hello,
Thanks. The output you report matches what I get in 1.8.6 and suggests where
I think I've found why this is happening. The trace hook for NODE_IF is
[#15907] Range#member? semantics seem wrong — Dave Thomas <dave@...>
Range#member? has been changed so that it the start and end of the
[#15909] RARRAY_PTR — "Laurent Sansonetti" <laurent.sansonetti@...>
Hi,
[#15917] Ruby 1.9 (trunk) crashes when running RubyGems and Rake — Hongli Lai <hongli@...99.net>
Ruby 1.9 (trunk) seems to crash when running the supplied RubyGems and Rake:
Hi,
Nobuyoshi Nakada wrote:
On Mon, Mar 17, 2008 at 06:53:19PM +0900, Hongli Lai wrote:
[#15927] how to create a block with a block parameter in C? — Paul Brannan <pbrannan@...>
This works in Ruby (1.9):
>>>>> "P" == Paul Brannan <pbrannan@atdesk.com> writes:
[#15933] complex and rational — Dave Thomas <dave@...>
Before I start doing the documentation for the PickAxe, could I just
[#15936] Are Depreciated Methods "add_final" & "remove_final" supposed to ACTUALLY WORK? — Charles Thornton <ceo@...>
In Working on IRHG Docs for GC the following
>>>>> "C" == Charles Thornton <ceo@hawthorne-press.com> writes:
ts wrote:
[#15938] Questions on Enumerator#skip_first and Enumerable#first — "Artem Voroztsov" <artem.voroztsov@...>
I asked in ruby-talk, but did not get answer.
On Mar 18, 2008, at 6:20 AM, Artem Voroztsov wrote:
[#15975] Bugs in REXML — "Federico Builes" <federico.builes@...>
Hi,
On Mar 21, 2008, at 17:35, Federico Builes wrote:
[#15980] 1.8.6 memory leak? — "Stephen Sykes" <sdsykes@...>
Hi,
[#15983] Changing the algorithm of String#* — apeiros <apeiros@...>
Hi there
[#15990] Recent changes in Range#step behavior — "Vladimir Sizikov" <vsizikov@...>
Hi,
Hi Dave,
Hi Dave,
Hi,
Hi,
Hi,
On Wed, Mar 26, 2008 at 7:01 PM, Dave Thomas <dave@pragprog.com> wrote:
Dave Thomas wrote:
Dave Thomas wrote:
Dave Thomas wrote:
Dave,
This is all a semantic problem. Different people have different
[#16011] New ERb mode — Marc Haisenko <haisenko@...>
Hi folks,
On Tuesday 25 March 2008, Marc Haisenko wrote:
ERb already does this:
On Tuesday 25 March 2008, Jason Roelofs wrote:
On Tue, Mar 25, 2008 at 11:39 AM, Marc Haisenko <haisenko@comdasys.com> wrote:
On Tuesday 25 March 2008, Jason Roelofs wrote:
[#16023] some Enumerable methods slower in 1.9 on OS X after revision 15124 — Chris Shea <cmshea@...>
All,
Hi,
Hi,
On Thu, Mar 27, 2008 at 02:26:51PM +0900, Nobuyoshi Nakada wrote:
Hi,
Nobuyoshi Nakada wrote:
Hi,
[#16057] About the license of gserver.rb being "freeware"? — "XiaoLiang Liu" <liuxlsh@...>
Hello everyone,
PATCH: mknod and mkfifo support [Was: Ruby does not support mkfifo]
In my last email, I mentioned that there was an old patch that implements mknod() and mkfifo() support. That patch no longer works. I've ported the patch to Ruby 1.9, improved its documentation, and wrote unit tests. Please review the attached patch. Regards, Hongli Lai
Attachments (1)
diff --git a/configure.in b/configure.in
index c178210..2df4f6c 100644
--- a/configure.in
+++ b/configure.in
@@ -661,7 +661,7 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid fork spawnv syscall chroot fsync getcwd
dlopen sigprocmask sigaction sigsetjmp _setjmp vsnprintf snprintf\
setsid telldir seekdir fchmod cosh sinh tanh log2 round\
setuid setgid daemon select_large_fdset setenv unsetenv\
- mktime timegm clock_gettime gettimeofday)
+ mktime timegm clock_gettime gettimeofday mkfifo mknod)
AC_ARG_ENABLE(setreuid,
[ --enable-setreuid use setreuid()/setregid() according to need even if obsolete.],
[use_setreuid=$enableval])
diff --git a/file.c b/file.c
index c32afbc..df8d656 100644
--- a/file.c
+++ b/file.c
@@ -3509,6 +3509,114 @@ rb_f_test(int argc, VALUE *argv)
return Qnil; /* not reached */
}
+/*
+ * call-seq:
+ * File.mknod(file_name, [type, [mode, [dev]]]) => 0
+ *
+ * Create a filesystem node (file, device special file or named pipe)
+ * named _file_name_, specified by _mode_ and _dev_.
+ *
+ * _type_ and _mode_ specifies the type and the permissions of node to
+ * be created respectively.
+ *
+ * The permissions are modified by the process's umask in the usual
+ * way: the permissions of the created node are (mode & ~umask).
+ *
+ * _type_ should be one of:
+ * - +?f+ - normal file (which will be created empty)
+ * - +?c+ - character special file
+ * - +?b+ - block special file
+ * - +?p+ - FIFO (named pipe)
+ * - +nil+ - normal file
+ *
+ * Raises:
+ * - +ArgumentError+ - _type_ is unknown or not supported on the current platform.
+ * - +SystemCallError+ - Something went wrong during the creation of the node.
+ * - +NotImplementedError+ - This call is not supported on the current platform.
+ */
+
+static VALUE
+rb_file_s_mknod(argc, argv)
+ int argc;
+ VALUE *argv;
+{
+#ifdef HAVE_MKNOD
+ VALUE path, type, vmode, vdev;
+ int mode = 0666, dev = 0, t;
+
+ rb_secure(4);
+ switch (rb_scan_args(argc, argv, "13", &path, &type, &vmode, &vdev)) {
+ case 4:
+ dev = NUM2INT(vdev);
+ case 3:
+ mode = NUM2INT(vmode) & ~S_IFMT;
+ }
+ FilePathValue(path);
+ if (!NIL_P(type)) {
+ rb_check_safe_obj(type);
+ switch (t = NUM2CHR(type)) {
+ case 'f': mode |= S_IFREG; break;
+ case 'c': mode |= S_IFCHR; break;
+#ifdef S_IFBLK
+ case 'b': mode |= S_IFBLK; break;
+#endif
+#ifdef S_IFIFO
+ case 'p': mode |= S_IFIFO; break;
+#endif
+ default:
+ rb_raise(rb_eArgError, "unknown node type - %c", t);
+ }
+ }
+ if (mknod(StringValueCStr(path), mode, dev)) {
+ rb_sys_fail("mknod");
+ }
+#else
+ rb_notimplement();
+#endif
+ return INT2FIX(0);
+}
+
+/*
+ * call-seq:
+ * File.mkfifo(file_name, mode) => 0
+ *
+ * Creates a FIFO special file (named pipe) with name _file_name_. _mode_
+ * specifies the FIFO's permissions. It is modified by the process's
+ * umask in the usual way: the permissions of the created file are
+ * (mode & ~umask).
+ *
+ * Raises:
+ * - +SystemCallError+ - Something went wrong during the creation of the FIFO.
+ * - +NotImplementedError+ - This call is not supported on the current platform.
+ */
+
+static VALUE
+rb_file_s_mkfifo(argc, argv)
+ int argc;
+ VALUE *argv;
+{
+#if !defined HAVE_MKFIFO && defined HAVE_MKNOD && defined S_IFIFO
+ #define mkfifo(path, mode) mknod(path, (mode)&~S_IFMT|S_IFIFO, 0)
+ #define HAVE_MKFIFO
+#endif
+#ifdef HAVE_MKFIFO
+ VALUE path, vmode;
+ int mode = 0666;
+
+ rb_secure(4);
+ if (rb_scan_args(argc, argv, "11", &path, &vmode) > 1) {
+ mode = NUM2INT(vmode);
+ }
+ FilePathValue(path);
+ if (mkfifo(StringValueCStr(path), mode)) {
+ rb_sys_fail("mkfifo");
+ }
+#else
+ rb_notimplement();
+#endif
+ return INT2FIX(0);
+}
+
/*
@@ -4512,6 +4620,8 @@ Init_File(void)
rb_define_singleton_method(rb_cFile, "rename", rb_file_s_rename, 2);
rb_define_singleton_method(rb_cFile, "umask", rb_file_s_umask, -1);
rb_define_singleton_method(rb_cFile, "truncate", rb_file_s_truncate, 2);
+ rb_define_singleton_method(rb_cFile, "mknod", rb_file_s_mknod, -1);
+ rb_define_singleton_method(rb_cFile, "mkfifo", rb_file_s_mkfifo, -1);
rb_define_singleton_method(rb_cFile, "expand_path", rb_file_s_expand_path, -1);
rb_define_singleton_method(rb_cFile, "basename", rb_file_s_basename, -1);
rb_define_singleton_method(rb_cFile, "dirname", rb_file_s_dirname, 1);
diff --git a/test/ruby/test_file_exhaustive.rb b/test/ruby/test_file_exhaustive.rb
index d29253f..45b2981 100644
--- a/test/ruby/test_file_exhaustive.rb
+++ b/test/ruby/test_file_exhaustive.rb
@@ -8,12 +8,21 @@ class TestFileExhaustive < Test::Unit::TestCase
@file = make_tmp_filename("file")
@zerofile = make_tmp_filename("zerofile")
@nofile = make_tmp_filename("nofile")
+ @fifofile_nod = make_tmp_filename("fifofile_nod")
+ @fifofile = make_tmp_filename("fifofile")
@symlinkfile = make_tmp_filename("symlinkfile")
@hardlinkfile = make_tmp_filename("hardlinkfile")
make_file("foo", @file)
make_file("", @zerofile)
@time = Time.now
begin
+ File.mkfifo(@fifofile, 0600)
+ File.mknod(@fifofile_nod, "p")
+ rescue NotImplementedError
+ @fifofile = nil
+ @fifofile_nod = nil
+ end
+ begin
File.symlink(@file, @symlinkfile)
rescue NotImplementedError
@symlinkfile = nil
@@ -104,6 +113,7 @@ class TestFileExhaustive < Test::Unit::TestCase
assert(!(File.pipe?(@dir)))
assert(!(File.pipe?(@file)))
assert(!(File.pipe?(@nofile)))
+ assert(File.pipe?(@fifofile)) if @fifofile
end
def test_symlink_p
@@ -265,6 +275,7 @@ class TestFileExhaustive < Test::Unit::TestCase
assert_equal("file", File.ftype(@file))
assert_equal("link", File.ftype(@symlinkfile)) if @symlinkfile
assert_equal("file", File.ftype(@hardlinkfile)) if @hardlinkfile
+ assert_equal("fifo", File.ftype(@fifofile)) if @fifofile
assert_raise(Errno::ENOENT) { File.ftype(@nofile) }
end
@@ -321,6 +332,16 @@ class TestFileExhaustive < Test::Unit::TestCase
def test_lchown ## xxx
end
+
+ def test_mkfifo_and_mknod
+ return unless @fifofile
+ assert_equal("fifo", File.ftype(@fifofile))
+ assert_equal("fifo", File.ftype(@fifofile_nod))
+
+ nod_normal = make_tmp_filename("nod_normal")
+ File.mknod(nod_normal)
+ assert_equal("file", File.ftype(nod_normal))
+ end
def test_symlink
return unless @symlinkfile