Compare commits

..

23 Commits

Author SHA1 Message Date
Max Kellermann
49b9a90c3f release v0.20.13 2017-12-18 23:41:56 +01:00
FlashSystems
64d141f71e Save and restore mountpoints within the state file.
Signed-off-by: FlashSystems <developer@flashsystems.de>
2017-12-18 23:39:01 +01:00
FlashSystems
c488d3123f Fix lsinfo and add for mounted databases.
If `SimpleDatabase::Visit` is called on a database that contains a mounted directry the URIs of the elements passed to the callbacks are not prefixed by the mountpoint path. This leads to lsinfo and add not working because they use the wrong URI. This pull request is using the `WalkMount` helper function to create prefixed versions of `VisitDirectory`, `VisitSong` and `VisitPlaylist` to add the correct prefix to the parameters of the callback functions.
2017-12-18 23:33:08 +01:00
Stefano Miccoli
967af60327 rounds alsa HW mixer volume towards ±∞ depending on sgn(∆ vol)
This alleviates a problem in which 'volume +1' cannot be undo by
'volume -1' when using alsa hw mixer.

Closes #104
2017-12-18 21:29:03 +01:00
Yue Wang
f1ef9f9d31 OSXOutputPlugin: set the buffer time to be 100ms
[mk: the following text was copied from
https://github.com/MusicPlayerDaemon/MPD/pull/167]

For certain format (hi-res files) and normal buffer size hardware, The
hardware may at once consume most of the buffers. However, in Delay()
function, MPD is supposed to wait for 25 ms after the next try. it
will create a hiccup. The negative impact is much major than
increasing the latency.

I understand larger buffers come at a price. That's why in my earlier
commit last year I significantly reduced it. However, the buffer size
in CoreAudio is set according to the hardware, which is super small
latency. For instance, the system audio of 2015 generation of macbook
pro has maximum buffer size of 4096 samples, which is just 0.09s for
44.1k framerate, or 0.04s for 96k frames --- . compare to the 0.5 sec
latency alsa plugin has, even if we quadruple it, it's still super
tiny.
2017-12-12 10:56:42 +01:00
Max Kellermann
dfaf08743c *: check defined(_WIN32) instead of defined(WIN32)
Only _WIN32 is defined by the compiler, and WIN32 is not standardized
and may be missing.

Closes #169
2017-12-12 10:22:20 +01:00
Max Kellermann
d9552d8a6d android/build.py: support NDK r16 2017-12-12 10:01:47 +01:00
Max Kellermann
7586a8ab2c python/build/libs.py: disable the FFmpeg HEVC decoder due to clang build failure 2017-12-12 10:01:47 +01:00
Max Kellermann
e1a942250b python/build/libs.py: disable more FFmpeg features 2017-12-12 09:57:40 +01:00
Max Kellermann
72be0185de python/libs: upgrade Boost to 1.65.1 2017-12-12 09:16:40 +01:00
Max Kellermann
7e4cbce06b python/build/libs: upgrade CURL to 7.57.0 2017-12-12 09:15:24 +01:00
Max Kellermann
177d62f431 python/build/libs: upgrade FFmpeg to 3.4.1 2017-12-11 19:00:22 +01:00
Uwe Kleine-König
5a11e03725 lib/upnp: use include path without upnp/ prefix and honor pkg-config CFLAGS
If libupnp is installed in a non-standard location we must rely on the
include path provided by $(pkg-config --cflags libupnp). Relative to the
path given from that command no prefix must be used to find the respective
files.
2017-12-11 18:58:09 +01:00
Max Kellermann
75d068b7cd Makefile.am: include Windows cross-build script in source tarball 2017-12-05 11:24:52 +01:00
FlashSystems
1208503888 Removing gcc_malloc attribute from Directory::CreateChild to fix
assignment of `mnt->mounted_database` in `SimpleDatabase::Mount`.
2017-12-03 12:34:08 +01:00
Max Kellermann
de90d401d2 MusicChunk: add magic value IGNORE_REPLAY_GAIN
This fixes spurious replay gain logs when the player inserts silence
chunks, because those silence chunks had no replay gain attached,
resetting the ReplayGainFilter state, flipping it forth and back.
2017-12-03 11:39:12 +01:00
Max Kellermann
396defaea9 MusicChunk: initialize replay_gain_serial on demand 2017-12-03 11:39:07 +01:00
Max Kellermann
18f350cd04 player/Thread: initialize MusicChunk::bit_rate in SendSilence()
This attribute is not particularly important, but it was
uninitialized.
2017-12-03 10:54:14 +01:00
Max Kellermann
478180ebe4 queue/PlaylistEdit: shuffle appended songs only within its priority group
Fixes #165.
2017-12-02 17:17:02 +01:00
Max Kellermann
4a3059f509 queue/PlaylistControl: don't skip highest priority song on "play"
When starting playback with a specific song which does not have the
highest priority, the previous highest priority song was skipped
completely because its order was "swapped".  This commit changes to a
more expensive operation which inserts the selected song into the
order list.

This fixes a small part of #165
2017-12-02 16:25:32 +01:00
Max Kellermann
78728138a0 lib/upnp/Compat: disable the 1.8 API emulation with libupnp 1.6.24
libupnp 1.6.24 added a few badly designed macros which break the MPD
build:

 8177a4195a/

To work around this, we disable our emulation functions (from
714011c81e) on this libupnp version.

Closes #163
2017-12-02 14:47:27 +01:00
FlashSystems
63fc98591d Fix for "Mount-Points are purged from database on update/rescan."
Signed-off-by: FlashSystems <developer@flashsystems.de>
2017-11-27 22:34:49 +01:00
Max Kellermann
53def9a682 increment version number to 0.20.13 2017-11-27 22:32:55 +01:00
123 changed files with 562 additions and 276 deletions

View File

@@ -702,6 +702,7 @@ libstorage_a_SOURCES = \
src/storage/MemoryDirectoryReader.cxx src/storage/MemoryDirectoryReader.hxx \ src/storage/MemoryDirectoryReader.cxx src/storage/MemoryDirectoryReader.hxx \
src/storage/Configured.cxx src/storage/Configured.hxx \ src/storage/Configured.cxx src/storage/Configured.hxx \
src/storage/plugins/LocalStorage.cxx src/storage/plugins/LocalStorage.hxx \ src/storage/plugins/LocalStorage.cxx src/storage/plugins/LocalStorage.hxx \
src/storage/StorageState.cxx src/storage/StorageState.hxx \
src/storage/FileInfo.hxx src/storage/FileInfo.hxx
libstorage_a_CPPFLAGS = $(AM_CPPFLAGS) \ libstorage_a_CPPFLAGS = $(AM_CPPFLAGS) \
@@ -754,6 +755,7 @@ libneighbor_a_SOURCES = \
src/neighbor/NeighborPlugin.hxx src/neighbor/NeighborPlugin.hxx
libneighbor_a_CPPFLAGS = $(AM_CPPFLAGS) \ libneighbor_a_CPPFLAGS = $(AM_CPPFLAGS) \
$(UPNP_CFLAGS) \
$(SMBCLIENT_CFLAGS) $(SMBCLIENT_CFLAGS)
if ENABLE_SMBCLIENT if ENABLE_SMBCLIENT
@@ -803,6 +805,8 @@ libdb_plugins_a_SOURCES = \
src/db/plugins/simple/PrefixedLightSong.hxx \ src/db/plugins/simple/PrefixedLightSong.hxx \
src/db/plugins/simple/SimpleDatabasePlugin.cxx \ src/db/plugins/simple/SimpleDatabasePlugin.cxx \
src/db/plugins/simple/SimpleDatabasePlugin.hxx src/db/plugins/simple/SimpleDatabasePlugin.hxx
libdb_plugins_a_CPPFLAGS = $(AM_CPPFLAGS) \
$(UPNP_CFLAGS)
if ENABLE_LIBMPDCLIENT if ENABLE_LIBMPDCLIENT
libdb_plugins_a_SOURCES += \ libdb_plugins_a_SOURCES += \
@@ -2412,6 +2416,7 @@ EXTRA_DIST = $(doc_DATA) autogen.sh \
$(man_MANS) $(DOCBOOK_FILES) doc/mpdconf.example doc/doxygen.conf \ $(man_MANS) $(DOCBOOK_FILES) doc/mpdconf.example doc/doxygen.conf \
$(wildcard $(srcdir)/doc/include/*.xml) \ $(wildcard $(srcdir)/doc/include/*.xml) \
systemd/system/mpd.socket \ systemd/system/mpd.socket \
$(wildcard $(srcdir)/python/build/*.py) \
android/AndroidManifest.xml \ android/AndroidManifest.xml \
android/build.py \ android/build.py \
android/custom_rules.xml \ android/custom_rules.xml \
@@ -2419,5 +2424,6 @@ EXTRA_DIST = $(doc_DATA) autogen.sh \
android/src/Bridge.java \ android/src/Bridge.java \
android/src/Loader.java \ android/src/Loader.java \
android/src/Main.java \ android/src/Main.java \
win32/build.py \
win32/res/mpd.rc.in win32/res/mpd.ico \ win32/res/mpd.rc.in win32/res/mpd.ico \
src/haiku/App_MusicPD src/haiku/App_MusicPD

15
NEWS
View File

@@ -1,3 +1,18 @@
ver 0.20.13 (2017/12/18)
* output
- osx: set up ring buffer to hold at least 100ms
* mixer
- alsa: fix rounding errors
* database
- simple: don't purge mount points on update/rescan
- simple: fix "mount" bug caused by bad compiler optimization
- simple: fix "lsinfo" into mount points
- upnp: work around libupnp 1.6.24 API breakage
* queue: fix spuriously misplaced prioritized songs
* save and restore mountpoints within the state file
* include Windows cross-build script in source tarball
* fix Windows build failures
ver 0.20.12 (2017/11/25) ver 0.20.12 (2017/11/25)
* database * database
- upnp: adapt to libupnp 1.8 API changes - upnp: adapt to libupnp 1.8 API changes

View File

@@ -46,13 +46,14 @@ class AndroidNdkToolchain:
self.ndk_arch = 'arm' self.ndk_arch = 'arm'
android_abi = 'armeabi-v7a' android_abi = 'armeabi-v7a'
ndk_platform = 'android-14' ndk_platform = 'android-21'
# select the NDK compiler # select the NDK compiler
gcc_version = '4.9' gcc_version = '4.9'
ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform) ndk_platform_path = os.path.join(ndk_path, 'platforms', ndk_platform)
sysroot = os.path.join(ndk_platform_path, 'arch-' + self.ndk_arch) sysroot = os.path.join(ndk_path, 'sysroot')
target_root = os.path.join(ndk_platform_path, 'arch-' + self.ndk_arch)
install_prefix = os.path.join(arch_path, 'root') install_prefix = os.path.join(arch_path, 'root')
@@ -79,8 +80,15 @@ class AndroidNdkToolchain:
self.cflags = '-Os -g ' + common_flags self.cflags = '-Os -g ' + common_flags
self.cxxflags = '-Os -g ' + common_flags self.cxxflags = '-Os -g ' + common_flags
self.cppflags = '--sysroot=' + self.sysroot + ' -isystem ' + os.path.join(install_prefix, 'include') self.cppflags = '--sysroot=' + sysroot + \
self.ldflags = '--sysroot=' + self.sysroot + ' ' + common_flags + ' -L' + os.path.join(install_prefix, 'lib') ' -isystem ' + os.path.join(install_prefix, 'include') + \
' -isystem ' + os.path.join(sysroot, 'usr', 'include', arch) + \
' -D__ANDROID_API__=21'
self.ldflags = '--sysroot=' + sysroot + \
' -L' + os.path.join(install_prefix, 'lib') + \
' -L' + os.path.join(target_root, 'usr', 'lib') + \
' -B' + os.path.join(target_root, 'usr', 'lib') + \
' ' + common_flags
self.libs = '' self.libs = ''
self.is_arm = self.ndk_arch == 'arm' self.is_arm = self.ndk_arch == 'arm'

View File

@@ -1,10 +1,10 @@
AC_PREREQ(2.60) AC_PREREQ(2.60)
AC_INIT(mpd, 0.20.12, musicpd-dev-team@lists.sourceforge.net) AC_INIT(mpd, 0.20.13, musicpd-dev-team@lists.sourceforge.net)
VERSION_MAJOR=0 VERSION_MAJOR=0
VERSION_MINOR=20 VERSION_MINOR=20
VERSION_REVISION=12 VERSION_REVISION=13
VERSION_EXTRA=0 VERSION_EXTRA=0
AC_CONFIG_SRCDIR([src/Main.cxx]) AC_CONFIG_SRCDIR([src/Main.cxx])
@@ -492,7 +492,7 @@ if test x$enable_ipv6 = xyes; then
AC_EGREP_CPP([AP_maGiC_VALUE], AC_EGREP_CPP([AP_maGiC_VALUE],
[ [
#include <sys/types.h> #include <sys/types.h>
#ifdef WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
#else #else
#include <sys/socket.h> #include <sys/socket.h>

View File

@@ -69,8 +69,8 @@ liblame = AutotoolsProject(
) )
ffmpeg = FfmpegProject( ffmpeg = FfmpegProject(
'http://ffmpeg.org/releases/ffmpeg-3.3.3.tar.xz', 'http://ffmpeg.org/releases/ffmpeg-3.4.1.tar.xz',
'd2a9002cdc6b533b59728827186c044ad02ba64841f1b7cd6c21779875453a1e', '5a77278a63741efa74e26bf197b9bb09ac6381b9757391b922407210f0f991c0',
'lib/libavcodec.a', 'lib/libavcodec.a',
[ [
'--disable-shared', '--enable-static', '--disable-shared', '--enable-static',
@@ -84,17 +84,26 @@ ffmpeg = FfmpegProject(
'--disable-swscale', '--disable-swscale',
'--disable-postproc', '--disable-postproc',
'--disable-avfilter', '--disable-avfilter',
'--disable-lzo',
'--disable-faan',
'--disable-pixelutils',
'--disable-network', '--disable-network',
'--disable-encoders', '--disable-encoders',
'--disable-protocols', '--disable-protocols',
'--disable-outdevs', '--disable-devices',
'--disable-filters', '--disable-filters',
'--disable-v4l2_m2m',
# clang misinterprets the "B0" in hevc_mvs.c as binary
# literal, which breaks the build; but we don't need that
# video codec anyway
'--disable-decoder=hevc',
], ],
) )
curl = AutotoolsProject( curl = AutotoolsProject(
'http://curl.haxx.se/download/curl-7.55.1.tar.xz', 'http://curl.haxx.se/download/curl-7.57.0.tar.xz',
'3eafca6e84ecb4af5f35795dee84e643d5428287e88c041122bb8dac18676bb7', 'f5f6fd3c72b7b8389969f4fb671ed8532fa9b5bb7a5cae7ca89bc1cea45c7878',
'lib/libcurl.a', 'lib/libcurl.a',
[ [
'--disable-shared', '--enable-static', '--disable-shared', '--enable-static',
@@ -114,7 +123,7 @@ curl = AutotoolsProject(
) )
boost = BoostProject( boost = BoostProject(
'http://downloads.sourceforge.net/project/boost/boost/1.65.0/boost_1_65_0.tar.bz2', 'http://downloads.sourceforge.net/project/boost/boost/1.65.1/boost_1_65_1.tar.bz2',
'ea26712742e2fb079c2a566a31f3266973b76e38222b9f88b387e3c8b2f9902c', '9807a5d16566c57fd74fb522764e0b134a8bbe6b6e8967b83afefd30dcd3be81',
'include/boost/version.hpp', 'include/boost/version.hpp',
) )

View File

@@ -67,7 +67,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#ifdef WIN32 #ifdef _WIN32
#define CONFIG_FILE_LOCATION PATH_LITERAL("mpd\\mpd.conf") #define CONFIG_FILE_LOCATION PATH_LITERAL("mpd\\mpd.conf")
#define APP_CONFIG_FILE_LOCATION PATH_LITERAL("conf\\mpd.conf") #define APP_CONFIG_FILE_LOCATION PATH_LITERAL("conf\\mpd.conf")
#else #else
@@ -389,7 +389,7 @@ ParseCommandLine(int argc, char **argv, struct options *options)
ConfigLoader loader; ConfigLoader loader;
bool found = bool found =
#ifdef WIN32 #ifdef _WIN32
loader.TryFile(GetUserConfigDir(), CONFIG_FILE_LOCATION) || loader.TryFile(GetUserConfigDir(), CONFIG_FILE_LOCATION) ||
loader.TryFile(GetSystemConfigDir(), CONFIG_FILE_LOCATION) || loader.TryFile(GetSystemConfigDir(), CONFIG_FILE_LOCATION) ||
loader.TryFile(GetAppBaseDir(), APP_CONFIG_FILE_LOCATION); loader.TryFile(GetAppBaseDir(), APP_CONFIG_FILE_LOCATION);

View File

@@ -24,7 +24,7 @@
#include "Compiler.h" #include "Compiler.h"
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
/* damn you, windows.h! */ /* damn you, windows.h! */
#ifdef ABSOLUTE #ifdef ABSOLUTE

View File

@@ -162,7 +162,7 @@ FileLog(const Domain &domain, const char *message)
domain.GetName(), domain.GetName(),
chomp_length(message), message); chomp_length(message), message);
#ifdef WIN32 #ifdef _WIN32
/* force-flush the log file, because setvbuf() does not seem /* force-flush the log file, because setvbuf() does not seem
to have an effect on WIN32 */ to have an effect on WIN32 */
fflush(stderr); fflush(stderr);

