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