From e4e5b7df4cca2cedba1ec2b52f75c450a0c618ce Mon Sep 17 00:00:00 2001 From: akr Date: Mon, 7 Nov 2011 11:17:17 +0000 Subject: [PATCH] * ext/dbm/extconf.rb: check dbm_pagfno() and dbm_dirfno(). * ext/dbm/dbm.c: use above to set close-on-exec flag. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ ext/dbm/dbm.c | 24 ++++++++++++++++++++++++ ext/dbm/extconf.rb | 5 +++++ 3 files changed, 35 insertions(+) diff --git a/ChangeLog b/ChangeLog index da93ede475..67b4e12bb5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Mon Nov 7 20:15:44 2011 Tanaka Akira + + * 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 * io.c (io_fflush): remove fsync(). diff --git a/ext/dbm/dbm.c b/ext/dbm/dbm.c index 2bfd62b3c9..93c1f80c96 100644 --- a/ext/dbm/dbm.c +++ b/ext/dbm/dbm.c @@ -162,6 +162,30 @@ fdbm_initialize(int argc, VALUE *argv, VALUE obj) } } + 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)); diff --git a/ext/dbm/extconf.rb b/ext/dbm/extconf.rb index 91d393b211..be4d030402 100644 --- a/ext/dbm/extconf.rb +++ b/ext/dbm/extconf.rb @@ -21,6 +21,8 @@ headers = { "qdbm" => ["relic.h", "qdbm/relic.h"], } +$dbm_headers = [] + def headers.db_check(db) db_prefix = nil have_gdbm = false @@ -44,6 +46,7 @@ def headers.db_check(db) 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 @@ end 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