From: Sergey Poznyakoff Date: Fri, 8 Jan 2021 16:48:17 +0000 (+0200) Subject: Use stdopen from gnulib X-Git-Tag: release_1_34~8 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=0b43ea2906432873416576cb90608f72b6fbf18a;p=thirdparty%2Ftar.git Use stdopen from gnulib * gnulib.modules: Request stdopen * lib/Makefile.am: Remove stdopen.c and stdopen.h * lib/stdopen.c: Remove. * lib/stdopen.h: Remove. * src/tar.c: stdopen returns 0 on success. --- diff --git a/gnulib.modules b/gnulib.modules index f1633720..68936094 100644 --- a/gnulib.modules +++ b/gnulib.modules @@ -83,6 +83,7 @@ stat-time stdbool stdint stpcpy +stdopen strdup-posix strerror strnlen diff --git a/lib/Makefile.am b/lib/Makefile.am index e6bcb245..8fbe1c37 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -32,7 +32,6 @@ AM_CFLAGS = $(GNULIB_WARN_CFLAGS) $(WERROR_CFLAGS) noinst_HEADERS = \ paxlib.h\ rmt.h\ - stdopen.h\ system.h\ system-ioctl.h\ wordsplit.h\ @@ -42,7 +41,6 @@ libtar_a_SOURCES = \ paxerror.c paxexit-status.c paxlib.h paxnames.c \ rtapelib.c \ rmt.h \ - stdopen.c stdopen.h \ system.h system-ioctl.h \ wordsplit.c\ xattr-at.c diff --git a/lib/stdopen.c b/lib/stdopen.c deleted file mode 100644 index 8c891168..00000000 --- a/lib/stdopen.c +++ /dev/null @@ -1,83 +0,0 @@ -/* stdopen.c - ensure that the three standard file descriptors are in use - - Copyright 2005-2021 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, 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. */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#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 = -1; - /* 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_WRONLY) - { - if ((new_fd = open ("/dev/full", mode)) != fd) - { - close (new_fd); - new_fd = -1; - } - } - if (new_fd == -1) - 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 deleted file mode 100644 index d54e5f13..00000000 --- a/lib/stdopen.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef STDOPEN_H -# define STDOPEN_H 1 - -# include - -# ifdef __cplusplus -extern "C" { -# endif - -bool stdopen (void); - -# ifdef __cplusplus -} -# endif - -#endif diff --git a/src/tar.c b/src/tar.c index 61d77c3d..83072f12 100644 --- a/src/tar.c +++ b/src/tar.c @@ -2753,9 +2753,9 @@ main (int argc, char **argv) close_stdout_set_file_name (_("stdout")); /* Make sure we have first three descriptors available */ - if (!stdopen ()) - FATAL_ERROR ((0, errno, "%s", - _("failed to ensure first three descriptors are available"))); + if (stdopen ()) + FATAL_ERROR ((0, 0, "%s", + _("failed to assert availability of the standard file descriptors"))); /* Pre-allocate a few structures. */