Commit Graph

87 Commits (acd2af82d07e346ba782f4ec7bb8711c49056c3f)

Author SHA1 Message Date
Nils Maier d8f44ef4f6 Convert most 0/NULL pointers to nullptr
Courtesy of llvm cpp11-migrate 3.3
2013-08-20 21:28:24 +02:00
Tatsuhiro Tsujikawa 5bc5665c6a Support off64_t for Android build
Android NDK R8e does not provide ftruncate64, but bionic has the
assembler code to access kernel function. We borrowed those
ftruncate64.S files from android source code repository.  It turns out
that x86 asm.h in NDK R8e is also broken, so latest asm.h was also
borrowed.
2013-05-06 19:12:17 +09:00
Tatsuhiro Tsujikawa e0ea88ebcf mingw32: Make NTFS sparse file on --file-allocation=trunc 2013-01-11 18:35:54 +09:00
Tatsuhiro Tsujikawa de1ca6d6b8 mingw32: Use HANDLE only for MinGW32 build 2012-12-15 18:28:46 +09:00
Tatsuhiro Tsujikawa bec0f6dc11 Removed warning when --file-allocation=falloc is used in MinGW32 build
The warning was just a mistake. SetFilePointerEx + SetEndOfFile
actually allocate disk space.
2012-12-06 22:48:46 +09:00
Tatsuhiro Tsujikawa 911851debb mingw32: Removed FSCTL_SET_SPARSE set 2012-12-03 23:07:05 +09:00
Tatsuhiro Tsujikawa 7e59e2dbb5 mingw32: Open file using _wsopen and added --enable-mmap support
I tried CreateFile but the subsequent ReadFile fails with Access
Denied if sparse file is read on NTFS. I mostly reverted previous
changes and use _wsopen with read/write share enabled instead of
CreateFile.

This change also includes --enable-mmap support for MinGW32
build. Memory mapped file may be useful for 64-bits OS and lots of
RAM. Currently, FlushViewOfFile is not called during the download, so
it is slightly vulnerable against sudden power loss. I found lots of
read when resuming download due to page fault. So for now it is useful
for the initial download. I recommend not to use
--file-allocation=prealloc with --enable-mmap for MinGW32, because it
triggers page faults even in the initial download. Anyway, the option
is experimental.
2012-12-01 19:38:30 +09:00
Tatsuhiro Tsujikawa b95f15b462 Use Win32 API for file I/O in AbstractDiskWriter
Now file has been opened by aria2 is now readable by other processes.
2012-11-30 01:20:49 +09:00
Tatsuhiro Tsujikawa 74520b03f8 Set F_GLOBAL_NOCACHE for Mac OS X 2012-11-28 21:47:55 +09:00
Tatsuhiro Tsujikawa 506a9358e1 Refactored file open code 2012-11-28 21:46:44 +09:00
Tatsuhiro Tsujikawa 8b0c701266 Removed trailing spaces 2012-10-01 23:52:22 +09:00
Tatsuhiro Tsujikawa 860f4dd06a Use int64_t instead of off_t
Using off_t, at least, in DiskAdaptor layer is problematic because
torrent can contain under 2GiB files but total sum of those files may
exceed 2GiB limit, which makes off_t overflow in 32 bit system without
large file support. So we use int64_t in API. We'll check the file
length before download so that it does not exceed max off_t.
2012-07-23 21:42:47 +09:00
Tatsuhiro Tsujikawa 4b03634f36 Use PRId64 for int64_t format specifier 2012-06-25 22:43:33 +09:00
Tatsuhiro Tsujikawa 96720b297d Added --enable-mmap option.
If this option is used, map files into memory using mmap(2).  This
option is experimental.
2012-06-24 16:28:04 +09:00
Tatsuhiro Tsujikawa 52155b1860 No retry for close() with EINTR. Also reverted changes in d5ffa253. 2011-12-25 23:38:36 +09:00
Tatsuhiro Tsujikawa ebc082747c Log filename in the exception when AbstractDiskWriter::closeFile() failed. 2011-12-10 18:03:30 +09:00
Tatsuhiro Tsujikawa d5ffa2532d AbstractDiskWriter::closeFile(): Throw exception if close() failed.
~AbstractDiskWriter calles closeFile(), but suppresses exception.
MultiDiskAdaptor::closeFile() logs error if child
DiskWriter::closeFile() throws exception. This exception is not
rethrown. If at least one exception is caught,
MultiDiskAdaptor::closeFile() throws new DlAbortEx.
RequestGroupMan::closeFile() just logs exception and suppress each
exception. Generally, don't call closeFile() in destructor. If you
need to call it, it must suppress the exception.
2011-12-09 23:32:38 +09:00
Tatsuhiro Tsujikawa 12988e5282 Replaced uint64_t with off_t or int64_t.
Since off_t is int64_t with LFS, we cannot take advantage of extra
capacity of uint64_t.
2011-12-09 21:39:43 +09:00
Tatsuhiro Tsujikawa 97f34ab668 Added global::cerr. windows.h now included from common.h
We replaced most of std::cerr with global::cerr.  windows.h is now
included from common.h. Before including it, we define WINVER.  We
renamed some variable name because some macros in windows.h collide
with them.
2011-08-10 00:38:48 +09:00
Tatsuhiro Tsujikawa 02307cee0a Removed utf8ToNative from log message and exception message. 2011-08-08 21:46:10 +09:00
Tatsuhiro Tsujikawa 3879da592d In MinGW32, open file with UNICODE filename and print them in ANSI. 2011-08-04 21:43:02 +09:00
Tatsuhiro Tsujikawa 5bbfa742fc Removed use of O_DIRECT because it performs bad. 2011-07-16 13:57:31 +09:00
Tatsuhiro Tsujikawa e958f5dab3 Implemented fast file allocation in MinGW32 build.
We use SetFilePointerEx and SetEndOfFile to allocate extents.  This
only works with NTFS. To enable this feature, --file-allocation=falloc
must be given.
2011-06-07 01:09:38 +09:00
Tatsuhiro Tsujikawa e818f9c8a5 Use %lx for DWORD.
GetLastError() returns DWORD, not C-String.
2010-12-19 00:24:36 +09:00
Tatsuhiro Tsujikawa 829803d4f5 Fixed compile error which occurs when system has posix_fallocate() but
does not have fallocate().
2010-12-05 23:47:35 +09:00
Tatsuhiro Tsujikawa f0f4f8f703 Added more error code values.
I have not set error code for all exception invocation.
In this change, I set error code where error likely occurs.
2010-12-01 21:26:58 +09:00
Tatsuhiro Tsujikawa 50122f0ab3 Renamed Exception::errno_ as Exception::errNum_. 2010-11-28 19:06:56 +09:00
Tatsuhiro Tsujikawa ecbc05012c Added additional error_code::Values(9 through 14). 2010-11-28 17:29:32 +09:00
Tatsuhiro Tsujikawa 694fb307aa 2010-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Replaced StringFormat with fmt
2010-11-20 09:36:14 +00:00
Tatsuhiro Tsujikawa 580098eb49 2010-11-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten Logger interface. Logger now writes source file name and
	line number in log file.
