2007-07-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

Merged Ross's win32 patch(manually)
	In the course of merging, following files are added.
	* src/strptime.{h,c}
	* src/libgen.{h,c}
	* src/inet_aton.{h,c}
	* src/Platform.{h,cc}
	* src/localtime_r.{h,c}
	* src/getaddrinfo.{h,c}
	I've gethered network related things, and put them to following 
file:
	* src/a2netcompat.h
	Also io related things are put to following file:
	* src/a2io.h
	
	Changed %lld to %s because mingw32 doesn't recognize %lld.
	* src/message.h
	(MSG_ALLOCATION_COMPLETED)
	(EX_TOO_LARGE_FILE)
	(EX_SIZE_MISMATCH)
	(EX_FILE_OFFSET_OUT_OF_RANGE)
	(EX_INVALID_CHUNK_CHECKSUM)
	(EX_INVALID_RANGE_HEADER)
	* src/FileAllocationCommand.cc
	* src/HttpResponse.cc
	* src/RequestGroup.cc
	* src/MultiDiskAdaptor.cc
	* src/OptionHandlerImpl.h
	* src/HttpResponseCommand.cc
	* src/FtpNegotiateCommand.cc
	* src/IteratableChecksumValidator.cc
	* src/SegmentMan.cc
	* src/ChunkChecksumValidator.cc
	
	Added Randomizer::getRandomNumber(long int)
	* src/Randomizer.h (getRandomNumber)
	* src/SimpleRandomizer.h (getRandomNumber)
	* src/BitfieldMan.cc (getMissingIndexRandomly): Use this new 
function.
	* src/Util.cc (randomAlpha): Use this new function.
pull/1/head
Tatsuhiro Tsujikawa 2007-07-23 13:04:48 +00:00
parent 6574e44f88
commit 380e3f0187
62 changed files with 3457 additions and 243 deletions

View File

@ -1,3 +1,43 @@
2007-07-23 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Merged Ross's win32 patch(manually)
In the course of merging, following files are added.
* src/strptime.{h,c}
* src/libgen.{h,c}
* src/inet_aton.{h,c}
* src/Platform.{h,cc}
* src/localtime_r.{h,c}
* src/getaddrinfo.{h,c}
I've gethered network related things, and put them to following file:
* src/a2netcompat.h
Also io related things are put to following file:
* src/a2io.h
Changed %lld to %s because mingw32 doesn't recognize %lld.
* src/message.h
(MSG_ALLOCATION_COMPLETED)
(EX_TOO_LARGE_FILE)
(EX_SIZE_MISMATCH)
(EX_FILE_OFFSET_OUT_OF_RANGE)
(EX_INVALID_CHUNK_CHECKSUM)
(EX_INVALID_RANGE_HEADER)
* src/FileAllocationCommand.cc
* src/HttpResponse.cc
* src/RequestGroup.cc
* src/MultiDiskAdaptor.cc
* src/OptionHandlerImpl.h
* src/HttpResponseCommand.cc
* src/FtpNegotiateCommand.cc
* src/IteratableChecksumValidator.cc
* src/SegmentMan.cc
* src/ChunkChecksumValidator.cc
Added Randomizer::getRandomNumber(long int)
* src/Randomizer.h (getRandomNumber)
* src/SimpleRandomizer.h (getRandomNumber)
* src/BitfieldMan.cc (getMissingIndexRandomly): Use this new function.
* src/Util.cc (randomAlpha): Use this new function.
2007-07-21 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Converted int's to in32_t. long long int's are also converted to

View File

@ -35,6 +35,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/config.h.in \
$(top_srcdir)/configure $(top_srcdir)/intl/Makefile.in \
@ -127,6 +128,16 @@ GENCAT = @GENCAT@
GLIBC21 = @GLIBC21@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_BASENAME_FALSE = @HAVE_BASENAME_FALSE@
HAVE_BASENAME_TRUE = @HAVE_BASENAME_TRUE@
HAVE_GETADDRINFO_FALSE = @HAVE_GETADDRINFO_FALSE@
HAVE_GETADDRINFO_TRUE = @HAVE_GETADDRINFO_TRUE@
HAVE_INET_ATON_FALSE = @HAVE_INET_ATON_FALSE@
HAVE_INET_ATON_TRUE = @HAVE_INET_ATON_TRUE@
HAVE_LOCALTIME_R_FALSE = @HAVE_LOCALTIME_R_FALSE@
HAVE_LOCALTIME_R_TRUE = @HAVE_LOCALTIME_R_TRUE@
HAVE_STRPTIME_FALSE = @HAVE_STRPTIME_FALSE@
HAVE_STRPTIME_TRUE = @HAVE_STRPTIME_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@ -176,6 +187,7 @@ STRIP = @STRIP@
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WINSOCK_LIBS = @WINSOCK_LIBS@
XGETTEXT = @XGETTEXT@
XML2_CONFIG = @XML2_CONFIG@
XML_CPPFLAGS = @XML_CPPFLAGS@
@ -227,7 +239,11 @@ psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
SUBDIRS = intl m4 po src test doc
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = config.rpath

18
TODO
View File

@ -28,8 +28,22 @@
* Fix log and stdout message in Metalink related class.
* Fix Cookie header's value. ';' is not necessary at the end of it.
* It is possible to replace all %lld to %s, using Util::llitos(...) ?.
* Time::getTimeInMillis() returns int64_t.
* Util::secfmt, What happens if sec is less than 0?
* Rewrite ChunkedEncoding
* typedef int32_t CUID in common.h or a2types.h
* typedef int32_t CUID in common.h or a2types.h
* tempdir in HttpResponseCommand is not patched yet.
* Is localtime.cc not needed?
* io related headers and compatible macros and definition -> a2io.h
* net related headers and compatible macros and definition -> a2netcompat.h
* used globally -> common.h
* Following files have copyright issue
libgen.c
libgen.h
inet_aton.c
inet_aton.h
localtime_r.{h,c}
strptime.h

View File

@ -40,6 +40,12 @@
/* Define to 1 if you have the <arpa/inet.h> header file. */
#undef HAVE_ARPA_INET_H
/* Define to 1 if you have the `basename' function. */
#undef HAVE_BASENAME
/* Define to 1 if you have the `daemon' function. */
#undef HAVE_DAEMON
/* Define if the GNU dcgettext() function is already present or preinstalled.
*/
#undef HAVE_DCGETTEXT
@ -59,6 +65,9 @@
/* Define to 1 if you have the `ftruncate' function. */
#undef HAVE_FTRUNCATE
/* Define to 1 if you have the `getaddrinfo' function. */
#undef HAVE_GETADDRINFO
/* Define to 1 if you have the `getcwd' function. */
#undef HAVE_GETCWD
@ -89,6 +98,9 @@
/* Define if you have the iconv() function. */
#undef HAVE_ICONV
/* Define to 1 if you have the `inet_aton' function. */
#undef HAVE_INET_ATON
/* Define to 1 if you have the `inet_ntoa' function. */
#undef HAVE_INET_NTOA
@ -99,6 +111,9 @@
declares uintmax_t. */
#undef HAVE_INTTYPES_H_WITH_UINTMAX
/* Define to 1 if you have the <io.h> header file. */
#undef HAVE_IO_H
/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
#undef HAVE_LANGINFO_CODESET
@ -117,6 +132,9 @@
/* Define to 1 if you have libgcrypt. */
#undef HAVE_LIBGCRYPT
/* Define to 1 if you have the <libgen.h> header file. */
#undef HAVE_LIBGEN_H
/* Define to 1 if you have libgnutls. */
#undef HAVE_LIBGNUTLS
@ -135,6 +153,9 @@
/* Define to 1 if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
/* Define to 1 if you have the `localtime_r' function. */
#undef HAVE_LOCALTIME_R
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
to 0 otherwise. */
#undef HAVE_MALLOC
@ -178,6 +199,9 @@
/* Define to 1 if you have the `putenv' function. */
#undef HAVE_PUTENV
/* Define to 1 if you have the `random' function. */
#undef HAVE_RANDOM
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
and to 0 otherwise. */
#undef HAVE_REALLOC
@ -194,9 +218,21 @@
/* Define to 1 if you have the `setlocale' function. */
#undef HAVE_SETLOCALE
/* Define to 1 if you have the `setmode' function. */
#undef HAVE_SETMODE
/* Define to 1 if you have the `sigaction' function. */
#undef HAVE_SIGACTION
/* Define to 1 if you have the `sleep' function. */
#undef HAVE_SLEEP
/* Define to 1 if you have the `socket' function. */
#undef HAVE_SOCKET
/* Define to 1 if you have the `srandom' function. */
#undef HAVE_SRANDOM
/* Define to 1 if `stat' has the bug that it succeeds when given the
zero-length file name argument. */
#undef HAVE_STAT_EMPTY_STRING_BUG
@ -244,6 +280,9 @@
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the `strptime' function. */
#undef HAVE_STRPTIME
/* Define to 1 if you have the `strstr' function. */
#undef HAVE_STRSTR
@ -271,6 +310,9 @@
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the `timegm' function. */
#undef HAVE_TIMEGM
/* Define to 1 if you have the `tsearch' function. */
#undef HAVE_TSEARCH
@ -283,9 +325,18 @@
/* Define if you have the unsigned long long type. */
#undef HAVE_UNSIGNED_LONG_LONG
/* Define to 1 if you have the `usleep' function. */
#undef HAVE_USLEEP
/* Define to 1 if you have the `vprintf' function. */
#undef HAVE_VPRINTF
/* Define to 1 if you have the <winsock2.h> header file. */
#undef HAVE_WINSOCK2_H
/* Define to 1 if you have the <ws2tcpip.h> header file. */
#undef HAVE_WS2TCPIP_H
/* Define to 1 if the system has the type `_Bool'. */
#undef HAVE__BOOL

