| /* Adjust a file descriptor result so that it avoids clobbering | |
| STD{IN,OUT,ERR}_FILENO, with specific flags. | |
| Copyright (C) 2005-2006, 2009-2026 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 <https://www.gnu.org/licenses/>. */ | |
| /* Written by Paul Eggert and Eric Blake. */ | |
| #include <config.h> | |
| /* Specification. */ | |
| #include "unistd-safer.h" | |
| #include <errno.h> | |
| #include <unistd.h> | |
| /* Return FD, unless FD would be a copy of standard input, output, or | |
| error; in that case, return a duplicate of FD, closing FD. If FLAG | |
| contains O_CLOEXEC, the returned FD will have close-on-exec | |
| semantics. On failure to duplicate, close FD, set errno, and | |
| return -1. Preserve errno if FD is negative, so that the caller | |
| can always inspect errno when the returned value is negative. | |
| This function is usefully wrapped around functions that return file | |
| descriptors, e.g., fd_safer_flag (open ("file", O_RDONLY | flag), flag). */ | |
| int | |
| fd_safer_flag (int fd, int flag) | |
| { | |
| if (STDIN_FILENO <= fd && fd <= STDERR_FILENO) | |
| { | |
| int f = dup_safer_flag (fd, flag); | |
| int saved_errno = errno; | |
| close (fd); | |
| errno = saved_errno; | |
| fd = f; | |
| } | |
| return fd; | |
| } |