2010-11-20 08:21:36 +00:00
Tatsuhiro Tsujikawa f1af13567f 2010-11-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Retry open(2) and fallocate(2) when they are interrupted by
	signal.
	* src/AbstractDiskWriter.cc
2010-11-09 15:18:25 +00:00
Tatsuhiro Tsujikawa 228b4c50d7 2010-11-09 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Capture errno right after system/library call to avoid it to get
	overwritten. Use util::safeStrerror instead of strerror directly
	because strerror might return NULL. We don't check errno for
	std::fstream anymore.
	* src/AbstractDiskWriter.cc
	* src/CookieStorage.cc
	* src/DHTAutoSaveCommand.cc
	* src/DHTRoutingTableDeserializer.cc
	* src/DHTRoutingTableSerializer.cc
	* src/DefaultBtProgressInfoFile.cc
	* src/EpollEventPoll.cc
	* src/IteratableChunkChecksumValidator.cc
	* src/KqueueEventPoll.cc
	* src/Logger.cc
	* src/MessageDigestHelper.cc
	* src/PortEventPoll.cc
	* src/SelectEventPoll.cc
	* src/SocketCore.cc
	* src/message.h
	* src/util.cc
	* src/util.h
2010-11-09 14:43:47 +00:00
Tatsuhiro Tsujikawa 942f4c00a9 2010-10-12 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten AbstractDiskWriter::openFile() without File::exists().
	* src/AbstractCommand.cc