989
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -3,11 +3,20 @@
#
AC_PREREQ(2.59)
AC_INIT(aria2c, 0.11.1+1, t-tujikawa@users.sourceforge.net)
AC_CANONICAL_HOST
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE()
AM_PATH_CPPUNIT(1.10.2)
AC_CONFIG_SRCDIR([src/Socket.h])
AC_CONFIG_HEADERS([config.h])
case "$target" in
*mingw*|*cygwin*)
WINSOCK_LIBS="-lws2_32"
AC_SUBST(WINSOCK_LIBS)
;;
esac
# Set localedir
localedir=${datadir}/locale
AC_SUBST(localedir)
@ -102,7 +111,7 @@ fi
# Checks for header files.
AC_FUNC_ALLOCA
#AC_HEADER_STDC
AC_CHECK_HEADERS([argz.h arpa/inet.h fcntl.h inttypes.h langinfo.h libintl.h limits.h locale.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdio_ext.h stdlib.h string.h strings.h sys/param.h sys/socket.h sys/time.h unistd.h])
AC_CHECK_HEADERS([winsock2.h ws2tcpip.h argz.h arpa/inet.h fcntl.h inttypes.h io.h langinfo.h libgen.h libintl.h limits.h locale.h malloc.h netdb.h netinet/in.h stddef.h stdint.h stdio_ext.h stdlib.h string.h strings.h sys/param.h sys/socket.h sys/time.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
@ -125,7 +134,31 @@ AC_FUNC_REALLOC
AC_FUNC_SELECT_ARGTYPES
AC_FUNC_STAT
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([__argz_count __argz_next __argz_stringify ftruncate getcwd getpagesize gettimeofday inet_ntoa memchr mempcpy memset mkdir munmap nl_langinfo rmdir select setlocale socket stpcpy strcasecmp strchr strcspn strdup strerror strstr strtol strtoul])
AC_CHECK_FUNCS([__argz_count __argz_next __argz_stringify daemon ftruncate getcwd getpagesize gettimeofday inet_ntoa memchr mempcpy memset mkdir munmap nl_langinfo random rmdir select setlocale setmode sigaction sleep socket srandom stpcpy strcasecmp strchr strcspn strdup strerror strstr strtol strtoul timegm usleep])
AC_CHECK_FUNCS([basename],
[AM_CONDITIONAL([HAVE_BASENAME], true)],
[AM_CONDITIONAL([HAVE_BASENAME], false)])
AC_CHECK_FUNCS([getaddrinfo],
[AM_CONDITIONAL([HAVE_GETADDRINFO], true)],
[AM_CONDITIONAL([HAVE_GETADDRINFO], false)])
AC_CHECK_FUNCS([inet_aton],
[AM_CONDITIONAL([HAVE_INET_ATON], true)],
[AM_CONDITIONAL([HAVE_INET_ATON], false)])
AC_CHECK_FUNCS([localtime_r],
[AM_CONDITIONAL([HAVE_LOCALTIME_R], true)],
[AM_CONDITIONAL([HAVE_LOCALTIME_R], false)])
AC_CHECK_FUNCS([strptime],
[AM_CONDITIONAL([HAVE_STRPTIME], true)],
[AM_CONDITIONAL([HAVE_STRPTIME], false)])
case "$target" in
*mingw*)
dnl true if _WIN32_WINNT >= 0x0501
AM_CONDITIONAL([HAVE_GETADDRINFO], true)
;;
esac
AC_CONFIG_FILES([Makefile
src/Makefile
test/Makefile

View File

@ -35,6 +35,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = doc
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@ -105,6 +106,16 @@ GENCAT = @GENCAT@
GLIBC21 = @GLIBC21@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_BASENAME_FALSE = @HAVE_BASENAME_FALSE@
HAVE_BASENAME_TRUE = @HAVE_BASENAME_TRUE@
HAVE_GETADDRINFO_FALSE = @HAVE_GETADDRINFO_FALSE@
HAVE_GETADDRINFO_TRUE = @HAVE_GETADDRINFO_TRUE@
HAVE_INET_ATON_FALSE = @HAVE_INET_ATON_FALSE@
HAVE_INET_ATON_TRUE = @HAVE_INET_ATON_TRUE@
HAVE_LOCALTIME_R_FALSE = @HAVE_LOCALTIME_R_FALSE@
HAVE_LOCALTIME_R_TRUE = @HAVE_LOCALTIME_R_TRUE@
HAVE_STRPTIME_FALSE = @HAVE_STRPTIME_FALSE@
HAVE_STRPTIME_TRUE = @HAVE_STRPTIME_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@ -154,6 +165,7 @@ STRIP = @STRIP@
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WINSOCK_LIBS = @WINSOCK_LIBS@
XGETTEXT = @XGETTEXT@
XML2_CONFIG = @XML2_CONFIG@
XML_CPPFLAGS = @XML_CPPFLAGS@
@ -205,7 +217,11 @@ psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
man_MANS = aria2c.1
EXTRA_DIST = $(man_MANS)
all: all-am

View File

@ -35,6 +35,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
subdir = m4
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@ -101,6 +102,16 @@ GENCAT = @GENCAT@
GLIBC21 = @GLIBC21@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_BASENAME_FALSE = @HAVE_BASENAME_FALSE@
HAVE_BASENAME_TRUE = @HAVE_BASENAME_TRUE@
HAVE_GETADDRINFO_FALSE = @HAVE_GETADDRINFO_FALSE@
HAVE_GETADDRINFO_TRUE = @HAVE_GETADDRINFO_TRUE@
HAVE_INET_ATON_FALSE = @HAVE_INET_ATON_FALSE@
HAVE_INET_ATON_TRUE = @HAVE_INET_ATON_TRUE@
HAVE_LOCALTIME_R_FALSE = @HAVE_LOCALTIME_R_FALSE@
HAVE_LOCALTIME_R_TRUE = @HAVE_LOCALTIME_R_TRUE@
HAVE_STRPTIME_FALSE = @HAVE_STRPTIME_FALSE@
HAVE_STRPTIME_TRUE = @HAVE_STRPTIME_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@ -150,6 +161,7 @@ STRIP = @STRIP@
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WINSOCK_LIBS = @WINSOCK_LIBS@
XGETTEXT = @XGETTEXT@
XML2_CONFIG = @XML2_CONFIG@
XML_CPPFLAGS = @XML_CPPFLAGS@
@ -201,7 +213,11 @@ psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 intdiv0.m4 inttypes.m4 inttypes_h.m4 inttypes-pri.m4 isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 po.m4 progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4
all: all-am

View File

@ -38,6 +38,7 @@
#include "Util.h"
#include "message.h"
#include "LogFactory.h"
#include "a2io.h"
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
@ -79,7 +80,7 @@ void AbstractDiskWriter::openExistingFile(const string& filename, int64_t totalL
throw new DlAbortEx(EX_FILE_OPEN, filename.c_str(), MSG_FILE_NOT_FOUND);
}
if((fd = open(filename.c_str(), O_RDWR, OPEN_MODE)) < 0) {
if((fd = open(filename.c_str(), O_RDWR|O_BINARY, OPEN_MODE)) < 0) {
throw new DlAbortEx(EX_FILE_OPEN, filename.c_str(), strerror(errno));
}
if(f.size() < totalLength) {
@ -99,7 +100,7 @@ void AbstractDiskWriter::createFile(const string& filename, int32_t addFlags) {
// if(filename.empty()) {
// filename = "index.html";
// }
if((fd = open(filename.c_str(), O_CREAT|O_RDWR|O_TRUNC|addFlags, OPEN_MODE)) < 0) {
if((fd = open(filename.c_str(), O_CREAT|O_RDWR|O_TRUNC|O_BINARY|addFlags, OPEN_MODE)) < 0) {
throw new DlAbortEx(EX_FILE_OPEN, filename.c_str(), strerror(errno));
}
}

View File

@ -135,9 +135,12 @@ int32_t
BitfieldMan::getMissingIndexRandomly(const unsigned char* bitfield,
int32_t bitfieldLength) const
{
/*
int32_t byte = (int32_t)(((double)bitfieldLength)*
randomizer->getRandomNumber()/
(randomizer->getMaxRandomNumber()+1.0));
*/
int32_t byte = randomizer->getRandomNumber(bitfieldLength);
unsigned char lastMask = 0;
// the number of bytes in the last byte of bitfield

View File

@ -49,7 +49,7 @@ void ChunkChecksumValidator::validateSameLengthChecksum(BitfieldMan* bitfieldMan
string actualChecksum = diskWriter->messageDigest(offset, dataLength, algo);
if(actualChecksum != expectedChecksum) {
logger->info(EX_INVALID_CHUNK_CHECKSUM,
index, offset,
index, Util::llitos(offset, true).c_str(),
expectedChecksum.c_str(), actualChecksum.c_str());
bitfieldMan->unsetBit(index);
}
@ -71,7 +71,7 @@ void ChunkChecksumValidator::validateDifferentLengthChecksum(BitfieldMan* bitfie
if(expectedChecksum != actualChecksum) {
// wrong checksum
logger->info(EX_INVALID_CHUNK_CHECKSUM,
index, offset,
index, Util::llitos(offset, true).c_str(),
expectedChecksum.c_str(), actualChecksum.c_str());
bitfieldMan->unsetBitRange(startIndex, endIndex);
}

View File

@ -33,7 +33,7 @@
/* copyright --> */
#include "CompactPeerListProcessor.h"
#include "Data.h"
#include <netinet/in.h>
#include "a2netcompat.h"
bool CompactPeerListProcessor::canHandle(const MetaEntry* peersEntry) const {
return dynamic_cast<const Data*>(peersEntry) != 0;

View File

@ -40,6 +40,7 @@
#include "message.h"
#include "File.h"
#include "Util.h"
#include "a2io.h"
#include <errno.h>
DefaultBtProgressInfoFile::DefaultBtProgressInfoFile(const BtContextHandle& btContext,
@ -59,7 +60,7 @@ DefaultBtProgressInfoFile::~DefaultBtProgressInfoFile() {}
void DefaultBtProgressInfoFile::save() {
logger->info(MSG_SAVING_SEGMENT_FILE, filename.c_str());
FILE* file = openFile(filename, "w");
FILE* file = openFile(filename, "wb");
try {
if(fwrite(btContext->getInfoHash(),
btContext->getInfoHashLength(), 1, file) < 1) {
@ -93,7 +94,7 @@ void DefaultBtProgressInfoFile::save() {
void DefaultBtProgressInfoFile::load() {
logger->info(MSG_LOADING_SEGMENT_FILE, filename.c_str());
FILE* file = openFile(filename, "r+");
FILE* file = openFile(filename, "r+b");
unsigned char* savedInfoHash = 0;
unsigned char* savedBitfield = 0;
try {
@ -161,6 +162,9 @@ FILE* DefaultBtProgressInfoFile::openFile(const string& filename,
throw new DlAbortEx(EX_SEGMENT_FILE_OPEN,
filename.c_str(), strerror(errno));
}
#ifdef HAVE_SETMODE
setmode(fileno(file), O_BINARY);
#endif
return file;
}

View File

@ -36,9 +36,11 @@
#include "File.h"
#include "DlAbortEx.h"
#include "message.h"
#include "a2io.h"
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
Directory::Directory(const string& name):name(name) {}
@ -61,7 +63,7 @@ void Directory::createDir(const string& parentDir, bool recursive) const {
throw new DlAbortEx(EX_NOT_DIRECTORY, path.c_str());
}
} else {
if(mkdir(path.c_str(), OPEN_MODE) == -1) {
if(a2mkdir(path.c_str(), OPEN_MODE) == -1) {
throw new DlAbortEx(EX_MAKE_DIR, path.c_str(), strerror(errno));
}
}

View File

@ -44,6 +44,7 @@
# include "ChecksumCommand.h"
#endif // ENABLE_MESSAGE_DIGEST
#include <sys/time.h>
#include <stdlib.h>
DownloadCommand::DownloadCommand(int cuid,
const RequestHandle req,
@ -71,7 +72,11 @@ bool DownloadCommand::executeInternal() {
// TODO we need to specify the sum of all segmentMan's download speed here.
if(maxDownloadSpeedLimit > 0 &&
maxDownloadSpeedLimit < _requestGroup->getSegmentMan()->calculateDownloadSpeed()) {
#ifdef HAVE_USLEEP
usleep(1);
#else
_sleep(1);
#endif // HAVE_USLEEP
e->commands.push_back(this);
return false;
}

View File

@ -34,9 +34,7 @@
/* copyright --> */
#include "File.h"
#include "Util.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "a2io.h"
#include <libgen.h>
File::File(const string& name):name(name) {}
@ -106,7 +104,7 @@ bool File::mkdirs() {
if(File(accDir).isDir()) {
continue;
}
if(mkdir(accDir.c_str(), DIR_OPEN_MODE) == -1) {
if(a2mkdir(accDir.c_str(), DIR_OPEN_MODE) == -1) {
return false;
}
}
@ -137,3 +135,8 @@ string File::getDirname() const
free(s);
return dname;
}
bool File::isDir(const string& filename)
{
return File(filename).isDir();
}

View File

@ -94,6 +94,8 @@ public:
string getBasename() const;
string getDirname() const;
static bool isDir(const string& filename);
};
#endif // _D_FILE_H_

View File

@ -37,6 +37,7 @@
#include "message.h"
#include "DownloadCommand.h"
#include "prefs.h"
#include "Util.h"
bool FileAllocationCommand::executeInternal()
{
@ -44,7 +45,8 @@ bool FileAllocationCommand::executeInternal()
if(_fileAllocationEntry->finished()) {
logger->debug(MSG_ALLOCATION_COMPLETED,
_timer.difference(), _requestGroup->getTotalLength());
_timer.difference(),
Util::llitos(_requestGroup->getTotalLength(), true).c_str());
_e->_fileAllocationMan->markCurrentFileAllocationEntryDone();

View File

@ -201,7 +201,7 @@ int32_t FtpConnection::receiveSizeResponse(int64_t& size) {
pair<int32_t, string> response;
if(bulkReceiveResponse(response)) {
if(response.first == 213) {
sscanf(response.second.c_str(), "%*d %Ld", &size);
sscanf(response.second.c_str(), "%*d " LONGLONG_SCANF, &size);
}
return response.first;
} else {

View File

@ -187,7 +187,7 @@ bool FtpNegotiationCommand::recvSize() {
throw new DlRetryEx(EX_BAD_STATUS, status);
}
if(size == INT64_MAX || size < 0) {
throw new DlAbortEx(EX_TOO_LARGE_FILE, size);
throw new DlAbortEx(EX_TOO_LARGE_FILE, Util::llitos(size, true).c_str());
}
if(!_requestGroup->getSegmentMan()->downloadStarted) {
_requestGroup->getSegmentMan()->downloadStarted = true;
@ -220,23 +220,8 @@ bool FtpNegotiationCommand::recvSize() {
sequence = SEQ_FILE_PREPARATION;
e->noWait = true;
return false;
/*
_requestGroup->getSegmentMan()->initBitfield(e->option->getAsInt(PREF_SEGMENT_SIZE),
_requestGroup->getSegmentMan()->totalSize);
bool segFileExists = _requestGroup->getSegmentMan()->segmentFileExists();
if(segFileExists) {
_requestGroup->getSegmentMan()->load();
_requestGroup->getSegmentMan()->diskWriter->openExistingFile(_requestGroup->getSegmentMan()->getFilePath());
} else {
_requestGroup->getSegmentMan()->diskWriter->initAndOpenFile(_requestGroup->getSegmentMan()->getFilePath(), size);
}
*/
} else {
_requestGroup->validateTotalLength(size);
//if(_requestGroup->getSegmentMan()->totalSize != size) {
//throw new DlAbortEx(EX_SIZE_MISMATCH, _requestGroup->getSegmentMan()->totalSize, size);
}
if(e->option->get(PREF_FTP_PASV) == V_TRUE) {
sequence = SEQ_SEND_PASV;

View File

@ -44,8 +44,6 @@
#include "Logger.h"
#include "HttpResponse.h"
#include "HttpHeaderProcessor.h"
#include <netinet/in.h>
#include <string>
class HttpRequestEntry {
private:

View File

@ -40,7 +40,6 @@
#include "Range.h"
#include "Request.h"
#include "Option.h"
#include <netinet/in.h>
class HttpRequest {
private:

View File

@ -58,12 +58,12 @@ void HttpResponse::validateResponse() const
RangeHandle responseRange = httpHeader->getRange();
if(!httpRequest->isRangeSatisfied(responseRange)) {
throw new DlRetryEx(EX_INVALID_RANGE_HEADER,
httpRequest->getStartByte(),
httpRequest->getEndByte(),
httpRequest->getEntityLength(),
responseRange->getStartByte(),
responseRange->getEndByte(),
responseRange->getEntityLength());
Util::llitos(httpRequest->getStartByte(), true).c_str(),
Util::llitos(httpRequest->getEndByte(), true).c_str(),
Util::llitos(httpRequest->getEntityLength(), true).c_str(),
Util::llitos(responseRange->getStartByte(), true).c_str(),
Util::llitos(responseRange->getEndByte(), true).c_str(),
Util::llitos(responseRange->getEntityLength(), true).c_str());
}
}
}

View File

@ -121,7 +121,7 @@ bool HttpResponseCommand::handleDefaultEncoding(const HttpResponseHandle& httpRe
}
int64_t size = httpResponse->getEntityLength();
if(size == INT64_MAX || size < 0) {
throw new DlAbortEx(EX_TOO_LARGE_FILE, size);
throw new DlAbortEx(EX_TOO_LARGE_FILE, Util::llitos(size, true).c_str());
}
_requestGroup->getSegmentMan()->isSplittable = !(size == 0);
_requestGroup->getSegmentMan()->downloadStarted = true;

View File

@ -47,7 +47,7 @@ void IteratableChunkChecksumValidator::validateChunk()
// wrong checksum
logger->info(EX_INVALID_CHUNK_CHECKSUM,
_currentIndex,
offset,
Util::llitos(offset, true).c_str(),
_chunkChecksum->getChecksum(_currentIndex).c_str(),
actualChecksum.c_str());
int32_t startIndex;

View File

@ -34,8 +34,9 @@
/* copyright --> */
#include "LogFactory.h"
#include "SimpleLogger.h"
#include "a2io.h"
string LogFactory::filename = "/dev/null";
string LogFactory::filename = DEV_NULL;
Logger* LogFactory::logger = NULL;
Logger* LogFactory::getInstance() {

View File

@ -98,7 +98,8 @@ SRCS = Socket.h\
CookieParser.cc CookieParser.h\
CookieBoxFactory.cc CookieBoxFactory.h\
HttpHeaderProcessor.cc HttpHeaderProcessor.h\
FileEntry.cc FileEntry.h
FileEntry.cc FileEntry.h\
Platform.cc Platform.h
# debug_new.cpp
if ENABLE_MESSAGE_DIGEST
@ -226,11 +227,31 @@ SRCS += Metalinker.cc Metalinker.h\
MetalinkRequestInfo.cc MetalinkRequestInfo.h
endif # ENABLE_METALINK
if !HAVE_BASENAME
SRCS += libgen.c libgen.h
endif # !HAVE_BASENAME
if !HAVE_GETADDRINFO
SRCS += getaddrinfo.c getaddrinfo.h
endif # !HAVE_GETADDRINFO
if !HAVE_INET_ATON
SRCS += inet_aton.c inet_aton.h
endif # !HAVE_INET_ATON
if !HAVE_LOCALTIME_R
SRCS += localtime_r.c localtime_r.h
endif # !HAVE_LOCALTIME_R
if !HAVE_STRPTIME
SRCS += strptime.c strptime.h
endif # !HAVE_STRPTIME
noinst_LIBRARIES = libaria2c.a
libaria2c_a_SOURCES = $(SRCS)
aria2c_LDADD = libaria2c.a @LIBINTL@ @ALLOCA@ @LIBGNUTLS_LIBS@\
@LIBGCRYPT_LIBS@ @OPENSSL_LIBS@ @XML_LIBS@ @LIBARES_LIBS@\
@LIBCARES_LIBS@ # -lprofiler
@LIBCARES_LIBS@ @WINSOCK_LIBS@ # -lprofiler
#aria2c_LDFLAGS = #-pg
AM_CPPFLAGS = -Wall\
-I../lib -I../intl -I$(top_srcdir)/intl\

View File

@ -37,6 +37,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
bin_PROGRAMS = aria2c$(EXEEXT)
# debug_new.cpp
@ENABLE_MESSAGE_DIGEST_TRUE@am__append_1 = ChunkChecksumValidator.cc ChunkChecksumValidator.h\
@ -158,6 +159,11 @@ bin_PROGRAMS = aria2c$(EXEEXT)
@ENABLE_METALINK_TRUE@ Xml2MetalinkProcessor.cc Xml2MetalinkProcessor.h\
@ENABLE_METALINK_TRUE@ MetalinkRequestInfo.cc MetalinkRequestInfo.h
@HAVE_BASENAME_FALSE@am__append_4 = libgen.c libgen.h
@HAVE_GETADDRINFO_FALSE@am__append_5 = getaddrinfo.c getaddrinfo.h
@HAVE_INET_ATON_FALSE@am__append_6 = inet_aton.c inet_aton.h
@HAVE_LOCALTIME_R_FALSE@am__append_7 = localtime_r.c localtime_r.h
@HAVE_STRPTIME_FALSE@am__append_8 = strptime.c strptime.h
subdir = src
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in alloca.c
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@ -243,8 +249,8 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
RequestGroupEntry.cc RequestGroupEntry.h Cookie.cc Cookie.h \
CookieParser.cc CookieParser.h CookieBoxFactory.cc \
CookieBoxFactory.h HttpHeaderProcessor.cc \
HttpHeaderProcessor.h FileEntry.cc FileEntry.h \
ChunkChecksumValidator.cc ChunkChecksumValidator.h \
HttpHeaderProcessor.h FileEntry.cc FileEntry.h Platform.cc \
Platform.h ChunkChecksumValidator.cc ChunkChecksumValidator.h \
IteratableChunkChecksumValidator.cc \
IteratableChunkChecksumValidator.h \
IteratableChecksumValidator.cc IteratableChecksumValidator.h \
@ -319,7 +325,9 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
Metalinker.cc Metalinker.h MetalinkEntry.cc MetalinkEntry.h \
MetalinkResource.cc MetalinkResource.h MetalinkProcessor.h \
Xml2MetalinkProcessor.cc Xml2MetalinkProcessor.h \
MetalinkRequestInfo.cc MetalinkRequestInfo.h
MetalinkRequestInfo.cc MetalinkRequestInfo.h libgen.c libgen.h \
getaddrinfo.c getaddrinfo.h inet_aton.c inet_aton.h \
localtime_r.c localtime_r.h strptime.c strptime.h
@ENABLE_MESSAGE_DIGEST_TRUE@am__objects_1 = \
@ENABLE_MESSAGE_DIGEST_TRUE@ ChunkChecksumValidator.$(OBJEXT) \
@ENABLE_MESSAGE_DIGEST_TRUE@ IteratableChunkChecksumValidator.$(OBJEXT) \
@ -396,7 +404,12 @@ am__libaria2c_a_SOURCES_DIST = Socket.h SocketCore.cc SocketCore.h \
@ENABLE_METALINK_TRUE@ MetalinkResource.$(OBJEXT) \
@ENABLE_METALINK_TRUE@ Xml2MetalinkProcessor.$(OBJEXT) \
@ENABLE_METALINK_TRUE@ MetalinkRequestInfo.$(OBJEXT)
am__objects_4 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \
@HAVE_BASENAME_FALSE@am__objects_4 = libgen.$(OBJEXT)
@HAVE_GETADDRINFO_FALSE@am__objects_5 = getaddrinfo.$(OBJEXT)
@HAVE_INET_ATON_FALSE@am__objects_6 = inet_aton.$(OBJEXT)
@HAVE_LOCALTIME_R_FALSE@am__objects_7 = localtime_r.$(OBJEXT)
@HAVE_STRPTIME_FALSE@am__objects_8 = strptime.$(OBJEXT)
am__objects_9 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \
AbstractCommand.$(OBJEXT) \
InitiateConnectionCommandFactory.$(OBJEXT) \
DownloadCommand.$(OBJEXT) \
@ -436,9 +449,11 @@ am__objects_4 = SocketCore.$(OBJEXT) Command.$(OBJEXT) \
RealtimeCommand.$(OBJEXT) RequestGroupEntry.$(OBJEXT) \
Cookie.$(OBJEXT) CookieParser.$(OBJEXT) \
CookieBoxFactory.$(OBJEXT) HttpHeaderProcessor.$(OBJEXT) \
FileEntry.$(OBJEXT) $(am__objects_1) $(am__objects_2) \
$(am__objects_3)
am_libaria2c_a_OBJECTS = $(am__objects_4)
FileEntry.$(OBJEXT) Platform.$(OBJEXT) $(am__objects_1) \
$(am__objects_2) $(am__objects_3) $(am__objects_4) \
$(am__objects_5) $(am__objects_6) $(am__objects_7) \
$(am__objects_8)
am_libaria2c_a_OBJECTS = $(am__objects_9)
libaria2c_a_OBJECTS = $(am_libaria2c_a_OBJECTS)
am__installdirs = "$(DESTDIR)$(bindir)"
binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
@ -449,15 +464,15 @@ aria2c_DEPENDENCIES = libaria2c.a @ALLOCA@
DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-o $@
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libaria2c_a_SOURCES) $(aria2c_SOURCES)
DIST_SOURCES = $(am__libaria2c_a_SOURCES_DIST) $(aria2c_SOURCES)
ETAGS = etags
@ -506,6 +521,16 @@ GENCAT = @GENCAT@
GLIBC21 = @GLIBC21@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_BASENAME_FALSE = @HAVE_BASENAME_FALSE@
HAVE_BASENAME_TRUE = @HAVE_BASENAME_TRUE@
HAVE_GETADDRINFO_FALSE = @HAVE_GETADDRINFO_FALSE@
HAVE_GETADDRINFO_TRUE = @HAVE_GETADDRINFO_TRUE@
HAVE_INET_ATON_FALSE = @HAVE_INET_ATON_FALSE@
HAVE_INET_ATON_TRUE = @HAVE_INET_ATON_TRUE@
HAVE_LOCALTIME_R_FALSE = @HAVE_LOCALTIME_R_FALSE@
HAVE_LOCALTIME_R_TRUE = @HAVE_LOCALTIME_R_TRUE@
HAVE_STRPTIME_FALSE = @HAVE_STRPTIME_FALSE@
HAVE_STRPTIME_TRUE = @HAVE_STRPTIME_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@ -555,6 +580,7 @@ STRIP = @STRIP@
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WINSOCK_LIBS = @WINSOCK_LIBS@
XGETTEXT = @XGETTEXT@
XML2_CONFIG = @XML2_CONFIG@
XML_CPPFLAGS = @XML_CPPFLAGS@
@ -606,7 +632,11 @@ psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
aria2c_SOURCES = main.cc
SRCS = Socket.h SocketCore.cc SocketCore.h Command.cc Command.h \
AbstractCommand.cc AbstractCommand.h \
@ -668,13 +698,15 @@ SRCS = Socket.h SocketCore.cc SocketCore.h Command.cc Command.h \
RequestGroupEntry.cc RequestGroupEntry.h Cookie.cc Cookie.h \
CookieParser.cc CookieParser.h CookieBoxFactory.cc \
CookieBoxFactory.h HttpHeaderProcessor.cc \
HttpHeaderProcessor.h FileEntry.cc FileEntry.h $(am__append_1) \
$(am__append_2) $(am__append_3)
HttpHeaderProcessor.h FileEntry.cc FileEntry.h Platform.cc \
Platform.h $(am__append_1) $(am__append_2) $(am__append_3) \
$(am__append_4) $(am__append_5) $(am__append_6) \
$(am__append_7) $(am__append_8)
noinst_LIBRARIES = libaria2c.a
libaria2c_a_SOURCES = $(SRCS)
aria2c_LDADD = libaria2c.a @LIBINTL@ @ALLOCA@ @LIBGNUTLS_LIBS@\
@LIBGCRYPT_LIBS@ @OPENSSL_LIBS@ @XML_LIBS@ @LIBARES_LIBS@\
@LIBCARES_LIBS@ # -lprofiler
@LIBCARES_LIBS@ @WINSOCK_LIBS@ # -lprofiler
#aria2c_LDFLAGS = #-pg
AM_CPPFLAGS = -Wall\
@ -686,7 +718,7 @@ AM_CPPFLAGS = -Wall\
all: all-am
.SUFFIXES:
.SUFFIXES: .cc .o .obj
.SUFFIXES: .c .cc .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
@ -880,6 +912,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerListenCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/PeerMessageUtil.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Piece.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Platform.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RealtimeCommand.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Request.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RequestFactory.Po@am__quote@
@ -908,7 +941,26 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/UriListParser.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Util.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Xml2MetalinkProcessor.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getaddrinfo.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inet_aton.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgen.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/localtime_r.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strptime.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.cc.o:
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \

View File

@ -36,18 +36,21 @@
#include "File.h"
#include "DlAbortEx.h"
#include "message.h"
#include "a2io.h"
#include <string.h>
#include <stdlib.h>
MetaEntry* MetaFileUtil::parseMetaFile(const string& file) {
File f(file);
int32_t len = f.size();
char* buf = new char[len];
FILE* fp = fopen(file.c_str(), "r+");
FILE* fp = fopen(file.c_str(), "r+b");
try {
if(fp == NULL) {
throw new DlAbortEx("cannot open metainfo file");
}
#ifdef HAVE_SETMODE
setmode(fileno(fp), O_BINARY);
#endif
if(fread(buf, len, 1, fp) != 1) {
fclose(fp);
throw new DlAbortEx("cannot read metainfo");

View File

@ -121,7 +121,7 @@ void MultiDiskAdaptor::writeData(const unsigned char* data, int32_t len,
}
}
if(!writing) {
throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, offset);
throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, Util::llitos(offset, true).c_str());
}
}
@ -164,7 +164,7 @@ int32_t MultiDiskAdaptor::readData(unsigned char* data, int32_t len, int64_t off
}
}
if(!reading) {
throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, offset);
throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, Util::llitos(offset, true).c_str());
}
return totalReadLength;
}
@ -212,7 +212,7 @@ string MultiDiskAdaptor::messageDigest(int64_t offset, int64_t length,
}
}
if(!reading) {
throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, offset);
throw new DlAbortEx(EX_FILE_OFFSET_OUT_OF_RANGE, Util::llitos(offset, true).c_str());
}
unsigned char hashValue[20];
ctx.digestFinal(hashValue);

View File

@ -36,10 +36,7 @@
#define _D_NAME_RESOLVER_H_
#include "common.h"
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "a2netcompat.h"
#ifdef ENABLE_ASYNC_DNS

View File

@ -40,7 +40,6 @@
#include "Util.h"
#include "FatalException.h"
#include "prefs.h"
#include <netinet/in.h>
class NullOptionHandler : public OptionHandler {
public:
@ -91,14 +90,14 @@ public:
} else {
string msg = _optName+" ";
if(_min == -1 && _max != -1) {
msg += _("must be smaller than or equal to %lld.");
throw new FatalException(msg.c_str(), _max);
msg += _("must be smaller than or equal to %s.");
throw new FatalException(msg.c_str(), Util::llitos(_max).c_str());
} else if(_min != -1 && _max != -1) {
msg += _("must be between %lld and %lld.");
throw new FatalException(msg.c_str(), _min, _max);
msg += _("must be between %s and %s.");
throw new FatalException(msg.c_str(), Util::llitos(_min).c_str(), Util::llitos(_max).c_str());
} else if(_min != -1 && _max == -1) {
msg += _("must be greater than or equal to %lld.");
throw new FatalException(msg.c_str(), _min);
msg += _("must be greater than or equal to %s.");
throw new FatalException(msg.c_str(), Util::llitos(_min).c_str());
} else {
msg += _("must be a number.");
throw new FatalException(msg.c_str());
@ -218,9 +217,9 @@ public:
virtual void parseArg(Option* option, const string& optarg)
{
pair<string, string> proxy = Util::split(optarg, ":");
in_port_t port = strtol(proxy.second.c_str(), 0, 10);
int32_t port = strtol(proxy.second.c_str(), 0, 10);
if(proxy.first.empty() || proxy.second.empty() ||
port <= 0) {
port <= 0 || 65535 < port) {
throw new FatalException(_("unrecognized proxy format"));
}
option->put(PREF_HTTP_PROXY, optarg);

View File

@ -39,7 +39,7 @@
#include "Util.h"
#include "LogFactory.h"
#include "BtHandshakeMessage.h"
#include <netinet/in.h>
#include "a2netcompat.h"
PeerConnection::PeerConnection(int32_t cuid,
const SocketHandle& socket,

View File

@ -35,7 +35,7 @@
#include "PeerMessageUtil.h"
#include "DlAbortEx.h"
#include "Util.h"
#include <netinet/in.h>
#include "a2netcompat.h"
int8_t PeerMessageUtil::getId(const unsigned char* msg) {
return msg[0];

63
src/Platform.cc Normal file
View File

@ -0,0 +1,63 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif // HAVE_CONFIG_H
#ifdef HAVE_WINSOCK2_H
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x501
# endif // _WIN32_WINNT
# include <winsock2.h>
#endif // HAVE_WINSOCK2_H
#include "Platform.h"
#include "DlAbortEx.h"
Platform::Platform() {
#ifdef HAVE_WINSOCK2_H
WSADATA wsaData;
memset((char*)&wsaData, 0, sizeof(wsaData));
if (WSAStartup(MAKEWORD(1, 1), &wsaData)) {
throw new DlAbortEx(_("Windows socket library initialization failed"));
}
#endif // HAVE_WINSOCK2_H
}
Platform::~Platform() {
#ifdef HAVE_WINSOCK2_H
WSACleanup();
#endif // HAVE_WINSOCK2_H
}

45
src/Platform.h Normal file
View File

@ -0,0 +1,45 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_PLATFORM_H_
#define _D_PLATFORM_H_
class Platform {
public:
Platform();
~Platform();
};
#endif // _D_PLATFORM_H_

View File

@ -44,6 +44,11 @@ public:
virtual long int getRandomNumber() = 0;
virtual long int getMaxRandomNumber() = 0;
/**
* Returns random number in [0, to).
*/
virtual long int getRandomNumber(long int to) = 0;
};
typedef SharedHandle<Randomizer> RandomizerHandle;

View File

@ -269,8 +269,8 @@ void RequestGroup::validateTotalLength(int64_t expectedTotalLength,
}
if(expectedTotalLength != actualTotalLength) {
throw new DlAbortEx(EX_SIZE_MISMATCH,
expectedTotalLength,
actualTotalLength);
Util::llitos(expectedTotalLength, true).c_str(),
Util::llitos(actualTotalLength, true).c_str());
}
}

View File

@ -43,9 +43,7 @@
#ifdef ENABLE_MESSAGE_DIGEST
#include "ChunkChecksumValidator.h"
#endif // ENABLE_MESSAGE_DIGEST
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include "a2io.h"
#include <errno.h>
SegmentMan::SegmentMan():logger(LogFactory::getInstance()),
@ -88,7 +86,7 @@ void SegmentMan::load() {
}
string segFilename = getSegmentFilePath();
logger->info(MSG_LOADING_SEGMENT_FILE, segFilename.c_str());
FILE* segFile = openSegFile(segFilename, "r+");
FILE* segFile = openSegFile(segFilename, "r+b");
try {
read(segFile);
fclose(segFile);
@ -106,7 +104,7 @@ void SegmentMan::save() const {
}
string segFilename = getSegmentFilePath();
logger->info(MSG_SAVING_SEGMENT_FILE, segFilename.c_str());
FILE* segFile = openSegFile(segFilename, "w");
FILE* segFile = openSegFile(segFilename, "wb");
try {
if(fwrite(&totalSize, sizeof(totalSize), 1, segFile) < 1) {
throw string("writeError");
@ -155,6 +153,9 @@ FILE* SegmentMan::openSegFile(const string& segFilename, const string& mode) con
throw new DlAbortEx(EX_SEGMENT_FILE_OPEN,
segFilename.c_str(), strerror(errno));
}
#ifdef HAVE_SETMODE
setmode(fileno(segFile), O_BINARY);
#endif
return segFile;
}
@ -537,7 +538,7 @@ void SegmentMan::tryChunkChecksumValidation(const SegmentHandle& segment)
logger->info(MSG_GOOD_CHUNK_CHECKSUM);
} else {
logger->info(EX_INVALID_CHUNK_CHECKSUM,
index, offset,
index, Util::llitos(offset, true).c_str(),
expectedChecksum.c_str(), actualChecksum.c_str());
logger->debug("Unset bit from %d to %d(inclusive)", startIndex, endIndex);
bitfield->unsetBitRange(startIndex, endIndex);

View File

@ -36,11 +36,15 @@
#include "Util.h"
#include "DlAbortEx.h"
#include "message.h"
#include "a2io.h"
#include <time.h>
#include <stdarg.h>
#include <stdio.h>
#include <errno.h>
#ifndef HAVE_LOCALTIME_R
# include "localtime_r.h"
#endif // HAVE_LOCALTIME_R
#define WRITE_LOG(LEVEL, MSG) \
va_list ap;\
va_start(ap, MSG);\
@ -60,10 +64,13 @@ SimpleLogger::~SimpleLogger() {
}
void SimpleLogger::openFile(const string& filename) {
file = fopen(filename.c_str(), "a");
file = fopen(filename.c_str(), "ab");
if(file == NULL) {
throw new DlAbortEx(EX_FILE_OPEN, filename.c_str(), strerror(errno));
}
#ifdef HAVE_SETMODE
setmode(fileno(file), O_BINARY);
#endif
}
void SimpleLogger::closeFile() {

View File

@ -54,18 +54,31 @@ public:
}
static void init() {
#ifdef HAVE_SRANDOM
srandom(time(0));
#else
srand(time(0));
#endif
}
virtual ~SimpleRandomizer() {}
virtual long int getRandomNumber() {
#ifdef HAVE_RANDOM
return random();
#else
return rand();
#endif
}
virtual long int getMaxRandomNumber() {
return RAND_MAX;
}
virtual long int getRandomNumber(long int to)
{
return(int32_t)(((double)to)*getRandomNumber()/(getMaxRandomNumber()+1.0));
}
};
#endif // _D_SIMPLE_RANDOMIZER_H_

View File

@ -36,17 +36,38 @@
#include "DlRetryEx.h"
#include "DlAbortEx.h"
#include "message.h"
#include "a2io.h"
#include "a2netcompat.h"
#include <unistd.h>
#include <fcntl.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <netdb.h>
#include <errno.h>
#ifdef __MINGW32__
static char *mingw_strerror(int err) {
err = WSAGetLastError();
static char buf[2048];
if (FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &buf,
sizeof(buf),
NULL
) == 0) {
snprintf(buf, sizeof(buf), _("Unknown socket error %d"), err);
}
return buf;
}
#define strerror mingw_strerror
#define gai_strerror mingw_strerror
#endif // __MINGW32__
SocketCore::SocketCore():sockfd(-1) {
init();
}
@ -86,7 +107,7 @@ void SocketCore::beginListen(int32_t port) {
if(sockfd == -1) {
throw new DlAbortEx(EX_SOCKET_OPEN, strerror(errno));
}
socklen_t sockopt = 1;
SOCKOPT_T sockopt = 1;
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(socklen_t)) < 0) {
close(sockfd);
sockfd = -1;
@ -151,7 +172,7 @@ void SocketCore::establishConnection(const string& host, int32_t port) {
if(sockfd == -1) {
throw new DlAbortEx(EX_SOCKET_OPEN, strerror(errno));
}
socklen_t sockopt = 1;
SOCKOPT_T sockopt = 1;
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(socklen_t)) < 0) {
close(sockfd);
sockfd = -1;
@ -188,15 +209,25 @@ void SocketCore::establishConnection(const string& host, int32_t port) {
}
void SocketCore::setNonBlockingMode() const {
#ifdef __MINGW32__
u_long flag = 0;
::ioctlsocket(sockfd, FIONBIO, &flag);
#else
int32_t flags = fcntl(sockfd, F_GETFL, 0);
// TODO add error handling
fcntl(sockfd, F_SETFL, flags|O_NONBLOCK);
#endif // __MINGW32__
}
void SocketCore::setBlockingMode() const {
#ifdef __MINGW32__
u_long flag = 1;
::ioctlsocket(sockfd, FIONBIO, &flag);
#else
int32_t flags = fcntl(sockfd, F_GETFL, 0);
// TODO add error handling
fcntl(sockfd, F_SETFL, flags&(~O_NONBLOCK));
#endif // __MINGW32__
}
void SocketCore::closeConnection() {

View File

@ -44,6 +44,10 @@
#include "DNSCache.h"
#include <signal.h>
#ifndef SA_RESETHAND
# define SA_RESETHAND 0x80000000
#endif // SA_RESETHAND
extern volatile sig_atomic_t btHaltRequested;
void torrentHandler(int signal) {

View File

@ -36,19 +36,19 @@
#include "DlAbortEx.h"
#include "File.h"
#include "message.h"
#include "SimpleRandomizer.h"
#include "a2io.h"
#include "a2netcompat.h"
#include <ctype.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <iomanip>
#ifndef HAVE_STRPTIME
# include "strptime.h"
#endif // HAVE_STRPTIME
template<typename T>
string uint2str(T value, bool comma) {
@ -311,6 +311,9 @@ string Util::toHex(const unsigned char* src, int32_t len) {
FILE* Util::openFile(const string& filename, const string& mode) {
FILE* file = fopen(filename.c_str(), mode.c_str());
#ifdef HAVE_SETMODE
setmode(fileno(file), O_BINARY);
#endif
return file;
}
@ -325,10 +328,10 @@ void Util::rangedFileCopy(const string& dest, const string& src, int64_t srcOffs
int32_t destFd = -1;
int32_t srcFd = -1;
try {
if((destFd = open(dest.c_str(), O_CREAT|O_WRONLY|O_TRUNC, OPEN_MODE)) == -1) {
if((destFd = open(dest.c_str(), O_CREAT|O_WRONLY|O_TRUNC|O_BINARY, OPEN_MODE)) == -1) {
throw new DlAbortEx(EX_FILE_OPEN, dest.c_str(), strerror(errno));
}
if((srcFd = open(src.c_str(), O_RDONLY, OPEN_MODE)) == -1) {
if((srcFd = open(src.c_str(), O_RDONLY|O_BINARY, OPEN_MODE)) == -1) {
throw new DlAbortEx(EX_FILE_OPEN, src.c_str(), strerror(errno));
}
if(lseek(srcFd, srcOffset, SEEK_SET) != srcOffset) {
@ -508,7 +511,7 @@ void Util::fileChecksum(const string& filename, unsigned char* digest,
char buf[BUFLEN];
int32_t fd;
if((fd = open(filename.c_str(), O_RDWR, OPEN_MODE)) < 0) {
if((fd = open(filename.c_str(), O_RDWR|O_BINARY, OPEN_MODE)) < 0) {
throw new DlAbortEx(EX_FILE_OPEN, filename.c_str(), strerror(errno));
}
while(1) {
@ -597,16 +600,11 @@ int32_t Util::countBit(uint32_t n) {
}
string Util::randomAlpha(int32_t length) {
static char *random_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string str;
for(int32_t i = 0; i < length; i++) {
int32_t index = (int32_t)(((double)52)*random()/(RAND_MAX+1.0));
char ch;
if(index < 26) {
ch = (char)('A'+index);
} else {
ch = (char)('a'+index-26);
}
str += ch;
int32_t index = SimpleRandomizer::getInstance()->getRandomNumber(strlen(random_chars));
str += random_chars[index];
}
return str;
}
@ -647,11 +645,15 @@ bool Util::isNumbersAndDotsNotation(const string& name) {
}
void Util::setGlobalSignalHandler(int32_t signal, void (*handler)(int32_t), int32_t flags) {
#ifdef HAVE_SIGACTION
struct sigaction sigact;
sigact.sa_handler = handler;
sigact.sa_flags = flags;
sigemptyset(&sigact.sa_mask);
sigaction(signal, &sigact, NULL);
#else
signal(sig, handler);
#endif // HAVE_SIGACTION
}
void Util::indexRange(int32_t& startIndex, int32_t& endIndex,
@ -715,8 +717,23 @@ time_t Util::httpGMT(const string& httpStdTime)
struct tm tm;
memset(&tm, 0, sizeof(tm));
strptime(httpStdTime.c_str(), "%a, %Y-%m-%d %H:%M:%S GMT", &tm);
#ifdef HAVE_TIMEGM
time_t thetime = timegm(&tm);
return thetime;
#else
char *tz;
tz = getenv("TZ");
putenv("TZ=");
tzset();
time_t thetime = mktime(&tm);
if (tz) {
char s[256];
sprintf("TZ=%s", tz);
putenv(s);
}
tzset();
return thetime;
#endif // HAVE_TIMEGM
}
void Util::toStream(ostream& os, const FileEntries& fileEntries)

119
src/a2io.h Normal file
View File

@ -0,0 +1,119 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_A2IO_H_
#define _D_A2IO_H_
#include "common.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#ifdef HAVE_IO_H
# include <io.h>
#endif // HAVE_IO_H
// in some platforms following definitions are missing:
#ifndef EINPROGRESS
# define EINPROGRESS (WSAEINPROGRESS)
#endif // EINPROGRESS
#ifndef O_NONBLOCK
# define O_NONBLOCK (O_NDELAY)
#endif // O_NONBLOCK
#ifndef O_BINARY
# define O_BINARY (0)
#endif // O_BINARY
// st_mode flags
#ifndef S_IRUSR
# define S_IRUSR 0000400 /* read permission, owner */
#endif /* S_IRUSR */
#ifndef S_IWUSR
# define S_IWUSR 0000200 /* write permission, owner */
#endif /* S_IWUSR */
#ifndef S_IXUSR
# define S_IXUSR 0000100/* execute/search permission, owner */
#endif /* S_IXUSR */
#ifndef S_IRWXU
# define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
#endif /* S_IRWXU */
#ifndef S_IRGRP
# define S_IRGRP 0000040 /* read permission, group */
#endif /* S_IRGRP */
#ifndef S_IWGRP
# define S_IWGRP 0000020 /* write permission, grougroup */
#endif /* S_IWGRP */
#ifndef S_IXGRP
# define S_IXGRP 0000010/* execute/search permission, group */
#endif /* S_IXGRP */
#ifndef S_IRWXG
# define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP)
#endif /* S_IRWXG */
#ifndef S_IROTH
# define S_IROTH 0000004 /* read permission, other */
#endif /* S_IROTH */
#ifndef S_IWOTH
# define S_IWOTH 0000002 /* write permission, other */
#endif /* S_IWOTH */
#ifndef S_IXOTH
# define S_IXOTH 0000001/* execute/search permission, other */
#endif /* S_IXOTH */
#ifndef S_IRWXO
# define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH)
#endif /* S_IRWXO */
// Use 'null' instead of /dev/null in win32.
#ifdef HAVE_WINSOCK2_H
# define DEV_NULL "nul"
#else
# define DEV_NULL "/dev/null"
#endif // HAVE_WINSOCK2_H
// Use 'con' instead of '/dev/stdout' in win32.
#ifdef HAVE_WINSOCK2_H
# define DEV_STDOUT "con"
#else
# define DEV_STDOUT "/dev/stdout"
#endif // HAVE_WINSOCK2_H
#ifdef __MINGW32__
# define a2mkdir(path, openMode) mkdir(path)
#else
# define a2mkdir(path, openMode) mkdir(path, openMode)
#endif // __MINGW32__
#endif // _D_A2IO_H_

75
src/a2netcompat.h Normal file
View File

@ -0,0 +1,75 @@
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_A2NETCOMPAT_H_
#define _D_A2NETCOMPAT_H_
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif // HAVE_NETDB_H
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif // HAVE_SYS_SOCKET_H
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif // HAVE_NETINET_IN_H
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif // HAVE_ARPA_INET_H
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif // HAVE_NETINET_IN_H
#ifndef HAVE_INET_ATON
# include "inet_aton.h"
#endif // HAVE_INET_ATON
#ifdef __MINGW32__
# include <winsock2.h>
# undef ERROR
# include <ws2tcpip.h>
# define SOCKOPT_T const char
# define HAVE_GETADDRINFO
#else
# define SOCKOPT_T socklen_t
#endif // __MINGW32__
#ifndef HAVE_GETADDRINFO
# include "getaddrinfo.h"
#endif // HAVE_GETADDRINFO
#endif // _D_A2NETCOMPAT_H_

View File

@ -45,6 +45,7 @@
#include <assert.h>
#include <limits.h>
#include <unistd.h>
#include <stdlib.h>
#include <string>
#include <deque>
#include <algorithm>
@ -81,4 +82,22 @@ typedef deque<int32_t> Integers;
#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__
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x501
# endif // _WIN32_WINNT
#endif // __MINGW32__
#ifdef __MINGW32__
# define LONGLONG_PRINTF "%I64d"
# define ULONGLONG_PRINTF "%I64u"
# define LONGLONG_SCANF "%I64d"
# define ULONGLONG_SCANF "%I64u"
#else
# define LONGLONG_PRINTF "%lld"
# define ULONGLONG_PRINTF "%llu"
# define LONGLONG_SCANF "%Ld"
# define ULONGLONG_SCANF "%Lu"
#endif // __MINGW32__
#endif // _D_COMMON_H_

608
src/getaddrinfo.c Normal file
View File

@ -0,0 +1,608 @@
/*
* Copyright (c) 2001, 02 Motoyuki Kasahara
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* This program provides getaddrinfo() and getnameinfo() described in
* RFC2133, 2553 and 3493. These functions are mainly used for IPv6
* application to resolve hostname or address.
*
* This program is designed to be working on traditional IPv4 systems
* which don't have those functions. Therefore, this implementation
* supports IPv4 only.
*
* This program is useful for application which should support both IPv6
* and traditional IPv4 systems. Use genuine getaddrinfo() and getnameinfo()
* provided by system if the system supports IPv6. Otherwise, use this
* implementation.
*
* This program is intended to be used in combination with GNU Autoconf.
*
* This program also provides freeaddrinfo() and gai_strerror().
*
* To use this program in your application, insert the following lines to
* C source files after including `sys/types.h', `sys/socket.h' and
* `netdb.h'. `getaddrinfo.h' defines `struct addrinfo' and AI_, NI_,
* EAI_ macros.
*
* #ifndef HAVE_GETADDRINFO
* #include "getaddrinfo.h"
* #endif
*
* Restriction:
* getaddrinfo() and getnameinfo() of this program are NOT thread
* safe, unless the cpp macro ENABLE_PTHREAD is defined.
*/
/*
* Add the following code to your configure.ac (or configure.in).
* AC_C_CONST
* AC_HEADER_STDC
* AC_CHECK_HEADERS(string.h memory.h stdlib.h)
* AC_CHECK_FUNCS(memcpy)
* AC_REPLACE_FUNCS(memset)
* AC_TYPE_SOCKLEN_T
* AC_TYPE_IN_PORT_T
* AC_DECL_H_ERRNO
*
* AC_CHECK_FUNCS(getaddrinfo getnameinfo)
* if test "$ac_cv_func_getaddrinfo$ac_cv_func_getnameinfo" != yesyes ; then
* LIBOBJS="$LIBOBJS getaddrinfo.$ac_objext"
* fi
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef __MINGW32__
# include <winsock2.h>
# undef ERROR
# include <ws2tcpip.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif
#include <sys/types.h>
#include <stdio.h>
#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
#include <string.h>
#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
#include <memory.h>
#endif /* not STDC_HEADERS and HAVE_MEMORY_H */
#else /* not STDC_HEADERS and not HAVE_STRING_H */
#include <strings.h>
#endif /* not STDC_HEADERS and not HAVE_STRING_H */
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef ENABLE_PTHREAD
#include <pthread.h>
#endif
#ifdef ENABLE_NLS
#include <libintl.h>
#endif
#ifndef HAVE_MEMCPY
#define memcpy(d, s, n) bcopy((s), (d), (n))
#ifdef __STDC__
void *memchr(const void *, int, size_t);
int memcmp(const void *, const void *, size_t);
void *memmove(void *, const void *, size_t);
void *memset(void *, int, size_t);
#else /* not __STDC__ */
char *memchr();
int memcmp();
char *memmove();
char *memset();
#endif /* not __STDC__ */
#endif /* not HAVE_MEMCPY */
#ifndef H_ERRNO_DECLARED
extern int h_errno;
#endif
#include "getaddrinfo.h"
#ifdef ENABLE_NLS
#define _(string) gettext(string)
#ifdef gettext_noop
#define N_(string) gettext_noop(string)
#else
#define N_(string) (string)
#endif
#else
#define gettext(string) (string)
#define _(string) (string)
#define N_(string) (string)
#endif
/*
* Error messages for gai_strerror().
*/
static char *eai_errlist[] = {
N_("Success"),
/* EAI_ADDRFAMILY */
N_("Address family for hostname not supported"),
/* EAI_AGAIN */
N_("Temporary failure in name resolution"),
/* EAI_BADFLAGS */
N_("Invalid value for ai_flags"),
/* EAI_FAIL */
N_("Non-recoverable failure in name resolution"),
/* EAI_FAMILY */
N_("ai_family not supported"),
/* EAI_MEMORY */
N_("Memory allocation failure"),
/* EAI_NONAME */
N_("hostname nor servname provided, or not known"),
/* EAI_OVERFLOW */
N_("An argument buffer overflowed"),
/* EAI_SERVICE */
N_("servname not supported for ai_socktype"),
/* EAI_SOCKTYPE */
N_("ai_socktype not supported"),
/* EAI_SYSTEM */
N_("System error returned in errno")
};
/*
* Default hints for getaddrinfo().
*/
static struct addrinfo default_hints = {
0, PF_UNSPEC, 0, 0, 0, NULL, NULL, NULL
};
/*
* Mutex.
*/
#ifdef ENABLE_PTHREAD
static pthread_mutex_t gai_mutex = PTHREAD_MUTEX_INITIALIZER;
#endif
/*
* Declaration of static functions.
*/
#ifdef __STDC__
static int is_integer(const char *);
static int is_address(const char *);
static int itoa_length(int);
#else
static int is_integer();
static int is_address();
static int itoa_length();
#endif
/*
* gai_strerror().
*/
const char *
gai_strerror(ecode)
int ecode;
{
if (ecode < 0 || ecode > EAI_SYSTEM)
return _("Unknown error");
return gettext(eai_errlist[ecode]);
}
/*
* freeaddrinfo().
*/
void
freeaddrinfo(ai)
struct addrinfo *ai;
{
struct addrinfo *next_ai;
while (ai != NULL) {
if (ai->ai_canonname != NULL)
free(ai->ai_canonname);
if (ai->ai_addr != NULL)
free(ai->ai_addr);
next_ai = ai->ai_next;
free(ai);
ai = next_ai;
}
}
/*
* Return 1 if the string `s' represents an integer.
*/
static int
is_integer(s)
const char *s;
{
if (*s == '-' || *s == '+')
s++;
if (*s < '0' || '9' < *s)
return 0;
s++;
while ('0' <= *s && *s <= '9')
s++;
return (*s == '\0');
}
/*
* Return 1 if the string `s' represents an IPv4 address.
* Unlike inet_addr(), it doesn't permit malformed nortation such
* as "192.168".
*/
static int
is_address(s)
const char *s;
{
const static char delimiters[] = {'.', '.', '.', '\0'};
int i, j;
int octet;
for (i = 0; i < 4; i++) {
if (*s == '0' && *(s + 1) != delimiters[i])
return 0;
for (j = 0, octet = 0; '0' <= *s && *s <= '9' && j < 3; s++, j++)
octet = octet * 10 + (*s - '0');
if (j == 0 || octet > 255 || *s != delimiters[i])
return 0;
s++;
}
return 1;
}
/*
* Calcurate length of the string `s', where `s' is set by
* sprintf(s, "%d", n).
*/
static int
itoa_length(n)
int n;
{
int result = 1;
if (n < 0) {
n = -n;
result++;
}
while (n >= 10) {
result++;
n /= 10;
}
return result;
}
/*
* getaddrinfo().
*/
int
getaddrinfo(nodename, servname, hints, res)
const char *nodename;
const char *servname;
const struct addrinfo *hints;
struct addrinfo **res;
{
struct addrinfo *head_res = NULL;
struct addrinfo *tail_res = NULL;
struct addrinfo *new_res;
struct sockaddr_in *sa_in;
struct in_addr **addr_list;
struct in_addr *addr_list_buf[2];
struct in_addr addr_buf;
struct in_addr **ap;
struct servent *servent;
struct hostent *hostent;
const char *canonname = NULL;
in_port_t port;
int saved_h_errno;
int result = 0;
#ifdef ENABLE_PTHREAD
pthread_mutex_lock(&gai_mutex);
#endif
saved_h_errno = h_errno;
if (nodename == NULL && servname == NULL) {
result = EAI_NONAME;
goto end;
}
if (hints != NULL) {
if (hints->ai_family != PF_INET && hints->ai_family != PF_UNSPEC) {
result = EAI_FAMILY;
goto end;
}
if (hints->ai_socktype != SOCK_DGRAM
&& hints->ai_socktype != SOCK_STREAM
&& hints->ai_socktype != 0) {
result = EAI_SOCKTYPE;
goto end;
}
} else {
hints = &default_hints;
}
if (servname != NULL) {
if (is_integer(servname))
port = htons(atoi(servname));
else {
if (hints->ai_flags & AI_NUMERICSERV) {
result = EAI_NONAME;
goto end;
}
if (hints->ai_socktype == SOCK_DGRAM)
servent = getservbyname(servname, "udp");
else if (hints->ai_socktype == SOCK_STREAM)
servent = getservbyname(servname, "tcp");
else if (hints->ai_socktype == 0)
servent = getservbyname(servname, "tcp");
else {
result = EAI_SOCKTYPE;
goto end;
}
if (servent == NULL) {
result = EAI_SERVICE;
goto end;
}
port = servent->s_port;
}
} else {
port = htons(0);
}
if (nodename != NULL) {
if (is_address(nodename)) {
addr_buf.s_addr = inet_addr(nodename);
addr_list_buf[0] = &addr_buf;
addr_list_buf[1] = NULL;
addr_list = addr_list_buf;
if (hints->ai_flags & AI_CANONNAME
&& !(hints->ai_flags & AI_NUMERICHOST)) {
hostent = gethostbyaddr((char *)&addr_buf,
sizeof(struct in_addr), AF_INET);
if (hostent != NULL)
canonname = hostent->h_name;
else
canonname = nodename;
}
} else {
if (hints->ai_flags & AI_NUMERICHOST) {
result = EAI_NONAME;
goto end;
}
hostent = gethostbyname(nodename);
if (hostent == NULL) {
switch (h_errno) {
case HOST_NOT_FOUND:
case NO_DATA:
result = EAI_NONAME;
goto end;
case TRY_AGAIN:
result = EAI_AGAIN;
goto end;
default:
result = EAI_FAIL;
goto end;
}
}
addr_list = (struct in_addr **)hostent->h_addr_list;
if (hints->ai_flags & AI_CANONNAME)
canonname = hostent->h_name;
}
} else {
if (hints->ai_flags & AI_PASSIVE)
addr_buf.s_addr = htonl(INADDR_ANY);
else
addr_buf.s_addr = htonl(0x7F000001);
addr_list_buf[0] = &addr_buf;
addr_list_buf[1] = NULL;
addr_list = addr_list_buf;
}
for (ap = addr_list; *ap != NULL; ap++) {
new_res = (struct addrinfo *)malloc(sizeof(struct addrinfo));
if (new_res == NULL) {
if (head_res != NULL)
freeaddrinfo(head_res);
result = EAI_MEMORY;
goto end;
}
new_res->ai_family = PF_INET;
new_res->ai_socktype = hints->ai_socktype;
new_res->ai_protocol = hints->ai_protocol;
new_res->ai_addr = NULL;
new_res->ai_addrlen = sizeof(struct sockaddr_in);
new_res->ai_canonname = NULL;
new_res->ai_next = NULL;
new_res->ai_addr = (struct sockaddr *)
malloc(sizeof(struct sockaddr_in));
if (new_res->ai_addr == NULL) {
free(new_res);
if (head_res != NULL)
freeaddrinfo(head_res);
result = EAI_MEMORY;
goto end;
}
sa_in = (struct sockaddr_in *)new_res->ai_addr;
memset(sa_in, 0, sizeof(struct sockaddr_in));
sa_in->sin_family = PF_INET;
sa_in->sin_port = port;
memcpy(&sa_in->sin_addr, *ap, sizeof(struct in_addr));
if (head_res == NULL)
head_res = new_res;
else
tail_res->ai_next = new_res;
tail_res = new_res;
}
if (canonname != NULL && head_res != NULL) {
head_res->ai_canonname = (char *)malloc(strlen(canonname) + 1);
if (head_res->ai_canonname != NULL)
strcpy(head_res->ai_canonname, canonname);
}
*res = head_res;
end:
h_errno = saved_h_errno;
#ifdef ENABLE_PTHREAD
pthread_mutex_unlock(&gai_mutex);
#endif
return result;
}
/*
* getnameinfo().
*/
int
getnameinfo(sa, salen, node, nodelen, serv, servlen, flags)
const struct sockaddr *sa;
socklen_t salen;
char *node;
socklen_t nodelen;
char *serv;
socklen_t servlen;
int flags;
{
const struct sockaddr_in *sa_in = (const struct sockaddr_in *)sa;
struct hostent *hostent;
struct servent *servent;
char *ntoa_address;
int saved_h_errno;
int result = 0;
#ifdef ENABLE_PTHREAD
pthread_mutex_lock(&gai_mutex);
#endif
saved_h_errno = h_errno;
if (sa_in->sin_family != PF_INET) {
result = EAI_FAMILY;
goto end;
} else if (node == NULL && serv == NULL) {
result = EAI_NONAME;
goto end;
}
if (serv != NULL && servlen > 0) {
if (flags & NI_NUMERICSERV)
servent = NULL;
else if (flags & NI_DGRAM)
servent = getservbyport(sa_in->sin_port, "udp");
else
servent = getservbyport(sa_in->sin_port, "tcp");
if (servent != NULL) {
if (servlen <= strlen(servent->s_name)) {
result = EAI_OVERFLOW;
goto end;
}
strcpy(serv, servent->s_name);
} else {
if (servlen <= itoa_length(ntohs(sa_in->sin_port))) {
result = EAI_OVERFLOW;
goto end;
}
sprintf(serv, "%d", ntohs(sa_in->sin_port));
}
}
if (node != NULL && nodelen > 0) {
if (flags & NI_NUMERICHOST)
hostent = NULL;
else {
hostent = gethostbyaddr((char *)&sa_in->sin_addr,
sizeof(struct in_addr), AF_INET);
}
if (hostent != NULL) {
if (nodelen <= strlen(hostent->h_name)) {
result = EAI_OVERFLOW;
goto end;
}
strcpy(node, hostent->h_name);
} else {
if (flags & NI_NAMEREQD) {
result = EAI_NONAME;
goto end;
}
ntoa_address = inet_ntoa(sa_in->sin_addr);
if (nodelen <= strlen(ntoa_address)) {
result = EAI_OVERFLOW;
goto end;
}
strcpy(node, ntoa_address);
}
}
end:
h_errno = saved_h_errno;
#ifdef ENABLE_PTHREAD
pthread_mutex_unlock(&gai_mutex);
#endif
return result;
}

249
src/getaddrinfo.h Normal file
View File

@ -0,0 +1,249 @@
/*
* Copyright (c) 2001, 02 Motoyuki Kasahara
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef _D_GETADDRINFO_H
#define _D_GETADDRINFO_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif // HAVE_CONFIG_H
#ifdef __MINGW32__
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x501
# endif // _WIN32_WINNT
# include <winsock2.h>
# undef ERROR
# include <ws2tcpip.h>
#endif // __MINGW32__
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif // HAVE_SYS_SOCKET_H
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif // HAVE_NETDB_H
#include <sys/types.h>
/********************************************************************/
/*
* Undefine all the macros.
* <netdb.h> might defines some of them.
*/
#ifdef EAI_ADDRFAMILY
#undef EAI_ADDRFAMILY
#endif
#ifdef EAI_AGAIN
#undef EAI_AGAIN
#endif
#ifdef EAI_BADFLAGS
#undef EAI_BADFLAGS
#endif
#ifdef EAI_FAIL
#undef EAI_FAIL
#endif
#ifdef EAI_FAMILY
#undef EAI_FAMILY
#endif
#ifdef EAI_MEMORY
#undef EAI_MEMORY
#endif
#ifdef EAI_NONAME
#undef EAI_NONAME
#endif
#ifdef EAI_OVERFLOW
#undef EAI_OVERFLOW
#endif
#ifdef EAI_SERVICE
#undef EAI_SERVICE
#endif
#ifdef EAI_SOCKTYPE
#undef EAI_SOCKTYPE
#endif
#ifdef EAI_SYSTEM
#undef EAI_SYSTEM
#endif
#ifdef AI_PASSIVE
#undef AI_PASSIVE
#endif
#ifdef AI_CANONNAME
#undef AI_CANONNAME
#endif
#ifdef AI_NUMERICHOST
#undef AI_NUMERICHOST
#endif
#ifdef AI_NUMERICSERV
#undef AI_NUMERICSERV
#endif
#ifdef AI_V4MAPPED
#undef AI_V4MAPPED
#endif
#ifdef AI_ALL
#undef AI_ALL
#endif
#ifdef AI_ADDRCONFIG
#undef AI_ADDRCONFIG
#endif
#ifdef AI_DEFAULT
#undef AI_DEFAULT
#endif
#ifdef NI_NOFQDN
#undef NI_NOFQDN
#endif
#ifdef NI_NUMERICHOST
#undef NI_NUMERICHOST
#endif
#ifdef NI_NAMEREQD
#undef NI_NAMEREQD
#endif
#ifdef NI_NUMERICSERV
#undef NI_NUMERICSERV
#endif
#ifdef NI_NUMERICSCOPE
#undef NI_NUMERICSCOPE
#endif
#ifdef NI_DGRAM
#undef NI_DGRAM
#endif
#ifdef NI_MAXHOST
#undef NI_MAXHOST
#endif
#ifdef NI_MAXSERV
#undef NI_MAXSERV
#endif
/*
* Fake struct and function names.
* <netdb.h> might declares all or some of them.
*/
#if defined(HAVE_GETADDRINFO) || defined(HAVE_GETNAMEINFO)
#define addrinfo my_addrinfo
#define gai_strerror my_gai_strerror
#define freeaddrinfo my_freeaddrinfo
#define getaddrinfo my_getaddrinfo
#define getnameinfo my_getnameinfo
#endif
/********************************************************************/
/*
* Error codes.
*/
#define EAI_ADDRFAMILY 1
#define EAI_AGAIN 2
#define EAI_BADFLAGS 3
#define EAI_FAIL 4
#define EAI_FAMILY 5
#define EAI_MEMORY 6
#define EAI_NONAME 7
#define EAI_OVERFLOW 8
#define EAI_SERVICE 9
#define EAI_SOCKTYPE 10
#define EAI_SYSTEM 11
/*
* Flags for getaddrinfo().
*/
#define AI_ADDRCONFIG 0x0001
#define AI_ALL 0x0002
#define AI_CANONNAME 0x0004
#define AI_NUMERICHOST 0x0008
#define AI_NUMERICSERV 0x0010
#define AI_PASSIVE 0x0020
#define AI_V4MAPPED 0x0040
#define AI_DEFAULT (AI_V4MAPPED | AI_ADDRCONFIG)
/*
* Flags for getnameinfo().
*/
#define NI_DGRAM 0x0001
#define NI_NAMEREQD 0x0002
#define NI_NOFQDN 0x0004
#define NI_NUMERICHOST 0x0008
#define NI_NUMERICSCOPE 0x0010
#define NI_NUMERICSERV 0x0020
/*
* Maximum length of FQDN and servie name for getnameinfo().
*/
#define NI_MAXHOST 1025
#define NI_MAXSERV 32
/*
* Address families and Protocol families.
*/
#ifndef AF_UNSPEC
#define AF_UNSPEC AF_INET
#endif
#ifndef PF_UNSPEC
#define PF_UNSPEC PF_INET
#endif
/*
* struct addrinfo.
*/
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
char *ai_canonname;
struct sockaddr *ai_addr;
struct addrinfo *ai_next;
};
/*
* Functions.
*/
#ifdef __STDC__
const char *gai_strerror(int);
void freeaddrinfo(struct addrinfo *);
int getaddrinfo(const char *, const char *, const struct addrinfo *,
struct addrinfo **);
int getnameinfo(const struct sockaddr *, socklen_t, char *,
socklen_t, char *, socklen_t, int);
#else
const char *gai_strerror();
void freeaddrinfo();
int getaddrinfo();
int getnameinfo();
#endif
#ifdef __cplusplus
};
#endif /* __cplusplus */
#endif /* not _D_GETADDRINFO_H */

69
src/inet_aton.c Normal file
View File

@ -0,0 +1,69 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif // HAVE_CONFIG_H
#ifdef __MINGW32__
# define _WIN32_WINNT 0x501
# include <winsock2.h>
# undef ERROR
# include <ws2tcpip.h>
#endif // __MINGW32__
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif // HAVE_NETDB_H
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif // HAVE_SYS_SOCKET_H
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif // HAVE_NETINET_IN_H
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif // HAVE_ARPA_INET_H
#include <string.h>
int inet_aton(const char *cp, struct in_addr *inp) {
unsigned long res = inet_addr(cp);
if (res == INADDR_NONE && strcmp(cp, "255.255.255.255"))
return 0;
if (inp)
inp->s_addr = res;
return 1;
}

75
src/inet_aton.h Normal file
View File

@ -0,0 +1,75 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_INET_ATON_H
#define _D_INET_ATON_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif // HAVE_CONFIG_H
#ifdef __MINGW32__
# ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x501
# endif // _WIN32_WINNT
# include <winsock2.h>
# undef ERROR
# include <ws2tcpip.h>
#endif // __MINGW32__
#ifdef HAVE_NETDB_H
# include <netdb.h>
#endif // HAVE_NETDB_H
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif // HAVE_SYS_SOCKET_H
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif // HAVE_NETINET_IN_H
#ifdef HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif // HAVE_ARPA_INET_H
int inet_aton(const char *cp, struct in_addr *inp);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* not _D_INET_ATON_H */

89
src/libgen.c Normal file
View File

@ -0,0 +1,89 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include <stdio.h>
#include <string.h>
#include <libgen.h>
#if defined(__CYGWIN__) || defined(__DJGPP__) || defined(__MINGW32__)
# define IS_PATH_SEPARATOR(c) (((c) == '/') || ((c) == '\\'))
#else
# define IS_PATH_SEPARATOR(c) ((c) == '/')
#endif
/* per http://www.scit.wlv.ac.uk/cgi-bin/mansec?3C+basename */
char* basename(char* s) {
char* rv;
if (!s || !*s)
return ".";
rv = s + strlen(s) - 1;
do {
if (IS_PATH_SEPARATOR(*rv))
return rv + 1;
--rv;
} while (rv >= s);
return s;
}
/* per http://www.scit.wlv.ac.uk/cgi-bin/mansec?3C+dirname */
char* dirname(char* path) {
char *p;
if (path == NULL || *path == '\0')
return ".";
p = path + strlen(path) - 1;
while (IS_PATH_SEPARATOR(*p)) {
if (p == path)
return path;
*p-- = '\0';
}
while (p >= path && !IS_PATH_SEPARATOR(*p))
p--;
if (p < path)
return ".";
if (p == path)
return "/";
*p = '\0';
return path;
}

60
src/libgen.h Normal file
View File

@ -0,0 +1,60 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2006 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_LIBGEN_H
#define _D_LIBGEN_H 1
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef __MINGW32__
char *basename (char *path);
char *dirname (char *path);
#else
char *basename (const char *path);
char *dirname (const char *path);
#endif // __MINGW32__
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* not _D_LIBGEN_H */

61
src/localtime_r.c Normal file
View File

@ -0,0 +1,61 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2007 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#include <time.h>
#ifdef __MINGW32__
#include <windows.h>
#endif // __MINGW32__
#include "localtime_r.h"
struct tm * localtime_r(const time_t *clock, struct tm *result)
{
static struct tm *local_tm;
#ifdef __MINGW32__
static CRITICAL_SECTION cs;
static int initialized = 0;
if (!initialized) {
++initialized;
InitializeCriticalSection(&cs);
}
EnterCriticalSection(&cs);
local_tm = localtime(clock);
memcpy(result, local_tm, sizeof(struct tm));
LeaveCriticalSection(&cs);
#endif // __MINGW32__
return result;
};

51
src/localtime_r.h Normal file
View File

@ -0,0 +1,51 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2007 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_LOCALTIME_R_H
#define _D_LOCALTIME_R_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <time.h>
struct tm * localtime_r(const time_t *clock, struct tm *result);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* not _D_LOCALTIME_R_H */

View File

@ -54,6 +54,8 @@
#include "CookieBoxFactory.h"
#include "a2algo.h"
#include "message.h"
#include "a2io.h"
#include "Platform.h"
#include <deque>
#include <algorithm>
#include <time.h>
@ -124,7 +126,9 @@ void showUsage() {
cout << _(" -o, --out=FILE The file name for downloaded file.") << endl;
cout << _(" -l, --log=LOG The file path to store log. If '-' is specified,\n"
" log is written to stdout.") << endl;
#ifdef HAVE_DAEMON
cout << _(" -D, --daemon Run as daemon.") << endl;
#endif // HAVE_DAEMON
cout << _(" -s, --split=N Download a file using N connections. N must be\n"
" between 1 and 5. This option affects all URLs.\n"
" Thus, aria2 connects to each URL with\n"
@ -323,6 +327,10 @@ void showUsage() {
}
int main(int argc, char* argv[]) {
#ifdef HAVE_WINSOCK2_H
Platform platform;
#endif // HAVE_WINSOCK2_H
#ifdef ENABLE_NLS
setlocale (LC_CTYPE, "");
setlocale (LC_MESSAGES, "");
@ -388,7 +396,9 @@ int main(int argc, char* argv[]) {
int32_t optIndex = 0;
int32_t lopt;
static struct option longOpts[] = {
#ifdef HAVE_DAEMON
{ "daemon", no_argument, NULL, 'D' },
#endif // HAVE_DAEMON
{ "dir", required_argument, NULL, 'd' },
{ "out", required_argument, NULL, 'o' },
{ "log", required_argument, NULL, 'l' },
@ -565,9 +575,11 @@ int main(int argc, char* argv[]) {
}
break;
}
#ifdef HAVE_DAEMON
case 'D':
cmdstream << PREF_DAEMON << "=" << V_TRUE << "\n";
break;
#endif // HAVE_DAEMON
case 'd':
cmdstream << PREF_DIR << "=" << optarg << "\n";
break;
@ -670,12 +682,14 @@ int main(int argc, char* argv[]) {
exit(EXIT_FAILURE);
}
}
#ifdef HAVE_DAEMON
if(op->getAsBool(PREF_DAEMON)) {
if(daemon(1, 1) < 0) {
perror(MSG_DAEMON_FAILED);
exit(EXIT_FAILURE);
}
}
#endif // HAVE_DAEMON
Strings args(argv+optind, argv+argc);
#ifdef HAVE_LIBSSL
@ -693,11 +707,11 @@ int main(int argc, char* argv[]) {
BitfieldManFactory::setDefaultRandomizer(SimpleRandomizer::getInstance());
FileAllocationMonitorFactory::setFactory(new ConsoleFileAllocationMonitorFactory());
if(op->getAsBool(PREF_STDOUT_LOG)) {
LogFactory::setLogFile("/dev/stdout");
LogFactory::setLogFile(DEV_STDOUT);
} else if(op->get(PREF_LOG).size()) {
LogFactory::setLogFile(op->get(PREF_LOG));
} else {
LogFactory::setLogFile("/dev/null");
LogFactory::setLogFile(DEV_NULL);
}
int32_t exitStatus = EXIT_SUCCESS;
try {
@ -736,8 +750,9 @@ int main(int argc, char* argv[]) {
RequestFactorySingletonHolder::instance(requestFactory);
CUIDCounterHandle cuidCounter = new CUIDCounter();
CUIDCounterSingletonHolder::instance(cuidCounter);
#ifdef SIGPIPE
Util::setGlobalSignalHandler(SIGPIPE, SIG_IGN, 0);
#endif
RequestInfo* firstReqInfo;
#ifdef ENABLE_BITTORRENT

View File

@ -111,7 +111,7 @@
#define MSG_DOWNLOAD_COMPLETED _("The download was complete.")
#define MSG_REMOVED_HAVE_ENTRY _("Removed %d have entries.")
#define MSG_VALIDATING_FILE _("Validating file %s")
#define MSG_ALLOCATION_COMPLETED _("%d seconds to allocate %lld byte(s)")
#define MSG_ALLOCATION_COMPLETED _("%d seconds to allocate %s byte(s)")
#define MSG_FILE_ALLOCATION_DISPATCH _("Dispatching FileAllocationCommand for CUID#%d.")
#define MSG_METALINK_QUEUEING _("Metalink: Queueing %s for download.")
#define MSG_FILE_DOWNLOAD_COMPLETED _("Download complete: %s")
@ -136,10 +136,10 @@
#define EX_CONNECTION_FAILED _("Connection failed.")
#define EX_FILENAME_MISMATCH _("The requested filename and the previously registered one are not same. Expected:%s Actual:%s")
#define EX_BAD_STATUS _("The response status is not successful. status=%d")
#define EX_TOO_LARGE_FILE _("Too large file size. size=%lld")
#define EX_TOO_LARGE_FILE _("Too large file size. size=%s")
#define EX_TRANSFER_ENCODING_NOT_SUPPORTED _("Transfer encoding %s is not supported.")
#define EX_SSL_INIT_FAILURE _("SSL initialization failed.")
#define EX_SIZE_MISMATCH _("Size mismatch Expected:%lld Actual:%lld")
#define EX_SIZE_MISMATCH _("Size mismatch Expected:%s Actual:%s")
#define EX_AUTH_FAILED _("Authorization failed.")
#define EX_GOT_EOF _("Got EOF from the server.")
#define EX_EOF_FROM_PEER _("Got EOF from peer.")
@ -151,7 +151,7 @@
#define EX_DATA_READ _("Failed to read data from disk.")
#define EX_FILE_SHA1SUM _("Failed to calculate SHA1 digest of or a part of the file %s, cause: %s")
#define EX_FILE_SEEK _("Failed to seek the file %s, cause: %s")
#define EX_FILE_OFFSET_OUT_OF_RANGE _("The offset is out of range, offset=%lld")
#define EX_FILE_OFFSET_OUT_OF_RANGE _("The offset is out of range, offset=%s")
#define EX_NOT_DIRECTORY _("%s is not a directory.")
#define EX_MAKE_DIR _("Failed to make the directory %s, cause: %s")
#define EX_SEGMENT_FILE_OPEN _("Failed to open the segment file %s, cause: %s")
@ -175,7 +175,7 @@
#define EX_FILE_ALREADY_EXISTS _("File %s exists, but %s does not exist.")
#define EX_INVALID_PAYLOAD_SIZE _("Invalid payload size for %s, size=%d. It should be %d.")
#define EX_INVALID_BT_MESSAGE_ID _("Invalid ID=%d for %s. It should be %d.")
#define EX_INVALID_CHUNK_CHECKSUM _("Chunk checksum validation failed. checksumIndex=%d, offset=%lld, expectedHash=%s, actualHash=%s")
#define EX_INVALID_CHUNK_CHECKSUM _("Chunk checksum validation failed. checksumIndex=%d, offset=%s, expectedHash=%s, actualHash=%s")
#define EX_DOWNLOAD_ABORTED _("Download aborted.")
#define EX_DUPLICATE_FILE_DOWNLOAD _("File %s is being downloaded by other command.")
#define EX_INSUFFICIENT_CHECKSUM _("Insufficient checksums.")
@ -187,7 +187,7 @@
#define EX_TOO_SLOW_DOWNLOAD_SPEED _("Too slow Downloading speed: %d <= %d(B/s), host:%s")
#define EX_NO_HTTP_REQUEST_ENTRY_FOUND _("No HttpRequestEntry found.")
#define EX_LOCATION_HEADER_REQUIRED _("Got %d status, but no location header provided.")
#define EX_INVALID_RANGE_HEADER _("Invalid range header. Request: %lld-%lld/%lld, Response: %lld-%lld/%lld")
#define EX_INVALID_RANGE_HEADER _("Invalid range header. Request: %s-%s/%s, Response: %s-%s/%s")
#define EX_NO_RESULT_WITH_YOUR_PREFS _("No file matched with your preference.")
#define EX_EXCEPTION_CAUGHT _("Exception caught")
#define EX_TOO_LONG_PAYLOAD _("Max payload length exceeded or invalid. length = %d")

View File

@ -40,8 +40,11 @@
/**
* Constants
*/
#undef V_TRUE
#define V_TRUE "true"
#undef V_FALSE
#define V_FALSE "false"
#undef V_NONE
#define V_NONE "none"
/**

443
src/strptime.c Normal file
View File

@ -0,0 +1,443 @@
/*
* Copyright (c) 1999 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name of KTH nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
#include <stddef.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "strptime.h"
static const char *abb_weekdays[] = {
"Sun",
"Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat",
NULL
};
static const char *full_weekdays[] = {
"Sunday",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
NULL
};
static const char *abb_month[] = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
NULL
};
static const char *full_month[] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
NULL,
};
static const char *ampm[] = {
"am",
"pm",
NULL
};
/*
* tm_year is relative this year
*/
const int tm_year_base = 1900;
/*
* Return TRUE iff `year' was a leap year.
* Needed for strptime.
*/
static int
is_leap_year (int year)
{
return (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0);
}
/* Needed for strptime. */
static int
match_string (const char **buf, const char **strs)
{
int i = 0;
for (i = 0; strs[i] != NULL; ++i) {
int len = strlen (strs[i]);
if (strncasecmp (*buf, strs[i], len) == 0) {
*buf += len;
return i;
}
}
return -1;
}
/* Needed for strptime. */
static int
first_day (int year)
{
int ret = 4;
for (; year > 1970; --year)
ret = (ret + 365 + is_leap_year (year) ? 1 : 0) % 7;
return ret;
}
/*
* Set `timeptr' given `wnum' (week number [0, 53])
* Needed for strptime
*/
static void
set_week_number_sun (struct tm *timeptr, int wnum)
{
int fday = first_day (timeptr->tm_year + tm_year_base);
timeptr->tm_yday = wnum * 7 + timeptr->tm_wday - fday;
if (timeptr->tm_yday < 0) {
timeptr->tm_wday = fday;
timeptr->tm_yday = 0;
}
}
/*
* Set `timeptr' given `wnum' (week number [0, 53])
* Needed for strptime
*/
static void
set_week_number_mon (struct tm *timeptr, int wnum)
{
int fday = (first_day (timeptr->tm_year + tm_year_base) + 6) % 7;
timeptr->tm_yday = wnum * 7 + (timeptr->tm_wday + 6) % 7 - fday;
if (timeptr->tm_yday < 0) {
timeptr->tm_wday = (fday + 1) % 7;
timeptr->tm_yday = 0;
}
}
/*
* Set `timeptr' given `wnum' (week number [0, 53])
* Needed for strptime
*/
static void
set_week_number_mon4 (struct tm *timeptr, int wnum)
{
int fday = (first_day (timeptr->tm_year + tm_year_base) + 6) % 7;
int offset = 0;
if (fday < 4)
offset += 7;
timeptr->tm_yday = offset + (wnum - 1) * 7 + timeptr->tm_wday - fday;
if (timeptr->tm_yday < 0) {
timeptr->tm_wday = fday;
timeptr->tm_yday = 0;
}
}
/* strptime: roken */
//extern "C"
char *
strptime (const char *buf, const char *format, struct tm *timeptr)
{
char c;
for (; (c = *format) != '\0'; ++format) {
char *s;
int ret;
if (isspace (c)) {
while (isspace (*buf))
++buf;
} else if (c == '%' && format[1] != '\0') {
c = *++format;
if (c == 'E' || c == 'O')
c = *++format;
switch (c) {
case 'A' :
ret = match_string (&buf, full_weekdays);
if (ret < 0)
return NULL;
timeptr->tm_wday = ret;
break;
case 'a' :
ret = match_string (&buf, abb_weekdays);
if (ret < 0)
return NULL;
timeptr->tm_wday = ret;
break;
case 'B' :
ret = match_string (&buf, full_month);
if (ret < 0)
return NULL;
timeptr->tm_mon = ret;
break;
case 'b' :
case 'h' :
ret = match_string (&buf, abb_month);
if (ret < 0)
return NULL;
timeptr->tm_mon = ret;
break;
case 'C' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_year = (ret * 100) - tm_year_base;
buf = s;
break;
case 'c' : /* %a %b %e %H:%M:%S %Y */
s = strptime (buf, "%a %b %e %H:%M:%S %Y", timeptr);
if (s == NULL)
return NULL;
buf = s;
break;
case 'D' : /* %m/%d/%y */
s = strptime (buf, "%m/%d/%y", timeptr);
if (s == NULL)
return NULL;
buf = s;
break;
case 'd' :
case 'e' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_mday = ret;
buf = s;
break;
case 'H' :
case 'k' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_hour = ret;
buf = s;
break;
case 'I' :
case 'l' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
if (ret == 12)
timeptr->tm_hour = 0;
else
timeptr->tm_hour = ret;
buf = s;
break;
case 'j' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_yday = ret - 1;
buf = s;
break;
case 'm' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_mon = ret - 1;
buf = s;
break;
case 'M' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_min = ret;
buf = s;
break;
case 'n' :
if (*buf == '\n')
++buf;
else
return NULL;
break;
case 'p' :
ret = match_string (&buf, ampm);
if (ret < 0)
return NULL;
if (timeptr->tm_hour == 0) {
if (ret == 1)
timeptr->tm_hour = 12;
} else
timeptr->tm_hour += 12;
break;
case 'r' : /* %I:%M:%S %p */
s = strptime (buf, "%I:%M:%S %p", timeptr);
if (s == NULL)
return NULL;
buf = s;
break;
case 'R' : /* %H:%M */
s = strptime (buf, "%H:%M", timeptr);
if (s == NULL)
return NULL;
buf = s;
break;
case 'S' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_sec = ret;
buf = s;
break;
case 't' :
if (*buf == '\t')
++buf;
else
return NULL;
break;
case 'T' : /* %H:%M:%S */
case 'X' :
s = strptime (buf, "%H:%M:%S", timeptr);
if (s == NULL)
return NULL;
buf = s;
break;
case 'u' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_wday = ret - 1;
buf = s;
break;
case 'w' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_wday = ret;
buf = s;
break;
case 'U' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
set_week_number_sun (timeptr, ret);
buf = s;
break;
case 'V' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
set_week_number_mon4 (timeptr, ret);
buf = s;
break;
case 'W' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
set_week_number_mon (timeptr, ret);
buf = s;
break;
case 'x' :
s = strptime (buf, "%Y:%m:%d", timeptr);
if (s == NULL)
return NULL;
buf = s;
break;
case 'y' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
if (ret < 70)
timeptr->tm_year = 100 + ret;
else
timeptr->tm_year = ret;
buf = s;
break;
case 'Y' :
ret = strtol (buf, &s, 10);
if (s == buf)
return NULL;
timeptr->tm_year = ret - tm_year_base;
buf = s;
break;
case 'Z' :
/* Unsupported. Just ignore. */
break;
case '\0' :
--format;
/* FALLTHROUGH */
case '%' :
if (*buf == '%')
++buf;
else
return NULL;
break;
default :
if (*buf == '%' || *++buf == c)
++buf;
else
return NULL;
break;
}
} else {
if (*buf == c)
++buf;
else
return NULL;
}
}
return (char *)buf;
}

51
src/strptime.h Normal file
View File

@ -0,0 +1,51 @@
/* <!-- copyright */
/*
* aria2 - The high speed download utility
*
* Copyright (C) 2007 Tatsuhiro Tsujikawa
*
* 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
*
* In addition, as a special exception, the copyright holders give
* permission to link the code of portions of this program with the
* OpenSSL library under certain conditions as described in each
* individual source file, and distribute linked combinations
* including the two.
* You must obey the GNU General Public License in all respects
* for all of the code used other than OpenSSL. If you modify
* file(s) with this exception, you may extend this exception to your
* version of the file(s), but you are not obligated to do so. If you
* do not wish to do so, delete this exception statement from your
* version. If you delete this exception statement from all source
* files in the program, then also delete it here.
*/
/* copyright --> */
#ifndef _D_STRPTIME_H
#define _D_STRPTIME_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include <time.h>
char * strptime (const char *buf, const char *format, struct tm *timeptr);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* not _D_STRPTIME_H */

View File

@ -19,6 +19,11 @@ public:
return RAND_MAX;
}
virtual long int getRandomNumber(long int to)
{
return getRandomNumber();
}
void setFixedNumber(int32_t num) {
this->fixedNumber = num;
}

View File

@ -35,6 +35,7 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
target_triplet = @target@
check_PROGRAMS = $(am__EXEEXT_1)
subdir = test
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
@ -168,6 +169,16 @@ GENCAT = @GENCAT@
GLIBC21 = @GLIBC21@
GMSGFMT = @GMSGFMT@
GREP = @GREP@
HAVE_BASENAME_FALSE = @HAVE_BASENAME_FALSE@
HAVE_BASENAME_TRUE = @HAVE_BASENAME_TRUE@
HAVE_GETADDRINFO_FALSE = @HAVE_GETADDRINFO_FALSE@
HAVE_GETADDRINFO_TRUE = @HAVE_GETADDRINFO_TRUE@
HAVE_INET_ATON_FALSE = @HAVE_INET_ATON_FALSE@
HAVE_INET_ATON_TRUE = @HAVE_INET_ATON_TRUE@
HAVE_LOCALTIME_R_FALSE = @HAVE_LOCALTIME_R_FALSE@
HAVE_LOCALTIME_R_TRUE = @HAVE_LOCALTIME_R_TRUE@
HAVE_STRPTIME_FALSE = @HAVE_STRPTIME_FALSE@
HAVE_STRPTIME_TRUE = @HAVE_STRPTIME_TRUE@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
@ -217,6 +228,7 @@ STRIP = @STRIP@
USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WINSOCK_LIBS = @WINSOCK_LIBS@
XGETTEXT = @XGETTEXT@
XML2_CONFIG = @XML2_CONFIG@
XML_CPPFLAGS = @XML_CPPFLAGS@
@ -268,7 +280,11 @@ psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target = @target@
target_alias = @target_alias@
target_cpu = @target_cpu@
target_os = @target_os@
target_vendor = @target_vendor@
TESTS = aria2c
aria2c_SOURCES = AllTest.cc\
FileUriListParserTest.cc\