* file.c (rb_file_s_mkfifo): implement File.mkfifo.
  [Feature #11536]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51897 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2015-09-18 11:11:14 +00:00
Родитель 30f9177d5d
Коммит 9289515562
5 изменённых файлов: 51 добавлений и 2 удалений

Просмотреть файл

@ -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.

4
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]

Просмотреть файл

@ -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)

39
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);

Просмотреть файл

@ -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