2010-10-11 15:15:13 +00:00
Tatsuhiro Tsujikawa a5cc350dcf 2010-07-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
When allocating disk space, for Linux system with fallocate()
	system call, first check file system supports fallocate.  This
	just run fallocate with small chunk and see it succeeds or fails.
	If it succeeds, use fallocate() to allocate entire file otherwise
	fall back to traditional slower method: writing zeros. This
	behavior is enabled in --file-allocation=prealloc, so this is
	enabled by default for most modern Linux.
	* configure.ac
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/AbstractSingleDiskAdaptor.cc
	* src/AdaptiveFileAllocationIterator.cc
	* src/AdaptiveFileAllocationIterator.h
	* src/DefaultPieceStorage.cc
	* src/DiskAdaptor.cc
	* src/DiskAdaptor.h
	* src/FallocFileAllocationIterator.cc
	* src/Makefile.am
	* src/MultiFileAllocationIterator.cc
	* src/OptionHandlerFactory.cc
	* test/FallocFileAllocationIteratorTest.cc
	* test/Makefile.am
2010-07-04 15:03:35 +00:00
Tatsuhiro Tsujikawa ca4940622c 2010-06-21 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Changed naming standards for class member variable: now it looks
	like var_ instead of _var.
2010-06-21 13:51:56 +00:00
Tatsuhiro Tsujikawa 56ea539975 2010-06-11 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Made protected member variable private. Added accessor funcs.
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
2010-06-11 12:08:11 +00:00
Tatsuhiro Tsujikawa b39ede01a7 2010-01-24 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed compile error with i586-mingw32msvc-g++.  Always Cut console
	readout by 80 characters in mingw32 build.  Catch exception in
	DHTMessageReceiver::receiveMessage().
	* src/AbstractDiskWriter.cc
	* src/ConsoleStatCalc.cc
	* src/DHTMessageReceiver.cc
	* src/File.cc
	* src/RequestGroupMan.cc
	* src/a2io.h
	* test/FileTest.cc
2010-01-24 13:49:07 +00:00
Tatsuhiro Tsujikawa 4db349c1f3 2010-01-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Untabify. Fixed one line in copyright which is longer than 80
	columns.
	* src
	* test
2010-01-05 16:01:46 +00:00
Tatsuhiro Tsujikawa e976b23728 2009-10-23 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Renamed Util.{cc,h} as util.{cc,h}
	* src/Util.cc
	* src/Util.h
	* src/util.cc
	* src/util.h
2009-10-22 15:35:33 +00:00
Tatsuhiro Tsujikawa c6035b2e24 2009-10-22 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Moved static functions in Util class to namespace util.
	* src
	* test
2009-10-22 15:09:00 +00:00
Tatsuhiro Tsujikawa 20e215047c 2009-05-18 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added source filename(__FILE__) and line number(__LINE__) to
	exception message.	
	* src/AbstractCommand.cc
	* src/AbstractDiskWriter.cc
	* src/AbstractProxyResponseCommand.cc
	* src/BDE.h
	* src/BtAllowedFastMessage.cc
	* src/BtHandshakeMessageValidator.h
	* src/BtHaveAllMessage.cc
	* src/BtHaveNoneMessage.cc
	* src/BtPieceMessage.cc
	* src/BtRejectMessage.cc
	* src/ChunkedDecoder.cc
	* src/CookieStorage.cc
	* src/DHTAnnouncePeerMessage.cc
	* src/DHTEntryPointNameResolveCommand.cc
	* src/DHTMessageFactoryImpl.cc
	* src/DHTMessageTracker.cc
	* src/DHTRoutingTableDeserializer.cc
	* src/DHTRoutingTableSerializer.cc
	* src/DHTSetup.cc
	* src/DHTTokenTracker.cc
	* src/DefaultBtAnnounce.cc
	* src/DefaultBtContext.cc
	* src/DefaultBtInteractive.cc
	* src/DefaultBtMessageFactory.cc
	* src/DefaultBtProgressInfoFile.cc
	* src/DefaultExtensionMessageFactory.cc
	* src/DlAbortEx.h
	* src/DlRetryEx.h
	* src/DownloadCommand.cc
	* src/DownloadEngineFactory.cc
	* src/DownloadFailureException.h
	* src/Exception.cc
	* src/Exception.h
	* src/ExpatMetalinkProcessor.cc
	* src/ExpatXmlRpcRequestProcessor.cc
	* src/FallocFileAllocationIterator.cc
	* src/FatalException.h
	* src/FtpConnection.cc
	* src/FtpFinishDownloadCommand.cc
	* src/FtpInitiateConnectionCommand.cc
	* src/FtpNegotiationCommand.cc
	* src/GZipDecoder.cc
	* src/HandshakeExtensionMessage.cc
	* src/HttpConnection.cc
	* src/HttpHeaderProcessor.cc
	* src/HttpInitiateConnectionCommand.cc
	* src/HttpResponse.cc
	* src/HttpResponseCommand.cc
	* src/HttpServer.cc
	* src/HttpSkipResponseCommand.cc
	* src/InitiateConnectionCommandFactory.cc
	* src/IteratableChunkChecksumValidator.cc
	* src/LibgcryptARC4Context.h
	* src/LibgcryptARC4Decryptor.h
	* src/LibgcryptARC4Encryptor.h
	* src/LibgcryptDHKeyExchange.h
	* src/LibgnutlsTLSContext.cc
	* src/LibsslARC4Context.h
	* src/LibsslARC4Decryptor.h
	* src/LibsslARC4Encryptor.h
	* src/LibsslDHKeyExchange.h
	* src/LibsslTLSContext.cc
	* src/MSEHandshake.cc
	* src/MessageDigestHelper.cc
	* src/MetalinkHelper.cc
	* src/MultiDiskAdaptor.cc
	* src/NameMatchOptionHandler.h
	* src/NameResolver.cc
	* src/Netrc.cc
	* src/NsCookieParser.cc
	* src/OptionHandlerException.cc
	* src/OptionHandlerException.h
	* src/OptionHandlerImpl.h
	* src/OptionParser.cc
	* src/ParameterizedStringParser.cc
	* src/PeerAbstractCommand.cc
	* src/PeerConnection.cc
	* src/PeerMessageUtil.cc
	* src/PeerReceiveHandshakeCommand.cc
	* src/Platform.cc
	* src/ReceiverMSEHandshakeCommand.cc
	* src/RecoverableException.h
	* src/RequestGroup.cc
	* src/SimpleLogger.cc
	* src/SocketCore.cc
	* src/Sqlite3MozCookieParser.cc
	* src/UTPexExtensionMessage.cc
	* src/Util.cc
	* src/XML2SAXMetalinkProcessor.cc
	* src/Xml2XmlRpcRequestProcessor.cc
	* src/XmlRpcMethodImpl.cc
	* src/bencode.cc
	* src/download_helper.cc
	* src/messageDigest.h
	* test/ExceptionTest.cc
	* test/TestUtil.cc
