1/* Set a file descriptor's mode to binary or to text.
2
3   Copyright (C) 2001 Free Software Foundation, Inc.
4
5   This program is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 2, or (at your option)
8   any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   You should have received a copy of the GNU General Public License
16   along with this program; see the file COPYING.
17   If not, write to the Free Software Foundation,
18   59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19
20/* Written by Paul Eggert <eggert@twinsun.com>  */
21
22#if HAVE_CONFIG_H
23# include <config.h>
24#endif
25
26#if HAVE_STDBOOL_H
27# include <stdbool.h>
28#else
29typedef enum {false = 0, true = 1} bool;
30#endif
31
32#if HAVE_SETMODE_DOS
33# include <io.h>
34# if HAVE_FCNTL_H
35#  include <fcntl.h>
36# endif
37# if HAVE_UNISTD_H
38#  include <unistd.h>
39# endif
40#endif
41
42#include "setmode.h"
43#undef set_binary_mode
44
45
46/* Set the binary mode of FD to MODE, returning its previous mode.
47   MODE is 1 for binary and 0 for text.  If setting the mode might
48   cause problems, ignore the request and return MODE.  Always return
49   1 on POSIX platforms, which do not distinguish between text and
50   binary.  */
51
52bool
53set_binary_mode (int fd, bool mode)
54{
55#if HAVE_SETMODE_DOS
56  if (isatty (fd))
57    return mode;
58  return setmode (fd, mode ? O_BINARY : O_TEXT) != O_TEXT;
59#else
60  return 1;
61#endif
62}
63