Bump to m4 1.4.19
[platform/upstream/m4.git] / tests / fdopen.c
1 /* Open a stream with a given file descriptor.
2    Copyright (C) 2011-2021 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 <https://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 defined _WIN32 && !defined __CYGWIN__
31 # if HAVE_MSVC_INVALID_PARAMETER_HANDLER
32 static FILE *
33 fdopen_nothrow (int fd, const char *mode)
34 {
35   FILE *result;
36
37   TRY_MSVC_INVAL
38     {
39       result = _fdopen (fd, mode);
40     }
41   CATCH_MSVC_INVAL
42     {
43       result = NULL;
44     }
45   DONE_MSVC_INVAL;
46
47   return result;
48 }
49 # else
50 #  define fdopen_nothrow _fdopen
51 # endif
52 #else
53 # define fdopen_nothrow fdopen
54 #endif
55
56 FILE *
57 rpl_fdopen (int fd, const char *mode)
58 {
59   int saved_errno = errno;
60   FILE *fp;
61
62   errno = 0;
63   fp = fdopen_nothrow (fd, mode);
64   if (fp == NULL)
65     {
66       if (errno == 0)
67         errno = EBADF;
68     }
69   else
70     errno = saved_errno;
71
72   return fp;
73 }