2009-05-18 15:07:15 +00:00
Tatsuhiro Tsujikawa e1f32b6b66 2009-05-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Removed directIOAllowed() from BinaryStream, DiskWriter,
	DiskAdaptor.  setDirectIOAllowed() was renamed as
	allowDirectIO().
	Removed _directIOAllowed member from DiskWriter.
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/AbstractSingleDiskAdaptor.cc
	* src/AbstractSingleDiskAdaptor.h
	* src/BinaryStream.h
	* src/ByteArrayDiskWriter.h
	* src/DefaultPieceStorage.cc
	* src/DiskWriter.h
	* src/MultiDiskAdaptor.cc
	* src/MultiDiskAdaptor.h
2009-05-04 08:11:40 +00:00
Tatsuhiro Tsujikawa c1aef8e2d1 2009-05-04 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Now the constructor of AbstractDiskWriter takes filename as an
	argument and filename argument is removed from openFile(),
	initAndOpenFile(), openExistingFile() interface.  storeDir
	member and its accessor functions are removed from DiskAdaptor
	because it is not used anymore.  size() member function of
	DefaultDiskWriter, DirectDiskAdaptor and MultiDiskAdaptor now
	can be called without opening file.
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/AbstractSingleDiskAdaptor.cc
	* src/AbstractSingleDiskAdaptor.h
	* src/ByteArrayDiskWriter.cc
	* src/ByteArrayDiskWriter.h
	* src/ByteArrayDiskWriterFactory.cc
	* src/ByteArrayDiskWriterFactory.h
	* src/DefaultDiskWriter.cc
	* src/DefaultDiskWriter.h
	* src/DefaultDiskWriterFactory.cc
	* src/DefaultDiskWriterFactory.h
	* src/DefaultPieceStorage.cc
	* src/DirectDiskAdaptor.cc
	* src/DirectDiskAdaptor.h
	* src/DiskAdaptor.h
	* src/DiskWriter.h
	* src/DiskWriterFactory.h
	* src/MessageDigestHelper.cc
	* src/MultiDiskAdaptor.cc
	* src/RequestGroup.cc
	* src/UnknownLengthPieceStorage.cc
	* src/Util.cc
	* test/DefaultDiskWriterTest.cc
	* test/DirectDiskAdaptorTest.cc
	* test/FallocFileAllocationIteratorTest.cc
	* test/MessageDigestHelperTest.cc
	* test/MetalinkProcessorTest.cc
	* test/MultiDiskAdaptorTest.cc
	* test/MultiFileAllocationIteratorTest.cc
	* test/SingleFileAllocationIteratorTest.cc
	* test/UtilTest.cc
