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

ruby-changes:21492

From: akr <ko1@a...>
Date: Fri, 28 Oct 2011 06:07:35 +0900 (JST)
Subject: [ruby-changes:21492] akr:r33541 (trunk): * ext/sdbm/_sdbm.c (sdbm_prep): set FD_CLOEXEC flags for file

akr	2011-10-28 06:07:23 +0900 (Fri, 28 Oct 2011)

  New Revision: 33541

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

  Log:
    * ext/sdbm/_sdbm.c (sdbm_prep): set FD_CLOEXEC flags for file
      descriptors.
      (fd_set_cloexec): new function.

  Modified files:
    trunk/ChangeLog
    trunk/ext/sdbm/_sdbm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33540)
+++ ChangeLog	(revision 33541)
@@ -1,3 +1,9 @@
+Fri Oct 28 06:06:08 2011  Tanaka Akira  <akr@f...>
+
+	* ext/sdbm/_sdbm.c (sdbm_prep): set FD_CLOEXEC flags for file
+	  descriptors.
+	  (fd_set_cloexec): new function.
+
 Fri Oct 28 03:01:27 2011  Aaron Patterson <aaron@t...>
 
 	* vm_insnhelper.c (vm_call_cfunc): adding back useless hack.  For some
Index: ext/sdbm/_sdbm.c
===================================================================
--- ext/sdbm/_sdbm.c	(revision 33540)
+++ ext/sdbm/_sdbm.c	(revision 33541)
@@ -178,6 +178,29 @@
 	return db;
 }
 
+static int
+fd_set_cloexec(int fd)
+{
+  /* MinGW don't have F_GETFD and FD_CLOEXEC.  [ruby-core:40281] */
+#ifdef F_GETFD
+    int flags, ret;
+    flags = fcntl(fd, F_GETFD); /* should not fail except EBADF. */
+    if (flags == -1) {
+        return -1;
+    }
+    if (2 < fd) {
+        if (!(flags & FD_CLOEXEC)) {
+            flags |= FD_CLOEXEC;
+            ret = fcntl(fd, F_SETFD, flags);
+            if (ret == -1) {
+                return -1;
+            }
+        }
+    }
+#endif
+    return 0;
+}
+
 DBM *
 sdbm_prep(char *dirname, char *pagname, int flags, int mode)
 {
@@ -209,7 +232,9 @@
 	flags |= O_BINARY;
 
 	if ((db->pagf = open(pagname, flags, mode)) == -1) goto err;
+        if (fd_set_cloexec(db->pagf) == -1) goto err;
         if ((db->dirf = open(dirname, flags, mode)) == -1) goto err;
+        if (fd_set_cloexec(db->dirf) == -1) goto err;
 /*
  * need the dirfile size to establish max bit number.
  */

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

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