summaryrefslogtreecommitdiff
path: root/bfd/bfdio.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2008-11-06 14:10:46 +0000
committerTom Tromey <tromey@redhat.com>2008-11-06 14:10:46 +0000
commit28f5788e8e38ca4fa217dbb2b661af62e22a2ff5 (patch)
tree810fecc3229620ef313ac057cf91ced1fcf59d66 /bfd/bfdio.c
parentdfc070a118f312d50c16cb04d157f50e4bb40754 (diff)
downloadbinutils-redhat-28f5788e8e38ca4fa217dbb2b661af62e22a2ff5.tar.gz
* configure, config.in: Rebuild.
* configure.in: Check for fileno. * bfdio.c (close_on_exec): New function. (real_fopen): Use it. (FD_CLOEXEC): New define.
Diffstat (limited to 'bfd/bfdio.c')
-rw-r--r--bfd/bfdio.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/bfd/bfdio.c b/bfd/bfdio.c
index d8aa1de999..cb06453e01 100644
--- a/bfd/bfdio.c
+++ b/bfd/bfdio.c
@@ -38,6 +38,10 @@
#define S_IXOTH 0001 /* Execute by others. */
#endif
+#ifndef FD_CLOEXEC
+#define FD_CLOEXEC 1
+#endif
+
file_ptr
real_ftell (FILE *file)
{
@@ -62,13 +66,30 @@ real_fseek (FILE *file, file_ptr offset, int whence)
#endif
}
+/* Mark FILE as close-on-exec. Return FILE. FILE may be NULL, in
+ which case nothing is done. */
+static FILE *
+close_on_exec (FILE *file)
+{
+#if defined (HAVE_FILENO) && defined (F_GETFD)
+ if (file)
+ {
+ int fd = fileno (file);
+ int old = fcntl (fd, F_GETFD, 0);
+ if (old >= 0)
+ fcntl (fd, F_SETFD, old | FD_CLOEXEC);
+ }
+#endif
+ return file;
+}
+
FILE *
real_fopen (const char *filename, const char *modes)
{
#if defined (HAVE_FOPEN64)
- return fopen64 (filename, modes);
+ return close_on_exec (fopen64 (filename, modes));
#else
- return fopen (filename, modes);
+ return close_on_exec (fopen (filename, modes));
#endif
}