diff --git a/Makefile.am b/Makefile.am index 409f784e1..266a61c6a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -497,6 +497,7 @@ libthread_a_SOURCES = \ libnet_a_SOURCES = \ src/net/Features.hxx \ + src/net/Init.hxx \ src/net/ToString.cxx src/net/ToString.hxx \ src/net/Resolver.cxx src/net/Resolver.hxx \ src/net/StaticSocketAddress.cxx src/net/StaticSocketAddress.hxx \ diff --git a/src/Main.cxx b/src/Main.cxx index 121ae9c78..def4aed30 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -50,6 +50,7 @@ #include "unix/SignalHandlers.hxx" #include "system/FatalError.hxx" #include "thread/Slack.hxx" +#include "net/Init.hxx" #include "lib/icu/Init.hxx" #include "config/ConfigGlobal.hxx" #include "config/Param.hxx" @@ -106,11 +107,6 @@ #include #endif -#ifdef _WIN32 -#include -#include -#endif - #ifdef __BLOCKS__ #include #endif @@ -284,25 +280,6 @@ glue_state_file_init() instance->state_file->Read(); } -/** - * Windows-only initialization of the Winsock2 library. - */ -static void winsock_init(void) -{ -#ifdef _WIN32 - WSADATA sockinfo; - - int retval = WSAStartup(MAKEWORD(2, 2), &sockinfo); - if(retval != 0) - FormatFatalError("Attempt to open Winsock2 failed; error code %d", - retval); - - if (LOBYTE(sockinfo.wVersion) != 2) - FatalError("We use Winsock2 but your version is either too new " - "or old; please install Winsock 2.x"); -#endif -} - /** * Initialize the decoder and player core, including the music pipe. */ @@ -451,7 +428,8 @@ try { IcuInit(); - winsock_init(); + const ScopeNetInit net_init; + io_thread_init(); config_global_init(); @@ -702,10 +680,6 @@ try { daemonize_finish(); #endif -#ifdef _WIN32 - WSACleanup(); -#endif - IcuFinish(); log_deinit(); diff --git a/src/net/Init.hxx b/src/net/Init.hxx new file mode 100644 index 000000000..9e4581438 --- /dev/null +++ b/src/net/Init.hxx @@ -0,0 +1,46 @@ +/* + * Copyright 2003-2017 The Music Player Daemon Project + * http://www.musicpd.org + * + * 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 2 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, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#ifndef NET_INIT_HXX +#define NET_INIT_HXX + +#include "check.h" +#include "SocketError.hxx" + +#ifdef _WIN32 +#include +#endif + +class ScopeNetInit { +#ifdef _WIN32 +public: + ScopeNetInit() { + WSADATA sockinfo; + int retval = WSAStartup(MAKEWORD(2, 2), &sockinfo); + if (retval != 0) + throw MakeSocketError(retval, "WSAStartup() failed"); + } + + ~ScopeNetInit() noexcept { + WSACleanup(); + } +#endif +}; + +#endif