>From 14e1f1c39766bcb3fe4d6ec975ecac4058d11d98 Mon Sep 17 00:00:00 2001
From: Paul Eggert
Date: Sat, 5 Jan 2019 11:02:51 -0800
Subject: [PATCH 1/4] stdopen: copy from last use in coreutils
* lib/stdopen.c, lib/stdopen.h, m4/stdopen.m4:
New files, taken from their last commit in coreutils
2007-07-23T12:35:address@hidden
71aa3ea88084d17bcb4fc1031ad7b66f8647115e.
---
ChangeLog | 8 ++++++
lib/stdopen.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++
lib/stdopen.h | 16 +++++++++++
m4/stdopen.m4 | 13 +++++++++
4 files changed, 111 insertions(+)
create mode 100644 lib/stdopen.c
create mode 100644 lib/stdopen.h
create mode 100644 m4/stdopen.m4
diff --git a/ChangeLog b/ChangeLog
index d05cd8453..72d75ef26 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2019-01-05 Paul Eggert
+
+ stdopen: copy from last use in coreutils
+ * lib/stdopen.c, lib/stdopen.h, m4/stdopen.m4:
+ New files, taken from their last commit in coreutils
+ 2007-07-23T12:35:address@hidden
+ 71aa3ea88084d17bcb4fc1031ad7b66f8647115e.
+
2019-01-05 Bruno Haible
argp: Don't pass an invalid argument to dgettext().
diff --git a/lib/stdopen.c b/lib/stdopen.c
new file mode 100644
index 000000000..e9b554485
--- /dev/null
+++ b/lib/stdopen.c
@@ -0,0 +1,74 @@
+/* stdopen.c - ensure that the three standard file descriptors are in use
+
+ Copyright (C) 2005, 2006 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see . */
+
+/* Written by Paul Eggert and Jim Meyering. */
+
+#include
+
+#include "stdopen.h"
+
+#include
+#include
+#include
+#include
+#include
+
+/* Try to ensure that all of the standard file numbers (0, 1, 2)
+ are in use. Without this, each application would have to guard
+ every call to open, dup, fopen, etc. with tests to ensure they
+ don't use one of the special file numbers when opening a file.
+ Return false if at least one of the file descriptors is initially
+ closed and an attempt to reopen it fails. Otherwise, return true. */
+bool
+stdopen (void)
+{
+ int fd;
+ bool ok = true;
+
+ for (fd = 0; fd <= 2; fd++)
+ {
+ if (fcntl (fd, F_GETFD) < 0)
+ {
+ if (errno != EBADF)
+ ok = false;
+ else
+ {
+ static const int contrary_mode[]
+ = { O_WRONLY, O_RDONLY, O_RDONLY };
+ int mode = contrary_mode[fd];
+ int new_fd;
+ /* Open /dev/null with the contrary mode so that the typical
+ read (stdin) or write (stdout, stderr) operation will fail.
+ With descriptor 0, we can do even better on systems that
+ have /dev/full, by opening that write-only instead of
+ /dev/null. The only drawback is that a write-provoked
+ failure comes with a misleading errno value, ENOSPC. */
+ if (mode == O_RDONLY
+ || (new_fd = open ("/dev/full", mode) != fd))
+ new_fd = open ("/dev/null", mode);
+ if (new_fd != fd)
+ {
+ if (0 <= new_fd)
+ close (new_fd);
+ ok = false;
+ }
+ }
+ }
+ }
+
+ return ok;
+}
diff --git a/lib/stdopen.h b/lib/stdopen.h
new file mode 100644
index 000000000..d54e5f135
--- /dev/null
+++ b/lib/stdopen.h
@@ -0,0 +1,16 @@
+#ifndef STDOPEN_H
+# define STDOPEN_H 1
+
+# include
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+bool stdopen (void);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/m4/stdopen.m4 b/m4/stdopen.m4
new file mode 100644
index 000000000..b18c22ddf
--- /dev/null
+++ b/m4/stdopen.m4
@@ -0,0 +1,13 @@
+#serial 1
+dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_STDOPEN],
+[
+ AC_LIBSOURCES([stdopen.c, stdopen.h])
+ AC_LIBOBJ([stdopen])
+
+ dnl Prerequisites.
+])
--
2.20.1