Mercurial > gnulib
view tests/test-pipe2.c @ 17363:5a51fb7777a9
sys_select, sys_time: port 2013-01-30 Solaris 2.6 fix to Cygwin
Problem reported by Marco Atzeri in
<http://lists.gnu.org/archive/html/bug-gnulib/2013-03/msg00000.html>.
* lib/sys_select.in.h [HAVE_SYS_SELECT_H && _CYGWIN_SYS_TIME_H]:
Simply delegate to the system <sys/select.h> in this case too.
Also, pay attention to _GL_SYS_SELECT_H_REDIRECT_FROM_SYS_TIME_H only
if OSF/1, since otherwise Cygwin breaks, and it doesn't seem to
be needed on Solaris either.
* lib/sys_time.in.h [_CYGWIN_SYS_TIME_H]:
Simply delgate to the system <sys/time.h> in this case.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Tue, 19 Mar 2013 09:08:47 -0700 |
parents | e542fd46ad6f |
children | 344018b6e5d7 |
line wrap: on
line source
/* Test of pipe2. Copyright (C) 2009-2013 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see <http://www.gnu.org/licenses/>. */ #include <config.h> #include <unistd.h> #include "signature.h" SIGNATURE_CHECK (pipe2, int, (int[2], int)); #include <fcntl.h> #include <stdbool.h> #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include <windows.h> /* Get _get_osfhandle. */ # include "msvc-nothrow.h" #endif #include "binary-io.h" #include "macros.h" #if GNULIB_NONBLOCKING # include "nonblocking.h" #endif /* Return true if FD is open. */ static bool is_open (int fd) { #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ /* On native Windows, the initial state of unassigned standard file descriptors is that they are open but point to an INVALID_HANDLE_VALUE, and there is no fcntl. */ return (HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE; #else # ifndef F_GETFL # error Please port fcntl to your platform # endif return 0 <= fcntl (fd, F_GETFL); #endif } /* Return true if FD is not inherited to child processes. */ static bool is_cloexec (int fd) { #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ HANDLE h = (HANDLE) _get_osfhandle (fd); DWORD flags; ASSERT (GetHandleInformation (h, &flags)); return (flags & HANDLE_FLAG_INHERIT) == 0; #else int flags; ASSERT ((flags = fcntl (fd, F_GETFD)) >= 0); return (flags & FD_CLOEXEC) != 0; #endif } #if ! GNULIB_NONBLOCKING static int get_nonblocking_flag (int fd) { # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ return 0; # else # ifndef F_GETFL # error Please port fcntl to your platform # endif int flags; ASSERT ((flags = fcntl (fd, F_GETFL)) >= 0); return (flags & O_NONBLOCK) != 0; # endif } #endif int main () { int use_nonblocking; int use_cloexec; for (use_nonblocking = 0; use_nonblocking <= !!O_NONBLOCK; use_nonblocking++) for (use_cloexec = 0; use_cloexec <= !!O_CLOEXEC; use_cloexec++) { int o_flags; int fd[2]; o_flags = 0; if (use_nonblocking) o_flags |= O_NONBLOCK; if (use_cloexec) o_flags |= O_CLOEXEC; fd[0] = -1; fd[1] = -1; ASSERT (pipe2 (fd, o_flags) >= 0); ASSERT (fd[0] >= 0); ASSERT (fd[1] >= 0); ASSERT (fd[0] != fd[1]); ASSERT (is_open (fd[0])); ASSERT (is_open (fd[1])); if (use_cloexec) { ASSERT (is_cloexec (fd[0])); ASSERT (is_cloexec (fd[1])); } else { ASSERT (!is_cloexec (fd[0])); ASSERT (!is_cloexec (fd[1])); } if (use_nonblocking) { ASSERT (get_nonblocking_flag (fd[0]) == 1); ASSERT (get_nonblocking_flag (fd[1]) == 1); } else { ASSERT (get_nonblocking_flag (fd[0]) == 0); ASSERT (get_nonblocking_flag (fd[1]) == 0); } ASSERT (close (fd[0]) == 0); ASSERT (close (fd[1]) == 0); } return 0; }