View File

@@ -72,7 +72,7 @@ log_init_file(int line)
out_fd = open_log_file(); out_fd = open_log_file();
if (out_fd < 0) { if (out_fd < 0) {
#ifdef WIN32 #ifdef _WIN32
const std::string out_path_utf8 = out_path.ToUTF8(); const std::string out_path_utf8 = out_path.ToUTF8();
throw FormatRuntimeError("failed to open log file \"%s\" (config line %d)", throw FormatRuntimeError("failed to open log file \"%s\" (config line %d)",
out_path_utf8.c_str(), line); out_path_utf8.c_str(), line);
@@ -182,7 +182,7 @@ void setup_log_output()
fflush(nullptr); fflush(nullptr);
if (out_fd < 0) { if (out_fd < 0) {
#ifdef WIN32 #ifdef _WIN32
return; return;
#else #else
out_fd = open("/dev/null", O_WRONLY); out_fd = open("/dev/null", O_WRONLY);

View File

@@ -20,7 +20,7 @@
#ifndef MPD_LOG_LEVEL_HXX #ifndef MPD_LOG_LEVEL_HXX
#define MPD_LOG_LEVEL_HXX #define MPD_LOG_LEVEL_HXX
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
/* damn you, windows.h! */ /* damn you, windows.h! */
#ifdef ERROR #ifdef ERROR

View File

@@ -106,7 +106,7 @@
#include <locale.h> #include <locale.h>
#endif #endif
#ifdef WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
#endif #endif
@@ -289,7 +289,7 @@ glue_state_file_init()
*/ */
static void winsock_init(void) static void winsock_init(void)
{ {
#ifdef WIN32 #ifdef _WIN32
WSADATA sockinfo; WSADATA sockinfo;
int retval = WSAStartup(MAKEWORD(2, 2), &sockinfo); int retval = WSAStartup(MAKEWORD(2, 2), &sockinfo);
@@ -418,7 +418,7 @@ Instance::OnIdle(unsigned flags)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#ifdef WIN32 #ifdef _WIN32
return win32_main(argc, argv); return win32_main(argc, argv);
#else #else
return mpd_main(argc, argv); return mpd_main(argc, argv);
@@ -615,7 +615,7 @@ try {
playlist_state_restore() */ playlist_state_restore() */
instance->partition->pc.LockUpdateAudio(); instance->partition->pc.LockUpdateAudio();
#ifdef WIN32 #ifdef _WIN32
win32_app_started(); win32_app_started();
#endif #endif
@@ -630,7 +630,7 @@ try {
/* run the main loop */ /* run the main loop */
instance->event_loop.Run(); instance->event_loop.Run();
#ifdef WIN32 #ifdef _WIN32
win32_app_stopping(); win32_app_stopping();
#endif #endif
@@ -702,7 +702,7 @@ try {
daemonize_finish(); daemonize_finish();
#endif #endif
#ifdef WIN32 #ifdef _WIN32
WSACleanup(); WSACleanup();
#endif #endif

View File

@@ -42,7 +42,7 @@ int mpd_main(int argc, char *argv[]);
#endif #endif
#ifdef WIN32 #ifdef _WIN32
/** /**
* If program is run as windows service performs nessesary initialization * If program is run as windows service performs nessesary initialization

View File

@@ -79,12 +79,20 @@ struct MusicChunk {
*/ */
ReplayGainInfo replay_gain_info; ReplayGainInfo replay_gain_info;
/**
* A magic value for #replay_gain_serial which omits updating
* the #ReplayGainFilter. This is used by "silence" chunks
* (see PlayerThread::SendSilence()) so they don't affect the
* replay gain.
*/
static constexpr unsigned IGNORE_REPLAY_GAIN = ~0u;
/** /**
* A serial number for checking if replay gain info has * A serial number for checking if replay gain info has
* changed since the last chunk. The magic value 0 indicates * changed since the last chunk. The magic value 0 indicates
* that there is no replay gain info available. * that there is no replay gain info available.
*/ */
unsigned replay_gain_serial = 0; unsigned replay_gain_serial;
/** the data (probably PCM) */ /** the data (probably PCM) */
uint8_t data[CHUNK_SIZE]; uint8_t data[CHUNK_SIZE];

View File

@@ -24,6 +24,7 @@
#include "fs/io/TextFile.hxx" #include "fs/io/TextFile.hxx"
#include "fs/io/FileOutputStream.hxx" #include "fs/io/FileOutputStream.hxx"
#include "fs/io/BufferedOutputStream.hxx" #include "fs/io/BufferedOutputStream.hxx"
#include "storage/StorageState.hxx"
#include "Partition.hxx" #include "Partition.hxx"
#include "Instance.hxx" #include "Instance.hxx"
#include "mixer/Volume.hxx" #include "mixer/Volume.hxx"
@@ -56,6 +57,9 @@ StateFile::RememberVersions() noexcept
prev_output_version = audio_output_state_get_version(); prev_output_version = audio_output_state_get_version();
prev_playlist_version = playlist_state_get_hash(partition.playlist, prev_playlist_version = playlist_state_get_hash(partition.playlist,
partition.pc); partition.pc);
#ifdef ENABLE_DATABASE
prev_storage_version = storage_state_get_hash(partition.instance);
#endif
} }
bool bool
@@ -64,7 +68,11 @@ StateFile::IsModified() const noexcept
return prev_volume_version != sw_volume_state_get_hash() || return prev_volume_version != sw_volume_state_get_hash() ||
prev_output_version != audio_output_state_get_version() || prev_output_version != audio_output_state_get_version() ||
prev_playlist_version != playlist_state_get_hash(partition.playlist, prev_playlist_version != playlist_state_get_hash(partition.playlist,
partition.pc); partition.pc)
#ifdef ENABLE_DATABASE
|| prev_storage_version != storage_state_get_hash(partition.instance)
#endif
;
} }
inline void inline void
@@ -72,6 +80,11 @@ StateFile::Write(BufferedOutputStream &os)
{ {
save_sw_volume_state(os); save_sw_volume_state(os);
audio_output_state_save(os, partition.outputs); audio_output_state_save(os, partition.outputs);
#ifdef ENABLE_DATABASE
storage_state_save(os, partition.instance);
#endif
playlist_state_save(os, partition.playlist, partition.pc); playlist_state_save(os, partition.playlist, partition.pc);
} }
@@ -123,6 +136,10 @@ try {
playlist_state_restore(line, file, song_loader, playlist_state_restore(line, file, song_loader,
partition.playlist, partition.playlist,
partition.pc); partition.pc);
#ifdef ENABLE_DATABASE
success = success || storage_state_restore(line, file, partition.instance);
#endif
if (!success) if (!success)
FormatError(state_file_domain, FormatError(state_file_domain,
"Unrecognized line in state file: %s", "Unrecognized line in state file: %s",

View File

@@ -46,6 +46,10 @@ class StateFile final : private TimeoutMonitor {
unsigned prev_volume_version = 0, prev_output_version = 0, unsigned prev_volume_version = 0, prev_output_version = 0,
prev_playlist_version = 0; prev_playlist_version = 0;
#ifdef ENABLE_DATABASE
unsigned prev_storage_version = 0;
#endif
public: public:
static constexpr std::chrono::steady_clock::duration DEFAULT_INTERVAL = std::chrono::minutes(2); static constexpr std::chrono::steady_clock::duration DEFAULT_INTERVAL = std::chrono::minutes(2);

View File

@@ -31,7 +31,7 @@
#include <chrono> #include <chrono>
#ifndef WIN32 #ifndef _WIN32
/** /**
* The monotonic time stamp when MPD was started. It is used to * The monotonic time stamp when MPD was started. It is used to
* calculate the uptime. * calculate the uptime.
@@ -114,7 +114,7 @@ stats_print(Response &r, const Partition &partition)
{ {
r.Format("uptime: %u\n" r.Format("uptime: %u\n"
"playtime: %lu\n", "playtime: %lu\n",
#ifdef WIN32 #ifdef _WIN32
GetProcessUptimeS(), GetProcessUptimeS(),
#else #else
(unsigned)std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - start_time).count(), (unsigned)std::chrono::duration_cast<std::chrono::seconds>(std::chrono::steady_clock::now() - start_time).count(),

View File

@@ -24,7 +24,7 @@
void void
time_print(Response &r, const char *name, time_t t) time_print(Response &r, const char *name, time_t t)
{ {
#ifdef WIN32 #ifdef _WIN32
const struct tm *tm2 = gmtime(&t); const struct tm *tm2 = gmtime(&t);
#else #else
struct tm tm; struct tm tm;
@@ -35,7 +35,7 @@ time_print(Response &r, const char *name, time_t t)
char buffer[32]; char buffer[32];
strftime(buffer, sizeof(buffer), strftime(buffer, sizeof(buffer),
#ifdef WIN32 #ifdef _WIN32
"%Y-%m-%dT%H:%M:%SZ", "%Y-%m-%dT%H:%M:%SZ",
#else #else
"%FT%TZ", "%FT%TZ",

View File

@@ -28,7 +28,7 @@
void void
Client::AllowFile(Path path_fs) const Client::AllowFile(Path path_fs) const
{ {
#ifdef WIN32 #ifdef _WIN32
(void)path_fs; (void)path_fs;
throw ProtocolError(ACK_ERROR_PERMISSION, "Access denied"); throw ProtocolError(ACK_ERROR_PERMISSION, "Access denied");

View File

@@ -24,7 +24,7 @@
#include <string> #include <string>
#ifdef WIN32 #ifdef _WIN32
/* fuck WIN32! */ /* fuck WIN32! */
#include <windows.h> #include <windows.h>
#undef GetMessage #undef GetMessage

View File

@@ -29,7 +29,7 @@
#include "Log.hxx" #include "Log.hxx"
#include <assert.h> #include <assert.h>
#ifdef WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
#else #else
#include <sys/socket.h> #include <sys/socket.h>

View File

@@ -20,7 +20,7 @@
#ifndef MPD_COMMAND_RESULT_HXX #ifndef MPD_COMMAND_RESULT_HXX
#define MPD_COMMAND_RESULT_HXX #define MPD_COMMAND_RESULT_HXX
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
/* damn you, windows.h! */ /* damn you, windows.h! */
#ifdef ERROR #ifdef ERROR

View File

@@ -58,7 +58,7 @@ skip_path(Path name_fs) noexcept
return name_fs.HasNewline(); return name_fs.HasNewline();
} }
#if defined(WIN32) && GCC_CHECK_VERSION(4,6) #if defined(_WIN32) && GCC_CHECK_VERSION(4,6)
/* PRIu64 causes bogus compiler warning */ /* PRIu64 causes bogus compiler warning */
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wformat"
@@ -101,7 +101,7 @@ handle_listfiles_local(Response &r, Path path_fs)
return CommandResult::OK; return CommandResult::OK;
} }
#if defined(WIN32) && GCC_CHECK_VERSION(4,6) #if defined(_WIN32) && GCC_CHECK_VERSION(4,6)
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif

View File

@@ -50,7 +50,7 @@ skip_path(const char *name_utf8) noexcept
return strchr(name_utf8, '\n') != nullptr; return strchr(name_utf8, '\n') != nullptr;
} }
#if defined(WIN32) && GCC_CHECK_VERSION(4,6) #if defined(_WIN32) && GCC_CHECK_VERSION(4,6)
/* PRIu64 causes bogus compiler warning */ /* PRIu64 causes bogus compiler warning */
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat" #pragma GCC diagnostic ignored "-Wformat"
@@ -94,7 +94,7 @@ handle_listfiles_storage(Response &r, StorageDirectoryReader &reader)
} }
} }
#if defined(WIN32) && GCC_CHECK_VERSION(4,6) #if defined(_WIN32) && GCC_CHECK_VERSION(4,6)
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif

View File

@@ -22,7 +22,7 @@
#include "Compiler.h" #include "Compiler.h"
#if defined(WIN32) && CLANG_OR_GCC_VERSION(4,7) #if defined(_WIN32) && CLANG_OR_GCC_VERSION(4,7)
/* "INPUT" is declared by winuser.h */ /* "INPUT" is declared by winuser.h */
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wshadow"
@@ -93,7 +93,7 @@ enum class ConfigBlockOption {
MAX MAX
}; };
#if defined(WIN32) && CLANG_OR_GCC_VERSION(4,7) #if defined(_WIN32) && CLANG_OR_GCC_VERSION(4,7)
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif

View File

@@ -29,7 +29,7 @@
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#ifndef WIN32 #ifndef _WIN32
#include <pwd.h> #include <pwd.h>
/** /**
@@ -79,7 +79,7 @@ ParsePath(const char *path)
{ {
assert(path != nullptr); assert(path != nullptr);
#ifndef WIN32 #ifndef _WIN32
if (path[0] == '~') { if (path[0] == '~') {
++path; ++path;
@@ -119,7 +119,7 @@ ParsePath(const char *path)
} else { } else {
#endif #endif
return AllocatedPath::FromUTF8Throw(path); return AllocatedPath::FromUTF8Throw(path);
#ifndef WIN32 #ifndef _WIN32
} }
#endif #endif
} }

View File

@@ -109,7 +109,7 @@ Directory::PruneEmpty() noexcept
child != end;) { child != end;) {
child->PruneEmpty(); child->PruneEmpty();
if (child->IsEmpty()) if (child->IsEmpty() && !child->IsMount())
child = children.erase_and_dispose(child, child = children.erase_and_dispose(child,
DeleteDisposer()); DeleteDisposer());
else else
@@ -230,7 +230,7 @@ Directory::Walk(bool recursive, const SongFilter *filter,
call will lock it again */ call will lock it again */
const ScopeDatabaseUnlock unlock; const ScopeDatabaseUnlock unlock;
WalkMount(GetPath(), *mounted_database, WalkMount(GetPath(), *mounted_database,
recursive, filter, "", recursive, filter,
visit_directory, visit_song, visit_directory, visit_song,
visit_playlist); visit_playlist);
return; return;

View File