2009-05-04 07:50:38 +00:00
Tatsuhiro Tsujikawa 29c5ef9215 2009-03-25 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added 'falloc' parameter for --file-allocation option.  'falloc'
	allocation mode uses posix_fallocate() system call to allocate
	file on disk.  If you are using newer file systems such as ext4
        (with extents support), btrfs or xfs, 'falloc' is your best
	choice. It allocates large(few GiB) files almost instantly.
	Don't use 'falloc' with legacy file systems such as ext3 because
	it takes almost same time as 'prealloc' and it blocks aria2
	entirely until allocation finishes. 'falloc' may not be
	available if your system doesn't have posix_fallocate() system
	call.
	* configure.ac
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/AbstractSingleDiskAdaptor.cc
	* src/BinaryStream.h
	* src/BtCheckIntegrityEntry.cc
	* src/ByteArrayDiskWriter.h
	* src/CheckIntegrityEntry.cc
	* src/CheckIntegrityEntry.h
	* src/DefaultPieceStorage.cc
	* src/DiskAdaptor.cc
	* src/DiskAdaptor.h
	* src/DiskWriter.h
	* src/FallocFileAllocationIterator.cc
	* src/FallocFileAllocationIterator.h
	* src/FileAllocationEntry.cc
	* src/FileAllocationEntry.h
	* src/Makefile.am
	* src/MultiFileAllocationIterator.cc
	* src/MultiFileAllocationIterator.h
	* src/OptionHandlerFactory.cc
	* src/RequestGroup.cc
	* src/StreamCheckIntegrityEntry.cc
	* src/prefs.cc
	* src/prefs.h
	* src/usage_text.h
	* test/FallocFileAllocationIteratorTest.cc
	* test/Makefile.am
2009-03-25 05:43:07 +00:00
Tatsuhiro Tsujikawa 2dfee3dc49 2009-02-23 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
In BitTorrent, Open files in read-only mode for hash check.
	After that, re-open file in read/write mode only when the
	download is not finished.	
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/AbstractSingleDiskAdaptor.cc
	* src/AbstractSingleDiskAdaptor.h
	* src/BtCheckIntegrityEntry.cc
	* src/DiskAdaptor.h
	* src/DiskWriter.h
	* src/MultiDiskAdaptor.cc
	* src/MultiDiskAdaptor.h
	* src/RequestGroup.cc
2009-02-23 13:27:08 +00:00
Tatsuhiro Tsujikawa b0029fa4bf 2008-11-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Rewritten ByteArrayDiskWriter::size() using seekg() and tellg().
	Removed const qualifier from DiskWriter::size().
	* src/AbstractDiskWriter.cc
	* src/AbstractDiskWriter.h
	* src/ByteArrayDiskWriter.cc
	* src/ByteArrayDiskWriter.h
	* src/DiskWriter.h
	* test/ByteArrayDiskWriterTest.cc
2008-11-17 12:07:24 +00:00
Tatsuhiro Tsujikawa 859193c50b 2008-10-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Use seek() and SetEndOfFile() for mingw32 build instead of 
ftruncate(),
	because mingw32's ftruncate() cannot handle more than 2GB-size 
file.
	* src/AbstractDiskWriter.cc
2008-10-01 14:48:53 +00:00
Tatsuhiro Tsujikawa 8503419ae3 2008-08-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Fixed error handling of lseek.
	* src/AbstractDiskWriter.cc
2008-08-23 14:59:04 +00:00
Tatsuhiro Tsujikawa f34a032d2e 2008-07-13 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Use File::exists() instead of File::isFile() to allow 
non-regular file
	such as block spacial device.
	* src/AbstractDiskWriter.cc
	* src/MultiDiskWriter.cc
2008-07-13 10:38:30 +00:00
Tatsuhiro Tsujikawa cfa808126b 2008-07-06 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Introduced a2_struct_stat. It is defined as `struct _stati64' if
	__MINGW32__ is defined, because under MinGW32, _stati64 is used 
and its
	second argument is of type `struct _stati64'. Otherwise it is 
defined as
	`struct stat'.
	* src/AbstractDiskWriter.cc
	* src/File.cc
	* src/File.h
	* src/a2io.h
2008-07-06 04:38:54 +00:00