Hi Simon, On mingw, the gethostname test fails for me:
gethostname failed, rc -1 errno 10093 FAIL: test-gethostname.exe The reason is that the WSAStartup function has not been called. Why not make this initialization implicitly in the gethostname function? And likewise for the socket() function? With that, the unit tests (test-select.c and test-poll.c) don't need to do this initialization explicitly any more. One less portability problem when porting to mingw. Here are two proposed patches. I verified that the behaviour of test-select and test-poll does not change, and it fixes the gethostname failure. 2009-08-02 Bruno Haible <br...@clisp.org> Allow multiple calls to gl_sockets_startup. * lib/sockets.c (initialized_sockets_version): New variable. (gl_sockets_startup): Do nothing if already called for this or a higher version. (gl_sockets_cleanup): Reset initialized_sockets_version. *** lib/sockets.c.orig 2009-08-02 16:35:41.000000000 +0200 --- lib/sockets.c 2009-08-02 16:31:19.000000000 +0200 *************** *** 69,91 **** static struct close_hook close_sockets_hook; #endif int gl_sockets_startup (int version) { #if WINDOWS_SOCKETS ! WSADATA data; ! int err; ! err = WSAStartup (version, &data); ! if (err != 0) ! return 1; ! if (data.wVersion < version) ! return 2; ! register_close_hook (close_fd_maybe_socket, &close_sockets_hook); #endif return 0; --- 69,99 ---- static struct close_hook close_sockets_hook; + static int initialized_sockets_version /* = 0 */; + #endif int gl_sockets_startup (int version) { #if WINDOWS_SOCKETS ! if (version > initialized_sockets_version) ! { ! WSADATA data; ! int err; ! ! err = WSAStartup (version, &data); ! if (err != 0) ! return 1; ! if (data.wVersion < version) ! return 2; ! if (initialized_sockets_version == 0) ! register_close_hook (close_fd_maybe_socket, &close_sockets_hook); ! initialized_sockets_version = version; ! } #endif return 0; *************** *** 97,102 **** --- 105,112 ---- #if WINDOWS_SOCKETS int err; + initialized_sockets_version = 0; + unregister_close_hook (&close_sockets_hook); err = WSACleanup (); 2009-08-02 Bruno Haible <br...@clisp.org> Implicitly initialize the sockets library. * lib/gethostname.c: Include sockets.h. (rpl_gethostname): Invoke gl_sockets_startup. * lib/socket.c: Include sockets.h. (rpl_socket): Invoke gl_sockets_startup. * modules/gethostname (Depends-on): Add sockets. * modules/socket (Depends-on): Likewise. * tests/test-poll.c: Don't include sockets.h. (main): Don't invoke gl_sockets_startup. * tests/test-select.c: Don't include sockets.h. (main): Don't invoke gl_sockets_startup. --- lib/gethostname.c.orig 2009-08-02 16:43:05.000000000 +0200 +++ lib/gethostname.c 2009-08-02 16:10:57.000000000 +0200 @@ -79,6 +79,8 @@ /* Get set_winsock_errno. */ #include "w32sock.h" +#include "sockets.h" + #undef gethostname int @@ -88,6 +90,7 @@ if (len > INT_MAX) len = INT_MAX; + gl_sockets_startup (SOCKETS_1_1); r = gethostname (name, (int) len); if (r < 0) set_winsock_errno (); --- lib/socket.c.orig 2009-08-02 16:43:05.000000000 +0200 +++ lib/socket.c 2009-08-02 16:23:24.000000000 +0200 @@ -1,6 +1,6 @@ /* socket.c --- wrappers for Windows socket function - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2009 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 @@ -26,12 +26,18 @@ /* Get set_winsock_errno, FD_TO_SOCKET etc. */ #include "w32sock.h" +#include "sockets.h" + int rpl_socket (int domain, int type, int protocol) { + SOCKET fh; + + gl_sockets_startup (SOCKETS_1_1); + /* We have to use WSASocket() to create non-overlapped IO sockets. Overlapped IO sockets cannot be used with read/write. */ - SOCKET fh = WSASocket (domain, type, protocol, NULL, 0, 0); + fh = WSASocket (domain, type, protocol, NULL, 0, 0); if (fh == INVALID_SOCKET) { --- modules/gethostname.orig 2009-08-02 16:43:05.000000000 +0200 +++ modules/gethostname 2009-08-02 16:16:26.000000000 +0200 @@ -10,6 +10,7 @@ unistd sys_socket errno +sockets configure.ac: gl_FUNC_GETHOSTNAME --- modules/socket.orig 2009-08-02 16:43:05.000000000 +0200 +++ modules/socket 2009-08-02 16:16:35.000000000 +0200 @@ -8,6 +8,7 @@ Depends-on: sys_socket errno +sockets configure.ac: AC_REQUIRE([gl_HEADER_SYS_SOCKET]) --- tests/test-poll.c.orig 2009-08-02 16:43:05.000000000 +0200 +++ tests/test-poll.c 2009-08-02 16:13:10.000000000 +0200 @@ -1,5 +1,5 @@ /* Test of poll() function. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2009 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 @@ -30,7 +30,6 @@ #include <stdbool.h> #include <sys/ioctl.h> #include <errno.h> -#include "sockets.h" #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # define WIN32_NATIVE @@ -360,8 +359,6 @@ { int result; - gl_sockets_startup (SOCKETS_1_1); - #ifdef INTERACTIVE printf ("Please press Enter\n"); test (test_tty, "TTY"); --- tests/test-select.c.orig 2009-08-02 16:43:05.000000000 +0200 +++ tests/test-select.c 2009-08-02 16:13:26.000000000 +0200 @@ -1,5 +1,5 @@ /* Test of select() substitute. - Copyright (C) 2008 Free Software Foundation, Inc. + Copyright (C) 2008-2009 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 @@ -29,7 +29,6 @@ #include <stdbool.h> #include <sys/ioctl.h> #include <errno.h> -#include "sockets.h" enum { SEL_IN = 1, SEL_OUT = 2, SEL_EXC = 4 }; @@ -360,8 +359,6 @@ { int result; - gl_sockets_startup (SOCKETS_1_1); - #ifdef INTERACTIVE printf ("Please press Enter\n"); test (test_tty, "TTY");