diff --git a/CMakeLists.txt b/CMakeLists.txt index 94863fd3..9aa6a1af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,7 +32,7 @@ config_h_add_compile_definitions(BUILD="${CMAKE_HOST_SYSTEM_PROCESSOR}-${CMAKE_H config_h_add_compile_definitions(TARGET="${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM}-${CMAKE_CXX_COMPILER_TARGET}") if(WIN32) - set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -D_POSIX_C_SOURCE=1) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_POSIX_C_SOURCE=1") set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat) set(CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat) set(CMAKE_STATIC_LINKER_FLAGS_LINKER_FLAGS ${CMAKE_STATIC_LINKER_FLAGS} -Wl,--dynamicbase -Wl,--nxcompat) @@ -79,6 +79,16 @@ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") # using Intel C++ elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # using Visual Studio C++ + # config_h_add_compile_definitions(__MSVC__=1) # USE _MSC_VER + add_compile_definitions(NOMINMAX) + config_h_add_compile_macro("__restrict__ __restrict") + config_h_add_compile_macro("__attribute__(unused) /*Empty*/") +endif() + +if(WIN32 AND NOT MINGW) + set(NO_UNIX) + config_h_add_compile_macro("mode_t int") + config_h_add_compile_definitions(NO_UNIX=1) endif() if(CMAKE_C_COMPILER_ID STREQUAL "GNU") @@ -350,6 +360,8 @@ if(WITH_OPENSSL) if(OPENSSL_FOUND AND NOT HAVE_SSL) set(HAVE_OPENSSL yes CACHE BOOL "Define is you have openssl" FORCE) + set(OPENSSL_CFLAGS "") + set(OPENSSL_LIBS ${OPENSSL_LIBRARIES}) config_h_add_compile_definitions(HAVE_OPENSSL=1) set(save_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES}) diff --git a/cmake/GenerateConfigH.cmake b/cmake/GenerateConfigH.cmake index 45b5ef79..e73f8db9 100644 --- a/cmake/GenerateConfigH.cmake +++ b/cmake/GenerateConfigH.cmake @@ -2,6 +2,10 @@ function(config_h_add_compile_definitions definitions) set(${PROJECT_NAME}_CONFIG_H_definitions ${${PROJECT_NAME}_CONFIG_H_definitions} ${definitions} PARENT_SCOPE) endfunction() +function(config_h_add_compile_macro definitions) + set(${PROJECT_NAME}_CONFIG_H_macros ${${PROJECT_NAME}_CONFIG_H_macros} ${definitions} PARENT_SCOPE) +endfunction() + function(config_h_generate_header name) write_file(${CMAKE_CURRENT_BINARY_DIR}/${name}.h.cmake.in "/* config.h.in. Generated from cmake*/\n") foreach(def ${${PROJECT_NAME}_CONFIG_H_definitions}) @@ -18,5 +22,10 @@ function(config_h_generate_header name) endif() write_file(${CMAKE_CURRENT_BINARY_DIR}/${name}.h.cmake.in "#define ${def_name} @${def_name}_config_h_val@\n" APPEND) endforeach() + + foreach(macro ${${PROJECT_NAME}_CONFIG_H_macros}) + write_file(${CMAKE_CURRENT_BINARY_DIR}/${name}.h.cmake.in "#define ${macro} \n" APPEND) + endforeach() + configure_file(${CMAKE_CURRENT_BINARY_DIR}/${name}.h.cmake.in ${name}.h) endfunction() \ No newline at end of file diff --git a/deps/wslay/CMakeLists.txt b/deps/wslay/CMakeLists.txt index 0c741a91..593799b5 100644 --- a/deps/wslay/CMakeLists.txt +++ b/deps/wslay/CMakeLists.txt @@ -33,6 +33,27 @@ include(CheckIncludeFiles) include(CheckTypeSize) include(CheckFunctionExists) +if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") +# using Clang +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + # using GCC + set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -pipe) + +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Intel") +# using Intel C++ +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") + # using Visual Studio C++ + # config_h_add_compile_definitions(__MSVC__=1) # USE _MSC_VER + add_compile_definitions(NOMINMAX) + config_h_add_compile_macro("__restrict__ __restrict") + config_h_add_compile_macro("__attribute__(unused) /*Empty*/") +endif() + +if(WIN32 AND NOT MINGW) + set(NO_UNIX) + config_h_add_compile_definitions(NO_UNIX=1) +endif() + if(ENABLE_WERROR) add_compile_options(-Wall -Werror -Wformat-security) diff --git a/deps/wslay/examples/echoserv.cc b/deps/wslay/examples/echoserv.cc index 48e5d3f1..70fcf631 100644 --- a/deps/wslay/examples/echoserv.cc +++ b/deps/wslay/examples/echoserv.cc @@ -27,6 +27,7 @@ // g++ -Wall -O2 -g -o echoserv echoserv.cc -L../lib/.libs -I../lib/includes -lwslay -lnettle // $ export LD_LIBRARY_PATH=../lib/.libs // $ ./a.out 9000 + #include #include #include diff --git a/deps/wslay/examples/fork-echoserv.c b/deps/wslay/examples/fork-echoserv.c index 3f2b2a00..fc21e5a7 100644 --- a/deps/wslay/examples/fork-echoserv.c +++ b/deps/wslay/examples/fork-echoserv.c @@ -35,6 +35,9 @@ * $ export LD_LIBRARY_PATH=../lib/.libs * $ ./a.out 9000 */ + +#include "config.h" + #include #include #include diff --git a/deps/wslay/examples/testclient.cc b/deps/wslay/examples/testclient.cc index 03ce0240..63262db2 100644 --- a/deps/wslay/examples/testclient.cc +++ b/deps/wslay/examples/testclient.cc @@ -26,6 +26,9 @@ // $ g++ -Wall -O2 -g -o testclient testclient.cc -L../lib/.libs -I../lib/includes -lwslay -lnettle // $ export LD_LIBRARY_PATH=../lib/.libs // $ ./a.out localhost 9001 + +#include "config.h" + #include #include #include diff --git a/deps/wslay/lib/includes/wslay/wslay.h b/deps/wslay/lib/includes/wslay/wslay.h index 77a4e825..d7ed2c67 100644 --- a/deps/wslay/lib/includes/wslay/wslay.h +++ b/deps/wslay/lib/includes/wslay/wslay.h @@ -33,6 +33,11 @@ extern "C" { #include #include +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#endif + /* * wslay/wslayver.h is generated from wslay/wslayver.h.in by * configure. The projects which do not use autotools can set diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index 52efc012..0bd84248 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -34,7 +34,9 @@ /* copyright --> */ #include "AbstractDiskWriter.h" -#include +#ifndef NO_UNIX +# include +#endif #ifdef HAVE_MMAP # include #endif // HAVE_MMAP @@ -54,12 +56,16 @@ #include "error_code.h" #include "LogFactory.h" +#if defined(_MSC_VER) +# include +#endif + namespace aria2 { AbstractDiskWriter::AbstractDiskWriter(const std::string& filename) : filename_(filename), fd_(A2_BAD_FD), -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) mapView_(0), #else // !__MINGW32__ #endif // !__MINGW32__ @@ -78,7 +84,7 @@ namespace { // the value of GetLastError(). Otherwise, return errno. int fileError() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) return GetLastError(); #else // !__MINGW32__ return errno; @@ -92,7 +98,7 @@ namespace { // errno. std::string fileStrerror(int errNum) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) auto msg = util::formatLastError(errNum); if (msg.empty()) { char buf[256]; @@ -113,7 +119,7 @@ void AbstractDiskWriter::openFile(int64_t totalLength) } catch (RecoverableException& e) { if ( -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) e.getErrNum() == ERROR_FILE_NOT_FOUND || e.getErrNum() == ERROR_PATH_NOT_FOUND #else // !__MINGW32__ @@ -133,7 +139,7 @@ void AbstractDiskWriter::closeFile() #if defined(HAVE_MMAP) || defined(__MINGW32__) if (mapaddr_) { int errNum = 0; -# ifdef __MINGW32__ +# if defined(__MINGW32__) || defined(_MSC_VER) if (!UnmapViewOfFile(mapaddr_)) { errNum = GetLastError(); } @@ -157,7 +163,7 @@ void AbstractDiskWriter::closeFile() } #endif // HAVE_MMAP || defined __MINGW32__ if (fd_ != A2_BAD_FD) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) CloseHandle(fd_); #else // !__MINGW32__ close(fd_); @@ -167,7 +173,7 @@ void AbstractDiskWriter::closeFile() } namespace { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) HANDLE openFileWithFlags(const std::string& filename, int flags, error_code::Value errCode) { @@ -265,7 +271,7 @@ ssize_t AbstractDiskWriter::writeDataInternal(const unsigned char* data, ssize_t writtenLength = 0; seek(offset); while ((size_t)writtenLength < len) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) DWORD nwrite; if (WriteFile(fd_, data + writtenLength, len - writtenLength, &nwrite, 0)) { @@ -303,7 +309,7 @@ ssize_t AbstractDiskWriter::readDataInternal(unsigned char* data, size_t len, } else { seek(offset); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) DWORD nread; if (ReadFile(fd_, data, len, &nread, 0)) { return nread; @@ -323,7 +329,7 @@ ssize_t AbstractDiskWriter::readDataInternal(unsigned char* data, size_t len, void AbstractDiskWriter::seek(int64_t offset) { assert(offset >= 0); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) LARGE_INTEGER fileLength; fileLength.QuadPart = offset; if (SetFilePointerEx(fd_, fileLength, 0, FILE_BEGIN) == 0) @@ -345,7 +351,7 @@ void AbstractDiskWriter::ensureMmapWrite(size_t len, int64_t offset) if (mapaddr_) { if (static_cast(len + offset) > maplen_) { int errNum = 0; -# ifdef __MINGW32__ +# if defined(__MINGW32__) || defined(_MSC_VER) if (!UnmapViewOfFile(mapaddr_)) { errNum = GetLastError(); } @@ -385,7 +391,7 @@ void AbstractDiskWriter::ensureMmapWrite(size_t len, int64_t offset) int errNum = 0; if (static_cast(len + offset) <= filesize) { -# ifdef __MINGW32__ +# if defined(__MINGW32__) || defined(_MSC_VER) mapView_ = CreateFileMapping(fd_, 0, PAGE_READWRITE, filesize >> 32, filesize & 0xffffffffu, 0); if (mapView_) { @@ -432,7 +438,7 @@ namespace { bool isDiskFullError(int errNum) { return -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) errNum == ERROR_DISK_FULL || errNum == ERROR_HANDLE_DISK_FULL #else // !__MINGW32__ errNum == ENOSPC @@ -483,7 +489,7 @@ void AbstractDiskWriter::truncate(int64_t length) if (fd_ == A2_BAD_FD) { throw DL_ABORT_EX("File not yet opened."); } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // Since mingw32's ftruncate cannot handle over 2GB files, we use // SetEndOfFile instead. seek(length); @@ -505,7 +511,7 @@ void AbstractDiskWriter::allocate(int64_t offset, int64_t length, bool sparse) throw DL_ABORT_EX("File not yet opened."); } if (sparse) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) DWORD bytesReturned; if (!DeviceIoControl(fd_, FSCTL_SET_SPARSE, 0, 0, 0, 0, &bytesReturned, 0)) { @@ -517,7 +523,7 @@ void AbstractDiskWriter::allocate(int64_t offset, int64_t length, bool sparse) return; } #ifdef HAVE_SOME_FALLOCATE -# ifdef __MINGW32__ +# if defined(__MINGW32__) || defined(_MSC_VER) truncate(offset + length); if (!SetFileValidData(fd_, offset + length)) { auto errNum = fileError(); @@ -595,7 +601,7 @@ void AbstractDiskWriter::flushOSBuffers() if (fd_ == A2_BAD_FD) { return; } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) FlushFileBuffers(fd_); #else // !__MINGW32__ fsync(fd_); diff --git a/src/AbstractDiskWriter.h b/src/AbstractDiskWriter.h index 96518a68..ed50ea7c 100644 --- a/src/AbstractDiskWriter.h +++ b/src/AbstractDiskWriter.h @@ -44,7 +44,7 @@ class AbstractDiskWriter : public DiskWriter { private: std::string filename_; -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) HANDLE fd_; // The handle for memory mapped file. mmap equivalent in Windows. HANDLE mapView_; diff --git a/src/BinaryStream.h b/src/BinaryStream.h index 8b442475..77bd4cb3 100644 --- a/src/BinaryStream.h +++ b/src/BinaryStream.h @@ -37,7 +37,9 @@ #include "common.h" -#include +#ifndef NO_UNIX +# include +#endif namespace aria2 { diff --git a/src/BtFileAllocationEntry.cc b/src/BtFileAllocationEntry.cc index 8ef15265..5a8dea06 100644 --- a/src/BtFileAllocationEntry.cc +++ b/src/BtFileAllocationEntry.cc @@ -92,7 +92,7 @@ void BtFileAllocationEntry::prepareForNextAction( } } else { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) if (!diskAdaptor->isReadOnlyEnabled()) { // On Windows, if aria2 opens files with GENERIC_WRITE access // right, some programs cannot open them aria2 is seeding. To diff --git a/src/BufferedFile.cc b/src/BufferedFile.cc index 0f9a97b6..6384eb8f 100644 --- a/src/BufferedFile.cc +++ b/src/BufferedFile.cc @@ -47,7 +47,7 @@ BufferedFile::BufferedFile(const char* filename, const char* mode) : fp_(strcmp(DEV_STDIN, filename) == 0 ? stdin : -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) a2fopen(utf8ToWChar(filename).c_str(), utf8ToWChar(mode).c_str()) #else // !__MINGW32__ a2fopen(filename, mode) @@ -81,7 +81,7 @@ int BufferedFile::onClose() int rv = 0; if (fp_) { fflush(fp_); -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) fsync(fileno(fp_)); #else // __MINGW32__ _commit(fileno(fp_)); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e30dd61b..dcf31a8f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1282,6 +1282,7 @@ target_include_directories(aria2 INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/includes) if(HAVE_ZLIB) target_include_directories(aria2 PUBLIC ${ZLIB_INCLUDE_DIRS}) + target_include_directories(main PUBLIC ${LIBXML2_INCLUDE_DIR}) target_link_libraries(aria2 ZLIB::ZLIB) endif() @@ -1292,16 +1293,19 @@ endif() if(HAVE_LIBXML2) target_include_directories(aria2 PUBLIC ${LIBXML2_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${LIBXML2_INCLUDE_DIR}) target_link_libraries(aria2 LibXml2::LibXml2) endif() if(HAVE_LIBEXPAT) target_include_directories(aria2 PUBLIC ${EXPAT_INCLUDE_DIRS}) + target_include_directories(main PUBLIC ${EXPAT_INCLUDE_DIRS}) target_link_libraries(aria2 EXPAT::EXPAT) endif() if(HAVE_SQLITE3) target_include_directories(aria2 PUBLIC ${SQLite3_INCLUDE_DIRS}) + target_include_directories(main PUBLIC ${SQLite3_INCLUDE_DIRS}) target_link_libraries(aria2 SQLite::SQLite3) endif() @@ -1316,11 +1320,15 @@ endif() if(HAVE_LIBGNUTLS) target_include_directories(aria2 PUBLIC ${GNUTLS_INCLUDE_DIR}) target_compile_definitions(aria2 PUBLIC ${LIBGNUTLS_CFLAGS}) + target_include_directories(main PUBLIC ${GNUTLS_INCLUDE_DIR}) + target_compile_definitions(main PUBLIC ${LIBGNUTLS_CFLAGS}) target_link_libraries(aria2 GnuTLS::GnuTLS) endif() if(HAVE_OPENSSL) target_include_directories(aria2 PUBLIC ${OPENSSL_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${OPENSSL_INCLUDE_DIR}) + target_link_libraries(aria2 OpenSSL::SSL) # target_link_libraries(aria2 INTERFACE OpenSSL::Crypto) @@ -1328,21 +1336,25 @@ endif() if(HAVE_LIBNETTLE) target_include_directories(aria2 PUBLIC ${NETTLE_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${NETTLE_INCLUDE_DIR}) target_link_libraries(aria2 Nettle::Nettle) endif() if(HAVE_LIBGMP) target_include_directories(aria2 PUBLIC ${GMP_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${GMP_INCLUDE_DIR}) target_link_libraries(aria2 GMP::GMP) endif() if(HAVE_LIBGCRYPT) target_include_directories(aria2 PUBLIC ${LibGcrypt_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${LibGcrypt_INCLUDE_DIR}) target_link_libraries(aria2 LibGcrypt::LibGcrypt) endif() if(HAVE_LIBSSH2) target_include_directories(aria2 PUBLIC ${LIBSSH2_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${LIBSSH2_INCLUDE_DIR}) target_link_libraries(aria2 LibSSH2::LibSSH2) endif() @@ -1353,6 +1365,7 @@ endif() if(ENABLE_WEBSOCKET) target_include_directories(aria2 PUBLIC ${WSLAY_INCLUDE_DIR}) + target_include_directories(main PUBLIC ${WSLAY_INCLUDE_DIR}) target_link_libraries(aria2 wslay) endif() diff --git a/src/ConsoleStatCalc.cc b/src/ConsoleStatCalc.cc index a28a4a54..343f7d37 100644 --- a/src/ConsoleStatCalc.cc +++ b/src/ConsoleStatCalc.cc @@ -40,7 +40,9 @@ #ifdef HAVE_SYS_IOCTL_H # include #endif // HAVE_SYS_IOCTL_H -#include +#ifndef NO_UNIX +# include +#endif #include #include @@ -272,7 +274,7 @@ ConsoleStatCalc::ConsoleStatCalc(std::chrono::seconds summaryInterval, : summaryInterval_(std::move(summaryInterval)), readoutVisibility_(true), truncate_(true), -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) isTTY_(true), #else // !__MINGW32__ isTTY_(isatty(STDOUT_FILENO) == 1), @@ -301,7 +303,7 @@ void ConsoleStatCalc::calculateStat(const DownloadEngine* e) unsigned short int cols = 79; if (isTTY_) { -#ifndef __MINGW32__ +#if efined(__MINGW32__) || defined(_MSC_VER) # ifdef HAVE_TERMIOS_H struct winsize size; if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &size) == 0) { diff --git a/src/Context.cc b/src/Context.cc index d12775bb..ffa8f5b7 100644 --- a/src/Context.cc +++ b/src/Context.cc @@ -34,7 +34,9 @@ /* copyright --> */ #include "Context.h" -#include +#ifndef NO_UNIX +# include +#endif #include #ifdef HAVE_SYS_RESOURCE_H diff --git a/src/DefaultPieceStorage.cc b/src/DefaultPieceStorage.cc index e08b1b18..f7d7ce2d 100644 --- a/src/DefaultPieceStorage.cc +++ b/src/DefaultPieceStorage.cc @@ -485,7 +485,7 @@ void DefaultPieceStorage::completePiece(const std::shared_ptr& piece) #ifdef ENABLE_BITTORRENT if (downloadContext_->hasAttribute(CTX_ATTR_BT)) { if (!bittorrent::getTorrentAttrs(downloadContext_)->metadata.empty()) { -# ifdef __MINGW32__ +# if defined(__MINGW32__) || defined(_MSC_VER) // On Windows, if aria2 opens files with GENERIC_WRITE access // right, some programs cannot open them aria2 is seeding. To // avoid this situation, re-open the files with read-only diff --git a/src/DownloadCommand.h b/src/DownloadCommand.h index aeee4416..e4ccad41 100644 --- a/src/DownloadCommand.h +++ b/src/DownloadCommand.h @@ -37,7 +37,9 @@ #include "AbstractCommand.h" -#include +#ifndef NO_UNIX +# include +#endif namespace aria2 { diff --git a/src/FeatureConfig.cc b/src/FeatureConfig.cc index 2b43c8b1..75f78a44 100644 --- a/src/FeatureConfig.cc +++ b/src/FeatureConfig.cc @@ -273,7 +273,7 @@ std::string usedCompilerAndPlatform() #elif defined(__GNUG__) -# ifdef __MINGW32__ +# if defined(__MINGW32__) || defined(_MSC_VER) rv << "mingw "; # ifdef __MINGW32_MAJOR_VERSION rv << (int)__MINGW32_MAJOR_VERSION; diff --git a/src/File.cc b/src/File.cc index a98dca61..4faf8cae 100644 --- a/src/File.cc +++ b/src/File.cc @@ -39,7 +39,9 @@ #ifdef HAVE_UTIME_H # include #endif // HAVE_UTIME_H -#include +#ifndef NO_UNIX +# include +#endif #include #include @@ -120,7 +122,7 @@ bool File::remove() } } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) namespace { HANDLE openFile(const std::string& filename, bool readOnly = true) { @@ -136,7 +138,7 @@ HANDLE openFile(const std::string& filename, bool readOnly = true) int64_t File::size() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // _wstat cannot be used for symlink. It always returns 0. Quoted // from https://msdn.microsoft.com/en-us/library/14h5k7ff.aspx: // @@ -165,7 +167,7 @@ bool File::mkdirs() if (isDir()) { return false; } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) std::string path = name_; for (std::string::iterator i = path.begin(), eoi = path.end(); i != eoi; ++i) { @@ -224,7 +226,7 @@ bool File::mkdirs() if (i != end) { ++i; } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) if (*(j - 1) == ':') { // This is a drive letter, e.g. C:, so skip it. continue; @@ -289,7 +291,7 @@ bool File::isDir(const std::string& filename) { return File(filename).isDir(); } bool File::renameTo(const std::string& dest) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // MinGW's rename() doesn't delete an existing destination. Better // to use MoveFileEx, which usually provides atomic move in aria2 // usecase. @@ -374,7 +376,7 @@ Time File::getModifiedTime() std::string File::getCurrentDir() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) const size_t buflen = 2048; wchar_t buf[buflen]; if (_wgetcwd(buf, buflen)) { @@ -397,7 +399,7 @@ std::string File::getCurrentDir() const char* File::getPathSeparators() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) return "/\\"; #else // !__MINGW32__ return "/"; diff --git a/src/FileAllocationIterator.h b/src/FileAllocationIterator.h index d4aeb1a7..2ac821f4 100644 --- a/src/FileAllocationIterator.h +++ b/src/FileAllocationIterator.h @@ -37,7 +37,9 @@ #include "common.h" -#include +#ifndef NO_UNIX +# include +#endif namespace aria2 { diff --git a/src/FtpConnection.cc b/src/FtpConnection.cc index 0893d294..75bc49ec 100644 --- a/src/FtpConnection.cc +++ b/src/FtpConnection.cc @@ -368,7 +368,7 @@ int FtpConnection::receiveResponse() } } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define LONGLONG_PRINTF "%I64d" # define ULONGLONG_PRINTF "%I64u" # define LONGLONG_SCANF "%I64d" diff --git a/src/GZipFile.cc b/src/GZipFile.cc index 80ef10ee..b85665d8 100644 --- a/src/GZipFile.cc +++ b/src/GZipFile.cc @@ -50,7 +50,7 @@ GZipFile::GZipFile(const char* filename, const char* mode) strcmp(DEV_STDIN, filename) == 0 ? stdin : -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) a2fopen(utf8ToWChar(filename).c_str(), utf8ToWChar(mode).c_str()) #else // !__MINGW32__ a2fopen(filename, mode) diff --git a/src/IteratableValidator.h b/src/IteratableValidator.h index dcd52b8d..340c643b 100644 --- a/src/IteratableValidator.h +++ b/src/IteratableValidator.h @@ -37,7 +37,9 @@ #include "common.h" -#include +#ifndef NO_UNIX +# include +#endif namespace aria2 { diff --git a/src/LibuvEventPoll.cc b/src/LibuvEventPoll.cc index 1b0b549d..9a90e97f 100644 --- a/src/LibuvEventPoll.cc +++ b/src/LibuvEventPoll.cc @@ -34,7 +34,7 @@ */ /* copyright --> */ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # ifdef _WIN32_WINNT # undef _WIN32_WINNT # endif // _WIN32_WINNT diff --git a/src/Logger.cc b/src/Logger.cc index 87168e16..825a524c 100644 --- a/src/Logger.cc +++ b/src/Logger.cc @@ -34,7 +34,9 @@ /* copyright --> */ #include "Logger.h" -#include +#ifndef NO_UNIX +# include +#endif #include #include #include diff --git a/src/LpdMessageReceiver.cc b/src/LpdMessageReceiver.cc index a74b33b7..cceb7584 100644 --- a/src/LpdMessageReceiver.cc +++ b/src/LpdMessageReceiver.cc @@ -59,7 +59,7 @@ bool LpdMessageReceiver::init(const std::string& localAddr) { try { socket_ = std::make_shared(SOCK_DGRAM); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // Binding multicast address fails under Windows. socket_->bindWithFamily(multicastPort_, AF_INET); #else // !__MINGW32__ diff --git a/src/MultiUrlRequestInfo.cc b/src/MultiUrlRequestInfo.cc index 833188e3..64027e1a 100644 --- a/src/MultiUrlRequestInfo.cc +++ b/src/MultiUrlRequestInfo.cc @@ -231,7 +231,7 @@ int MultiUrlRequestInfo::prepare() auto authConfigFactory = make_unique(); File netrccf(option_->get(PREF_NETRC_PATH)); if (!option_->getAsBool(PREF_NO_NETRC) && netrccf.isFile()) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // Windows OS does not have permission, so set it to 0. mode_t mode = 0; #else // !__MINGW32__ diff --git a/src/OptionParser.cc b/src/OptionParser.cc index 75d0885f..b4a66e75 100644 --- a/src/OptionParser.cc +++ b/src/OptionParser.cc @@ -34,7 +34,9 @@ /* copyright --> */ #include "OptionParser.h" -#include +#ifndef NO_UNIX +# include +#endif #include #include diff --git a/src/PeerConnection.h b/src/PeerConnection.h index 17e023f0..93198a47 100644 --- a/src/PeerConnection.h +++ b/src/PeerConnection.h @@ -37,7 +37,9 @@ #include "common.h" -#include +#ifndef NO_UNIX +# include +#endif #include #include "SocketBuffer.h" diff --git a/src/Platform.cc b/src/Platform.cc index 9f3ddb25..5ca24ab6 100644 --- a/src/Platform.cc +++ b/src/Platform.cc @@ -182,7 +182,7 @@ bool Platform::setUp() } #endif // HAVE_WINSOCK2_H -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) (void)_setmode(_fileno(stdin), _O_BINARY); (void)_setmode(_fileno(stdout), _O_BINARY); (void)_setmode(_fileno(stderr), _O_BINARY); diff --git a/src/ProgressAwareEntry.h b/src/ProgressAwareEntry.h index c804069f..cf18a38b 100644 --- a/src/ProgressAwareEntry.h +++ b/src/ProgressAwareEntry.h @@ -38,7 +38,9 @@ #include "common.h" #include -#include +#ifndef NO_UNIX +# include +#endif namespace aria2 { diff --git a/src/Range.h b/src/Range.h index e7aef928..f360e783 100644 --- a/src/Range.h +++ b/src/Range.h @@ -37,7 +37,9 @@ #include "common.h" -#include +#ifndef NO_UNIX +# include +#endif namespace aria2 { diff --git a/src/RequestGroup.cc b/src/RequestGroup.cc index fd6801fc..1bd2341f 100644 --- a/src/RequestGroup.cc +++ b/src/RequestGroup.cc @@ -619,7 +619,7 @@ void RequestGroup::initPieceStorage() std::make_shared(downloadContext_, tempPieceStorage); pieceStorage_ = tempPieceStorage; -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // Windows build: --file-allocation=falloc uses SetFileValidData // which requires SE_MANAGE_VOLUME_NAME privilege. SetFileValidData // has security implications (see diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index 425351bb..ea57e7a2 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -34,7 +34,9 @@ /* copyright --> */ #include "RequestGroupMan.h" -#include +#ifndef NO_UNIX +# include +#endif #include #include #include diff --git a/src/SelectEventPoll.cc b/src/SelectEventPoll.cc index d9397b20..7cadd955 100644 --- a/src/SelectEventPoll.cc +++ b/src/SelectEventPoll.cc @@ -34,7 +34,7 @@ /* copyright --> */ #include "SelectEventPoll.h" -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # include #endif // __MINGW32__ #include @@ -153,7 +153,7 @@ void SelectEventPoll::AsyncNameResolverEntry::process(fd_set* rfdsPtr, SelectEventPoll::SelectEventPoll() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) dummySocket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); assert(dummySocket_ != (sock_t)-1); #endif // __MINGW32__ @@ -162,7 +162,7 @@ SelectEventPoll::SelectEventPoll() SelectEventPoll::~SelectEventPoll() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) ::closesocket(dummySocket_); #endif // __MINGW32__ } @@ -175,7 +175,7 @@ void SelectEventPoll::poll(const struct timeval& tv) memcpy(&rfds, &rfdset_, sizeof(fd_set)); memcpy(&wfds, &wfdset_, sizeof(fd_set)); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) fd_set efds; memcpy(&efds, &wfdset_, sizeof(fd_set)); #endif // __MINGW32__ @@ -195,7 +195,7 @@ void SelectEventPoll::poll(const struct timeval& tv) int retval; do { struct timeval ttv = tv; -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // winsock will report non-blocking connect() errors in efds, // unlike posix, which will mark such sockets as writable. retval = select(fdmax_ + 1, &rfds, &wfds, &efds, &ttv); @@ -213,7 +213,7 @@ void SelectEventPoll::poll(const struct timeval& tv) if (FD_ISSET(e.getSocket(), &wfds)) { events |= EventPoll::EVENT_WRITE; } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) if (FD_ISSET(e.getSocket(), &efds)) { events |= EventPoll::EVENT_ERROR; } @@ -235,7 +235,7 @@ void SelectEventPoll::poll(const struct timeval& tv) #endif // ENABLE_ASYNC_DNS } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) namespace { void checkFdCountMingw(const fd_set& fdset) { @@ -251,7 +251,7 @@ void SelectEventPoll::updateFdSet() { FD_ZERO(&rfdset_); FD_ZERO(&wfdset_); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) FD_SET(dummySocket_, &rfdset_); FD_SET(dummySocket_, &wfdset_); fdmax_ = dummySocket_; @@ -262,7 +262,7 @@ void SelectEventPoll::updateFdSet() for (auto& i : socketEntries_) { auto& e = i.second; sock_t fd = e.getSocket(); -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) if (fd < 0 || FD_SETSIZE <= fd) { A2_LOG_WARN("Detected file descriptor >= FD_SETSIZE or < 0. " "Download may slow down or fail."); @@ -271,13 +271,13 @@ void SelectEventPoll::updateFdSet() #endif // !__MINGW32__ int events = e.getEvents(); if (events & EventPoll::EVENT_READ) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) checkFdCountMingw(rfdset_); #endif // __MINGW32__ FD_SET(fd, &rfdset_); } if (events & EventPoll::EVENT_WRITE) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) checkFdCountMingw(wfdset_); #endif // __MINGW32__ FD_SET(fd, &wfdset_); diff --git a/src/SelectEventPoll.h b/src/SelectEventPoll.h index c09f423f..4764719e 100644 --- a/src/SelectEventPoll.h +++ b/src/SelectEventPoll.h @@ -151,7 +151,7 @@ private: fd_set rfdset_; fd_set wfdset_; sock_t fdmax_; -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // Winsock select() doesn't work if no socket is in FD_SET. We add // this dummy socket to work around this problem sock_t dummySocket_; diff --git a/src/SimpleRandomizer.cc b/src/SimpleRandomizer.cc index 8dbef82f..4ebd1d46 100644 --- a/src/SimpleRandomizer.cc +++ b/src/SimpleRandomizer.cc @@ -35,7 +35,11 @@ #include "SimpleRandomizer.h" #include -#include +#ifndef NO_UNIX +# include +#endif +# include +#endif #include #include #include @@ -66,7 +70,7 @@ namespace { std::random_device rd; } // namespace -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) SimpleRandomizer::SimpleRandomizer() { BOOL r = ::CryptAcquireContext(&provider_, 0, 0, PROV_RSA_FULL, @@ -79,7 +83,7 @@ SimpleRandomizer::SimpleRandomizer() : gen_(rd()) {} SimpleRandomizer::~SimpleRandomizer() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) CryptReleaseContext(provider_, 0); #endif } @@ -92,7 +96,7 @@ long int SimpleRandomizer::getRandomNumber(long int to) void SimpleRandomizer::getRandomBytes(unsigned char* buf, size_t len) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) BOOL r = CryptGenRandom(provider_, len, reinterpret_cast(buf)); if (!r) { assert(r); diff --git a/src/SimpleRandomizer.h b/src/SimpleRandomizer.h index aea6fe05..d4882825 100644 --- a/src/SimpleRandomizer.h +++ b/src/SimpleRandomizer.h @@ -40,7 +40,7 @@ #include #include -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # include #endif @@ -52,7 +52,7 @@ private: SimpleRandomizer(); private: -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) HCRYPTPROV provider_; #else std::mt19937 gen_; diff --git a/src/SocketCore.cc b/src/SocketCore.cc index e235f512..8b4d5234 100644 --- a/src/SocketCore.cc +++ b/src/SocketCore.cc @@ -38,7 +38,9 @@ # include #endif // HAVE_IPHLPAPI_H -#include +#ifndef NO_UNIX +# include +#endif #ifdef HAVE_IFADDRS_H # include #endif // HAVE_IFADDRS_H @@ -68,13 +70,13 @@ namespace aria2 { -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define SOCKET_ERRNO (errno) #else # define SOCKET_ERRNO (WSAGetLastError()) #endif // __MINGW32__ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define A2_EINPROGRESS WSAEWOULDBLOCK # define A2_EWOULDBLOCK WSAEWOULDBLOCK # define A2_EINTR WSAEINTR @@ -93,7 +95,7 @@ namespace aria2 { # endif // EWOULDBLOCK != EAGAIN #endif // !__MINGW32__ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define CLOSE(X) ::closesocket(X) #else # define CLOSE(X) close(X) @@ -102,7 +104,7 @@ namespace aria2 { namespace { std::string errorMsg(int errNum) { -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) return util::safeStrerror(errNum); #else auto msg = util::formatLastError(errNum); @@ -595,7 +597,7 @@ void SocketCore::applyIpDscp() void SocketCore::setNonBlockingMode() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) static u_long flag = 1; if (::ioctlsocket(sockfd_, FIONBIO, &flag) == -1) { int errNum = SOCKET_ERRNO; @@ -614,7 +616,7 @@ void SocketCore::setNonBlockingMode() void SocketCore::setBlockingMode() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) static u_long flag = 0; if (::ioctlsocket(sockfd_, FIONBIO, &flag) == -1) { int errNum = SOCKET_ERRNO; @@ -654,7 +656,7 @@ void SocketCore::closeConnection() } } -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define CHECK_FD(fd) \ if (fd < 0 || FD_SETSIZE <= fd) { \ logger_->warn("Detected file descriptor >= FD_SETSIZE or < 0. " \ @@ -681,7 +683,7 @@ bool SocketCore::isWritable(time_t timeout) } throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_WRITABLE, errorMsg(errNum).c_str())); #else // !HAVE_POLL -# ifndef __MINGW32__ +# ifn defined(__MINGW32__) || defined(_MSC_VER) CHECK_FD(sockfd_); # endif // !__MINGW32__ fd_set fds; @@ -726,7 +728,7 @@ bool SocketCore::isReadable(time_t timeout) } throw DL_RETRY_EX(fmt(EX_SOCKET_CHECK_READABLE, errorMsg(errNum).c_str())); #else // !HAVE_POLL -# ifndef __MINGW32__ +# ifn defined(__MINGW32__) || defined(_MSC_VER) CHECK_FD(sockfd_); # endif // !__MINGW32__ fd_set fds; @@ -759,7 +761,7 @@ ssize_t SocketCore::writeVector(a2iovec* iov, size_t iovcnt) wantRead_ = false; wantWrite_ = false; if (!secure_) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) DWORD nsent; int rv = WSASend(sockfd_, iov, iovcnt, &nsent, 0, 0, 0); if (rv == 0) { @@ -1572,7 +1574,7 @@ bool ipv4AddrConfigured = true; bool ipv6AddrConfigured = true; } // namespace -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) namespace { const uint32_t APIPA_IPV4_BEGIN = 2851995649u; // 169.254.0.1 const uint32_t APIPA_IPV4_END = 2852061183u; // 169.254.255.255 diff --git a/src/a2io.h b/src/a2io.h index 27ddc518..a8bbe7c4 100644 --- a/src/a2io.h +++ b/src/a2io.h @@ -37,7 +37,9 @@ #include "common.h" #include #include -#include +#ifndef NO_UNIX +# include +#endif #include #include #ifdef HAVE_POLL_H @@ -120,7 +122,7 @@ # define DEV_STDOUT "/dev/stdout" #endif // HAVE_WINSOCK2_H -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define a2lseek(fd, offset, origin) _lseeki64(fd, offset, origin) # define a2fseek(fd, offset, origin) _fseeki64(fd, offset, origin) # define a2fstat(fd, buf) _fstati64(fd, buf) @@ -190,7 +192,7 @@ extern int ftruncate64(int fd, off64_t length); #define OPEN_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH #define DIR_OPEN_MODE S_IRWXU | S_IRWXG | S_IRWXO -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define A2_BAD_FD INVALID_HANDLE_VALUE #else // !__MINGW32__ # define A2_BAD_FD -1 diff --git a/src/a2netcompat.h b/src/a2netcompat.h index c9b5b7e0..8f0683d2 100644 --- a/src/a2netcompat.h +++ b/src/a2netcompat.h @@ -37,13 +37,13 @@ #include "a2io.h" -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # ifdef HAVE_WS2TCPIP_H # include # endif // HAVE_WS2TCPIP_H #endif // __MINGW32__ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define a2_sockopt_t char* # ifndef HAVE_GETADDRINFO # define HAVE_GETADDRINFO @@ -95,6 +95,7 @@ #ifdef HAVE_WINSOCK2_H # define sock_t SOCKET +# include #else # define sock_t int #endif @@ -105,7 +106,7 @@ #define DEFAULT_AI_FLAGS AI_ADDRCONFIG -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # ifndef SHUT_WR # define SHUT_WR SD_SEND # endif // !SHUT_WR @@ -141,7 +142,7 @@ struct Endpoint { # define A2_IOV_MAX A2_DEFAULT_IOV_MAX #endif -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) typedef WSABUF a2iovec; # define A2IOVEC_BASE buf # define A2IOVEC_LEN len diff --git a/src/a2time.h b/src/a2time.h index 3b407608..c81e9c10 100644 --- a/src/a2time.h +++ b/src/a2time.h @@ -36,7 +36,10 @@ #define D_A2TIME_H #include -#include + +#ifdef HAVE_SYS_TIME_H +# include +#endif #include @@ -60,7 +63,7 @@ # include "asctime_r.h" #endif // HAVE_ASCTIME_R -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define suseconds_t uint64_t #endif diff --git a/src/asctime_r.c b/src/asctime_r.c index 176c3c29..0d6eb25f 100644 --- a/src/asctime_r.c +++ b/src/asctime_r.c @@ -36,14 +36,14 @@ #include #include -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define WIN32_LEAN_AND_MEAN # include #endif // __MINGW32__ #include "asctime_r.h" -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) static CRITICAL_SECTION asctime_r_cs; diff --git a/src/common.h b/src/common.h index d1a99719..de1a7a4d 100644 --- a/src/common.h +++ b/src/common.h @@ -39,7 +39,7 @@ # include "config.h" #endif -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # ifdef malloc # undef malloc # endif @@ -48,7 +48,12 @@ # endif #endif // __MINGW32__ -#ifdef __MINGW32__ +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#endif + +#if defined(__MINGW32__) || defined(_MSC_VER) # define WIN32_LEAN_AND_MEAN # ifndef WINVER # define WINVER 0x501 diff --git a/src/console.cc b/src/console.cc index 6147bbb8..a0ebcf8f 100644 --- a/src/console.cc +++ b/src/console.cc @@ -34,7 +34,7 @@ /* copyright --> */ #include "console.h" #include "NullOutputFile.h" -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # include "WinConsoleFile.h" #else // !__MINGW32__ # include "BufferedFile.h" @@ -56,7 +56,7 @@ void initConsole(bool suppress) consoleCout = consoleCerr = std::make_shared(); } else { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) consoleCout = std::make_shared(STD_OUTPUT_HANDLE); consoleCerr = std::make_shared(STD_ERROR_HANDLE); #else // !__MINGW32__ diff --git a/src/daemon.cc b/src/daemon.cc index 60be5bb3..db4a1df6 100644 --- a/src/daemon.cc +++ b/src/daemon.cc @@ -34,7 +34,9 @@ /* copyright --> */ #include "daemon.h" -#include +#ifndef NO_UNIX +# include +#endif #include #include diff --git a/src/fmt.h b/src/fmt.h index ad2f065d..451d8f14 100644 --- a/src/fmt.h +++ b/src/fmt.h @@ -43,7 +43,7 @@ namespace aria2 { std::string fmt(const char* fmt, ...) -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) __attribute__((format(__MINGW_PRINTF_FORMAT, 1, 2))) #else // !__MINGW32__ __attribute__((format(printf, 1, 2))) diff --git a/src/gai_strerror.h b/src/gai_strerror.h index da7b6ca7..effa6411 100644 --- a/src/gai_strerror.h +++ b/src/gai_strerror.h @@ -33,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # undef SIZE_MAX #endif // __MINGW32__ diff --git a/src/getaddrinfo.c b/src/getaddrinfo.c index bfa3b4a3..59c29e04 100644 --- a/src/getaddrinfo.c +++ b/src/getaddrinfo.c @@ -79,7 +79,7 @@ # include "config.h" #endif -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # include # undef ERROR # include diff --git a/src/getaddrinfo.h b/src/getaddrinfo.h index d841d4be..7faaedc4 100644 --- a/src/getaddrinfo.h +++ b/src/getaddrinfo.h @@ -33,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # undef SIZE_MAX #endif // __MINGW32__ @@ -41,7 +41,7 @@ extern "C" { # include "config.h" #endif // HAVE_CONFIG_H -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(__MSVC__) # ifndef _WIN32_WINNT # define _WIN32_WINNT 0x501 # endif // _WIN32_WINNT @@ -240,7 +240,7 @@ extern "C" { #endif /* Nexenta OS(GNU/Solaris OS) defines `struct addrinfo' in netdb.h */ -#if !defined(__MINGW32__) && !defined(__sun) +#if !defined(__MINGW32__) && !defined(__sun) && !defined(_MSC_VER) /* * struct addrinfo. @@ -256,7 +256,7 @@ struct addrinfo { struct addrinfo* ai_next; }; -#endif // !__MINGW32__ && !__sun +#endif // !__MINGW32__ && !__sun && !defined(_MSC_VER) /* * Functions. diff --git a/src/gettimeofday.c b/src/gettimeofday.c index db292d94..8c7df499 100644 --- a/src/gettimeofday.c +++ b/src/gettimeofday.c @@ -25,7 +25,7 @@ #include -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define WIN32_LEAN_AND_MEAN # include diff --git a/src/gettimeofday.h b/src/gettimeofday.h index c5231e9f..4424b729 100644 --- a/src/gettimeofday.h +++ b/src/gettimeofday.h @@ -36,7 +36,7 @@ #ifndef _D_GETTIMEOFDAY_H #define _D_GETTIMEOFDAY_H 1 -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # undef SIZE_MAX #endif // __MINGW32__ @@ -44,7 +44,9 @@ # include "config.h" #endif // HAVE_CONFIG_H -#include +#ifdef HAVE_SYS_TIME_H +# include +#endif #ifdef __cplusplus extern "C" { diff --git a/src/libgen.h b/src/libgen.h index 79d55144..ee3a2b6d 100644 --- a/src/libgen.h +++ b/src/libgen.h @@ -40,7 +40,7 @@ extern "C" { #endif /* __cplusplus */ -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) char* basename(char* path); char* dirname(char* path); diff --git a/src/localtime_r.c b/src/localtime_r.c index 47294558..9a012dad 100644 --- a/src/localtime_r.c +++ b/src/localtime_r.c @@ -36,14 +36,14 @@ #include #include -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # define WIN32_LEAN_AND_MEAN # include #endif // __MINGW32__ #include "localtime_r.h" -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) static CRITICAL_SECTION localtime_r_cs; diff --git a/src/main.cc b/src/main.cc index f14cea6a..cd82ebc5 100644 --- a/src/main.cc +++ b/src/main.cc @@ -34,9 +34,11 @@ /* copyright --> */ #include "common.h" -#include +#ifndef NO_UNIX +# include +#endif -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # include #endif // __MINGW32__ @@ -53,7 +55,7 @@ namespace aria2 { error_code::Value main(int argc, char** argv) { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) int winArgc; auto winArgv = CommandLineToArgvW(GetCommandLineW(), &winArgc); if (winArgv == nullptr) { diff --git a/src/util.cc b/src/util.cc index 07502c0e..1e172323 100644 --- a/src/util.cc +++ b/src/util.cc @@ -96,7 +96,7 @@ namespace aria2 { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) namespace { int utf8ToWChar(wchar_t* out, size_t outLength, const char* src) { @@ -1742,7 +1742,7 @@ void setGlobalSignalHandler(int sig, sigset_t* mask, signal_handler_t handler, #endif // HAVE_SIGACTION } -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) std::string getHomeDir() { const char* p = getenv("HOME"); @@ -1789,7 +1789,7 @@ std::string getXDGDir(const std::string& environmentVariable, std::string filename; const char* p = getenv(environmentVariable.c_str()); if (p && -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) p[0] == '/' #else // __MINGW32__ p[0] && p[1] == ':' @@ -2112,7 +2112,7 @@ std::string applyDir(const std::string& dir, const std::string& relPath) s += relPath; } } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) for (std::string::iterator i = s.begin(), eoi = s.end(); i != eoi; ++i) { if (*i == '\\') { *i = '/'; @@ -2179,7 +2179,7 @@ bool detectDirTraversal(const std::string& s) std::string escapePath(const std::string& s) { // We don't escape '/' because we use it as a path separator. -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) static const char WIN_INVALID_PATH_CHARS[] = {'"', '*', ':', '<', '>', '?', '\\', '|'}; #endif // __MINGW32__ @@ -2187,7 +2187,7 @@ std::string escapePath(const std::string& s) for (auto cc : s) { unsigned char c = cc; if (in(c, 0x00u, 0x1fu) || c == 0x7fu -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) || std::find(std::begin(WIN_INVALID_PATH_CHARS), std::end(WIN_INVALID_PATH_CHARS), c) != std::end(WIN_INVALID_PATH_CHARS) @@ -2234,7 +2234,7 @@ void executeHook(const std::string& command, a2_gid_t gid, size_t numFiles, { const std::string gidStr = GroupId::toHex(gid); const std::string numFilesStr = util::uitos(numFiles); -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) A2_LOG_INFO(fmt("Executing user command: %s %s %s %s", command.c_str(), gidStr.c_str(), numFilesStr.c_str(), firstFilename.c_str())); pid_t cpid = fork(); @@ -2483,7 +2483,7 @@ TLSVersion toTLSVersion(const std::string& ver) } #endif // ENABLE_SSL -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) std::string formatLastError(int errNum) { std::array buf; @@ -2502,7 +2502,7 @@ std::string formatLastError(int errNum) void make_fd_cloexec(int fd) { -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) int flags; // TODO from linux man page, fcntl() with F_GETFD or F_SETFD does @@ -2519,7 +2519,7 @@ void make_fd_cloexec(int fd) #endif // !__MINGW32__ } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) bool gainPrivilege(LPCTSTR privName) { LUID luid; diff --git a/src/util.h b/src/util.h index bb7d8d3e..cdb6a950 100644 --- a/src/util.h +++ b/src/util.h @@ -37,7 +37,9 @@ #include "common.h" -#include +#ifdef HAVE_SYS_TIME_H +# include +#endif #include #include @@ -95,7 +97,7 @@ inline uint64_t ntoh64(uint64_t x) { return byteswap64(x); } inline uint64_t hton64(uint64_t x) { return byteswap64(x); } #endif // !WORDS_BIGENDIAN -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) std::wstring utf8ToWChar(const std::string& src); std::wstring utf8ToWChar(const char* str); @@ -109,6 +111,12 @@ std::string toForwardSlash(const std::string& src); # define utf8ToNative(src) src #endif // !__MINGW32__ +#if defined(_MSC_VER) +#include +typedef SSIZE_T ssize_t; +#endif + + namespace util { extern const char DEFAULT_STRIP_CHARSET[]; @@ -863,7 +871,7 @@ bool tlsHostnameMatch(const std::string& pattern, const std::string& hostname); TLSVersion toTLSVersion(const std::string& ver); #endif // ENABLE_SSL -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) // Formats error message for error code errNum, which is the return // value of GetLastError(). On error, this function returns empty // string. @@ -875,7 +883,7 @@ std::string formatLastError(int errNum); // CreateProcess call. void make_fd_cloexec(int fd); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) bool gainPrivilege(LPCTSTR privName); #endif // __MINGW32__ diff --git a/test/FileTest.cc b/test/FileTest.cc index ca78217e..e4c2f01a 100644 --- a/test/FileTest.cc +++ b/test/FileTest.cc @@ -97,7 +97,7 @@ void FileTest::testRemove() CPPUNIT_ASSERT(!f.remove()); std::string dir = A2_TEST_OUT_DIR "/aria2_FileTest_testRemove_testdir"; -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) mkdir(dir.c_str()); #else mkdir(dir.c_str(), 0777); @@ -183,7 +183,7 @@ void FileTest::testGetDirname() File f(""); CPPUNIT_ASSERT_EQUAL(std::string(""), f.getDirname()); } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) { File f("c:\\foo\\bar"); CPPUNIT_ASSERT_EQUAL(std::string("c:\\foo"), f.getDirname()); @@ -221,7 +221,7 @@ void FileTest::testGetBasename() File f(""); CPPUNIT_ASSERT_EQUAL(std::string(""), f.getBasename()); } -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) { File f("c:\\foo\\bar"); CPPUNIT_ASSERT_EQUAL(std::string("bar"), f.getBasename()); diff --git a/test/LpdMessageDispatcherTest.cc b/test/LpdMessageDispatcherTest.cc index e819d5f8..28467dfb 100644 --- a/test/LpdMessageDispatcherTest.cc +++ b/test/LpdMessageDispatcherTest.cc @@ -44,7 +44,7 @@ void LpdMessageDispatcherTest::testCreateLpdRequest() void LpdMessageDispatcherTest::testSendMessage() { std::shared_ptr recvsock(new SocketCore(SOCK_DGRAM)); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) recvsock->bindWithFamily(LPD_MULTICAST_PORT, AF_INET); #else // !__MINGW32__ recvsock->bind(LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT, AF_INET); diff --git a/test/Metalink2RequestGroupTest.cc b/test/Metalink2RequestGroupTest.cc index 47e1e213..4dd34075 100644 --- a/test/Metalink2RequestGroupTest.cc +++ b/test/Metalink2RequestGroupTest.cc @@ -208,7 +208,7 @@ void Metalink2RequestGroupTest::testGenerate_groupByMetaurl() void Metalink2RequestGroupTest::testGenerate_dosDirTraversal() { -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) # ifdef ENABLE_BITTORRENT std::vector> groups; option_->put(PREF_DIR, "/tmp"); diff --git a/test/TimeTest.cc b/test/TimeTest.cc index c1e2f564..0132175e 100644 --- a/test/TimeTest.cc +++ b/test/TimeTest.cc @@ -96,7 +96,7 @@ void TimeTest::testToHTTPDate() { // This test disabled for MinGW32, because the garbage will be // displayed and it hides real errors. -#ifndef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) Time t(1220714793); CPPUNIT_ASSERT_EQUAL(std::string("Sat, 06 Sep 2008 15:26:33 GMT"), t.toHTTPDate()); diff --git a/test/UtilTest2.cc b/test/UtilTest2.cc index b919b71c..d6635e0a 100644 --- a/test/UtilTest2.cc +++ b/test/UtilTest2.cc @@ -789,7 +789,7 @@ void UtilTest2::testApplyDir() void UtilTest2::testFixTaintedBasename() { CPPUNIT_ASSERT_EQUAL(std::string("a%2Fb"), util::fixTaintedBasename("a/b")); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) CPPUNIT_ASSERT_EQUAL(std::string("a%5Cb"), util::fixTaintedBasename("a\\b")); #else // !__MINGW32__ CPPUNIT_ASSERT_EQUAL(std::string("a\\b"), util::fixTaintedBasename("a\\b")); @@ -827,7 +827,7 @@ void UtilTest2::testEscapePath() util::escapePath(std::string("foo") + (char)0x00 + std::string("bar") + (char)0x00 + (char)0x01)); -#ifdef __MINGW32__ +#if defined(__MINGW32__) || defined(_MSC_VER) CPPUNIT_ASSERT_EQUAL(std::string("foo%5Cbar"), util::escapePath("foo\\bar")); #else // !__MINGW32__ CPPUNIT_ASSERT_EQUAL(std::string("foo\\bar"), util::escapePath("foo\\bar"));