[前][次][番号順一覧][スレッド一覧]

ruby-changes:21603

From: akr <ko1@a...>
Date: Mon, 7 Nov 2011 20:17:27 +0900 (JST)
Subject: [ruby-changes:21603] akr:r33652 (trunk): * ext/dbm/extconf.rb: check dbm_pagfno() and dbm_dirfno().

akr	2011-11-07 20:17:17 +0900 (Mon, 07 Nov 2011)

  New Revision: 33652

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33652

  Log:
    * ext/dbm/extconf.rb: check dbm_pagfno() and dbm_dirfno().
    
    * ext/dbm/dbm.c: use above to set close-on-exec flag.

  Modified files:
    trunk/ChangeLog
    trunk/ext/dbm/dbm.c
    trunk/ext/dbm/extconf.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33651)
+++ ChangeLog	(revision 33652)
@@ -1,3 +1,9 @@
+Mon Nov  7 20:15:44 2011  Tanaka Akira  <akr@f...>
+
+	* ext/dbm/extconf.rb: check dbm_pagfno() and dbm_dirfno().
+
+	* ext/dbm/dbm.c: use above to set close-on-exec flag.
+
 Mon Nov  7 20:05:16 2011  NAKAMURA Usaku  <usa@r...>
 
 	* io.c (io_fflush): remove fsync().
Index: ext/dbm/dbm.c
===================================================================
--- ext/dbm/dbm.c	(revision 33651)
+++ ext/dbm/dbm.c	(revision 33652)
@@ -162,6 +162,30 @@
         }
     }
 
+    if (dbm) {
+    /*
+     * History of dbm_pagfno() and dbm_dirfno() in ndbm and its compatibles.
+     *
+     * 1986: 4.3BSD provides ndbm.
+     *       It provides dbm_pagfno() and dbm_dirfno() as macros.
+     * 1991: gdbm-1.5 provides them as functions.
+     *       They returns a same descriptor.
+     *       (Earlier releases may have the functions too.)
+     * 1991: Net/2 provides Berkeley DB.
+     *       It doesn't provide dbm_pagfno() and dbm_dirfno().
+     * 1992: 4.4BSD Alpha provides Berkeley DB with dbm_dirfno() as a function.
+     *       dbm_pagfno() is a macro as DBM_PAGFNO_NOT_AVAILABLE.
+     * 2011: gdbm-1.9 creates a separate dir file.
+     *       dbm_pagfno() and dbm_dirfno() returns different descriptors.
+     */
+#if defined(HAVE_DBM_PAGFNO)
+        rb_fd_fix_cloexec(dbm_pagfno(dbm));
+#endif
+#if defined(HAVE_DBM_DIRFNO)
+        rb_fd_fix_cloexec(dbm_dirfno(dbm));
+#endif
+    }
+
     if (!dbm) {
 	if (mode == -1) return Qnil;
 	rb_sys_fail(RSTRING_PTR(file));
Index: ext/dbm/extconf.rb
===================================================================
--- ext/dbm/extconf.rb	(revision 33651)
+++ ext/dbm/extconf.rb	(revision 33652)
@@ -21,6 +21,8 @@
   "qdbm" => ["relic.h", "qdbm/relic.h"],
 }
 
+$dbm_headers = []
+
 def headers.db_check(db)
   db_prefix = nil
   have_gdbm = false
@@ -44,6 +46,7 @@
     have_func(db_prefix+"dbm_clearerr") unless have_gdbm
     $defs << hsearch if hsearch
     $defs << '-DDBM_HDR="<'+hdr+'>"'
+    $dbm_headers << hdr
     true
   else
     false
@@ -53,5 +56,7 @@
 if dblib.any? {|db| headers.db_check(db)}
   have_header("cdefs.h")
   have_header("sys/cdefs.h")
+  have_func("dbm_pagfno", $dbm_headers)
+  have_func("dbm_dirfno", $dbm_headers)
   create_makefile("dbm")
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]