diff options
Diffstat (limited to 'gl/error.c')
| -rw-r--r-- | gl/error.c | 32 |
1 files changed, 30 insertions, 2 deletions
| @@ -88,6 +88,15 @@ extern void __error_at_line (int status, int errnum, const char *file_name, | |||
| 88 | # include <fcntl.h> | 88 | # include <fcntl.h> |
| 89 | # include <unistd.h> | 89 | # include <unistd.h> |
| 90 | 90 | ||
| 91 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
| 92 | /* Get declarations of the Win32 API functions. */ | ||
| 93 | # define WIN32_LEAN_AND_MEAN | ||
| 94 | # include <windows.h> | ||
| 95 | # endif | ||
| 96 | |||
| 97 | /* The gnulib override of fcntl is not needed in this file. */ | ||
| 98 | # undef fcntl | ||
| 99 | |||
| 91 | # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P | 100 | # if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P |
| 92 | # ifndef HAVE_DECL_STRERROR_R | 101 | # ifndef HAVE_DECL_STRERROR_R |
| 93 | "this configure-time declaration test was not run" | 102 | "this configure-time declaration test was not run" |
| @@ -104,10 +113,29 @@ extern char *program_name; | |||
| 104 | # endif /* HAVE_STRERROR_R || defined strerror_r */ | 113 | # endif /* HAVE_STRERROR_R || defined strerror_r */ |
| 105 | #endif /* not _LIBC */ | 114 | #endif /* not _LIBC */ |
| 106 | 115 | ||
| 116 | #if !_LIBC | ||
| 117 | /* Return non-zero if FD is open. */ | ||
| 118 | static inline int | ||
| 119 | is_open (int fd) | ||
| 120 | { | ||
| 121 | # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ | ||
| 122 | /* On Win32: The initial state of unassigned standard file descriptors is | ||
| 123 | that they are open but point to an INVALID_HANDLE_VALUE. There is no | ||
| 124 | fcntl, and the gnulib replacement fcntl does not support F_GETFL. */ | ||
| 125 | return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE; | ||
| 126 | # else | ||
| 127 | # ifndef F_GETFL | ||
| 128 | # error Please port fcntl to your platform | ||
| 129 | # endif | ||
| 130 | return 0 <= fcntl (fd, F_GETFL); | ||
| 131 | # endif | ||
| 132 | } | ||
| 133 | #endif | ||
| 134 | |||
| 107 | static inline void | 135 | static inline void |
| 108 | flush_stdout (void) | 136 | flush_stdout (void) |
| 109 | { | 137 | { |
| 110 | #if !_LIBC && defined F_GETFL | 138 | #if !_LIBC |
| 111 | int stdout_fd; | 139 | int stdout_fd; |
| 112 | 140 | ||
| 113 | # if GNULIB_FREOPEN_SAFER | 141 | # if GNULIB_FREOPEN_SAFER |
| @@ -124,7 +152,7 @@ flush_stdout (void) | |||
| 124 | /* POSIX states that fflush (stdout) after fclose is unspecified; it | 152 | /* POSIX states that fflush (stdout) after fclose is unspecified; it |
| 125 | is safe in glibc, but not on all other platforms. fflush (NULL) | 153 | is safe in glibc, but not on all other platforms. fflush (NULL) |
| 126 | is always defined, but too draconian. */ | 154 | is always defined, but too draconian. */ |
| 127 | if (0 <= stdout_fd && 0 <= fcntl (stdout_fd, F_GETFL)) | 155 | if (0 <= stdout_fd && is_open (stdout_fd)) |
| 128 | #endif | 156 | #endif |
| 129 | fflush (stdout); | 157 | fflush (stdout); |
| 130 | } | 158 | } |
