diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | file.c | 39 | ||||
-rw-r--r-- | test/lib/envutil.rb | 3 |
5 files changed, 51 insertions, 2 deletions
@@ -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. @@ -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 39827cd519..7d0f1e8557 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) @@ -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 ebb2ef57d0..b37d180c20 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 |