[#11890] Ruby and Solaris door library — "Hiro Asari" <asari.ruby@...>

Hi, there. This is my first patch against ruby. I think I followed

19 messages 2007/08/13
[#11892] Re: Ruby and Solaris door library — Daniel Berger <djberg96@...> 2007/08/14

Hiro Asari wrote:

[#11899] pack/unpack 64bit Integers — Hadmut Danisch <hadmut@...>

Hi,

13 messages 2007/08/14
[#11903] Re: pack/unpack 64bit Integers — Brian Candler <B.Candler@...> 2007/08/15

On Wed, Aug 15, 2007 at 06:50:01AM +0900, Hadmut Danisch wrote:

[#11948] Fibers in Ruby 1.9? — David Flanagan <david@...>

I just noticed that my ruby1.9 build of August 17th includes a Fiber

22 messages 2007/08/22
[#11949] Re: Fibers in Ruby 1.9? — Daniel Berger <djberg96@...> 2007/08/22

David Flanagan wrote:

[#11950] Re: Fibers in Ruby 1.9? — "Francis Cianfrocca" <garbagecat10@...> 2007/08/22

On 8/22/07, Daniel Berger <djberg96@gmail.com> wrote:

[#11952] Re: Fibers in Ruby 1.9? — MenTaLguY <mental@...> 2007/08/22

On Wed, 22 Aug 2007 20:50:12 +0900, "Francis Cianfrocca" <garbagecat10@gmail.com> wrote:

[#11988] String#length not working properly in Ruby 1.9 — "Vincent Isambart" <vincent.isambart@...>

I saw that Matz just merged his M17N implementation in the trunk.

17 messages 2007/08/25
[#11991] Re: String#length not working properly in Ruby 1.9 — "Michael Neumann" <mneumann@...> 2007/08/25

On Sat, 25 Aug 2007 10:54:20 +0200, Yukihiro Matsumoto

[#11992] Re: String#length not working properly in Ruby 1.9 — Yukihiro Matsumoto <matz@...> 2007/08/25

Hi,

[#12042] Encodings of string literals; explicit codepoint escapes? — David Flanagan <david@...>

This message contains queries that probably only Matz can answer:

16 messages 2007/08/31
[#12043] Re: Encodings of string literals; explicit codepoint escapes? — Yukihiro Matsumoto <matz@...> 2007/08/31

Hi,

Ruby and Solaris door library

From: "Hiro Asari" <asari.ruby@...>
Date: 2007-08-13 04:45:45 UTC
List: ruby-core #11890
Hi, there.  This is my first patch against ruby.  I think I followed
the guidelines, but if I made mistakes, please kindly point them out.


On Solaris (2.6 onwards, I believe), there is a local IPC mechanism
called doors.

It's not unlike named pipes, in that two processes communicate through
an entry in a filesystem.  This naturally leads to:

door_path="/var/run/syslog_door"

File.door?(door_path) # => true
File.new(door_path).stat.door? # => true
File.ftype(door_path) # => "door"
test ?D, door_path  # => true


The attached patch (against rev. 12920) will check for the presence of
door.h in configure.in, and adds a few methods in file.c to implement
the methods to check for doors.  I've tested the patch on OpenSolaris
(build 55) and Mac OS X (10.4.10, so that it doesn't throw fits).


ChangeLog:
* configure.in: search for door.h
* file.c (preprocessor directive, rb_file_door_p(), rb_file_ftype(),
test_check(), rb_stat_D()): Implement various methods on doors.


Index: configure.in
===================================================================
--- configure.in        (revision 12920)
+++ configure.in        (working copy)
@@ -513,7 +513,7 @@
                 fcntl.h sys/fcntl.h sys/select.h sys/time.h
sys/times.h sys/param.h\
                 syscall.h pwd.h grp.h a.out.h utime.h memory.h
direct.h sys/resource.h \
                 sys/mkdev.h sys/utime.h netinet/in_systm.h float.h
ieeefp.h pthread.h \
-                ucontext.h intrinsics.h)
+                ucontext.h intrinsics.h door.h)

 dnl Check additional types.
 AC_CHECK_SIZEOF(rlim_t, 0, [
Index: file.c
===================================================================
--- file.c      (revision 12920)
+++ file.c      (working copy)
@@ -62,6 +62,10 @@
 #include <sys/mkdev.h>
 #endif

+#ifdef HAVE_DOOR_H
+#include <door.h>
+#endif
+
 #if !defined HAVE_LSTAT && !defined lstat
 #define lstat stat
 #endif
@@ -923,7 +927,31 @@
     return Qfalse;
 }

+/*
+ * Document-method: door?
+ *
+ * call-seq:
+ *   File.door?(file_name)   =>  true or false
+ *
+ * Returns <code>true</code> if the named file is a door,
+ * <code>false</code> otherwise.
+ *
+ *    File.door?("/var/run/syslog_door")
+ */

+VALUE
+rb_file_door_p(VALUE obj, VALUE fname)
+{
+#ifdef S_ISDOOR
+    struct stat st;
+
+    if (rb_stat(fname, &st) < 0) return Qfalse;
+    if (S_ISDOOR(st.st_mode)) return Qtrue;
+#endif
+    return Qfalse;
+}
+
+
 /*
  * call-seq:
  *   File.pipe?(file_name)   =>  true or false
@@ -1539,6 +1567,11 @@
        t = "socket";
     }
 #endif
+#ifdef S_ISDOOR
+    else if (S_ISDOOR(st->st_mode)) {
+    t = "door";
+    }
+#endif
     else {
        t = "unknown";
     }
@@ -3210,6 +3243,7 @@
  *     ?c  | boolean | True if file1 is a character device
  *     ?C  | Time    | Last change time for file1
  *     ?d  | boolean | True if file1 exists and is a directory
+ *     ?D  | boolean | True if file1 exists and is a door
  *     ?e  | boolean | True if file1 exists
  *     ?f  | boolean | True if file1 exists and is a regular file
  *     ?g  | boolean | True if file1 has the \CF{setgid} bit
@@ -3261,7 +3295,7 @@
     if (argc == 0) rb_raise(rb_eArgError, "wrong number of arguments");
     cmd = NUM2CHR(argv[0]);
     if (cmd == 0) goto unknown;
-    if (strchr("bcdefgGkloOprRsSuwWxXz", cmd)) {
+    if (strchr("bcdDefgGkloOprRsSuwWxXz", cmd)) {
        CHECK(1);
        switch (cmd) {
          case 'b':
@@ -3273,6 +3307,9 @@
          case 'd':
            return rb_file_directory_p(0, argv[1]);

+         case 'D':
+           return rb_file_door_p(0, argv[1]);
+
          case 'a':
          case 'e':
            return rb_file_exist_p(0, argv[1]);
@@ -3505,6 +3542,26 @@

 /*
  *  call-seq:
+ *     stat.door?   => true or false
+ *
+ *  Returns <code>true</code> if <i>stat</i> is a door,
+ *  <code>false</code> otherwise.
+ *
+ *     File.stat("/var/run/syslog_door").door?   #=> false
+ *     File.stat(".").door?          #=> false
+ */
+
+static VALUE
+rb_stat_D(VALUE obj)
+{
+#ifdef S_ISDOOR
+    if (S_ISDOOR(get_stat(obj)->st_mode)) return Qtrue;
+#endif
+    return Qfalse;
+}
+
+/*
+ *  call-seq:
  *     stat.pipe?    => true or false
  *
  *  Returns <code>true</code> if the operating system supports pipes and
@@ -4338,6 +4395,7 @@
     rb_cFile = rb_define_class("File", rb_cIO);

     define_filetest_function("directory?", rb_file_directory_p, 1);
+    define_filetest_function("door?", rb_file_door_p, 1);
     define_filetest_function("exist?", rb_file_exist_p, 1);
     define_filetest_function("readable?", rb_file_readable_p, 1);
     define_filetest_function("readable_real?", rb_file_readable_real_p, 1);
@@ -4465,6 +4523,7 @@
     rb_define_method(rb_cStat, "ftype", rb_stat_ftype, 0);

     rb_define_method(rb_cStat, "directory?",  rb_stat_d, 0);
+    rb_define_method(rb_cStat, "door?",  rb_stat_D, 0);
     rb_define_method(rb_cStat, "readable?",  rb_stat_r, 0);
     rb_define_method(rb_cStat, "readable_real?",  rb_stat_R, 0);
     rb_define_method(rb_cStat, "world_readable?", rb_stat_wr, 0);

-- 
H. Asari

In This Thread

Prev Next