pipe-safer.c revision 05436638acc7c010349a69c3395f1a57c642dc62
1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Invoke pipe, but avoid some glitches.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2005-2006, 2009-2012 Free Software Foundation, Inc.
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Written by Jim Meyering.  */
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h>
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "unistd-safer.h"
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <unistd.h>
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <errno.h>
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Like pipe, but ensure that neither of the file descriptors is
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   STDIN_FILENO, STDOUT_FILENO, or STDERR_FILENO.  Fail with ENOSYS on
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   platforms that lack pipe.  */
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectpipe_safer (int fd[2])
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_PIPE
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (pipe (fd) == 0)
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      int i;
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang      for (i = 0; i < 2; i++)
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang        {
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang          fd[i] = fd_safer (fd[i]);
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang          if (fd[i] < 0)
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang            {
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang              int e = errno;
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              close (fd[1 - i]);
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang              errno = e;
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang              return -1;
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang            }
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang        }
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang      return 0;
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  errno = ENOSYS;
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return -1;
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
57