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/