1b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Invoke pipe2, but avoid some glitches. 2b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho Copyright (C) 2005-2006, 2009-2012 Free Software Foundation, Inc. 3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 4b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho This program is free software: you can redistribute it and/or modify 5b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho it under the terms of the GNU General Public License as published by 6b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho the Free Software Foundation; either version 3 of the License, or 7b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho (at your option) any later version. 8b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 9b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho This program is distributed in the hope that it will be useful, 10b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho but WITHOUT ANY WARRANTY; without even the implied warranty of 11b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho GNU General Public License for more details. 13b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 14b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho You should have received a copy of the GNU General Public License 15b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Written by Eric Blake. */ 18b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <config.h> 20b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Specification. */ 22b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unistd-safer.h" 23b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 24b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <unistd.h> 25b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include <errno.h> 26b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 27b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho/* Like pipe2, but ensure that neither of the file descriptors is 28b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO. */ 29b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 30b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoint 31b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopipe2_safer (int fd[2], int flags) 32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho{ 33b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho /* This is a generalization of the pipe_safer implementation. */ 34b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (pipe2 (fd, flags) == 0) 35b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 36b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int i; 37b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho for (i = 0; i < 2; i++) 38b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 39b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho fd[i] = fd_safer_flag (fd[i], flags); 40b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (fd[i] < 0) 41b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho { 42b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho int e = errno; 43b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho close (fd[1 - i]); 44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho errno = e; 45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 48b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 49b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return 0; 50b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 51b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return -1; 52b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 53b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho