mkfifo in Ruby 1.8?

  • Thread starter Basile Starynkevitch [news]
  • Start date
B

Basile Starynkevitch [news]

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}")
 
M

Mike Stok

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}")

You could use syscall :) No I'm not advocating this seriously.

# Linux 2.4

SYS_mknod = 14
S_IFIFO = 4096
name = 'my_fifo'

puts "result is #{syscall(SYS_mknod, name, 0666 | S_IFIFO)}"

Mike
 
T

Tim Sutherland

Basile Starynkevitch said:
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}")

You could use the 'dl' library:

require 'dl/import'

module LIBC
extend DL::Importable

dlload 'libc.so.6'

extern 'int mkfifo(char*, uint)'
extern 'void perror(char*)'
end

if -1 == LIBC.mkfifo('foo', 007)
LIBC.perror("mkfifo")
end
 
N

nobu.nokada

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

Bob Gustafson

I just installed ruby-1.8.1 and found this problem.

make test -- worked fine during the installation of ruby


-----

The program below will work on the same machine using ruby-1.6.8

What can I do to smoke this bug out?

Bob Gustafson

------

bash-2.03# ruby bugtest.rb
/usr/local/lib/ruby/1.8/sparc-solaris2.7/pty.so: [BUG] Segmentation fault
ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]

Abort (core dumped)

bash-2.03# cat bugtest.rb
require 'pty'
puts "This is a test"
bash-2.03#
 
Y

Yukihiro Matsumoto

Hi,

In message "pty.so: [BUG] Segmentation fault"

|The program below will work on the same machine using ruby-1.6.8
|What can I do to smoke this bug out?

Hmm, is there somebody to confirm this on Solaris 2.7?

matz.
 
J

Joel VanderWerf

Yukihiro said:
Hi,

In message "pty.so: [BUG] Segmentation fault"

|The program below will work on the same machine using ruby-1.6.8
|What can I do to smoke this bug out?

Hmm, is there somebody to confirm this on Solaris 2.7?

matz.

No segfault here.

$ ruby -v bugtest.rb
ruby 1.8.1 (2003-12-25) [sparc-solaris2.7]
This is a test
$ cat bugtest.rb
require 'pty'
puts "This is a test"

However, I did have some strange behavior while updating from 2003-12-22
to 2003-12-25. After building and installing the latter, ruby -v told me
I still had the earlier version. So I blew away my entire
$PREFIX/lib/ruby, and rebuilt, and that fixed the version discrepancy.

Is it possible that the include path found version.h in
$PREFIX/lib/ruby/1.8/sparc-solaris2.7/ before the one in the build dir?
I've never seen this problem on linux, and I don't recall seeing it
before on solaris.

A typical compiler invocation looks like:

gcc -I/usr/path/include -I. -I. -I/usr/path/include -c class.c

So it does look like my install dir is being searched first. My
configure command is simply

/configure --prefix=/usr/path

Anyway, the OP might want to try manually deleting lib/ruby and rebuilding.
 
N

nobu.nokada

Hi,

At Sun, 8 Feb 2004 07:11:47 +0900,
Joel VanderWerf wrote in [ruby-talk:91760]:
Is it possible that the include path found version.h in
$PREFIX/lib/ruby/1.8/sparc-solaris2.7/ before the one in the build dir?
I've never seen this problem on linux, and I don't recall seeing it
before on solaris.
No.

A typical compiler invocation looks like:

gcc -I/usr/path/include -I. -I. -I/usr/path/include -c class.c

It is strange. Don't you set CFLAGS env? Otherwise, '-g -O2'
should appear instead.
 
J

Joel VanderWerf

Hi,

At Sun, 8 Feb 2004 07:11:47 +0900,
Joel VanderWerf wrote in [ruby-talk:91760]:
Is it possible that the include path found version.h in
$PREFIX/lib/ruby/1.8/sparc-solaris2.7/ before the one in the build dir?
I've never seen this problem on linux, and I don't recall seeing it
before on solaris.

No.


A typical compiler invocation looks like:

gcc -I/usr/path/include -I. -I. -I/usr/path/include -c class.c


It is strange. Don't you set CFLAGS env? Otherwise, '-g -O2'
should appear instead.

Oops. That's exactly what it was. I have:

declare -x CFLAGS="-I/usr/path/include"

That was for some other software. Good to know that can interfere with
ruby builds. Thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,582
Members
45,057
Latest member
KetoBeezACVGummies

Latest Threads

Top