From abe4c5766371f458b902fe92a61d7d6d11badf38 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 2 Aug 2014 08:45:44 +0200 Subject: configure.ac: prepare for 0.18.13 --- NEWS | 2 ++ configure.ac | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 8cc6cdd81..8d0ddc1ff 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,5 @@ +ver 0.18.13 (not yet released) + ver 0.18.12 (2014/07/30) * database - proxy: fix build failure with libmpdclient 2.2 diff --git a/configure.ac b/configure.ac index 36f785f4d..bcaec1a85 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,6 @@ AC_PREREQ(2.60) -AC_INIT(mpd, 0.18.12, mpd-devel@musicpd.org) +AC_INIT(mpd, 0.18.13, mpd-devel@musicpd.org) VERSION_MAJOR=0 VERSION_MINOR=18 -- cgit v1.2.3 From 14c538c9c73b23b807e5327399db6bb991c808bb Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 24 Jan 2014 16:14:05 +0100 Subject: Win32Main: move to win32/ --- .gitignore | 2 +- Makefile.am | 12 +-- configure.ac | 2 +- src/Win32Main.cxx | 173 ------------------------------------------- src/win/mpd.ico | Bin 353118 -> 0 bytes src/win/mpd_win32_rc.rc.in | 34 --------- src/win32/Win32Main.cxx | 173 +++++++++++++++++++++++++++++++++++++++++++ src/win32/mpd.ico | Bin 0 -> 353118 bytes src/win32/mpd_win32_rc.rc.in | 34 +++++++++ 9 files changed, 215 insertions(+), 215 deletions(-) delete mode 100644 src/Win32Main.cxx delete mode 100644 src/win/mpd.ico delete mode 100644 src/win/mpd_win32_rc.rc.in create mode 100644 src/win32/Win32Main.cxx create mode 100644 src/win32/mpd.ico create mode 100644 src/win32/mpd_win32_rc.rc.in diff --git a/.gitignore b/.gitignore index 3c8552099..9b052a29f 100644 --- a/.gitignore +++ b/.gitignore @@ -40,7 +40,7 @@ tags .#* .stgit* src/dsd2pcm/dsd2pcm -src/win/mpd_win32_rc.rc +src/win32/mpd_win32_rc.rc doc/doxygen.conf doc/protocol.html doc/protocol diff --git a/Makefile.am b/Makefile.am index 25352e362..6ef21ee23 100644 --- a/Makefile.am +++ b/Makefile.am @@ -151,7 +151,7 @@ src_mpd_SOURCES = \ src/IOThread.cxx src/IOThread.hxx \ src/Main.cxx src/Main.hxx \ src/Instance.cxx src/Instance.hxx \ - src/Win32Main.cxx \ + src/win32/Win32Main.cxx \ src/GlobalEvents.cxx src/GlobalEvents.hxx \ src/Daemon.cxx src/Daemon.hxx \ src/AudioCompress/compress.c \ @@ -211,14 +211,14 @@ src_mpd_SOURCES = \ # Windows resource file # -src/win/mpd_win32_rc.$(OBJEXT): src/win/mpd_win32_rc.rc +src/win32/mpd_win32_rc.$(OBJEXT): src/win32/mpd_win32_rc.rc $(WINDRES) -i $< -o $@ if HAVE_WINDOWS -noinst_DATA = src/win/mpd_win32_rc.rc +noinst_DATA = src/win32/mpd_win32_rc.rc -src_mpd_DEPENDENCIES = src/win/mpd_win32_rc.$(OBJEXT) -src_mpd_LDFLAGS = -Wl,src/win/mpd_win32_rc.$(OBJEXT) +src_mpd_DEPENDENCIES = src/win32/mpd_win32_rc.$(OBJEXT) +src_mpd_LDFLAGS = -Wl,src/win32/mpd_win32_rc.$(OBJEXT) endif if ENABLE_DESPOTIFY @@ -1633,4 +1633,4 @@ EXTRA_DIST = $(doc_DATA) autogen.sh \ test/test_archive_zzip.sh \ $(wildcard scripts/*.sh) \ $(man_MANS) $(DOCBOOK_FILES) doc/mpdconf.example doc/doxygen.conf \ - src/win/mpd_win32_rc.rc.in src/win/mpd.ico + src/win32/mpd_win32_rc.rc.in src/win32/mpd.ico diff --git a/configure.ac b/configure.ac index bcaec1a85..526b4c7f5 100644 --- a/configure.ac +++ b/configure.ac @@ -70,7 +70,7 @@ host_is_darwin=no case "$host_os" in mingw32* | windows*) AC_CONFIG_FILES([ - src/win/mpd_win32_rc.rc + src/win32/mpd_win32_rc.rc ]) AC_CHECK_TOOL(WINDRES, windres) AM_CPPFLAGS="$AM_CPPFLAGS -DWIN32_LEAN_AND_MEAN" diff --git a/src/Win32Main.cxx b/src/Win32Main.cxx deleted file mode 100644 index 0d2a70348..000000000 --- a/src/Win32Main.cxx +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2003-2013 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. - */ - -#include "config.h" -#include "Main.hxx" - -#ifdef WIN32 - -#include "Compiler.h" -#include "GlobalEvents.hxx" -#include "system/FatalError.hxx" - -#include -#include - -#include - -#include - -static int service_argc; -static char **service_argv; -static char service_name[] = ""; -static std::atomic_bool running; -static SERVICE_STATUS_HANDLE service_handle; - -static void WINAPI -service_main(DWORD argc, CHAR *argv[]); - -static SERVICE_TABLE_ENTRY service_registry[] = { - {service_name, service_main}, - {nullptr, nullptr} -}; - -static void -service_notify_status(DWORD status_code) -{ - SERVICE_STATUS current_status; - - current_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; - current_status.dwControlsAccepted = status_code == SERVICE_START_PENDING - ? 0 - : SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP; - - current_status.dwCurrentState = status_code; - current_status.dwWin32ExitCode = NO_ERROR; - current_status.dwCheckPoint = 0; - current_status.dwWaitHint = 1000; - - SetServiceStatus(service_handle, ¤t_status); -} - -static DWORD WINAPI -service_dispatcher(gcc_unused DWORD control, gcc_unused DWORD event_type, - gcc_unused void *event_data, gcc_unused void *context) -{ - switch (control) { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - GlobalEvents::Emit(GlobalEvents::SHUTDOWN); - return NO_ERROR; - default: - return NO_ERROR; - } -} - -static void WINAPI -service_main(gcc_unused DWORD argc, gcc_unused CHAR *argv[]) -{ - DWORD error_code; - gchar* error_message; - - service_handle = - RegisterServiceCtrlHandlerEx(service_name, - service_dispatcher, nullptr); - - if (service_handle == 0) { - error_code = GetLastError(); - error_message = g_win32_error_message(error_code); - FormatFatalError("RegisterServiceCtrlHandlerEx() failed: %s", - error_message); - } - - service_notify_status(SERVICE_START_PENDING); - mpd_main(service_argc, service_argv); - service_notify_status(SERVICE_STOPPED); -} - -static BOOL WINAPI -console_handler(DWORD event) -{ - switch (event) { - case CTRL_C_EVENT: - case CTRL_CLOSE_EVENT: - if (running.load()) { - // Recent msdn docs that process is terminated - // if this function returns TRUE. - // We initiate correct shutdown sequence (if possible). - // Once main() returns CRT will terminate our process - // regardless our thread is still active. - // If this did not happen within 3 seconds - // let's shutdown anyway. - GlobalEvents::Emit(GlobalEvents::SHUTDOWN); - // Under debugger it's better to wait indefinitely - // to allow debugging of shutdown code. - Sleep(IsDebuggerPresent() ? INFINITE : 3000); - } - // If we're not running main loop there is no chance for - // clean shutdown. - std::exit(EXIT_FAILURE); - return TRUE; - default: - return FALSE; - } -} - -int win32_main(int argc, char *argv[]) -{ - DWORD error_code; - gchar* error_message; - - service_argc = argc; - service_argv = argv; - - if (StartServiceCtrlDispatcher(service_registry)) - return 0; /* run as service successefully */ - - error_code = GetLastError(); - if (error_code == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { - /* running as console app */ - running.store(false); - SetConsoleTitle("Music Player Daemon"); - SetConsoleCtrlHandler(console_handler, TRUE); - return mpd_main(argc, argv); - } - - error_message = g_win32_error_message(error_code); - FormatFatalError("StartServiceCtrlDispatcher() failed: %s", - error_message); -} - -void win32_app_started() -{ - if (service_handle != 0) - service_notify_status(SERVICE_RUNNING); - else - running.store(true); -} - -void win32_app_stopping() -{ - if (service_handle != 0) - service_notify_status(SERVICE_STOP_PENDING); - else - running.store(false); -} - -#endif diff --git a/src/win/mpd.ico b/src/win/mpd.ico deleted file mode 100644 index 86fd9fe43..000000000 Binary files a/src/win/mpd.ico and /dev/null differ diff --git a/src/win/mpd_win32_rc.rc.in b/src/win/mpd_win32_rc.rc.in deleted file mode 100644 index a31118a0c..000000000 --- a/src/win/mpd_win32_rc.rc.in +++ /dev/null @@ -1,34 +0,0 @@ -#include - -#define VERSION_NUMBER @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_REVISION@,@VERSION_EXTRA@ -#define VERSION_NUMBER_STR "@VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_REVISION@,@VERSION_EXTRA@" - -MPD_ICON ICON "@top_srcdir@/src/win/mpd.ico" - -1 VERSIONINFO -FILETYPE VFT_APP -FILEOS VOS__WINDOWS32 -PRODUCTVERSION VERSION_NUMBER - -FILEVERSION VERSION_NUMBER -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904B0" - BEGIN - VALUE "CompanyName", "Music Player Daemon Project" - VALUE "ProductName", "Music Player Daemon" - VALUE "ProductVersion", VERSION_NUMBER_STR - VALUE "InternalName", "mpd" - VALUE "OriginalFilename", "mpd.exe" - VALUE "FileVersion", "@VERSION@" - VALUE "FileDescription", "Music Player Daemon @VERSION@" - VALUE "LegalCopyright", "Copyright \251 The Music Player Daemon Project" - END - END - - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END diff --git a/src/win32/Win32Main.cxx b/src/win32/Win32Main.cxx new file mode 100644 index 000000000..0d2a70348 --- /dev/null +++ b/src/win32/Win32Main.cxx @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2003-2013 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. + */ + +#include "config.h" +#include "Main.hxx" + +#ifdef WIN32 + +#include "Compiler.h" +#include "GlobalEvents.hxx" +#include "system/FatalError.hxx" + +#include +#include + +#include + +#include + +static int service_argc; +static char **service_argv; +static char service_name[] = ""; +static std::atomic_bool running; +static SERVICE_STATUS_HANDLE service_handle; + +static void WINAPI +service_main(DWORD argc, CHAR *argv[]); + +static SERVICE_TABLE_ENTRY service_registry[] = { + {service_name, service_main}, + {nullptr, nullptr} +}; + +static void +service_notify_status(DWORD status_code) +{ + SERVICE_STATUS current_status; + + current_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + current_status.dwControlsAccepted = status_code == SERVICE_START_PENDING + ? 0 + : SERVICE_ACCEPT_SHUTDOWN | SERVICE_ACCEPT_STOP; + + current_status.dwCurrentState = status_code; + current_status.dwWin32ExitCode = NO_ERROR; + current_status.dwCheckPoint = 0; + current_status.dwWaitHint = 1000; + + SetServiceStatus(service_handle, ¤t_status); +} + +static DWORD WINAPI +service_dispatcher(gcc_unused DWORD control, gcc_unused DWORD event_type, + gcc_unused void *event_data, gcc_unused void *context) +{ + switch (control) { + case SERVICE_CONTROL_SHUTDOWN: + case SERVICE_CONTROL_STOP: + GlobalEvents::Emit(GlobalEvents::SHUTDOWN); + return NO_ERROR; + default: + return NO_ERROR; + } +} + +static void WINAPI +service_main(gcc_unused DWORD argc, gcc_unused CHAR *argv[]) +{ + DWORD error_code; + gchar* error_message; + + service_handle = + RegisterServiceCtrlHandlerEx(service_name, + service_dispatcher, nullptr); + + if (service_handle == 0) { + error_code = GetLastError(); + error_message = g_win32_error_message(error_code); + FormatFatalError("RegisterServiceCtrlHandlerEx() failed: %s", + error_message); + } + + service_notify_status(SERVICE_START_PENDING); + mpd_main(service_argc, service_argv); + service_notify_status(SERVICE_STOPPED); +} + +static BOOL WINAPI +console_handler(DWORD event) +{ + switch (event) { + case CTRL_C_EVENT: + case CTRL_CLOSE_EVENT: + if (running.load()) { + // Recent msdn docs that process is terminated + // if this function returns TRUE. + // We initiate correct shutdown sequence (if possible). + // Once main() returns CRT will terminate our process + // regardless our thread is still active. + // If this did not happen within 3 seconds + // let's shutdown anyway. + GlobalEvents::Emit(GlobalEvents::SHUTDOWN); + // Under debugger it's better to wait indefinitely + // to allow debugging of shutdown code. + Sleep(IsDebuggerPresent() ? INFINITE : 3000); + } + // If we're not running main loop there is no chance for + // clean shutdown. + std::exit(EXIT_FAILURE); + return TRUE; + default: + return FALSE; + } +} + +int win32_main(int argc, char *argv[]) +{ + DWORD error_code; + gchar* error_message; + + service_argc = argc; + service_argv = argv; + + if (StartServiceCtrlDispatcher(service_registry)) + return 0; /* run as service successefully */ + + error_code = GetLastError(); + if (error_code == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { + /* running as console app */ + running.store(false); + SetConsoleTitle("Music Player Daemon"); + SetConsoleCtrlHandler(console_handler, TRUE); + return mpd_main(argc, argv); + } + + error_message = g_win32_error_message(error_code); + FormatFatalError("StartServiceCtrlDispatcher() failed: %s", + error_message); +} + +void win32_app_started() +{ + if (service_handle != 0) + service_notify_status(SERVICE_RUNNING); + else + running.store(true); +} + +void win32_app_stopping() +{ + if (service_handle != 0) + service_notify_status(SERVICE_STOP_PENDING); + else + running.store(false); +} + +#endif diff --git a/src/win32/mpd.ico b/src/win32/mpd.ico new file mode 100644 index 000000000..86fd9fe43 Binary files /dev/null and b/src/win32/mpd.ico differ diff --git a/src/win32/mpd_win32_rc.rc.in b/src/win32/mpd_win32_rc.rc.in new file mode 100644 index 000000000..e5312dc78 --- /dev/null +++ b/src/win32/mpd_win32_rc.rc.in @@ -0,0 +1,34 @@ +#include + +#define VERSION_NUMBER @VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_REVISION@,@VERSION_EXTRA@ +#define VERSION_NUMBER_STR "@VERSION_MAJOR@,@VERSION_MINOR@,@VERSION_REVISION@,@VERSION_EXTRA@" + +MPD_ICON ICON "@top_srcdir@/src/win32/mpd.ico" + +1 VERSIONINFO +FILETYPE VFT_APP +FILEOS VOS__WINDOWS32 +PRODUCTVERSION VERSION_NUMBER + +FILEVERSION VERSION_NUMBER +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904B0" + BEGIN + VALUE "CompanyName", "Music Player Daemon Project" + VALUE "ProductName", "Music Player Daemon" + VALUE "ProductVersion", VERSION_NUMBER_STR + VALUE "InternalName", "mpd" + VALUE "OriginalFilename", "mpd.exe" + VALUE "FileVersion", "@VERSION@" + VALUE "FileDescription", "Music Player Daemon @VERSION@" + VALUE "LegalCopyright", "Copyright \251 The Music Player Daemon Project" + END + END + + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END -- cgit v1.2.3 From 250318329f9e662bd7ee5f07af14f175a0b12eeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 1 Aug 2014 22:07:33 +0200 Subject: Makefile.am: fix dependencies for win32 It happened to me when doing the Haiku port, src/mpd failed to be relinked properly when editing source files, and likely also happens on win32, although I didn't try this change. When building for windows, src_mpd_DEPENDENCIES is overriden. Automake then disables the default version which contains all the static libraries. In Makefile.in: @HAVE_WINDOWS_FALSE@src_mpd_DEPENDENCIES = libmpd.a \ Instead we use EXTRA_src_mpd_DEPENDENCIES which is meant for this. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index 6ef21ee23..6a5e9fb27 100644 --- a/Makefile.am +++ b/Makefile.am @@ -217,7 +217,7 @@ src/win32/mpd_win32_rc.$(OBJEXT): src/win32/mpd_win32_rc.rc if HAVE_WINDOWS noinst_DATA = src/win32/mpd_win32_rc.rc -src_mpd_DEPENDENCIES = src/win32/mpd_win32_rc.$(OBJEXT) +EXTRA_src_mpd_DEPENDENCIES = src/win32/mpd_win32_rc.$(OBJEXT) src_mpd_LDFLAGS = -Wl,src/win32/mpd_win32_rc.$(OBJEXT) endif -- cgit v1.2.3 From c3f111a56ceacd77574af021d23b481b74bc66d4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 7 Aug 2014 16:03:44 +0200 Subject: event/BufferedSocket: fix inversed buffer check This was broken by commit 84d20d9e, which deleted the "!" from the check. --- src/event/BufferedSocket.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/event/BufferedSocket.cxx b/src/event/BufferedSocket.cxx index 92e350e85..c93ea34c5 100644 --- a/src/event/BufferedSocket.cxx +++ b/src/event/BufferedSocket.cxx @@ -118,7 +118,7 @@ BufferedSocket::OnSocketReady(unsigned flags) if (!ReadToBuffer() || !ResumeInput()) return false; - if (input.IsFull()) + if (!input.IsFull()) ScheduleRead(); } -- cgit v1.2.3