1 /* -*- buffer-read-only: t -*- vi: set ro: */
2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */
3 /* Invoke opendir, but avoid some glitches.
5 Copyright (C) 2009-2011 Free Software Foundation, Inc.
7 This program is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 /* Written by Eric Blake. */
24 #include "dirent-safer.h"
28 #include "unistd-safer.h"
30 /* Like opendir, but do not clobber stdin, stdout, or stderr. */
33 opendir_safer (char const *name)
35 DIR *dp = opendir (name);
41 if (0 <= fd && fd <= STDERR_FILENO)
43 /* If fdopendir is native (as on Linux), then it is safe to
44 assume dirfd(fdopendir(n))==n. If we are using the
45 gnulib module fdopendir, then this guarantee is not met,
46 but fdopendir recursively calls opendir_safer up to 3
47 times to at least get a safe fd. If fdopendir is not
48 present but dirfd is accurate (as on cygwin 1.5.x), then
49 we recurse up to 3 times ourselves. Finally, if dirfd
50 always fails (as on mingw), then we are already safe. */
53 #if HAVE_FDOPENDIR || GNULIB_FDOPENDIR
54 int f = dup_safer (fd);
55 newdp = fdopendir (f);
59 #else /* !FDOPENDIR */
60 newdp = opendir_safer (name);