summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--NEWS4
-rw-r--r--configure.in2
-rw-r--r--file.c39
-rw-r--r--test/lib/envutil.rb3
5 files changed, 51 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 9716204..8b9c279 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Sep 18 20:11:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_s_mkfifo): implement File.mkfifo.
+ [Feature #11536]
+
Fri Sep 18 16:56:19 2015 Shugo Maeda <shugo@ruby-lang.org>
* NEWS: add Net::FTP#mlst and Net::FTP#mlsd.
diff --git a/NEWS b/NEWS
index 2c36be0..73f4a65 100644
--- a/NEWS
+++ b/NEWS
@@ -30,6 +30,10 @@ with all sufficient information, see the ChangeLog file.
[Feature #11049]
* Enumerable#chunk_while [Feature #10769]
+* File
+
+ * File.mkfifo [Feature #11536]
+
* Hash
* Hash#fetch_values [Feature #10017]
diff --git a/configure.in b/configure.in
index 39827cd..7d0f1e8 100644
--- a/configure.in
+++ b/configure.in
@@ -2182,6 +2182,8 @@ AC_CHECK_FUNCS(memalign)
AC_CHECK_FUNCS(writev)
AC_CHECK_FUNCS(memrchr)
AC_CHECK_FUNCS(memmem)
+AC_CHECK_FUNCS(mkfifo)
+AC_CHECK_FUNCS(mknod)
AC_CHECK_FUNCS(mktime)
AC_CHECK_FUNCS(pipe2)
AC_CHECK_FUNCS(poll)
diff --git a/file.c b/file.c
index 2109ca9..d2e2336 100644
--- a/file.c
+++ b/file.c
@@ -5508,6 +5508,44 @@ rb_stat_sticky(VALUE obj)
return Qfalse;
}
+#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
+
+/*
+ * call-seq:
+ * File.mkfifo(file_name, mode) => 0
+ *
+ * Creates a FIFO special file 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).
+ */
+
+#ifdef HAVE_MKFIFO
+static VALUE
+rb_file_s_mkfifo(int argc, VALUE *argv)
+{
+ VALUE path;
+ int mode = 0666;
+
+ rb_check_arity(argc, 1, 2);
+ if (argc > 1) {
+ mode = NUM2INT(argv[1]);
+ }
+ path = argv[0];
+ FilePathValue(path);
+ path = rb_str_encode_ospath(path);
+ if (mkfifo(RSTRING_PTR(path), mode)) {
+ rb_sys_fail_path(path);
+ }
+ return INT2FIX(0);
+}
+#else
+#define rb_file_s_mkfifo rb_f_notimplement
+#endif
+
VALUE rb_mFConst;
void
@@ -5917,6 +5955,7 @@ 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, "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, "absolute_path", rb_file_s_absolute_path, -1);
rb_define_singleton_method(rb_cFile, "realpath", rb_file_s_realpath, -1);
diff --git a/test/lib/envutil.rb b/test/lib/envutil.rb
index ebb2ef5..b37d180 100644
--- a/test/lib/envutil.rb
+++ b/test/lib/envutil.rb
@@ -4,10 +4,9 @@ require "timeout"
require_relative "find_executable"
def File.mkfifo(fn)
- raise NotImplementedError, "does not support fifo" if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
ret = system("mkfifo", fn)
raise NotImplementedError, "mkfifo fails" if !ret
-end
+end unless File.respond_to?(:mkfifo) or /mswin|mingw|bccwin/ =~ RUBY_PLATFORM
module EnvUtil
def rubybin