@@ -127,7 +127,6 @@ public:
* *
* @param name_utf8 the UTF-8 encoded name of the new sub directory * @param name_utf8 the UTF-8 encoded name of the new sub directory
*/ */
gcc_malloc
Directory *CreateChild(const char *name_utf8); Directory *CreateChild(const char *name_utf8);
/** /**

View File

@@ -72,7 +72,7 @@ PrefixVisitPlaylist(const char *base, const VisitPlaylist &visit_playlist,
void void
WalkMount(const char *base, const Database &db, WalkMount(const char *base, const Database &db,
bool recursive, const SongFilter *filter, const char* uri, bool recursive, const SongFilter *filter,
const VisitDirectory &visit_directory, const VisitSong &visit_song, const VisitDirectory &visit_directory, const VisitSong &visit_song,
const VisitPlaylist &visit_playlist) const VisitPlaylist &visit_playlist)
{ {
@@ -93,5 +93,5 @@ WalkMount(const char *base, const Database &db,
vp = std::bind(PrefixVisitPlaylist, vp = std::bind(PrefixVisitPlaylist,
base, std::ref(visit_playlist), _1, _2); base, std::ref(visit_playlist), _1, _2);
db.Visit(DatabaseSelection("", recursive, filter), vd, vs, vp); db.Visit(DatabaseSelection(uri, recursive, filter), vd, vs, vp);
} }

View File

@@ -27,7 +27,7 @@ class SongFilter;
void void
WalkMount(const char *base, const Database &db, WalkMount(const char *base, const Database &db,
bool recursive, const SongFilter *filter, const char* uri, bool recursive, const SongFilter *filter,
const VisitDirectory &visit_directory, const VisitSong &visit_song, const VisitDirectory &visit_directory, const VisitSong &visit_song,
const VisitPlaylist &visit_playlist); const VisitPlaylist &visit_playlist);

View File

@@ -20,6 +20,7 @@
#include "config.h" #include "config.h"
#include "SimpleDatabasePlugin.hxx" #include "SimpleDatabasePlugin.hxx"
#include "PrefixedLightSong.hxx" #include "PrefixedLightSong.hxx"
#include "Mount.hxx"
#include "db/DatabasePlugin.hxx" #include "db/DatabasePlugin.hxx"
#include "db/Selection.hxx" #include "db/Selection.hxx"
#include "db/Helpers.hxx" #include "db/Helpers.hxx"
@@ -115,7 +116,7 @@ SimpleDatabase::Check() const
path_utf8 + "\" because the " path_utf8 + "\" because the "
"parent path is not a directory"); "parent path is not a directory");
#ifndef WIN32 #ifndef _WIN32
/* Check if we can write to the directory */ /* Check if we can write to the directory */
if (!CheckAccess(dirPath, X_OK | W_OK)) { if (!CheckAccess(dirPath, X_OK | W_OK)) {
const int e = errno; const int e = errno;
@@ -134,7 +135,7 @@ SimpleDatabase::Check() const
if (!fi.IsRegular()) if (!fi.IsRegular())
throw std::runtime_error("db file \"" + path_utf8 + "\" is not a regular file"); throw std::runtime_error("db file \"" + path_utf8 + "\" is not a regular file");
#ifndef WIN32 #ifndef _WIN32
/* And check that we can write to it */ /* And check that we can write to it */
if (!CheckAccess(path, R_OK | W_OK)) if (!CheckAccess(path, R_OK | W_OK))
throw FormatErrno("Can't open db file \"%s\" for reading/writing", throw FormatErrno("Can't open db file \"%s\" for reading/writing",
@@ -270,6 +271,18 @@ SimpleDatabase::Visit(const DatabaseSelection &selection,
ScopeDatabaseLock protect; ScopeDatabaseLock protect;
auto r = root->LookupDirectory(selection.uri.c_str()); auto r = root->LookupDirectory(selection.uri.c_str());
if (r.directory->IsMount()) {
/* pass the request and the remaining uri to the mounted database */
protect.unlock();
WalkMount(r.directory->GetPath(), *(r.directory->mounted_database),
(r.uri == nullptr)?"":r.uri, selection.recursive, selection.filter,
visit_directory, visit_song, visit_playlist);
return;
}
if (r.uri == nullptr) { if (r.uri == nullptr) {
/* it's a directory */ /* it's a directory */

View File

@@ -91,7 +91,7 @@ bool
directory_child_access(Storage &storage, const Directory &directory, directory_child_access(Storage &storage, const Directory &directory,
const char *name, int mode) noexcept const char *name, int mode) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
/* CheckAccess() is useless on WIN32 */ /* CheckAccess() is useless on WIN32 */
(void)storage; (void)storage;
(void)directory; (void)directory;

View File

@@ -55,7 +55,7 @@ UpdateWalk::UpdateWalk(EventLoop &_loop, DatabaseListener &_listener,
storage(_storage), storage(_storage),
editor(_loop, _listener) editor(_loop, _listener)
{ {
#ifndef WIN32 #ifndef _WIN32
follow_inside_symlinks = follow_inside_symlinks =
config_get_bool(ConfigOption::FOLLOW_INSIDE_SYMLINKS, config_get_bool(ConfigOption::FOLLOW_INSIDE_SYMLINKS,
DEFAULT_FOLLOW_INSIDE_SYMLINKS); DEFAULT_FOLLOW_INSIDE_SYMLINKS);
@@ -104,7 +104,7 @@ inline void
UpdateWalk::PurgeDeletedFromDirectory(Directory &directory) UpdateWalk::PurgeDeletedFromDirectory(Directory &directory)
{ {
directory.ForEachChildSafe([&](Directory &child){ directory.ForEachChildSafe([&](Directory &child){
if (DirectoryExists(storage, child)) if (child.IsMount() || DirectoryExists(storage, child))
return; return;
editor.LockDeleteDirectory(&child); editor.LockDeleteDirectory(&child);
@@ -133,7 +133,7 @@ UpdateWalk::PurgeDeletedFromDirectory(Directory &directory)
} }
} }
#ifndef WIN32 #ifndef _WIN32
static bool static bool
update_directory_stat(Storage &storage, Directory &directory) update_directory_stat(Storage &storage, Directory &directory)
{ {
@@ -156,7 +156,7 @@ static int
FindAncestorLoop(Storage &storage, Directory *parent, FindAncestorLoop(Storage &storage, Directory *parent,
unsigned inode, unsigned device) unsigned inode, unsigned device)
{ {
#ifndef WIN32 #ifndef _WIN32
if (device == 0 && inode == 0) if (device == 0 && inode == 0)
/* can't detect loops if the Storage does not support /* can't detect loops if the Storage does not support
these numbers */ these numbers */
@@ -258,7 +258,7 @@ bool
UpdateWalk::SkipSymlink(const Directory *directory, UpdateWalk::SkipSymlink(const Directory *directory,
const char *utf8_name) const noexcept const char *utf8_name) const noexcept
{ {
#ifndef WIN32 #ifndef _WIN32
const auto path_fs = storage.MapChildFS(directory->GetPath(), const auto path_fs = storage.MapChildFS(directory->GetPath(),
utf8_name); utf8_name);
if (path_fs.IsNull()) if (path_fs.IsNull())

View File

@@ -36,7 +36,7 @@ class UpdateWalk final {
friend class UpdateArchiveVisitor; friend class UpdateArchiveVisitor;
#endif #endif
#ifndef WIN32 #ifndef _WIN32
static constexpr bool DEFAULT_FOLLOW_INSIDE_SYMLINKS = true; static constexpr bool DEFAULT_FOLLOW_INSIDE_SYMLINKS = true;
static constexpr bool DEFAULT_FOLLOW_OUTSIDE_SYMLINKS = true; static constexpr bool DEFAULT_FOLLOW_OUTSIDE_SYMLINKS = true;

View File

@@ -46,7 +46,7 @@ FlacIORead(void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle)
p += nbytes; p += nbytes;
#ifndef WIN32 #ifndef _WIN32
} catch (const std::system_error &e) { } catch (const std::system_error &e) {
errno = e.code().category() == ErrnoCategory() errno = e.code().category() == ErrnoCategory()
? e.code().value() ? e.code().value()

View File

@@ -23,7 +23,7 @@
#include <algorithm> #include <algorithm>
#ifndef WIN32 #ifndef _WIN32
#include <poll.h> #include <poll.h>
#endif #endif
@@ -50,7 +50,7 @@ MultiSocketMonitor::ClearSocketList()
fds.clear(); fds.clear();
} }
#ifndef WIN32 #ifndef _WIN32
void void
MultiSocketMonitor::ReplaceSocketList(pollfd *pfds, unsigned n) MultiSocketMonitor::ReplaceSocketList(pollfd *pfds, unsigned n)

View File

@@ -31,7 +31,7 @@
#include <assert.h> #include <assert.h>
#ifdef WIN32 #ifdef _WIN32
/* ERROR is a WIN32 macro that poisons our namespace; this is a kludge /* ERROR is a WIN32 macro that poisons our namespace; this is a kludge
to allow us to use it anyway */ to allow us to use it anyway */
#ifdef ERROR #ifdef ERROR
@@ -39,7 +39,7 @@
#endif #endif
#endif #endif
#ifndef WIN32 #ifndef _WIN32
struct pollfd; struct pollfd;
#endif #endif
@@ -189,7 +189,7 @@ public:
} }
} }
#ifndef WIN32 #ifndef _WIN32
/** /**
* Replace the socket list with the given file descriptors. * Replace the socket list with the given file descriptors.
* The given pollfd array will be modified by this method. * The given pollfd array will be modified by this method.

View File

@@ -43,7 +43,7 @@
#include <unistd.h> #include <unistd.h>
#include <assert.h> #include <assert.h>
#ifdef WIN32 #ifdef _WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <winsock.h> #include <winsock.h>
#else #else

View File

@@ -20,7 +20,7 @@
#include "config.h" #include "config.h"
#include "SignalMonitor.hxx" #include "SignalMonitor.hxx"
#ifndef WIN32 #ifndef _WIN32
#include "SocketMonitor.hxx" #include "SocketMonitor.hxx"
#include "util/Manual.hxx" #include "util/Manual.hxx"

View File

@@ -24,7 +24,7 @@
class EventLoop; class EventLoop;
#ifndef WIN32 #ifndef _WIN32
#include "util/BindMethod.hxx" #include "util/BindMethod.hxx"

View File

@@ -24,7 +24,7 @@
#include <assert.h> #include <assert.h>
#ifdef WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
#else #else
#include <sys/socket.h> #include <sys/socket.h>

View File

@@ -28,7 +28,7 @@
#include <assert.h> #include <assert.h>
#include <stddef.h> #include <stddef.h>
#ifdef WIN32 #ifdef _WIN32
/* ERROR is a WIN32 macro that poisons our namespace; this is a kludge /* ERROR is a WIN32 macro that poisons our namespace; this is a kludge
to allow us to use it anyway */ to allow us to use it anyway */
#ifdef ERROR #ifdef ERROR

View File

@@ -31,7 +31,7 @@ AllocatedPath::~AllocatedPath() {}
AllocatedPath AllocatedPath
AllocatedPath::FromUTF8(const char *path_utf8) noexcept AllocatedPath::FromUTF8(const char *path_utf8) noexcept
{ {
#if defined(HAVE_FS_CHARSET) || defined(WIN32) #if defined(HAVE_FS_CHARSET) || defined(_WIN32)
try { try {
return AllocatedPath(::PathFromUTF8(path_utf8)); return AllocatedPath(::PathFromUTF8(path_utf8));
} catch (const std::runtime_error &) { } catch (const std::runtime_error &) {
@@ -45,7 +45,7 @@ AllocatedPath::FromUTF8(const char *path_utf8) noexcept
AllocatedPath AllocatedPath
AllocatedPath::FromUTF8Throw(const char *path_utf8) AllocatedPath::FromUTF8Throw(const char *path_utf8)
{ {
#if defined(HAVE_FS_CHARSET) || defined(WIN32) #if defined(HAVE_FS_CHARSET) || defined(_WIN32)
return AllocatedPath(::PathFromUTF8(path_utf8)); return AllocatedPath(::PathFromUTF8(path_utf8));
#else #else
return FromFS(path_utf8); return FromFS(path_utf8);

View File

@@ -24,7 +24,7 @@
#include "lib/icu/Converter.hxx" #include "lib/icu/Converter.hxx"
#include "util/AllocatedString.hxx" #include "util/AllocatedString.hxx"
#ifdef WIN32 #ifdef _WIN32
#include "lib/icu/Win32.hxx" #include "lib/icu/Win32.hxx"
#include <windows.h> #include <windows.h>
#endif #endif
@@ -70,7 +70,7 @@ GetFSCharset() noexcept
{ {
#ifdef HAVE_FS_CHARSET #ifdef HAVE_FS_CHARSET
return fs_charset.empty() ? "UTF-8" : fs_charset.c_str(); return fs_charset.empty() ? "UTF-8" : fs_charset.c_str();
#elif defined(WIN32) #elif defined(_WIN32)
return "ACP"; return "ACP";
#else #else
return "UTF-8"; return "UTF-8";
@@ -100,7 +100,7 @@ PathToUTF8(PathTraitsFS::const_pointer_type path_fs)
assert(path_fs != nullptr); assert(path_fs != nullptr);
#endif #endif
#ifdef WIN32 #ifdef _WIN32
const auto buffer = WideCharToMultiByte(CP_UTF8, path_fs); const auto buffer = WideCharToMultiByte(CP_UTF8, path_fs);
return FixSeparators(PathTraitsUTF8::string(buffer.c_str())); return FixSeparators(PathTraitsUTF8::string(buffer.c_str()));
#else #else
@@ -116,7 +116,7 @@ PathToUTF8(PathTraitsFS::const_pointer_type path_fs)
#endif #endif
} }
#if defined(HAVE_FS_CHARSET) || defined(WIN32) #if defined(HAVE_FS_CHARSET) || defined(_WIN32)
PathTraitsFS::string PathTraitsFS::string
PathFromUTF8(PathTraitsUTF8::const_pointer_type path_utf8) PathFromUTF8(PathTraitsUTF8::const_pointer_type path_utf8)
@@ -126,7 +126,7 @@ PathFromUTF8(PathTraitsUTF8::const_pointer_type path_utf8)
assert(path_utf8 != nullptr); assert(path_utf8 != nullptr);
#endif #endif
#ifdef WIN32 #ifdef _WIN32
const auto buffer = MultiByteToWideChar(CP_UTF8, path_utf8); const auto buffer = MultiByteToWideChar(CP_UTF8, path_utf8);
return PathTraitsFS::string(buffer.c_str()); return PathTraitsFS::string(buffer.c_str());
#else #else

View File

@@ -24,7 +24,7 @@
#include "Compiler.h" #include "Compiler.h"
#include "Traits.hxx" #include "Traits.hxx"
#if (defined(HAVE_ICU) || defined(HAVE_ICONV)) && !defined(WIN32) #if (defined(HAVE_ICU) || defined(HAVE_ICONV)) && !defined(_WIN32)
#define HAVE_FS_CHARSET #define HAVE_FS_CHARSET
#endif #endif

View File

@@ -41,7 +41,7 @@ try {
return; return;
} }
#ifndef WIN32 #ifndef _WIN32
try { try {
const auto x = AllocatedPath::Build(path_fs, const auto x = AllocatedPath::Build(path_fs,
PathTraitsFS::CURRENT_DIRECTORY); PathTraitsFS::CURRENT_DIRECTORY);

View File

@@ -21,7 +21,7 @@
#include "DirectoryReader.hxx" #include "DirectoryReader.hxx"
#include "system/Error.hxx" #include "system/Error.hxx"
#ifdef WIN32 #ifdef _WIN32
DirectoryReader::DirectoryReader(Path dir) DirectoryReader::DirectoryReader(Path dir)
:handle(FindFirstFile(MakeWildcardPath(dir.c_str()), &data)) :handle(FindFirstFile(MakeWildcardPath(dir.c_str()), &data))

View File

@@ -23,7 +23,7 @@
#include "check.h" #include "check.h"
#include "Path.hxx" #include "Path.hxx"
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#include <tchar.h> #include <tchar.h>

View File

@@ -26,13 +26,13 @@
#include <stdint.h> #include <stdint.h>
#ifdef WIN32 #ifdef _WIN32
#include <fileapi.h> #include <fileapi.h>
#else #else
#include <sys/stat.h> #include <sys/stat.h>
#endif #endif
#ifdef WIN32 #ifdef _WIN32
static inline constexpr uint64_t static inline constexpr uint64_t
ConstructUint64(DWORD lo, DWORD hi) ConstructUint64(DWORD lo, DWORD hi)
@@ -54,7 +54,7 @@ class FileInfo {
bool follow_symlinks); bool follow_symlinks);
friend class FileReader; friend class FileReader;
#ifdef WIN32 #ifdef _WIN32
WIN32_FILE_ATTRIBUTE_DATA data; WIN32_FILE_ATTRIBUTE_DATA data;
#else #else
struct stat st; struct stat st;
@@ -65,7 +65,7 @@ public:
FileInfo(Path path, bool follow_symlinks=true) { FileInfo(Path path, bool follow_symlinks=true) {
if (!GetFileInfo(path, *this, follow_symlinks)) { if (!GetFileInfo(path, *this, follow_symlinks)) {
#ifdef WIN32 #ifdef _WIN32
throw FormatLastError("Failed to access %s", throw FormatLastError("Failed to access %s",
path.ToUTF8().c_str()); path.ToUTF8().c_str());
#else #else
@@ -76,7 +76,7 @@ public:
} }
bool IsRegular() const { bool IsRegular() const {
#ifdef WIN32 #ifdef _WIN32
return (data.dwFileAttributes & return (data.dwFileAttributes &
(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE)) == 0; (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE)) == 0;
#else #else
@@ -85,7 +85,7 @@ public:
} }
bool IsDirectory() const { bool IsDirectory() const {
#ifdef WIN32 #ifdef _WIN32
return data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; return data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
#else #else
return S_ISDIR(st.st_mode); return S_ISDIR(st.st_mode);
@@ -93,7 +93,7 @@ public:
} }
uint64_t GetSize() const { uint64_t GetSize() const {
#ifdef WIN32 #ifdef _WIN32
return ConstructUint64(data.nFileSizeLow, data.nFileSizeHigh); return ConstructUint64(data.nFileSizeLow, data.nFileSizeHigh);
#else #else
return st.st_size; return st.st_size;
@@ -101,14 +101,14 @@ public:
} }
time_t GetModificationTime() const { time_t GetModificationTime() const {
#ifdef WIN32 #ifdef _WIN32
return FileTimeToTimeT(data.ftLastWriteTime); return FileTimeToTimeT(data.ftLastWriteTime);
#else #else
return st.st_mtime; return st.st_mtime;
#endif #endif
} }
#ifndef WIN32 #ifndef _WIN32
uid_t GetUid() const { uid_t GetUid() const {
return st.st_uid; return st.st_uid;
} }
@@ -130,7 +130,7 @@ public:
inline bool inline bool
GetFileInfo(Path path, FileInfo &info, bool follow_symlinks=true) GetFileInfo(Path path, FileInfo &info, bool follow_symlinks=true)
{ {
#ifdef WIN32 #ifdef _WIN32
(void)follow_symlinks; (void)follow_symlinks;
return GetFileAttributesEx(path.c_str(), GetFileExInfoStandard, return GetFileAttributesEx(path.c_str(), GetFileExInfoStandard,
&info.data); &info.data);

View File

@@ -29,7 +29,7 @@
void void
RenameFile(Path oldpath, Path newpath) RenameFile(Path oldpath, Path newpath)
{ {
#ifdef WIN32 #ifdef _WIN32
if (!MoveFileEx(oldpath.c_str(), newpath.c_str(), if (!MoveFileEx(oldpath.c_str(), newpath.c_str(),
MOVEFILE_REPLACE_EXISTING)) MOVEFILE_REPLACE_EXISTING))
throw MakeLastError("Failed to rename file"); throw MakeLastError("Failed to rename file");
@@ -42,7 +42,7 @@ RenameFile(Path oldpath, Path newpath)
AllocatedPath AllocatedPath
ReadLink(Path path) ReadLink(Path path)
{ {
#ifdef WIN32 #ifdef _WIN32
(void)path; (void)path;
errno = EINVAL; errno = EINVAL;
return AllocatedPath::Null(); return AllocatedPath::Null();
@@ -63,7 +63,7 @@ ReadLink(Path path)
void void
TruncateFile(Path path) TruncateFile(Path path)
{ {
#ifdef WIN32 #ifdef _WIN32
HANDLE h = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr, HANDLE h = CreateFile(path.c_str(), GENERIC_WRITE, 0, nullptr,
TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL, TRUNCATE_EXISTING, FILE_ATTRIBUTE_NORMAL,
nullptr); nullptr);
@@ -83,7 +83,7 @@ TruncateFile(Path path)
void void
RemoveFile(Path path) RemoveFile(Path path)
{ {
#ifdef WIN32 #ifdef _WIN32
if (!DeleteFile(path.c_str())) if (!DeleteFile(path.c_str()))
throw FormatLastError("Failed to delete %s", path.c_str()); throw FormatLastError("Failed to delete %s", path.c_str());
#else #else

View File

@@ -26,7 +26,7 @@
#include "Path.hxx" #include "Path.hxx"
#ifdef WIN32 #ifdef _WIN32
#include <fileapi.h> #include <fileapi.h>
#endif #endif
@@ -43,7 +43,7 @@ class AllocatedPath;
static inline FILE * static inline FILE *
FOpen(Path file, PathTraitsFS::const_pointer_type mode) FOpen(Path file, PathTraitsFS::const_pointer_type mode)
{ {
#ifdef WIN32 #ifdef _WIN32
return _tfopen(file.c_str(), mode); return _tfopen(file.c_str(), mode);
#else #else
return fopen(file.c_str(), mode); return fopen(file.c_str(), mode);
@@ -56,7 +56,7 @@ FOpen(Path file, PathTraitsFS::const_pointer_type mode)
static inline int static inline int
OpenFile(Path file, int flags, int mode) OpenFile(Path file, int flags, int mode)
{ {
#ifdef WIN32 #ifdef _WIN32
return _topen(file.c_str(), flags, mode); return _topen(file.c_str(), flags, mode);
#else #else
return open_cloexec(file.c_str(), flags, mode); return open_cloexec(file.c_str(), flags, mode);
@@ -71,7 +71,7 @@ OpenFile(Path file, int flags, int mode)
void void
RenameFile(Path oldpath, Path newpath); RenameFile(Path oldpath, Path newpath);
#ifndef WIN32 #ifndef _WIN32
/** /**
* Wrapper for stat() that uses #Path names. * Wrapper for stat() that uses #Path names.
@@ -107,7 +107,7 @@ RemoveFile(Path path);
AllocatedPath AllocatedPath
ReadLink(Path path); ReadLink(Path path);
#ifndef WIN32 #ifndef _WIN32
static inline bool static inline bool
MakeFifo(Path path, mode_t mode) MakeFifo(Path path, mode_t mode)
@@ -132,7 +132,7 @@ CheckAccess(Path path, int mode)
static inline bool static inline bool
FileExists(Path path, bool follow_symlinks = true) FileExists(Path path, bool follow_symlinks = true)
{ {
#ifdef WIN32 #ifdef _WIN32
(void)follow_symlinks; (void)follow_symlinks;
const auto a = GetFileAttributes(path.c_str()); const auto a = GetFileAttributes(path.c_str());
@@ -150,7 +150,7 @@ FileExists(Path path, bool follow_symlinks = true)
static inline bool static inline bool
DirectoryExists(Path path, bool follow_symlinks = true) DirectoryExists(Path path, bool follow_symlinks = true)
{ {
#ifdef WIN32 #ifdef _WIN32
(void)follow_symlinks; (void)follow_symlinks;
const auto a = GetFileAttributes(path.c_str()); const auto a = GetFileAttributes(path.c_str());
@@ -167,7 +167,7 @@ DirectoryExists(Path path, bool follow_symlinks = true)
static inline bool static inline bool
PathExists(Path path) PathExists(Path path)
{ {
#ifdef WIN32 #ifdef _WIN32
return GetFileAttributes(path.c_str()) != INVALID_FILE_ATTRIBUTES; return GetFileAttributes(path.c_str()) != INVALID_FILE_ATTRIBUTES;
#else #else
return CheckAccess(path, F_OK); return CheckAccess(path, F_OK);

View File

@@ -26,7 +26,7 @@
#define HAVE_CLASS_GLOB #define HAVE_CLASS_GLOB
#include <string> #include <string>
#include <fnmatch.h> #include <fnmatch.h>
#elif defined(WIN32) #elif defined(_WIN32)
#define HAVE_CLASS_GLOB #define HAVE_CLASS_GLOB
#include <string> #include <string>
#include <shlwapi.h> #include <shlwapi.h>
@@ -40,12 +40,12 @@
* (asterisk and question mark). * (asterisk and question mark).
*/ */
class Glob { class Glob {
#if defined(HAVE_FNMATCH) || defined(WIN32) #if defined(HAVE_FNMATCH) || defined(_WIN32)
std::string pattern; std::string pattern;
#endif #endif
public: public:
#if defined(HAVE_FNMATCH) || defined(WIN32) #if defined(HAVE_FNMATCH) || defined(_WIN32)
explicit Glob(const char *_pattern) explicit Glob(const char *_pattern)
:pattern(_pattern) {} :pattern(_pattern) {}
@@ -57,7 +57,7 @@ public:
bool Check(const char *name_fs) const noexcept { bool Check(const char *name_fs) const noexcept {
#ifdef HAVE_FNMATCH #ifdef HAVE_FNMATCH
return fnmatch(pattern.c_str(), name_fs, 0) == 0; return fnmatch(pattern.c_str(), name_fs, 0) == 0;
#elif defined(WIN32) #elif defined(_WIN32)
return PathMatchSpecA(name_fs, pattern.c_str()); return PathMatchSpecA(name_fs, pattern.c_str());
#endif #endif
} }

View File

@@ -25,7 +25,7 @@
#include <stddef.h> #include <stddef.h>
#include <limits.h> #include <limits.h>
#if defined(WIN32) #if defined(_WIN32)
static constexpr size_t MPD_PATH_MAX = 260; static constexpr size_t MPD_PATH_MAX = 260;
#elif defined(MAXPATHLEN) #elif defined(MAXPATHLEN)
static constexpr size_t MPD_PATH_MAX = MAXPATHLEN; static constexpr size_t MPD_PATH_MAX = MAXPATHLEN;

View File

@@ -20,7 +20,7 @@
#include "config.h" #include "config.h"
// Use X Desktop guidelines where applicable // Use X Desktop guidelines where applicable
#if !defined(__APPLE__) && !defined(WIN32) && !defined(ANDROID) #if !defined(__APPLE__) && !defined(_WIN32) && !defined(ANDROID)
#define USE_XDG #define USE_XDG
#endif #endif
@@ -29,7 +29,7 @@
#include <array> #include <array>
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#include <shlobj.h> #include <shlobj.h>
#else #else
@@ -53,7 +53,7 @@
#include "Main.hxx" #include "Main.hxx"
#endif #endif
#if !defined(WIN32) && !defined(ANDROID) #if !defined(_WIN32) && !defined(ANDROID)
class PasswdEntry class PasswdEntry
{ {
#if defined(HAVE_GETPWNAM_R) || defined(HAVE_GETPWUID_R) #if defined(HAVE_GETPWNAM_R) || defined(HAVE_GETPWUID_R)
@@ -113,7 +113,7 @@ SafePathFromFS(PathTraitsFS::const_pointer_type dir)
} }
#endif #endif
#ifdef WIN32 #ifdef _WIN32
static AllocatedPath GetStandardDir(int folder_id) static AllocatedPath GetStandardDir(int folder_id)
{ {
std::array<PathTraitsFS::value_type, MAX_PATH> dir; std::array<PathTraitsFS::value_type, MAX_PATH> dir;
@@ -226,7 +226,7 @@ try {
AllocatedPath AllocatedPath
GetUserConfigDir() noexcept GetUserConfigDir() noexcept
{ {
#if defined(WIN32) #if defined(_WIN32)
return GetStandardDir(CSIDL_LOCAL_APPDATA); return GetStandardDir(CSIDL_LOCAL_APPDATA);
#elif defined(USE_XDG) #elif defined(USE_XDG)
// Check for $XDG_CONFIG_HOME // Check for $XDG_CONFIG_HOME
@@ -251,7 +251,7 @@ GetUserConfigDir() noexcept
AllocatedPath AllocatedPath
GetUserMusicDir() noexcept GetUserMusicDir() noexcept
{ {
#if defined(WIN32) #if defined(_WIN32)
return GetStandardDir(CSIDL_MYMUSIC); return GetStandardDir(CSIDL_MYMUSIC);
#elif defined(USE_XDG) #elif defined(USE_XDG)
return GetUserDir("XDG_MUSIC_DIR"); return GetUserDir("XDG_MUSIC_DIR");
@@ -287,7 +287,7 @@ GetUserCacheDir() noexcept
#endif #endif
} }
#ifdef WIN32 #ifdef _WIN32
AllocatedPath AllocatedPath
GetSystemConfigDir() noexcept GetSystemConfigDir() noexcept

View File

@@ -42,7 +42,7 @@ gcc_pure
AllocatedPath AllocatedPath
GetUserCacheDir() noexcept; GetUserCacheDir() noexcept;
#ifdef WIN32 #ifdef _WIN32
/** /**
* Obtains system configuration directory. * Obtains system configuration directory.

View File

@@ -78,7 +78,7 @@ GetParentPathImpl(typename Traits::const_pointer_type p)
return typename Traits::string(Traits::CURRENT_DIRECTORY); return typename Traits::string(Traits::CURRENT_DIRECTORY);
if (sep == p) if (sep == p)
return typename Traits::string(p, p + 1); return typename Traits::string(p, p + 1);
#ifdef WIN32 #ifdef _WIN32
if (Traits::IsDrive(p) && sep == p + 2) if (Traits::IsDrive(p) && sep == p + 2)
return typename Traits::string(p, p + 3); return typename Traits::string(p, p + 3);
#endif #endif

View File

@@ -25,7 +25,7 @@
#include "util/StringPointer.hxx" #include "util/StringPointer.hxx"
#include "util/StringAPI.hxx" #include "util/StringAPI.hxx"
#ifdef WIN32 #ifdef _WIN32
#include "util/CharUtil.hxx" #include "util/CharUtil.hxx"
#include <tchar.h> #include <tchar.h>
#endif #endif
@@ -34,7 +34,7 @@
#include <assert.h> #include <assert.h>
#ifdef WIN32 #ifdef _WIN32
#define PATH_LITERAL(s) _T(s) #define PATH_LITERAL(s) _T(s)
#else #else
#define PATH_LITERAL(s) (s) #define PATH_LITERAL(s) (s)
@@ -44,7 +44,7 @@
* This class describes the nature of a native filesystem path. * This class describes the nature of a native filesystem path.
*/ */
struct PathTraitsFS { struct PathTraitsFS {
#ifdef WIN32 #ifdef _WIN32
typedef std::wstring string; typedef std::wstring string;
#else #else
typedef std::string string; typedef std::string string;
@@ -55,7 +55,7 @@ struct PathTraitsFS {
typedef Pointer::pointer_type pointer_type; typedef Pointer::pointer_type pointer_type;
typedef Pointer::const_pointer_type const_pointer_type; typedef Pointer::const_pointer_type const_pointer_type;
#ifdef WIN32 #ifdef _WIN32
static constexpr value_type SEPARATOR = '\\'; static constexpr value_type SEPARATOR = '\\';
#else #else
static constexpr value_type SEPARATOR = '/'; static constexpr value_type SEPARATOR = '/';
@@ -65,7 +65,7 @@ struct PathTraitsFS {
static constexpr bool IsSeparator(value_type ch) noexcept { static constexpr bool IsSeparator(value_type ch) noexcept {
return return
#ifdef WIN32 #ifdef _WIN32
ch == '/' || ch == '/' ||
#endif #endif
ch == SEPARATOR; ch == SEPARATOR;
@@ -78,7 +78,7 @@ struct PathTraitsFS {
assert(p != nullptr); assert(p != nullptr);
#endif #endif
#ifdef WIN32 #ifdef _WIN32
const_pointer_type pos = p + GetLength(p); const_pointer_type pos = p + GetLength(p);
while (p != pos && !IsSeparator(*pos)) while (p != pos && !IsSeparator(*pos))
--pos; --pos;
@@ -88,7 +88,7 @@ struct PathTraitsFS {
#endif #endif
} }
#ifdef WIN32 #ifdef _WIN32
gcc_pure gcc_nonnull_all gcc_pure gcc_nonnull_all
static constexpr bool IsDrive(const_pointer_type p) noexcept { static constexpr bool IsDrive(const_pointer_type p) noexcept {
return IsAlphaASCII(p[0]) && p[1] == ':'; return IsAlphaASCII(p[0]) && p[1] == ':';
@@ -102,7 +102,7 @@ struct PathTraitsFS {
assert(p != nullptr); assert(p != nullptr);
#endif #endif
#ifdef WIN32 #ifdef _WIN32
if (IsDrive(p) && IsSeparator(p[2])) if (IsDrive(p) && IsSeparator(p[2]))
return true; return true;
#endif #endif
@@ -188,7 +188,7 @@ struct PathTraitsUTF8 {
return strrchr(p, SEPARATOR); return strrchr(p, SEPARATOR);
} }
#ifdef WIN32 #ifdef _WIN32
gcc_pure gcc_nonnull_all gcc_pure gcc_nonnull_all
static constexpr bool IsDrive(const_pointer_type p) noexcept { static constexpr bool IsDrive(const_pointer_type p) noexcept {
return IsAlphaASCII(p[0]) && p[1] == ':'; return IsAlphaASCII(p[0]) && p[1] == ':';
@@ -202,7 +202,7 @@ struct PathTraitsUTF8 {
assert(p != nullptr); assert(p != nullptr);
#endif #endif
#ifdef WIN32 #ifdef _WIN32
if (IsDrive(p) && IsSeparator(p[2])) if (IsDrive(p) && IsSeparator(p[2]))
return true; return true;
#endif #endif

View File

@@ -43,7 +43,7 @@ FileOutputStream::FileOutputStream(Path _path, Mode _mode)
} }
} }
#ifdef WIN32 #ifdef _WIN32
inline void inline void
FileOutputStream::OpenCreate(gcc_unused bool visible) FileOutputStream::OpenCreate(gcc_unused bool visible)
@@ -223,7 +223,7 @@ FileOutputStream::Commit()
#endif #endif
if (!Close()) { if (!Close()) {
#ifdef WIN32 #ifdef _WIN32
throw FormatLastError("Failed to commit %s", throw FormatLastError("Failed to commit %s",
path.ToUTF8().c_str()); path.ToUTF8().c_str());
#else #else

View File

@@ -25,14 +25,14 @@
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "Compiler.h" #include "Compiler.h"
#ifndef WIN32 #ifndef _WIN32
#include "system/FileDescriptor.hxx" #include "system/FileDescriptor.hxx"
#endif #endif
#include <assert.h> #include <assert.h>
#include <stdint.h> #include <stdint.h>
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#endif #endif
@@ -41,7 +41,7 @@ class Path;
class FileOutputStream final : public OutputStream { class FileOutputStream final : public OutputStream {
const AllocatedPath path; const AllocatedPath path;
#ifdef WIN32 #ifdef _WIN32
HANDLE handle = INVALID_HANDLE_VALUE; HANDLE handle = INVALID_HANDLE_VALUE;
#else #else
FileDescriptor fd = FileDescriptor::Undefined(); FileDescriptor fd = FileDescriptor::Undefined();
@@ -116,7 +116,7 @@ private:
bool Close() { bool Close() {
assert(IsDefined()); assert(IsDefined());
#ifdef WIN32 #ifdef _WIN32
CloseHandle(handle); CloseHandle(handle);
handle = INVALID_HANDLE_VALUE; handle = INVALID_HANDLE_VALUE;
return true; return true;
@@ -125,7 +125,7 @@ private:
#endif #endif
} }
#ifdef WIN32 #ifdef _WIN32
bool SeekEOF() { bool SeekEOF() {
return SetFilePointer(handle, 0, nullptr, return SetFilePointer(handle, 0, nullptr,
FILE_END) != 0xffffffff; FILE_END) != 0xffffffff;
@@ -133,7 +133,7 @@ private:
#endif #endif
bool IsDefined() const { bool IsDefined() const {
#ifdef WIN32 #ifdef _WIN32
return handle != INVALID_HANDLE_VALUE; return handle != INVALID_HANDLE_VALUE;
#else #else
return fd.IsDefined(); return fd.IsDefined();

View File

@@ -24,7 +24,7 @@
#include <assert.h> #include <assert.h>
#ifdef WIN32 #ifdef _WIN32
FileReader::FileReader(Path _path) FileReader::FileReader(Path _path)
:path(_path), :path(_path),

View File

@@ -25,11 +25,11 @@
#include "fs/AllocatedPath.hxx" #include "fs/AllocatedPath.hxx"
#include "Compiler.h" #include "Compiler.h"
#ifndef WIN32 #ifndef _WIN32
#include "system/FileDescriptor.hxx" #include "system/FileDescriptor.hxx"
#endif #endif
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#endif #endif
@@ -39,7 +39,7 @@ class FileInfo;
class FileReader final : public Reader { class FileReader final : public Reader {
AllocatedPath path; AllocatedPath path;
#ifdef WIN32 #ifdef _WIN32
HANDLE handle; HANDLE handle;
#else #else
FileDescriptor fd; FileDescriptor fd;
@@ -48,7 +48,7 @@ class FileReader final : public Reader {
public: public:
explicit FileReader(Path _path); explicit FileReader(Path _path);
#ifdef WIN32 #ifdef _WIN32
FileReader(FileReader &&other) FileReader(FileReader &&other)
:path(std::move(other.path)), :path(std::move(other.path)),
handle(other.handle) { handle(other.handle) {
@@ -70,7 +70,7 @@ public:
protected: protected:
bool IsDefined() const { bool IsDefined() const {
#ifdef WIN32 #ifdef _WIN32
return handle != INVALID_HANDLE_VALUE; return handle != INVALID_HANDLE_VALUE;
#else #else
return fd.IsDefined(); return fd.IsDefined();
@@ -78,7 +78,7 @@ protected:
} }
public: public:
#ifndef WIN32 #ifndef _WIN32
FileDescriptor GetFD() const { FileDescriptor GetFD() const {
return fd; return fd;
} }
@@ -90,7 +90,7 @@ public:
gcc_pure gcc_pure
uint64_t GetSize() const noexcept { uint64_t GetSize() const noexcept {
#ifdef WIN32 #ifdef _WIN32
LARGE_INTEGER size; LARGE_INTEGER size;
return GetFileSizeEx(handle, &size) return GetFileSizeEx(handle, &size)
? size.QuadPart ? size.QuadPart
@@ -102,7 +102,7 @@ public:
gcc_pure gcc_pure
uint64_t GetPosition() const noexcept { uint64_t GetPosition() const noexcept {
#ifdef WIN32 #ifdef _WIN32
LARGE_INTEGER zero; LARGE_INTEGER zero;
zero.QuadPart = 0; zero.QuadPart = 0;
LARGE_INTEGER position; LARGE_INTEGER position;

View File

@@ -26,7 +26,7 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
/* damn you, windows.h! */ /* damn you, windows.h! */
#ifdef ERROR #ifdef ERROR

View File

@@ -227,7 +227,7 @@ CurlInputStream::OnHeaders(unsigned status,
if (i != headers.end()) { if (i != headers.end()) {
size_t icy_metaint = ParseUint64(i->second.c_str()); size_t icy_metaint = ParseUint64(i->second.c_str());
#ifndef WIN32 #ifndef _WIN32
/* Windows doesn't know "%z" */ /* Windows doesn't know "%z" */
FormatDebug(curl_domain, "icy-metaint=%zu", icy_metaint); FormatDebug(curl_domain, "icy-metaint=%zu", icy_metaint);
#endif #endif
@@ -414,7 +414,7 @@ CurlInputStream::SeekInternal(offset_type new_offset)
if (offset > 0) { if (offset > 0) {
char range[32]; char range[32];
#ifdef WIN32 #ifdef _WIN32
// TODO: what can we use on Windows to format 64 bit? // TODO: what can we use on Windows to format 64 bit?
sprintf(range, "%lu-", (long)offset); sprintf(range, "%lu-", (long)offset);
#else #else

View File

@@ -36,7 +36,7 @@
#include <ctype.h> #include <ctype.h>
#endif #endif
#ifdef WIN32 #ifdef _WIN32
#include "Win32.hxx" #include "Win32.hxx"
#include <windows.h> #include <windows.h>
#endif #endif
@@ -73,7 +73,7 @@ try {
folded.SetSize(folded_length); folded.SetSize(folded_length);
return UCharToUTF8({folded.begin(), folded.size()}); return UCharToUTF8({folded.begin(), folded.size()});
#elif defined(WIN32) #elif defined(_WIN32)
const auto u = MultiByteToWideChar(CP_UTF8, src); const auto u = MultiByteToWideChar(CP_UTF8, src);
const int size = LCMapStringEx(LOCALE_NAME_INVARIANT, const int size = LCMapStringEx(LOCALE_NAME_INVARIANT,

View File

@@ -32,7 +32,7 @@
#include <ctype.h> #include <ctype.h>
#endif #endif
#ifdef WIN32 #ifdef _WIN32
#include "Win32.hxx" #include "Win32.hxx"
#include "util/AllocatedString.hxx" #include "util/AllocatedString.hxx"
#include <windows.h> #include <windows.h>
@@ -103,7 +103,7 @@ IcuCollate(const char *a, const char *b) noexcept
} }
#endif #endif
#elif defined(WIN32) #elif defined(_WIN32)
AllocatedString<wchar_t> wa = nullptr, wb = nullptr; AllocatedString<wchar_t> wa = nullptr, wb = nullptr;
try { try {

View File

@@ -22,7 +22,7 @@
#include "Compiler.h" #include "Compiler.h"
#include <upnp/upnptools.h> #include <upnptools.h>
static inline constexpr unsigned static inline constexpr unsigned
CountNameValuePairs() CountNameValuePairs()

View File

@@ -20,7 +20,7 @@
#ifndef MPD_UPNP_CALLBACK_HXX #ifndef MPD_UPNP_CALLBACK_HXX
#define MPD_UPNP_CALLBACK_HXX #define MPD_UPNP_CALLBACK_HXX
#include <upnp/upnp.h> #include <upnp.h>
/** /**
* A class that is supposed to be used for libupnp asynchronous * A class that is supposed to be used for libupnp asynchronous

View File

@@ -24,7 +24,7 @@
#include "thread/Mutex.hxx" #include "thread/Mutex.hxx"
#include "util/RuntimeError.hxx" #include "util/RuntimeError.hxx"
#include <upnp/upnptools.h> #include <upnptools.h>
#include <assert.h> #include <assert.h>

View File

@@ -22,7 +22,7 @@
#include "check.h" #include "check.h"
#include <upnp/upnp.h> #include <upnp.h>
void void
UpnpClientGlobalInit(UpnpClient_Handle &handle); UpnpClientGlobalInit(UpnpClient_Handle &handle);

View File

@@ -20,15 +20,18 @@
#ifndef MPD_UPNP_COMPAT_HXX #ifndef MPD_UPNP_COMPAT_HXX
#define MPD_UPNP_COMPAT_HXX #define MPD_UPNP_COMPAT_HXX
#include <upnp/upnp.h> #include <upnp.h>
#if UPNP_VERSION < 10800 #if UPNP_VERSION < 10800
#include "Compiler.h"
/* emulate the libupnp 1.8 API with older versions */ /* emulate the libupnp 1.8 API with older versions */
using UpnpDiscovery = Upnp_Discovery; using UpnpDiscovery = Upnp_Discovery;
#endif
#if UPNP_VERSION < 10624
#include "Compiler.h"
gcc_pure gcc_pure
static inline int static inline int
UpnpDiscovery_get_Expires(const UpnpDiscovery *disco) noexcept UpnpDiscovery_get_Expires(const UpnpDiscovery *disco) noexcept

View File

@@ -22,7 +22,7 @@
#include "Compiler.h" #include "Compiler.h"
#include <upnp/upnp.h> #include <upnp.h>
#include <string> #include <string>
#include <list> #include <list>

View File

@@ -24,7 +24,7 @@
#include "util/ScopeExit.hxx" #include "util/ScopeExit.hxx"
#include "util/RuntimeError.hxx" #include "util/RuntimeError.hxx"
#include <upnp/upnptools.h> #include <upnptools.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>

View File

@@ -27,7 +27,7 @@
#include "thread/Mutex.hxx" #include "thread/Mutex.hxx"
#include "Compiler.h" #include "Compiler.h"
#include <upnp/upnp.h> #include <upnp.h>
#include <list> #include <list>
#include <vector> #include <vector>

View File

@@ -22,9 +22,9 @@
#include "thread/Mutex.hxx" #include "thread/Mutex.hxx"
#include "util/RuntimeError.hxx" #include "util/RuntimeError.hxx"
#include <upnp/upnp.h> #include <upnp.h>
#include <upnp/upnptools.h> #include <upnptools.h>
#include <upnp/ixml.h> #include <ixml.h>
#include <assert.h> #include <assert.h>

View File

@@ -20,7 +20,7 @@
#ifndef MPD_UPNP_UNIQUE_XML_HXX #ifndef MPD_UPNP_UNIQUE_XML_HXX
#define MPD_UPNP_UNIQUE_XML_HXX #define MPD_UPNP_UNIQUE_XML_HXX
#include <upnp/ixml.h> #include <ixml.h>
#include <memory> #include <memory>

View File

@@ -17,7 +17,7 @@
#ifndef _IXMLWRAP_H_INCLUDED_ #ifndef _IXMLWRAP_H_INCLUDED_
#define _IXMLWRAP_H_INCLUDED_ #define _IXMLWRAP_H_INCLUDED_
#include <upnp/ixml.h> #include <ixml.h>
#include <string> #include <string>

View File

@@ -292,7 +292,9 @@ AlsaMixer::SetVolume(unsigned volume)
{ {
assert(handle != nullptr); assert(handle != nullptr);
int err = set_normalized_playback_volume(elem, 0.01*volume, 1); double cur = get_normalized_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT);
int delta = volume - lrint(100.*cur);
int err = set_normalized_playback_volume(elem, cur + 0.01*delta, delta);
if (err < 0) if (err < 0)
throw FormatRuntimeError("failed to set ALSA volume: %s", throw FormatRuntimeError("failed to set ALSA volume: %s",
snd_strerror(err)); snd_strerror(err));

View File

@@ -23,7 +23,7 @@
#include <string> #include <string>
#ifdef WIN32 #ifdef _WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#else #else
#include <sys/types.h> #include <sys/types.h>

View File

@@ -34,7 +34,7 @@
#include <cstddef> #include <cstddef>
#ifdef WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
#else #else
#include <sys/socket.h> #include <sys/socket.h>
@@ -45,7 +45,7 @@
*/ */
class SocketAddress { class SocketAddress {
public: public:
#ifdef WIN32 #ifdef _WIN32
typedef int size_type; typedef int size_type;
#else #else
typedef socklen_t size_type; typedef socklen_t size_type;

View File

@@ -23,7 +23,7 @@
#include <string.h> #include <string.h>
#ifdef WIN32 #ifdef _WIN32
SocketErrorMessage::SocketErrorMessage(socket_error_t code) noexcept SocketErrorMessage::SocketErrorMessage(socket_error_t code) noexcept
{ {

View File

@@ -23,7 +23,7 @@
#include "Compiler.h" #include "Compiler.h"
#include "system/Error.hxx" #include "system/Error.hxx"
#ifdef WIN32 #ifdef _WIN32
#include <winsock2.h> #include <winsock2.h>
typedef DWORD socket_error_t; typedef DWORD socket_error_t;
#else #else
@@ -35,7 +35,7 @@ gcc_pure
static inline socket_error_t static inline socket_error_t
GetSocketError() noexcept GetSocketError() noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return WSAGetLastError(); return WSAGetLastError();
#else #else
return errno; return errno;
@@ -46,7 +46,7 @@ gcc_const
static inline bool static inline bool
IsSocketErrorAgain(socket_error_t code) noexcept IsSocketErrorAgain(socket_error_t code) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return code == WSAEINPROGRESS; return code == WSAEINPROGRESS;
#else #else
return code == EAGAIN; return code == EAGAIN;
@@ -57,7 +57,7 @@ gcc_const
static inline bool static inline bool
IsSocketErrorInterruped(socket_error_t code) noexcept IsSocketErrorInterruped(socket_error_t code) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return code == WSAEINTR; return code == WSAEINTR;
#else #else
return code == EINTR; return code == EINTR;
@@ -68,7 +68,7 @@ gcc_const
static inline bool static inline bool
IsSocketErrorClosed(socket_error_t code) noexcept IsSocketErrorClosed(socket_error_t code) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return code == WSAECONNRESET; return code == WSAECONNRESET;
#else #else
return code == EPIPE || code == ECONNRESET; return code == EPIPE || code == ECONNRESET;
@@ -81,7 +81,7 @@ IsSocketErrorClosed(socket_error_t code) noexcept
* and this class hosts the buffer. * and this class hosts the buffer.
*/ */
class SocketErrorMessage { class SocketErrorMessage {
#ifdef WIN32 #ifdef _WIN32
char msg[256]; char msg[256];
#else #else
const char *const msg; const char *const msg;
@@ -99,7 +99,7 @@ gcc_const
static inline std::system_error static inline std::system_error
MakeSocketError(socket_error_t code, const char *msg) noexcept MakeSocketError(socket_error_t code, const char *msg) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return MakeLastError(code, msg); return MakeLastError(code, msg);
#else #else
return MakeErrno(code, msg); return MakeErrno(code, msg);

View File

@@ -34,7 +34,7 @@
#include <algorithm> #include <algorithm>
#ifdef WIN32 #ifdef _WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#else #else
#include <netdb.h> #include <netdb.h>

View File

@@ -142,7 +142,8 @@ AudioOutputSource::GetChunkData(const MusicChunk &chunk,
replay_gain_filter_set_mode(*replay_gain_filter, replay_gain_filter_set_mode(*replay_gain_filter,
replay_gain_mode); replay_gain_mode);
if (chunk.replay_gain_serial != *replay_gain_serial_p) { if (chunk.replay_gain_serial != *replay_gain_serial_p &&
chunk.replay_gain_serial != MusicChunk::IGNORE_REPLAY_GAIN) {
replay_gain_filter_set_info(*replay_gain_filter, replay_gain_filter_set_info(*replay_gain_filter,
chunk.replay_gain_serial != 0 chunk.replay_gain_serial != 0
? &chunk.replay_gain_info ? &chunk.replay_gain_info

View File

@@ -36,9 +36,10 @@
#include <memory> #include <memory>
static constexpr unsigned MPD_OSX_BUFFER_TIME_MS = 100;
struct OSXOutput { struct OSXOutput {
AudioOutput base; AudioOutput base;
/* configuration settings */ /* configuration settings */
OSType component_subtype; OSType component_subtype;
/* only applicable with kAudioUnitSubType_HALOutput */ /* only applicable with kAudioUnitSubType_HALOutput */
@@ -693,7 +694,9 @@ osx_output_open(AudioOutput *ao, AudioFormat &audio_format)
errormsg); errormsg);
} }
od->ring_buffer = new boost::lockfree::spsc_queue<uint8_t>(buffer_frame_size); size_t ring_buffer_size = std::max<size_t>(buffer_frame_size,
MPD_OSX_BUFFER_TIME_MS * audio_format.GetFrameSize() * audio_format.sample_rate / 1000);
od->ring_buffer = new boost::lockfree::spsc_queue<uint8_t>(ring_buffer_size);
status = AudioOutputUnitStart(od->au); status = AudioOutputUnitStart(od->au);
if (status != 0) { if (status != 0) {
@@ -717,7 +720,7 @@ osx_output_delay(AudioOutput *ao) noexcept
OSXOutput *od = (OSXOutput *)ao; OSXOutput *od = (OSXOutput *)ao;
return od->ring_buffer->write_available() return od->ring_buffer->write_available()
? std::chrono::steady_clock::duration::zero() ? std::chrono::steady_clock::duration::zero()
: std::chrono::milliseconds(25); : std::chrono::milliseconds(MPD_OSX_BUFFER_TIME_MS / 4);
} }
int int

View File

@@ -24,7 +24,7 @@
#include <stdint.h> #include <stdint.h>
#if defined(WIN32) && GCC_CHECK_VERSION(4,6) #if defined(_WIN32) && GCC_CHECK_VERSION(4,6)
/* on WIN32, "FLOAT" is already defined, and this triggers -Wshadow */ /* on WIN32, "FLOAT" is already defined, and this triggers -Wshadow */
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wshadow"
@@ -57,7 +57,7 @@ enum class SampleFormat : uint8_t {
DSD, DSD,
}; };
#if defined(WIN32) && GCC_CHECK_VERSION(4,6) #if defined(_WIN32) && GCC_CHECK_VERSION(4,6)
#pragma GCC diagnostic pop #pragma GCC diagnostic pop
#endif #endif

View File

@@ -558,8 +558,10 @@ Player::SendSilence()
partial frames */ partial frames */
unsigned num_frames = sizeof(chunk->data) / frame_size; unsigned num_frames = sizeof(chunk->data) / frame_size;
chunk->bit_rate = 0;
chunk->time = SignedSongTime::Negative(); /* undefined time stamp */ chunk->time = SignedSongTime::Negative(); /* undefined time stamp */
chunk->length = num_frames * frame_size; chunk->length = num_frames * frame_size;
chunk->replay_gain_serial = MusicChunk::IGNORE_REPLAY_GAIN;
PcmSilence({chunk->data, chunk->length}, play_audio_format.format); PcmSilence({chunk->data, chunk->length}, play_audio_format.format);
try { try {

View File

@@ -75,8 +75,7 @@ playlist::MoveOrderToCurrent(unsigned old_order)
} else { } else {
/* not playing anything: move the specified song to /* not playing anything: move the specified song to
the front */ the front */
queue.SwapOrders(old_order, 0); return queue.MoveOrderBefore(old_order, 0);
return 0;
} }
} }

View File

@@ -112,7 +112,7 @@ playlist::AppendSong(PlayerControl &pc, DetachedSong &&song)
else else
start = current + 1; start = current + 1;
if (start < queue.GetLength()) if (start < queue.GetLength())
queue.ShuffleOrderLast(start, queue.GetLength()); queue.ShuffleOrderLastWithPriority(start, queue.GetLength());
} }
UpdateQueuedSong(pc, queued_song); UpdateQueuedSong(pc, queued_song);

View File

@@ -364,8 +364,20 @@ Queue::ShuffleOrderFirst(unsigned start, unsigned end)
} }
void void
Queue::ShuffleOrderLast(unsigned start, unsigned end) Queue::ShuffleOrderLastWithPriority(unsigned start, unsigned end)
{ {
assert(end <= length);
assert(start < end);
/* skip all items at the start which have a higher priority,
because the last item shall only be shuffled within its
priority group */
const auto last_priority = items[OrderToPosition(end - 1)].priority;
while (items[OrderToPosition(start)].priority != last_priority) {
++start;
assert(start < end);
}
rand.AutoCreate(); rand.AutoCreate();
std::uniform_int_distribution<unsigned> distribution(start, end - 1); std::uniform_int_distribution<unsigned> distribution(start, end - 1);

View File

@@ -356,11 +356,12 @@ struct Queue {
void ShuffleOrderFirst(unsigned start, unsigned end); void ShuffleOrderFirst(unsigned start, unsigned end);
/** /**
* Shuffles the virtual order of the last song in the specified * Shuffles the virtual order of the last song in the
* (order) range. This is used in random mode after a song has been * specified (order) range; only songs which match this song's
* appended by queue_append(). * priority are considered. This is used in random mode after
* a song has been appended by Append().
*/ */
void ShuffleOrderLast(unsigned start, unsigned end); void ShuffleOrderLastWithPriority(unsigned start, unsigned end);
/** /**
* Shuffles a (position) range in the queue. The songs are physically * Shuffles a (position) range in the queue. The songs are physically

View File

@@ -0,0 +1,138 @@
/*
* 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.
*/
/*
* Save and load mounts of the compound storage to/from the state file.
*
*/
#include "config.h"
#include "StorageState.hxx"
#include "fs/io/TextFile.hxx"
#include "fs/io/BufferedOutputStream.hxx"
#include "storage/Registry.hxx"
#include "storage/CompositeStorage.hxx"
#include "db/plugins/simple/SimpleDatabasePlugin.hxx"
#include "util/StringCompare.hxx"
#include "util/Domain.hxx"
#include "Instance.hxx"
#include "IOThread.hxx"
#include "Log.hxx"
#include <list>
#include <boost/crc.hpp>
#define MOUNT_STATE_BEGIN "mount_begin"
#define MOUNT_STATE_END "mount_end"
#define MOUNT_STATE_STORAGE_URI "uri: "
#define MOUNT_STATE_MOUNTED_URL "mounted_url: "
static constexpr Domain storage_domain("storage");
void
storage_state_save(BufferedOutputStream &os, const Instance &instance)
{
const auto visitor = [&os](const char *mount_uri, const Storage &storage) {
std::string uri = storage.MapUTF8("");
if (uri.empty() || StringIsEmpty(mount_uri))
return;
os.Format(
MOUNT_STATE_BEGIN "\n"
MOUNT_STATE_STORAGE_URI "%s\n"
MOUNT_STATE_MOUNTED_URL "%s\n"
MOUNT_STATE_END "\n", mount_uri, uri.c_str());
};
((CompositeStorage*)instance.storage)->VisitMounts(visitor);
}
bool
storage_state_restore(const char *line, TextFile &file, Instance &instance)
{
if (!StringStartsWith(line, MOUNT_STATE_BEGIN))
return false;
std::string url;
std::string uri;
const char* value;
while ((line = file.ReadLine()) != nullptr) {
if (StringStartsWith(line, MOUNT_STATE_END))
break;
if ((value = StringAfterPrefix(line, MOUNT_STATE_MOUNTED_URL)))
url = value;
else if ((value = StringAfterPrefix(line, MOUNT_STATE_STORAGE_URI)))
uri = value;
else
FormatError(storage_domain, "Unrecognized line in mountpoint state: %s", line);
}
if (url.empty() || uri.empty()) {
LogError(storage_domain, "Missing value in mountpoint state.");
return true;
}
FormatDebug(storage_domain, "Restoring mount %s => %s", uri.c_str(), url.c_str());
auto &event_loop = io_thread_get();
Storage *storage = CreateStorageURI(event_loop, url.c_str());
if (storage == nullptr) {
FormatError(storage_domain, "Unrecognized storage URI: %s", url.c_str());
return true;
}
#ifdef ENABLE_DATABASE
Database *db = instance.database;
if (db != nullptr && db->IsPlugin(simple_db_plugin)) {
try {
((SimpleDatabase *)db)->Mount(uri.c_str(), url.c_str());
} catch (...) {
throw;
}
}
#endif
((CompositeStorage*)instance.storage)->Mount(uri.c_str(), storage);
return true;
}
unsigned
storage_state_get_hash(const Instance &instance)
{
std::list<std::string> mounts;
const auto visitor = [&mounts](const char *mount_uri, const Storage &storage) {
mounts.push_back(std::string(mount_uri) + ":" + storage.MapUTF8(""));
};
((CompositeStorage*)instance.storage)->VisitMounts(visitor);
mounts.sort();
boost::crc_32_type result;
for (auto mount: mounts) {
result.process_bytes(mount.c_str(), mount.length());
}
return result.checksum();
}

View File

@@ -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.
*/
/*
* Saving and loading the playlist to/from the state file.
*
*/
#ifndef MPD_STORAGE_STATE_HXX
#define MPD_STORAGE_STATE_HXX
struct Instance;
class BufferedOutputStream;
class TextFile;
void
storage_state_save(BufferedOutputStream &os, const Instance &instance);
bool
storage_state_restore(const char *line, TextFile &file, Instance &instance);
/**
* Generates a hash number for the current state of the composite storage.
* This is used by timer_save_state_file() to determine whether the state
* has changed and the state file should be saved.
*/
unsigned
storage_state_get_hash(const Instance &instance);
#endif

View File

@@ -86,7 +86,7 @@ Stat(Path path, bool follow)
info.size = src.GetSize(); info.size = src.GetSize();
info.mtime = src.GetModificationTime(); info.mtime = src.GetModificationTime();
#ifdef WIN32 #ifdef _WIN32
info.device = info.inode = 0; info.device = info.inode = 0;
#else #else
info.device = src.GetDevice(); info.device = src.GetDevice();

View File

@@ -19,7 +19,7 @@
#include "Clock.hxx" #include "Clock.hxx"
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
gcc_const gcc_const

View File

@@ -22,7 +22,7 @@
#include "Compiler.h" #include "Compiler.h"
#ifdef WIN32 #ifdef _WIN32
/** /**
* Returns the uptime of the current process in seconds. * Returns the uptime of the current process in seconds.

View File

@@ -22,7 +22,7 @@
#include "EPollFD.hxx" #include "EPollFD.hxx"
#include "FatalError.hxx" #include "FatalError.hxx"
#ifdef __BIONIC__ #if defined(__BIONIC__) && __ANDROID_API__ < 21
#include <sys/syscall.h> #include <sys/syscall.h>
#include <fcntl.h> #include <fcntl.h>

View File

@@ -47,7 +47,7 @@ FormatSystemError(std::error_code code, const char *fmt, Args&&... args)
return std::system_error(code, buffer); return std::system_error(code, buffer);
} }
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
@@ -90,7 +90,7 @@ FormatLastError(const char *fmt, Args&&... args)
std::forward<Args>(args)...); std::forward<Args>(args)...);
} }
#endif /* WIN32 */ #endif /* _WIN32 */
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
@@ -106,7 +106,7 @@ FormatLastError(const char *fmt, Args&&... args)
static inline const std::error_category & static inline const std::error_category &
ErrnoCategory() ErrnoCategory()
{ {
#ifdef WIN32 #ifdef _WIN32
/* on Windows, the generic_category() is used for errno /* on Windows, the generic_category() is used for errno
values */ values */
return std::generic_category(); return std::generic_category();
@@ -151,7 +151,7 @@ gcc_pure
static inline bool static inline bool
IsFileNotFound(const std::system_error &e) noexcept IsFileNotFound(const std::system_error &e) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return e.code().category() == std::system_category() && return e.code().category() == std::system_category() &&
e.code().value() == ERROR_FILE_NOT_FOUND; e.code().value() == ERROR_FILE_NOT_FOUND;
#else #else
@@ -164,7 +164,7 @@ gcc_pure
static inline bool static inline bool
IsPathNotFound(const std::system_error &e) noexcept IsPathNotFound(const std::system_error &e) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return e.code().category() == std::system_category() && return e.code().category() == std::system_category() &&
e.code().value() == ERROR_PATH_NOT_FOUND; e.code().value() == ERROR_PATH_NOT_FOUND;
#else #else
@@ -177,7 +177,7 @@ gcc_pure
static inline bool static inline bool
IsAccessDenied(const std::system_error &e) noexcept IsAccessDenied(const std::system_error &e) noexcept
{ {
#ifdef WIN32 #ifdef _WIN32
return e.code().category() == std::system_category() && return e.code().category() == std::system_category() &&
e.code().value() == ERROR_ACCESS_DENIED; e.code().value() == ERROR_ACCESS_DENIED;
#else #else

View File

@@ -26,19 +26,19 @@
#include <assert.h> #include <assert.h>
#include <unistd.h> #include <unistd.h>
#ifdef WIN32 #ifdef _WIN32
#include <ws2tcpip.h> #include <ws2tcpip.h>
#include <winsock2.h> #include <winsock2.h>
#include <cstring> /* for memset() */ #include <cstring> /* for memset() */
#endif #endif
#ifdef WIN32 #ifdef _WIN32
static bool PoorSocketPair(int fd[2]); static bool PoorSocketPair(int fd[2]);
#endif #endif
EventPipe::EventPipe() EventPipe::EventPipe()
{ {
#ifdef WIN32 #ifdef _WIN32
bool success = PoorSocketPair(fds); bool success = PoorSocketPair(fds);
#else #else
bool success = pipe_cloexec_nonblock(fds) >= 0; bool success = pipe_cloexec_nonblock(fds) >= 0;
@@ -49,7 +49,7 @@ EventPipe::EventPipe()
EventPipe::~EventPipe() EventPipe::~EventPipe()
{ {
#ifdef WIN32 #ifdef _WIN32
closesocket(fds[0]); closesocket(fds[0]);
closesocket(fds[1]); closesocket(fds[1]);
#else #else
@@ -65,7 +65,7 @@ EventPipe::Read()
assert(fds[1] >= 0); assert(fds[1] >= 0);
char buffer[256]; char buffer[256];
#ifdef WIN32 #ifdef _WIN32
return recv(fds[0], buffer, sizeof(buffer), 0) > 0; return recv(fds[0], buffer, sizeof(buffer), 0) > 0;
#else #else
return read(fds[0], buffer, sizeof(buffer)) > 0; return read(fds[0], buffer, sizeof(buffer)) > 0;
@@ -78,14 +78,14 @@ EventPipe::Write()
assert(fds[0] >= 0); assert(fds[0] >= 0);
assert(fds[1] >= 0); assert(fds[1] >= 0);
#ifdef WIN32 #ifdef _WIN32
send(fds[1], "", 1, 0); send(fds[1], "", 1, 0);
#else #else
gcc_unused ssize_t nbytes = write(fds[1], "", 1); gcc_unused ssize_t nbytes = write(fds[1], "", 1);
#endif #endif
} }
#ifdef WIN32 #ifdef _WIN32
static void SafeCloseSocket(SOCKET s) static void SafeCloseSocket(SOCKET s)
{ {

View File

@@ -28,7 +28,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#ifdef WIN32 #ifdef _WIN32
#include <windows.h> #include <windows.h>
#else #else
#include <errno.h> #include <errno.h>
@@ -61,7 +61,7 @@ FormatFatalError(const char *fmt, ...)
Abort(); Abort();
} }
#ifdef WIN32 #ifdef _WIN32
void void
FatalSystemError(const char *msg, DWORD code) FatalSystemError(const char *msg, DWORD code)
@@ -79,7 +79,7 @@ FatalSystemError(const char *msg, DWORD code)
void void
FatalSystemError(const char *msg) FatalSystemError(const char *msg)
{ {
#ifdef WIN32 #ifdef _WIN32
FatalSystemError(msg, GetLastError()); FatalSystemError(msg, GetLastError());
#else #else
const char *system_error = strerror(errno); const char *system_error = strerror(errno);

View File

@@ -23,7 +23,7 @@
#include "check.h" #include "check.h"
#include "Compiler.h" #include "Compiler.h"
#ifdef WIN32 #ifdef _WIN32
#include <windef.h> #include <windef.h>
#endif #endif
@@ -47,7 +47,7 @@ gcc_noreturn
void void
FatalSystemError(const char *msg); FatalSystemError(const char *msg);
#ifdef WIN32 #ifdef _WIN32
gcc_noreturn gcc_noreturn
void void

View File

@@ -33,7 +33,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#ifndef WIN32 #ifndef _WIN32
#include <poll.h> #include <poll.h>
#endif #endif
@@ -70,7 +70,7 @@ FileDescriptor::OpenReadOnly(const char *pathname) noexcept
return Open(pathname, O_RDONLY); return Open(pathname, O_RDONLY);
} }
#ifndef WIN32 #ifndef _WIN32
bool bool
FileDescriptor::OpenNonBlocking(const char *pathname) noexcept FileDescriptor::OpenNonBlocking(const char *pathname) noexcept
@@ -184,7 +184,7 @@ FileDescriptor::GetSize() const noexcept
: -1; : -1;
} }
#ifndef WIN32 #ifndef _WIN32
int int
FileDescriptor::Poll(short events, int timeout) const noexcept FileDescriptor::Poll(short events, int timeout) const noexcept

Some files were not shown because too many files have changed in this diff Show More