pty: Activate the signature wrapper of forkpty.
[gnulib.git] / lib / fdopen.c
1 /* Open a stream with a given file descriptor.
2    Copyright (C) 2011-2013 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17 #include <config.h>
18
19 /* Specification.  */
20 #include <stdio.h>
21
22 #include <errno.h>
23
24 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER
25 # include "msvc-inval.h"
26 #endif
27
28 #undef fdopen
29
30 #if HAVE_MSVC_INVALID_PARAMETER_HANDLER
31 static FILE *
32 fdopen_nothrow (int fd, const char *mode)
33 {
34   FILE *result;
35
36   TRY_MSVC_INVAL
37     {
38       result = fdopen (fd, mode);
39     }
40   CATCH_MSVC_INVAL
41     {
42       result = NULL;
43     }
44   DONE_MSVC_INVAL;
45
46   return result;
47 }
48 #else
49 # define fdopen_nothrow fdopen
50 #endif
51
52 FILE *
53 rpl_fdopen (int fd, const char *mode)
54 {
55   int saved_errno = errno;
56   FILE *fp;
57
58   errno = 0;
59   fp = fdopen_nothrow (fd, mode);
60   if (fp == NULL)
61     {
62       if (errno == 0)
63         errno = EBADF;
64     }
65   else
66     errno = saved_errno;
67
68   return fp;
69 }