X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=tests%2Ftest-pipe2.c;h=0e56dc5b8eb68a6164670b7416ac9d6d94292655;hb=cd56634a4a8179fd5a4419fbb3e27211b042ab1c;hp=e450469bd6bec1ff4f36cebe4162ab26a3c9183e;hpb=d72a58196097ef02dcd3529050b83f92518770c6;p=gnulib.git diff --git a/tests/test-pipe2.c b/tests/test-pipe2.c index e450469bd..0e56dc5b8 100644 --- a/tests/test-pipe2.c +++ b/tests/test-pipe2.c @@ -1,5 +1,5 @@ /* Test of pipe2. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2014 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 @@ -12,42 +12,38 @@ 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, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program; if not, see . */ #include #include +#include "signature.h" +SIGNATURE_CHECK (pipe2, int, (int[2], int)); + #include #include #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ -/* Get declarations of the Win32 API functions. */ +/* Get declarations of the native Windows API functions. */ # define WIN32_LEAN_AND_MEAN # include +/* Get _get_osfhandle. */ +# include "msvc-nothrow.h" #endif #include "binary-io.h" - -#define ASSERT(expr) \ - do \ - { \ - if (!(expr)) \ - { \ - fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ - fflush (stderr); \ - abort (); \ - } \ - } \ - while (0) +#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 Win32, the initial state of unassigned standard file + /* 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; @@ -75,19 +71,22 @@ is_cloexec (int fd) #endif } -/* Return true if FD is in non-blocking mode. */ -static bool -is_nonblocking (int fd) +#if ! GNULIB_NONBLOCKING +static int +get_nonblocking_flag (int fd) { -#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ - /* We don't use the non-blocking mode for sockets here. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ return 0; -#else +# 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 } +#endif int main () @@ -95,58 +94,49 @@ main () int use_nonblocking; int use_cloexec; -#if !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) - for (use_nonblocking = 0; use_nonblocking <= 1; use_nonblocking++) -#else - use_nonblocking = 0; -#endif -#if defined O_CLOEXEC - for (use_cloexec = 0; use_cloexec <= 1; use_cloexec++) -#else - use_cloexec = 0; -#endif + 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 !((defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__) - if (use_nonblocking) - o_flags |= O_NONBLOCK; -#endif -#if defined O_CLOEXEC - if (use_cloexec) - o_flags |= O_CLOEXEC; -#endif - - 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]) >= 0); - ASSERT (is_open (fd[1]) >= 0); - 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 (is_nonblocking (fd[0])); - ASSERT (is_nonblocking (fd[1])); - } - else - { - ASSERT (!is_nonblocking (fd[0])); - ASSERT (!is_nonblocking (fd[1])); - } + 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;