mirror of https://github.com/aria2/aria2
				
				
				
			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
			
			
		
							parent
							
								
									6574e44f88
								
							
						
					
					
						commit
						380e3f0187
					
				
							
								
								
									
										40
									
								
								ChangeLog
								
								
								
								
							
							
						
						
									
										40
									
								
								ChangeLog
								
								
								
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								Makefile.in
								
								
								
								
							
							
						
						
									
										16
									
								
								Makefile.in
								
								
								
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								TODO
								
								
								
								
							
							
						
						
									
										16
									
								
								TODO
								
								
								
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
* 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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										51
									
								
								config.h.in
								
								
								
								
							
							
						
						
									
										51
									
								
								config.h.in
								
								
								
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										37
									
								
								configure.ac
								
								
								
								
							
							
						
						
									
										37
									
								
								configure.ac
								
								
								
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
  }  
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										11
									
								
								src/File.cc
								
								
								
								
							
							
						
						
									
										11
									
								
								src/File.cc
								
								
								
								
							| 
						 | 
				
			
			@ -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();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -94,6 +94,8 @@ public:
 | 
			
		|||
  string getBasename() const;
 | 
			
		||||
 | 
			
		||||
  string getDirname() const;
 | 
			
		||||
 | 
			
		||||
  static bool isDir(const string& filename);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // _D_FILE_H_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,8 +44,6 @@
 | 
			
		|||
#include "Logger.h"
 | 
			
		||||
#include "HttpResponse.h"
 | 
			
		||||
#include "HttpHeaderProcessor.h"
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
class HttpRequestEntry {
 | 
			
		||||
private:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,7 +40,6 @@
 | 
			
		|||
#include "Range.h"
 | 
			
		||||
#include "Request.h"
 | 
			
		||||
#include "Option.h"
 | 
			
		||||
#include <netinet/in.h>
 | 
			
		||||
 | 
			
		||||
class HttpRequest {
 | 
			
		||||
private:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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());
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 $@ $<; \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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_
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										51
									
								
								src/Util.cc
								
								
								
								
							
							
						
						
									
										51
									
								
								src/Util.cc
								
								
								
								
							| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_
 | 
			
		||||
| 
						 | 
				
			
			@ -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_
 | 
			
		||||
							
								
								
									
										19
									
								
								src/common.h
								
								
								
								
							
							
						
						
									
										19
									
								
								src/common.h
								
								
								
								
							| 
						 | 
				
			
			@ -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_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
							
								
								
									
										21
									
								
								src/main.cc
								
								
								
								
							
							
						
						
									
										21
									
								
								src/main.cc
								
								
								
								
							| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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\
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue