dup-safer.c revision cea198a11f15a2eb071d98491ca9a8bc8cebfbc4
1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Invoke dup, but avoid some glitches.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 2001, 2004, 2005 Free Software Foundation, Inc.
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   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
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   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
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with this program; if not, write to the Free Software Foundation,
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Written by Paul Eggert.  */
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_CONFIG_H
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <config.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "unistd-safer.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <fcntl.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <unistd.h>
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef STDERR_FILENO
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define STDERR_FILENO 2
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Like dup, but do not return STDIN_FILENO, STDOUT_FILENO, or
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   STDERR_FILENO.  */
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectdup_safer (int fd)
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef F_DUPFD
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return fcntl (fd, F_DUPFD, STDERR_FILENO + 1);
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* fd_safer calls us back, but eventually the recursion unwinds and
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     does the right thing.  */
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return fd_safer (dup (fd));
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
47