Hi,

At Fri, 6 Feb 2004 16:45:01 +0900,
Basile Starynkevitch [news] wrote in [ruby-talk:91680]:
> Why is (the library call) mkfifo missing in Ruby 1.8? Is there a way
> to do it simply (without coding the trivial C stub) in Ruby, other
> than system("mkfifo #{path}")

Because just nobody has wanted it yet, perhaps.


Index: configure.in =================================================================== RCS file: /cvs/ruby/src/ruby/configure.in,v retrieving revision 1.223 diff -u -2 -p -d -r1.223 configure.in --- configure.in 30 Jan 2004 17:39:04 -0000 1.223 +++ configure.in 7 Feb 2004 02:17:56 -0000 @@ -397,5 +397,5 @@ AC_CHECK_FUNCS(fmod killpg wait4 waitpid getpriority getrlimit dlopen sigprocmask sigaction _setjmp\ setsid telldir seekdir fchmod mktime timegm cosh sinh tanh\ - setuid setgid) + setuid setgid mkfifo mknod) AC_ARG_ENABLE(setreuid, [ --enable-setreuid use setreuid()/setregid() according to need even if obsolete.], Index: file.c =================================================================== RCS file: /cvs/ruby/src/ruby/file.c,v retrieving revision 1.178 diff -u -2 -p -d -r1.178 file.c --- file.c 4 Feb 2004 13:39:49 -0000 1.178 +++ file.c 7 Feb 2004 03:07:22 -0000 @@ -3207,4 +3207,101 @@ rb_f_test(argc, argv) } +/* + * 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+, +?c+, +?b+ and +?p+ to specify a + * normal file (which will be created empty), character special file, + * block special file or FIFO (named pipe), respectively, or +nil+, + * which will create a normal file. + */ + +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; + } + SafeStringValue(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(RSTRING(path)->ptr, mode, dev)) { + rb_sys_fail(0); + } +#else + rb_notimplement(); +#endif + return INT2FIX(0); +} + +/* + * 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). + */ + +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); + } + SafeStringValue(path); + if (mkfifo(RSTRING(path)->ptr, mode)) { + rb_sys_fail(0); + } +#else + rb_notimplement(); +#endif + return INT2FIX(0); +} + @@ -4209,4 +4306,6 @@ Init_File() 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);
-- Nobu Nakada