Mercurial > gnulib
view tests/test-nonblocking-socket-main.c @ 39186:c1c789fe74ad
spawn-pipe: Silence a clang warning.
Reported by Tim Rühsen <tim.ruehsen@gmx.de>.
* lib/spawn-pipe.c: Disable clang -Wconditional-uninitialized warnings
in this file.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Fri, 15 Dec 2017 10:44:15 +0100 |
parents | a8586d5e30d2 |
children | 10eb9086bea0 |
line wrap: on
line source
/* Test for nonblocking read and write on sockets. Copyright (C) 2011-2017 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 of the License, 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 <https://www.gnu.org/licenses/>. */ #include <config.h> #include <errno.h> #include <stdbool.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/time.h> #include <sys/socket.h> #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # include <process.h> #else # include <spawn.h> #endif #include "nonblocking.h" #include "wait-process.h" #include "macros.h" #include "socket-server.h" #include "test-nonblocking-socket.h" #define PROG_ROLE "main" #include "test-nonblocking-writer.h" int main (int argc, char *argv[]) { const char *child_path; int test; int server; int port; int child; int server_socket; int exitcode; child_path = argv[1]; test = atoi (argv[2]); /* Create a server socket. */ server = create_server (0, 1, &port); /* Spawn the child process. */ { char port_arg[10+1]; const char *child_argv[4]; sprintf (port_arg, "%u", port); child_argv[0] = child_path; child_argv[1] = argv[2]; child_argv[2] = port_arg; child_argv[3] = NULL; #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ child = spawnvpe (P_NOWAIT, child_path, child_argv, (const char **) environ); ASSERT (child >= 0); #else { pid_t child_pid; int err = posix_spawnp (&child_pid, child_path, NULL, NULL, (char **) child_argv, environ); ASSERT (err == 0); child = child_pid; } #endif } /* Accept a connection from the child process. */ server_socket = create_server_socket (server); /* Prepare the file descriptor. */ if (test & 1) ASSERT (set_nonblocking_flag (server_socket, true) >= 0); #if ENABLE_DEBUGGING # ifdef SO_SNDBUF { int value; socklen_t value_len = sizeof (value); if (getsockopt (server_socket, SOL_SOCKET, SO_SNDBUF, &value, &value_len) >= 0) fprintf (stderr, "SO_SNDBUF = %d\n", value); } # endif # ifdef SO_RCVBUF { int value; socklen_t value_len = sizeof (value); if (getsockopt (server_socket, SOL_SOCKET, SO_RCVBUF, &value, &value_len) >= 0) fprintf (stderr, "SO_RCVBUF = %d\n", value); } # endif #endif exitcode = main_writer_loop (test, SOCKET_DATA_BLOCK_SIZE, server_socket, SOCKET_HAS_LARGE_BUFFER); { int err = wait_subprocess (child, child_path, false, false, false, false, NULL); ASSERT (err == 0); } return exitcode; }