diff options
author | Frans Meulenbroeks <fransmeulenbroeks@yahoo.com> | 2006-06-28 17:49:32 +0000 |
---|---|---|
committer | OpenEmbedded Project <openembedded-devel@lists.openembedded.org> | 2006-06-28 17:49:32 +0000 |
commit | bb7cd179d391d9ebc2c4f1a4a7b6de0cf68a08ec (patch) | |
tree | d187a2e4fe9692c0f4dc4938cac2535d4d9d62ea | |
parent | 6ee41b771288404380e3e3f88828b61328822be6 (diff) |
ctorrent: updated with the latest patches from www.rahul.net
-rw-r--r-- | packages/ctorrent/ctorrent.inc | 3 | ||||
-rw-r--r-- | packages/ctorrent/ctorrent_1.3.4.bb | 2 | ||||
-rw-r--r-- | packages/ctorrent/files/extended_ctorrent.diff | 14406 |
3 files changed, 13844 insertions, 567 deletions
diff --git a/packages/ctorrent/ctorrent.inc b/packages/ctorrent/ctorrent.inc index 67f270c0ba..a6a2f8bc35 100644 --- a/packages/ctorrent/ctorrent.inc +++ b/packages/ctorrent/ctorrent.inc @@ -1,5 +1,6 @@ DESCRIPTION = "CTorrent is a console BitTorrent client written in the C \ -programming language." +programming language. This version is with the extensions from \ +http://www.rahul.net/dholmes/ctorrent/ (dnh2 + vfat patch)" DEPENDS = "openssl" LICENSE = "GPL" SECTION = "network" diff --git a/packages/ctorrent/ctorrent_1.3.4.bb b/packages/ctorrent/ctorrent_1.3.4.bb index d2b02e8748..561bd0d432 100644 --- a/packages/ctorrent/ctorrent_1.3.4.bb +++ b/packages/ctorrent/ctorrent_1.3.4.bb @@ -1,4 +1,4 @@ include ctorrent.inc -PR = "r5" +PR = "r6" SRC_URI += "file://extended_ctorrent.diff;patch=1" diff --git a/packages/ctorrent/files/extended_ctorrent.diff b/packages/ctorrent/files/extended_ctorrent.diff index d35c434d07..ca016fe037 100644 --- a/packages/ctorrent/files/extended_ctorrent.diff +++ b/packages/ctorrent/files/extended_ctorrent.diff @@ -1,17 +1,1531 @@ -Only in ctorrent-1.3.4: README-DNH.TXT -diff -u ctorrent-1.3.4.orig/btconfig.cpp ctorrent-1.3.4/btconfig.cpp ---- ctorrent-1.3.4.orig/btconfig.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btconfig.cpp 2005-08-11 23:45:29.424694440 +0200 -@@ -1,6 +1,7 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/aclocal.m4 ctorrent-1.3.4/aclocal.m4 +--- ctorrent-1.3.4.sav/aclocal.m4 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/aclocal.m4 2006-06-28 19:30:02.000000000 +0200 +@@ -1,6 +1,6 @@ +-# generated automatically by aclocal 1.7.6 -*- Autoconf -*- ++# generated automatically by aclocal 1.9.1 -*- Autoconf -*- + +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 + # Free Software Foundation, Inc. + # This file is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, +@@ -11,132 +11,9 @@ + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + +-# Do all the work for Automake. -*- Autoconf -*- +- +-# This macro actually does too much some checks are only needed if +-# your package does certain things. But this isn't really a big deal. +- +-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +-# Free Software Foundation, Inc. +- +-# 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, 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., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-# serial 10 +- +-AC_PREREQ([2.54]) +- +-# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow +-# the ones we care about. +-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +- +-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +-# AM_INIT_AUTOMAKE([OPTIONS]) +-# ----------------------------------------------- +-# The call with PACKAGE and VERSION arguments is the old style +-# call (pre autoconf-2.50), which is being phased out. PACKAGE +-# and VERSION should now be passed to AC_INIT and removed from +-# the call to AM_INIT_AUTOMAKE. +-# We support both call styles for the transition. After +-# the next Automake release, Autoconf can make the AC_INIT +-# arguments mandatory, and then we can depend on a new Autoconf +-# release and drop the old call support. +-AC_DEFUN([AM_INIT_AUTOMAKE], +-[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +- AC_REQUIRE([AC_PROG_INSTALL])dnl +-# test to see if srcdir already configured +-if test "`cd $srcdir && pwd`" != "`pwd`" && +- test -f $srcdir/config.status; then +- AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +-fi +- +-# test whether we have cygpath +-if test -z "$CYGPATH_W"; then +- if (cygpath --version) >/dev/null 2>/dev/null; then +- CYGPATH_W='cygpath -w' +- else +- CYGPATH_W=echo +- fi +-fi +-AC_SUBST([CYGPATH_W]) +- +-# Define the identity of the package. +-dnl Distinguish between old-style and new-style calls. +-m4_ifval([$2], +-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl +- AC_SUBST([PACKAGE], [$1])dnl +- AC_SUBST([VERSION], [$2])], +-[_AM_SET_OPTIONS([$1])dnl +- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl +- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl +- +-_AM_IF_OPTION([no-define],, +-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) +- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl +- +-# Some tools Automake needs. +-AC_REQUIRE([AM_SANITY_CHECK])dnl +-AC_REQUIRE([AC_ARG_PROGRAM])dnl +-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +-AM_MISSING_PROG(AUTOCONF, autoconf) +-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +-AM_MISSING_PROG(AUTOHEADER, autoheader) +-AM_MISSING_PROG(MAKEINFO, makeinfo) +-AM_MISSING_PROG(AMTAR, tar) +-AM_PROG_INSTALL_SH +-AM_PROG_INSTALL_STRIP +-# We need awk for the "check" target. The system "awk" is bad on +-# some platforms. +-AC_REQUIRE([AC_PROG_AWK])dnl +-AC_REQUIRE([AC_PROG_MAKE_SET])dnl +-AC_REQUIRE([AM_SET_LEADING_DOT])dnl +- +-_AM_IF_OPTION([no-dependencies],, +-[AC_PROVIDE_IFELSE([AC_PROG_CC], +- [_AM_DEPENDENCIES(CC)], +- [define([AC_PROG_CC], +- defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +-AC_PROVIDE_IFELSE([AC_PROG_CXX], +- [_AM_DEPENDENCIES(CXX)], +- [define([AC_PROG_CXX], +- defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +-]) +-]) +- +- +-# When config.status generates a header, we must update the stamp-h file. +-# This file resides in the same directory as the config header +-# that is generated. The stamp files are numbered to have different names. +- +-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +-# loop where config.status creates the headers, so we can generate +-# our stamp files there. +-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +-[# Compute $1's index in $config_headers. +-_am_stamp_count=1 +-for _am_header in $config_headers :; do +- case $_am_header in +- $1 | $1:* ) +- break ;; +- * ) +- _am_stamp_count=`expr $_am_stamp_count + 1` ;; +- esac +-done +-echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) +- +-# Copyright 2002 Free Software Foundation, Inc. ++# -*- Autoconf -*- ++# Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++# Generated from amversion.in; do not edit by hand. + + # 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 +@@ -156,18 +33,18 @@ + # ---------------------------- + # Automake X.Y traces this macro to ensure aclocal.m4 has been + # generated from the m4 files accompanying Automake X.Y. +-AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) ++AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) + + # AM_SET_CURRENT_AUTOMAKE_VERSION + # ------------------------------- + # Call AM_AUTOMAKE_VERSION so it can be traced. + # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. + AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +- [AM_AUTOMAKE_VERSION([1.7.6])]) ++ [AM_AUTOMAKE_VERSION([1.9.1])]) + +-# Helper functions for option handling. -*- Autoconf -*- ++# AM_AUX_DIR_EXPAND + +-# Copyright 2001, 2002 Free Software Foundation, Inc. ++# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + + # 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 +@@ -184,36 +61,54 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + # 02111-1307, USA. + +-# serial 2 +- +-# _AM_MANGLE_OPTION(NAME) +-# ----------------------- +-AC_DEFUN([_AM_MANGLE_OPTION], +-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) +- +-# _AM_SET_OPTION(NAME) +-# ------------------------------ +-# Set option NAME. Presently that only means defining a flag for this option. +-AC_DEFUN([_AM_SET_OPTION], +-[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) +- +-# _AM_SET_OPTIONS(OPTIONS) +-# ---------------------------------- +-# OPTIONS is a space-separated list of Automake options. +-AC_DEFUN([_AM_SET_OPTIONS], +-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) +- +-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +-# ------------------------------------------- +-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +-AC_DEFUN([_AM_IF_OPTION], +-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) +- ++# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets ++# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to ++# `$srcdir', `$srcdir/..', or `$srcdir/../..'. + # +-# Check to make sure that the build environment is sane. ++# Of course, Automake must honor this variable whenever it calls a ++# tool from the auxiliary directory. The problem is that $srcdir (and ++# therefore $ac_aux_dir as well) can be either absolute or relative, ++# depending on how configure is run. This is pretty annoying, since ++# it makes $ac_aux_dir quite unusable in subdirectories: in the top ++# source directory, any form will work fine, but in subdirectories a ++# relative path needs to be adjusted first. ++# ++# $ac_aux_dir/missing ++# fails when called from a subdirectory if $ac_aux_dir is relative ++# $top_srcdir/$ac_aux_dir/missing ++# fails if $ac_aux_dir is absolute, ++# fails when called from a subdirectory in a VPATH build with ++# a relative $ac_aux_dir ++# ++# The reason of the latter failure is that $top_srcdir and $ac_aux_dir ++# are both prefixed by $srcdir. In an in-source build this is usually ++# harmless because $srcdir is `.', but things will broke when you ++# start a VPATH build or use an absolute $srcdir. ++# ++# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, ++# iff we strip the leading $srcdir from $ac_aux_dir. That would be: ++# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` ++# and then we would define $MISSING as ++# MISSING="\${SHELL} $am_aux_dir/missing" ++# This will work as long as MISSING is not called from configure, because ++# unfortunately $(top_srcdir) has no meaning in configure. ++# However there are other variables, like CC, which are often used in ++# configure, and could therefore not use this "fixed" $ac_aux_dir. + # ++# Another solution, used here, is to always expand $ac_aux_dir to an ++# absolute PATH. The drawback is that using absolute paths prevent a ++# configured tree to be moved without reconfiguration. ++ ++AC_DEFUN([AM_AUX_DIR_EXPAND], ++[dnl Rely on autoconf to set up CDPATH properly. ++AC_PREREQ([2.50])dnl ++# expand $ac_aux_dir to an absolute path ++am_aux_dir=`cd $ac_aux_dir && pwd` ++]) + +-# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. ++# AM_CONDITIONAL -*- Autoconf -*- ++ ++# Copyright (C) 1997, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. + + # 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 +@@ -230,53 +125,34 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + # 02111-1307, USA. + +-# serial 3 +- +-# AM_SANITY_CHECK +-# --------------- +-AC_DEFUN([AM_SANITY_CHECK], +-[AC_MSG_CHECKING([whether build environment is sane]) +-# Just in case +-sleep 1 +-echo timestamp > conftest.file +-# Do `set' in a subshell so we don't clobber the current shell's +-# arguments. Must try -L first in case configure is actually a +-# symlink; some systems play weird games with the mod time of symlinks +-# (eg FreeBSD returns the mod time of the symlink's containing +-# directory). +-if ( +- set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` +- if test "$[*]" = "X"; then +- # -L didn't work. +- set X `ls -t $srcdir/configure conftest.file` +- fi +- rm -f conftest.file +- if test "$[*]" != "X $srcdir/configure conftest.file" \ +- && test "$[*]" != "X conftest.file $srcdir/configure"; then +- +- # If neither matched, then we have a broken ls. This can happen +- # if, for instance, CONFIG_SHELL is bash and it inherits a +- # broken ls alias from the environment. This has actually +- # happened. Such a system could not be considered "sane". +- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +-alias in your environment]) +- fi ++# serial 6 + +- test "$[2]" = conftest.file +- ) +-then +- # Ok. +- : ++# AM_CONDITIONAL(NAME, SHELL-CONDITION) ++# ------------------------------------- ++# Define a conditional. ++AC_DEFUN([AM_CONDITIONAL], ++[AC_PREREQ(2.52)dnl ++ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], ++ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl ++AC_SUBST([$1_TRUE]) ++AC_SUBST([$1_FALSE]) ++if $2; then ++ $1_TRUE= ++ $1_FALSE='#' + else +- AC_MSG_ERROR([newly created file is older than distributed files! +-Check your system clock]) ++ $1_TRUE='#' ++ $1_FALSE= + fi +-AC_MSG_RESULT(yes)]) +- +-# -*- Autoconf -*- ++AC_CONFIG_COMMANDS_PRE( ++[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then ++ AC_MSG_ERROR([[conditional "$1" was never defined. ++Usually this means the macro was only invoked conditionally.]]) ++fi])]) + ++# serial 7 -*- Autoconf -*- + +-# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. ++# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 ++# Free Software Foundation, Inc. + + # 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 +@@ -293,220 +169,12 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + # 02111-1307, USA. + +-# serial 3 + +-# AM_MISSING_PROG(NAME, PROGRAM) +-# ------------------------------ +-AC_DEFUN([AM_MISSING_PROG], +-[AC_REQUIRE([AM_MISSING_HAS_RUN]) +-$1=${$1-"${am_missing_run}$2"} +-AC_SUBST($1)]) +- +- +-# AM_MISSING_HAS_RUN +-# ------------------ +-# Define MISSING if not defined so far and test if it supports --run. +-# If it does, set am_missing_run to use it, otherwise, to nothing. +-AC_DEFUN([AM_MISSING_HAS_RUN], +-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +-# Use eval to expand $SHELL +-if eval "$MISSING --run true"; then +- am_missing_run="$MISSING --run " +-else +- am_missing_run= +- AC_MSG_WARN([`missing' script is too old or missing]) +-fi +-]) +- +-# AM_AUX_DIR_EXPAND +- +-# Copyright 2001 Free Software Foundation, Inc. +- +-# 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, 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., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +-# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +-# +-# Of course, Automake must honor this variable whenever it calls a +-# tool from the auxiliary directory. The problem is that $srcdir (and +-# therefore $ac_aux_dir as well) can be either absolute or relative, +-# depending on how configure is run. This is pretty annoying, since +-# it makes $ac_aux_dir quite unusable in subdirectories: in the top +-# source directory, any form will work fine, but in subdirectories a +-# relative path needs to be adjusted first. +-# +-# $ac_aux_dir/missing +-# fails when called from a subdirectory if $ac_aux_dir is relative +-# $top_srcdir/$ac_aux_dir/missing +-# fails if $ac_aux_dir is absolute, +-# fails when called from a subdirectory in a VPATH build with +-# a relative $ac_aux_dir +-# +-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +-# are both prefixed by $srcdir. In an in-source build this is usually +-# harmless because $srcdir is `.', but things will broke when you +-# start a VPATH build or use an absolute $srcdir. +-# +-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +-# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +-# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +-# and then we would define $MISSING as +-# MISSING="\${SHELL} $am_aux_dir/missing" +-# This will work as long as MISSING is not called from configure, because +-# unfortunately $(top_srcdir) has no meaning in configure. +-# However there are other variables, like CC, which are often used in +-# configure, and could therefore not use this "fixed" $ac_aux_dir. +-# +-# Another solution, used here, is to always expand $ac_aux_dir to an +-# absolute PATH. The drawback is that using absolute paths prevent a +-# configured tree to be moved without reconfiguration. +- +-# Rely on autoconf to set up CDPATH properly. +-AC_PREREQ([2.50]) +- +-AC_DEFUN([AM_AUX_DIR_EXPAND], [ +-# expand $ac_aux_dir to an absolute path +-am_aux_dir=`cd $ac_aux_dir && pwd` +-]) +- +-# AM_PROG_INSTALL_SH +-# ------------------ +-# Define $install_sh. +- +-# Copyright 2001 Free Software Foundation, Inc. +- +-# 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, 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., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-AC_DEFUN([AM_PROG_INSTALL_SH], +-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +-install_sh=${install_sh-"$am_aux_dir/install-sh"} +-AC_SUBST(install_sh)]) +- +-# AM_PROG_INSTALL_STRIP +- +-# Copyright 2001 Free Software Foundation, Inc. +- +-# 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, 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., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-# One issue with vendor `install' (even GNU) is that you can't +-# specify the program used to strip binaries. This is especially +-# annoying in cross-compiling environments, where the build's strip +-# is unlikely to handle the host's binaries. +-# Fortunately install-sh will honor a STRIPPROG variable, so we +-# always use install-sh in `make install-strip', and initialize +-# STRIPPROG with the value of the STRIP variable (set by the user). +-AC_DEFUN([AM_PROG_INSTALL_STRIP], +-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +-# Installed binaries are usually stripped using `strip' when the user +-# run `make install-strip'. However `strip' might not be the right +-# tool to use in cross-compilation environments, therefore Automake +-# will honor the `STRIP' environment variable to overrule this program. +-dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +-if test "$cross_compiling" != no; then +- AC_CHECK_TOOL([STRIP], [strip], :) +-fi +-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +-AC_SUBST([INSTALL_STRIP_PROGRAM])]) +- +-# -*- Autoconf -*- +-# Copyright (C) 2003 Free Software Foundation, Inc. +- +-# 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, 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., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +-# serial 1 +- +-# Check whether the underlying file-system supports filenames +-# with a leading dot. For instance MS-DOS doesn't. +-AC_DEFUN([AM_SET_LEADING_DOT], +-[rm -rf .tst 2>/dev/null +-mkdir .tst 2>/dev/null +-if test -d .tst; then +- am__leading_dot=. +-else +- am__leading_dot=_ +-fi +-rmdir .tst 2>/dev/null +-AC_SUBST([am__leading_dot])]) +- +-# serial 5 -*- Autoconf -*- +- +-# Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +- +-# 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, 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., 59 Temple Place - Suite 330, Boston, MA +-# 02111-1307, USA. +- +- +-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +-# written in clear, in which case automake, when reading aclocal.m4, +-# will think it sees a *use*, and therefore will trigger all it's +-# C support machinery. Also note that it means that autoscan, seeing +-# CC etc. in the Makefile, will ask for an AC_PROG_CC use... ++# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be ++# written in clear, in which case automake, when reading aclocal.m4, ++# will think it sees a *use*, and therefore will trigger all it's ++# C support machinery. Also note that it means that autoscan, seeing ++# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +@@ -568,7 +236,9 @@ + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c +- : > sub/conftst$i.h ++ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with ++ # Solaris 8's {/usr,}/bin/sh. ++ touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + +@@ -596,9 +266,14 @@ + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings +- # (even with -Werror). So we grep stderr for any message +- # that says an option was ignored. +- if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else ++ # or remarks (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored or not supported. ++ # When given -MP, icc 7.0 and 7.1 complain thusly: ++ # icc: Command line warning: ignoring option '-M'; no argument required ++ # The diagnosis changed in icc 8.0: ++ # icc: Command line remark: option '-MP' not supported ++ if (grep 'ignoring option' conftest.err || ++ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi +@@ -632,8 +307,8 @@ + # ------------ + AC_DEFUN([AM_DEP_TRACK], + [AC_ARG_ENABLE(dependency-tracking, +-[ --disable-dependency-tracking Speeds up one-time builds +- --enable-dependency-tracking Do not reject slow dependency extractors]) ++[ --disable-dependency-tracking speeds up one-time build ++ --enable-dependency-tracking do not reject slow dependency extractors]) + if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +@@ -644,7 +319,8 @@ + + # Generate code to set up dependency tracking. -*- Autoconf -*- + +-# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. ++# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 ++# Free Software Foundation, Inc. + + # 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 +@@ -680,27 +356,21 @@ + else + continue + fi +- grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue +- # Extract the definition of DEP_FILES from the Makefile without +- # running `make'. +- DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` ++ # Extract the definition of DEPDIR, am__include, and am__quote ++ # from the Makefile without running `make'. ++ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue ++ am__include=`sed -n 's/^am__include = //p' < "$mf"` ++ test -z "am__include" && continue ++ am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it +- U=`sed -n -e '/^U = / s///p' < "$mf"` +- test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" +- # We invoke sed twice because it is the simplest approach to +- # changing $(DEPDIR) to its actual value in the expansion. +- for file in `sed -n -e ' +- /^DEP_FILES = .*\\\\$/ { +- s/^DEP_FILES = // +- :loop +- s/\\\\$// +- p +- n +- /\\\\$/ b loop +- p +- } +- /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ ++ U=`sed -n 's/^U = //p' < "$mf"` ++ # Find all dependency output files, they are included files with ++ # $(DEPDIR) in their names. We invoke sed twice because it is the ++ # simplest approach to changing $(DEPDIR) to its actual value in the ++ # expansion. ++ for file in `sed -n " ++ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue +@@ -726,9 +396,13 @@ + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) + ]) + +-# Check to see how 'make' treats includes. -*- Autoconf -*- ++# Do all the work for Automake. -*- Autoconf -*- + +-# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++# This macro actually does too much some checks are only needed if ++# your package does certain things. But this isn't really a big deal. ++ ++# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++# Free Software Foundation, Inc. + + # 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 +@@ -745,43 +419,223 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + # 02111-1307, USA. + +-# serial 2 ++# serial 11 + +-# AM_MAKE_INCLUDE() +-# ----------------- +-# Check to see how make treats includes. +-AC_DEFUN([AM_MAKE_INCLUDE], +-[am_make=${MAKE-make} +-cat > confinc << 'END' +-am__doit: +- @echo done +-.PHONY: am__doit +-END +-# If we don't find an include directive, just comment out the code. +-AC_MSG_CHECKING([for style of include used by $am_make]) +-am__include="#" +-am__quote= +-_am_result=none +-# First try GNU make style include. +-echo "include confinc" > confmf +-# We grep out `Entering directory' and `Leaving directory' +-# messages which can occur if `w' ends up in MAKEFLAGS. +-# In particular we don't look at `^make:' because GNU make might +-# be invoked under some other name (usually "gmake"), in which +-# case it prints its new name instead of `make'. +-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then +- am__include=include +- am__quote= +- _am_result=GNU +-fi +-# Now try BSD make style include. +-if test "$am__include" = "#"; then +- echo '.include "confinc"' > confmf +- if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then +- am__include=.include +- am__quote="\"" +- _am_result=BSD +- fi ++# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) ++# AM_INIT_AUTOMAKE([OPTIONS]) ++# ----------------------------------------------- ++# The call with PACKAGE and VERSION arguments is the old style ++# call (pre autoconf-2.50), which is being phased out. PACKAGE ++# and VERSION should now be passed to AC_INIT and removed from ++# the call to AM_INIT_AUTOMAKE. ++# We support both call styles for the transition. After ++# the next Automake release, Autoconf can make the AC_INIT ++# arguments mandatory, and then we can depend on a new Autoconf ++# release and drop the old call support. ++AC_DEFUN([AM_INIT_AUTOMAKE], ++[AC_PREREQ([2.58])dnl ++dnl Autoconf wants to disallow AM_ names. We explicitly allow ++dnl the ones we care about. ++m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl ++AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl ++AC_REQUIRE([AC_PROG_INSTALL])dnl ++# test to see if srcdir already configured ++if test "`cd $srcdir && pwd`" != "`pwd`" && ++ test -f $srcdir/config.status; then ++ AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) ++fi ++ ++# test whether we have cygpath ++if test -z "$CYGPATH_W"; then ++ if (cygpath --version) >/dev/null 2>/dev/null; then ++ CYGPATH_W='cygpath -w' ++ else ++ CYGPATH_W=echo ++ fi ++fi ++AC_SUBST([CYGPATH_W]) ++ ++# Define the identity of the package. ++dnl Distinguish between old-style and new-style calls. ++m4_ifval([$2], ++[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl ++ AC_SUBST([PACKAGE], [$1])dnl ++ AC_SUBST([VERSION], [$2])], ++[_AM_SET_OPTIONS([$1])dnl ++ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl ++ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl ++ ++_AM_IF_OPTION([no-define],, ++[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) ++ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl ++ ++# Some tools Automake needs. ++AC_REQUIRE([AM_SANITY_CHECK])dnl ++AC_REQUIRE([AC_ARG_PROGRAM])dnl ++AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) ++AM_MISSING_PROG(AUTOCONF, autoconf) ++AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) ++AM_MISSING_PROG(AUTOHEADER, autoheader) ++AM_MISSING_PROG(MAKEINFO, makeinfo) ++AM_PROG_INSTALL_SH ++AM_PROG_INSTALL_STRIP ++AC_REQUIRE([AM_PROG_MKDIR_P])dnl ++# We need awk for the "check" target. The system "awk" is bad on ++# some platforms. ++AC_REQUIRE([AC_PROG_AWK])dnl ++AC_REQUIRE([AC_PROG_MAKE_SET])dnl ++AC_REQUIRE([AM_SET_LEADING_DOT])dnl ++_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], ++ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], ++ [_AM_PROG_TAR([v7])])]) ++_AM_IF_OPTION([no-dependencies],, ++[AC_PROVIDE_IFELSE([AC_PROG_CC], ++ [_AM_DEPENDENCIES(CC)], ++ [define([AC_PROG_CC], ++ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl ++AC_PROVIDE_IFELSE([AC_PROG_CXX], ++ [_AM_DEPENDENCIES(CXX)], ++ [define([AC_PROG_CXX], ++ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ++]) ++]) ++ ++ ++# When config.status generates a header, we must update the stamp-h file. ++# This file resides in the same directory as the config header ++# that is generated. The stamp files are numbered to have different names. ++ ++# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the ++# loop where config.status creates the headers, so we can generate ++# our stamp files there. ++AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], ++[# Compute $1's index in $config_headers. ++_am_stamp_count=1 ++for _am_header in $config_headers :; do ++ case $_am_header in ++ $1 | $1:* ) ++ break ;; ++ * ) ++ _am_stamp_count=`expr $_am_stamp_count + 1` ;; ++ esac ++done ++echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) ++ ++# AM_PROG_INSTALL_SH ++# ------------------ ++# Define $install_sh. ++ ++# Copyright (C) 2001, 2003 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++AC_DEFUN([AM_PROG_INSTALL_SH], ++[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl ++install_sh=${install_sh-"$am_aux_dir/install-sh"} ++AC_SUBST(install_sh)]) ++ ++# -*- Autoconf -*- ++# Copyright (C) 2003 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# serial 1 ++ ++# Check whether the underlying file-system supports filenames ++# with a leading dot. For instance MS-DOS doesn't. ++AC_DEFUN([AM_SET_LEADING_DOT], ++[rm -rf .tst 2>/dev/null ++mkdir .tst 2>/dev/null ++if test -d .tst; then ++ am__leading_dot=. ++else ++ am__leading_dot=_ ++fi ++rmdir .tst 2>/dev/null ++AC_SUBST([am__leading_dot])]) ++ ++# Check to see how 'make' treats includes. -*- Autoconf -*- ++ ++# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# serial 2 ++ ++# AM_MAKE_INCLUDE() ++# ----------------- ++# Check to see how make treats includes. ++AC_DEFUN([AM_MAKE_INCLUDE], ++[am_make=${MAKE-make} ++cat > confinc << 'END' ++am__doit: ++ @echo done ++.PHONY: am__doit ++END ++# If we don't find an include directive, just comment out the code. ++AC_MSG_CHECKING([for style of include used by $am_make]) ++am__include="#" ++am__quote= ++_am_result=none ++# First try GNU make style include. ++echo "include confinc" > confmf ++# We grep out `Entering directory' and `Leaving directory' ++# messages which can occur if `w' ends up in MAKEFLAGS. ++# In particular we don't look at `^make:' because GNU make might ++# be invoked under some other name (usually "gmake"), in which ++# case it prints its new name instead of `make'. ++if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then ++ am__include=include ++ am__quote= ++ _am_result=GNU ++fi ++# Now try BSD make style include. ++if test "$am__include" = "#"; then ++ echo '.include "confinc"' > confmf ++ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then ++ am__include=.include ++ am__quote="\"" ++ _am_result=BSD ++ fi + fi + AC_SUBST([am__include]) + AC_SUBST([am__quote]) +@@ -789,9 +643,10 @@ + rm -f confinc confmf + ]) + +-# AM_CONDITIONAL -*- Autoconf -*- ++# -*- Autoconf -*- ++ + +-# Copyright 1997, 2000, 2001 Free Software Foundation, Inc. ++# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + + # 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 +@@ -808,28 +663,358 @@ + # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + # 02111-1307, USA. + +-# serial 5 ++# serial 3 + +-AC_PREREQ(2.52) ++# AM_MISSING_PROG(NAME, PROGRAM) ++# ------------------------------ ++AC_DEFUN([AM_MISSING_PROG], ++[AC_REQUIRE([AM_MISSING_HAS_RUN]) ++$1=${$1-"${am_missing_run}$2"} ++AC_SUBST($1)]) + +-# AM_CONDITIONAL(NAME, SHELL-CONDITION) +-# ------------------------------------- +-# Define a conditional. +-AC_DEFUN([AM_CONDITIONAL], +-[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], +- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +-AC_SUBST([$1_TRUE]) +-AC_SUBST([$1_FALSE]) +-if $2; then +- $1_TRUE= +- $1_FALSE='#' ++ ++# AM_MISSING_HAS_RUN ++# ------------------ ++# Define MISSING if not defined so far and test if it supports --run. ++# If it does, set am_missing_run to use it, otherwise, to nothing. ++AC_DEFUN([AM_MISSING_HAS_RUN], ++[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl ++test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" ++# Use eval to expand $SHELL ++if eval "$MISSING --run true"; then ++ am_missing_run="$MISSING --run " + else +- $1_TRUE='#' +- $1_FALSE= ++ am_missing_run= ++ AC_MSG_WARN([`missing' script is too old or missing]) + fi +-AC_CONFIG_COMMANDS_PRE( +-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then +- AC_MSG_ERROR([conditional "$1" was never defined. +-Usually this means the macro was only invoked conditionally.]) +-fi])]) ++]) ++ ++# AM_PROG_MKDIR_P ++# --------------- ++# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. ++ ++# Copyright (C) 2003, 2004 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories ++# created by `make install' are always world readable, even if the ++# installer happens to have an overly restrictive umask (e.g. 077). ++# This was a mistake. There are at least two reasons why we must not ++# use `-m 0755': ++# - it causes special bits like SGID to be ignored, ++# - it may be too restrictive (some setups expect 775 directories). ++# ++# Do not use -m 0755 and let people choose whatever they expect by ++# setting umask. ++# ++# We cannot accept any implementation of `mkdir' that recognizes `-p'. ++# Some implementations (such as Solaris 8's) are not thread-safe: if a ++# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' ++# concurrently, both version can detect that a/ is missing, but only ++# one can create it and the other will error out. Consequently we ++# restrict ourselves to GNU make (using the --version option ensures ++# this.) ++AC_DEFUN([AM_PROG_MKDIR_P], ++[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then ++ # We used to keeping the `.' as first argument, in order to ++ # allow $(mkdir_p) to be used without argument. As in ++ # $(mkdir_p) $(somedir) ++ # where $(somedir) is conditionally defined. However this is wrong ++ # for two reasons: ++ # 1. if the package is installed by a user who cannot write `.' ++ # make install will fail, ++ # 2. the above comment should most certainly read ++ # $(mkdir_p) $(DESTDIR)$(somedir) ++ # so it does not work when $(somedir) is undefined and ++ # $(DESTDIR) is not. ++ # To support the latter case, we have to write ++ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), ++ # so the `.' trick is pointless. ++ mkdir_p='mkdir -p --' ++else ++ # On NextStep and OpenStep, the `mkdir' command does not ++ # recognize any option. It will interpret all options as ++ # directories to create, and then abort because `.' already ++ # exists. ++ for d in ./-p ./--version; ++ do ++ test -d $d && rmdir $d ++ done ++ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. ++ if test -f "$ac_aux_dir/mkinstalldirs"; then ++ mkdir_p='$(mkinstalldirs)' ++ else ++ mkdir_p='$(install_sh) -d' ++ fi ++fi ++AC_SUBST([mkdir_p])]) ++ ++# Helper functions for option handling. -*- Autoconf -*- ++ ++# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# serial 2 ++ ++# _AM_MANGLE_OPTION(NAME) ++# ----------------------- ++AC_DEFUN([_AM_MANGLE_OPTION], ++[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) ++ ++# _AM_SET_OPTION(NAME) ++# ------------------------------ ++# Set option NAME. Presently that only means defining a flag for this option. ++AC_DEFUN([_AM_SET_OPTION], ++[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) ++ ++# _AM_SET_OPTIONS(OPTIONS) ++# ---------------------------------- ++# OPTIONS is a space-separated list of Automake options. ++AC_DEFUN([_AM_SET_OPTIONS], ++[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) ++ ++# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) ++# ------------------------------------------- ++# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. ++AC_DEFUN([_AM_IF_OPTION], ++[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) ++ ++# ++# Check to make sure that the build environment is sane. ++# ++ ++# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# serial 3 ++ ++# AM_SANITY_CHECK ++# --------------- ++AC_DEFUN([AM_SANITY_CHECK], ++[AC_MSG_CHECKING([whether build environment is sane]) ++# Just in case ++sleep 1 ++echo timestamp > conftest.file ++# Do `set' in a subshell so we don't clobber the current shell's ++# arguments. Must try -L first in case configure is actually a ++# symlink; some systems play weird games with the mod time of symlinks ++# (eg FreeBSD returns the mod time of the symlink's containing ++# directory). ++if ( ++ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` ++ if test "$[*]" = "X"; then ++ # -L didn't work. ++ set X `ls -t $srcdir/configure conftest.file` ++ fi ++ rm -f conftest.file ++ if test "$[*]" != "X $srcdir/configure conftest.file" \ ++ && test "$[*]" != "X conftest.file $srcdir/configure"; then ++ ++ # If neither matched, then we have a broken ls. This can happen ++ # if, for instance, CONFIG_SHELL is bash and it inherits a ++ # broken ls alias from the environment. This has actually ++ # happened. Such a system could not be considered "sane". ++ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken ++alias in your environment]) ++ fi ++ ++ test "$[2]" = conftest.file ++ ) ++then ++ # Ok. ++ : ++else ++ AC_MSG_ERROR([newly created file is older than distributed files! ++Check your system clock]) ++fi ++AC_MSG_RESULT(yes)]) ++ ++# AM_PROG_INSTALL_STRIP ++ ++# Copyright (C) 2001, 2003 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# One issue with vendor `install' (even GNU) is that you can't ++# specify the program used to strip binaries. This is especially ++# annoying in cross-compiling environments, where the build's strip ++# is unlikely to handle the host's binaries. ++# Fortunately install-sh will honor a STRIPPROG variable, so we ++# always use install-sh in `make install-strip', and initialize ++# STRIPPROG with the value of the STRIP variable (set by the user). ++AC_DEFUN([AM_PROG_INSTALL_STRIP], ++[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl ++# Installed binaries are usually stripped using `strip' when the user ++# run `make install-strip'. However `strip' might not be the right ++# tool to use in cross-compilation environments, therefore Automake ++# will honor the `STRIP' environment variable to overrule this program. ++dnl Don't test for $cross_compiling = yes, because it might be `maybe'. ++if test "$cross_compiling" != no; then ++ AC_CHECK_TOOL([STRIP], [strip], :) ++fi ++INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" ++AC_SUBST([INSTALL_STRIP_PROGRAM])]) ++ ++# Check how to create a tarball. -*- Autoconf -*- ++ ++# Copyright (C) 2004 Free Software Foundation, Inc. ++ ++# 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, 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., 59 Temple Place - Suite 330, Boston, MA ++# 02111-1307, USA. ++ ++# serial 1 ++ ++ ++# _AM_PROG_TAR(FORMAT) ++# -------------------- ++# Check how to create a tarball in format FORMAT. ++# FORMAT should be one of `v7', `ustar', or `pax'. ++# ++# Substitute a variable $(am__tar) that is a command ++# writing to stdout a FORMAT-tarball containing the directory ++# $tardir. ++# tardir=directory && $(am__tar) > result.tar ++# ++# Substitute a variable $(am__untar) that extract such ++# a tarball read from stdin. ++# $(am__untar) < result.tar ++AC_DEFUN([_AM_PROG_TAR], ++[# Always define AMTAR for backward compatibility. ++AM_MISSING_PROG([AMTAR], [tar]) ++m4_if([$1], [v7], ++ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], ++ [m4_case([$1], [ustar],, [pax],, ++ [m4_fatal([Unknown tar format])]) ++AC_MSG_CHECKING([how to create a $1 tar archive]) ++# Loop over all known methods to create a tar archive until one works. ++_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' ++_am_tools=${am_cv_prog_tar_$1-$_am_tools} ++# Do not fold the above two line into one, because Tru64 sh and ++# Solaris sh will not grok spaces in the rhs of `-'. ++for _am_tool in $_am_tools ++do ++ case $_am_tool in ++ gnutar) ++ for _am_tar in tar gnutar gtar; ++ do ++ AM_RUN_LOG([$_am_tar --version]) && break ++ done ++ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' ++ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' ++ am__untar="$_am_tar -xf -" ++ ;; ++ plaintar) ++ # Must skip GNU tar: if it does not support --format= it doesn't create ++ # ustar tarball either. ++ (tar --version) >/dev/null 2>&1 && continue ++ am__tar='tar chf - "$$tardir"' ++ am__tar_='tar chf - "$tardir"' ++ am__untar='tar xf -' ++ ;; ++ pax) ++ am__tar='pax -L -x $1 -w "$$tardir"' ++ am__tar_='pax -L -x $1 -w "$tardir"' ++ am__untar='pax -r' ++ ;; ++ cpio) ++ am__tar='find "$$tardir" -print | cpio -o -H $1 -L' ++ am__tar_='find "$tardir" -print | cpio -o -H $1 -L' ++ am__untar='cpio -i -H $1 -d' ++ ;; ++ none) ++ am__tar=false ++ am__tar_=false ++ am__untar=false ++ ;; ++ esac ++ ++ # If the value was cached, stop now. We just wanted to have am__tar ++ # and am__untar set. ++ test -n "${am_cv_prog_tar_$1}" && break ++ ++ # tar/untar a dummy directory, and stop if the command works ++ rm -rf conftest.dir ++ mkdir conftest.dir ++ echo GrepMe > conftest.dir/file ++ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) ++ rm -rf conftest.dir ++ if test -s conftest.tar; then ++ AM_RUN_LOG([$am__untar <conftest.tar]) ++ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break ++ fi ++done ++rm -rf conftest.dir ++ ++AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) ++AC_MSG_RESULT([$am_cv_prog_tar_$1])]) ++AC_SUBST([am__tar]) ++AC_SUBST([am__untar]) ++]) # _AM_PROG_TAR + +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bencode.cpp ctorrent-1.3.4/bencode.cpp +--- ctorrent-1.3.4.sav/bencode.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/bencode.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -1,6 +1,6 @@ ++#include "./def.h" + #include <sys/types.h> + +-#include "./def.h" + #include "bencode.h" + + #ifndef WINDOWS +@@ -29,7 +29,7 @@ + return keylen; + } + +-size_t buf_int(const char *b,size_t len,char beginchar,char endchar,size_t *pi) ++size_t buf_long(const char *b,size_t len,char beginchar,char endchar,int64_t *pi) + { + const char *p = b; + const char *psave; +@@ -46,12 +46,26 @@ + if(!len || MAX_INT_SIZ < (p - psave) || *p != endchar) return 0; + + if( pi ){ +- if( beginchar ) *pi = (size_t)strtol(b + 1,(char**) 0,10); +- else *pi=(size_t)strtol(b,(char**) 0,10); ++ if( beginchar ) *pi = strtoll(b + 1,(char**) 0,10); ++ else *pi=strtoll(b,(char**) 0,10); + } + return (size_t)( p - b + 1 ); + } + ++size_t buf_int(const char *b,size_t len,char beginchar,char endchar,size_t *pi) ++{ ++ size_t r; ++ ++ if( pi ){ ++ int64_t pl; ++ r = buf_long(b,len,beginchar,endchar,&pl); ++ *pi = (size_t) pl; ++ }else{ ++ r = buf_long(b,len,beginchar,endchar,(int64_t*) 0); ++ } ++ return r; ++} ++ + size_t buf_str(const char *b,size_t len,const char **pstr,size_t* slen) + { + size_t rl,sl; +@@ -69,7 +83,7 @@ + + size_t decode_int(const char *b,size_t len) + { +- return(buf_int(b,len,'i','e',(size_t*) 0)); ++ return(buf_long(b,len,'i','e',(int64_t*) 0)); + } + + size_t decode_str(const char *b,size_t len) +@@ -136,7 +150,7 @@ + } + } + +-size_t decode_query(const char *b,size_t len,const char *keylist,const char **ps,size_t *pi,int method) ++size_t decode_query(const char *b,size_t len,const char *keylist,const char **ps,size_t *pi,int64_t *pl,int method) + { + size_t pos; + char kl[KEYNAME_LISTSIZ]; +@@ -147,8 +161,9 @@ + case QUERY_STR: return(buf_str(b + pos,len - pos, ps, pi)); + case QUERY_INT: return(buf_int(b + pos,len - pos, 'i', 'e', pi)); + case QUERY_POS: +- if(pi) *pi = decode_rev(b + pos, len - pos, (const char*) 0); +- return pos; ++ if(pi) *pi = decode_rev(b + pos, len - pos, (const char*) 0); ++ return pos; ++ case QUERY_LONG: return(buf_long(b + pos,len - pos, 'i', 'e', pl)); + default: return 0; + } + } +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bencode.h ctorrent-1.3.4/bencode.h +--- ctorrent-1.3.4.sav/bencode.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/bencode.h 2006-06-28 19:30:02.000000000 +0200 +@@ -13,7 +13,9 @@ + #define QUERY_STR 0 + #define QUERY_INT 1 + #define QUERY_POS 2 ++#define QUERY_LONG 3 + ++size_t buf_long(const char *b,size_t len,char beginchar,char endchar,int64_t *pi); + size_t buf_int(const char *b,size_t len,char beginchar,char endchar,size_t *pi); + size_t buf_str(const char *b,size_t len,const char **pstr,size_t* slen); + size_t decode_int(const char *b,size_t len); +@@ -21,7 +23,7 @@ + size_t decode_dict(const char *b,size_t len,const char *keylist); + size_t decode_list(const char *b,size_t len,const char *keylist); + size_t decode_rev(const char *b,size_t len,const char *keylist); +-size_t decode_query(const char *b,size_t len,const char *keylist,const char **ps,size_t *pi,int method); ++size_t decode_query(const char *b,size_t len,const char *keylist,const char **ps,size_t *pi,int64_t *pl,int method); + size_t decode_list2path(const char *b, size_t n, char *pathname); + size_t bencode_buf(const char *str,size_t len,FILE *fp); + size_t bencode_str(const char *str, FILE *fp); +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bitfield.cpp ctorrent-1.3.4/bitfield.cpp +--- ctorrent-1.3.4.sav/bitfield.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/bitfield.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -143,8 +143,8 @@ + size_t s = nset; + for( ; i < nbytes - 1; i++ ) b[i] = ~b[i]; + +- if( nbits % nbytes ){ +- for( i = 8 * (nbytes - 1); i < nbits; i++ ) if( _isset(i) ) UnSet(i); else Set(i); ++ if( nbits % 8 ){ ++ for( i = 8 * (nbytes - 1); i < nbits; i++ ) if( _isset(i) ) UnSet(i); else _set(i); + }else + b[nbytes - 1] = ~b[nbytes - 1]; + +@@ -152,6 +152,16 @@ + } + } + ++// _set() sets the bit but doesn't increment nset or set the isfull case. ++// Use instead of Set() when you know nset is incorrect and will be corrected ++// afterward (as in Invert or by _recalc), ++// and either bitfield won't get full or you'll _recalc() afterward to fix it. ++void BitField::_set(size_t idx) ++{ ++ if( idx < nbits && !_isfull() && !_isset(idx) ) ++ b[idx / 8] |= BIT_HEX[idx % 8]; ++} ++ + void BitField::Comb(const BitField &bf) + { + size_t i; +@@ -167,7 +177,10 @@ + { + size_t i; + char c; +- if( bf.nset != 0 ){ ++ if( _isfull_sp(bf) ){ ++ SetAll(); ++ Invert(); ++ }else if( bf.nset != 0 ){ + if( nset >= nbits ){ + b = new unsigned char[nbytes]; + #ifndef WINDOWS +@@ -184,6 +197,26 @@ + } + } + ++void BitField::And(const BitField &bf) ++{ ++ size_t i; ++ ++ if( bf.nset == 0 ){ ++ SetAll(); ++ Invert(); ++ }else if( !_isfull_sp(bf) ){ ++ if( nset >= nbits ){ ++ b = new unsigned char[nbytes]; ++#ifndef WINDOWS ++ if( !b ) throw 9; ++#endif ++ _setall(b); ++ } ++ for(i = 0; i < nbytes; i++) b[i] &= bf.b[i]; ++ _recalc(); ++ } ++} ++ + size_t BitField::Random() const + { + size_t idx; +@@ -300,3 +333,4 @@ + fclose(fp); + return -1; + } ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bitfield.h ctorrent-1.3.4/bitfield.h +--- ctorrent-1.3.4.sav/bitfield.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/bitfield.h 2006-06-28 19:30:02.000000000 +0200 +@@ -14,6 +14,7 @@ + + inline void _recalc(); + inline void _setall(unsigned char* buf); ++ inline void _set(size_t idx); + + public: + BitField(); +@@ -40,6 +41,7 @@ + void Comb(const BitField &bf); + void Except(const BitField &bf); + void Invert(); ++ void And(const BitField &bf); + + int WriteToFile(const char *fname); + int SetReferFile(const char *fname); +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btconfig.cpp ctorrent-1.3.4/btconfig.cpp +--- ctorrent-1.3.4.sav/btconfig.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btconfig.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -1,19 +1,23 @@ #include <sys/types.h> -size_t cfg_req_slice_size = 32768; -+//size_t cfg_req_slice_size = 32768; +size_t cfg_req_slice_size = 16384; ++size_t cfg_req_queue_length = 74; size_t cfg_cache_size = 16; -@@ -11,7 +12,8 @@ + size_t cfg_max_peers = 100; +-size_t cfg_min_peers = 40; ++size_t cfg_min_peers = 1; + ++unsigned long cfg_listen_ip = 0; + int cfg_listen_port = 0; int cfg_max_listen_port = 2706; int cfg_min_listen_port = 2106; @@ -20,21 +1534,55 @@ diff -u ctorrent-1.3.4.orig/btconfig.cpp ctorrent-1.3.4/btconfig.cpp +int cfg_max_bandwidth_up = -1; time_t cfg_seed_hours = 72; ++double cfg_seed_ratio = 0; -@@ -25,6 +27,8 @@ + // arguments global value + char *arg_metainfo_file = (char*) 0; +@@ -25,6 +29,12 @@ unsigned char arg_flg_check_only = 0; unsigned char arg_flg_exam_only = 0; unsigned char arg_flg_make_torrent = 0; -+unsigned char arg_file_to_download = 0; ++size_t arg_file_to_download = 0; +unsigned char arg_verbose = 0; size_t arg_piece_length = 262144; char *arg_announce = (char*) 0; -diff -u ctorrent-1.3.4.orig/btconfig.h ctorrent-1.3.4/btconfig.h ---- ctorrent-1.3.4.orig/btconfig.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btconfig.h 2005-08-11 23:45:29.425694288 +0200 -@@ -22,6 +22,8 @@ ++ ++char *arg_ctcs = (char*) 0; ++int cfg_exit_zero_peers = 0; ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btconfig.h ctorrent-1.3.4/btconfig.h +--- ctorrent-1.3.4.sav/btconfig.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btconfig.h 2006-06-28 19:30:02.000000000 +0200 +@@ -4,24 +4,32 @@ + extern size_t cfg_req_slice_size; + + #define MAX_METAINFO_FILESIZ 4194304 +-#define cfg_max_slice_size 131072 +-#define cfg_req_queue_length 64 ++// According to specs the max slice size is 128K. But most clients do not ++// accept a value that large, so we limit to 64K. Note that there is a ++// comparison in RequestQueue::IsValidRequest() (see btrequest.cpp) that ++// doubles the value so that we will accept a request for 128K. ++#define cfg_max_slice_size 65536 ++extern size_t cfg_req_queue_length; + #define MAX_PF_LEN 8 + #define PEER_ID_LEN 20 +-#define PEER_PFX "-CT1304-" ++#define PEER_PFX "-CD0200-" + + extern size_t cfg_cache_size; + + extern size_t cfg_max_peers; + extern size_t cfg_min_peers; + ++extern unsigned long cfg_listen_ip; + extern int cfg_listen_port; + extern int cfg_max_listen_port; + extern int cfg_min_listen_port; + extern time_t cfg_seed_hours; ++extern double cfg_seed_ratio; extern int cfg_max_bandwidth; +extern int cfg_max_bandwidth_down; @@ -42,27 +1590,76 @@ diff -u ctorrent-1.3.4.orig/btconfig.h ctorrent-1.3.4/btconfig.h // arguments global value extern char *arg_metainfo_file; -@@ -33,6 +35,8 @@ +@@ -33,7 +41,12 @@ extern unsigned char arg_flg_check_only; extern unsigned char arg_flg_exam_only; extern unsigned char arg_flg_make_torrent; -+extern unsigned char arg_file_to_download; ++extern size_t arg_file_to_download; +extern unsigned char arg_verbose; extern size_t arg_piece_length; extern char *arg_announce; -diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp ---- ctorrent-1.3.4.orig/btcontent.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btcontent.cpp 2005-08-11 23:45:29.425694288 +0200 -@@ -23,6 +23,7 @@ ++ ++extern char *arg_ctcs; ++extern int cfg_exit_zero_peers; + #endif +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btcontent.cpp ctorrent-1.3.4/btcontent.cpp +--- ctorrent-1.3.4.sav/btcontent.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btcontent.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -9,8 +9,12 @@ + #else + #include <unistd.h> + #include <sys/param.h> ++#if defined(HAVE_LIBCRYPT) || defined(HAVE_LIBMD) || defined(HAVE_LIBCRYPTO) ++#include <sha.h> ++#elif defined(HAVE_LIBSSL) + #include <openssl/sha.h> + #endif ++#endif + + #include <time.h> + #include <sys/stat.h> +@@ -23,10 +27,15 @@ #include "bencode.h" #include "peer.h" #include "httpencode.h" +#include "tracker.h" ++ ++#if defined(USE_STANDALONE_SHA1) ++#include "sha1.h" ++#endif + +-#define meta_str(keylist,pstr,pint) decode_query(b,flen,(keylist),(pstr),(pint),QUERY_STR) +-#define meta_int(keylist,pint) decode_query(b,flen,(keylist),(const char**) 0,(pint),QUERY_INT) +-#define meta_pos(keylist) decode_query(b,flen,(keylist),(const char**) 0,(size_t*) 0,QUERY_POS) ++#define meta_str(keylist,pstr,pint) decode_query(b,flen,(keylist),(pstr),(pint),(int64_t*) 0,QUERY_STR) ++#define meta_int(keylist,pint) decode_query(b,flen,(keylist),(const char**) 0,(pint),(int64_t*) 0,QUERY_INT) ++#define meta_pos(keylist) decode_query(b,flen,(keylist),(const char**) 0,(size_t*) 0,(int64_t*) 0,QUERY_POS) - #define meta_str(keylist,pstr,pint) decode_query(b,flen,(keylist),(pstr),(pint),QUERY_STR) - #define meta_int(keylist,pint) decode_query(b,flen,(keylist),(const char**) 0,(pint),QUERY_INT) -@@ -53,6 +54,7 @@ + #define CACHE_FIT(ca,roff,rlen) \ + (max_u_int64_t((ca)->bc_off,(roff)) <= \ +@@ -38,6 +47,12 @@ + + static void Sha1(char *ptr,size_t len,unsigned char *dm) + { ++#if defined(USE_STANDALONE_SHA1) ++ SHA1_CTX context; ++ SHA1Init(&context); ++ SHA1Update(&context,(unsigned char*)ptr,len); ++ SHA1Final(dm,&context); ++#else + #ifdef WINDOWS + ; + #else +@@ -46,6 +61,7 @@ + SHA1_Update(&context,(unsigned char*)ptr,len); + SHA1_Final(dm,&context); + #endif ++#endif + } + + btContent::btContent() +@@ -53,6 +69,7 @@ m_announce = global_piece_buffer = (char*) 0; m_hash_table = (unsigned char *) 0; pBF = (BitField*) 0; @@ -70,15 +1667,54 @@ diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp m_create_date = m_seed_timestamp = (time_t) 0; time(&m_start_timestamp); m_cache = (BTCACHE*) 0; -@@ -226,6 +228,7 @@ +@@ -121,7 +138,8 @@ + m_piece_length *= 65536; + } + +- if( !m_piece_length || m_piece_length > cfg_req_queue_length * cfg_req_slice_size ) ++ // This is really just a sanity check on the piece length to create. ++ if( !m_piece_length || m_piece_length > 4096*1024 ) + m_piece_length = 262144; + + m_announce = ann_url; +@@ -209,26 +227,24 @@ + if(!meta_int("info|piece length",&m_piece_length)) ERR_RETURN(); + m_npieces = m_hashtable_length / 20; + +- if( m_piece_length > cfg_max_slice_size * cfg_req_queue_length ){ +- fprintf(stderr,"error, piece length too long[%u]. please recompile CTorrent with a larger cfg_max_slice_size in <btconfig.h>.\n", m_piece_length); +- ERR_RETURN(); +- } ++ cfg_req_queue_length = (m_piece_length / cfg_req_slice_size) * 2 - 1; + + if( m_piece_length < cfg_req_slice_size ) + cfg_req_slice_size = m_piece_length; +- else{ +- for( ;(m_piece_length / cfg_req_slice_size) >= cfg_req_queue_length; ){ +- cfg_req_slice_size *= 2; +- if( cfg_req_slice_size > cfg_max_slice_size ) ERR_RETURN(); +- } +- } + if( m_btfiles.BuildFromMI(b, flen, saveas) < 0) ERR_RETURN(); delete []b; +- PrintOut(); + b = (char *)0; - PrintOut(); - if( arg_flg_exam_only ) return 0; -@@ -242,6 +245,17 @@ +- if( arg_flg_exam_only ) return 0; ++ if( arg_flg_exam_only ){ ++ PrintOut(); ++ return 0; ++ }else{ ++ arg_flg_exam_only = 1; ++ PrintOut(); ++ arg_flg_exam_only = 0; ++ } + + if( ( r = m_btfiles.CreateFiles() ) < 0) ERR_RETURN(); + +@@ -242,6 +258,17 @@ if( !pBF ) ERR_RETURN(); #endif @@ -96,7 +1732,54 @@ diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp m_left_bytes = m_btfiles.GetTotalLength() / m_piece_length; if( m_btfiles.GetTotalLength() % m_piece_length ) m_left_bytes++; if( m_left_bytes != m_npieces ) ERR_RETURN(); -@@ -309,7 +323,8 @@ +@@ -252,13 +279,13 @@ + + if( !arg_flg_check_only ){ + if( pBF->SetReferFile(arg_bitfield_file) >= 0){ +- size_t idx; +- r = 0; +- for( idx = 0; idx < m_npieces; idx++ ) +- if( pBF->IsSet(idx) ) m_left_bytes -= GetPieceLength(idx); ++ size_t idx; ++ r = 0; ++ for( idx = 0; idx < m_npieces; idx++ ) ++ if( pBF->IsSet(idx) ) m_left_bytes -= GetPieceLength(idx); + } + else{ +- fprintf(stderr,"warn, couldn't set bit field refer file %s.\n",arg_bitfield_file); ++ fprintf(stderr,"warn, couldn't set bit field refer file %s.\n",arg_bitfield_file); + } + } + +@@ -271,7 +298,9 @@ + CheckExist(); + } + +- printf("Already/Total: %u/%u\n",pBF->Count(),m_npieces); ++ PrintOut(); ++ printf("Already/Total: %u/%u (%d%%)\n",pBF->Count(),m_npieces, ++ 100 * pBF->Count() / m_npieces); + + if( arg_flg_check_only ){ + if( arg_bitfield_file ) pBF->WriteToFile(arg_bitfield_file); +@@ -285,11 +314,11 @@ + memset(ptr,0,8); // reserved set zero. + + { // peer id +- char *sptr = arg_user_agent; +- char *dptr = (char *)m_shake_buffer + 48; +- char *eptr = dptr + PEER_ID_LEN; +- while (*sptr) *dptr++ = *sptr++; +- while (dptr < eptr) *dptr++ = (unsigned char)random(); ++ char *sptr = arg_user_agent; ++ char *dptr = (char *)m_shake_buffer + 48; ++ char *eptr = dptr + PEER_ID_LEN; ++ while (*sptr) *dptr++ = *sptr++; ++ while (dptr < eptr) *dptr++ = (unsigned char)random(); + } + return 0; + } +@@ -309,7 +338,8 @@ ssize_t btContent::ReadSlice(char *buf,size_t idx,size_t off,size_t len) { @@ -106,7 +1789,62 @@ diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp if( !m_cache_size ) return m_btfiles.IO(buf, offset, len, 0); else{ -@@ -405,7 +420,11 @@ +@@ -322,16 +352,16 @@ + for( ; len && p && CACHE_FIT(p, offset, len);){ + flg_rescan = 0; + if( offset < p->bc_off ){ +- len2 = p->bc_off - offset; +- if( CacheIO(buf, offset, len2, 0) < 0) return -1; +- flg_rescan = 1; ++ len2 = p->bc_off - offset; ++ if( CacheIO(buf, offset, len2, 0) < 0) return -1; ++ flg_rescan = 1; + }else if( offset > p->bc_off ){ +- len2 = p->bc_off + p->bc_len - offset; +- if( len2 > len ) len2 = len; +- memcpy(buf, p->bc_buf + offset - p->bc_off, len2); ++ len2 = p->bc_off + p->bc_len - offset; ++ if( len2 > len ) len2 = len; ++ memcpy(buf, p->bc_buf + offset - p->bc_off, len2); + }else{ +- len2 = (len > p->bc_len) ? p->bc_len : len; +- memcpy(buf, p->bc_buf, len2); ++ len2 = (len > p->bc_len) ? p->bc_len : len; ++ memcpy(buf, p->bc_buf, len2); + } + + buf += len2; +@@ -339,14 +369,14 @@ + len -= len2; + + if( len ){ +- if( flg_rescan ){ +- for( p = m_cache; +- p && (offset + len) > p->bc_off && !CACHE_FIT(p,offset,len); +- p = p->bc_next) ; +- }else{ +- time(&p->bc_last_timestamp); +- p = p->bc_next; +- } ++ if( flg_rescan ){ ++ for( p = m_cache; ++ p && (offset + len) > p->bc_off && !CACHE_FIT(p,offset,len); ++ p = p->bc_next) ; ++ }else{ ++ time(&p->bc_last_timestamp); ++ p = p->bc_next; ++ } + } + }// end for; + +@@ -399,13 +429,17 @@ + if( p->bc_f_flush ){ + p->bc_f_flush = 0; + if(m_btfiles.IO(p->bc_buf, p->bc_off, p->bc_len, 1) < 0) +- fprintf(stderr,"warn, write file failed while flush cache.\n"); ++ fprintf(stderr,"warn, write file failed while flush cache.\n"); + } + } ssize_t btContent::WriteSlice(char *buf,size_t idx,size_t off,size_t len) { @@ -119,20 +1857,73 @@ diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp if( !m_cache_size ) return m_btfiles.IO(buf, offset, len, 1); else{ -@@ -514,9 +533,9 @@ +@@ -418,18 +452,18 @@ + for( ; len && p && CACHE_FIT(p, offset, len);){ + flg_rescan = 0; + if( offset < p->bc_off ){ +- len2 = p->bc_off - offset; +- if( CacheIO(buf, offset, len2, 1) < 0) return -1; +- flg_rescan = 1; ++ len2 = p->bc_off - offset; ++ if( CacheIO(buf, offset, len2, 1) < 0) return -1; ++ flg_rescan = 1; + }else if( offset > p->bc_off ){ +- len2 = p->bc_off + p->bc_len - offset; +- if( len2 > len ) len2 = len; +- memcpy(p->bc_buf + offset - p->bc_off, buf, len2); +- p->bc_f_flush = 1; ++ len2 = p->bc_off + p->bc_len - offset; ++ if( len2 > len ) len2 = len; ++ memcpy(p->bc_buf + offset - p->bc_off, buf, len2); ++ p->bc_f_flush = 1; + }else{ +- len2 = (len > p->bc_len) ? p->bc_len : len; +- memcpy(p->bc_buf, buf, len2); +- p->bc_f_flush = 1; ++ len2 = (len > p->bc_len) ? p->bc_len : len; ++ memcpy(p->bc_buf, buf, len2); ++ p->bc_f_flush = 1; + } + + buf += len2; +@@ -437,12 +471,12 @@ + len -= len2; + + if( len ){ +- if( flg_rescan ){ +- for( p = m_cache; p && (offset + len) > p->bc_off && !CACHE_FIT(p,offset,len); p = p->bc_next) ; +- }else{ +- time(&p->bc_last_timestamp); +- p = p->bc_next; +- } ++ if( flg_rescan ){ ++ for( p = m_cache; p && (offset + len) > p->bc_off && !CACHE_FIT(p,offset,len); p = p->bc_next) ; ++ }else{ ++ time(&p->bc_last_timestamp); ++ p = p->bc_next; ++ } + } + }// end for; + +@@ -514,12 +548,12 @@ if( !percent ) percent = 1; for( ; idx < m_npieces; idx++){ - if( GetHashValue(idx, md) == 0 && memcmp(md, m_hash_table + idx * 20, 20) == 0){ - m_left_bytes -= GetPieceLength(idx); - pBF->Set(idx); -+ if( GetHashValue(idx, md) == 0 && memcmp(md, m_hash_table + idx * 20, 20) == 0){ ++ if( GetHashValue(idx, md) == 0 && memcmp(md, m_hash_table + idx * 20, 20) == 0){ + m_left_bytes -= GetPieceLength(idx); + pBF->Set(idx); } - if(idx % percent == 0){ - printf("\rCheck exist: %d/%d",idx,pBF->NBits()); -@@ -575,7 +594,6 @@ +- if(idx % percent == 0){ +- printf("\rCheck exist: %d/%d",idx,pBF->NBits()); ++ if(idx % percent == 0 || idx == m_npieces-1){ ++ printf("\rCheck exist: %d/%d",idx+1,pBF->NBits()); + fflush(stdout); + } + } +@@ -575,7 +609,6 @@ fprintf(stderr,"warn,piece %d hash check failed.\n",idx); return 0; } @@ -140,21 +1931,39 @@ diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp pBF->Set(idx); m_left_bytes -= GetPieceLength(idx); return 1; -@@ -592,6 +610,7 @@ +@@ -590,8 +623,10 @@ + + int btContent::SeedTimeout(const time_t *pnow) { ++ u_int64_t dl; if( pBF->IsFull() ){ if( !m_seed_timestamp ){ -+ Tracker.Reset(15); ++ Tracker.Reset(1); Self.ResetDLTimer(); Self.ResetULTimer(); ReleaseHashTable(); -@@ -605,3 +624,13 @@ +@@ -599,9 +634,27 @@ + FlushCache(); + printf("\nDownload complete.\n"); + printf("Total time used: %lu minutes.\n",(*pnow - m_start_timestamp) / 60); +- printf("Seed for other %lu hours.\n\n", cfg_seed_hours); ++ printf("Seed for other %lu hours", cfg_seed_hours); ++ if(cfg_seed_ratio) printf(" or to ratio of %f", cfg_seed_ratio); ++ printf(".\n\n"); + } +- if( (*pnow - m_seed_timestamp) >= (cfg_seed_hours * 60 * 60) ) return 1; ++ dl = (Self.TotalDL() > 0) ? Self.TotalDL() : GetTotalFilesLength(); ++ if( (cfg_seed_ratio == 0 && cfg_seed_hours == 0) || ++ (cfg_seed_hours > 0 && ++ (*pnow - m_seed_timestamp) >= (cfg_seed_hours * 60 * 60)) || ++ (cfg_seed_ratio > 0 && ++ cfg_seed_ratio <= Self.TotalUL() / dl) ) return 1; } return 0; } + + -+size_t btContent::getFilePieces(unsigned char nfile){ ++size_t btContent::getFilePieces(size_t nfile){ + return m_btfiles.getFilePieces(nfile); +} + @@ -162,10 +1971,22 @@ diff -u ctorrent-1.3.4.orig/btcontent.cpp ctorrent-1.3.4/btcontent.cpp +void btContent::SetFilter(){ + m_btfiles.SetFilter(arg_file_to_download,pBFilter,m_piece_length); +} -diff -u ctorrent-1.3.4.orig/btcontent.h ctorrent-1.3.4/btcontent.h ---- ctorrent-1.3.4.orig/btcontent.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btcontent.h 2005-08-11 23:45:29.426694136 +0200 -@@ -60,6 +60,7 @@ ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btcontent.h ctorrent-1.3.4/btcontent.h +--- ctorrent-1.3.4.sav/btcontent.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btcontent.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,9 +1,8 @@ + #ifndef BTCONTENT_H + #define BTCONTENT_H + +-#include <sys/types.h> +- + #include "def.h" ++#include <sys/types.h> + + #include <stdio.h> + #include "bitfield.h" +@@ -60,6 +59,7 @@ public: BitField *pBF; @@ -173,30 +1994,90 @@ diff -u ctorrent-1.3.4.orig/btcontent.h ctorrent-1.3.4/btcontent.h char *global_piece_buffer; btContent(); -@@ -93,6 +94,11 @@ +@@ -93,6 +93,15 @@ int PrintOut(); int SeedTimeout(const time_t *pnow); + + -+ void SetFilter(); -+ size_t getFilePieces(unsigned char nfile); ++ void SetFilter(); ++ void SetTmpFilter(int nfile, BitField *pFilter) { m_btfiles.SetFilter(nfile, pFilter, m_piece_length); } ++ size_t getFilePieces(size_t nfile); + ++ BTFILE *GetNextFile(BTFILE *file) { return m_btfiles.GetNextFile(file); } ++ time_t GetStartTime() { return m_start_timestamp; } ++ time_t GetSeedTime() { return m_seed_timestamp; } }; extern btContent BTCONTENT; -diff -u ctorrent-1.3.4.orig/btfiles.cpp ctorrent-1.3.4/btfiles.cpp ---- ctorrent-1.3.4.orig/btfiles.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btfiles.cpp 2005-08-11 23:45:29.426694136 +0200 -@@ -105,6 +105,7 @@ - pos = (size_t) (off - (n - pbf->bf_length)); +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btfiles.cpp ctorrent-1.3.4/btfiles.cpp +--- ctorrent-1.3.4.sav/btfiles.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btfiles.cpp 2006-06-28 19:30:13.000000000 +0200 +@@ -8,8 +8,12 @@ + #include <unistd.h> + #include <dirent.h> + #include <sys/param.h> ++#if defined(HAVE_LIBCRYPT) || defined(HAVE_LIBMD) || defined(HAVE_LIBCRYPTO) ++#include <sha.h> ++#elif defined(HAVE_LIBSSL) + #include <openssl/sha.h> + #endif ++#endif + + #include <time.h> + #include <sys/stat.h> +@@ -19,6 +23,9 @@ + #include <errno.h> + + #include "bencode.h" ++#include "btconfig.h" ++#include "btcontent.h" ++#include "bitfield.h" + + #define MAX_OPEN_FILES 20 + +@@ -66,7 +73,7 @@ + for(pbf_n = m_btfhead; pbf_n ; pbf_n = pbf_n->bf_next){ + if(!pbf_n->bf_flag_opened) continue; // file not been opened. + if( !pbf_close || pbf_n->bf_last_timestamp < pbf_close->bf_last_timestamp) +- pbf_close = pbf_n; ++ pbf_close = pbf_n; + } + if(!pbf_close || fclose(pbf_close->bf_fp) < 0) return -1; + pbf_close->bf_flag_opened = 0; +@@ -90,7 +97,7 @@ + ssize_t btFiles::IO(char *buf, u_int64_t off, size_t len, const int iotype) + { + u_int64_t n = 0; +- size_t pos,nio; ++ off_t pos,nio; + BTFILE *pbf = m_btfhead; + + if( ( off + (u_int64_t)len ) > m_total_files_length) return -1; +@@ -102,16 +109,21 @@ + + if( !pbf ) return -1; + +- pos = (size_t) (off - (n - pbf->bf_length)); ++ pos = off - (n - pbf->bf_length); for(; len ;){ + if( !pbf->bf_flag_opened ){ if( _btf_open(pbf) < 0 ) return -1; } -@@ -119,6 +120,7 @@ + + if( m_flag_automanage ) time(&pbf->bf_last_timestamp); + ++#ifdef HAVE_FSEEKO ++ if( fseeko(pbf->bf_fp,pos,SEEK_SET) < 0) return -1; ++#else + if( fseek(pbf->bf_fp,(long) pos,SEEK_SET) < 0) return -1; ++#endif + + nio = (len < pbf->bf_length - pos) ? len : (pbf->bf_length - pos); + +@@ -119,6 +131,7 @@ if( 1 != fread(buf,nio,1,pbf->bf_fp) ) return -1; }else{ if( 1 != fwrite(buf,nio,1,pbf->bf_fp) ) return -1; @@ -204,7 +2085,31 @@ diff -u ctorrent-1.3.4.orig/btfiles.cpp ctorrent-1.3.4/btfiles.cpp } len -= nio; -@@ -169,7 +171,7 @@ +@@ -149,14 +162,21 @@ + return 0; + } + +-int btFiles::_btf_ftruncate(int fd,size_t length) ++int btFiles::_btf_ftruncate(int fd,int64_t length) + { + #ifdef WINDOWS + char c = (char)0; + if(lseek(fd,length - 1, SEEK_SET) < 0 ) return -1; + return write(fd, &c, 1); + #else +- return ftruncate(fd,length); ++ // ftruncate() not allowed on [v]fat under linux ++ int retval = ftruncate(fd,length); ++ if( retval < 0 ) { ++ char c = (char)0; ++ if(lseek(fd,length - 1, SEEK_SET) < 0 ) return -1; ++ return write(fd, &c, 1); ++ } ++ else return retval; + #endif + } + +@@ -169,7 +189,7 @@ DIR *dp; BTFILE *pbf; @@ -213,7 +2118,58 @@ diff -u ctorrent-1.3.4.orig/btfiles.cpp ctorrent-1.3.4/btfiles.cpp if( cur_path ){ strcpy(fn, full_cur); -@@ -293,7 +295,7 @@ +@@ -185,12 +205,12 @@ + while( (struct dirent*) 0 != (dirp = readdir(dp)) ){ + + if( 0 == strcmp(dirp->d_name, ".") || +- 0 == strcmp(dirp->d_name, "..") ) continue; ++ 0 == strcmp(dirp->d_name, "..") ) continue; + + if( cur_path ){ + if(MAXPATHLEN < snprintf(fn, MAXPATHLEN, "%s%c%s", cur_path, PATH_SP, dirp->d_name)){ +- fprintf(stderr,"error, pathname too long\n"); +- return -1; ++ fprintf(stderr,"error, pathname too long\n"); ++ return -1; + } + }else{ + strcpy(fn, dirp->d_name); +@@ -232,7 +252,7 @@ + return 0; + } + +-int btFiles::_btf_creat_by_path(const char *pathname, size_t file_length) ++int btFiles::_btf_creat_by_path(const char *pathname, int64_t file_length) + { + struct stat sb; + int fd; +@@ -251,17 +271,17 @@ + *p = '\0'; + if(stat(sp,&sb) < 0){ + if( ENOENT == errno ){ +- if( !last ){ ++ if( !last ){ + #ifdef WINDOWS +- if(mkdir(sp) < 0) break; ++ if(mkdir(sp) < 0) break; + #else +- if(mkdir(sp,0755) < 0) break; ++ if(mkdir(sp,0755) < 0) break; + #endif +- }else{ +- if((fd = creat(sp,0644)) < 0) { last = 0; break; } +- if(file_length && _btf_ftruncate(fd, file_length) < 0){close(fd); last = 0; break;} +- close(fd); +- } ++ }else{ ++ if((fd = creat(sp,0644)) < 0) { last = 0; break; } ++ if(file_length && _btf_ftruncate(fd, file_length) < 0){close(fd); last = 0; break;} ++ close(fd); ++ } + }else{last = 0; break;} + } + if( !last ){ *p = PATH_SP; pnext = p + 1;} +@@ -293,7 +313,7 @@ m_btfhead = pbf; }else if( S_IFDIR & sb.st_mode ){ char wd[MAXPATHLEN]; @@ -222,7 +2178,135 @@ diff -u ctorrent-1.3.4.orig/btfiles.cpp ctorrent-1.3.4/btfiles.cpp m_directory = new char[strlen(pathname) + 1]; #ifndef WINDOWS if( !m_directory ) return -1; -@@ -488,3 +490,54 @@ +@@ -319,20 +339,21 @@ + char path[MAXPATHLEN]; + const char *s, *p; + size_t r,q,n; +- if( !decode_query(metabuf, metabuf_len, "info|name",&s,&q,QUERY_STR) || ++ int64_t t; ++ if( !decode_query(metabuf, metabuf_len, "info|name",&s,&q,(int64_t*) 0,QUERY_STR) || + MAXPATHLEN <= q) return -1; + + memcpy(path, s, q); + path[q] = '\0'; + +- r = decode_query(metabuf,metabuf_len,"info|files",(const char**) 0, &q,QUERY_POS); ++ r = decode_query(metabuf,metabuf_len,"info|files",(const char**) 0, &q,(int64_t*) 0,QUERY_POS); + + if( r ){ + BTFILE *pbf_last = (BTFILE*) 0; + BTFILE *pbf = (BTFILE*) 0; + size_t dl; + if( decode_query(metabuf,metabuf_len,"info|length", +- (const char**) 0,(size_t*) 0,QUERY_INT) ) ++ (const char**) 0,(size_t*) 0,(int64_t*) 0,QUERY_LONG) ) + return -1; + + if( saveas ){ +@@ -355,14 +376,14 @@ + for(; q && 'e' != *p; p += dl, q -= dl){ + if(!(dl = decode_dict(p, q, (const char*) 0)) ) return -1; + if( !decode_query(p, dl, "length", (const char**) 0, +- &r,QUERY_INT) ) return -1; ++ (size_t*) 0,&t,QUERY_LONG) ) return -1; + pbf = _new_bfnode(); + #ifndef WINDOWS + if( !pbf ) return -1; + #endif +- pbf->bf_length = r; +- m_total_files_length += r; +- r = decode_query(p, dl, "path", (const char **) 0, &n,QUERY_POS); ++ pbf->bf_length = t; ++ m_total_files_length += t; ++ r = decode_query(p, dl, "path", (const char **) 0, &n,(int64_t*) 0,QUERY_POS); + if( !r ) return -1; + if(!decode_list2path(p + r, n, path)) return -1; + pbf->bf_filename = new char[strlen(path) + 1]; +@@ -375,13 +396,13 @@ + } + }else{ + if( !decode_query(metabuf,metabuf_len,"info|length", +- (const char**) 0,(size_t*) &q,QUERY_INT) ) ++ (const char**) 0,(size_t*) 0,&t,QUERY_LONG) ) + return -1; + m_btfhead = _new_bfnode(); + #ifndef WINDOWS + if( !m_btfhead) return -1; + #endif +- m_btfhead->bf_length = m_total_files_length = q; ++ m_btfhead->bf_length = m_total_files_length = t; + if( saveas ){ + m_btfhead->bf_filename = new char[strlen(saveas) + 1]; + #ifndef WINDOWS +@@ -409,31 +430,31 @@ + for(; pbt; pbt = pbt->bf_next){ + if( m_directory ){ + if( MAXPATHLEN <= snprintf(fn, MAXPATHLEN, "%s%c%s", m_directory, PATH_SP, pbt->bf_filename) ) +- return -1; ++ return -1; + }else{ + strcpy(fn, pbt->bf_filename); + } + + if(stat(fn ,&sb) < 0){ + if(ENOENT == errno){ +- if( !_btf_creat_by_path(fn,pbt->bf_length)){ +- fprintf(stderr,"error, create file %s failed.\n",fn); +- return -1; +- } ++ if( !_btf_creat_by_path(fn,pbt->bf_length)){ ++ fprintf(stderr,"error, create file %s failed.\n",fn); ++ return -1; ++ } + }else{ +- fprintf(stderr,"error, couldn't create file %s\n", fn); +- return -1; ++ fprintf(stderr,"error, couldn't create file %s\n", fn); ++ return -1; + } + }else{ + if( !check_exist) check_exist = 1; + if( !(S_IFREG & sb.st_mode) ){ +- fprintf(stderr,"error, file %s not a regular file.\n", fn); +- return -1; ++ fprintf(stderr,"error, file %s not a regular file.\n", fn); ++ return -1; + } + if(sb.st_size != pbt->bf_length){ +- fprintf(stderr,"error, file %s 's size not match. must be %u\n", +- fn, pbt->bf_length); +- return -1; ++ fprintf(stderr,"error, file %s 's size not match. must be %u\n", ++ fn, pbt->bf_length); ++ return -1; + } + } + } //end for +@@ -445,10 +466,21 @@ + BTFILE *p = m_btfhead; + size_t id = 1; + printf("FILES INFO\n"); ++ BitField tmpBitField, tmpFilter; + if(m_directory) printf("Directory: %s\n",m_directory); + for( ; p ; p = p->bf_next ){ +- printf("<%d> %c%s [%u]\n",id++, +- m_directory ? '\t': ' ',p->bf_filename, p->bf_length); ++ printf("<%d> %c%s [%llu]",id, ++ m_directory ? '\t': ' ',p->bf_filename, p->bf_length); ++ if( !arg_flg_exam_only ){ ++ BTCONTENT.SetTmpFilter(id, &tmpFilter); ++ tmpBitField = *BTCONTENT.pBF; ++ tmpBitField.Except(tmpFilter); ++ printf(" %u/%u (%d%%)", ++ tmpBitField.Count(), BTCONTENT.getFilePieces(id), ++ 100 * tmpBitField.Count() / BTCONTENT.getFilePieces(id)); ++ } ++ ++id; ++ printf("\n"); + } + printf("Total: %lu MB\n\n",(unsigned long)(m_total_files_length / 1024 / 1024)); + } +@@ -488,3 +520,73 @@ } return 1; } @@ -244,22 +2328,25 @@ diff -u ctorrent-1.3.4.orig/btfiles.cpp ctorrent-1.3.4/btfiles.cpp + size_t start,stop; + start = sizeBuffer/pieceLength; + stop = (sizeBuffer+p->bf_length)/pieceLength; -+ printf ("\rDownloading file: <%d> %s \nPieces: %d - %d (%d)\n",nfile,p->bf_filename,start,stop,stop-start+1); ++ // This "if" cuts down on false prints with CTCS. ++ if(arg_file_to_download == nfile){ ++ printf ("\rDownloading file: <%d> %s \nPieces: %d - %d (%d)\n",nfile,p->bf_filename,start,stop,stop-start+1); ++ } + p->bf_npieces = stop-start+1; + for(index=sizeBuffer/pieceLength;index<=(sizeBuffer+p->bf_length)/pieceLength;index++){ -+ pFilter->UnSet(index); ++ pFilter->UnSet(index); + } + } + sizeBuffer+=(u_int64_t) p->bf_length; + } -+ if(nfile>=id){ ++ if(nfile>=id || nfile==0){ + printf("\nEnd of files list. Resuming normal behaviour\n"); + pFilter->Invert(); + arg_file_to_download = 0; + } +} + -+size_t btFiles::getFilePieces(unsigned char nfile) ++size_t btFiles::getFilePieces(size_t nfile) +{ + //returns the pieces of the file already gotten + @@ -274,66 +2361,201 @@ diff -u ctorrent-1.3.4.orig/btfiles.cpp ctorrent-1.3.4/btfiles.cpp +return 0; +} + ++BTFILE *btFiles::GetNextFile(BTFILE *file) ++{ ++ static BTFILE *p = m_btfhead; + ++ if( 0==file ) p = m_btfhead; ++ else if( p==file ){ ++ p = p->bf_next; ++ }else{ ++ for( p=m_btfhead; p && (p != file); p = p->bf_next); ++ if( 0==p ){ ++ p = m_btfhead; ++ }else{ ++ p = p->bf_next; ++ } ++ } ++ return p; ++} + + -diff -u ctorrent-1.3.4.orig/btfiles.h ctorrent-1.3.4/btfiles.h ---- ctorrent-1.3.4.orig/btfiles.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btfiles.h 2005-08-11 23:45:29.427693984 +0200 -@@ -3,6 +3,10 @@ - +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btfiles.h ctorrent-1.3.4/btfiles.h +--- ctorrent-1.3.4.sav/btfiles.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btfiles.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,18 +1,22 @@ + #ifndef BTFILES_H + #define BTFILES_H + ++#include "./def.h" #include <sys/types.h> #include <stdio.h> +-#include "./def.h" + +#include "bitfield.h" -+extern unsigned char arg_file_to_download; -+ - #include "./def.h" typedef struct _btfile{ -@@ -14,6 +18,8 @@ + char *bf_filename; // full path of file. +- size_t bf_length; //single file length limits to 4 GB ++ u_int64_t bf_length; + FILE *bf_fp; - size_t bf_completed; // already downloaded length + time_t bf_last_timestamp; // last io timestamp. -+ size_t bf_npieces; //number of pieces +- size_t bf_completed; // already downloaded length ++ u_int64_t bf_completed; // already downloaded length + ++ size_t bf_npieces; //number of pieces + unsigned char bf_flag_opened:1; unsigned char bf_flag_need:1; - unsigned char bf_reserved:6; -@@ -53,6 +59,10 @@ +@@ -36,8 +40,8 @@ + + BTFILE* _new_bfnode(); + int _btf_open(BTFILE *sbf_p); +- int _btf_ftruncate(int fd,size_t length); +- int _btf_creat_by_path(const char *pathname, size_t file_length); ++ int _btf_ftruncate(int fd,int64_t length); ++ int _btf_creat_by_path(const char *pathname, int64_t file_length); + int _btf_destroy(); + int _btf_recurses_directory(const char *cur_path, BTFILE *lastnode); + +@@ -53,9 +57,14 @@ u_int64_t GetTotalLength() const { return m_total_files_length; } ssize_t IO(char *buf, u_int64_t off, size_t len, const int iotype); size_t FillMetaInfo(FILE* fp); + + void SetFilter(int nfile, BitField *pFilter,size_t pieceLength); -+ size_t getFilePieces(unsigned char nfile); ++ size_t getFilePieces(size_t nfile); + #ifndef WINDOWS void PrintOut(); #endif -diff -u ctorrent-1.3.4.orig/btrequest.cpp ctorrent-1.3.4/btrequest.cpp ---- ctorrent-1.3.4.orig/btrequest.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btrequest.cpp 2005-08-11 23:45:29.427693984 +0200 -@@ -44,6 +44,58 @@ - rq.rq_head = (PSLICE) 0; ++ BTFILE *GetNextFile(BTFILE *file); + }; + + #endif +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btrequest.cpp ctorrent-1.3.4/btrequest.cpp +--- ctorrent-1.3.4.sav/btrequest.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btrequest.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -24,24 +24,179 @@ + RequestQueue::RequestQueue() + { + rq_head = (PSLICE) 0; ++ rq_send = rq_head; + } + + void RequestQueue::Empty() + { + if(rq_head) _empty_slice_list(&rq_head); ++ rq_send = rq_head; } -+int RequestQueue::CopyShuffle(RequestQueue &rq) + void RequestQueue::SetHead(PSLICE ps) + { + if( rq_head ) _empty_slice_list(&rq_head); + rq_head = ps; ++ rq_send = rq_head; + } + + void RequestQueue::operator=(RequestQueue &rq) + { ++ PSLICE n, u = (PSLICE) 0; ++ size_t idx; ++ int flag = 0; ++ + if( rq_head ) _empty_slice_list(&rq_head); + rq_head = rq.rq_head; +- rq.rq_head = (PSLICE) 0; ++ rq_send = rq_head; ++ ++ // Reassign only the first piece represented in the queue. ++ n = rq_head; ++ idx = n->index; ++ for( ; n ; u = n,n = u->next){ ++ if( rq.rq_send == n ) flag = 1; ++ if( n->index != idx ) break; ++ } ++ if(n){ ++ u->next = (PSLICE) 0; ++ rq.rq_head = n; ++ if(flag) rq.rq_send = rq.rq_head; ++ }else{ ++ rq.rq_head = (PSLICE) 0; ++ rq.rq_send = rq.rq_head; ++ } ++} ++ ++int RequestQueue::Copy(RequestQueue *prq) +{ -+ PSLICE ps; ++ PSLICE n, u=(PSLICE)0, ps; ++ size_t idx; + -+ if( rq_head ) _empty_slice_list(&rq_head); -+ -+ if( rq.IsEmpty() ) return 0; -+ for (ps = rq.GetHead(); ps; ps = ps->next) { -+ if (random()&01) { -+ if (Add(ps->index, ps->offset, ps->length) < 0) return -1; ++ if( prq->IsEmpty() ) return 0; ++ ++ ps = prq->GetHead(); ++ idx = ps->index; ++ for ( ; ps; ps = ps->next) { ++ if( ps->index != idx ) break; ++ if( Add(ps->index, ps->offset, ps->length) < 0 ) return -1; ++ } ++ return 0; ++} ++ ++int RequestQueue::CopyShuffle(RequestQueue *prq, size_t piece) ++{ ++ PSLICE n, u=(PSLICE)0, ps, start; ++ size_t idx; ++ unsigned long rndbits; ++ int i=0; ++ ++ if( prq->IsEmpty() ) return 0; ++ ++ n = rq_head; ++ for( ; n ; u = n,n = u->next); // move to end ++ ++ ps = prq->GetHead(); ++ for ( ; ps && ps->index != piece; ps = ps->next); ++ start = ps; ++ ++ idx = ps->index; ++ ++ // First, skip to the slices that haven't been sent to the original peer. ++ if( prq->rq_send && prq->rq_send->index == idx ){ ++ ps = prq->rq_send; ++ for ( ; ps; ps = ps->next){ ++ if( ps->index != idx ) break; ++ if( !i-- ){ ++ rndbits = random(); ++ i = 30; ++ } ++ if( (rndbits>>=1)&01 ){ ++ if( Add(ps->index, ps->offset, ps->length) < 0 ) return -1; ++ } ++ else if( Insert(u, ps->index, ps->offset, ps->length) < 0 ) return -1; + } -+ else if (Insert(ps->index, ps->offset, ps->length) < 0) return -1; ++ if(u) n = u->next; ++ else n = rq_head; ++ for( ; n ; u = n,n = u->next); // move to end ++ } ++ ++ // Now put the already-requested slices at the end. ++ ps = start; ++ for ( ; ps && ps != prq->rq_send; ps = ps->next){ ++ if( ps->index != idx ) break; ++ if( !i-- ){ ++ rndbits = random(); ++ i = 30; ++ } ++ if( (rndbits>>=1)&01 ){ ++ if( Add(ps->index, ps->offset, ps->length) < 0 ) return -1; ++ } ++ else if( Insert(u, ps->index, ps->offset, ps->length) < 0 ) return -1; + } + return 0; +} + ++// Counts all queued slices. +size_t RequestQueue::Qsize() +{ + size_t cnt = 0; @@ -344,7 +2566,25 @@ diff -u ctorrent-1.3.4.orig/btrequest.cpp ctorrent-1.3.4/btrequest.cpp + return cnt; +} + -+int RequestQueue::Insert(size_t idx,size_t off,size_t len) ++// Counts only slices from one piece. ++size_t RequestQueue::Qlen(size_t piece) ++{ ++ size_t cnt = 0; ++ PSLICE n = rq_head; ++ PSLICE u = (PSLICE) 0; ++ size_t idx; ++ ++ for ( ; n && n->index != piece; n = n->next); ++ ++ if(n) idx = n->index; ++ for( ; n ; u = n,n = u->next){ ++ if( n->index != idx ) break; ++ cnt++; ++ } ++ return cnt; ++} ++ ++int RequestQueue::Insert(PSLICE ps,size_t idx,size_t off,size_t len) +{ + size_t cnt = 0; + PSLICE n = rq_head; @@ -360,31 +2600,230 @@ diff -u ctorrent-1.3.4.orig/btrequest.cpp ctorrent-1.3.4/btrequest.cpp + if( !n ) return -1; +#endif + -+ n->next = rq_head; + n->index = idx; + n->offset = off; + n->length = len; + -+ rq_head = n; ++ // ps is the slice to insert after; if 0, insert at the head. ++ if(ps){ ++ n->next = ps->next; ++ ps->next = n; ++ if( rq_send == n->next ) rq_send = n; ++ }else{ ++ n->next = rq_head; ++ rq_head = n; ++ rq_send = rq_head; ++ } ++ ++ return 0; + } + + int RequestQueue::Add(size_t idx,size_t off,size_t len) +@@ -64,8 +219,33 @@ + n->index = idx; + n->offset = off; + n->length = len; ++ n->reqtime = (time_t) 0; ++ ++ if( u ) u->next = n; ++ else{ ++ rq_head = n; ++ rq_send = rq_head; ++ } + +- if( u ) u->next = n; else rq_head = n; ++ if( !rq_send ) rq_send = n; + + return 0; +} + - int RequestQueue::Add(size_t idx,size_t off,size_t len) ++int RequestQueue::Append(PSLICE ps) ++{ ++ size_t cnt = 0; ++ PSLICE n = rq_head; ++ PSLICE u = (PSLICE) 0; ++ ++ for( ; n ; u = n,n = u->next) cnt++; // move to end ++ ++ if( cnt >= cfg_req_queue_length ) return -1; // already full ++ ++ if(u) u->next = ps; ++ else rq_head = ps; ++ ++ if( !rq_send ) rq_send = ps; + + return 0; + } +@@ -82,11 +262,41 @@ + if( !n ) return -1; /* not found */ + + if( u ) u->next = n->next; else rq_head = n->next; ++ if( rq_send == n ) rq_send = n->next; + delete n; + + return 0; + } + ++int RequestQueue::HasIdx(size_t idx) ++{ ++ PSLICE n = rq_head; ++ ++ for( ; n ; n = n->next){ ++ if(n->index == idx) break; ++ } ++ ++ return n ? 1 : 0; ++} ++ ++time_t RequestQueue::GetReqTime(size_t idx,size_t off,size_t len) ++{ ++ PSLICE n = rq_head; ++ ++ for( ; n ; n = n->next){ ++ if(n->index == idx && n->offset == off && n->length == len ) break; ++ } ++ ++ if( !n ) return -1; /* not found */ ++ ++ return n->reqtime; ++} ++ ++void RequestQueue::SetReqTime(PSLICE n,time_t t) ++{ ++ n->reqtime = t; ++} ++ + int RequestQueue::Pop(size_t *pidx,size_t *poff,size_t *plen) + { + PSLICE n; +@@ -99,6 +309,7 @@ + if(poff) *poff = rq_head->offset; + if(plen) *plen = rq_head->length; + ++ if( rq_send == rq_head ) rq_send = n; + delete rq_head; + + rq_head = n; +@@ -121,8 +332,6 @@ + { + size_t i,off,len,ns; + +- if( rq_head ) _empty_slice_list(&rq_head); +- + ns = NSlices(idx); + + for( i = off = 0; i < ns; i++){ +@@ -154,9 +363,11 @@ + int RequestQueue::IsValidRequest(size_t idx,size_t off,size_t len) { - size_t cnt = 0; -@@ -231,3 +283,33 @@ + return ( idx < BTCONTENT.GetNPieces() && +- len && +- (off + len) <= BTCONTENT.GetPieceLength(idx) && +- len <= cfg_max_slice_size) ? ++ len && ++ (off + len) <= BTCONTENT.GetPieceLength(idx) && ++// len <= cfg_max_slice_size) ? ++ // See note for cfg_max_slice_size in btconfig.h ++ len <= 2 * cfg_max_slice_size) ? + 1 : 0; + } + +@@ -196,20 +407,51 @@ + + int PendingQueue::Pending(RequestQueue *prq) + { +- int i = 0; ++ int i = 0, j = 0; ++ PSLICE n, u = (PSLICE) 0; ++ size_t idx, off, len; ++ RequestQueue tmprq; + + if( pq_count >= PENDING_QUEUE_SIZE ){ + prq->Empty(); + return -1; } ++ if( prq->Qlen(prq->GetRequestIdx()) >= ++ BTCONTENT.GetPieceLength() / cfg_req_slice_size ){ ++ // This shortcut relies on the fact that we don't add to a queue if it ++ // already contains a full piece. ++ prq->Empty(); ++ return 0; ++ } + +- for( ; i < PENDING_QUEUE_SIZE; i++) ++ for( ; i < PENDING_QUEUE_SIZE; i++){ + if(pending_array[i] == (PSLICE) 0){ +- pending_array[i] = prq->GetHead(); +- prq->Release(); +- pq_count++; +- break; ++ // Don't add a piece to Pending more than once. ++ if(!j) j = i; ++ }else if(prq->GetRequestIdx() == pending_array[i]->index){ ++ while( !prq->IsEmpty() && ++ prq->GetRequestIdx() == pending_array[i]->index ) ++ prq->Pop(&idx,&off,&len); ++ if( prq->IsEmpty() ) return 0; ++ i = 0; + } ++ } ++ i = j; ++ pending_array[i] = prq->GetHead(); ++ prq->Release(); ++ pq_count++; ++ ++ // If multiple pieces are queued, break up the queue separately. ++ n = pending_array[i]; ++ idx = n->index; ++ for( ; n ; u = n, n = u->next) ++ if( n->index != idx ) break; ++ if(n){ ++ u->next = (PSLICE) 0; ++ tmprq.SetHead(n); ++ Pending(&tmprq); ++ tmprq.Release(); ++ } + return 0; } +@@ -218,16 +460,57 @@ + { + int i = 0; + size_t sc = pq_count; ++ size_t idx; + for( ; i < PENDING_QUEUE_SIZE && sc; i++){ + if( pending_array[i] != (PSLICE) 0){ ++ if( bf.IsSet(pending_array[i]->index) && ++ !prq->HasIdx(pending_array[i]->index) ){ ++ idx = pending_array[i]->index; ++ prq->Append(pending_array[i]); ++ pending_array[i] = (PSLICE) 0; ++ pq_count--; ++ Delete(idx); // delete any copies from Pending ++ break; ++ } + sc--; +- if( bf.IsSet(pending_array[i]->index) ){ +- prq->SetHead(pending_array[i]); +- pending_array[i] = (PSLICE) 0; +- pq_count--; +- break; ++ } ++ } ++ // Return value now indicates whether a piece was assigned. ++ return sc; ++} + ++// This routine should no longer be necessary, but keeping it as a failsafe. +int PendingQueue::Delete(size_t idx) +{ + int i = 0; + for ( ; i < PENDING_QUEUE_SIZE && pq_count; i++){ + if( (PSLICE) 0 != pending_array[i] && idx == pending_array[i]->index){ -+ delete pending_array[i]; -+ pending_array[i] = (PSLICE) 0; ++ if(arg_verbose) fprintf(stderr, "PQD found %d\n", (int)idx); ++ _empty_slice_list(&(pending_array[i])); ++ pq_count--; ++ break; + } + } + return 0; @@ -399,31 +2838,77 @@ diff -u ctorrent-1.3.4.orig/btrequest.cpp ctorrent-1.3.4/btrequest.cpp + //check if off & len match any slice + //remove the slice if so + rq.SetHead(pending_array[i]); -+ if( rq.Remove(idx, off, len) == 0 ) ++ if( rq.Remove(idx, off, len) == 0 ){ + pending_array[i] = rq.GetHead(); ++ if( (PSLICE) 0 == pending_array[i] ) pq_count--; ++ i = PENDING_QUEUE_SIZE; // exit loop + } + rq.Release(); -+ } -+ } -+ return 0; -+} + } + } + return 0; + } + -diff -u ctorrent-1.3.4.orig/btrequest.h ctorrent-1.3.4/btrequest.h ---- ctorrent-1.3.4.orig/btrequest.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btrequest.h 2005-08-11 23:45:29.427693984 +0200 -@@ -31,9 +31,12 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btrequest.h ctorrent-1.3.4/btrequest.h +--- ctorrent-1.3.4.sav/btrequest.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btrequest.h 2006-06-28 19:30:02.000000000 +0200 +@@ -2,6 +2,7 @@ + #define SLICE_H + + #include <sys/types.h> ++#include <time.h> + #include "btcontent.h" + #include "bitfield.h" + +@@ -9,6 +10,7 @@ + size_t index; + size_t offset; + size_t length; ++ time_t reqtime; + struct _slice *next; + }SLICE,*PSLICE; + +@@ -17,6 +19,7 @@ + private: + PSLICE rq_head; + public: ++ PSLICE rq_send; // next slice to request + + RequestQueue(); + ~RequestQueue(); +@@ -24,18 +27,30 @@ + void Empty(); + + void SetHead(PSLICE ps); ++ void SetNextSend(PSLICE ps) { rq_send = ps; } + PSLICE GetHead() const { return rq_head; } ++ PSLICE NextSend() const { return rq_send; } + size_t GetRequestIdx(){ return rq_head ? rq_head->index : BTCONTENT.GetNPieces(); } + size_t GetRequestLen(){ return rq_head ? rq_head->length : 0; } +- void Release(){ rq_head = (PSLICE) 0; } ++ void Release(){ rq_head = rq_send = (PSLICE) 0; } int IsValidRequest(size_t idx,size_t off,size_t len); void operator=(RequestQueue &rq); -+ int CopyShuffle(RequestQueue &rq); ++ int Copy(RequestQueue *prq); ++ int CopyShuffle(RequestQueue *prq, size_t piece); + size_t Qsize(); ++ size_t Qlen(size_t piece); int IsEmpty() const { return rq_head ? 0 : 1; } -+ int Insert(size_t idx,size_t off,size_t len); ++ int Insert(PSLICE ps,size_t idx,size_t off,size_t len); int Add(size_t idx,size_t off,size_t len); ++ int Append(PSLICE ps); int Remove(size_t idx,size_t off,size_t len); ++ int HasIdx(size_t idx); ++ time_t GetReqTime(size_t idx,size_t off,size_t len); ++ void SetReqTime(PSLICE n,time_t t); ++ -@@ -60,6 +63,8 @@ + int Pop(size_t *pidx,size_t *poff,size_t *plen); + int Peek(size_t *pidx,size_t *poff,size_t *plen) const; +@@ -60,6 +75,8 @@ int Pending(RequestQueue *prq); int ReAssign(RequestQueue *prq, BitField &bf); int Exist(size_t idx); @@ -432,9 +2917,9 @@ diff -u ctorrent-1.3.4.orig/btrequest.h ctorrent-1.3.4/btrequest.h }; extern PendingQueue PENDINGQUEUE; -diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp ---- ctorrent-1.3.4.orig/btstream.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/btstream.cpp 2005-08-11 23:45:29.428693832 +0200 +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/btstream.cpp ctorrent-1.3.4/btstream.cpp +--- ctorrent-1.3.4.sav/btstream.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/btstream.cpp 2006-06-28 19:30:02.000000000 +0200 @@ -1,5 +1,6 @@ #include <arpa/inet.h> #include "btstream.h" @@ -442,7 +2927,7 @@ diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp #include "msgencode.h" #include "btconfig.h" -@@ -11,7 +12,8 @@ +@@ -11,22 +12,21 @@ ssize_t btStream::Send_State(unsigned char state) { char msg[H_BASE_LEN + 4]; @@ -450,9 +2935,10 @@ diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp + + set_nl(msg, H_BASE_LEN); msg[4] = (char)state; - return out_buffer.PutFlush(sock,msg,H_BASE_LEN + 4); +- return out_buffer.PutFlush(sock,msg,H_BASE_LEN + 4); ++ return out_buffer.Put(sock,msg,H_BASE_LEN + 4); } -@@ -19,12 +21,10 @@ + ssize_t btStream::Send_Have(size_t idx) { char msg[H_HAVE_LEN + 4]; @@ -465,9 +2951,19 @@ diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp - *p = htonl(idx); + set_nl(msg + 5, idx); - return out_buffer.PutFlush(sock,msg,H_HAVE_LEN + 4); +- return out_buffer.PutFlush(sock,msg,H_HAVE_LEN + 4); ++ return out_buffer.Put(sock,msg,H_HAVE_LEN + 4); } -@@ -43,14 +43,12 @@ + + ssize_t btStream::Send_Bitfield(char *bit_buf,size_t len) +@@ -37,20 +37,18 @@ + if(r < 0) return r; + r = out_buffer.Put(sock,(char*)&t,1); + if(r < 0) return r; +- return out_buffer.PutFlush(sock,bit_buf,len); ++ return out_buffer.Put(sock,bit_buf,len); + } + ssize_t btStream::Send_Cancel(size_t idx,size_t off,size_t len) { char msg[H_CANCEL_LEN + 4]; @@ -486,7 +2982,7 @@ diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp return out_buffer.Put(sock,msg,H_CANCEL_LEN + 4); } -@@ -72,14 +70,12 @@ +@@ -72,21 +70,19 @@ ssize_t btStream::Send_Request(size_t idx, size_t off,size_t len) { char msg[H_REQUEST_LEN + 4]; @@ -505,6 +3001,14 @@ diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp return out_buffer.Put(sock,msg,H_REQUEST_LEN + 4); } + ssize_t btStream::Send_Keepalive() + { + size_t i = 0; +- return out_buffer.PutFlush(sock,(char*)&i,4); ++ return out_buffer.Put(sock,(char*)&i,4); + } + + int btStream::HaveMessage() @@ -94,7 +90,7 @@ // if message arrived. size_t r; @@ -514,14 +3018,4710 @@ diff -u ctorrent-1.3.4.orig/btstream.cpp ctorrent-1.3.4/btstream.cpp if( (cfg_max_slice_size + H_PIECE_LEN + 4) < r) return -1; //message too long if( (r + 4) <= in_buffer.Count() ) return 1; } -diff -u ctorrent-1.3.4.orig/ctorrent.cpp ctorrent-1.3.4/ctorrent.cpp ---- ctorrent-1.3.4.orig/ctorrent.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/ctorrent.cpp 2005-08-11 23:45:29.428693832 +0200 -@@ -87,9 +87,13 @@ - Tracker.Initial(); +@@ -113,5 +109,5 @@ + + ssize_t btStream::Send_Buffer(char *buf, size_t len) + { +- return out_buffer.PutFlush(sock,buf,len); ++ return out_buffer.Put(sock,buf,len); + } +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bttime.h ctorrent-1.3.4/bttime.h +--- ctorrent-1.3.4.sav/bttime.h 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/bttime.h 2006-06-28 19:30:02.000000000 +0200 +@@ -0,0 +1,7 @@ ++#ifndef BTTIME_H ++#define BTTIME_H ++ ++extern time_t now; ++ ++#endif ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bufio.cpp ctorrent-1.3.4/bufio.cpp +--- ctorrent-1.3.4.sav/bufio.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/bufio.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -61,7 +61,7 @@ + #ifndef WINDOWS + if(errno == EINTR) continue; + #endif +- return (EWOULDBLOCK == errno) ? (ssize_t)t : -1; ++ return (EWOULDBLOCK == errno || EAGAIN == errno) ? (ssize_t)t : -1; + }else if( 0 == r ){ + return t; // no possible??? + }else{ +@@ -83,7 +83,7 @@ + #ifndef WINDOWS + if(errno == EINTR) continue; + #endif +- return (EWOULDBLOCK == errno) ? (ssize_t)t : -1; ++ return (EWOULDBLOCK == errno || EAGAIN == errno) ? (ssize_t)t : -1; + }else if( 0 == r ){ + f_socket_remote_closed = 1; + return t; //connection closed by remote. +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/bufio.h ctorrent-1.3.4/bufio.h +--- ctorrent-1.3.4.sav/bufio.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/bufio.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,8 +1,8 @@ + #ifndef BUFIO_H + #define BUFIO_H + +-#include <sys/types.h> + #include "def.h" ++#include <sys/types.h> + + #ifdef WINDOWS + #include <Winsock2.h> +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/ChangeLog ctorrent-1.3.4/ChangeLog +--- ctorrent-1.3.4.sav/ChangeLog 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/ChangeLog 2006-06-28 19:30:02.000000000 +0200 +@@ -1 +1,379 @@ +-*EMPTY* ++ ++ Enhanced CTorrent Change Log ++ _________________________________________________________________ ++ ++ Changes for "dnh2" Release ++ ++ Patches ++ * The following patches or their functionality are incorporated: ++ 1380164 [dnh1.2] ++ 1357832 [invert] (included in dnh1.2) ++ 1352866 [dnh1.1] ++ 1266767 [passkey2] ++ 1239547 [dnh1] ++ 1170457 [standalone-sha1] Added as a fallback case in configure if ++ OpenSSL is not found. To force it to be used, define ++ USE_STANDALONE_SHA1 in config.h (after running configure). ++ 1164454 [ip] ++ 1119610 [vfat] This bug appears to be linux-specific; I've tried ++ to handle it in a more general way that may apply to similar ++ situations on other platforms and filesystems, but I have limited ++ capability to test this. ++ 1067196 [lfs] This is the large-file support that many have asked ++ for. ++ ++ Optimization ++ * Use fewer call to random() by shifting the previously unused bits. ++ * Time() calls have been greatly reduced; a global timestamp ++ variable "now" is set once per main loop interation and referenced ++ in functions that need a timestamp (except the caching I/O ++ routines which were left alone). ++ * Overall current bandwidth rates are now computed only once per ++ main loop and referenced in any routines that evaluate or control ++ bandwidth. ++ * Avoid flushing peer output buffers except in SendModule. This ++ allows for some consolidation of messages to reduce network ++ overhead. ++ ++ Code Fixes ++ * Fixed use of cfg_req_queue_length to be the actual queue size ++ (queue was half of this value). ++ * Fixed: "peer is" verbose output could fubar the terminal. ++ * Formatting: Replaced indentation tabs with spaces for consistency. ++ ++ Operational Enhancements ++ * Improved piece selection methods to include rarity as a factor. ++ This is not strictly "rarest-first", as we do not make a ++ comprehensive effort to find the "rarest" piece or rank pieces by ++ rarity. Rather, we use a more efficient compromise and try to find ++ the set of pieces that have "trade value" (another peer needs ++ them) and make a random choice from that set. Here is the current ++ preference order used in each mode: ++ Trade Value is defined as: ++ 1. Piece that only this peer has (not considering other ++ seeders), that a peer in which we're interested needs. ++ 2. Piece that not every peer in which we're interested has. ++ 3. Piece that only this peer has (not considering other ++ seeders). ++ 4. Piece that not every peer has. ++ Normal Mode ++ 1. Piece we tried to get from another peer but stopped due to ++ choking or lost connection. (We have part of the piece ++ already.) ++ 2. Piece most recently acquired by the peer (possibly/probably ++ rare). ++ 3. Piece with trade value. ++ 4. Any piece not yet requested. ++ Initial-piece Mode ++ 1. Piece with trade value which is already in progress. ++ 2. Piece with trade value that more than one peer has. ++ 3. Piece with trade value. ++ 4. Any piece not yet requested. ++ Endgame Mode ++ 1. Piece with trade value which is already in progress, of which ++ we have the least amount. ++ 2. Piece already in progress of which we have the least amount. ++ * Advanced request queueing system. ++ + Instead of requesting all of the slices for a piece at one ++ time, we now measure latency to the peer and send requests ++ based on how long it takes the data to arrive. This avoids ++ wasting upload banwidth by having too many outstanding ++ requests: If we get choked or lose the connection, the extra ++ requests were wasted; in initial or endgame modes, more ++ requests would have to be cancelled when we completed the ++ piece. ++ + A new piece will be queued for download when there is space ++ in the queue and we've requested the slices that have been ++ queued already. We also don't wait for the current piece to ++ complete before sending requests for a new piece. This helps ++ to maintain a continuous flow of data in the download ++ pipeline. ++ + When duplicating a request in initial or endgame mode, slices ++ that have already been requested are queued last. ++ * Don't send HAVE messages to seeders (to save UL bandwidth). ++ + Since we maintain interested state, and know the peer is a ++ seeder, we'll do the right thing when we become a seeder. ++ + Not sending HAVE to all peers (leechers) that already have ++ the piece is a bad idea IMO. If everyone takes the same ++ attitude, none of us will know when another becomes a seeder ++ and connections will remain open/occupied. ++ + We do send a HAVE to seeders upon completing our first piece ++ so that we don't continue to appear empty. ++ * Endgame strategy is used in get1file mode to complete the file. ++ * Queue management: ++ + Don't accept requests from choked peers. ++ + Discard peer's reponse_q when we choke them. ++ + Don't send cancels when we get choked (according to spec & ++ discussions). ++ + Don't put full piece queues in pending. ++ + Move closing peer's request queue to pending instead of ++ discarding it. ++ * Prefer uploading to or downloading from a peer after we skip them ++ due to bandwidth limiting. This is done via the g_next_up and ++ g_defer_up global variables in peer.cpp (for UL; s/up/dn for the ++ DL versions). The peerlist Sort() function and peer "click" ++ variables have been removed since they are not needed with this ++ feature. ++ ++ Options & Features ++ * The -c option now reports file completion status. ++ + As a side effect the metainfo details are printed twice. This ++ allows you to view the torrent contents while pieces are ++ being verified. ++ + Total percentage completion is also added to the output. ++ * "-E" option to seed to a specified UL:DL ratio. Seeding will stop ++ when this ratio or the timeout (-e) is reached. If CTorrent starts ++ as a seeder, the ratio is interpreted as UL:[torrent size]. ++ * If "-e 0" is specified (explicitly) and -E is used, there will be ++ no timeout; seeding will continue until the ratio is reached. ++ * The "-m" option previously didn't do anything, and it isn't clear ++ what it was originally going to do. Now the default value is 1, ++ and CTorrent will try to maintain at least this many peers by ++ contacting the tracker early if the peer count falls below this ++ value. This feature was present in release dnh1 but the value was ++ not changeable. ++ Actually it seems likely that this was to be number of peers that ++ the client would try to obtain (by initiating connections), as the ++ "official" client does; this is mentioned as a note in the online ++ specification. I don't really see the value in that though. That ++ said, the option as implemented here should rarely be used. It ++ might be useful only with torrents that have significantly more ++ than max_peers total peers and use a long tracker update interval ++ (such that you tend to drop a lot of peers betwen updates). ++ * "-z" option to set the slice size (the unit of a request, i.e. the ++ discrete amount of data that will be requested from a peer at one ++ time). The slice size now defaults to 16K regardless of the piece ++ length. Request queue size is computed and set based on the slice ++ size, as it now affects only system resources (though not a lot) ++ and not the way that requests are sent. ++ * Add support for "key" and "trackerid" tracker interaction ++ parameters. ++ * Support/display tracker warning message ++ * Now able to handle torrents with more than 255 files. ++ * Support for [1]CTorrent Control Server, an application and ++ protocol for monitoring and managing multiple Enhanced CTorrent ++ clients. The "-S" option is used to connect to CTCS, as in "-S ++ localhost:2780" if CTCS is listening at port 2780 on the local ++ system. Appending a colon ("-S localhost:2780:") will prompt for a ++ password to authenticate with CTCS. ++ ++ Peer Handling ++ * Count immediate choke-unchoke (either order) as an error (two ++ errors actually, since it's so wasteful). ++ It may be that some clients do this to stimulate the peer when ++ they think it hasn't responded to their last unchoke (due to high ++ latency). It would be better for them to just repeat the unchoke ++ rather than choke-unchoke, as by choking they will cause the peer ++ to send the requests again. ++ * Detect unresponsive peer connections and try to fix them or ++ disconnect them. Basically, if a peer doesn't respond to our ++ request in a reasonable time then we first assume that our request ++ was lost in transmission; if it happens again then we assume the ++ connection is unreliable. ++ * Handle peers that suppress HAVE messages so we don't always think ++ that they're empty (and thus give them preferential treatment for ++ uploading). If we've sent the peer an amount of data equivalent to ++ two pieces, assume that they now have at least one complete piece. ++ _________________________________________________________________ ++ ++ Changes for "dnh1.2" Release ++ ++ These are just corrections to the previous release that I felt were ++ necessary. Much more improvement is coming in the dnh2 release. ++ ++ Bug/code fixes ++ * Bitfield::Invert patch [1357832 on sourceforge] described below. ++ * Fixed "piece length too long" check to reflect the actual queue ++ length used. ++ * Accept 128K slice size for peer requests. ++ * "Return" keyword in Random_init() removed due to potential compile ++ error. ++ * Modified longer-wait test in the optimistic unchoke routine to ++ consider whether the peer is currently choked. ++ _________________________________________________________________ ++ ++ Bitfield::Invert bug ++ ++ There is a bug in the Bitfield::Invert() function that affects the ++ ctorrent-1.3.4 base code as well as releases dnh1 and dnh1.1. This can ++ cause the application to fail (segmentation fault) or may affect ++ downloading of all pieces of the torrent. A patch is available in the ++ Download secion. ++ _________________________________________________________________ ++ ++ Changes for "dnh1.1" Release ++ ++ These are just corrections to the previous release that I felt were ++ necessary. Much more improvement is coming in the next release. ++ ++ Bug/code fixes ++ * Peer count would increase on each tracker update if there were no ++ seeders. ++ * RequestQueue::CopyShuffle() changed to use a pointer argument. ++ * Fixed some incorrectness in PendingQueue::Delete() and ++ PendingQueue::DeleteSlice() which could cause a memory leak. ++ * Fixed random-chance inversion bug in PeerList::UnChokeCheck() ++ affecting choice for optimistic unchoking. ++ ++ Improvements ++ * Move StopDLTimer() call from RequestPiece() to RequestCheck(), ++ which could occasionally affect peer download rate measurement. ++ * Most clients do not like a slice size of 128K even though it is ++ the max allowed by the BT specification. Changed max slice size to ++ 64K. Note that the maximum piece length is 2MB (2097152); if you ++ need to download a torrent with a larger piece size you can change ++ the value of cfg_req_queue_length in btconfig.h from 64 to 128. ++ * Contact tracker immediately upon becoming (or starting as) a ++ seeder. ++ * Changed SendModule() to send only one slice at a time. This will ++ help with fairly distributing upload bandwidth among the unchoked ++ peers. ++ * Changed default peer ID prefix to '-CD0101-', indicating ++ CTorrent-dnh1.1 release. ++ _________________________________________________________________ ++ ++ Changes for "dnh1" Release ++ ++ This is the first release. "dnh" identifies this patchset, and "1" ++ indicates release version 1 of the patchset. ++ ++ Patches ++ * Incorporates the following patches. The number is the Request ID ++ from the [2]SourceForge patches page, which you can reference for ++ the details of each patch. The name in brackets is the name of the ++ patch file or a name I chose to refer to the patch. Some of these ++ names are used below (in brackets) to describe a fix or change to ++ a particular patch. ++ 1042808 [getcwd] (incorporated in get1file patch) ++ 1084776 [passkey] (incorporated in udlimit patch) ++ 1109266 [align] ++ 1109287 [tracker/tracker2] ++ 1114197 [fmt] (incorporated in get1file patch) ++ 1114364 [resetdl] ++ 1116448 [get1file] ++ 1118597 [crash] ++ 1119467 [stall] ++ 1119492 [rate] ++ 1119497 [flush] ++ 1119519 [opt] ++ 1119689 [status] ++ 1124342 [udlimit] ++ ++ Download performance ++ * If a peer socket is ready for reading and writing, perform both. ++ Previously the cases were exclusive, with preference given to ++ reading. ++ * Download requests are now made to peers when they are ready for ++ writing (in addition to the existing event-driven cases). This ++ fixes peer stalls when a request couldn't be sent in an ++ event-triggered case due to bandwidth limiting or other ++ circumstances. ++ * Additional tests added so that the above request checking doesn't ++ create hard loops. ++ ++ Bandwidth measurement/management ++ * [rate] Bandwidth reporting is now not capped. Also, only the time ++ used for the samples taken is used in the calculation rather than ++ the maximum interval (this affects rate calculation for individual ++ peers). ++ * Additional upload and download bandwidth limit checks added so ++ that bw management is more accurate. ++ * Corrected condition inversion bug in Rate::StopTimer(), which ++ affects peer rate calculations. ++ ++ Peer count ++ * Request our max number of peers from the tracker each time rather ++ than just taking the tracker's default, so we can try to fill up. ++ * The tracker will be contacted early if all peers disconnect so ++ that we can actively try to establish some more peer connections. ++ To avoid hammering the tracker, we must have at least one peer for ++ 15 seconds in order for this to be invoked. ++ * Some clients use nonzero bytes in the "reserved" part of the ++ handshake. Added code to ignore the reserved bytes if the rest of ++ the handshake is as expected. This includes Azureus 2300 thru 2304 ++ (latest) which gives 0x80 as the first reserved byte and BitComet ++ which gives 0x6578 ("ex") as the first two bytes. ++ * Update peer's timestamp on any message, not just keepalives. Any ++ receipt of data from a peer now resets its timeout, preventing ++ early disconnect. ++ ++ Parallel requests ++ * Initial-piece and endgame cases have been improved so that pieces ++ will be requested from multiple peers. Cancels are sent as slices ++ (subpieces) are received. This endgame strategy is described in ++ the BitTorrent online spec. The startup strategy is also described ++ in posts and facilitates obtaining a single piece more rapidly in ++ order to obtain some trade value. In initial mode, the piece of ++ which we need the least parts is targeted. In endgame mode, the ++ piece of which we need the most parts is targeted. Slices that are ++ cancelled are also removed from the "pending" queue, as are pieces ++ that are completed. ++ * When duplicating a piece request, the slice request order is also ++ shuffled in order to minimize duplication of effort. ++ ++ Tracker info ++ * [status] Seems to be missing tracker.cpp diff. Added code to get ++ tracker's total peers, but not all trackers report these fields in ++ the normal response. Also added code to count successful updates ++ from the tracker. ++ * Added tracker connection state to status line (when ++ connecting/connected). ++ ++ Tracker contact ++ * When interrupting (ctrl-C), connect to the tracker immediately ++ rather than waiting 15 seconds. ++ * Contact tracker "soon" after transitioning to seeder state. ++ ++ Peer interaction ++ * Manage our interested state for each peer dynamically as content ++ changes. ++ * Unchoking ++ + Use the peer's interested state (confirming via the bitfield ++ that it needs our data) to consider unchoking. Using only the ++ bitfield could cause us to waste an upload slot on a peer ++ that doesn't have all content but isn't interested (like a ++ single-file downloader). ++ + Choke peers that become uninterested or don't need our data. ++ + Try unchoking new peers only as slots open or the optimistic ++ unchoke rotates. Unchoking too many peers can temporarily ++ reduce per-peer upload rates, which would make uploading to ++ us unappealing for good peers. ++ + In a tie for download speed, prefer to unchoke the peer to ++ whom we've uploaded the least data relative to what we've ++ downloaded from him. ++ * Optimistic unchoking ++ + Fixed condition inversion bug causing opt unchoking to occur ++ too often. ++ + A peer who has no pieces is now preferred 75% vs. a peer who ++ already has at least one piece, in order to help the new peer ++ become productive. This is documented in the online spec. ++ + Set peer's last-unchoke-time when choking the peer to get ++ better rotation of the optimistic unchoke. The value is now ++ the last time that a peer was in the unchoked state rather ++ than the time of the last unchoke event. ++ ++ Miscellaneous items ++ * [tracker] Fixed normal program end (stop) process, which was ++ crashing. ++ * [get1file] Restore compact tracker response support. ++ * [get1file] Made display of the status line info dependent on ++ whether the option is in use. ++ * [get1file] Apply the filter when checking for what we need from a ++ peer instead of when recording what the peer has; this prevents ++ stalls when we move on to the next file. Update interested state ++ for each peer when we begin a new file. Also move the file-done ++ check into the piece completion code and check whether the next ++ file(s) has also been completed. ++ * Reduced the slice size from 32K to 16K (same as BT & Azureus). ++ This provides more precise DL rate measurement, and helps insure ++ that we receive a productive amount of data (i.e. a complete ++ slice) even if we are unchoked by a peer for only one cycle. See ++ [3]http://groups.yahoo.com/group/BitTorrent/message/1260 for more ++ discussion/analysis on this. ++ * Added -v (verbose) option for additional debugging output. ++ ++References ++ ++ 1. http://www.rahul.net/dholmes/ctorrent/ctcs.html ++ 2. http://sourceforge.net/tracker/?atid=598034&group_id=91688&func=browse ++ 3. http://groups.yahoo.com/group/BitTorrent/message/1260 +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/config.h.in ctorrent-1.3.4/config.h.in +--- ctorrent-1.3.4.sav/config.h.in 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/config.h.in 2006-06-28 19:30:02.000000000 +0200 +@@ -10,6 +10,9 @@ + /* Define to 1 if you have the <fcntl.h> header file. */ + #undef HAVE_FCNTL_H + ++/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ ++#undef HAVE_FSEEKO ++ + /* Define to 1 if you have the `ftruncate' function. */ + #undef HAVE_FTRUNCATE + +@@ -31,6 +34,9 @@ + /* Define to 1 if you have the `crypt' library (-lcrypt). */ + #undef HAVE_LIBCRYPT + ++/* Define to 1 if you have the `crypto' library (-lcrypto). */ ++#undef HAVE_LIBCRYPTO ++ + /* Define to 1 if you have the `md' library (-lmd). */ + #undef HAVE_LIBMD + +@@ -107,6 +113,9 @@ + /* Define to 1 if you have the `strtol' function. */ + #undef HAVE_STRTOL + ++/* Define to 1 if you have the `strtoll' function. */ ++#undef HAVE_STRTOLL ++ + /* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'. + */ + #undef HAVE_SYS_DIR_H +@@ -164,15 +173,29 @@ + /* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ + #undef TIME_WITH_SYS_TIME + ++/* Define to 1 to use the Steve Reid's public-domain SHA-1 code. */ ++#undef USE_STANDALONE_SHA1 ++ + /* Version number of package */ + #undef VERSION + ++/* Number of bits in a file offset, on hosts where this is settable. */ ++#undef _FILE_OFFSET_BITS ++ ++/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ ++#undef _LARGEFILE_SOURCE ++ ++/* Define for large files, on AIX-style hosts. */ ++#undef _LARGE_FILES ++ + /* Define to empty if `const' does not conform to ANSI C. */ + #undef const + +-/* Define as `__inline' if that's what the C compiler calls it, or to nothing +- if it is not supported. */ ++/* Define to `__inline__' or `__inline' if that's what the C compiler ++ calls it, or to nothing if 'inline' is not supported under any name. */ ++#ifndef __cplusplus + #undef inline ++#endif + + /* Define to `unsigned' if <sys/types.h> does not define. */ + #undef size_t +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/configure ctorrent-1.3.4/configure +--- ctorrent-1.3.4.sav/configure 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/configure 2006-06-28 19:30:02.000000000 +0200 +@@ -1,11 +1,10 @@ + #! /bin/sh + # Guess values for system-dependent variables and create Makefiles. +-# Generated by GNU Autoconf 2.57 for CTorrent devel. ++# Generated by GNU Autoconf 2.59 for CTorrent dnh2. + # +-# Report bugs to <bsdi@sina.com>. ++# Report bugs to <dholmes@ct.boxmail.com>. + # +-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +-# Free Software Foundation, Inc. ++# Copyright (C) 2003 Free Software Foundation, Inc. + # This configure script is free software; the Free Software Foundation + # gives unlimited permission to copy, distribute and modify it. + ## --------------------- ## +@@ -22,9 +21,10 @@ + elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix + fi ++DUALCASE=1; export DUALCASE # for MKS sh + + # Support unset when possible. +-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset + else + as_unset=false +@@ -43,7 +43,7 @@ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME + do +- if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var +@@ -220,16 +220,17 @@ + if mkdir -p . 2>/dev/null; then + as_mkdir_p=: + else ++ test -d ./-p && rmdir ./-p + as_mkdir_p=false + fi + + as_executable_p="test -f" + + # Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + + # Sed expression to map a string onto a valid variable name. +-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + # IFS +@@ -268,9 +269,9 @@ + # Identity of this package. + PACKAGE_NAME='CTorrent' + PACKAGE_TARNAME='ctorrent' +-PACKAGE_VERSION='devel' +-PACKAGE_STRING='CTorrent devel' +-PACKAGE_BUGREPORT='bsdi@sina.com' ++PACKAGE_VERSION='dnh2' ++PACKAGE_STRING='CTorrent dnh2' ++PACKAGE_BUGREPORT='dholmes@ct.boxmail.com' + + ac_unique_file="ctorrent.cpp" + # Factoring default headers for most tests. +@@ -310,7 +311,7 @@ + # include <unistd.h> + #endif" + +-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP LIBOBJS LTLIBOBJS' ++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CC CFLAGS ac_ct_CC CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP LIBOBJS LTLIBOBJS' + ac_subst_files='' + + # Initialize some variables set by options. +@@ -669,7 +670,7 @@ + + # Be sure to have absolute paths. + for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ +- localstatedir libdir includedir oldincludedir infodir mandir ++ localstatedir libdir includedir oldincludedir infodir mandir + do + eval ac_val=$`echo $ac_var` + case $ac_val in +@@ -709,10 +710,10 @@ + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || + $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$0" : 'X\(//\)[^/]' \| \ +- X"$0" : 'X\(//\)$' \| \ +- X"$0" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$0" : 'X\(//\)[^/]' \| \ ++ X"$0" : 'X\(//\)$' \| \ ++ X"$0" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -787,7 +788,7 @@ + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +-\`configure' configures CTorrent devel to adapt to many kinds of systems. ++\`configure' configures CTorrent dnh2 to adapt to many kinds of systems. + + Usage: $0 [OPTION]... [VAR=VALUE]... + +@@ -812,9 +813,9 @@ + cat <<_ACEOF + Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX +- [$ac_default_prefix] ++ [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX +- [PREFIX] ++ [PREFIX] + + By default, \`make install' will install all the files in + \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +@@ -849,15 +850,16 @@ + + if test -n "$ac_init_help"; then + case $ac_init_help in +- short | recursive ) echo "Configuration of CTorrent devel:";; ++ short | recursive ) echo "Configuration of CTorrent dnh2:";; + esac + cat <<\_ACEOF + + Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] +- --disable-dependency-tracking Speeds up one-time builds +- --enable-dependency-tracking Do not reject slow dependency extractors ++ --disable-dependency-tracking speeds up one-time build ++ --enable-dependency-tracking do not reject slow dependency extractors ++ --disable-largefile omit support for large files + + Some influential environment variables: + CXX C++ compiler command +@@ -873,7 +875,7 @@ + Use these variables to override the choices made by `configure' or to help + it to find libraries and programs with nonstandard names/locations. + +-Report bugs to <bsdi@sina.com>. ++Report bugs to <dholmes@ct.boxmail.com>. + _ACEOF + fi + +@@ -907,12 +909,45 @@ + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac +-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +-# absolute. +-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. +@@ -923,7 +958,7 @@ + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || +- test -f $ac_srcdir/configure.in; then ++ test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else +@@ -936,11 +971,10 @@ + test -n "$ac_init_help" && exit 0 + if $ac_init_version; then + cat <<\_ACEOF +-CTorrent configure devel +-generated by GNU Autoconf 2.57 ++CTorrent configure dnh2 ++generated by GNU Autoconf 2.59 + +-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 +-Free Software Foundation, Inc. ++Copyright (C) 2003 Free Software Foundation, Inc. + This configure script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it. + _ACEOF +@@ -951,8 +985,8 @@ + This file contains any messages produced by compilers while + running configure, to aid debugging if configure makes a mistake. + +-It was created by CTorrent $as_me devel, which was +-generated by GNU Autoconf 2.57. Invocation command line was ++It was created by CTorrent $as_me dnh2, which was ++generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +@@ -1029,19 +1063,19 @@ + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then +- ac_must_keep_next=false # Got value, back to normal. ++ ac_must_keep_next=false # Got value, back to normal. + else +- case $ac_arg in +- *=* | --config-cache | -C | -disable-* | --disable-* \ +- | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ +- | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ +- | -with-* | --with-* | -without-* | --without-* | --x) +- case "$ac_configure_args0 " in +- "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; +- esac +- ;; +- -* ) ac_must_keep_next=true ;; +- esac ++ case $ac_arg in ++ *=* | --config-cache | -C | -disable-* | --disable-* \ ++ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ ++ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ ++ | -with-* | --with-* | -without-* | --without-* | --x) ++ case "$ac_configure_args0 " in ++ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; ++ esac ++ ;; ++ -* ) ac_must_keep_next=true ;; ++ esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. +@@ -1075,12 +1109,12 @@ + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ +- "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ++ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ +- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ++ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; + } +@@ -1109,7 +1143,7 @@ + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` +- echo "$ac_var='"'"'$ac_val'"'"'" ++ echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi +@@ -1128,7 +1162,7 @@ + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 +- rm -f core core.* *.core && ++ rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +@@ -1208,7 +1242,7 @@ + # value. + ac_cache_corrupted=false + for ac_var in `(set) 2>&1 | +- sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do ++ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" +@@ -1225,13 +1259,13 @@ + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then +- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 ++ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 + echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} +- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 ++ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 + echo "$as_me: former value: $ac_old_val" >&2;} +- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 ++ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 + echo "$as_me: current value: $ac_new_val" >&2;} +- ac_cache_corrupted=: ++ ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. +@@ -1287,7 +1321,7 @@ + + + +-am__api_version="1.7" ++am__api_version="1.9" + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then +@@ -1324,6 +1358,7 @@ + # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag + # AFS /usr/afsws/bin/install, which mishandles nonexistent args + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" ++# OS/2's system install, which has a completely different semantic + # ./install, which can be erroneously created by make from ./install.sh. + echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 + echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +@@ -1340,6 +1375,7 @@ + case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ++ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. +@@ -1347,20 +1383,20 @@ + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do +- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then +- if test $ac_prog = install && +- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # AIX install. It has an incompatible calling convention. +- : +- elif test $ac_prog = install && +- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then +- # program-specific install script used by HP pwplus--don't use. +- : +- else +- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" +- break 3 +- fi +- fi ++ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then ++ if test $ac_prog = install && ++ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # AIX install. It has an incompatible calling convention. ++ : ++ elif test $ac_prog = install && ++ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then ++ # program-specific install script used by HP pwplus--don't use. ++ : ++ else ++ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" ++ break 3 ++ fi ++ fi + done + done + ;; +@@ -1448,7 +1484,6 @@ + program_transform_name=`echo $program_transform_name | sed -f conftest.sed` + rm conftest.sed + +- + # expand $ac_aux_dir to an absolute path + am_aux_dir=`cd $ac_aux_dir && pwd` + +@@ -1462,6 +1497,39 @@ + echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} + fi + ++if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then ++ # We used to keeping the `.' as first argument, in order to ++ # allow $(mkdir_p) to be used without argument. As in ++ # $(mkdir_p) $(somedir) ++ # where $(somedir) is conditionally defined. However this is wrong ++ # for two reasons: ++ # 1. if the package is installed by a user who cannot write `.' ++ # make install will fail, ++ # 2. the above comment should most certainly read ++ # $(mkdir_p) $(DESTDIR)$(somedir) ++ # so it does not work when $(somedir) is undefined and ++ # $(DESTDIR) is not. ++ # To support the latter case, we have to write ++ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), ++ # so the `.' trick is pointless. ++ mkdir_p='mkdir -p --' ++else ++ # On NextStep and OpenStep, the `mkdir' command does not ++ # recognize any option. It will interpret all options as ++ # directories to create, and then abort because `.' already ++ # exists. ++ for d in ./-p ./--version; ++ do ++ test -d $d && rmdir $d ++ done ++ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. ++ if test -f "$ac_aux_dir/mkinstalldirs"; then ++ mkdir_p='$(mkinstalldirs)' ++ else ++ mkdir_p='$(install_sh) -d' ++ fi ++fi ++ + for ac_prog in gawk mawk nawk awk + do + # Extract the first word of "$ac_prog", so it can be a program name with args. +@@ -1504,7 +1572,7 @@ + + echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 + echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` ++set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` + if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +@@ -1540,7 +1608,7 @@ + fi + rmdir .tst 2>/dev/null + +- # test to see if srcdir already configured ++# test to see if srcdir already configured + if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +@@ -1560,7 +1628,7 @@ + + # Define the identity of the package. + PACKAGE=ctorrent +- VERSION=devel ++ VERSION=dnh2 + + + cat >>confdefs.h <<_ACEOF +@@ -1588,9 +1656,6 @@ + + MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - signal(SIGPIPE,SIG_IGN); +- +-AMTAR=${AMTAR-"${am_missing_run}tar"} +- + install_sh=${install_sh-"$am_aux_dir/install-sh"} + + # Installed binaries are usually stripped using `strip' when the user +@@ -1683,6 +1748,13 @@ + + # We need awk for the "check" target. The system "awk" is bad on + # some platforms. ++# Always define AMTAR for backward compatibility. ++ ++AMTAR=${AMTAR-"${am_missing_run}tar"} ++ ++am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ++ ++ + + + +@@ -1806,7 +1878,6 @@ + (exit $ac_status); } + + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -1826,8 +1897,8 @@ + # Try to create an executable without -o first, disregard a.out. + # It will help us diagnose broken compilers, and finding out an intuition + # of exeext. +-echo "$as_me:$LINENO: checking for C++ compiler default output" >&5 +-echo $ECHO_N "checking for C++ compiler default output... $ECHO_C" >&6 ++echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 ++echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6 + ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 +@@ -1847,23 +1918,23 @@ + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) +- ;; ++ ;; + conftest.$ac_ext ) +- # This is the source file. +- ;; ++ # This is the source file. ++ ;; + [ab].out ) +- # We found the default executable, but exeext='' is most +- # certainly right. +- break;; ++ # We found the default executable, but exeext='' is most ++ # certainly right. ++ break;; + *.* ) +- ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- # FIXME: I believe we export ac_cv_exeext for Libtool, +- # but it would be cool to find out if it's true. Does anybody +- # maintain Libtool? --akim. +- export ac_cv_exeext +- break;; ++ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` ++ # FIXME: I believe we export ac_cv_exeext for Libtool, ++ # but it would be cool to find out if it's true. Does anybody ++ # maintain Libtool? --akim. ++ export ac_cv_exeext ++ break;; + * ) +- break;; ++ break;; + esac + done + else +@@ -1937,8 +2008,8 @@ + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` +- export ac_cv_exeext +- break;; ++ export ac_cv_exeext ++ break;; + * ) break;; + esac + done +@@ -1963,7 +2034,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2014,7 +2084,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2034,11 +2103,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2051,7 +2130,7 @@ + + ac_compiler_gnu=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + + fi +@@ -2067,7 +2146,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2084,11 +2162,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2101,7 +2189,7 @@ + + ac_cv_prog_cxx_g=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 + echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +@@ -2121,8 +2209,7 @@ + fi + fi + for ac_declaration in \ +- ''\ +- '#include <stdlib.h>' \ ++ '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ +@@ -2130,14 +2217,13 @@ + 'void exit (int);' + do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ +-#include <stdlib.h> + $ac_declaration ++#include <stdlib.h> + int + main () + { +@@ -2148,11 +2234,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2165,9 +2261,8 @@ + + continue + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2184,11 +2279,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_cxx_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2200,7 +2305,7 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + rm -f conftest* + if test -n "$ac_declaration"; then +@@ -2321,7 +2426,9 @@ + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c +- : > sub/conftst$i.h ++ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with ++ # Solaris 8's {/usr,}/bin/sh. ++ touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + +@@ -2349,9 +2456,14 @@ + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings +- # (even with -Werror). So we grep stderr for any message +- # that says an option was ignored. +- if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else ++ # or remarks (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored or not supported. ++ # When given -MP, icc 7.0 and 7.1 complain thusly: ++ # icc: Command line warning: ignoring option '-M'; no argument required ++ # The diagnosis changed in icc 8.0: ++ # icc: Command line remark: option '-MP' not supported ++ if (grep 'ignoring option' conftest.err || ++ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi +@@ -2723,7 +2835,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2743,11 +2854,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2760,7 +2881,7 @@ + + ac_compiler_gnu=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_c_compiler_gnu=$ac_compiler_gnu + + fi +@@ -2776,7 +2897,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2793,11 +2913,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2810,7 +2940,7 @@ + + ac_cv_prog_cc_g=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 + echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +@@ -2837,7 +2967,6 @@ + ac_cv_prog_cc_stdc=no + ac_save_CC=$CC + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -2865,6 +2994,16 @@ + va_end (v); + return s; + } ++ ++/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has ++ function prototypes and stuff, but not '\xHH' hex character constants. ++ These don't provoke an error unfortunately, instead are silently treated ++ as 'x'. The following induces an error, until -std1 is added to get ++ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an ++ array size at least. It's necessary to write '\x00'==0 to get something ++ that's true only with -std1. */ ++int osf4_cc_array ['\x00' == 0 ? 1 : -1]; ++ + int test (int i, double x); + struct s1 {int (*f) (int a);}; + struct s2 {int (*f) (double a);}; +@@ -2891,11 +3030,21 @@ + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2908,7 +3057,7 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext ++rm -f conftest.err conftest.$ac_objext + done + rm -f conftest.$ac_ext conftest.$ac_objext + CC=$ac_save_CC +@@ -2936,19 +3085,28 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ +- ''\ +- '#include <stdlib.h>' \ ++ '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ +@@ -2956,14 +3114,13 @@ + 'void exit (int);' + do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ +-#include <stdlib.h> + $ac_declaration ++#include <stdlib.h> + int + main () + { +@@ -2974,11 +3131,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -2991,9 +3158,8 @@ + + continue + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3010,11 +3176,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3026,7 +3202,7 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + rm -f conftest* + if test -n "$ac_declaration"; then +@@ -3040,7 +3216,7 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c + ac_cpp='$CPP $CPPFLAGS' + ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +@@ -3088,7 +3264,9 @@ + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c +- : > sub/conftst$i.h ++ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with ++ # Solaris 8's {/usr,}/bin/sh. ++ touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + +@@ -3116,9 +3294,14 @@ + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings +- # (even with -Werror). So we grep stderr for any message +- # that says an option was ignored. +- if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else ++ # or remarks (even with -Werror). So we grep stderr for any message ++ # that says an option was ignored or not supported. ++ # When given -MP, icc 7.0 and 7.1 complain thusly: ++ # icc: Command line warning: ignoring option '-M'; no argument required ++ # The diagnosis changed in icc 8.0: ++ # icc: Command line remark: option '-MP' not supported ++ if (grep 'ignoring option' conftest.err || ++ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi +@@ -3161,7 +3344,6 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lssl $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3185,11 +3367,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3202,7 +3394,8 @@ + + ac_cv_lib_ssl_SHA1_Init=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_ssl_SHA1_Init" >&5 +@@ -3224,7 +3417,6 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lcrypt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3248,11 +3440,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3265,7 +3467,8 @@ + + ac_cv_lib_crypt_SHA1_Init=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_crypt_SHA1_Init" >&5 +@@ -3279,6 +3482,79 @@ + + else + ++echo "$as_me:$LINENO: checking for SHA1_Init in -lcrypto" >&5 ++echo $ECHO_N "checking for SHA1_Init in -lcrypto... $ECHO_C" >&6 ++if test "${ac_cv_lib_crypto_SHA1_Init+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_check_lib_save_LIBS=$LIBS ++LIBS="-lcrypto $LIBS" ++cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char SHA1_Init (); ++int ++main () ++{ ++SHA1_Init (); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_lib_crypto_SHA1_Init=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_lib_crypto_SHA1_Init=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++LIBS=$ac_check_lib_save_LIBS ++fi ++echo "$as_me:$LINENO: result: $ac_cv_lib_crypto_SHA1_Init" >&5 ++echo "${ECHO_T}$ac_cv_lib_crypto_SHA1_Init" >&6 ++if test $ac_cv_lib_crypto_SHA1_Init = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define HAVE_LIBCRYPTO 1 ++_ACEOF ++ ++ LIBS="-lcrypto $LIBS" ++ ++else ++ + echo "$as_me:$LINENO: checking for SHA1_Init in -lmd" >&5 + echo $ECHO_N "checking for SHA1_Init in -lmd... $ECHO_C" >&6 + if test "${ac_cv_lib_md_SHA1_Init+set}" = set; then +@@ -3287,7 +3563,6 @@ + ac_check_lib_save_LIBS=$LIBS + LIBS="-lmd $LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3311,11 +3586,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3328,7 +3613,8 @@ + + ac_cv_lib_md_SHA1_Init=no + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_check_lib_save_LIBS + fi + echo "$as_me:$LINENO: result: $ac_cv_lib_md_SHA1_Init" >&5 +@@ -3341,9 +3627,13 @@ + LIBS="-lmd $LIBS" + + else +- { { echo "$as_me:$LINENO: error: error, Please install OpenSSL first!" >&5 +-echo "$as_me: error: error, Please install OpenSSL first!" >&2;} +- { (exit 1); exit 1; }; } ++ ++cat >>confdefs.h <<\_ACEOF ++#define USE_STANDALONE_SHA1 ++_ACEOF ++ ++fi ++ + fi + + fi +@@ -3366,7 +3656,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3386,11 +3675,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3403,7 +3702,7 @@ + + eval "$as_ac_Header=no" + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -3426,7 +3725,6 @@ + ac_func_search_save_LIBS=$LIBS + ac_cv_search_opendir=no + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3450,11 +3748,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3466,12 +3774,12 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + if test "$ac_cv_search_opendir" = no; then + for ac_lib in dir; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3495,11 +3803,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3512,7 +3830,8 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + done + fi + LIBS=$ac_func_search_save_LIBS +@@ -3533,7 +3852,6 @@ + ac_func_search_save_LIBS=$LIBS + ac_cv_search_opendir=no + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3557,11 +3875,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3573,12 +3901,12 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + if test "$ac_cv_search_opendir" = no; then + for ac_lib in x; do + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3602,11 +3930,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3619,7 +3957,8 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + done + fi + LIBS=$ac_func_search_save_LIBS +@@ -3661,7 +4000,6 @@ + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3672,7 +4010,7 @@ + #else + # include <assert.h> + #endif +- Syntax error ++ Syntax error + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +@@ -3684,6 +4022,7 @@ + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -3704,7 +4043,6 @@ + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3722,6 +4060,7 @@ + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -3768,7 +4107,6 @@ + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3779,7 +4117,7 @@ + #else + # include <assert.h> + #endif +- Syntax error ++ Syntax error + _ACEOF + if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 +@@ -3791,6 +4129,7 @@ + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -3811,7 +4150,6 @@ + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3829,6 +4167,7 @@ + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -3889,7 +4228,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3910,11 +4248,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -3927,12 +4275,11 @@ + + ac_cv_header_stdc=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + + if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3954,7 +4301,6 @@ + if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3979,7 +4325,6 @@ + : + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -3991,9 +4336,9 @@ + # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) + #else + # define ISLOWER(c) \ +- (('a' <= (c) && (c) <= 'i') \ +- || ('j' <= (c) && (c) <= 'r') \ +- || ('s' <= (c) && (c) <= 'z')) ++ (('a' <= (c) && (c) <= 'i') \ ++ || ('j' <= (c) && (c) <= 'r') \ ++ || ('s' <= (c) && (c) <= 'z')) + # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) + #endif + +@@ -4004,7 +4349,7 @@ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) +- || toupper (i) != TOUPPER (i)) ++ || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); + } +@@ -4029,7 +4374,7 @@ + ( exit $ac_status ) + ac_cv_header_stdc=no + fi +-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + fi +@@ -4054,7 +4399,7 @@ + + + for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ +- inttypes.h stdint.h unistd.h ++ inttypes.h stdint.h unistd.h + do + as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` + echo "$as_me:$LINENO: checking for $ac_header" >&5 +@@ -4063,7 +4408,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4075,11 +4419,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4092,7 +4446,7 @@ + + eval "$as_ac_Header=no" + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -4135,7 +4489,6 @@ + echo "$as_me:$LINENO: checking $ac_header usability" >&5 + echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4146,16 +4499,26 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 +- (exit $ac_status); }; }; then ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then + ac_header_compiler=yes + else + echo "$as_me: failed program was:" >&5 +@@ -4163,7 +4526,7 @@ + + ac_header_compiler=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 + echo "${ECHO_T}$ac_header_compiler" >&6 + +@@ -4171,7 +4534,6 @@ + echo "$as_me:$LINENO: checking $ac_header presence" >&5 + echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4189,6 +4551,7 @@ + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag ++ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +@@ -4208,33 +4571,32 @@ + echo "${ECHO_T}$ac_header_preproc" >&6 + + # So? What about this header? +-case $ac_header_compiler:$ac_header_preproc in +- yes:no ) ++case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in ++ yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 + echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} +- ( +- cat <<\_ASBOX +-## ------------------------------------ ## +-## Report this to bug-autoconf@gnu.org. ## +-## ------------------------------------ ## +-_ASBOX +- ) | +- sed "s/^/$as_me: WARNING: /" >&2 ++ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 ++echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ++ ac_header_preproc=yes + ;; +- no:yes ) ++ no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 + echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} +- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 ++echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 ++echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 ++echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 + echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ++ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 ++echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +-## ------------------------------------ ## +-## Report this to bug-autoconf@gnu.org. ## +-## ------------------------------------ ## ++## ------------------------------------- ## ++## Report this to dholmes@ct.boxmail.com ## ++## ------------------------------------- ## + _ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 +@@ -4245,7 +4607,7 @@ + if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 + else +- eval "$as_ac_Header=$ac_header_preproc" ++ eval "$as_ac_Header=\$ac_header_preproc" + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +@@ -4268,7 +4630,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4331,11 +4692,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4348,7 +4719,7 @@ + + ac_cv_c_const=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 + echo "${ECHO_T}$ac_cv_c_const" >&6 +@@ -4368,7 +4739,6 @@ + ac_cv_c_inline=no + for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4383,11 +4753,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4399,23 +4779,27 @@ + sed 's/^/| /' conftest.$ac_ext >&5 + + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + done + + fi + echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 + echo "${ECHO_T}$ac_cv_c_inline" >&6 ++ ++ + case $ac_cv_c_inline in + inline | yes) ;; +- no) +-cat >>confdefs.h <<\_ACEOF +-#define inline +-_ACEOF +- ;; +- *) cat >>confdefs.h <<_ACEOF +-#define inline $ac_cv_c_inline ++ *) ++ case $ac_cv_c_inline in ++ no) ac_val=;; ++ *) ac_val=$ac_cv_c_inline;; ++ esac ++ cat >>confdefs.h <<_ACEOF ++#ifndef __cplusplus ++#define inline $ac_val ++#endif + _ACEOF +- ;; ++ ;; + esac + + echo "$as_me:$LINENO: checking for size_t" >&5 +@@ -4424,7 +4808,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4444,11 +4827,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4461,7 +4854,7 @@ + + ac_cv_type_size_t=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 + echo "${ECHO_T}$ac_cv_type_size_t" >&6 +@@ -4481,7 +4874,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4502,11 +4894,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4519,7 +4921,7 @@ + + ac_cv_header_time=no + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5 + echo "${ECHO_T}$ac_cv_header_time" >&6 +@@ -4541,7 +4943,6 @@ + else + ac_pattern="Autoconf.*'x'" + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4561,7 +4962,6 @@ + + if test $ac_cv_prog_gcc_traditional = no; then + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4594,13 +4994,12 @@ + ac_cv_func_memcmp_working=no + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ +- ++$ac_includes_default + int + main () + { +@@ -4619,12 +5018,12 @@ + int i; + for (i = 0; i < 4; i++) + { +- char *a = foo + i; +- char *b = bar + i; +- strcpy (a, "--------01111111"); +- strcpy (b, "--------10000000"); +- if (memcmp (a, b, 16) >= 0) +- exit (1); ++ char *a = foo + i; ++ char *b = bar + i; ++ strcpy (a, "--------01111111"); ++ strcpy (b, "--------10000000"); ++ if (memcmp (a, b, 16) >= 0) ++ exit (1); + } + exit (0); + } +@@ -4653,12 +5052,19 @@ + ( exit $ac_status ) + ac_cv_func_memcmp_working=no + fi +-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5 + echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6 +-test $ac_cv_func_memcmp_working = no && LIBOBJS="$LIBOBJS memcmp.$ac_objext" ++test $ac_cv_func_memcmp_working = no && case $LIBOBJS in ++ "memcmp.$ac_objext" | \ ++ *" memcmp.$ac_objext" | \ ++ "memcmp.$ac_objext "* | \ ++ *" memcmp.$ac_objext "* ) ;; ++ *) LIBOBJS="$LIBOBJS memcmp.$ac_objext" ;; ++esac ++ + + echo "$as_me:$LINENO: checking return type of signal handlers" >&5 + echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6 +@@ -4666,7 +5072,6 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4693,11 +5098,21 @@ + _ACEOF + rm -f conftest.$ac_objext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 +- (eval $ac_compile) 2>&5 ++ (eval $ac_compile) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest.$ac_objext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4710,7 +5125,7 @@ + + ac_cv_type_signal=int + fi +-rm -f conftest.$ac_objext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5 + echo "${ECHO_T}$ac_cv_type_signal" >&6 +@@ -4732,7 +5147,6 @@ + ac_cv_func_lstat_dereferences_slashed_symlink=no + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4744,8 +5158,8 @@ + { + struct stat sbuf; + /* Linux will dereference the symlink and fail. +- That is better in the sense that it means we will not +- have to compile and use the lstat wrapper. */ ++ That is better in the sense that it means we will not ++ have to compile and use the lstat wrapper. */ + exit (lstat ("conftest.sym/", &sbuf) ? 0 : 1); + ; + return 0; +@@ -4771,7 +5185,7 @@ + ( exit $ac_status ) + ac_cv_func_lstat_dereferences_slashed_symlink=no + fi +-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + else + # If the `ln -s' command failed, then we probably don't even +@@ -4792,7 +5206,14 @@ + + + if test $ac_cv_func_lstat_dereferences_slashed_symlink = no; then +- LIBOBJS="$LIBOBJS lstat.$ac_objext" ++ case $LIBOBJS in ++ "lstat.$ac_objext" | \ ++ *" lstat.$ac_objext" | \ ++ "lstat.$ac_objext "* | \ ++ *" lstat.$ac_objext "* ) ;; ++ *) LIBOBJS="$LIBOBJS lstat.$ac_objext" ;; ++esac ++ + fi + + echo "$as_me:$LINENO: checking whether stat accepts an empty string" >&5 +@@ -4804,7 +5225,6 @@ + ac_cv_func_stat_empty_string_bug=yes + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext +@@ -4840,13 +5260,20 @@ + ( exit $ac_status ) + ac_cv_func_stat_empty_string_bug=no + fi +-rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext ++rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext + fi + fi + echo "$as_me:$LINENO: result: $ac_cv_func_stat_empty_string_bug" >&5 + echo "${ECHO_T}$ac_cv_func_stat_empty_string_bug" >&6 + if test $ac_cv_func_stat_empty_string_bug = yes; then +- LIBOBJS="$LIBOBJS stat.$ac_objext" ++ case $LIBOBJS in ++ "stat.$ac_objext" | \ ++ *" stat.$ac_objext" | \ ++ "stat.$ac_objext "* | \ ++ *" stat.$ac_objext "* ) ;; ++ *) LIBOBJS="$LIBOBJS stat.$ac_objext" ;; ++esac ++ + + cat >>confdefs.h <<_ACEOF + #define HAVE_STAT_EMPTY_STRING_BUG 1 +@@ -4871,7 +5298,8 @@ + + + +-for ac_func in ftruncate gethostbyname gettimeofday getwd inet_ntoa memchr memmove memset mkdir select socket strchr strerror strncasecmp strstr strtol strnstr ++ ++for ac_func in ftruncate gethostbyname gettimeofday getwd inet_ntoa memchr memmove memset mkdir select socket strchr strerror strncasecmp strstr strtol strtoll strnstr + do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` + echo "$as_me:$LINENO: checking for $ac_func" >&5 +@@ -4880,21 +5308,28 @@ + echo $ECHO_N "(cached) $ECHO_C" >&6 + else + cat >conftest.$ac_ext <<_ACEOF +-#line $LINENO "configure" + /* confdefs.h. */ + _ACEOF + cat confdefs.h >>conftest.$ac_ext + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ ++/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ + /* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ ++ + #ifdef __STDC__ + # include <limits.h> + #else + # include <assert.h> + #endif ++ ++#undef $ac_func ++ + /* Override any gcc2 internal prototype to avoid an error. */ + #ifdef __cplusplus + extern "C" +@@ -4925,11 +5360,21 @@ + _ACEOF + rm -f conftest.$ac_objext conftest$ac_exeext + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 +- (eval $ac_link) 2>&5 ++ (eval $ac_link) 2>conftest.er1 + ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && +- { ac_try='test -s conftest$ac_exeext' ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? +@@ -4942,7 +5387,8 @@ + + eval "$as_ac_var=no" + fi +-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext + fi + echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 + echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +@@ -4955,6 +5401,547 @@ + done + + ++# Enable/check large file support ++# Check whether --enable-largefile or --disable-largefile was given. ++if test "${enable_largefile+set}" = set; then ++ enableval="$enable_largefile" ++ ++fi; ++if test "$enable_largefile" != no; then ++ ++ echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 ++echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6 ++if test "${ac_cv_sys_largefile_CC+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ ac_cv_sys_largefile_CC=no ++ if test "$GCC" != yes; then ++ ac_save_CC=$CC ++ while :; do ++ # IRIX 6.2 and later do not support large files by default, ++ # so use the C compiler's -n32 option if that helps. ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <sys/types.h> ++ /* Check that off_t can represent 2**63 - 1 correctly. ++ We can't simply define LARGE_OFF_T to be 9223372036854775807, ++ since some C++ compilers masquerading as C compilers ++ incorrectly reject 9223372036854775807. */ ++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++ rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext ++ CC="$CC -n32" ++ rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_sys_largefile_CC=' -n32'; break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext ++ break ++ done ++ CC=$ac_save_CC ++ rm -f conftest.$ac_ext ++ fi ++fi ++echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 ++echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6 ++ if test "$ac_cv_sys_largefile_CC" != no; then ++ CC=$CC$ac_cv_sys_largefile_CC ++ fi ++ ++ echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 ++echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6 ++if test "${ac_cv_sys_file_offset_bits+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ while :; do ++ ac_cv_sys_file_offset_bits=no ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <sys/types.h> ++ /* Check that off_t can represent 2**63 - 1 correctly. ++ We can't simply define LARGE_OFF_T to be 9223372036854775807, ++ since some C++ compilers masquerading as C compilers ++ incorrectly reject 9223372036854775807. */ ++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#define _FILE_OFFSET_BITS 64 ++#include <sys/types.h> ++ /* Check that off_t can represent 2**63 - 1 correctly. ++ We can't simply define LARGE_OFF_T to be 9223372036854775807, ++ since some C++ compilers masquerading as C compilers ++ incorrectly reject 9223372036854775807. */ ++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_sys_file_offset_bits=64; break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ break ++done ++fi ++echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 ++echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6 ++if test "$ac_cv_sys_file_offset_bits" != no; then ++ ++cat >>confdefs.h <<_ACEOF ++#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits ++_ACEOF ++ ++fi ++rm -f conftest* ++ echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 ++echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6 ++if test "${ac_cv_sys_large_files+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ while :; do ++ ac_cv_sys_large_files=no ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <sys/types.h> ++ /* Check that off_t can represent 2**63 - 1 correctly. ++ We can't simply define LARGE_OFF_T to be 9223372036854775807, ++ since some C++ compilers masquerading as C compilers ++ incorrectly reject 9223372036854775807. */ ++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#define _LARGE_FILES 1 ++#include <sys/types.h> ++ /* Check that off_t can represent 2**63 - 1 correctly. ++ We can't simply define LARGE_OFF_T to be 9223372036854775807, ++ since some C++ compilers masquerading as C compilers ++ incorrectly reject 9223372036854775807. */ ++#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) ++ int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 ++ && LARGE_OFF_T % 2147483647 == 1) ++ ? 1 : -1]; ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_sys_large_files=1; break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ break ++done ++fi ++echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 ++echo "${ECHO_T}$ac_cv_sys_large_files" >&6 ++if test "$ac_cv_sys_large_files" != no; then ++ ++cat >>confdefs.h <<_ACEOF ++#define _LARGE_FILES $ac_cv_sys_large_files ++_ACEOF ++ ++fi ++rm -f conftest* ++fi ++ ++echo "$as_me:$LINENO: checking for _LARGEFILE_SOURCE value needed for large files" >&5 ++echo $ECHO_N "checking for _LARGEFILE_SOURCE value needed for large files... $ECHO_C" >&6 ++if test "${ac_cv_sys_largefile_source+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ while :; do ++ ac_cv_sys_largefile_source=no ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <stdio.h> ++int ++main () ++{ ++return !fseeko; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#define _LARGEFILE_SOURCE 1 ++#include <stdio.h> ++int ++main () ++{ ++return !fseeko; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext ++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 ++ (eval $ac_compile) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest.$ac_objext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_sys_largefile_source=1; break ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++fi ++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext ++ break ++done ++fi ++echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_source" >&5 ++echo "${ECHO_T}$ac_cv_sys_largefile_source" >&6 ++if test "$ac_cv_sys_largefile_source" != no; then ++ ++cat >>confdefs.h <<_ACEOF ++#define _LARGEFILE_SOURCE $ac_cv_sys_largefile_source ++_ACEOF ++ ++fi ++rm -f conftest* ++ ++# We used to try defining _XOPEN_SOURCE=500 too, to work around a bug ++# in glibc 2.1.3, but that breaks too many other things. ++# If you want fseeko and ftello with glibc, upgrade to a fixed glibc. ++echo "$as_me:$LINENO: checking for fseeko" >&5 ++echo $ECHO_N "checking for fseeko... $ECHO_C" >&6 ++if test "${ac_cv_func_fseeko+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat >conftest.$ac_ext <<_ACEOF ++/* confdefs.h. */ ++_ACEOF ++cat confdefs.h >>conftest.$ac_ext ++cat >>conftest.$ac_ext <<_ACEOF ++/* end confdefs.h. */ ++#include <stdio.h> ++int ++main () ++{ ++return fseeko && fseeko (stdin, 0, 0); ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 2>conftest.er1 ++ ac_status=$? ++ grep -v '^ *+' conftest.er1 >conftest.err ++ rm -f conftest.er1 ++ cat conftest.err >&5 ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); } && ++ { ac_try='test -z "$ac_c_werror_flag" ++ || test ! -s conftest.err' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ ac_cv_func_fseeko=yes ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++ac_cv_func_fseeko=no ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: $ac_cv_func_fseeko" >&5 ++echo "${ECHO_T}$ac_cv_func_fseeko" >&6 ++if test $ac_cv_func_fseeko = yes; then ++ ++cat >>confdefs.h <<\_ACEOF ++#define HAVE_FSEEKO 1 ++_ACEOF ++ ++fi ++ ++ + ac_config_files="$ac_config_files Makefile" + cat >confcache <<\_ACEOF + # This file is a shell script that caches the results of configure +@@ -4984,13 +5971,13 @@ + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ +- "s/'/'\\\\''/g; +- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ++ "s/'/'\\\\''/g; ++ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ +- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ++ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; + } | +@@ -5020,13 +6007,13 @@ + # trailing colons and then remove the whole line if VPATH becomes empty + # (actually we leave an empty line to preserve line numbers). + if test "x$srcdir" = x.; then +- ac_vpsub='/^[ ]*VPATH[ ]*=/{ ++ ac_vpsub='/^[ ]*VPATH[ ]*=/{ + s/:*\$(srcdir):*/:/; + s/:*\${srcdir}:*/:/; + s/:*@srcdir@:*/:/; +-s/^\([^=]*=[ ]*\):*/\1/; ++s/^\([^=]*=[ ]*\):*/\1/; + s/:*$//; +-s/^[^=]*=[ ]*$//; ++s/^[^=]*=[ ]*$//; + }' + fi + +@@ -5037,7 +6024,7 @@ + for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | +- sed 's/\$U\././;s/\.o$//;s/\.obj$//'` ++ sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +@@ -5102,9 +6089,10 @@ + elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix + fi ++DUALCASE=1; export DUALCASE # for MKS sh + + # Support unset when possible. +-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then ++if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset + else + as_unset=false +@@ -5123,7 +6111,7 @@ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME + do +- if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then ++ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var +@@ -5302,16 +6290,17 @@ + if mkdir -p . 2>/dev/null; then + as_mkdir_p=: + else ++ test -d ./-p && rmdir ./-p + as_mkdir_p=false + fi + + as_executable_p="test -f" + + # Sed expression to map a string onto a valid CPP name. +-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" ++as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + + # Sed expression to map a string onto a valid variable name. +-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" ++as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + # IFS +@@ -5337,8 +6326,8 @@ + } >&5 + cat >&5 <<_CSEOF + +-This file was extended by CTorrent $as_me devel, which was +-generated by GNU Autoconf 2.57. Invocation command line was ++This file was extended by CTorrent $as_me dnh2, which was ++generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS +@@ -5382,9 +6371,9 @@ + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] +- instantiate the configuration file FILE ++ instantiate the configuration file FILE + --header=FILE[:TEMPLATE] +- instantiate the configuration header FILE ++ instantiate the configuration header FILE + + Configuration files: + $config_files +@@ -5400,12 +6389,11 @@ + + cat >>$CONFIG_STATUS <<_ACEOF + ac_cs_version="\\ +-CTorrent config.status devel +-configured by $0, generated by GNU Autoconf 2.57, ++CTorrent config.status dnh2 ++configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +-Free Software Foundation, Inc. ++Copyright (C) 2003 Free Software Foundation, Inc. + This config.status script is free software; the Free Software Foundation + gives unlimited permission to copy, distribute and modify it." + srcdir=$srcdir +@@ -5610,14 +6598,17 @@ + s,@AUTOMAKE@,$AUTOMAKE,;t t + s,@AUTOHEADER@,$AUTOHEADER,;t t + s,@MAKEINFO@,$MAKEINFO,;t t +-s,@AMTAR@,$AMTAR,;t t + s,@install_sh@,$install_sh,;t t + s,@STRIP@,$STRIP,;t t + s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t + s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t ++s,@mkdir_p@,$mkdir_p,;t t + s,@AWK@,$AWK,;t t + s,@SET_MAKE@,$SET_MAKE,;t t + s,@am__leading_dot@,$am__leading_dot,;t t ++s,@AMTAR@,$AMTAR,;t t ++s,@am__tar@,$am__tar,;t t ++s,@am__untar@,$am__untar,;t t + s,@CXX@,$CXX,;t t + s,@CXXFLAGS@,$CXXFLAGS,;t t + s,@LDFLAGS@,$LDFLAGS,;t t +@@ -5673,9 +6664,9 @@ + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then +- ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" ++ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else +- ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" ++ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end +@@ -5693,21 +6684,21 @@ + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin +- cat >$tmp/stdin +- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ cat >$tmp/stdin ++ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || + $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_file" : 'X\(//\)[^/]' \| \ +- X"$ac_file" : 'X\(//\)$' \| \ +- X"$ac_file" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -5723,10 +6714,10 @@ + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || + $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -5764,12 +6755,45 @@ + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac +-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +-# absolute. +-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac + + + case $INSTALL in +@@ -5791,7 +6815,7 @@ + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | +- sed 's,.*/,,'` by configure." ++ sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. +@@ -5800,24 +6824,24 @@ + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) +- # Absolute (can't be DOS-style, as IFS=:) +- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ # Absolute (can't be DOS-style, as IFS=:) ++ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- echo $f;; ++ echo "$f";; + *) # Relative +- if test -f "$f"; then +- # Build tree +- echo $f +- elif test -f "$srcdir/$f"; then +- # Source tree +- echo $srcdir/$f +- else +- # /dev/null tree +- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ if test -f "$f"; then ++ # Build tree ++ echo "$f" ++ elif test -f "$srcdir/$f"; then ++ # Source tree ++ echo "$srcdir/$f" ++ else ++ # /dev/null tree ++ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- fi;; ++ fi;; + esac + done` || { (exit 1); exit 1; } + _ACEOF +@@ -5859,12 +6883,12 @@ + # NAME is the cpp macro being defined and VALUE is the value it is being given. + # + # ac_d sets the value in "#define NAME VALUE" lines. +-ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +-ac_dB='[ ].*$,\1#\2' ++ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ++ac_dB='[ ].*$,\1#\2' + ac_dC=' ' + ac_dD=',;t' + # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +-ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ++ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' + ac_uB='$,\1#\2define\3' + ac_uC=' ' + ac_uD=',;t' +@@ -5873,11 +6897,11 @@ + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin +- cat >$tmp/stdin +- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ cat >$tmp/stdin ++ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` +- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; ++ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + +@@ -5891,28 +6915,29 @@ + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) +- # Absolute (can't be DOS-style, as IFS=:) +- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ # Absolute (can't be DOS-style, as IFS=:) ++ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- echo $f;; ++ # Do quote $f, to prevent DOS paths from being IFS'd. ++ echo "$f";; + *) # Relative +- if test -f "$f"; then +- # Build tree +- echo $f +- elif test -f "$srcdir/$f"; then +- # Source tree +- echo $srcdir/$f +- else +- # /dev/null tree +- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 ++ if test -f "$f"; then ++ # Build tree ++ echo "$f" ++ elif test -f "$srcdir/$f"; then ++ # Source tree ++ echo "$srcdir/$f" ++ else ++ # /dev/null tree ++ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 + echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } +- fi;; ++ fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. +- sed 's/[ ]*$//' $ac_file_inputs >$tmp/in ++ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + + _ACEOF + +@@ -5935,9 +6960,9 @@ + s,[\\$`],\\&,g + t clear + : clear +-s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp ++s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp + t end +-s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp ++s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp + : end + _ACEOF + # If some macros were called several times there might be several times +@@ -5951,13 +6976,13 @@ + # example, in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + cat >>conftest.undefs <<\_ACEOF +-s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, ++s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, + _ACEOF + + # Break up conftest.defines because some shells have a limit on the size + # of here documents, and old seds have small limits too (100 cmds). + echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +-echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS ++echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS + echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS + echo ' :' >>$CONFIG_STATUS + rm -f conftest.tail +@@ -5966,7 +6991,7 @@ + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. +- echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS ++ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS +@@ -5993,7 +7018,7 @@ + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' +- echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS ++ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS +@@ -6027,10 +7052,10 @@ + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || + $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_file" : 'X\(//\)[^/]' \| \ +- X"$ac_file" : 'X\(//\)$' \| \ +- X"$ac_file" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$ac_file" : 'X\(//\)[^/]' \| \ ++ X"$ac_file" : 'X\(//\)$' \| \ ++ X"$ac_file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -6046,10 +7071,10 @@ + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || + $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -6081,10 +7106,10 @@ + done + echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || + $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X$ac_file : 'X\(//\)[^/]' \| \ +- X$ac_file : 'X\(//\)$' \| \ +- X$ac_file : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X$ac_file : 'X\(//\)[^/]' \| \ ++ X$ac_file : 'X\(//\)$' \| \ ++ X$ac_file : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X$ac_file | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -6103,16 +7128,41 @@ + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || + $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$ac_dest" : 'X\(//\)[^/]' \| \ +- X"$ac_dest" : 'X\(//\)$' \| \ +- X"$ac_dest" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$ac_dest" : 'X\(//\)[^/]' \| \ ++ X"$ac_dest" : 'X\(//\)$' \| \ ++ X"$ac_dest" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` ++ { if $as_mkdir_p; then ++ mkdir -p "$ac_dir" ++ else ++ as_dir="$ac_dir" ++ as_dirs= ++ while test ! -d "$as_dir"; do ++ as_dirs="$as_dir $as_dirs" ++ as_dir=`(dirname "$as_dir") 2>/dev/null || ++$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || ++echo X"$as_dir" | ++ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } ++ /^X\(\/\/\)[^/].*/{ s//\1/; q; } ++ /^X\(\/\/\)$/{ s//\1/; q; } ++ /^X\(\/\).*/{ s//\1/; q; } ++ s/.*/./; q'` ++ done ++ test ! -n "$as_dirs" || mkdir $as_dirs ++ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 ++echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} ++ { (exit 1); exit 1; }; }; } ++ + ac_builddir=. + + if test "$ac_dir" != .; then +@@ -6138,12 +7188,45 @@ + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; + esac +-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be +-# absolute. +-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` +-ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` +-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` +-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` ++ ++# Do not use `cd foo && pwd` to compute absolute paths, because ++# the directories may not exist. ++case `pwd` in ++.) ac_abs_builddir="$ac_dir";; ++*) ++ case "$ac_dir" in ++ .) ac_abs_builddir=`pwd`;; ++ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; ++ *) ac_abs_builddir=`pwd`/"$ac_dir";; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_builddir=${ac_top_builddir}.;; ++*) ++ case ${ac_top_builddir}. in ++ .) ac_abs_top_builddir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; ++ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_srcdir=$ac_srcdir;; ++*) ++ case $ac_srcdir in ++ .) ac_abs_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; ++ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; ++ esac;; ++esac ++case $ac_abs_builddir in ++.) ac_abs_top_srcdir=$ac_top_srcdir;; ++*) ++ case $ac_top_srcdir in ++ .) ac_abs_top_srcdir=$ac_abs_builddir;; ++ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; ++ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; ++ esac;; ++esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +@@ -6161,10 +7244,10 @@ + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || + $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$mf" : 'X\(//\)[^/]' \| \ +- X"$mf" : 'X\(//\)$' \| \ +- X"$mf" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$mf" : 'X\(//\)[^/]' \| \ ++ X"$mf" : 'X\(//\)$' \| \ ++ X"$mf" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -6174,36 +7257,30 @@ + else + continue + fi +- grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue +- # Extract the definition of DEP_FILES from the Makefile without +- # running `make'. +- DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` ++ # Extract the definition of DEPDIR, am__include, and am__quote ++ # from the Makefile without running `make'. ++ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue ++ am__include=`sed -n 's/^am__include = //p' < "$mf"` ++ test -z "am__include" && continue ++ am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it +- U=`sed -n -e '/^U = / s///p' < "$mf"` +- test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" +- # We invoke sed twice because it is the simplest approach to +- # changing $(DEPDIR) to its actual value in the expansion. +- for file in `sed -n -e ' +- /^DEP_FILES = .*\\\\$/ { +- s/^DEP_FILES = // +- :loop +- s/\\\\$// +- p +- n +- /\\\\$/ b loop +- p +- } +- /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ ++ U=`sed -n 's/^U = //p' < "$mf"` ++ # Find all dependency output files, they are included files with ++ # $(DEPDIR) in their names. We invoke sed twice because it is the ++ # simplest approach to changing $(DEPDIR) to its actual value in the ++ # expansion. ++ for file in `sed -n " ++ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || + $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$file" : 'X\(//\)[^/]' \| \ +- X"$file" : 'X\(//\)$' \| \ +- X"$file" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$file" : 'X\(//\)[^/]' \| \ ++ X"$file" : 'X\(//\)$' \| \ ++ X"$file" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +@@ -6219,10 +7296,10 @@ + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || + $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ +- X"$as_dir" : 'X\(//\)[^/]' \| \ +- X"$as_dir" : 'X\(//\)$' \| \ +- X"$as_dir" : 'X\(/\)' \| \ +- . : '\(.\)' 2>/dev/null || ++ X"$as_dir" : 'X\(//\)[^/]' \| \ ++ X"$as_dir" : 'X\(//\)$' \| \ ++ X"$as_dir" : 'X\(/\)' \| \ ++ . : '\(.\)' 2>/dev/null || + echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/configure.ac ctorrent-1.3.4/configure.ac +--- ctorrent-1.3.4.sav/configure.ac 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/configure.ac 2006-06-28 19:30:02.000000000 +0200 +@@ -1,6 +1,6 @@ + # Process this file with autoconf to produce a configure script. +-AC_INIT([CTorrent], [devel], [bsdi@sina.com]) +-AM_INIT_AUTOMAKE(ctorrent,devel) ++AC_INIT([CTorrent], [dnh2], [dholmes@ct.boxmail.com]) ++AM_INIT_AUTOMAKE(ctorrent,dnh2) + AC_CONFIG_HEADER([config.h]) + + AC_CONFIG_SRCDIR([ctorrent.cpp]) +@@ -14,7 +14,7 @@ + [AC_CHECK_LIB([crypt],[SHA1_Init],, + [AC_CHECK_LIB([crypto],[SHA1_Init],, + [AC_CHECK_LIB([md],[SHA1_Init],, +- [AC_MSG_ERROR([error, Please install OpenSSL first!])])])])]) ++ [AC_DEFINE([USE_STANDALONE_SHA1],,[Define to 1 to use the Steve Reid's public-domain SHA-1 code.])])])])]) + + # Checks for header files. + AC_HEADER_DIRENT +@@ -32,6 +32,10 @@ + AC_FUNC_MEMCMP + AC_TYPE_SIGNAL + AC_FUNC_STAT +-AC_CHECK_FUNCS([ftruncate gethostbyname gettimeofday getwd inet_ntoa memchr memmove memset mkdir select socket strchr strerror strncasecmp strstr strtol strnstr]) ++AC_CHECK_FUNCS([ftruncate gethostbyname gettimeofday getwd inet_ntoa memchr memmove memset mkdir select socket strchr strerror strncasecmp strstr strtol strtoll strnstr]) ++ ++# Enable/check large file support ++AC_SYS_LARGEFILE ++AC_FUNC_FSEEKO + + AC_OUTPUT(Makefile) +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/ctcs.cpp ctorrent-1.3.4/ctcs.cpp +--- ctorrent-1.3.4.sav/ctcs.cpp 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/ctcs.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -0,0 +1,540 @@ ++#ifndef WINDOWS ++#include <unistd.h> ++#include <sys/time.h> ++#include <time.h> ++#include <netdb.h> ++#endif ++ ++#include <stdlib.h> ++#include <string.h> ++#include <errno.h> ++ ++#include <ctype.h> ++ ++#include "ctcs.h" ++#include "btcontent.h" ++#include "setnonblock.h" ++#include "connect_nonb.h" ++#include "tracker.h" ++#include "peerlist.h" ++#include "peer.h" ++#include "btconfig.h" ++#include "bttime.h" ++ ++#define compset(a,member) ( (a.member==member)? 0 : ((a.member = member)||1) ) ++ ++Ctcs CTCS; ++ ++ ++Ctcs::Ctcs() ++{ ++ memset(m_host,0,MAXHOSTNAMELEN); ++ ++ m_sock = INVALID_SOCKET; ++ m_port = 2780; ++ m_status = T_FREE; ++ m_interval = 1; ++ ++ m_last_timestamp = m_sent_ctstatus_time = (time_t) 0; ++ m_sent_ctstatus = 0; ++ m_sent_ctbw = 0; ++} ++ ++ ++Ctcs::~Ctcs() ++{ ++ if( m_sock != INVALID_SOCKET) CLOSE_SOCKET(m_sock); ++} ++ ++ ++void Ctcs::Reset(time_t new_interval) ++{ ++ if(new_interval) m_interval = new_interval; ++ ++ if( INVALID_SOCKET != m_sock ){ ++ CLOSE_SOCKET(m_sock); ++ m_sock = INVALID_SOCKET; ++ } ++ ++ in_buffer.Reset(); ++ out_buffer.Reset(); ++ m_last_timestamp = now; ++ m_sent_ctstatus = 0; ++ m_sent_ctbw = 0; ++ m_status = T_FREE; ++} ++ ++ ++// borrowed from tracker.cpp (with changes) ++int Ctcs:: _s2sin(char *h,int p,struct sockaddr_in *psin) ++{ ++ psin->sin_family = AF_INET; ++ psin->sin_port = htons(p); ++ psin->sin_addr.s_addr = inet_addr(h); ++ if(psin->sin_addr.s_addr == INADDR_NONE){ ++ struct hostent *ph = gethostbyname(h); ++ if( !ph || ph->h_addrtype != AF_INET){ ++ memset(psin,0,sizeof(struct sockaddr_in)); ++ return -1; ++ } ++ memcpy(&psin->sin_addr,ph->h_addr_list[0],sizeof(struct in_addr)); ++ } ++ return ( psin->sin_addr.s_addr == INADDR_NONE ) ? -1 : 0; ++} ++ ++ ++int Ctcs::CheckMessage() ++{ ++ ssize_t r; ++ size_t q; ++ ++ r = in_buffer.FeedIn(m_sock); ++ ++ if( r == 0 ) return 0; // no data ++ if( r < 0 ){ Reset(1); return -1; } // error ++ ++ q = in_buffer.Count(); ++ ++ if( !q ){ ++ int error = 0; ++ socklen_t n = sizeof(error); ++ if(getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n) < 0 || ++ error != 0 ){ ++ fprintf(stderr,"warn, received nothing from CTCS! %s\n",strerror(error)); ++ } ++ Reset(0); ++ return -1; ++ } ++ ++ char *s, *msgbuf; ++ while(in_buffer.Count() && (s=strchr(msgbuf=in_buffer.BasePointer(), '\n'))){ ++// msgbuf = in_buffer.BasePointer(); ++// if( s=strchr(msgbuf, '\n') ){ //have a complete message ++ *s = '\0'; ++ if(arg_verbose) fprintf(stderr, "CTCS: %s\n", msgbuf); ++ if( !strncmp("SETDLIMIT",msgbuf,9) ){ ++ cfg_max_bandwidth_down = (int)(strtod(msgbuf+10, NULL)); ++ if(arg_verbose) fprintf(stderr, "DLimit=%d\n", cfg_max_bandwidth_down); ++ }else if( !strncmp("SETULIMIT",msgbuf,9) ){ ++ cfg_max_bandwidth_up = (int)(strtod(msgbuf+10, NULL)); ++ if(arg_verbose) fprintf(stderr, "ULimit=%d\n", cfg_max_bandwidth_up); ++ }else if( !strncmp("SENDPEERS",msgbuf,9) ){ ++ Send_Peers(); ++ }else if( !strncmp("SENDSTATUS",msgbuf,10) ){ ++ Send_Status(); ++ }else if( !strncmp("SENDCONF",msgbuf,8) ){ ++ Send_Config(); ++ }else if( !strncmp("CTCONFIG",msgbuf,8) ){ ++ Set_Config(msgbuf); ++ }else if( !strncmp("SENDDETAIL",msgbuf,10) ){ ++ Send_Detail(); ++ }else if( !strncmp("CTQUIT",msgbuf,6) ){ ++ printf("CTCS sent Quit command\n"); ++ Tracker.SetStoped(); ++ }else if( !strncmp("CTRESTART",msgbuf,9) ){ ++ RestartTracker(); ++ }else if( !strncmp("CTUPDATE",msgbuf,8) ){ ++ Tracker.Reset(1); ++ }else if( !strncmp("PROTOCOL",msgbuf,8) ){ ++ // nothing yet ++ }else{ ++ if(arg_verbose) fprintf(stderr, "unknown CTCS message: %s", msgbuf); ++ } ++ in_buffer.PickUp(s-msgbuf + 1); ++ } ++ return 0; ++} ++ ++ ++int Ctcs::SendMessage(char *message) ++{ ++ int len, r=0; ++ char buf[CTCS_BUFSIZE]; ++ ++ if( m_status == T_READY ){ ++ len = strlen(message); ++ strncpy(buf, message, len); ++ if( len+1 < CTCS_BUFSIZE ){ ++ buf[len] = '\n'; ++ buf[len+1] = '\0'; ++ }else{ ++ buf[CTCS_BUFSIZE-2] = '\n'; ++ buf[CTCS_BUFSIZE-1] = '\0'; ++ } ++ r = out_buffer.Put(m_sock, buf, len+1); ++ if( r<0 ) Reset(1); ++ } ++ return r; ++} ++ ++ ++int Ctcs::Send_Auth() ++{ ++ char message[CTCS_BUFSIZE]; ++ ++ if(!*m_pass) return 0; ++ snprintf(message, CTCS_BUFSIZE, "AUTH %s", m_pass); ++ return SendMessage(message); ++} ++ ++ ++int Ctcs::Send_Protocol() ++{ ++ char message[CTCS_BUFSIZE]; ++ ++ snprintf(message, CTCS_BUFSIZE, "PROTOCOL %s", CTCS_PROTOCOL); ++ return SendMessage(message); ++} ++ ++ ++int Ctcs::Send_Torrent(unsigned char *peerid, char *torrent) ++{ ++ char message[CTCS_BUFSIZE]; ++ char txtid[PEER_ID_LEN*2+3]; ++ ++ TextPeerID(peerid, txtid); ++ ++ snprintf(message, CTCS_BUFSIZE, "CTORRENT %s %ld %ld %s", txtid, ++ (long)(BTCONTENT.GetStartTime()), (long)now, torrent); ++ return SendMessage(message); ++} ++ ++ ++int Ctcs::Report_Status(size_t seeders, size_t leechers, size_t nhave, ++ size_t ntotal, size_t navail, size_t dlrate, size_t ulrate, ++ u_int64_t dltotal, u_int64_t ultotal, size_t dlimit, size_t ulimit) ++{ ++ int changebw=0,change=0; ++ int r; ++ size_t nhad; ++ ++ if( T_READY != m_status ) return 0; ++ ++ nhad = m_ctstatus.nhave; ++ ++ changebw = ( ++ compset(m_ctstatus, dlrate) | ++ compset(m_ctstatus, ulrate) | ++ compset(m_ctstatus, dlimit) | ++ compset(m_ctstatus, ulimit) ); ++ change = ( changebw | ++ compset(m_ctstatus, seeders) | ++ compset(m_ctstatus, leechers) | ++ compset(m_ctstatus, nhave) | ++ compset(m_ctstatus, ntotal) | ++ compset(m_ctstatus, navail) | ++ compset(m_ctstatus, dltotal) | ++ compset(m_ctstatus, ultotal) ); ++ ++ if( ( !m_sent_ctstatus || (nhad<nhave && nhave==ntotal) || ++ (Tracker.GetStatus() && m_sent_ctstatus_time+30 > now) ) && ++ (r=Send_Status()) != 0 ) return r; ++ else return (changebw || !m_sent_ctbw) ? Send_bw() : 0; ++} ++ ++ ++int Ctcs::Send_Status() ++{ ++ char message[CTCS_BUFSIZE]; ++ ++ if( m_sent_ctstatus_time + 1 > now ) { ++ m_sent_ctstatus = 0; ++ return 0; ++ } ++ snprintf(message, CTCS_BUFSIZE, "CTSTATUS %u/%u %u/%u/%u %u,%u %llu,%llu %u,%u", ++ m_ctstatus.seeders, m_ctstatus.leechers, ++ m_ctstatus.nhave, m_ctstatus.ntotal, m_ctstatus.navail, ++ m_ctstatus.dlrate, m_ctstatus.ulrate, ++ m_ctstatus.dltotal, m_ctstatus.ultotal, ++ m_ctstatus.dlimit, m_ctstatus.ulimit ); ++ m_sent_ctstatus = 1; ++ m_sent_ctstatus_time = now; ++ return SendMessage(message); ++} ++ ++ ++int Ctcs::Send_bw() ++{ ++ char message[CTCS_BUFSIZE]; ++ ++ snprintf(message, CTCS_BUFSIZE, "CTBW %u,%u %u,%u", ++ m_ctstatus.dlrate, m_ctstatus.ulrate, ++ m_ctstatus.dlimit, m_ctstatus.ulimit ); ++ m_sent_ctbw = 1; ++ return SendMessage(message); ++} ++ ++ ++int Ctcs::Send_Config() ++{ ++ char message[CTCS_BUFSIZE]; ++ ++ snprintf(message, CTCS_BUFSIZE, "CTCONFIG %d %d %f %d %d %d %d %d %d", ++ (int)arg_verbose, (int)cfg_seed_hours, cfg_seed_ratio, ++ (int)cfg_max_peers, (int)cfg_min_peers, (int)arg_file_to_download, ++ (int)cfg_exit_zero_peers, Tracker.IsPaused(), Tracker.IsQuitting()); ++ return SendMessage(message); ++} ++ ++int Ctcs::Set_Config(char *msgbuf) ++{ ++ unsigned char foo; ++ ++ if(msgbuf[9] != '.') arg_verbose = atoi(msgbuf+9); ++ if(msgbuf[11] != '.') cfg_seed_hours = atoi(msgbuf+11); ++ msgbuf = strchr(msgbuf+11, ' ') + 1; ++ if(msgbuf[0] != '.') cfg_seed_ratio = atof(msgbuf); ++ msgbuf = strchr(msgbuf, ' ') + 1; ++ if(msgbuf[0] != '.') cfg_max_peers = atoi(msgbuf); ++ msgbuf = strchr(msgbuf, ' ') + 1; ++ if(msgbuf[0] != '.') cfg_min_peers = atoi(msgbuf); ++ msgbuf = strchr(msgbuf, ' ') + 1; ++ if(msgbuf[0] != '.'){ ++ foo = atoi(msgbuf); ++ if(foo != arg_file_to_download){ ++ arg_file_to_download = foo; ++ BTCONTENT.FlushCache(); ++ BTCONTENT.SetFilter(); ++ WORLD.CheckInterest(); ++ } ++ } ++ msgbuf = strchr(msgbuf, ' ') + 1; ++ if(msgbuf[0] != '.') cfg_exit_zero_peers = atoi(msgbuf); ++ msgbuf = strchr(msgbuf, ' ') + 1; ++ if(msgbuf[0] != '.'){ ++ if(atoi(msgbuf)){ ++ if( !Tracker.IsPaused() ) Tracker.SetPause(); ++ }else if( Tracker.IsPaused() ) Tracker.Resume(); ++ } ++ msgbuf = strchr(msgbuf, ' ') + 1; ++ if(msgbuf[0] != '.'){ ++ if(atoi(msgbuf)) Tracker.SoftQuit(); ++ else Tracker.DontQuit(); ++ if(atoi(msgbuf)){ ++ if( !Tracker.IsQuitting() ) Tracker.SoftQuit(); ++ }else if( Tracker.IsQuitting() ) Tracker.DontQuit(); ++ } ++ ++ return 0; ++} ++ ++ ++int Ctcs::Send_Detail() ++{ ++ char message[CTCS_BUFSIZE]; ++ int r=0; ++ size_t n=0; ++ BTFILE *file=0; ++ BitField tmpFilter; ++ ++ snprintf( message, CTCS_BUFSIZE, "CTDETAIL %lld %d %ld %ld", ++ BTCONTENT.GetTotalFilesLength(), ++ (int)(BTCONTENT.GetPieceLength()), (long)now, ++ (long)(BTCONTENT.GetSeedTime()) ); ++ r = SendMessage(message); ++ ++ if(r==0) r = SendMessage("CTFILES"); ++ ++ while( r==0 && (file = BTCONTENT.GetNextFile(file)) ){ ++ ++n; ++ BTCONTENT.SetTmpFilter(n, &tmpFilter); ++ BitField tmpBitField = *BTCONTENT.pBF; ++ tmpBitField.Except(tmpFilter); ++ ++ snprintf( message, CTCS_BUFSIZE, "CTFILE %u %d %d %llu %s", ++ n, (int)(BTCONTENT.getFilePieces(n)), ++ (int)(tmpBitField.Count()), ++ file->bf_length, file->bf_filename ); ++ r = SendMessage(message); ++ } ++ if(r==0) r = SendMessage("CTFDONE"); ++ return r; ++} ++ ++ ++int Ctcs::Send_Peers() ++{ ++ btPeer *peer=0; ++ char message[CTCS_BUFSIZE]; ++ char txtid[PEER_ID_LEN*2+3]; ++ struct sockaddr_in psin; ++ int r=0; ++ ++ r=SendMessage("CTPEERS"); ++ while( r==0 && (peer = WORLD.GetNextPeer(peer)) ){ ++ TextPeerID(peer->id, txtid); ++ peer->GetAddress(&psin); ++ ++ snprintf(message, CTCS_BUFSIZE, "CTPEER %s %s %c%c%c%c %d %d %llu %llu %d", ++ txtid, inet_ntoa(psin.sin_addr), ++ peer->Is_Remote_UnChoked() ? 'U' : 'C', ++ peer->Is_Local_Interested() ? 'i' : 'n', ++ peer->Is_Local_UnChoked() ? 'U' : 'C', ++ peer->Is_Remote_Interested() ? 'i' : 'n', ++ peer->RateDL(), peer->RateUL(), ++ peer->TotalDL(), peer->TotalUL(), ++ peer->bitfield.Count() ); ++ r = SendMessage(message); ++ } ++ if(r==0) r = SendMessage("CTPDONE"); ++ return r; ++} ++ ++ ++int Ctcs::Send_Info(const char *info) ++{ ++ char message[CTCS_BUFSIZE]; ++ ++ snprintf(message, CTCS_BUFSIZE, "CTINFO %s", info); ++ return SendMessage(message); ++} ++ ++ ++int Ctcs::Initial() ++{ ++ char *s; ++ ++ strncpy(m_host, arg_ctcs, MAXHOSTNAMELEN-1); ++ m_host[MAXHOSTNAMELEN-1] = '\0'; ++ if( s = strchr(m_host, ':') ) *s='\0'; ++ m_port = atoi(s=(strchr(arg_ctcs, ':')+1)); ++ if(strchr(s, ':')){ ++ printf("Enter CTCS password: "); fflush(stdout); ++ fgets(m_pass, CTCS_PASS_SIZE, stdin); ++ } else *m_pass = '\0'; ++ ++ return 0; ++} ++ ++ ++int Ctcs::Connect() ++{ ++ ssize_t r; ++ m_last_timestamp = now; ++ ++ if(_s2sin(m_host,m_port,&m_sin) < 0) { ++ fprintf(stderr,"warn, get CTCS ip address failed."); ++ return -1; ++ } ++ ++ m_sock = socket(AF_INET,SOCK_STREAM,0); ++ if(INVALID_SOCKET == m_sock) return -1; ++ ++ if(setfd_nonblock(m_sock) < 0) {CLOSE_SOCKET(m_sock); return -1; } ++ ++ r = connect_nonb(m_sock,(struct sockaddr*)&m_sin); ++ ++ if( r == -1 ){ CLOSE_SOCKET(m_sock); return -1;} ++ else if( r == -2 ) m_status = T_CONNECTING; ++ else{ ++ m_status = T_READY; ++ if( Send_Protocol() != 0 ){ ++ fprintf(stderr,"warn, send protocol to CTCS failed. %s\n",strerror(errno)); ++ return -1; ++ } ++ if( Send_Auth() != 0) { ++ fprintf(stderr,"warn, send password to CTCS failed. %s\n",strerror(errno)); ++ return -1; ++ } ++ if( Send_Torrent(BTCONTENT.GetPeerId(), arg_metainfo_file) != 0 ){ ++ fprintf(stderr,"warn, send torrent to CTCS failed. %s\n",strerror(errno)); ++ return -1; ++ } ++ } ++ return 0; ++} ++ ++ ++int Ctcs::IntervalCheck(const time_t *pnow, fd_set *rfdp, fd_set *wfdp) ++{ ++ if( T_FREE == m_status ){ ++ if(*pnow - m_last_timestamp >= m_interval){ ++ if(Connect() < 0){ Reset(15); return -1; } ++ ++ if( m_status == T_CONNECTING ){ ++ FD_SET(m_sock, rfdp); ++ FD_SET(m_sock, wfdp); ++ }else{ ++ FD_SET(m_sock, rfdp); ++ } ++ } ++ }else{ ++ if( m_status == T_CONNECTING ){ ++ FD_SET(m_sock, rfdp); ++ FD_SET(m_sock, wfdp); ++ }else if (INVALID_SOCKET != m_sock){ ++ FD_SET(m_sock, rfdp); ++ if( out_buffer.Count() ) FD_SET(m_sock, wfdp); ++ } ++ } ++ return m_sock; ++} ++ ++ ++int Ctcs::SocketReady(fd_set *rfdp, fd_set *wfdp, int *nfds) ++{ ++ if( T_FREE == m_status ) return 0; ++ ++ if( T_CONNECTING == m_status && FD_ISSET(m_sock,wfdp) ){ ++ int error = 0; ++ socklen_t n = sizeof(error); ++ (*nfds)--; ++ FD_CLR(m_sock, wfdp); ++ if(getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n) < 0 || ++ error != 0 ){ ++ if( ECONNREFUSED != error ) ++ fprintf(stderr,"warn, connect to CTCS failed. %s\n",strerror(error)); ++ Reset(15); ++ return -1; ++ }else{ ++ m_status = T_READY; ++ if( Send_Protocol() != 0 ){ ++ fprintf(stderr,"warn, send protocol to CTCS failed. %s\n",strerror(errno)); ++ return -1; ++ } ++ if( Send_Auth() != 0) { ++ fprintf(stderr,"warn, send password to CTCS failed. %s\n",strerror(errno)); ++ return -1; ++ } ++ if( Send_Torrent(BTCONTENT.GetPeerId(), arg_metainfo_file) == 0 ){ ++ fprintf(stderr,"warn, send torrent to CTCS failed. %s\n",strerror(errno)); ++ return -1; ++ } ++ } ++ }else if( T_CONNECTING == m_status && FD_ISSET(m_sock,rfdp) ){ ++ int error = 0; ++ socklen_t n = sizeof(error); ++ (*nfds)--; ++ FD_CLR(m_sock, rfdp); ++ getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n); ++ fprintf(stderr,"warn, connect to CTCS failed. %s\n",strerror(error)); ++ Reset(15); ++ return -1; ++ }else if( INVALID_SOCKET != m_sock ){ ++ if( FD_ISSET(m_sock, rfdp) ){ ++ (*nfds)--; ++ FD_CLR(m_sock,rfdp); ++ CheckMessage(); ++ } ++ if( INVALID_SOCKET != m_sock && FD_ISSET(m_sock, wfdp) ){ ++ (*nfds)--; ++ FD_CLR(m_sock,wfdp); ++ if( out_buffer.Count() && out_buffer.FlushOut(m_sock) < 0){ ++ Reset(1); ++ return -1; ++ } ++ } ++ } ++ return 0; ++} ++ ++ ++void Ctcs::RestartTracker() ++{ ++ Tracker.SetPause(); // prevents downloader from exiting ++ Tracker.SetStoped(); // finish the tracker ++ // Now we need to wait until the tracker updates (T_FINISHED == m_status), ++ // then Tracker.Resume(). ++ Tracker.SetRestart(); ++} ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/ctcs.h ctorrent-1.3.4/ctcs.h +--- ctorrent-1.3.4.sav/ctcs.h 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/ctcs.h 2006-06-28 19:30:02.000000000 +0200 +@@ -0,0 +1,78 @@ ++#include "tracker.h" // for its includes/defines ++ ++#define CTCS_PROTOCOL "0001" ++ ++#define CTCS_BUFSIZE 200 ++#define CTCS_PASS_SIZE 21 ++ ++#define C_TORRENT 1 ++#define C_STATUS 2 ++#define C_PEERS 3 ++ ++struct ctstatus { ++ public: ++ size_t seeders, leechers, nhave, ntotal, navail, dlrate, ulrate, ++ dlimit, ulimit; ++ u_int64_t dltotal, ultotal; ++ ctstatus() { ++ seeders=leechers=nhave=ntotal=navail=dlrate=ulrate=dltotal= ++ ultotal=dlimit=ulimit = 0; ++ } ++}; ++ ++class Ctcs ++{ ++ private: ++ char m_host[MAXHOSTNAMELEN]; ++ int m_port; ++ char m_pass[CTCS_PASS_SIZE]; ++ ++ struct sockaddr_in m_sin; ++ ++ unsigned char m_status:2; ++ ++ time_t m_interval; ++ time_t m_last_timestamp; ++ time_t m_sent_ctstatus_time; ++ ++ SOCKET m_sock; ++ BufIo in_buffer; ++ BufIo out_buffer; ++ struct ctstatus m_ctstatus; ++ int m_sent_ctstatus; ++ int m_sent_ctbw; ++ ++ int SendMessage(char *buf); ++ ++ public: ++ Ctcs(); ++ ~Ctcs(); ++ ++ void Reset(time_t new_interval); ++ int _s2sin(char *h,int p,struct sockaddr_in *psin); ++ int Initial(); ++ int Connect(); ++ int CheckMessage(); ++ int Send_Protocol(); ++ int Send_Auth(); ++ int Send_Torrent(unsigned char *peerid, char *torrent); ++ int Report_Status(size_t seeders, size_t leechers, size_t nhave, ++ size_t ntotal, size_t navail, size_t dlrate, size_t ulrate, ++ u_int64_t dltotal, u_int64_t ultotal, size_t dlimit, size_t ulimit); ++ int Send_Status(); ++ int Send_bw(); ++ int Send_Config(); ++ int Set_Config(char *msgbuf); ++ int Send_Detail(); ++ int Send_Peers(); ++ int Send_Info(const char *info); ++ int IntervalCheck(const time_t *pnow, fd_set *rfdp, fd_set *wfdp); ++ int SocketReady(fd_set *rfdp, fd_set *wfdp, int *nfds); ++ void RestartTracker(); ++ ++ SOCKET GetSocket() { return m_sock; } ++ unsigned char GetStatus() { return m_status;} ++}; ++ ++extern Ctcs CTCS; ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/ctorrent.cpp ctorrent-1.3.4/ctorrent.cpp +--- ctorrent-1.3.4.sav/ctorrent.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/ctorrent.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -1,6 +1,5 @@ +-#include <sys/types.h> +- + #include "./def.h" ++#include <sys/types.h> + + #ifdef WINDOWS + #include <windows.h> +@@ -20,6 +19,7 @@ + #include "downloader.h" + #include "peerlist.h" + #include "tracker.h" ++#include "ctcs.h" + + #include "./config.h" + +@@ -46,7 +46,7 @@ + struct timeval tv; + gettimeofday(&tv,(struct timezone*) 0); + unsigned int seed = tv.tv_usec + tv.tv_sec + getpid(); +- return srandom(seed); ++ srandom(seed); + } + + int main(int argc, char **argv) +@@ -65,7 +65,7 @@ + if( !arg_announce ){ fprintf(stderr,"please use -u to specify a announce url!\n"); exit(1);} + if( !arg_save_as ){ fprintf(stderr,"please use -s to specify a metainfo file name!\n"); exit(1);} + if( BTCONTENT.InitialFromFS(arg_metainfo_file, arg_announce, arg_piece_length) < 0 || +- BTCONTENT.CreateMetainfoFile(arg_save_as) < 0){ ++ BTCONTENT.CreateMetainfoFile(arg_save_as) < 0){ + fprintf(stderr,"create metainfo failed.\n"); + exit(1); + } +@@ -81,15 +81,19 @@ + if( !arg_flg_exam_only && !arg_flg_check_only){ + if(WORLD.Initial_ListenPort() < 0){ + fprintf(stderr,"warn, you couldn't accept connection.\n"); +- }else +- printf("Listen on: %d\n",cfg_listen_port); ++ } + +- Tracker.Initial(); ++ if( arg_ctcs ) CTCS.Initial(); ++ Tracker.Initial(); + +- signal(SIGPIPE,SIG_IGN); - signal(SIGINT,sigint_catch); ++ signal(SIGPIPE,SIG_IGN); + signal(SIGINT,sig_catch); + signal(SIGTERM,sig_catch); Downloader(); @@ -532,19 +7732,65 @@ diff -u ctorrent-1.3.4.orig/ctorrent.cpp ctorrent-1.3.4/ctorrent.cpp exit(0); } -@@ -99,7 +103,7 @@ +@@ -99,7 +103,8 @@ int param_check(int argc, char **argv) { int c, l; - while ( ( c = getopt(argc,argv,"b:B:cC:e:fl:M:m:P:p:s:tu:xhH")) != -1) -+ while ( ( c = getopt(argc,argv,"b:cC:D:e:fl:M:m:n:P:p:s:tu:U:vxhH")) != -1) ++ char *s; ++ while ( ( c = getopt(argc,argv,"b:cC:D:e:E:fi:l:M:m:n:P:p:s:S:tu:U:vxz:hH")) != -1) switch( c ){ case 'b': arg_bitfield_file = new char[strlen(optarg) + 1]; -@@ -150,14 +154,23 @@ +@@ -109,6 +114,10 @@ + strcpy(arg_bitfield_file, optarg); + break; + ++ case 'i': // listen on ip XXXX ++ cfg_listen_ip = inet_addr(optarg); ++ break; ++ + case 'p': // listen on Port XXXX + cfg_listen_port = atoi(optarg); + break; +@@ -126,6 +135,10 @@ + cfg_seed_hours = atoi(optarg); + break; + ++ case 'E': // target seed ratio ++ cfg_seed_ratio = atof(optarg); ++ break; ++ + case 'c': // Check exist only + arg_flg_check_only = 1; + break; +@@ -137,32 +150,47 @@ + case 'M': // Max peers + cfg_max_peers = atoi(optarg); + if( cfg_max_peers > 1000 || +- cfg_max_peers < 20){ +- return -1; ++ cfg_max_peers < 20){ ++ return -1; + } + break; + + case 'm': // Min peers + cfg_min_peers = atoi(optarg); + if( cfg_min_peers > 1000 || +- cfg_min_peers < 20){ +- return -1; ++ cfg_min_peers < 1){ ++ return -1; } break; ++ case 'z': // slice size ++ cfg_req_slice_size = atoi(optarg) * 1024; ++ if( cfg_req_slice_size < 1024 || cfg_req_slice_size > 128*1024 ) ++ return -1; ++ break; ++ + case 'n': // Which file download + arg_file_to_download = atoi(optarg); + break; @@ -558,19 +7804,51 @@ diff -u ctorrent-1.3.4.orig/ctorrent.cpp ctorrent-1.3.4/ctorrent.cpp - cfg_max_bandwidth = atoi(optarg); + case 'D': + cfg_max_bandwidth_down = (int)(strtod(optarg, NULL) * 1024); ++ break; ++ ++ case 'U': ++ cfg_max_bandwidth_up = (int)(strtod(optarg, NULL) * 1024); break; -+ case 'U': -+ cfg_max_bandwidth_up = (int)(strtod(optarg, NULL) * 1024); -+ break; -+ case 'P': - l = strlen(optarg); - if (l > MAX_PF_LEN) {printf("-P arg must be 8 or less characters\n"); exit(1);} -@@ -190,6 +203,10 @@ +- l = strlen(optarg); +- if (l > MAX_PF_LEN) {printf("-P arg must be 8 or less characters\n"); exit(1);} +- if (l == 1 && *optarg == '-') *arg_user_agent = (char) 0; +- else strcpy(arg_user_agent,optarg); ++ l = strlen(optarg); ++ if (l > MAX_PF_LEN) {printf("-P arg must be 8 or less characters\n"); exit(1);} ++ if (l == 1 && *optarg == '-') *arg_user_agent = (char) 0; ++ else strcpy(arg_user_agent,optarg); + break; + + // BELLOW OPTIONS USED FOR CREATE TORRENT. +@@ -179,17 +207,29 @@ + case 'l': // piece Length (default 262144) + arg_piece_length = atoi(optarg); + if( arg_piece_length < 65536 || +- arg_piece_length > 1310720 ){ +- // warn message: +- // piece length range is 65536 =>> 1310720 +- return -1; ++ arg_piece_length > 1310720 ){ ++ // warn message: ++ // piece length range is 65536 =>> 1310720 ++ return -1; + } + break; ++ // ABOVE OPTIONS USED FOR CREATE TORRENT. + + case 'x': arg_flg_exam_only = 1; break; ++ case 'S': // CTCS server ++ if( arg_ctcs ) return -1; ++ arg_ctcs = new char[strlen(optarg) + 1]; ++ if( !strchr(optarg, ':') ) return -1; ++ strcpy(arg_ctcs, optarg); ++ break; ++ + case 'v': + arg_verbose = 1; + break; @@ -578,55 +7856,3537 @@ diff -u ctorrent-1.3.4.orig/ctorrent.cpp ctorrent-1.3.4/ctorrent.cpp case 'h': case 'H': default: -@@ -217,6 +234,7 @@ +@@ -211,14 +251,17 @@ + + void usage() + { +- fprintf(stderr,"%s Copyright: YuHong(992126018601033)",PACKAGE_STRING); ++ fprintf(stderr,"%s Original code Copyright: YuHong(992126018601033)",PACKAGE_STRING); + fprintf(stderr,"\nWARNING: THERE IS NO WARRANTY FOR CTorrent. USE AT YOUR OWN RISK!!!\n"); + fprintf(stderr,"\nGeneric Options:\n"); fprintf(stderr,"-h/-H\t\tShow this message.\n"); fprintf(stderr,"-x\t\tDecode metainfo(torrent) file only, don't download.\n"); fprintf(stderr,"-c\t\tCheck exist only. don't download.\n"); + fprintf(stderr,"-v\t\tVerbose output (for debugging).\n"); fprintf(stderr,"\nDownload Options:\n"); fprintf(stderr,"-e int\t\tExit while seed <int> hours later. (default 72 hours)\n"); ++ fprintf(stderr,"-E num\t\tExit after seeding to <num> ratio (UL:DL).\n"); ++ fprintf(stderr,"-i ip\t\tListen for connection on ip. (default all ip's)\n"); fprintf(stderr,"-p port\t\tListen port. (default 2706 -> 2106)\n"); -@@ -226,7 +244,9 @@ + fprintf(stderr,"-s save_as\tSave file/directory/metainfo as... \n"); + fprintf(stderr,"-C cache_size\tCache size,unit MB. (default 16MB)\n"); +@@ -226,8 +269,12 @@ fprintf(stderr,"-b bf_filename\tBit field filename. (use it carefully)\n"); fprintf(stderr,"-M max_peers\tMax peers count.\n"); fprintf(stderr,"-m min_peers\tMin peers count.\n"); - fprintf(stderr,"-B rate\t\tMax bandwidth (unit KB/s)\n"); ++ fprintf(stderr,"-z slice_size\tDownload slice/block size, unit KB. (default 16, max 128).\n"); + fprintf(stderr,"-n file_number\tWhich file download.\n"); + fprintf(stderr,"-D rate\t\tMax bandwidth down (unit KB/s)\n"); + fprintf(stderr,"-U rate\t\tMax bandwidth up (unit KB/s)\n"); fprintf(stderr,"-P peer_id\tSet Peer ID ["PEER_PFX"]\n"); ++ fprintf(stderr,"-S host:port\tUse CTCS server\n"); fprintf(stderr,"\nMake metainfo(torrent) file Options:\n"); fprintf(stderr,"-t\t\tWith make torrent. must specify this option.\n"); -diff -u ctorrent-1.3.4.orig/downloader.cpp ctorrent-1.3.4/downloader.cpp ---- ctorrent-1.3.4.orig/downloader.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/downloader.cpp 2005-08-11 23:45:29.429693680 +0200 -@@ -29,10 +29,14 @@ - time_t now; + fprintf(stderr,"-u url\t\tTracker's url.\n"); +@@ -235,5 +282,7 @@ + fprintf(stderr,"\neg.\n"); + fprintf(stderr,"hong> ctorrent -s new_filename -e 12 -C 32 -p 6881 eg.torrent\n\n"); + fprintf(stderr,"home page: http://ctorrent.sourceforge.net/\n"); +- fprintf(stderr,"bug report: %s\n\n",PACKAGE_BUGREPORT); ++ fprintf(stderr,"see also: http://www.rahul.net/dholmes/ctorrent/\n"); ++ fprintf(stderr,"bug report: %s\n",PACKAGE_BUGREPORT); ++ fprintf(stderr,"original author: bsdi@sina.com\n\n"); + } +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/bencode.Po ctorrent-1.3.4/.deps/bencode.Po +--- ctorrent-1.3.4.sav/.deps/bencode.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/bencode.Po 2006-06-28 19:24:11.000000000 +0200 +@@ -0,0 +1,137 @@ ++bencode.o bencode.o: bencode.cpp def.h config.h /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h bencode.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ ++ /usr/include/bits/stdio.h /usr/include/unistd.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/confname.h /usr/include/getopt.h /usr/include/fcntl.h \ ++ /usr/include/bits/fcntl.h /usr/include/sys/stat.h \ ++ /usr/include/bits/stat.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/xlocale.h \ ++ /usr/include/alloca.h /usr/include/string.h /usr/include/ctype.h ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++bencode.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/fcntl.h: ++ ++/usr/include/bits/fcntl.h: ++ ++/usr/include/sys/stat.h: ++ ++/usr/include/bits/stat.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/string.h: ++ ++/usr/include/ctype.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/bitfield.Po ctorrent-1.3.4/.deps/bitfield.Po +--- ctorrent-1.3.4.sav/.deps/bitfield.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/bitfield.Po 2006-06-28 19:24:12.000000000 +0200 +@@ -0,0 +1,135 @@ ++bitfield.o bitfield.o: bitfield.cpp bitfield.h /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/param.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/linux/param.h \ ++ /usr/include/asm/param.h /usr/include/asm-i386/param.h \ ++ /usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/string.h \ ++ /usr/include/xlocale.h /usr/include/stdlib.h \ ++ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ ++ /usr/include/alloca.h /usr/include/stdio.h /usr/include/libio.h \ ++ /usr/include/_G_config.h /usr/include/wchar.h /usr/include/bits/wchar.h \ ++ /usr/include/gconv.h /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h ++ ++bitfield.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++/usr/include/sys/stat.h: ++ ++/usr/include/bits/stat.h: ++ ++/usr/include/string.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/btconfig.Po ctorrent-1.3.4/.deps/btconfig.Po +--- ctorrent-1.3.4.sav/.deps/btconfig.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/btconfig.Po 2006-06-28 19:24:12.000000000 +0200 +@@ -0,0 +1,46 @@ ++btconfig.o btconfig.o: btconfig.cpp /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/btcontent.Po ctorrent-1.3.4/.deps/btcontent.Po +--- ctorrent-1.3.4.sav/.deps/btcontent.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/btcontent.Po 2006-06-28 19:24:12.000000000 +0200 +@@ -0,0 +1,223 @@ ++btcontent.o btcontent.o: btcontent.cpp btcontent.h def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ ++ /usr/include/bits/stdio.h bitfield.h btfiles.h def.h \ ++ /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/param.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/linux/param.h /usr/include/asm/param.h \ ++ /usr/include/asm-i386/param.h /usr/include/xlocale.h \ ++ /usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/stdlib.h \ ++ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ ++ /usr/include/alloca.h /usr/include/string.h /usr/include/fcntl.h \ ++ /usr/include/bits/fcntl.h /usr/include/errno.h \ ++ /usr/include/bits/errno.h /usr/include/linux/errno.h \ ++ /usr/include/asm/errno.h /usr/include/asm-i386/errno.h btconfig.h \ ++ bencode.h peer.h /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/include/bits/sockaddr.h /usr/include/asm/socket.h \ ++ /usr/include/asm-i386/socket.h /usr/include/asm/sockios.h \ ++ /usr/include/asm-i386/sockios.h /usr/include/arpa/inet.h \ ++ /usr/include/netinet/in.h /usr/include/stdint.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h btrequest.h btstream.h bufio.h def.h \ ++ rate.h httpencode.h tracker.h /usr/include/sys/time.h sha1.h ++ ++btcontent.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++def.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/sys/stat.h: ++ ++/usr/include/bits/stat.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/string.h: ++ ++/usr/include/fcntl.h: ++ ++/usr/include/bits/fcntl.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: ++ ++btconfig.h: ++ ++bencode.h: ++ ++peer.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++btrequest.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++def.h: ++ ++rate.h: ++ ++httpencode.h: ++ ++tracker.h: ++ ++/usr/include/sys/time.h: ++ ++sha1.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/btfiles.Po ctorrent-1.3.4/.deps/btfiles.Po +--- ctorrent-1.3.4.sav/.deps/btfiles.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/btfiles.Po 2006-06-28 19:24:13.000000000 +0200 +@@ -0,0 +1,172 @@ ++btfiles.o btfiles.o: btfiles.cpp btfiles.h def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ ++ /usr/include/bits/stdio.h bitfield.h /usr/include/unistd.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/confname.h /usr/include/getopt.h \ ++ /usr/include/dirent.h /usr/include/bits/dirent.h \ ++ /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h \ ++ /usr/include/linux/limits.h /usr/include/sys/param.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix2_lim.h \ ++ /usr/include/bits/xopen_lim.h /usr/include/linux/param.h \ ++ /usr/include/asm/param.h /usr/include/asm-i386/param.h \ ++ /usr/include/xlocale.h /usr/include/sys/stat.h /usr/include/bits/stat.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/alloca.h \ ++ /usr/include/string.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \ ++ /usr/include/errno.h /usr/include/bits/errno.h \ ++ /usr/include/linux/errno.h /usr/include/asm/errno.h \ ++ /usr/include/asm-i386/errno.h bencode.h btconfig.h btcontent.h def.h ++ ++btfiles.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/dirent.h: ++ ++/usr/include/bits/dirent.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/sys/stat.h: ++ ++/usr/include/bits/stat.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/string.h: ++ ++/usr/include/fcntl.h: ++ ++/usr/include/bits/fcntl.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: ++ ++bencode.h: ++ ++btconfig.h: ++ ++btcontent.h: ++ ++def.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/btrequest.Po ctorrent-1.3.4/.deps/btrequest.Po +--- ctorrent-1.3.4.sav/.deps/btrequest.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/btrequest.Po 2006-06-28 19:24:13.000000000 +0200 +@@ -0,0 +1,100 @@ ++btrequest.o btrequest.o: btrequest.cpp /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/xlocale.h \ ++ /usr/include/alloca.h btrequest.h btcontent.h def.h config.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ ++ /usr/include/bits/stdio.h bitfield.h btfiles.h def.h btconfig.h ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/alloca.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++def.h: ++ ++btconfig.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/btstream.Po ctorrent-1.3.4/.deps/btstream.Po +--- ctorrent-1.3.4.sav/.deps/btstream.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/btstream.Po 2006-06-28 19:24:13.000000000 +0200 +@@ -0,0 +1,176 @@ ++btstream.o btstream.o: btstream.cpp /usr/include/arpa/inet.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/wchar.h \ ++ /usr/include/bits/wordsize.h /usr/include/sys/socket.h \ ++ /usr/include/sys/uio.h /usr/include/sys/types.h \ ++ /usr/include/bits/types.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/bits/in.h /usr/include/bits/byteswap.h btstream.h def.h \ ++ config.h bufio.h def.h /usr/include/unistd.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/confname.h /usr/include/getopt.h peer.h \ ++ /usr/include/unistd.h /usr/include/string.h /usr/include/xlocale.h \ ++ btrequest.h btcontent.h def.h /usr/include/stdio.h /usr/include/libio.h \ ++ /usr/include/_G_config.h /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h bitfield.h \ ++ btfiles.h rate.h btconfig.h msgencode.h ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++btstream.h: ++ ++def.h: ++ ++config.h: ++ ++bufio.h: ++ ++def.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++peer.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/string.h: ++ ++/usr/include/xlocale.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++def.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++msgencode.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/bufio.Po ctorrent-1.3.4/.deps/bufio.Po +--- ctorrent-1.3.4.sav/.deps/bufio.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/bufio.Po 2006-06-28 19:24:13.000000000 +0200 +@@ -0,0 +1,178 @@ ++bufio.o bufio.o: bufio.cpp bufio.h def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/time.h /usr/include/sys/socket.h \ ++ /usr/include/sys/uio.h /usr/include/bits/uio.h \ ++ /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/arpa/inet.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h /usr/include/string.h \ ++ /usr/include/xlocale.h /usr/include/errno.h /usr/include/bits/errno.h \ ++ /usr/include/linux/errno.h /usr/include/asm/errno.h \ ++ /usr/include/asm-i386/errno.h btrequest.h btcontent.h def.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h bitfield.h \ ++ btfiles.h def.h ++ ++bufio.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/string.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++def.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++def.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/connect_nonb.Po ctorrent-1.3.4/.deps/connect_nonb.Po +--- ctorrent-1.3.4.sav/.deps/connect_nonb.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/connect_nonb.Po 2006-06-28 19:24:13.000000000 +0200 +@@ -0,0 +1,112 @@ ++connect_nonb.o connect_nonb.o: connect_nonb.cpp /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ connect_nonb.h def.h config.h /usr/include/sys/socket.h \ ++ /usr/include/sys/uio.h /usr/include/bits/uio.h \ ++ /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/errno.h /usr/include/bits/errno.h \ ++ /usr/include/linux/errno.h /usr/include/asm/errno.h \ ++ /usr/include/asm-i386/errno.h ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++connect_nonb.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/ctcs.Po ctorrent-1.3.4/.deps/ctcs.Po +--- ctorrent-1.3.4.sav/.deps/ctcs.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/ctcs.Po 2006-06-28 19:24:14.000000000 +0200 +@@ -0,0 +1,246 @@ ++ctcs.o ctcs.o: ctcs.cpp /usr/include/unistd.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/time.h /usr/include/time.h \ ++ /usr/include/bits/time.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/xlocale.h /usr/include/netdb.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/wchar.h \ ++ /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/sys/types.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/bits/in.h /usr/include/bits/byteswap.h \ ++ /usr/include/rpc/netdb.h /usr/include/bits/siginfo.h \ ++ /usr/include/bits/netdb.h /usr/include/stdlib.h \ ++ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ ++ /usr/include/alloca.h /usr/include/string.h /usr/include/errno.h \ ++ /usr/include/bits/errno.h /usr/include/linux/errno.h \ ++ /usr/include/asm/errno.h /usr/include/asm-i386/errno.h \ ++ /usr/include/ctype.h ctcs.h tracker.h def.h config.h bufio.h def.h \ ++ /usr/include/arpa/inet.h /usr/include/sys/param.h \ ++ /usr/include/linux/param.h /usr/include/asm/param.h \ ++ /usr/include/asm-i386/param.h btconfig.h btcontent.h def.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h bitfield.h \ ++ btfiles.h setnonblock.h connect_nonb.h peerlist.h peer.h def.h \ ++ btrequest.h btcontent.h bitfield.h btstream.h bufio.h rate.h btconfig.h \ ++ rate.h peer.h bttime.h ++ ++/usr/include/unistd.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/time.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/netdb.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/rpc/netdb.h: ++ ++/usr/include/bits/siginfo.h: ++ ++/usr/include/bits/netdb.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/string.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: ++ ++/usr/include/ctype.h: ++ ++ctcs.h: ++ ++tracker.h: ++ ++def.h: ++ ++config.h: ++ ++bufio.h: ++ ++def.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++btconfig.h: ++ ++btcontent.h: ++ ++def.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++setnonblock.h: ++ ++connect_nonb.h: ++ ++peerlist.h: ++ ++peer.h: ++ ++def.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++bitfield.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++rate.h: ++ ++peer.h: ++ ++bttime.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/ctorrent.Po ctorrent-1.3.4/.deps/ctorrent.Po +--- ctorrent-1.3.4.sav/.deps/ctorrent.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/ctorrent.Po 2006-06-28 19:24:14.000000000 +0200 +@@ -0,0 +1,246 @@ ++ctorrent.o ctorrent.o: ctorrent.cpp def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/signal.h /usr/include/bits/signum.h \ ++ /usr/include/bits/siginfo.h /usr/include/bits/sigaction.h \ ++ /usr/include/bits/sigcontext.h /usr/include/asm/sigcontext.h \ ++ /usr/include/asm-i386/sigcontext.h /usr/include/bits/sigstack.h \ ++ /usr/include/sys/ucontext.h /usr/include/bits/sigthread.h \ ++ /usr/include/sys/time.h /usr/include/xlocale.h /usr/include/string.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ ++ /usr/include/bits/stdio.h /usr/include/stdlib.h \ ++ /usr/include/bits/waitflags.h /usr/include/bits/waitstatus.h \ ++ /usr/include/alloca.h btconfig.h btcontent.h def.h bitfield.h btfiles.h \ ++ downloader.h peerlist.h peer.h def.h /usr/include/sys/socket.h \ ++ /usr/include/sys/uio.h /usr/include/bits/uio.h \ ++ /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/sockaddr.h /usr/include/asm/socket.h \ ++ /usr/include/asm-i386/socket.h /usr/include/asm/sockios.h \ ++ /usr/include/asm-i386/sockios.h /usr/include/arpa/inet.h \ ++ /usr/include/netinet/in.h /usr/include/stdint.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h btrequest.h btcontent.h bitfield.h \ ++ btstream.h bufio.h def.h rate.h def.h btconfig.h rate.h tracker.h \ ++ bufio.h /usr/include/sys/param.h /usr/include/linux/param.h \ ++ /usr/include/asm/param.h /usr/include/asm-i386/param.h ctcs.h config.h \ ++ sigint.h ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/signal.h: ++ ++/usr/include/bits/signum.h: ++ ++/usr/include/bits/siginfo.h: ++ ++/usr/include/bits/sigaction.h: ++ ++/usr/include/bits/sigcontext.h: ++ ++/usr/include/asm/sigcontext.h: ++ ++/usr/include/asm-i386/sigcontext.h: ++ ++/usr/include/bits/sigstack.h: ++ ++/usr/include/sys/ucontext.h: ++ ++/usr/include/bits/sigthread.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/string.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++btconfig.h: ++ ++btcontent.h: ++ ++def.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++downloader.h: ++ ++peerlist.h: ++ ++peer.h: ++ ++def.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++bitfield.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++def.h: ++ ++rate.h: ++ ++def.h: ++ ++btconfig.h: ++ ++rate.h: ++ ++tracker.h: ++ ++bufio.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++ctcs.h: ++ ++config.h: ++ ++sigint.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/downloader.Po ctorrent-1.3.4/.deps/downloader.Po +--- ctorrent-1.3.4.sav/.deps/downloader.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/downloader.Po 2006-06-28 19:24:14.000000000 +0200 +@@ -0,0 +1,214 @@ ++downloader.o downloader.o: downloader.cpp /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/xlocale.h /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/sys/time.h /usr/include/unistd.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/confname.h /usr/include/getopt.h \ ++ /usr/include/netinet/in.h /usr/include/stdint.h \ ++ /usr/include/bits/wchar.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h /usr/include/arpa/inet.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/alloca.h \ ++ /usr/include/string.h peerlist.h def.h config.h peer.h def.h \ ++ btrequest.h btcontent.h def.h bitfield.h btfiles.h btstream.h bufio.h \ ++ def.h rate.h btconfig.h rate.h tracker.h bufio.h \ ++ /usr/include/sys/param.h /usr/include/linux/param.h \ ++ /usr/include/asm/param.h /usr/include/asm-i386/param.h btconfig.h \ ++ btcontent.h ctcs.h bttime.h ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/string.h: ++ ++peerlist.h: ++ ++def.h: ++ ++config.h: ++ ++peer.h: ++ ++def.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++def.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++def.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++rate.h: ++ ++tracker.h: ++ ++bufio.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++btconfig.h: ++ ++btcontent.h: ++ ++ctcs.h: ++ ++bttime.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/httpencode.Po ctorrent-1.3.4/.deps/httpencode.Po +--- ctorrent-1.3.4.sav/.deps/httpencode.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/httpencode.Po 2006-06-28 19:24:14.000000000 +0200 +@@ -0,0 +1,72 @@ ++httpencode.o httpencode.o: httpencode.cpp def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h httpencode.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/xlocale.h \ ++ /usr/include/alloca.h /usr/include/ctype.h /usr/include/string.h \ ++ config.h ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++httpencode.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/ctype.h: ++ ++/usr/include/string.h: ++ ++config.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/iplist.Po ctorrent-1.3.4/.deps/iplist.Po +--- ctorrent-1.3.4.sav/.deps/iplist.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/iplist.Po 2006-06-28 19:24:14.000000000 +0200 +@@ -0,0 +1,130 @@ ++iplist.o iplist.o: iplist.cpp /usr/include/string.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/xlocale.h iplist.h def.h config.h /usr/include/unistd.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/include/bits/typesizes.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/arpa/inet.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h ++ ++/usr/include/string.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/xlocale.h: ++ ++iplist.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/peerlist.Po ctorrent-1.3.4/.deps/peerlist.Po +--- ctorrent-1.3.4.sav/.deps/peerlist.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/peerlist.Po 2006-06-28 19:24:16.000000000 +0200 +@@ -0,0 +1,237 @@ ++peerlist.o peerlist.o: peerlist.cpp /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h peerlist.h \ ++ def.h config.h peer.h def.h /usr/include/unistd.h \ ++ /usr/include/bits/posix_opt.h /usr/include/bits/environments.h \ ++ /usr/include/bits/confname.h /usr/include/getopt.h \ ++ /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/arpa/inet.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h /usr/include/string.h \ ++ /usr/include/xlocale.h btrequest.h btcontent.h def.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h bitfield.h \ ++ btfiles.h btstream.h bufio.h def.h rate.h btconfig.h rate.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/alloca.h \ ++ /usr/include/errno.h /usr/include/bits/errno.h \ ++ /usr/include/linux/errno.h /usr/include/asm/errno.h \ ++ /usr/include/asm-i386/errno.h btconfig.h connect_nonb.h setnonblock.h \ ++ btcontent.h msgencode.h iplist.h def.h tracker.h bufio.h \ ++ /usr/include/sys/time.h /usr/include/sys/param.h \ ++ /usr/include/linux/param.h /usr/include/asm/param.h \ ++ /usr/include/asm-i386/param.h ctcs.h bttime.h ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++peerlist.h: ++ ++def.h: ++ ++config.h: ++ ++peer.h: ++ ++def.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/string.h: ++ ++/usr/include/xlocale.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++def.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++def.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++rate.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: ++ ++btconfig.h: ++ ++connect_nonb.h: ++ ++setnonblock.h: ++ ++btcontent.h: ++ ++msgencode.h: ++ ++iplist.h: ++ ++def.h: ++ ++tracker.h: ++ ++bufio.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++ctcs.h: ++ ++bttime.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/peer.Po ctorrent-1.3.4/.deps/peer.Po +--- ctorrent-1.3.4.sav/.deps/peer.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/peer.Po 2006-06-28 19:24:15.000000000 +0200 +@@ -0,0 +1,201 @@ ++peer.o peer.o: peer.cpp peer.h def.h config.h /usr/include/unistd.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/arpa/inet.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h /usr/include/string.h \ ++ /usr/include/xlocale.h btrequest.h btcontent.h def.h \ ++ /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h \ ++ /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h bitfield.h \ ++ btfiles.h btstream.h bufio.h def.h rate.h btconfig.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/alloca.h \ ++ /usr/include/ctype.h btcontent.h msgencode.h peerlist.h def.h peer.h \ ++ rate.h btconfig.h bttime.h ++ ++peer.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/string.h: ++ ++/usr/include/xlocale.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++def.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++def.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/ctype.h: ++ ++btcontent.h: ++ ++msgencode.h: ++ ++peerlist.h: ++ ++def.h: ++ ++peer.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++bttime.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/rate.Po ctorrent-1.3.4/.deps/rate.Po +--- ctorrent-1.3.4.sav/.deps/rate.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/rate.Po 2006-06-28 19:24:16.000000000 +0200 +@@ -0,0 +1,57 @@ ++rate.o rate.o: rate.cpp rate.h def.h config.h /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/xlocale.h bttime.h ++ ++rate.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/xlocale.h: ++ ++bttime.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/setnonblock.Po ctorrent-1.3.4/.deps/setnonblock.Po +--- ctorrent-1.3.4.sav/.deps/setnonblock.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/setnonblock.Po 2006-06-28 19:24:16.000000000 +0200 +@@ -0,0 +1,120 @@ ++setnonblock.o setnonblock.o: setnonblock.cpp setnonblock.h def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/sys/socket.h /usr/include/sys/uio.h \ ++ /usr/include/bits/uio.h /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \ ++ /usr/include/sys/stat.h /usr/include/bits/stat.h ++ ++setnonblock.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/fcntl.h: ++ ++/usr/include/bits/fcntl.h: ++ ++/usr/include/sys/stat.h: ++ ++/usr/include/bits/stat.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/sha1.Po ctorrent-1.3.4/.deps/sha1.Po +--- ctorrent-1.3.4.sav/.deps/sha1.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/sha1.Po 2006-06-28 19:24:17.000000000 +0200 +@@ -0,0 +1,57 @@ ++sha1.o sha1.o: sha1.c /usr/include/string.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/string.h /usr/include/bits/string2.h \ ++ /usr/include/endian.h /usr/include/bits/endian.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/include/bits/typesizes.h /usr/include/stdlib.h sha1.h \ ++ /usr/include/sys/types.h /usr/include/time.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h ++ ++/usr/include/string.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/string.h: ++ ++/usr/include/bits/string2.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/stdlib.h: ++ ++sha1.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/time.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/sigint.Po ctorrent-1.3.4/.deps/sigint.Po +--- ctorrent-1.3.4.sav/.deps/sigint.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/sigint.Po 2006-06-28 19:24:16.000000000 +0200 +@@ -0,0 +1,228 @@ ++sigint.o sigint.o: sigint.cpp /usr/include/sys/types.h \ ++ /usr/include/features.h /usr/include/sys/cdefs.h \ ++ /usr/include/gnu/stubs.h /usr/include/bits/types.h \ ++ /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ ++ /usr/include/signal.h /usr/include/bits/signum.h \ ++ /usr/include/bits/siginfo.h /usr/include/bits/sigaction.h \ ++ /usr/include/bits/sigcontext.h /usr/include/asm/sigcontext.h \ ++ /usr/include/asm-i386/sigcontext.h /usr/include/bits/sigstack.h \ ++ /usr/include/sys/ucontext.h /usr/include/bits/sigthread.h btcontent.h \ ++ def.h config.h /usr/include/stdio.h /usr/include/libio.h \ ++ /usr/include/_G_config.h /usr/include/wchar.h /usr/include/bits/wchar.h \ ++ /usr/include/gconv.h /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ ++ /usr/include/bits/stdio.h bitfield.h btfiles.h def.h tracker.h bufio.h \ ++ def.h /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/time.h /usr/include/sys/socket.h \ ++ /usr/include/sys/uio.h /usr/include/bits/uio.h \ ++ /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/sockaddr.h /usr/include/asm/socket.h \ ++ /usr/include/asm-i386/socket.h /usr/include/asm/sockios.h \ ++ /usr/include/asm-i386/sockios.h /usr/include/netinet/in.h \ ++ /usr/include/stdint.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h /usr/include/arpa/inet.h \ ++ /usr/include/sys/param.h /usr/include/linux/param.h \ ++ /usr/include/asm/param.h /usr/include/asm-i386/param.h btconfig.h \ ++ peerlist.h peer.h def.h /usr/include/string.h /usr/include/xlocale.h \ ++ btrequest.h btcontent.h bitfield.h btstream.h bufio.h rate.h btconfig.h \ ++ rate.h sigint.h ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++/usr/include/signal.h: ++ ++/usr/include/bits/signum.h: ++ ++/usr/include/bits/siginfo.h: ++ ++/usr/include/bits/sigaction.h: ++ ++/usr/include/bits/sigcontext.h: ++ ++/usr/include/asm/sigcontext.h: ++ ++/usr/include/asm-i386/sigcontext.h: ++ ++/usr/include/bits/sigstack.h: ++ ++/usr/include/sys/ucontext.h: ++ ++/usr/include/bits/sigthread.h: ++ ++btcontent.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++def.h: ++ ++tracker.h: ++ ++bufio.h: ++ ++def.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++btconfig.h: ++ ++peerlist.h: ++ ++peer.h: ++ ++def.h: ++ ++/usr/include/string.h: ++ ++/usr/include/xlocale.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++bitfield.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++rate.h: ++ ++sigint.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/.deps/tracker.Po ctorrent-1.3.4/.deps/tracker.Po +--- ctorrent-1.3.4.sav/.deps/tracker.Po 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/.deps/tracker.Po 2006-06-28 19:24:17.000000000 +0200 +@@ -0,0 +1,244 @@ ++tracker.o tracker.o: tracker.cpp tracker.h def.h config.h \ ++ /usr/include/sys/types.h /usr/include/features.h \ ++ /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ ++ /usr/include/bits/types.h /usr/include/bits/wordsize.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h \ ++ /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ ++ /usr/include/bits/endian.h /usr/include/sys/select.h \ ++ /usr/include/bits/select.h /usr/include/bits/sigset.h \ ++ /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ ++ /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h bufio.h \ ++ def.h /usr/include/unistd.h /usr/include/bits/posix_opt.h \ ++ /usr/include/bits/environments.h /usr/include/bits/confname.h \ ++ /usr/include/getopt.h /usr/include/sys/time.h /usr/include/sys/socket.h \ ++ /usr/include/sys/uio.h /usr/include/bits/uio.h \ ++ /usr/include/bits/socket.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h \ ++ /usr/include/limits.h /usr/include/bits/posix1_lim.h \ ++ /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ ++ /usr/include/bits/posix2_lim.h /usr/include/bits/xopen_lim.h \ ++ /usr/include/bits/stdio_lim.h /usr/include/bits/sockaddr.h \ ++ /usr/include/asm/socket.h /usr/include/asm-i386/socket.h \ ++ /usr/include/asm/sockios.h /usr/include/asm-i386/sockios.h \ ++ /usr/include/netinet/in.h /usr/include/stdint.h \ ++ /usr/include/bits/wchar.h /usr/include/bits/in.h \ ++ /usr/include/bits/byteswap.h /usr/include/arpa/inet.h \ ++ /usr/include/sys/param.h /usr/include/linux/param.h \ ++ /usr/include/asm/param.h /usr/include/asm-i386/param.h btconfig.h \ ++ /usr/include/xlocale.h /usr/include/netdb.h /usr/include/rpc/netdb.h \ ++ /usr/include/bits/siginfo.h /usr/include/bits/netdb.h \ ++ /usr/include/stdlib.h /usr/include/bits/waitflags.h \ ++ /usr/include/bits/waitstatus.h /usr/include/alloca.h \ ++ /usr/include/string.h /usr/include/errno.h /usr/include/bits/errno.h \ ++ /usr/include/linux/errno.h /usr/include/asm/errno.h \ ++ /usr/include/asm-i386/errno.h peerlist.h peer.h def.h btrequest.h \ ++ btcontent.h /usr/include/stdio.h /usr/include/libio.h \ ++ /usr/include/_G_config.h /usr/include/wchar.h /usr/include/gconv.h \ ++ /usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h \ ++ /usr/include/bits/sys_errlist.h /usr/include/bits/stdio.h bitfield.h \ ++ btfiles.h btstream.h bufio.h rate.h btconfig.h rate.h httpencode.h \ ++ bencode.h setnonblock.h connect_nonb.h btcontent.h iplist.h def.h \ ++ ctcs.h ++ ++tracker.h: ++ ++def.h: ++ ++config.h: ++ ++/usr/include/sys/types.h: ++ ++/usr/include/features.h: ++ ++/usr/include/sys/cdefs.h: ++ ++/usr/include/gnu/stubs.h: ++ ++/usr/include/bits/types.h: ++ ++/usr/include/bits/wordsize.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stddef.h: ++ ++/usr/include/bits/typesizes.h: ++ ++/usr/include/time.h: ++ ++/usr/include/endian.h: ++ ++/usr/include/bits/endian.h: ++ ++/usr/include/sys/select.h: ++ ++/usr/include/bits/select.h: ++ ++/usr/include/bits/sigset.h: ++ ++/usr/include/bits/time.h: ++ ++/usr/include/sys/sysmacros.h: ++ ++/usr/include/bits/pthreadtypes.h: ++ ++/usr/include/bits/sched.h: ++ ++bufio.h: ++ ++def.h: ++ ++/usr/include/unistd.h: ++ ++/usr/include/bits/posix_opt.h: ++ ++/usr/include/bits/environments.h: ++ ++/usr/include/bits/confname.h: ++ ++/usr/include/getopt.h: ++ ++/usr/include/sys/time.h: ++ ++/usr/include/sys/socket.h: ++ ++/usr/include/sys/uio.h: ++ ++/usr/include/bits/uio.h: ++ ++/usr/include/bits/socket.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/limits.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/syslimits.h: ++ ++/usr/include/limits.h: ++ ++/usr/include/bits/posix1_lim.h: ++ ++/usr/include/bits/local_lim.h: ++ ++/usr/include/linux/limits.h: ++ ++/usr/include/bits/posix2_lim.h: ++ ++/usr/include/bits/xopen_lim.h: ++ ++/usr/include/bits/stdio_lim.h: ++ ++/usr/include/bits/sockaddr.h: ++ ++/usr/include/asm/socket.h: ++ ++/usr/include/asm-i386/socket.h: ++ ++/usr/include/asm/sockios.h: ++ ++/usr/include/asm-i386/sockios.h: ++ ++/usr/include/netinet/in.h: ++ ++/usr/include/stdint.h: ++ ++/usr/include/bits/wchar.h: ++ ++/usr/include/bits/in.h: ++ ++/usr/include/bits/byteswap.h: ++ ++/usr/include/arpa/inet.h: ++ ++/usr/include/sys/param.h: ++ ++/usr/include/linux/param.h: ++ ++/usr/include/asm/param.h: ++ ++/usr/include/asm-i386/param.h: ++ ++btconfig.h: ++ ++/usr/include/xlocale.h: ++ ++/usr/include/netdb.h: ++ ++/usr/include/rpc/netdb.h: ++ ++/usr/include/bits/siginfo.h: ++ ++/usr/include/bits/netdb.h: ++ ++/usr/include/stdlib.h: ++ ++/usr/include/bits/waitflags.h: ++ ++/usr/include/bits/waitstatus.h: ++ ++/usr/include/alloca.h: ++ ++/usr/include/string.h: ++ ++/usr/include/errno.h: ++ ++/usr/include/bits/errno.h: ++ ++/usr/include/linux/errno.h: ++ ++/usr/include/asm/errno.h: ++ ++/usr/include/asm-i386/errno.h: ++ ++peerlist.h: ++ ++peer.h: ++ ++def.h: ++ ++btrequest.h: ++ ++btcontent.h: ++ ++/usr/include/stdio.h: ++ ++/usr/include/libio.h: ++ ++/usr/include/_G_config.h: ++ ++/usr/include/wchar.h: ++ ++/usr/include/gconv.h: ++ ++/usr/lib/gcc/i486-linux-gnu/4.0.3/include/stdarg.h: ++ ++/usr/include/bits/sys_errlist.h: ++ ++/usr/include/bits/stdio.h: ++ ++bitfield.h: ++ ++btfiles.h: ++ ++btstream.h: ++ ++bufio.h: ++ ++rate.h: ++ ++btconfig.h: ++ ++rate.h: ++ ++httpencode.h: ++ ++bencode.h: ++ ++setnonblock.h: ++ ++connect_nonb.h: ++ ++btcontent.h: ++ ++iplist.h: ++ ++def.h: ++ ++ctcs.h: +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/downloader.cpp ctorrent-1.3.4/downloader.cpp +--- ctorrent-1.3.4.sav/downloader.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/downloader.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -21,21 +21,37 @@ + #include "peerlist.h" + #include "tracker.h" + #include "btcontent.h" ++#include "ctcs.h" ++#include "btconfig.h" ++#include "bttime.h" ++ ++time_t now = (time_t) 0; + + void Downloader() + { + int nfds,maxfd,r; + struct timeval timeout; +- time_t now; fd_set rfd; fd_set wfd; + int stopped = 0; - for(;;){ -+ do{ - time(&now); +- time(&now); - if( BTCONTENT.SeedTimeout(&now) ) break; -+ if( !stopped && BTCONTENT.SeedTimeout(&now) ) { -+ Tracker.SetStoped(); -+ stopped = 1; ++ time(&now); ++ do{ ++ if( !stopped && ++ ( BTCONTENT.SeedTimeout(&now) || ++ (( cfg_exit_zero_peers || Tracker.IsQuitting() ) && ++ !WORLD.TotalPeers()) ) ){ ++ Tracker.SetStoped(); ++ stopped = 1; ++ if( arg_ctcs ) CTCS.Send_Status(); + } FD_ZERO(&rfd); FD_ZERO(&wfd); maxfd = Tracker.IntervalCheck(&now,&rfd, &wfd); -@@ -48,5 +52,5 @@ ++ if( arg_ctcs ){ ++ r = CTCS.IntervalCheck(&now,&rfd, &wfd); ++ if( r > maxfd ) maxfd = r; ++ } + r = WORLD.FillFDSET(&now,&rfd,&wfd); + if( r > maxfd ) maxfd = r; + +@@ -43,10 +59,13 @@ + timeout.tv_usec = 0; + + nfds = select(maxfd + 1,&rfd,&wfd,(fd_set*) 0,&timeout); ++ time(&now); + +- if(nfds > 0){ ++ if(nfds > 0){ if(T_FREE != Tracker.GetStatus()) Tracker.SocketReady(&rfd,&wfd,&nfds); - if( nfds ) WORLD.AnyPeerReady(&rfd,&wfd,&nfds); - } +- if( nfds ) WORLD.AnyPeerReady(&rfd,&wfd,&nfds); +- } - }/* end for(;;) */ -+ } while(Tracker.GetStatus() != T_FINISHED); ++ if(nfds > 0 && T_FREE != CTCS.GetStatus()) ++ CTCS.SocketReady(&rfd,&wfd,&nfds); ++ if(nfds > 0) WORLD.AnyPeerReady(&rfd,&wfd,&nfds); ++ } ++ } while(Tracker.GetStatus() != T_FINISHED || Tracker.IsPaused()); } -diff -u ctorrent-1.3.4.orig/httpencode.cpp ctorrent-1.3.4/httpencode.cpp ---- ctorrent-1.3.4.orig/httpencode.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/httpencode.cpp 2005-08-11 23:45:29.429693680 +0200 +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/httpencode.cpp ctorrent-1.3.4/httpencode.cpp +--- ctorrent-1.3.4.sav/httpencode.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/httpencode.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -1,6 +1,6 @@ ++#include "./def.h" + #include <sys/types.h> + +-#include "./def.h" + #include "./httpencode.h" + + #include <stdlib.h> @@ -88,7 +88,7 @@ /* path */ @@ -636,26 +11396,66 @@ diff -u ctorrent-1.3.4.orig/httpencode.cpp ctorrent-1.3.4/httpencode.cpp *path = '\0'; return 0; } -diff -u ctorrent-1.3.4.orig/httpencode.h ctorrent-1.3.4/httpencode.h ---- ctorrent-1.3.4.orig/httpencode.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/httpencode.h 2005-08-11 23:45:29.429693680 +0200 -@@ -2,8 +2,11 @@ +@@ -115,7 +115,7 @@ + hlen = p - b; + *pd = ( p + addtion ); + *dlen = n - hlen - addtion; +- }else{ // 只有首部信息???? ++ }else{ // 只有首部信息???? + hlen = n; + *pd = (char*) 0; + *dlen = 0; +@@ -131,8 +131,8 @@ + for(; n && *b != ' ' && *b != '\n'; b++,n--) ; + if( !n || *b != ' ') r = -1; + else{ +- r = atoi(b); +- if( r < 100 || r > 600 ) r = -1; ++ r = atoi(b); ++ if( r < 100 || r > 600 ) r = -1; + } + return r; + } +@@ -160,11 +160,11 @@ + + if( r > header_len ){ + if( strncasecmp(b, h, header_len) == 0){ +- /* header founded */ +- b += header_len; +- for(; *b != '\n'; v++,b++) *v = *b; +- *v = '\0'; +- return 0; ++ /* header founded */ ++ b += header_len; ++ for(; *b != '\n'; v++,b++) *v = *b; ++ *v = '\0'; ++ return 0; + } + } + b += r; +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/httpencode.h ctorrent-1.3.4/httpencode.h +--- ctorrent-1.3.4.sav/httpencode.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/httpencode.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,9 +1,13 @@ + #ifndef HTTPENCODE_H #define HTTPENCODE_H - #define REQ_URL_P1_FMT "GET %s?info_hash=%s&peer_id=%s&port=%d" +-#define REQ_URL_P1_FMT "GET %s?info_hash=%s&peer_id=%s&port=%d" -#define REQ_URL_P2_FMT "%s&uploaded=%d&downloaded=%d&left=%d&event=%s&compact=1 HTTP/1.0" -#define REQ_URL_P3_FMT "%s&uploaded=%d&downloaded=%d&left=%d&compact=1 HTTP/1.0" ++#define REQ_URL_P1_FMT "GET %s?info_hash=%s&peer_id=%s&port=%d&key=%s" ++#define REQ_URL_P1A_FMT "GET %s&info_hash=%s&peer_id=%s&port=%d&key=%s" +//#define REQ_URL_P2_FMT "%s&uploaded=%d&downloaded=%d&left=%d&event=%s&compact=1 HTTP/1.0" +//#define REQ_URL_P3_FMT "%s&uploaded=%d&downloaded=%d&left=%d&compact=1 HTTP/1.0" -+#define REQ_URL_P2_FMT "%s&uploaded=%llu&downloaded=%llu&left=%llu&compact=1&event=%s&numwant=%u HTTP/1.0" -+#define REQ_URL_P3_FMT "%s&uploaded=%llu&downloaded=%llu&left=%llu&compact=1&numwant=%u HTTP/1.0" ++#define REQ_URL_P2_FMT "%s&uploaded=%llu&downloaded=%llu&left=%llu&compact=1&event=%s&numwant=%u&key=%s HTTP/1.0" ++#define REQ_URL_P3_FMT "%s&uploaded=%llu&downloaded=%llu&left=%llu&compact=1&numwant=%u&key=%s HTTP/1.0" + char* Http_url_encode(char *s,char *b,size_t n); int Http_url_analyse(char *url,char *host,int *port,char *path); -diff -u ctorrent-1.3.4.orig/iplist.cpp ctorrent-1.3.4/iplist.cpp ---- ctorrent-1.3.4.orig/iplist.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/iplist.cpp 2005-08-11 23:45:29.429693680 +0200 +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/iplist.cpp ctorrent-1.3.4/iplist.cpp +--- ctorrent-1.3.4.sav/iplist.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/iplist.cpp 2006-06-28 19:30:02.000000000 +0200 @@ -8,8 +8,8 @@ IPLIST *node = ipl_head; for(; ipl_head;){ @@ -666,10 +11466,567 @@ diff -u ctorrent-1.3.4.orig/iplist.cpp ctorrent-1.3.4/iplist.cpp } count = 0; } -diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp ---- ctorrent-1.3.4.orig/peer.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/peer.cpp 2005-08-11 23:45:29.431693376 +0200 -@@ -2,12 +2,34 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/Makefile.am ctorrent-1.3.4/Makefile.am +--- ctorrent-1.3.4.sav/Makefile.am 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/Makefile.am 2006-06-28 19:30:02.000000000 +0200 +@@ -1,2 +1,2 @@ + bin_PROGRAMS = ctorrent +-ctorrent_SOURCES = bencode.cpp bitfield.cpp btconfig.cpp btcontent.cpp btfiles.cpp btrequest.cpp btstream.cpp bufio.cpp connect_nonb.cpp ctorrent.cpp downloader.cpp httpencode.cpp iplist.cpp peer.cpp peerlist.cpp rate.cpp setnonblock.cpp sigint.cpp tracker.cpp bencode.h bitfield.h btconfig.h btcontent.h btfiles.h btrequest.h btstream.h bufio.h connect_nonb.h def.h downloader.h httpencode.h iplist.h msgencode.h peer.h peerlist.h rate.h setnonblock.h sigint.h tracker.h ++ctorrent_SOURCES = bencode.cpp bitfield.cpp btconfig.cpp btcontent.cpp btfiles.cpp btrequest.cpp btstream.cpp bufio.cpp connect_nonb.cpp ctcs.cpp ctorrent.cpp downloader.cpp httpencode.cpp iplist.cpp peer.cpp peerlist.cpp rate.cpp setnonblock.cpp sigint.cpp tracker.cpp sha1.c bencode.h bitfield.h btconfig.h btcontent.h btfiles.h btrequest.h btstream.h bufio.h connect_nonb.h ctcs.h def.h downloader.h httpencode.h iplist.h msgencode.h peer.h peerlist.h rate.h setnonblock.h sigint.h tracker.h sha1.h +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/Makefile.in ctorrent-1.3.4/Makefile.in +--- ctorrent-1.3.4.sav/Makefile.in 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/Makefile.in 2006-06-28 19:30:02.000000000 +0200 +@@ -1,8 +1,8 @@ +-# Makefile.in generated by automake 1.7.6 from Makefile.am. ++# Makefile.in generated by automake 1.9.1 from Makefile.am. + # @configure_input@ + +-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +-# Free Software Foundation, Inc. ++# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, ++# 2003, 2004 Free Software Foundation, Inc. + # This Makefile.in is free software; the Free Software Foundation + # gives unlimited permission to copy and/or distribute it, + # with or without modifications, as long as this notice is preserved. +@@ -14,6 +14,8 @@ + + @SET_MAKE@ + ++SOURCES = $(ctorrent_SOURCES) ++ + srcdir = @srcdir@ + top_srcdir = @top_srcdir@ + VPATH = @srcdir@ +@@ -21,7 +23,6 @@ + pkglibdir = $(libdir)/@PACKAGE@ + pkgincludedir = $(includedir)/@PACKAGE@ + top_builddir = . +- + am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd + INSTALL = @INSTALL@ + install_sh_DATA = $(install_sh) -c -m 644 +@@ -35,6 +36,61 @@ + NORMAL_UNINSTALL = : + PRE_UNINSTALL = : + POST_UNINSTALL = : ++bin_PROGRAMS = ctorrent$(EXEEXT) ++subdir = . ++DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ ++ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ ++ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ ++ depcomp install-sh missing mkinstalldirs ++ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ++am__aclocal_m4_deps = $(top_srcdir)/configure.ac ++am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ ++ $(ACLOCAL_M4) ++am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ ++ configure.lineno configure.status.lineno ++mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs ++CONFIG_HEADER = config.h ++CONFIG_CLEAN_FILES = ++am__installdirs = "$(DESTDIR)$(bindir)" ++binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) ++PROGRAMS = $(bin_PROGRAMS) ++am_ctorrent_OBJECTS = bencode.$(OBJEXT) bitfield.$(OBJEXT) \ ++ btconfig.$(OBJEXT) btcontent.$(OBJEXT) btfiles.$(OBJEXT) \ ++ btrequest.$(OBJEXT) btstream.$(OBJEXT) bufio.$(OBJEXT) \ ++ connect_nonb.$(OBJEXT) ctcs.$(OBJEXT) ctorrent.$(OBJEXT) \ ++ downloader.$(OBJEXT) httpencode.$(OBJEXT) iplist.$(OBJEXT) \ ++ peer.$(OBJEXT) peerlist.$(OBJEXT) rate.$(OBJEXT) \ ++ setnonblock.$(OBJEXT) sigint.$(OBJEXT) tracker.$(OBJEXT) \ ++ sha1.$(OBJEXT) ++ctorrent_OBJECTS = $(am_ctorrent_OBJECTS) ++ctorrent_LDADD = $(LDADD) ++DEFAULT_INCLUDES = -I. -I$(srcdir) -I. ++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 $@ ++SOURCES = $(ctorrent_SOURCES) ++DIST_SOURCES = $(ctorrent_SOURCES) ++ETAGS = etags ++CTAGS = ctags ++DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ++distdir = $(PACKAGE)-$(VERSION) ++top_distdir = $(distdir) ++am__remove_distdir = \ ++ { test ! -d $(distdir) \ ++ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ ++ && rm -fr $(distdir); }; } ++DIST_ARCHIVES = $(distdir).tar.gz ++GZIP_ENV = --best ++distuninstallcheck_listfiles = find . -type f -print ++distcleancheck_listfiles = find . -type f -print + ACLOCAL = @ACLOCAL@ + AMDEP_FALSE = @AMDEP_FALSE@ + AMDEP_TRUE = @AMDEP_TRUE@ +@@ -90,6 +146,8 @@ + am__include = @am__include@ + am__leading_dot = @am__leading_dot@ + am__quote = @am__quote@ ++am__tar = @am__tar@ ++am__untar = @am__untar@ + bindir = @bindir@ + build_alias = @build_alias@ + datadir = @datadir@ +@@ -102,6 +160,7 @@ + libexecdir = @libexecdir@ + localstatedir = @localstatedir@ + mandir = @mandir@ ++mkdir_p = @mkdir_p@ + oldincludedir = @oldincludedir@ + prefix = @prefix@ + program_transform_name = @program_transform_name@ +@@ -109,76 +168,44 @@ + sharedstatedir = @sharedstatedir@ + sysconfdir = @sysconfdir@ + target_alias = @target_alias@ +-bin_PROGRAMS = ctorrent +-ctorrent_SOURCES = bencode.cpp bitfield.cpp btconfig.cpp btcontent.cpp btfiles.cpp btrequest.cpp btstream.cpp bufio.cpp connect_nonb.cpp ctorrent.cpp downloader.cpp httpencode.cpp iplist.cpp peer.cpp peerlist.cpp rate.cpp setnonblock.cpp sigint.cpp tracker.cpp bencode.h bitfield.h btconfig.h btcontent.h btfiles.h btrequest.h btstream.h bufio.h connect_nonb.h def.h downloader.h httpencode.h iplist.h msgencode.h peer.h peerlist.h rate.h setnonblock.h sigint.h tracker.h +-subdir = . +-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +-CONFIG_HEADER = config.h +-CONFIG_CLEAN_FILES = +-bin_PROGRAMS = ctorrent$(EXEEXT) +-PROGRAMS = $(bin_PROGRAMS) +- +-am_ctorrent_OBJECTS = bencode.$(OBJEXT) bitfield.$(OBJEXT) \ +- btconfig.$(OBJEXT) btcontent.$(OBJEXT) btfiles.$(OBJEXT) \ +- btrequest.$(OBJEXT) btstream.$(OBJEXT) bufio.$(OBJEXT) \ +- connect_nonb.$(OBJEXT) ctorrent.$(OBJEXT) downloader.$(OBJEXT) \ +- httpencode.$(OBJEXT) iplist.$(OBJEXT) peer.$(OBJEXT) \ +- peerlist.$(OBJEXT) rate.$(OBJEXT) setnonblock.$(OBJEXT) \ +- sigint.$(OBJEXT) tracker.$(OBJEXT) +-ctorrent_OBJECTS = $(am_ctorrent_OBJECTS) +-ctorrent_LDADD = $(LDADD) +-ctorrent_DEPENDENCIES = +-ctorrent_LDFLAGS = +- +-DEFAULT_INCLUDES = -I. -I$(srcdir) -I. +-depcomp = $(SHELL) $(top_srcdir)/depcomp +-am__depfiles_maybe = depfiles +-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/bencode.Po ./$(DEPDIR)/bitfield.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/btconfig.Po ./$(DEPDIR)/btcontent.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/btfiles.Po ./$(DEPDIR)/btrequest.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/btstream.Po ./$(DEPDIR)/bufio.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/connect_nonb.Po ./$(DEPDIR)/ctorrent.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/downloader.Po ./$(DEPDIR)/httpencode.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/iplist.Po ./$(DEPDIR)/peer.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/peerlist.Po ./$(DEPDIR)/rate.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/setnonblock.Po ./$(DEPDIR)/sigint.Po \ +-@AMDEP_TRUE@ ./$(DEPDIR)/tracker.Po +-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 $@ +-DIST_SOURCES = $(ctorrent_SOURCES) +-DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \ +- Makefile.in NEWS aclocal.m4 config.h.in configure configure.ac \ +- depcomp install-sh missing mkinstalldirs +-SOURCES = $(ctorrent_SOURCES) +- ++ctorrent_SOURCES = bencode.cpp bitfield.cpp btconfig.cpp btcontent.cpp btfiles.cpp btrequest.cpp btstream.cpp bufio.cpp connect_nonb.cpp ctcs.cpp ctorrent.cpp downloader.cpp httpencode.cpp iplist.cpp peer.cpp peerlist.cpp rate.cpp setnonblock.cpp sigint.cpp tracker.cpp sha1.c bencode.h bitfield.h btconfig.h btcontent.h btfiles.h btrequest.h btstream.h bufio.h connect_nonb.h ctcs.h def.h downloader.h httpencode.h iplist.h msgencode.h peer.h peerlist.h rate.h setnonblock.h sigint.h tracker.h sha1.h + all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + + .SUFFIXES: +-.SUFFIXES: .cpp .o .obj +- +-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ +- configure.lineno +-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) ++.SUFFIXES: .c .cpp .o .obj ++am--refresh: ++ @: ++$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) ++ @for dep in $?; do \ ++ case '$(am__configure_deps)' in \ ++ *$$dep*) \ ++ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ ++ cd $(srcdir) && $(AUTOMAKE) --gnu \ ++ && exit 0; \ ++ exit 1;; \ ++ esac; \ ++ done; \ ++ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +- cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe) ++.PRECIOUS: Makefile ++Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status ++ @case '$?' in \ ++ *config.status*) \ ++ echo ' $(SHELL) ./config.status'; \ ++ $(SHELL) ./config.status;; \ ++ *) \ ++ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ ++ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ ++ esac; + +-$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) ++$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck +-$(srcdir)/configure: $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) +- cd $(srcdir) && $(AUTOCONF) + +-$(ACLOCAL_M4): configure.ac ++$(top_srcdir)/configure: $(am__configure_deps) ++ cd $(srcdir) && $(AUTOCONF) ++$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + + config.h: stamp-h1 +@@ -190,24 +217,23 @@ + stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +- +-$(srcdir)/config.h.in: $(top_srcdir)/configure.ac $(ACLOCAL_M4) ++$(srcdir)/config.h.in: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) +- touch $(srcdir)/config.h.in ++ rm -f stamp-h1 ++ touch $@ + + distclean-hdr: + -rm -f config.h stamp-h1 +-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) + install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) +- $(mkinstalldirs) $(DESTDIR)$(bindir) ++ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ +- echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ +- $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ ++ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ ++ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +@@ -215,8 +241,8 @@ + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ +- echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ +- rm -f $(DESTDIR)$(bindir)/$$f; \ ++ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ ++ rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + + clean-binPROGRAMS: +@@ -226,7 +252,7 @@ + $(CXXLINK) $(ctorrent_LDFLAGS) $(ctorrent_OBJECTS) $(ctorrent_LDADD) $(LIBS) + + mostlyclean-compile: +- -rm -f *.$(OBJEXT) core *.core ++ -rm -f *.$(OBJEXT) + + distclean-compile: + -rm -f *.tab.c +@@ -240,6 +266,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/btstream.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bufio.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connect_nonb.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctcs.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ctorrent.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/downloader.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/httpencode.Po@am__quote@ +@@ -248,43 +275,39 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/peerlist.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rate.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/setnonblock.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigint.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tracker.Po@am__quote@ + +-distclean-depend: +- -rm -rf ./$(DEPDIR) ++.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) '$<'` + + .cpp.o: +-@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +-@am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ +-@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +-@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +-@am__fastdepCXX_TRUE@ fi ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi + @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + + .cpp.obj: +-@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ +-@am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ +-@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ +-@am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ +-@am__fastdepCXX_TRUE@ fi ++@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ ++@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi + @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +-@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +-@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` ++@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ ++@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + uninstall-info-am: + +-ETAGS = etags +-ETAGSFLAGS = +- +-CTAGS = ctags +-CTAGSFLAGS = +- +-tags: TAGS +- + ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ +@@ -293,6 +316,7 @@ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique ++tags: TAGS + + TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) +@@ -304,10 +328,11 @@ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ +- test -z "$(ETAGS_ARGS)$$tags$$unique" \ +- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +- $$tags $$unique +- ++ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ ++ test -n "$$unique" || unique=$$empty_fix; \ ++ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ ++ $$tags $$unique; \ ++ fi + ctags: CTAGS + CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) +@@ -330,19 +355,6 @@ + + distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags +-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +- +-top_distdir = . +-distdir = $(PACKAGE)-$(VERSION) +- +-am__remove_distdir = \ +- { test ! -d $(distdir) \ +- || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ +- && rm -fr $(distdir); }; } +- +-GZIP_ENV = --best +-distuninstallcheck_listfiles = find . -type f -print +-distcleancheck_listfiles = find . -type f -print + + distdir: $(DISTFILES) + $(am__remove_distdir) +@@ -358,7 +370,7 @@ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ +- $(mkinstalldirs) "$(distdir)$$dir"; \ ++ $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ +@@ -379,19 +391,46 @@ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) + dist-gzip: distdir +- $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz ++ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz ++ $(am__remove_distdir) ++ ++dist-bzip2: distdir ++ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 ++ $(am__remove_distdir) ++ ++dist-tarZ: distdir ++ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z ++ $(am__remove_distdir) ++ ++dist-shar: distdir ++ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz ++ $(am__remove_distdir) ++ ++dist-zip: distdir ++ -rm -f $(distdir).zip ++ zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + + dist dist-all: distdir +- $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz ++ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + + # This target untars the dist file and tries a VPATH configuration. Then + # it guarantees that the distribution is self-contained by making another + # tarfile. + distcheck: dist +- $(am__remove_distdir) +- GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ++ case '$(DIST_ARCHIVES)' in \ ++ *.tar.gz*) \ ++ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ ++ *.tar.bz2*) \ ++ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ ++ *.tar.Z*) \ ++ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ ++ *.shar.gz*) \ ++ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ ++ *.zip*) \ ++ unzip $(distdir).zip ;;\ ++ esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst +@@ -411,19 +450,20 @@ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ +- (cd ../.. && $(mkinstalldirs) "$$dc_destdir") \ ++ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ +- && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \ +- && rm -f $(distdir).tar.gz \ ++ && $(MAKE) $(AM_MAKEFLAGS) dist \ ++ && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) +- @echo "$(distdir).tar.gz is ready for distribution" | \ +- sed 'h;s/./=/g;p;x;p;x' ++ @(echo "$(distdir) archives ready for distribution: "; \ ++ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ ++ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' + distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ +@@ -445,9 +485,10 @@ + check-am: all-am + check: check-am + all-am: Makefile $(PROGRAMS) config.h +- + installdirs: +- $(mkinstalldirs) $(DESTDIR)$(bindir) ++ for dir in "$(DESTDIR)$(bindir)"; do \ ++ test -z "$$dir" || $(mkdir_p) "$$dir"; \ ++ done + install: install-am + install-exec: install-exec-am + install-data: install-data-am +@@ -459,7 +500,7 @@ + installcheck: installcheck-am + install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +- INSTALL_STRIP_FLAG=-s \ ++ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install + mostlyclean-generic: +@@ -467,7 +508,7 @@ + clean-generic: + + distclean-generic: +- -rm -f Makefile $(CONFIG_CLEAN_FILES) ++ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + + maintainer-clean-generic: + @echo "This command is intended for maintainers to use" +@@ -478,13 +519,17 @@ + + distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) +-distclean-am: clean-am distclean-compile distclean-depend \ +- distclean-generic distclean-hdr distclean-tags ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile ++distclean-am: clean-am distclean-compile distclean-generic \ ++ distclean-hdr distclean-tags + + dvi: dvi-am + + dvi-am: + ++html: html-am ++ + info: info-am + + info-am: +@@ -502,6 +547,8 @@ + maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache ++ -rm -rf ./$(DEPDIR) ++ -rm -f Makefile + maintainer-clean-am: distclean-am maintainer-clean-generic + + mostlyclean: mostlyclean-am +@@ -518,11 +565,12 @@ + + uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ +- clean-generic ctags dist dist-all dist-gzip distcheck distclean \ +- distclean-compile distclean-depend distclean-generic \ +- distclean-hdr distclean-tags distcleancheck distdir \ +- distuninstallcheck dvi dvi-am info info-am install install-am \ ++.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ ++ clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \ ++ dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \ ++ distclean-compile distclean-generic distclean-hdr \ ++ distclean-tags distcleancheck distdir distuninstallcheck dvi \ ++ dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/peer.cpp ctorrent-1.3.4/peer.cpp +--- ctorrent-1.3.4.sav/peer.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/peer.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -2,14 +2,74 @@ #include <stdlib.h> #include <string.h> @@ -680,6 +12037,7 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp #include "./msgencode.h" #include "./peerlist.h" #include "./btconfig.h" ++#include "bttime.h" +size_t get_nl(char *sfrom) +{ @@ -701,10 +12059,58 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + *to = from & 0xff; +} + ++// Convert a peer ID to a printable string. ++int TextPeerID(unsigned char *peerid, char *txtid) ++{ ++ int i, j; ++ ++ for(i=j=0; i < PEER_ID_LEN; i++){ ++ if( i==j && isprint(peerid[i]) && !isspace(peerid[i]) ) ++ txtid[j++] = peerid[i]; ++ else{ ++ if(i==j){ sprintf(txtid+j, "0x"); j+=2; } ++ snprintf(txtid+j, 3, "%.2X", (int)(peerid[i])); ++ j += 2; ++ } ++ } ++ txtid[j] = '\0'; ++ ++ return 0; ++} ++ ++ ++/* g_next_up is used to rotate uploading. If we have the opportunity to ++ upload to a peer but skip it due to bw limiting, the var is set to point to ++ that peer and it will be given priority at the next opportunity. ++ g_next_dn is similar, but for downloading. ++ g_defer_up/dn is used to let the g_next peer object know if it skipped. ++*/ ++btPeer *g_next_up = (btPeer *)0; ++btPeer *g_next_dn = (btPeer *)0; ++unsigned char g_defer_up = 0; ++unsigned char g_defer_dn = 0; btBasic Self; ++void btBasic::SetCurrentRates() ++{ ++ m_current_dl = rate_dl.RateMeasure(); ++ m_current_ul = rate_ul.RateMeasure(); ++ m_use_current = 1; ++} ++ void btBasic::SetIp(struct sockaddr_in addr) -@@ -44,11 +66,13 @@ + { + memcpy(&m_sin.sin_addr,&addr.sin_addr,sizeof(struct in_addr)); +@@ -24,7 +84,7 @@ + { + // fprintf(stdout,"IpEquiv: %s <=> ", inet_ntoa(m_sin.sin_addr)); + // fprintf(stdout,"%s\n", inet_ntoa(addr.sin_addr)); +- return (memcmp(&m_sin.sin_addr,&addr.sin_addr,sizeof(struct in_addr)) == 0) ? ++ return (memcmp(&m_sin.sin_addr,&addr.sin_addr,sizeof(struct in_addr)) == 0) ? + 1 : 0; + } + +@@ -44,11 +104,13 @@ int btPeer::Need_Remote_Data() { @@ -718,28 +12124,44 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp return tmpBitfield.IsEmpty() ? 0 : 1; } return 0; -@@ -65,6 +89,7 @@ +@@ -59,12 +121,19 @@ + m_f_keepalive = 0; + m_status = P_CONNECTING; + m_unchoke_timestamp = (time_t) 0; +- time(&m_last_timestamp); ++ m_last_timestamp = now; + m_state.remote_choked = m_state.local_choked = 1; + m_state.remote_interested = m_state.local_interested = 0; m_err_count = 0; m_cached_idx = BTCONTENT.GetNPieces(); + m_standby = 0; ++ m_req_send = 5; ++ m_req_out = 0; ++ m_latency = 0; ++ m_prev_dlrate = 0; ++ m_health_time = m_receive_time = m_choketime = m_last_timestamp; ++ m_bad_health = 0; } int btPeer::SetLocal(unsigned char s) -@@ -72,20 +97,30 @@ +@@ -72,21 +141,37 @@ switch(s){ case M_CHOKE: if( m_state.local_choked ) return 0; -+ time(&m_unchoke_timestamp); ++ m_unchoke_timestamp = now; +// if(arg_verbose) fprintf(stderr, "Choking %p\n", this); + if(arg_verbose) fprintf(stderr, "Choking %p (D=%lluMB@%uK/s)\n", this, + TotalDL() >> 20, RateDL() >> 10); m_state.local_choked = 1; ++ if( g_next_up == this ) g_next_up = (btPeer *)0; ++ if( !reponse_q.IsEmpty()) reponse_q.Empty(); break; case M_UNCHOKE: if( !reponse_q.IsEmpty() ) StartULTimer(); if( !m_state.local_choked ) return 0; - time(&m_unchoke_timestamp); +- time(&m_unchoke_timestamp); ++ m_unchoke_timestamp = now; +// if(arg_verbose) fprintf(stderr, "Unchoking %p\n", this); + if(arg_verbose) fprintf(stderr, "Unchoking %p (D=%lluMB@%uK/s)\n", this, + TotalDL() >> 20, RateDL() >> 10); @@ -755,17 +12177,35 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp if( !m_state.local_interested ) return 0; + if(arg_verbose) fprintf(stderr, "Not interested in %p\n", this); m_state.local_interested = 0; ++ if( !request_q.IsEmpty() ){ ++ CancelRequest(request_q.GetHead()); ++ request_q.Empty(); ++ } break; default: -@@ -97,12 +132,15 @@ + return -1; // BUG ??? +@@ -97,103 +182,195 @@ int btPeer::RequestPiece() { size_t idx; + int endgame = 0; - PENDINGQUEUE.ReAssign(&request_q,bitfield); +- PENDINGQUEUE.ReAssign(&request_q,bitfield); ++ size_t qsize = request_q.Qsize(); ++ size_t psize = BTCONTENT.GetPieceLength() / cfg_req_slice_size; - if( !request_q.IsEmpty() ) return SendRequest(); +- if( !request_q.IsEmpty() ) return SendRequest(); ++ // See if there's room in the queue for a new piece. ++ // Also, don't queue another piece if we still have a full piece queued. ++ if( cfg_req_queue_length - qsize < psize || qsize >= psize ){ ++ m_req_send = m_req_out; // don't come back until you receive something. ++ return 0; ++ } ++ ++ if( PENDINGQUEUE.ReAssign(&request_q,bitfield) ){ ++ if(arg_verbose) fprintf(stderr, "Assigning to %p from Pending\n", this); ++ return SendRequest(); ++ } - if( m_cached_idx < BTCONTENT.GetNPieces() ){ + if( m_cached_idx < BTCONTENT.GetNPieces() && !BTCONTENT.pBF->IsEmpty() ){ @@ -774,8 +12214,11 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp idx = m_cached_idx; m_cached_idx = BTCONTENT.GetNPieces(); if( !BTCONTENT.pBF->IsSet(idx) && -@@ -110,39 +148,72 @@ - !WORLD.AlreadyRequested(idx) ){ +- !PENDINGQUEUE.Exist(idx) && +- !WORLD.AlreadyRequested(idx) ){ ++ !PENDINGQUEUE.Exist(idx) && ++ !WORLD.AlreadyRequested(idx) ){ ++ if(arg_verbose) fprintf(stderr, "Assigning #%u to %p\n", idx, this); return (request_q.CreateWithIdx(idx) < 0) ? -1 : SendRequest(); } - }else{ @@ -783,12 +12226,18 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + if( BTCONTENT.pBF->IsEmpty() ){ + // If we don't have a complete piece yet, try to get one that's already + // in progress. (Initial-piece mode) -+ btPeer *peer = WORLD.Who_Can_Duplicate(this, BTCONTENT.GetNPieces()); -+ if(peer){ -+ if(arg_verbose) fprintf( stderr, "Duping: %p to %p (#%u)\n", -+ peer, this, peer->request_q.GetRequestIdx() ); -+ return (request_q.CopyShuffle(peer->request_q) < 0) ? -1 : SendRequest(); -+ } ++ BitField tmpBitField = bitfield; ++ idx = WORLD.What_Can_Duplicate(tmpBitField, this, BTCONTENT.GetNPieces()); ++ if( idx < BTCONTENT.GetNPieces() ){ ++ if(arg_verbose) fprintf(stderr, "Want to dup #%u to %p\n", idx, this); ++ btPeer *peer = WORLD.WhoHas(idx); ++ if(peer){ ++ if(arg_verbose) fprintf( stderr, "Duping: %p to %p (#%u)\n", ++ peer, this, idx ); ++ return (request_q.CopyShuffle(&peer->request_q, idx) < 0) ? ++ -1 : SendRequest(); ++ } ++ }else if(arg_verbose) fprintf(stderr, "Nothing to dup to %p\n", this); + } // Doesn't have a piece that's already in progress--choose another. BitField tmpBitField; if( bitfield.IsFull() ){ @@ -825,41 +12274,58 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + // [tmpBitField2]... that we haven't requested from anyone. + if(tmpBitField2.IsEmpty()){ + // Everything this peer has that I want, I've already requested. -+ endgame = ( WORLD.Pieces_I_Can_Get() - BTCONTENT.pBF->Count() ) -+ < WORLD.TotalPeers(); ++ if( arg_file_to_download ){ ++ BitField afdBitField = *BTCONTENT.pBF; ++ afdBitField.Except(*BTCONTENT.pBFilter); ++ endgame = ( BTCONTENT.getFilePieces(arg_file_to_download) ++ - afdBitField.Count() ) < WORLD.TotalPeers(); ++ }else ++ endgame = ( WORLD.Pieces_I_Can_Get() - BTCONTENT.pBF->Count() ) ++ < WORLD.TotalPeers(); + if(endgame){ // OK to duplicate a request. -+// idx = tmpBitField.Random(); -+ idx = 0; // flag for Who_Can_Duplicate() -+ btPeer *peer = WORLD.Who_Can_Duplicate(this, idx); -+ if(arg_verbose) fprintf( stderr, "Duping: %p to %p (#%u)\n", -+ peer, this, peer->request_q.GetRequestIdx() ); -+ return (request_q.CopyShuffle(peer->request_q) < 0) ? -+ -1 : SendRequest(); ++// idx = tmpBitField.Random(); ++ idx = 0; // flag for Who_Can_Duplicate() ++ BitField tmpBitField3 = tmpBitField2; ++ idx = WORLD.What_Can_Duplicate(tmpBitField3, this, idx); ++ if( idx < BTCONTENT.GetNPieces() ){ ++ if(arg_verbose) fprintf(stderr,"Want to dup #%u to %p\n",idx,this); ++ btPeer *peer = WORLD.WhoHas(idx); ++ if(peer){ ++ if(arg_verbose) fprintf( stderr, "Duping: %p to %p (#%u)\n", ++ peer, this, idx ); ++ return (request_q.CopyShuffle(&peer->request_q, idx) < 0) ? ++ -1 : SendRequest(); ++ } ++ }else if(arg_verbose) fprintf(stderr, "Nothing to dup to %p\n",this); + }else{ // not endgame mode -+ btPeer *peer = WORLD.Who_Can_Abandon(this); // slowest choice -+ if(peer){ -+ // Cancel a request to the slowest peer & request it from this one. -+ if(arg_verbose) fprintf( stderr, "Reassigning %p to %p (#%u)\n", -+ peer, this, peer->request_q.GetRequestIdx() ); -+ peer->StopDLTimer(); -+ // RequestQueue class "moves" rather than "copies" in assignment! -+ request_q = peer->request_q; -+ -+ if(peer->CancelRequest(request_q.GetHead()) < 0 || -+ peer->RequestCheck() < 0){ -+ peer->CloseConnection(); -+ } -+ return SendRequest(); -+ }else m_standby = 1; // nothing to do at the moment ++ btPeer *peer = WORLD.Who_Can_Abandon(this); // slowest choice ++ if(peer){ ++ // Cancel a request to the slowest peer & request it from this one. ++ if(arg_verbose) fprintf( stderr, "Reassigning %p to %p (#%u)\n", ++ peer, this, peer->request_q.GetRequestIdx() ); ++ // RequestQueue class "moves" rather than "copies" in assignment! ++ if( request_q.Copy(&peer->request_q) < 0 ) return -1; ++ if(peer->CancelPiece() < 0 || peer->RequestCheck() < 0) ++ peer->CloseConnection(); ++ return SendRequest(); ++ }else{ ++ if(arg_verbose) fprintf(stderr, "%p standby\n", this); ++ m_standby = 1; // nothing to do at the moment ++ } + } }else{ - idx = tmpBitField.Random(); - return (request_q.CreateWithIdx(idx) < 0) ? -1 : SendRequest(); + // Request something that we haven't requested yet (most common case). -+ idx = tmpBitField2.Random(); ++ // Try to make it something that has good trade value. ++ BitField tmpBitField3 = tmpBitField2; ++ WORLD.FindValuedPieces(tmpBitField3, this, BTCONTENT.pBF->IsEmpty()); ++ if( tmpBitField3.IsEmpty() ) tmpBitField3 = tmpBitField2; ++ idx = tmpBitField3.Random(); ++ if(arg_verbose) fprintf(stderr, "Assigning #%u to %p\n", idx, this); + return (request_q.CreateWithIdx(idx) < 0) ? -1 : SendRequest(); } -+ } else { ++ }else{ + // We don't need anything from the peer. How'd we get here? + return SetLocal(M_NOT_INTERESTED); } @@ -867,7 +12333,10 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp return 0; } -@@ -152,37 +223,46 @@ + int btPeer::MsgDeliver() + { + size_t r,idx,off,len; ++ int retval = 0; char *msgbuf = stream.in_buffer.BasePointer(); @@ -875,7 +12344,7 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + r = get_nl(msgbuf); + // Don't require keepalives if we're receiving other messages. -+ time(&m_last_timestamp); ++ m_last_timestamp = now; if( 0 == r ){ - time(&m_last_timestamp); if( !m_f_keepalive ) if( stream.Send_Keepalive() < 0 ) return -1; @@ -887,24 +12356,38 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp case M_CHOKE: if(H_BASE_LEN != r){ return -1;} + if(arg_verbose) fprintf(stderr, "%p choked me\n", this); ++ if( m_lastmsg == M_UNCHOKE && m_last_timestamp <= m_choketime+1 ){ ++ m_err_count+=2; ++ if(arg_verbose) fprintf(stderr,"err: %p (%d) Choke oscillation\n", ++ this, m_err_count); ++ } ++ m_choketime = m_last_timestamp; m_state.remote_choked = 1; StopDLTimer(); ++ if( g_next_dn == this ) g_next_dn = (btPeer *)0; if( !request_q.IsEmpty()){ - PSLICE ps = request_q.GetHead(); +- PSLICE ps = request_q.GetHead(); - PENDINGQUEUE.Pending(&request_q); -+ if( !PENDINGQUEUE.Exist(request_q.GetRequestIdx()) ) -+ PENDINGQUEUE.Pending(&request_q); - if( CancelRequest(ps) < 0) return -1; +- if( CancelRequest(ps) < 0) return -1; ++ m_req_out = 0; ++ PENDINGQUEUE.Pending(&request_q); } - return 0; +- return 0; ++ break; + case M_UNCHOKE: if(H_BASE_LEN != r){return -1;} + if(arg_verbose) fprintf(stderr, "%p unchoked me\n", this); ++ if( m_lastmsg == M_CHOKE && m_last_timestamp <= m_choketime+1 ){ ++ m_err_count+=2; ++ if(arg_verbose) fprintf(stderr,"err: %p (%d) Choke oscillation\n", ++ this, m_err_count); ++ } ++ m_choketime = m_last_timestamp; m_state.remote_choked = 0; -+ if(!request_q.IsEmpty()) // shouldn't happen; maybe peer is confused. -+ return SendRequest(); - return RequestCheck(); +- return RequestCheck(); ++ retval = RequestCheck(); ++ break; case M_INTERESTED: if(H_BASE_LEN != r){return -1;} @@ -918,10 +12401,11 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp m_state.remote_interested = 0; StopULTimer(); -@@ -190,10 +270,11 @@ + /* remove peer's reponse queue */ if( !reponse_q.IsEmpty()) reponse_q.Empty(); - return 0; +- return 0; ++ break; + case M_HAVE: if(H_HAVE_LEN != r){return -1;} @@ -931,20 +12415,22 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp if( idx >= BTCONTENT.GetNPieces() || bitfield.IsSet(idx)) return -1; -@@ -201,19 +282,24 @@ +@@ -201,54 +378,90 @@ if( bitfield.IsFull() && BTCONTENT.pBF->IsFull() ){ return -2; } - if( !BTCONTENT.pBF->IsSet(idx) ) m_cached_idx = idx; + if( !BTCONTENT.pBF->IsSet(idx) && !BTCONTENT.pBFilter->IsSet(idx) ){ + m_cached_idx = idx; ++ if(arg_verbose && m_standby) fprintf(stderr, "%p un-standby\n", this); + m_standby = 0; + } + // if( !BTCONTENT.pBF->IsSet(idx) ) m_cached_idx = idx; - return ( !m_state.remote_choked && request_q.IsEmpty() ) ? RequestCheck() : 0; + // see if we're Interested now -+ return request_q.IsEmpty() ? RequestCheck() : 0; ++ if(!m_standby) retval = RequestCheck(); ++ break; case M_REQUEST: if(H_REQUEST_LEN != r || !m_state.remote_interested){ return -1; } @@ -960,24 +12446,49 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + len = get_nl(msgbuf + 13); if( !reponse_q.IsValidRequest(idx, off, len) ) return -1; - -@@ -222,6 +308,8 @@ +- +- return reponse_q.Add(idx, off, len); ++ ++ if( m_state.local_choked ){ ++ if( (m_latency && m_last_timestamp - m_unchoke_timestamp > m_latency) || ++ (!m_latency && m_last_timestamp - m_unchoke_timestamp > 60) ){ ++ m_err_count++; ++ if(arg_verbose) fprintf(stderr,"err: %p (%d) choked request\n", ++ this, m_err_count); ++ if( stream.Send_State(M_CHOKE) < 0 ) return -1; ++ // This will mess with the unchoke rotation (to this peer's ++ // disadvantage), but otherwise we may spam them with choke msgs. ++ m_unchoke_timestamp = m_last_timestamp; ++ } ++ }else retval = reponse_q.Add(idx, off, len); ++ break; + case M_PIECE: ++ m_receive_time = m_last_timestamp; if( request_q.IsEmpty() || !m_state.local_interested){ - m_err_count++; -+ if(arg_verbose) fprintf(stderr,"err: %p (%d) Unwanted piece\n", -+ this, m_err_count); - return 0; - } - return PieceDeliver(r); -@@ -230,22 +318,28 @@ +- m_err_count++; +- return 0; +- } +- return PieceDeliver(r); ++ m_err_count++; ++ if(arg_verbose) fprintf(stderr,"err: %p (%d) Unwanted piece\n", ++ this, m_err_count); ++ }else retval = PieceDeliver(r); ++ break; + + case M_BITFIELD: if( (r - 1) != bitfield.NBytes() || !bitfield.IsEmpty()) return -1; bitfield.SetReferBuffer(msgbuf + 5); - if(bitfield.IsFull() && BTCONTENT.pBF->IsFull()) return -2; +- if(bitfield.IsFull() && BTCONTENT.pBF->IsFull()) return -2; - return 0; ++ if(bitfield.IsFull()){ ++ if(arg_verbose) fprintf(stderr, "%p is a seed\n", this); ++ if(BTCONTENT.pBF->IsFull()) return -2; ++ } + + //This is needed in order to set our Interested state -+ return RequestCheck(); // fixed client stall ++ retval = RequestCheck(); // fixed client stall ++ break; case M_CANCEL: if(r != H_CANCEL_LEN || !m_state.remote_interested) return -1; @@ -989,59 +12500,168 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + off = get_nl(msgbuf + 9); + len = get_nl(msgbuf + 13); if( reponse_q.Remove(idx,off,len) < 0 ){ - m_err_count++; -+ if(arg_verbose) fprintf(stderr, "err: %p (%d) Bad cancel\n", -+ this, m_err_count); - return 0; +- m_err_count++; +- return 0; ++ m_err_count++; ++ if(arg_verbose) fprintf(stderr, "err: %p (%d) Bad cancel\n", ++ this, m_err_count); ++ }else{ ++ if( reponse_q.IsEmpty() ) StopULTimer(); ++ if( reponse_q.IsEmpty() || !CouldReponseSlice() ){ ++ if( g_next_up == this ) g_next_up = (btPeer *)0; ++ } } - if( reponse_q.IsEmpty() ) StopULTimer(); - return 0; +- if( reponse_q.IsEmpty() ) StopULTimer(); +- return 0; ++ break; ++ default: - return -1; // unknow message type +- } + if(arg_verbose) fprintf(stderr, "Unknown message type %u from peer %p\n", + msgbuf[4], this); -+ return 0; // ignore unknown message & continue (forward compatibility) - } ++ } // switch ++ ++ if( retval >= 0 ) m_lastmsg = msgbuf[4]; } - return 0; -@@ -279,8 +373,13 @@ +- return 0; ++ return retval; + } + + int btPeer::ReponseSlice() +@@ -270,6 +483,8 @@ + + Self.DataSended(len); + DataSended(len); ++ if(arg_verbose) fprintf(stderr, "Sending %d/%d/%d to %p\n", ++ (int)idx, (int)off, (int)len, this); + return stream.Send_Piece(idx,off,BTCONTENT.global_piece_buffer,len); + } + +@@ -278,32 +493,153 @@ + int btPeer::SendRequest() { ++ int first = 1; ++ PSLICE ps = request_q.NextSend(); ++ ++ if( m_req_out > cfg_req_queue_length ){ ++ if(arg_verbose) ++ fprintf(stderr, "ERROR@5: %p m_req_out underflow, resetting\n", this); ++ m_req_out = 0; ++ } ++ if( ps && m_req_out < m_req_send ){ ++ if(arg_verbose) ++ fprintf(stderr, "Requesting #%u from %p (%d left, %d slots):", ++ ps->index, this, request_q.Qsize(), m_req_send); ++ for( int i=0; ps && m_req_out < m_req_send && i<5; ps = ps->next, i++ ){ ++ if( first && (!RateDL() || ++ 0 >= (m_req_out+1) * ps->length / (double)RateDL() - m_latency) ){ ++ request_q.SetReqTime(ps, now); ++ first = 0; ++ } else request_q.SetReqTime(ps, (time_t)0); ++ if(arg_verbose) fprintf(stderr, "."); ++ if(stream.Send_Request(ps->index,ps->offset,ps->length) < 0){ return -1; } ++ request_q.SetNextSend(ps->next); ++ m_req_out++; ++ } ++ if(arg_verbose) fprintf(stderr, "\n"); ++ m_receive_time = now; ++ } ++ return ( m_req_out < m_req_send ) ? RequestPiece() : 0; ++} ++ ++int btPeer::CancelPiece() ++{ PSLICE ps = request_q.GetHead(); - for( ; ps ; ps = ps->next ) -+ if(arg_verbose) fprintf(stderr, "Requesting #%u from %p:", -+ request_q.GetRequestIdx(), this); -+ for( ; ps ; ps = ps->next ){ -+ if(arg_verbose) fprintf(stderr, "."); - if(stream.Send_Request(ps->index,ps->offset,ps->length) < 0){ return -1; } +- if(stream.Send_Request(ps->index,ps->offset,ps->length) < 0){ return -1; } ++ size_t idx; ++ int cancel = 1; ++ int retval; ++ ++ idx = ps->index; ++ for( ; ps; ps = ps->next){ ++ if( ps->index != idx ) break; ++ if( ps == request_q.NextSend() ) cancel = 0; ++ if( cancel ){ ++ if(stream.Send_Cancel(ps->index,ps->offset,ps->length) < 0) ++ return -1; ++ m_req_out--; ++ if( m_req_out > cfg_req_queue_length ){ ++ if(arg_verbose) ++ fprintf(stderr, "ERROR@1: %p m_req_out underflow, resetting\n", this); ++ m_req_out = 0; ++ } ++ } ++ request_q.Remove(ps->index, ps->offset, ps->length); + } -+ if(arg_verbose) fprintf(stderr, "\n"); ++ if( !m_req_out && g_next_dn == this ) g_next_dn = (btPeer *)0; - return stream.Flush(); - } -@@ -294,16 +393,56 @@ - return stream.Flush(); +- return stream.Flush(); ++ return 0; } + int btPeer::CancelRequest(PSLICE ps) + { ++ int retval; ++ + for( ; ps; ps = ps->next){ ++ if( ps == request_q.NextSend() ) break; + if(stream.Send_Cancel(ps->index,ps->offset,ps->length) < 0) + return -1; ++ m_req_out--; ++ if( m_req_out > cfg_req_queue_length ){ ++ if(arg_verbose) ++ fprintf(stderr, "ERROR@2: %p m_req_out underflow, resetting\n", this); ++ m_req_out = 0; ++ } + } +- return stream.Flush(); ++ if( !m_req_out && g_next_dn == this ) g_next_dn = (btPeer *)0; ++ ++ return 0; ++} ++ +int btPeer::CancelSliceRequest(size_t idx, size_t off, size_t len) +{ + PSLICE ps; ++ int cancel = 1; ++ int idxfound = 0; ++ int retval; + + for(ps = request_q.GetHead() ; ps; ps = ps->next){ -+ if( idx == ps->index && off == ps->offset && len == ps->length ){ -+ if( request_q.Remove(idx,off,len) < 0 ){ -+ m_err_count++; -+ if(arg_verbose) fprintf(stderr,"err: %p (%d) Bad CS remove\n", -+ this, m_err_count); ++ if( ps == request_q.NextSend() ) cancel = 0; ++ if( idx == ps->index ){ ++ if( off == ps->offset && len == ps->length ){ ++ if( request_q.Remove(idx,off,len) < 0 ){ ++ m_err_count++; ++ if(arg_verbose) fprintf(stderr,"err: %p (%d) Bad CS remove\n", ++ this, m_err_count); ++ } ++ if(cancel){ ++ if(stream.Send_Cancel(idx,off,len) < 0) ++ return -1; ++ m_req_out--; ++ if( m_req_out > cfg_req_queue_length ){ ++ if(arg_verbose) fprintf(stderr, ++ "ERROR@3: %p m_req_out underflow, resetting\n", this); ++ m_req_out = 0; ++ } ++ if( !m_req_out && g_next_dn == this ) g_next_dn = (btPeer *)0; ++ ++ // Don't call RequestCheck() here since that could cause the slice ++ // we're cancelling to be dup'd from another peer. ++ return 0; ++ } ++ break; + } -+ if(stream.Send_Cancel(idx,off,len) < 0) -+ return -1; -+ return stream.Flush(); -+ } ++ idxfound = 1; ++ }else if( idxfound ) break; + } + return 0; -+} -+ + } + int btPeer::ReportComplete(size_t idx) { if( BTCONTENT.APieceComplete(idx) ){ @@ -1077,9 +12697,12 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp return (P_FAILED == m_status) ? -1 : RequestCheck(); } -@@ -312,12 +451,14 @@ +@@ -311,17 +647,37 @@ + { size_t idx,off,len; char *msgbuf = stream.in_buffer.BasePointer(); ++ time_t t; ++ int dup = 0, requested = 1; - idx = ntohl(*(size_t*) (msgbuf + 5)); - off = ntohl(*(size_t*) (msgbuf + 9)); @@ -1087,6 +12710,21 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + off = get_nl(msgbuf + 9); len = mlen - 9; ++ if(arg_verbose) fprintf(stderr, "Receiving piece %d/%d/%d from %p\n", ++ (int)idx, (int)off, (int)len, this); ++ ++ t = request_q.GetReqTime(idx,off,len); ++ ++ PSLICE ps = request_q.GetHead(); ++ if( request_q.NextSend() ) ++ for( ; ps; ps = ps->next){ ++ if( ps == request_q.NextSend() ){ ++ requested = 0; ++ break; ++ } ++ if( idx==ps->index && off==ps->offset && len==ps->length ) break; ++ } ++ if( request_q.Remove(idx,off,len) < 0 ){ m_err_count++; + if(arg_verbose) fprintf(stderr, "err: %p (%d) Bad remove\n", @@ -1094,40 +12732,100 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp return 0; } -@@ -329,13 +470,21 @@ + if(BTCONTENT.WriteSlice((char*)(msgbuf + 13),idx,off,len) < 0){ ++ fprintf(stderr, "warn, WriteSlice failed; is filesystem full?\n"); + return 0; + } + +@@ -329,48 +685,172 @@ Self.DataRecved(len); DataRecved(len); + // Check for & cancel requests for this slice from other peers in initial + // and endgame modes. + if( BTCONTENT.pBF->Count() < 2 || -+ WORLD.Pieces_I_Can_Get() - BTCONTENT.pBF->Count() < WORLD.TotalPeers() ){ ++ WORLD.Pieces_I_Can_Get() - BTCONTENT.pBF->Count() < WORLD.TotalPeers() ) ++ dup = 1; ++ else if( arg_file_to_download ){ ++ BitField afdBitField = *BTCONTENT.pBF; ++ afdBitField.Except(*BTCONTENT.pBFilter); ++ if( BTCONTENT.getFilePieces(arg_file_to_download) - afdBitField.Count() ++ < WORLD.TotalPeers() ) ++ dup = 1; ++ } ++ if( dup ){ + WORLD.CancelSlice(idx, off, len); + PENDINGQUEUE.DeleteSlice(idx, off, len); + } + ++ // Determine how many outstanding requests we should maintain, roughly: ++ // (request turnaround latency) / (time to transmit one slice) ++ if(t){ ++ m_latency = (m_last_timestamp <= t) ? 1 : m_last_timestamp - t; ++ if(arg_verbose) fprintf(stderr, "%p latency is %d sec\n", ++ this, (int)m_latency); ++ m_latency_timestamp = m_last_timestamp; ++ } ++ ++ if( RateDL() > len/20 ){ ++ m_req_send = (int)( m_latency / (len / (double)RateDL()) + 1 ); ++ m_req_send = (m_req_send < 2) ? 2 : m_req_send; ++ ++ // If latency increases, we will see this as a dlrate decrease. ++ if( RateDL() < m_prev_dlrate ) m_req_send++; ++ else if( m_last_timestamp - m_latency_timestamp >= 30 && ++ // Try to force latency measurement every 30 seconds. ++ m_req_out == m_req_send - 1 ){ ++ m_req_send--; ++ m_latency_timestamp = m_last_timestamp; ++ } ++ m_prev_dlrate = RateDL(); ++ }else if (m_req_send < 5) m_req_send = 5; ++ ++ if( requested ) m_req_out--; ++ /* if piece download complete. */ - return request_q.IsEmpty() ? ReportComplete(idx) : 0; +- return request_q.IsEmpty() ? ReportComplete(idx) : 0; ++ return ( request_q.IsEmpty() || !request_q.HasIdx(idx) ) ? ++ ReportComplete(idx) : RequestCheck(); } int btPeer::RequestCheck() { - if( BandWidthLimit() ) return 0; -+ if( BandWidthLimitDown() ) return 0; - +- if( BTCONTENT.pBF->IsFull() ){ - if( bitfield.IsFull() ){ return -1; } -@@ -347,7 +496,8 @@ - if(request_q.IsEmpty() && !m_state.remote_choked){ - if( RequestPiece() < 0 ) return -1; +- if( bitfield.IsFull() ){ return -1; } ++ if( bitfield.IsFull() ){ return -2; } + return SetLocal(M_NOT_INTERESTED); + } + + if( Need_Remote_Data() ){ + if(!m_state.local_interested && SetLocal(M_INTERESTED) < 0) return -1; +- if(request_q.IsEmpty() && !m_state.remote_choked){ +- if( RequestPiece() < 0 ) return -1; ++ if( !m_state.remote_choked ){ ++ if( m_req_out > cfg_req_queue_length ){ ++ if(arg_verbose) ++ fprintf(stderr, "ERROR@4: %p m_req_out underflow, resetting\n", this); ++ m_req_out = 0; ++ } ++ if( request_q.IsEmpty() && RequestPiece() < 0 ) return -1; ++ else if( m_req_out < m_req_send && ++ (m_req_out < 2 || !RateDL() || ++ 1 >= (m_req_out+1) * request_q.GetRequestLen() / ++ (double)RateDL() - m_latency) ++ // above formula is to try to allow delay between sending batches of reqs ++ && SendRequest() < 0 ) return -1; } - } -+ } else ++ }else + if(m_state.local_interested && SetLocal(M_NOT_INTERESTED) < 0) return -1; if(!request_q.IsEmpty()) StartDLTimer(); ++ else StopDLTimer(); return 0; -@@ -355,6 +505,7 @@ + } void btPeer::CloseConnection() { @@ -1135,9 +12833,16 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp if( P_FAILED != m_status ){ m_status = P_FAILED; stream.Close(); -@@ -364,13 +515,76 @@ ++ if( !request_q.IsEmpty() ) ++ PENDINGQUEUE.Pending(&request_q); + } ++ if( g_next_up == this ) g_next_up = (btPeer *)0; ++ if( g_next_dn == this ) g_next_dn = (btPeer *)0; + } + int btPeer::HandShake() { ++ char txtid[PEER_ID_LEN*2+3]; ssize_t r = stream.Feed(); - if( r < 0 ) return -1; + if( r < 0 ){ @@ -1150,10 +12855,9 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + if( memcmp(stream.in_buffer.BasePointer()+20, + BTCONTENT.GetShakeBuffer()+20, (r<28) ? r-20 : 8) != 0 ){ + if(arg_verbose){ -+ if( r>48 ) fprintf( stderr, "\npeer %p gave 0x", this); -+ else fprintf( stderr, "\npeer gave 0x" ); ++ fprintf( stderr, "\npeer %p gave 0x", this); + for(int i=20; i<r && i<27; i++) fprintf(stderr, "%2.2hx", -+ (u_short)(u_char)(stream.in_buffer.BasePointer()[i])); ++ (unsigned short)(unsigned char)(stream.in_buffer.BasePointer()[i])); + fprintf( stderr, " as reserved bytes (partial)\n" ); + } + memcpy(stream.in_buffer.BasePointer()+20, BTCONTENT.GetShakeBuffer()+20, @@ -1165,12 +12869,16 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + if(arg_verbose){ + fprintf(stderr, "\nmine: 0x"); + for(int i=0; i<r && i<48; i++) fprintf(stderr, "%2.2hx", -+ (u_short)(u_char)(BTCONTENT.GetShakeBuffer()[i])); ++ (unsigned short)(unsigned char)(BTCONTENT.GetShakeBuffer()[i])); + fprintf(stderr, "\npeer: 0x"); + for(int i=0; i<r && i<48; i++) fprintf(stderr, "%2.2hx", -+ (u_short)(u_char)(stream.in_buffer.BasePointer()[i])); ++ (unsigned short)(unsigned char)(stream.in_buffer.BasePointer()[i])); + fprintf(stderr, "\n"); -+ fprintf(stderr, "peer is %.8s\n", stream.in_buffer.BasePointer()+48); ++ if( r>48 ){ ++ TextPeerID((unsigned char *)(stream.in_buffer.BasePointer()+48), ++ txtid); ++ fprintf(stderr, "peer is %s\n", txtid); ++ } + } + return -1; + } @@ -1185,135 +12893,346 @@ diff -u ctorrent-1.3.4.orig/peer.cpp ctorrent-1.3.4/peer.cpp + if(arg_verbose){ + fprintf(stderr, "\npeer %p gave 0x", this); + for(int i=20; i<27; i++) fprintf(stderr, "%2.2hx", -+ (u_short)(u_char)(stream.in_buffer.BasePointer()[i])); ++ (unsigned short)(unsigned char)(stream.in_buffer.BasePointer()[i])); + fprintf( stderr, " as reserved bytes\n" ); + } + memcpy(stream.in_buffer.BasePointer()+20, BTCONTENT.GetShakeBuffer()+20, 8); + } -+ if( memcmp(stream.in_buffer.BasePointer(),BTCONTENT.GetShakeBuffer(),48) != 0 ){ ++ if( memcmp(stream.in_buffer.BasePointer(), ++ BTCONTENT.GetShakeBuffer(),48) != 0 ){ + if(arg_verbose){ + fprintf(stderr, "\nmine: 0x"); + for(int i=0; i<48; i++) fprintf(stderr, "%2.2hx", -+ (u_short)(u_char)(BTCONTENT.GetShakeBuffer()[i])); ++ (unsigned short)(unsigned char)(BTCONTENT.GetShakeBuffer()[i])); + fprintf(stderr, "\npeer: 0x"); + for(int i=0; i<48; i++) fprintf(stderr, "%2.2hx", -+ (u_short)(u_char)(stream.in_buffer.BasePointer()[i])); ++ (unsigned short)(unsigned char)(stream.in_buffer.BasePointer()[i])); + fprintf(stderr, "\n"); + } + return -1; + } + ++ memcpy(id, stream.in_buffer.BasePointer()+48, PEER_ID_LEN); + if(arg_verbose){ -+ fprintf(stderr, "Peer %p ID: ", this); -+ for(int i=48; i<60; i++){ -+ if( isprint(stream.in_buffer.BasePointer()[i]) ) -+ fprintf(stderr, "%c", stream.in_buffer.BasePointer()[i]); -+ else break; -+ } -+ fprintf(stderr, "\n"); ++ TextPeerID((unsigned char *)(stream.in_buffer.BasePointer()+48), txtid); ++ fprintf(stderr, "Peer %p ID: %s\n", this, txtid); + } // ignore peer id verify if( !BTCONTENT.pBF->IsEmpty()){ -@@ -395,10 +609,17 @@ +@@ -395,20 +875,63 @@ return stream.Send_Buffer((char*)BTCONTENT.GetShakeBuffer(),68); } -int btPeer::BandWidthLimit() +int btPeer::BandWidthLimitUp() -+{ + { +- if( cfg_max_bandwidth <= 0 ) return 0; +- return ((Self.RateDL() + Self.RateUL()*2) / 1024 >= cfg_max_bandwidth) ? + if( cfg_max_bandwidth_up <= 0 ) return 0; + return ((Self.RateUL()) >= cfg_max_bandwidth_up) ? + 1:0; +} + +int btPeer::BandWidthLimitDown() - { -- if( cfg_max_bandwidth <= 0 ) return 0; -- return ((Self.RateDL() + Self.RateUL()*2) / 1024 >= cfg_max_bandwidth) ? ++{ + if( cfg_max_bandwidth_down <= 0 ) return 0; + return ((Self.RateDL()) >= cfg_max_bandwidth_down) ? 1:0; } -@@ -406,12 +627,23 @@ + int btPeer::NeedWrite() { int yn = 0; ++ ++ if( m_standby && WORLD.Endgame() ){ ++ if(arg_verbose) fprintf(stderr, "%p un-standby (endgame)\n", this); ++ m_standby = 0; ++ } ++ if( stream.out_buffer.Count() || // data need send in buffer. - (!reponse_q.IsEmpty() && CouldReponseSlice() && !BandWidthLimit()) || -+ (!reponse_q.IsEmpty() && CouldReponseSlice() && ! BandWidthLimitUp()) || -+ ( !m_state.remote_choked && request_q.IsEmpty() -+ && m_state.local_interested -+ && !BandWidthLimitDown() && !m_standby ) || // can request a piece. - P_CONNECTING == m_status ) // peer is connecting +- P_CONNECTING == m_status ) // peer is connecting ++ // can upload a slice ++ (!reponse_q.IsEmpty() && CouldReponseSlice() && !BandWidthLimitUp()) || ++ ++ ( (request_q.NextSend() && m_req_out < m_req_send && ++ (m_req_out < 2 || !RateDL() || ++ 1 >= (m_req_out+1) * request_q.GetRequestLen() / ++ (double)RateDL() - m_latency)) // can send queued request ++ || ++ (request_q.IsEmpty() && !m_state.remote_choked ++ && m_state.local_interested && !m_standby) // can request a new piece ++ ) // ok to send requests ++ ++ || P_CONNECTING == m_status ){ // peer is connecting ++ yn = 1; - return yn; - } - ++ ++ if( g_next_up==this && g_defer_up ){ ++ if(arg_verbose) fprintf(stderr, "%p skipped UL\n", this); ++ g_next_up = (btPeer *)0; ++ } ++ } ++ return yn; ++} ++ +int btPeer::NeedRead() +{ + int yn = 1; + if( !request_q.IsEmpty() && BandWidthLimitDown() ) + yn = 0; -+ return yn; -+} ++ else if( g_next_dn==this && g_defer_dn ){ ++ if(arg_verbose) fprintf(stderr, "%p skipped DL\n", this); ++ g_next_dn = (btPeer *)0; ++ } + return yn; + } + +@@ -432,20 +955,35 @@ + ssize_t r; + + if ( 64 < m_err_count ) return -1; +- +- r = stream.Feed(); + +- if( r < 0 && r != -2 ) +- return -1; +- else if ( r == -2 ) +- f_peer_closed = 1; ++ if( request_q.IsEmpty() || !BandWidthLimitDown() ){ ++ if ( request_q.IsEmpty() || !g_next_dn || g_next_dn==this ){ ++ if( g_next_dn ) g_next_dn = (btPeer *)0; + - int btPeer::CouldReponseSlice() - { - if(!m_state.local_choked && -@@ -453,15 +685,15 @@ ++ r = stream.Feed(); ++ ++ if( r < 0 && r != -2 ) ++ return -1; ++ else if ( r == -2 ) ++ f_peer_closed = 1; + +- r = stream.HaveMessage(); +- for( ; r;){ +- if( r < 0 ) return -1; +- if(MsgDeliver() < 0 || stream.PickMessage() < 0) return -1; +- r = stream.HaveMessage(); ++ r = stream.HaveMessage(); ++ for( ; r;){ ++ if( r < 0 ) return -1; ++ if(MsgDeliver() < 0 || stream.PickMessage() < 0) return -1; ++ r = stream.HaveMessage(); ++ } ++ }else{ ++ if(arg_verbose) ++ fprintf(stderr, "%p deferring DL to %p\n", this, g_next_dn); ++ if( !g_defer_dn ) g_defer_dn = 1; ++ } ++ }else if( !g_next_dn ){ ++ if(arg_verbose) fprintf(stderr, "%p waiting for DL bandwidth\n", this); ++ g_next_dn = this; ++ if( g_defer_dn ) g_defer_dn = 0; + } ++ + return f_peer_closed ? -1 : 0; + } + +@@ -453,27 +991,80 @@ { if( stream.out_buffer.Count() && stream.Flush() < 0) return -1; - if(! reponse_q.IsEmpty() && CouldReponseSlice() ) { -+ if( !reponse_q.IsEmpty() && CouldReponseSlice() && !BandWidthLimitUp() ) { - StartULTimer(); - Self.StartULTimer(); - } +- StartULTimer(); +- Self.StartULTimer(); +- } ++ if( !reponse_q.IsEmpty() && CouldReponseSlice() ) { ++ if( !BandWidthLimitUp() ){ ++ if( !g_next_up || g_next_up==this ){ ++ if( g_next_up ) g_next_up = (btPeer *)0; ++ ++ StartULTimer(); ++ Self.StartULTimer(); ++ if( ReponseSlice() < 0 ) return -1; ++ }else{ ++ if(arg_verbose) ++ fprintf(stderr, "%p deferring UL to %p\n", this, g_next_up); ++ if( !g_defer_up ) g_defer_up = 1; ++ } ++ }else if( !g_next_up ){ ++ if(arg_verbose) fprintf(stderr, "%p waiting for UL bandwidth\n", this); ++ g_next_up = this; ++ if( g_defer_up ) g_defer_up = 0; ++ } ++ }else if( g_next_up == this ) g_next_up = (btPeer *)0; - for(; !reponse_q.IsEmpty() && CouldReponseSlice(); ) -+ for(; !reponse_q.IsEmpty() && CouldReponseSlice() && !BandWidthLimitUp(); ) - if( ReponseSlice() < 0) return -1; +- if( ReponseSlice() < 0) return -1; ++ return (!m_state.remote_choked) ? RequestCheck() : 0; ++} -- return 0; -+ return (!m_state.remote_choked && request_q.IsEmpty()) ? RequestCheck() : 0; ++// Prevent a peer object from holding g_next_up when it's not ready to write. ++void btPeer::CheckSendStatus() ++{ ++ if( g_next_up == this && !BandWidthLimitUp() ){ ++ if(arg_verbose) fprintf(stderr, "%p is not write-ready\n", this); ++ g_next_up = (btPeer *)0; ++ } ++} ++ ++/* Detect if a peer ignored, discarded, or lost my request and we're waiting ++ for a piece that may never arrive. */ ++int btPeer::HealthCheck(time_t now) ++{ ++ if( m_health_time <= now - 60 ){ ++ m_health_time = now; ++ if( !m_state.remote_choked && m_req_out && ++ m_receive_time < now - (!m_latency ? 300 : ++ ((m_latency < 30) ? 60 : 2*m_latency)) ){ ++ // if a repeat occurrence, get rid of the peer ++ if( m_bad_health ) return -1; ++ m_bad_health = 1; ++ if(arg_verbose) ++ fprintf(stderr, "%p unresponsive; resetting request queue\n", this); ++ PSLICE ps = request_q.GetHead(); ++ int retval = CancelRequest(ps); ++ PENDINGQUEUE.Pending(&request_q); ++ return (retval < 0) ? -1 : RequestCheck(); ++ } else m_bad_health = 0; ++ } + return 0; } ++// This handles peers that suppress HAVE messages so that we don't always think ++// that they're empty. If we've sent the peer an amount of data equivalent to ++// two pieces, assume that they now have at least one complete piece. ++int btPeer::IsEmpty() const ++{ ++ return ( bitfield.IsEmpty() && TotalUL() < BTCONTENT.GetPieceLength()*2 ) ? ++ 1:0; ++} ++ void btPeer::dump() -diff -u ctorrent-1.3.4.orig/peer.h ctorrent-1.3.4/peer.h ---- ctorrent-1.3.4.orig/peer.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/peer.h 2005-08-11 23:45:29.432693224 +0200 -@@ -34,6 +34,9 @@ + { + struct sockaddr_in sin; + + GetAddress(&sin); + printf("%s: %d -> %d:%d %lud:%lud\n", inet_ntoa(sin.sin_addr), +- bitfield.Count(), +- Is_Remote_UnChoked() ? 1 : 0, +- request_q.IsEmpty() ? 0 : 1, +- (unsigned long)TotalDL(), +- (unsigned long)TotalUL()); ++ bitfield.Count(), ++ Is_Remote_UnChoked() ? 1 : 0, ++ request_q.IsEmpty() ? 0 : 1, ++ (unsigned long)TotalDL(), ++ (unsigned long)TotalUL()); + } + +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/peer.h ctorrent-1.3.4/peer.h +--- ctorrent-1.3.4.sav/peer.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/peer.h 2006-06-28 19:30:02.000000000 +0200 +@@ -19,6 +19,7 @@ + #include "btstream.h" + #include "bitfield.h" + #include "rate.h" ++#include "btconfig.h" + + #define P_CONNECTING (unsigned char) 0 // connecting + #define P_HANDSHAKE (unsigned char) 1 // handshaking +@@ -34,14 +35,24 @@ unsigned char reserved:4; /* unused */ }BTSTATUS; +size_t get_nl(char *from); +void set_nl(char *to, size_t from); + ++int TextPeerID(unsigned char *peerid, char *txtid); ++ class btBasic { private: -@@ -84,6 +87,7 @@ + Rate rate_dl; + Rate rate_ul; ++ size_t m_current_dl, m_current_ul; ++ unsigned char m_use_current:1; ++ unsigned char m_reserved:7; + public: + struct sockaddr_in m_sin; + ++ btBasic() { m_use_current = 0; } ++ + //IP地址相关函数 + int IpEquiv(struct sockaddr_in addr); + void SetIp(struct sockaddr_in addr); +@@ -60,8 +71,10 @@ + void DataRecved(size_t nby) { rate_dl.CountAdd(nby); } + void DataSended(size_t nby) { rate_ul.CountAdd(nby); } + +- size_t RateDL() const { return rate_dl.RateMeasure(); } +- size_t RateUL() const { return rate_ul.RateMeasure();} ++ size_t RateDL() const { return m_use_current ? m_current_dl : rate_dl.RateMeasure(); } ++ size_t RateUL() const { return m_use_current ? m_current_ul : rate_ul.RateMeasure(); } ++ void SetCurrentRates(); ++ void ClearCurrentRates() { m_use_current = 0; } + + void StartDLTimer() { rate_dl.StartTimer(); } + void StartULTimer() { rate_ul.StartTimer(); } +@@ -78,17 +91,28 @@ + + unsigned char m_f_keepalive:1; + unsigned char m_status:4; +- unsigned char m_reserved:3; ++ unsigned char m_bad_health:1; ++ unsigned char m_standby:1; ++ unsigned char m_reserved:1; + + BTSTATUS m_state; size_t m_cached_idx; size_t m_err_count; -+ int m_standby; ++ size_t m_req_send; // target number of outstanding requests ++ size_t m_req_out; // actual number of outstanding requests ++ size_t m_latency; ++ size_t m_prev_dlrate; ++ time_t m_latency_timestamp; ++ time_t m_health_time, m_receive_time; ++ char m_lastmsg; ++ time_t m_choketime; int PieceDeliver(size_t mlen); int ReportComplete(size_t idx); -@@ -96,6 +100,8 @@ + int RequestCheck(); + int SendRequest(); ++ int CancelPiece(); + int CancelRequest(PSLICE ps); + int ReponseSlice(); + int RequestPiece(); +@@ -96,7 +120,10 @@ int CouldReponseSlice(); int BandWidthLimit(); + int BandWidthLimitUp(); + int BandWidthLimitDown(); public: ++ unsigned char id[PEER_ID_LEN]; BitField bitfield; btStream stream; -@@ -118,10 +124,12 @@ + RequestQueue request_q; +@@ -106,6 +133,8 @@ + + int RecvModule(); + int SendModule(); ++ int HealthCheck(time_t now); ++ void CheckSendStatus(); + + time_t SetLastTimestamp() { return time(&m_last_timestamp); } + time_t GetLastTimestamp() const { return m_last_timestamp; } +@@ -118,10 +147,14 @@ int Is_Local_UnChoked() const { return m_state.local_choked ? 0 : 1; } int SetLocal(unsigned char s); ++ int IsEmpty() const; ++ + int CancelSliceRequest(size_t idx, size_t off, size_t len); void SetStatus(unsigned char s){ m_status = s; } @@ -1323,10 +13242,25 @@ diff -u ctorrent-1.3.4.orig/peer.h ctorrent-1.3.4/peer.h void CloseConnection(); -diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp ---- ctorrent-1.3.4.orig/peerlist.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/peerlist.cpp 2005-08-11 23:45:29.433693072 +0200 -@@ -21,6 +21,8 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/peerlist.cpp ctorrent-1.3.4/peerlist.cpp +--- ctorrent-1.3.4.sav/peerlist.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/peerlist.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -5,6 +5,7 @@ + #include <stdlib.h> + + #include <stdio.h> ++#include <errno.h> + + #include <string.h> + +@@ -16,11 +17,15 @@ + + #include "iplist.h" + #include "tracker.h" ++#include "ctcs.h" ++#include "bttime.h" + + #define MAX_UNCHOKE 3 #define UNCHOKE_INTERVAL 10 @@ -1335,7 +13269,7 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp #define KEEPALIVE_INTERVAL 117 #define LISTEN_PORT_MAX 2706 -@@ -36,12 +38,13 @@ +@@ -36,12 +41,13 @@ PeerList::PeerList() { @@ -1352,7 +13286,33 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp m_live_idx = 0; } -@@ -118,6 +121,8 @@ +@@ -61,25 +67,6 @@ + return m_peers_count ? 0 : 1; + } + +-void PeerList::Sort() +-{ +- PEERNODE *newhead = (PEERNODE*) 0; +- PEERNODE *p, *pp, *spn; +- +- if( m_peers_count < 10 ) return; +- +- for(; m_head;){ +- pp = (PEERNODE*) 0; +- for(p = newhead; p && m_head->click < p->click; pp = p, p = p->next) ; +- +- spn = m_head->next; +- m_head->next = p; +- if( pp ) pp->next = m_head; else newhead = m_head; +- m_head = spn; +- } +- m_head = newhead; +-} +- + void PeerList::CloseAll() + { + PEERNODE *p; +@@ -118,6 +105,8 @@ if( setfd_nonblock(sk) < 0) goto err; @@ -1361,60 +13321,100 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp if( -1 == (r = connect_nonb(sk,(struct sockaddr*)&addr)) ) return -1; peer = new btPeer; -@@ -182,19 +187,44 @@ - if(NewPeer(addr,INVALID_SOCKET) == -4) break; - } +@@ -154,7 +143,6 @@ + m_peers_count++; + p->peer = peer; +- p->click = 0; + + p->next = m_head; + m_head = p; +@@ -177,28 +165,65 @@ + struct sockaddr_in addr; + btPeer * UNCHOKER[MAX_UNCHOKE + 1]; + +- for( ;NEED_MORE_PEERS() && !IPQUEUE.IsEmpty(); ){ +- if(IPQUEUE.Pop(&addr) < 0) break; +- if(NewPeer(addr,INVALID_SOCKET) == -4) break; +- } ++ if( !Tracker.IsPaused() && !Tracker.IsQuitting() ) ++ for( ;NEED_MORE_PEERS() && !IPQUEUE.IsEmpty(); ){ ++ if(IPQUEUE.Pop(&addr) < 0) break; ++ if(NewPeer(addr,INVALID_SOCKET) == -4) break; ++ } + ++ Self.SetCurrentRates(); + // show status line. if( m_pre_dlrate.TimeUsed(pnow) ){ - printf("\r "); - printf("\r%c %u,[%u/%u/%u],%u,%u | %u,%u E:%u", +- LIVE_CHAR[m_live_idx], +- m_peers_count, +- BTCONTENT.pBF->Count(), +- BTCONTENT.pBF->NBits(), +- Pieces_I_Can_Get(), +- Self.RateDL(), Self.RateUL(), +- m_pre_dlrate.RateMeasure(Self.GetDLRate()), +- m_pre_ulrate.RateMeasure(Self.GetULRate()), +- Tracker.GetRefuseClick()); + char partial[30] = ""; + if(arg_file_to_download){ + BitField tmpBitField = *BTCONTENT.pBF; + tmpBitField.Except(*BTCONTENT.pBFilter); + sprintf( partial, "P:%u/%u ", -+ tmpBitField.Count(), -+ BTCONTENT.getFilePieces(arg_file_to_download) ); ++ tmpBitField.Count(), ++ BTCONTENT.getFilePieces(arg_file_to_download) ); + } + printf("\r "); + printf("\r%c %u/%u/%u [%u/%u/%u] %lluMB,%lluMB | %u,%uK/s | %u,%uK E:%u,%u %s%s ", - LIVE_CHAR[m_live_idx], -- m_peers_count, ++ LIVE_CHAR[m_live_idx], + -+ m_seeds_count, -+ m_peers_count - m_seeds_count, -+ Tracker.GetPeersCount(), ++ m_seeds_count, ++ m_peers_count - m_seeds_count, ++ Tracker.GetPeersCount(), + - BTCONTENT.pBF->Count(), - BTCONTENT.pBF->NBits(), - Pieces_I_Can_Get(), -- Self.RateDL(), Self.RateUL(), -- m_pre_dlrate.RateMeasure(Self.GetDLRate()), -- m_pre_ulrate.RateMeasure(Self.GetULRate()), -- Tracker.GetRefuseClick()); ++ BTCONTENT.pBF->Count(), ++ BTCONTENT.pBF->NBits(), ++ Pieces_I_Can_Get(), + -+ Self.TotalDL() >> 20, Self.TotalUL() >> 20, ++ Self.TotalDL() >> 20, Self.TotalUL() >> 20, + -+ Self.RateDL() >> 10, Self.RateUL() >> 10, ++ Self.RateDL() >> 10, Self.RateUL() >> 10, + -+ m_pre_dlrate.RateMeasure(Self.GetDLRate()) >> 10, -+ m_pre_ulrate.RateMeasure(Self.GetULRate()) >> 10, ++ m_pre_dlrate.RateMeasure(Self.GetDLRate()) >> 10, ++ m_pre_ulrate.RateMeasure(Self.GetULRate()) >> 10, + -+ Tracker.GetRefuseClick(), -+ Tracker.GetOkClick(), ++ Tracker.GetRefuseClick(), ++ Tracker.GetOkClick(), + -+ partial, ++ partial, + -+ (Tracker.GetStatus()==1) ? "Connecting" : -+ ((Tracker.GetStatus()==2) ? "Connected" : "") ++ (Tracker.GetStatus()==T_CONNECTING) ? "Connecting" : ++ ( (Tracker.GetStatus()==T_READY) ? "Connected" : ++ (Tracker.IsPaused() ? ++ ((Tracker.GetStatus()==T_FINISHED) ? "Paused" : "Pausing") : ++ (Tracker.IsQuitting() ? "Quitting" : "")) ) + ); fflush(stdout); m_pre_dlrate = Self.GetDLRate(); m_pre_ulrate = Self.GetULRate(); -@@ -214,8 +244,12 @@ - Sort(); + m_live_idx++; ++ ++ if(arg_ctcs) CTCS.Report_Status( ++ m_seeds_count, m_peers_count - m_seeds_count, ++ BTCONTENT.pBF->Count(), BTCONTENT.pBF->NBits(), Pieces_I_Can_Get(), ++ Self.RateDL(), Self.RateUL(), ++ Self.TotalDL(), Self.TotalUL(), ++ cfg_max_bandwidth_down, cfg_max_bandwidth_up); + } + + if(KEEPALIVE_INTERVAL <= (*pnow - m_keepalive_check_timestamp)){ +@@ -211,11 +236,14 @@ + m_unchoke_check_timestamp = *pnow; + f_unchoke_check = 1; + +- Sort(); } - if( f_unchoke_check ) memset(UNCHOKER, 0, (MAX_UNCHOKE + 1) * sizeof(btPeer*)); @@ -1427,46 +13427,61 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp for(p = m_head; p;){ if( PEER_IS_FAILED(p->peer)){ if( pp ) pp->next = p->next; else m_head = p->next; -@@ -225,9 +259,11 @@ +@@ -225,38 +253,38 @@ if( pp ) p = pp->next; else p = m_head; continue; }else{ + if (p->peer->bitfield.IsFull()) m_seeds_count++; if( f_keepalive_check ){ - if(3 * KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp())){ -+ if(arg_verbose) fprintf(stderr, "close: keepalive expired\n"); - p->peer->CloseConnection(); - goto skip_continue; - } -@@ -235,28 +271,26 @@ - if(PEER_IS_SUCCESS(p->peer) && - KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp()) && - p->peer->AreYouOK() < 0){ -+ if(arg_verbose) fprintf(stderr, "close: keepalive death\n"); - p->peer->CloseConnection(); - goto skip_continue; - } - } - +- if(3 * KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp())){ +- p->peer->CloseConnection(); +- goto skip_continue; +- } +- +- if(PEER_IS_SUCCESS(p->peer) && +- KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp()) && +- p->peer->AreYouOK() < 0){ +- p->peer->CloseConnection(); +- goto skip_continue; +- } +- } +- - if( f_unchoke_check ){ - - if(PEER_IS_SUCCESS(p->peer) && p->peer->Need_Local_Data()){ -+ if( f_unchoke_check && PEER_IS_SUCCESS(p->peer) ){ - +- - if((time_t) 0 == p->peer->GetLastUnchokeTime()){ - if(p->peer->SetLocal(M_UNCHOKE) < 0){ - p->peer->CloseConnection(); - goto skip_continue; - } - }else -+ if( p->peer->Is_Remote_Interested() && p->peer->Need_Local_Data() ) - UnChokeCheck(p->peer, UNCHOKER); +- UnChokeCheck(p->peer, UNCHOKER); - } -+ else if(p->peer->SetLocal(M_CHOKE) < 0){ -+ if(arg_verbose) fprintf(stderr, "close: Can't choke peer\n"); -+ p->peer->CloseConnection(); -+ goto skip_continue; ++ if(3 * KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp())){ ++ if(arg_verbose) fprintf(stderr, "close: keepalive expired\n"); ++ p->peer->CloseConnection(); ++ goto skip_continue; ++ } ++ ++ if(PEER_IS_SUCCESS(p->peer) && ++ KEEPALIVE_INTERVAL <= (*pnow - p->peer->GetLastTimestamp()) && ++ p->peer->AreYouOK() < 0){ ++ if(arg_verbose) fprintf(stderr, "close: keepalive death\n"); ++ p->peer->CloseConnection(); ++ goto skip_continue; ++ } ++ } ++ ++ if( f_unchoke_check && PEER_IS_SUCCESS(p->peer) ){ ++ ++ if( p->peer->Is_Remote_Interested() && p->peer->Need_Local_Data() ) ++ UnChokeCheck(p->peer, UNCHOKER); ++ else if(p->peer->SetLocal(M_CHOKE) < 0){ ++ if(arg_verbose) fprintf(stderr, "close: Can't choke peer\n"); ++ p->peer->CloseConnection(); ++ goto skip_continue; + } } @@ -1477,11 +13492,10 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp if( p->peer->NeedWrite() ) FD_SET(sk,wfdp); skip_continue: -@@ -272,13 +306,26 @@ +@@ -272,25 +300,40 @@ } if( f_unchoke_check ){ -+// if (!m_opt_timestamp) m_opt_timestamp = *pnow; + if(arg_verbose) fprintf(stderr, "\nUnchoker "); + if (!m_opt_timestamp){ + if(arg_verbose) fprintf(stderr, "(opt) "); @@ -1500,59 +13514,158 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp + if( UNCHOKER[i]->bitfield.IsEmpty() ) fprintf(stderr, "(empty) "); + } if( UNCHOKER[i]->SetLocal(M_UNCHOKE) < 0){ +- UNCHOKER[i]->CloseConnection(); +- continue; + if(arg_verbose) fprintf(stderr, "close: Can't unchoke peer\n"); - UNCHOKER[i]->CloseConnection(); - continue; ++ UNCHOKER[i]->CloseConnection(); ++ continue; } -@@ -290,6 +337,7 @@ - if( maxfd < sk) maxfd = sk; + + sk = UNCHOKER[i]->stream.GetSocket(); + + if(!FD_ISSET(sk,wfdp) && UNCHOKER[i]->NeedWrite()){ +- FD_SET(sk,wfdp); +- if( maxfd < sk) maxfd = sk; ++ FD_SET(sk,wfdp); ++ if( maxfd < sk) maxfd = sk; } } // end for + if(arg_verbose) fprintf(stderr, "\n"); } ++ ++ Self.ClearCurrentRates(); return maxfd; -@@ -314,6 +362,64 @@ + } +@@ -305,15 +348,148 @@ + + if(proposer->bitfield.IsSet(p->peer->request_q.GetRequestIdx())){ + if(!peer){ +- if( p->peer->RateDL() < proposer->RateDL() ) peer = p->peer; ++ if( p->peer->RateDL() < proposer->RateDL() ) peer = p->peer; + }else{ +- if( p->peer->RateDL() < peer->RateDL() ) peer = p->peer; ++ if( p->peer->RateDL() < peer->RateDL() ) peer = p->peer; + } + } + }//end for return peer; } -+// Duplicating a request queue that's in progress rather than creating a new -+// one helps avoid requesting slices that we already have. +// This takes an index parameter to facilitate modification of the function to +// allow targeting of a specific piece. It's currently only used as a flag to +// specify endgame or initial-piece mode though. -+btPeer* PeerList::Who_Can_Duplicate(btPeer *proposer, size_t idx) ++size_t PeerList::What_Can_Duplicate(BitField &bf, btPeer *proposer, size_t idx) +{ + PEERNODE *p; + btPeer *peer = (btPeer*) 0; + int endgame; -+ size_t qsize, mark, bench; -+ // In endgame mode, select from peers with the longest request queue. -+ // In initial mode, select from peers with the shortest non-empty request -+ // queue. ++ PSLICE ps; ++ size_t piece, piece1, qsize, mark, bench; ++ unsigned long rndbits; ++ int r=0; + + endgame = idx < BTCONTENT.GetNPieces(); // else initial-piece mode + if(endgame) mark = 0; + else mark = cfg_req_queue_length; + bench = BTCONTENT.GetNPieces(); + ++ // In initial mode, only dup a piece with trade value. ++ // In endgame mode, dup any if there are no pieces with trade value. ++ FindValuedPieces(bf, proposer, !endgame); ++ if( bf.IsEmpty() ){ ++ if(endgame) bf = proposer->bitfield; ++ else return BTCONTENT.GetNPieces(); ++ } ++ ++ /* In endgame mode, select from peers with the longest request queue. ++ In initial mode, select from peers with the shortest non-empty request ++ queue. */ + for(p = m_head; p; p = p->next){ -+ if(!PEER_IS_SUCCESS(p->peer) || p->peer == proposer || -+ p->peer->request_q.IsEmpty() ) continue; ++ if( !PEER_IS_SUCCESS(p->peer) || p->peer == proposer ) continue; ++ ++ if( p->peer->request_q.IsEmpty() ) continue; + -+ if(proposer->bitfield.IsSet(p->peer->request_q.GetRequestIdx())){ -+ qsize = p->peer->request_q.Qsize(); -+ if( (endgame && qsize > mark) || (!endgame && qsize && qsize < mark) ){ ++ piece = BTCONTENT.GetNPieces(); ++ ps = p->peer->request_q.GetHead(); ++ for( ; ps; ps = ps->next){ ++ if( piece == ps->index || bench == ps->index || piece1 == ps->index || ++ !bf.IsSet(ps->index) || proposer->request_q.HasIdx(ps->index) ) ++ continue; ++ piece = ps->index; ++ ++ qsize = p->peer->request_q.Qlen(piece); ++ if( (endgame && qsize > mark) || ++ (!endgame && (qsize < mark || !peer)) ){ + mark = qsize; + peer = p->peer; ++ piece1 = piece; + }else if( qsize == mark ){ -+ if( bench != p->peer->request_q.GetRequestIdx() && random()&01 ){ -+ bench = peer->request_q.GetRequestIdx(); ++ if( !r-- ){ ++ rndbits = random(); ++ r = 30; ++ } ++ if( bench != piece && (rndbits>>=1)&01 ){ ++ bench = piece1; + peer = p->peer; ++ piece1 = piece; + } + } + } + } ++ return peer ? piece1 : BTCONTENT.GetNPieces(); ++} ++ ++void PeerList::FindValuedPieces(BitField &bf, btPeer *proposer, int initial) ++{ ++ PEERNODE *p; ++ BitField bf_all_have = bf, bf_int_have = bf, ++ bf_others_have, bf_only_he_has = bf, bf_prefer; ++ ++ for(p = m_head; p; p = p->next){ ++ if( !PEER_IS_SUCCESS(p->peer) || p->peer == proposer ) continue; ++ if( p->peer->Need_Remote_Data() ) ++ bf_int_have.And(p->peer->bitfield); ++ bf_all_have.And(p->peer->bitfield); ++ if( !initial && !p->peer->bitfield.IsFull() ) ++ bf_only_he_has.Except(p->peer->bitfield); ++ else bf_others_have.Comb(p->peer->bitfield); ++ } ++ /* bf_all_have is now pertinent pieces that all peers have ++ bf_int_have is pertinent pieces that all peers in which I'm interested have ++ We prefer to get pieces that those peers need, if we can. Otherwise go ++ for pieces that any peer needs in hopes of future reciprocation. */ ++ if( !bf_int_have.IsFull() ) ++ bf_all_have = bf_int_have; ++ bf_all_have.Invert(); ++ bf.And(bf_all_have); // bf is now pertinent pieces that not everyone has ++ ++ bf_prefer = initial ? bf_others_have : bf_only_he_has; ++ ++ BitField tmpBitField = bf; ++ tmpBitField.And(bf_prefer); ++ /* If initial mode, tmpBitField is now pertinent pieces that more than one ++ peer has, but not everyone. ++ Otherwise, it's pertinent pieces that only the proposer has (not ++ considering what other seeders have). ++ In either case if there are no such pieces, revert to the simple answer.*/ ++ if( !tmpBitField.IsEmpty() ) bf = tmpBitField; ++} ++ ++/* Find a peer with the given piece in its request queue. ++ Duplicating a request queue that's in progress rather than creating a new ++ one helps avoid requesting slices that we already have. */ ++btPeer *PeerList::WhoHas(size_t idx) ++{ ++ PEERNODE *p; ++ btPeer *peer = (btPeer*) 0; ++ ++ for( p = m_head; p; p = p->next){ ++ if( p->peer->request_q.HasIdx(idx) ){ ++ peer = p->peer; ++ break; ++ } ++ } + return peer; +} + @@ -1565,11 +13678,9 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp + + if( !PEER_IS_SUCCESS(p->peer) ) continue; + -+ if( idx == p->peer->request_q.GetRequestIdx() ) { -+ if (p->peer->CancelSliceRequest(idx,off,len) < 0) { -+ if(arg_verbose) fprintf(stderr, "close: CancelSlice\n"); -+ p->peer->CloseConnection(); -+ } ++ if (p->peer->CancelSliceRequest(idx,off,len) < 0) { ++ if(arg_verbose) fprintf(stderr, "close: CancelSlice\n"); ++ p->peer->CloseConnection(); + } + } +} @@ -1577,12 +13688,19 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp void PeerList::Tell_World_I_Have(size_t idx) { PEERNODE *p; -@@ -330,7 +436,12 @@ +@@ -325,12 +501,18 @@ + + if( !PEER_IS_SUCCESS(p->peer) ) continue; + +- if( p->peer->stream.Send_Have(idx) < 0) ++ // Don't send HAVE to seeders, except for our first piece. ++ if( (!p->peer->bitfield.IsFull() || 1==BTCONTENT.pBF->Count()) && ++ p->peer->stream.Send_Have(idx) < 0) + p->peer->CloseConnection(); if( f_seed ){ if( !p->peer->request_q.IsEmpty() ) p->peer->request_q.Empty(); - if(p->peer->SetLocal(M_NOT_INTERESTED) < 0) p->peer->CloseConnection(); -+// if(p->peer->SetLocal(M_NOT_INTERESTED) < 0) p->peer->CloseConnection(); + if(p->peer->SetLocal(M_NOT_INTERESTED) < 0) { + if(arg_verbose) + fprintf(stderr, "close: Can't set self not interested (T_W_I_H)\n"); @@ -1591,68 +13709,215 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp } } // end for -@@ -474,15 +585,20 @@ - FD_CLR(sk,wfdp); - - if(FD_ISSET(sk,rfdp)){ // connect failed. -+ (*nready)--; - FD_CLR(sk,rfdp); - peer->CloseConnection(); - }else{ - if(peer->Send_ShakeInfo() < 0){ -+ if(arg_verbose) fprintf(stderr, "close: Sending handshake\n"); - peer->CloseConnection(); - } - else - peer->SetStatus(P_HANDSHAKE); - } +@@ -350,6 +532,11 @@ + CLOSE_SOCKET(newsk); + return -1; + } ++ ++ if( Tracker.IsPaused() || Tracker.IsQuitting() ){ ++ CLOSE_SOCKET(newsk); ++ return -1; ++ } + + return NewPeer(addr,newsk); + } +@@ -359,18 +546,23 @@ + int r = 0; + struct sockaddr_in lis_addr; + memset(&lis_addr,0, sizeof(sockaddr_in)); ++ lis_addr.sin_family = AF_INET; + lis_addr.sin_addr.s_addr = INADDR_ANY; + + m_listen_sock = socket(AF_INET,SOCK_STREAM,0); + + if( INVALID_SOCKET == m_listen_sock ) return -1; + ++ if ( cfg_listen_ip != 0 ) ++ lis_addr.sin_addr.s_addr = cfg_listen_ip; ++ + if(cfg_listen_port && cfg_listen_port != LISTEN_PORT_MAX){ + lis_addr.sin_port = htons(cfg_listen_port); + if(bind(m_listen_sock,(struct sockaddr*)&lis_addr,sizeof(struct sockaddr_in)) == 0) + r = 1; + else +- fprintf(stderr,"warn,couldn't bind on specified port: %d\n",cfg_listen_port); ++ fprintf(stderr,"warn,couldn't bind on specified port %d: %s\n", ++ cfg_listen_port,strerror(errno)); + } + + if( !r ){ +@@ -380,20 +572,21 @@ + lis_addr.sin_port = htons(cfg_listen_port); + r = bind(m_listen_sock,(struct sockaddr*)&lis_addr,sizeof(struct sockaddr_in)); + if(r != 0){ +- cfg_listen_port--; +- if(cfg_listen_port < cfg_min_listen_port){ +- CLOSE_SOCKET(m_listen_sock); +- fprintf(stderr,"error,couldn't bind port from %d to %d.\n", +- cfg_min_listen_port,cfg_max_listen_port); +- return -1; +- } ++ cfg_listen_port--; ++ if(cfg_listen_port < cfg_min_listen_port){ ++ CLOSE_SOCKET(m_listen_sock); ++ fprintf(stderr,"error,couldn't bind port from %d to %d: %s\n", ++ cfg_min_listen_port,cfg_max_listen_port,strerror(errno)); ++ return -1; ++ } + } + } /* end for(; r != 0;) */ + } + + if(listen(m_listen_sock,5) == -1){ + CLOSE_SOCKET(m_listen_sock); +- fprintf(stderr,"error, couldn't listen on port %d.\n",cfg_listen_port); ++ fprintf(stderr,"error, couldn't listen on port %d: %s\n", ++ cfg_listen_port,strerror(errno)); + return -1; + } + +@@ -402,6 +595,9 @@ + fprintf(stderr,"error, couldn't set socket to nonblock mode.\n"); + return -1; + } ++ ++ printf("Listening on %s:%d\n", inet_ntoa(lis_addr.sin_addr), ++ ntohs(lis_addr.sin_port)); + + return 0; + } +@@ -425,7 +621,7 @@ + PEERNODE *p; + for(p = m_head; p; p = p->next){ + if( !PEER_IS_SUCCESS(p->peer) || p->peer->request_q.IsEmpty()) continue; +- if( idx == p->peer->request_q.GetRequestIdx() ) return 1; ++ if( p->peer->request_q.HasIdx(idx) ) return 1; + } + return 0; + } +@@ -433,9 +629,18 @@ + void PeerList::CheckBitField(BitField &bf) + { + PEERNODE *p; ++ PSLICE ps; ++ size_t idx; + for(p = m_head; p ; p = p->next){ + if( !PEER_IS_SUCCESS(p->peer) || p->peer->request_q.IsEmpty()) continue; +- bf.UnSet(p->peer->request_q.GetRequestIdx()); ++ ps = p->peer->request_q.GetHead(); ++ idx = BTCONTENT.GetNPieces(); ++ for( ; ps; ps = ps->next){ ++ if( ps->index != idx ){ ++ bf.UnSet(ps->index); ++ idx = ps->index; ++ } ++ } + } + } + +@@ -445,8 +650,8 @@ + struct sockaddr_in sin; + printf("\nPEER LIST\n"); + for( ; p ; p = p->next){ +- if(PEER_IS_FAILED(p->peer)) continue; +- p->peer->dump(); ++ if(PEER_IS_FAILED(p->peer)) continue; ++ p->peer->dump(); + } + } + +@@ -470,42 +675,55 @@ + + if( P_CONNECTING == peer->GetStatus()){ + if(FD_ISSET(sk,wfdp)){ +- (*nready)--; +- FD_CLR(sk,wfdp); ++ (*nready)--; ++ FD_CLR(sk,wfdp); + +- if(FD_ISSET(sk,rfdp)){ // connect failed. +- FD_CLR(sk,rfdp); +- peer->CloseConnection(); +- }else{ +- if(peer->Send_ShakeInfo() < 0){ +- peer->CloseConnection(); +- } +- else +- peer->SetStatus(P_HANDSHAKE); +- } ++ if(FD_ISSET(sk,rfdp)){ // connect failed. ++ (*nready)--; ++ FD_CLR(sk,rfdp); ++ peer->CloseConnection(); ++ }else{ ++ if(peer->Send_ShakeInfo() < 0){ ++ if(arg_verbose) fprintf(stderr, "close: Sending handshake\n"); ++ peer->CloseConnection(); ++ } ++ else ++ peer->SetStatus(P_HANDSHAKE); ++ } + }else if(FD_ISSET(sk,rfdp)){ -+ (*nready)--; -+ peer->CloseConnection(); ++ (*nready)--; ++ peer->CloseConnection(); } }else{ if(FD_ISSET(sk,rfdp)){ -@@ -493,18 +609,29 @@ - (*nready)--; - FD_CLR(sk,rfdp); - if(peer->GetStatus() == P_HANDSHAKE){ +- p->click++; +- if( !(p->click) ) +- for(p2 = m_head; p2; p2=p2->next) p2->click = 0; +- +- (*nready)--; +- FD_CLR(sk,rfdp); +- if(peer->GetStatus() == P_HANDSHAKE){ - if( peer->HandShake() < 0 ) peer->CloseConnection(); - }else{ - if( peer->RecvModule() < 0 ) peer->CloseConnection(); -+ if( peer->HandShake() < 0 ) { -+ if(arg_verbose) fprintf(stderr, "close: bad handshake\n"); -+ peer->CloseConnection(); -+ } -+ } // fixed client stall -+ if(peer->GetStatus() == P_SUCCESS){ -+ if( peer->RecvModule() < 0 ) { -+ if(arg_verbose) fprintf(stderr, "close: receive\n"); -+ peer->CloseConnection(); -+ } - } +- } - }else if(PEER_IS_SUCCESS(peer) && FD_ISSET(sk,wfdp)){ -+ } -+ if(PEER_IS_SUCCESS(peer) && FD_ISSET(sk,wfdp)){ - p->click++; - if( !(p->click) ) - for(p2 = m_head; p2; p2=p2->next) p2->click = 0; - - (*nready)--; - FD_CLR(sk,wfdp); +- p->click++; +- if( !(p->click) ) +- for(p2 = m_head; p2; p2=p2->next) p2->click = 0; +- +- (*nready)--; +- FD_CLR(sk,wfdp); - if( peer->SendModule() < 0 ) peer->CloseConnection(); -+ if( peer->SendModule() < 0 ) { -+ if(arg_verbose) fprintf(stderr, "close: send\n"); -+ peer->CloseConnection(); -+ } ++ (*nready)--; ++ FD_CLR(sk,rfdp); ++ if(peer->GetStatus() == P_HANDSHAKE){ ++ if( peer->HandShake() < 0 ) { ++ if(arg_verbose) fprintf(stderr, "close: bad handshake\n"); ++ peer->CloseConnection(); ++ } ++ } // fixed client stall ++ if(peer->GetStatus() == P_SUCCESS){ ++ if( peer->RecvModule() < 0 ) { ++ if(arg_verbose) fprintf(stderr, "close: receive\n"); ++ peer->CloseConnection(); ++ } ++ } ++ }else if( peer->HealthCheck(now) < 0 ){ ++ if(arg_verbose) fprintf(stderr, "close: unresponsive\n"); ++ peer->CloseConnection(); } ++ ++ if( (PEER_IS_SUCCESS(peer) || peer->GetStatus() == P_HANDSHAKE) && ++ FD_ISSET(sk,wfdp) ){ ++ (*nready)--; ++ FD_CLR(sk,wfdp); ++ if( peer->SendModule() < 0 ) { ++ if(arg_verbose) fprintf(stderr, "close: send\n"); ++ peer->CloseConnection(); ++ } ++ }else peer->CheckSendStatus(); } }// end for -@@ -514,7 +641,11 @@ + } +@@ -514,7 +732,10 @@ { PEERNODE *p = m_head; for( ; p; p = p->next) - if(p->peer->bitfield.IsFull()) p->peer->CloseConnection(); -+// if(p->peer->bitfield.IsFull()) p->peer->CloseConnection(); + if(p->peer->bitfield.IsFull()) { + if(arg_verbose) fprintf(stderr, "close: seed<->seed\n"); + p->peer->CloseConnection(); @@ -1660,54 +13925,81 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp } void PeerList::UnChokeCheck(btPeer* peer, btPeer *peer_array[]) -@@ -523,8 +654,15 @@ +@@ -523,51 +744,170 @@ int cancel_idx = 0; btPeer *loster = (btPeer*) 0; int f_seed = BTCONTENT.pBF->IsFull(); +- +- for( cancel_idx = i = 0; i < MAX_UNCHOKE; i++ ){ +- if((btPeer*) 0 == peer_array[i] || PEER_IS_FAILED(peer_array[i]) ){ // 有空位 + int no_opt = 0; ++ unsigned long rndbits; ++ int r=0; + + if (m_opt_timestamp) no_opt = 1; - -- for( cancel_idx = i = 0; i < MAX_UNCHOKE; i++ ){ ++ +// Find my 3 or 4 fastest peers. +// The MAX_UNCHOKE+1 (4th) slot is for the optimistic unchoke when it happens. + + // Find a slot for the candidate--the slowest peer, or an available slot. + for( cancel_idx = i = 0; i < MAX_UNCHOKE+no_opt; i++ ){ - if((btPeer*) 0 == peer_array[i] || PEER_IS_FAILED(peer_array[i]) ){ // 有空位 ++ if((btPeer*) 0 == peer_array[i] || ++ PEER_IS_FAILED(peer_array[i]) ){ // 有空位 cancel_idx = i; break; -@@ -537,7 +675,13 @@ - cancel_idx = i; + }else{ + if(cancel_idx == i) continue; + + if(f_seed){ +- // compare upload rate. +- if(peer_array[cancel_idx]->RateUL() > peer_array[i]->RateUL()) +- cancel_idx = i; ++ // compare upload rate. ++ if(peer_array[cancel_idx]->RateUL() > peer_array[i]->RateUL()) ++ cancel_idx = i; }else{ - // compare download rate. +- // compare download rate. - if(peer_array[cancel_idx]->RateDL() > peer_array[i]->RateDL()) -+// if(peer_array[cancel_idx]->RateDL() > peer_array[i]->RateDL()) -+ if( peer_array[cancel_idx]->RateDL() > peer_array[i]->RateDL() +- cancel_idx = i; ++ // compare download rate. ++ if( peer_array[cancel_idx]->RateDL() > peer_array[i]->RateDL() + //if equal, reciprocate to the peer we've sent less to, proportionally + ||(peer_array[cancel_idx]->RateDL() == peer_array[i]->RateDL() + && peer_array[cancel_idx]->TotalUL() + / (peer_array[cancel_idx]->TotalDL()+.001) + < peer_array[i]->TotalUL() / (peer_array[i]->TotalDL()+.001)) ) - cancel_idx = i; ++ cancel_idx = i; } } -@@ -551,7 +695,13 @@ + } // end for + +- if( (btPeer*) 0 != peer_array[cancel_idx] && PEER_IS_SUCCESS(peer_array[cancel_idx]) ){ ++ if( (btPeer*) 0 != peer_array[cancel_idx] && ++ PEER_IS_SUCCESS(peer_array[cancel_idx]) ){ + if(f_seed){ + if(peer->RateUL() > peer_array[cancel_idx]->RateUL()){ +- loster = peer_array[cancel_idx]; +- peer_array[cancel_idx] = peer; ++ loster = peer_array[cancel_idx]; ++ peer_array[cancel_idx] = peer; }else - loster = peer; +- loster = peer; ++ loster = peer; }else{ - if(peer->RateDL() > peer_array[cancel_idx]->RateDL()){ -+// if(peer->RateDL() > peer_array[cancel_idx]->RateDL()){ +- loster = peer_array[cancel_idx]; +- peer_array[cancel_idx] = peer; + if( peer->RateDL() > peer_array[cancel_idx]->RateDL() + // If equal, reciprocate to the peer we've sent less to, proportionally + ||(peer_array[cancel_idx]->RateDL() == peer->RateDL() + && peer_array[cancel_idx]->TotalUL() + / (peer_array[cancel_idx]->TotalDL()+.001) + > peer->TotalUL() / (peer->TotalDL()+.001)) ){ - loster = peer_array[cancel_idx]; - peer_array[cancel_idx] = peer; ++ loster = peer_array[cancel_idx]; ++ peer_array[cancel_idx] = peer; }else -@@ -559,15 +709,56 @@ +- loster = peer; ++ loster = peer; } // opt unchoke @@ -1717,8 +14009,8 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp + } + else + // The last slot is for the optimistic unchoke. -+ // Bump the loser into it if he's been waiting longer than the occupant. -+ if((btPeer*) 0 == peer_array[MAX_UNCHOKE] || PEER_IS_FAILED(peer_array[MAX_UNCHOKE])) ++ if( (btPeer*) 0 == peer_array[MAX_UNCHOKE] || ++ PEER_IS_FAILED(peer_array[MAX_UNCHOKE]) ) peer_array[MAX_UNCHOKE] = loster; - else{ - if(loster->GetLastUnchokeTime() < peer_array[MAX_UNCHOKE]->GetLastUnchokeTime()) @@ -1726,21 +14018,34 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp - else{ - if(loster->SetLocal(M_CHOKE) < 0) loster->CloseConnection(); + else { -+// if(loster->GetLastUnchokeTime() < peer_array[MAX_UNCHOKE]->GetLastUnchokeTime()) { ++ if( !r-- ){ ++ rndbits = random(); ++ r = 15; ++ } + // if loser is empty and current is not, loser gets 75% chance. -+ if( loster->bitfield.IsEmpty() && !peer_array[MAX_UNCHOKE]->bitfield.IsEmpty() -+ && random()&03 ) { ++ if( loster->IsEmpty() && !peer_array[MAX_UNCHOKE]->IsEmpty() ++ && (rndbits>>=2)&3 ) { + btPeer* tmp = peer_array[MAX_UNCHOKE]; + peer_array[MAX_UNCHOKE] = loster; + loster = tmp; -+ } else // if loser waited longer: -+ if(loster->GetLastUnchokeTime() < peer_array[MAX_UNCHOKE]->GetLastUnchokeTime()) { ++ } else ++ // This mess chooses the loser: ++ // if loser is choked and current is not ++ // OR if both are choked and loser has waited longer ++ // OR if both are unchoked and loser has had less time unchoked. ++ if( (!loster->Is_Local_UnChoked() && ++ ( peer_array[MAX_UNCHOKE]->Is_Local_UnChoked() || ++ loster->GetLastUnchokeTime() < ++ peer_array[MAX_UNCHOKE]->GetLastUnchokeTime() )) || ++ (peer_array[MAX_UNCHOKE]->Is_Local_UnChoked() && ++ peer_array[MAX_UNCHOKE]->GetLastUnchokeTime() < ++ loster->GetLastUnchokeTime()) ){ + // if current is empty and loser is not, loser gets 25% chance; + // else loser wins. + // transformed to: if loser is empty or current isn't, or 25% chance, + // then loser wins. -+ if( !peer_array[MAX_UNCHOKE]->bitfield.IsEmpty() || loster->bitfield.IsEmpty() -+ || !random()&03 ) { ++ if( !peer_array[MAX_UNCHOKE]->IsEmpty() || loster->IsEmpty() ++ || !((rndbits>>=2)&3) ) { + btPeer* tmp = peer_array[MAX_UNCHOKE]; + peer_array[MAX_UNCHOKE] = loster; + loster = tmp; @@ -1770,10 +14075,70 @@ diff -u ctorrent-1.3.4.orig/peerlist.cpp ctorrent-1.3.4/peerlist.cpp + } +} + -diff -u ctorrent-1.3.4.orig/peerlist.h ctorrent-1.3.4/peerlist.h ---- ctorrent-1.3.4.orig/peerlist.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/peerlist.h 2005-08-11 23:45:29.434692920 +0200 -@@ -18,7 +18,8 @@ ++btPeer* PeerList::GetNextPeer(btPeer *peer) ++{ ++ static PEERNODE *p = m_head; ++ ++ if( 0==peer ) p = m_head; ++ else if( p->peer == peer ){ ++ p = p->next; ++ }else{ ++ for( p=m_head; p && (p->peer != peer); p = p->next); ++ if( 0 == p->peer ){ ++ p = m_head; ++ }else{ ++ p = p->next; ++ } ++ } ++ for( ; p; p = p->next) ++ if( p->peer && PEER_IS_SUCCESS(p->peer) ) break; ++ ++ if(p) return p->peer; ++ else return (btPeer*) 0; ++} ++ ++// This is used to un-standby peers when we enter endgame mode. ++// It re-evaluates at most once per second for CPU efficiency, so isn't used ++// when greatest accuracy is desired. ++int PeerList::Endgame() ++{ ++ static time_t timestamp = 0; ++ static int endgame = 0; ++ ++ if( now > timestamp ){ ++ timestamp = now; ++ if( arg_file_to_download ){ ++ BitField afdBitField = *BTCONTENT.pBF; ++ afdBitField.Except(*BTCONTENT.pBFilter); ++ endgame = ( BTCONTENT.getFilePieces(arg_file_to_download) ++ - afdBitField.Count() ) < WORLD.TotalPeers(); ++ }else ++ endgame = ( WORLD.Pieces_I_Can_Get() - BTCONTENT.pBF->Count() ) ++ < WORLD.TotalPeers(); ++ } ++ return endgame; ++} ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/peerlist.h ctorrent-1.3.4/peerlist.h +--- ctorrent-1.3.4.sav/peerlist.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/peerlist.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,14 +1,13 @@ + #ifndef PEERLIST_H + #define PEERLIST_H + +-#include <sys/types.h> + #include "./def.h" ++#include <sys/types.h> + #include "./peer.h" + #include "./rate.h" + + typedef struct _peernode{ + btPeer *peer; +- size_t click; + struct _peernode *next; + }PEERNODE; + +@@ -18,7 +17,8 @@ SOCKET m_listen_sock; PEERNODE *m_head; size_t m_peers_count; @@ -1783,45 +14148,58 @@ diff -u ctorrent-1.3.4.orig/peerlist.h ctorrent-1.3.4/peerlist.h unsigned char m_live_idx:2; unsigned char m_reserved:6; -@@ -50,9 +51,12 @@ +@@ -26,7 +26,6 @@ + Rate m_pre_dlrate, m_pre_ulrate; + + int Accepter(); +- void Sort(); + void UnChokeCheck(btPeer* peer,btPeer *peer_array[]); + + public: +@@ -50,9 +49,16 @@ void Tell_World_I_Have(size_t idx); btPeer* Who_Can_Abandon(btPeer *proposer); -+ btPeer* Who_Can_Duplicate(btPeer *proposer, size_t idx); ++ size_t What_Can_Duplicate(BitField &bf, btPeer *proposer, size_t idx); ++ void FindValuedPieces(BitField &bf, btPeer *proposer, int initial); ++ btPeer *WhoHas(size_t idx); + void CancelSlice(size_t idx, size_t off, size_t len); void CheckBitField(BitField &bf); int AlreadyRequested(size_t idx); size_t Pieces_I_Can_Get(); + void CheckInterest(); ++ btPeer* GetNextPeer(btPeer *peer); ++ int Endgame(); }; extern PeerList WORLD; -diff -u ctorrent-1.3.4.orig/rate.cpp ctorrent-1.3.4/rate.cpp ---- ctorrent-1.3.4.orig/rate.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/rate.cpp 2005-08-11 23:45:29.434692920 +0200 -@@ -1,5 +1,7 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/rate.cpp ctorrent-1.3.4/rate.cpp +--- ctorrent-1.3.4.sav/rate.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/rate.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -1,14 +1,17 @@ #include "rate.h" - -+#define RATE_INTERVAL 20 ++#include "bttime.h" + ++#define RATE_INTERVAL 20 + void Rate::StartTimer() { - if( !m_last_timestamp ) time(&m_last_timestamp); -@@ -7,7 +9,7 @@ +- if( !m_last_timestamp ) time(&m_last_timestamp); ++ if( !m_last_timestamp ) m_last_timestamp = now; + } void Rate::StopTimer() { - if( !m_last_timestamp ){ +- m_total_timeused += (time((time_t*) 0) - m_last_timestamp); + if( m_last_timestamp ){ - m_total_timeused += (time((time_t*) 0) - m_last_timestamp); ++ m_total_timeused += (now - m_last_timestamp); m_last_timestamp = 0; } -@@ -15,7 +17,27 @@ - + } +@@ -16,27 +19,61 @@ void Rate::CountAdd(size_t nbytes) { -+ time_t now = time((time_t*) 0); -+ m_count_bytes += nbytes; + + // save bandwidth history data @@ -1844,14 +14222,18 @@ diff -u ctorrent-1.3.4.orig/rate.cpp ctorrent-1.3.4/rate.cpp } void Rate::operator=(const Rate &ra) -@@ -26,17 +48,33 @@ + { +- m_last_timestamp = time((time_t*) 0); ++ m_last_timestamp = now; + m_count_bytes = ra.m_count_bytes; + } size_t Rate::RateMeasure() const { - time_t timeused = m_total_timeused; - if( m_last_timestamp ) timeused += (time((time_t*) 0) - m_last_timestamp); + // calculate rate based on bandwidth history data -+ time_t timestamp = time((time_t*) 0); ++ time_t timestamp = now; + u_int64_t countbytes = 0; + time_t timeused = 0; + @@ -1872,8 +14254,9 @@ diff -u ctorrent-1.3.4.orig/rate.cpp ctorrent-1.3.4/rate.cpp size_t Rate::RateMeasure(const Rate &ra_to) const { +- time_t timeused = time((time_t*) 0) - m_last_timestamp; + int tmp; - time_t timeused = time((time_t*) 0) - m_last_timestamp; ++ time_t timeused = now - m_last_timestamp; if( timeused < 1 ) timeused = 1; - return (size_t)((ra_to.m_count_bytes - m_count_bytes) / timeused); + tmp = (ra_to.m_count_bytes - ra_to.m_recent_base) @@ -1882,15 +14265,20 @@ diff -u ctorrent-1.3.4.orig/rate.cpp ctorrent-1.3.4/rate.cpp } time_t Rate::TimeUsed(const time_t *pnow) const -diff -u ctorrent-1.3.4.orig/rate.h ctorrent-1.3.4/rate.h ---- ctorrent-1.3.4.orig/rate.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/rate.h 2005-08-11 23:45:29.434692920 +0200 -@@ -5,14 +5,29 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/rate.h ctorrent-1.3.4/rate.h +--- ctorrent-1.3.4.sav/rate.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/rate.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,18 +1,33 @@ + #ifndef RATE_H + #define RATE_H + ++#include "def.h" + #include <sys/types.h> #include <time.h> - #include "def.h" - -+#define MAX_SAMPLES 20 +-#include "def.h" + ++#define MAX_SAMPLES 20 + class Rate{ private: time_t m_last_timestamp; @@ -1917,10 +14305,450 @@ diff -u ctorrent-1.3.4.orig/rate.h ctorrent-1.3.4/rate.h void StartTimer(); void StopTimer(); void CountAdd(size_t nbytes); -diff -u ctorrent-1.3.4.orig/sigint.cpp ctorrent-1.3.4/sigint.cpp ---- ctorrent-1.3.4.orig/sigint.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/sigint.cpp 2005-08-11 23:45:29.434692920 +0200 -@@ -4,17 +4,27 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/README-DNH.TXT ctorrent-1.3.4/README-DNH.TXT +--- ctorrent-1.3.4.sav/README-DNH.TXT 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/README-DNH.TXT 2006-06-28 19:30:02.000000000 +0200 +@@ -0,0 +1,239 @@ ++ ++ Enhanced CTorrent ++ ++ [ [1]Overview | [2]News | [3]Changes | [4]CTCS | [5]Download | ++ [6]Resources | [7]Contact ] ++ _________________________________________________________________ ++ ++ Overview ++ ++ [8]CTorrent is a [9]BitTorrent client implemented in C++ to be ++ lightweight and quick. It has fallen a little behind in updates and ++ bug fixes though. ++ ++ The files here contain the good work of those who wrote the original ++ CTorrent base code and a number of patches that provide fixes and ++ enhancements, as well as additional fixes and enhancements that I am ++ contributing. I am not the original author, current maintainer, or any ++ other official representative of CTorrent. The files on this page are ++ not the original or official CTorrent distribution. I encourage you to ++ visit the [10]CTorrent project page on SourceForge for further ++ information. ++ ++ Features ++ ++ The purpose of the Enhanced CTorrent effort is to fix problems that ++ remain in the code, modernize existing features and algorithms, and ++ implement new features while maintaining low overhead requirements and ++ a high standard of performance (both part of the original CTorrent ++ design philosophy). Highlights of the enhanced client include: ++ * Support for large files (>2GB) and large torrents (>255 files) ++ * Strategic selection of pieces to request for download ++ * Continuous queueing of download requests, tuned based on latency ++ and throughput for each peer ++ * Improved download performance, including parallel requests in ++ initial and endgame modes ++ * Improved bandwidth regulation ++ * Improved compatibility with other peers ++ * Performance optimization and bug fixes ++ * An interface for monitoring and managing multiple clients ++ ++ Status Line ++ ++ The status line that is output by the client has changed since the ++ original and deserves some explanation. ++ ++ / 0/33/110 [672/672/672] 0MB,1130MB | 0,20K/s | 0,0K E:0,31 ++ - - -- --- --- --- --- --- ------ - -- - - - -- ++ A B C D E F G H I J K L M N O ++ ++ A: Ticker; this character changes to indicate that the client is ++ running. ++ B: Number of seeders (complete peers) to which you are connected. ++ C: Number of leechers (incomplete peers) to which you are connected. ++ D: Total number of peers in the swarm, as last reported by the ++ tracker. ++ E: Number of pieces of the torrent that you have completed. ++ F: Number of pieces currently available from you and your connected ++ peers. ++ G: Total number of pieces in the torrent. ++ H: Total amount of data you have downloaded. ++ I: Total amount of data you have uploaded. ++ J: Your current total download rate. ++ K: Your current total upload rate. ++ L: Amount of data downloaded since the last status line update. ++ M: Amount of data uploaded since the last status line update. ++ N: Number of tracker connection errors. ++ O: Number of successful tracker connections. ++ ++ Peer ID ++ ++ Beginning with dnh1.1 the default peer ID has been changed for ++ convenience, as some other clients and trackers assume that Ctorrent ++ is "buggy" and won't cooperate with it. [Guess what, there are plenty ++ of others with bugs too.] The -P option is still available if you wish ++ to use a different peer ID, but it is no longer necessary to do so in ++ order to avoid this "ban". ++ ++ The new default peer ID prefix is "-CDversion-", where version is an ++ indication of the version number (0101 for dnh1.1). ++ ++ CTCS ++ ++ [11]CTorrent Control Server (CTCS) is an interface for monitoring and ++ managing Enhanced CTorrent clients. It can manage allocation of ++ bandwidth, provide status information, and allow changes to the ++ running configuration of each client. Support for this interface was ++ added in the dnh2 release. ++ _________________________________________________________________ ++ ++ News ++ ++ 2006-01-15 ++ Version dnh2 is released! This version includes a number of ++ significant [12]changes, including large file support, piece ++ selection, tuned request queue depth, and support for ++ [13]CTorrent Control Server. ++ _________________________________________________________________ ++ ++ Changes ++ ++ For a list of changes in the current and previous versions, see the ++ [14]ChangeLog file. ++ _________________________________________________________________ ++ ++ Download ++ ++ Release dnh2 ++ The patch files for this version are significantly larger ++ than in previous releases. It will be faster and easier to just ++ download the patched source distribution below. ++ ++ [15]dnh1.2 to dnh2 patch file ++ A patch file of changes to release dnh1.2 to bring it up to dnh2. ++ ++ [16]Patch file ++ A patch file of changes to the CTorrent 1.3.4 base. ++ ++ [17]Patched source ++ A complete source distribution for all platforms. ++ ___________________________________ ++ ++ Release dnh1.2 ++ Note: If you get a message about needing to install OpenSSL, you might ++ want to try the FreeBSD patch/version even if you are not using ++ FreeBSD. ++ ++ [18]dnh1.1 to dnh1.2 patch file ++ A patch file of changes to release dnh1.1 to bring it up to dnh1.2. ++ ++ [19]FreeBSD patch file ++ A patch file of changes to the CTorrent 1.3.4 base, including the ++ patches from the FreeBSD ports tree. ++ ++ [20]Patch file ++ A patch file of changes to the CTorrent 1.3.4 base. ++ ++ [21]FreeBSD patched source ++ This includes the patches from the FreeBSD ports tree. ++ ++ [22]Linux/Windows/Other patched source ++ Please [23]let me know if you encounter any portability issues, as I ++ don't have a test environment set up for these platforms. ++ ___________________________________ ++ ++ Bitfield::Invert patch ++ ++ [24]Bitfield::Invert patch ++ See notes in the change log; this is needed if you are using dnh1.1, ++ dnh1, or ctorrent-1.3.4. ++ ___________________________________ ++ ++ Release dnh1.1 ++ ++ [25]dnh1 to dnh1.1 patch file ++ A patch file of changes to release dnh1 to bring it up to dnh1.1. ++ ___________________________________ ++ ++ Release dnh1 ++ ++ [26]FreeBSD patch file ++ A patch file of changes to the CTorrent 1.3.4 base, including the ++ patches from the FreeBSD ports tree. ++ Note: Thanks to Florent Thoumie, as of 29 Jul 2005 this patchset is ++ included in the FreeBSD port. If you update your ports tree (or at ++ least net/ctorrent) and install from there, you will have these ++ updates without downloading the file and patching manually. ++ ++ [27]Patch file ++ A patch file of changes to the CTorrent 1.3.4 base. ++ ++ [28]FreeBSD patched source ++ This includes the patches from the FreeBSD ports tree. ++ ++ [29]Linux/Windows/Other patched source ++ Please [30]let me know if you encounter any portability issues, as I ++ don't have a test environment set up for these platforms. ++ _________________________________________________________________ ++ ++ Resources ++ ++ [31]CTorrent Home Page ++ Outdated, but you may find some useful info (particularly the FAQ). ++ ++ [32]CTorrent SourceForge Project ++ Hosts the CTorrent codebase, bug reports, patches, and forum. ++ ++ [33]Custom CTorrent ++ A page by the author of the "get1file" patch and other fixes. It ++ contains a custom version and a GUI for CTorrent. ++ ++ [34]BitTorrent ++ The official BitTorrent home page. ++ ++ [35]BitTorrent wiki ++ Various documentation. ++ ++ [36]BitTorrent protocol specification (official version) ++ ++ [37]BitTorrent protocol specification (wiki version) ++ ++References ++ ++ 1. http://www.rahul.net/dholmes/ctorrent/index.html#info ++ 2. http://www.rahul.net/dholmes/ctorrent/index.html#news ++ 3. http://www.rahul.net/dholmes/ctorrent/changelog.html ++ 4. http://www.rahul.net/dholmes/ctorrent/ctcs.html ++ 5. http://www.rahul.net/dholmes/ctorrent/index.html#download ++ 6. http://www.rahul.net/dholmes/ctorrent/index.html#resources ++ 7. mailto:dholmes@ct.boxmail.com ++ 8. http://ctorrent.sourceforge.net/ ++ 9. http://www.bittorrent.com/ ++ 10. http://sourceforge.net/projects/ctorrent/ ++ 11. http://www.rahul.net/dholmes/ctorrent/ctcs.html ++ 12. http://www.rahul.net/dholmes/ctorrent/changelog.html ++ 13. http://www.rahul.net/dholmes/ctorrent/ctcs.html ++ 14. http://www.rahul.net/dholmes/ctorrent/changelog.html ++ 15. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-dnh1.2-dnh2.diff ++ 16. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-1.3.4-dnh2.diff ++ 17. http://www.rahul.net/dholmes/ctorrent/ctorrent-1.3.4-dnh2.tar.gz ++ 18. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-dnh1.1-dnh1.2.diff ++ 19. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-1.3.4-dnh1.2-fbsd.diff ++ 20. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-1.3.4-dnh1.2.diff ++ 21. http://www.rahul.net/dholmes/ctorrent/ctorrent-1.3.4-dnh1.2-fbsd.tar.gz ++ 22. http://www.rahul.net/dholmes/ctorrent/ctorrent-1.3.4-dnh1.2.tar.gz ++ 23. mailto:dholmes@ct.boxmail.com ++ 24. http://www.rahul.net/dholmes/ctorrent/patch-invert.diff ++ 25. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-dnh1-dnh1.1.diff ++ 26. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-1.3.4-dnh1-fbsd.diff ++ 27. http://www.rahul.net/dholmes/ctorrent/patchset-ctorrent-1.3.4-dnh1.diff ++ 28. http://www.rahul.net/dholmes/ctorrent/ctorrent-1.3.4-dnh1-fbsd.tar.gz ++ 29. http://www.rahul.net/dholmes/ctorrent/ctorrent-1.3.4-dnh1.tar.gz ++ 30. mailto:dholmes@ct.boxmail.com ++ 31. http://ctorrent.sourceforge.net/ ++ 32. http://sourceforge.net/projects/ctorrent/ ++ 33. http://customctorrent.ifreepages.com/ ++ 34. http://bittorrent.com/ ++ 35. http://wiki.theory.org/CategoryBitTorrent ++ 36. http://www.bittorrent.com/protocol.html ++ 37. http://wiki.theory.org/BitTorrentSpecification +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/sha1.c ctorrent-1.3.4/sha1.c +--- ctorrent-1.3.4.sav/sha1.c 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/sha1.c 2006-06-28 19:30:02.000000000 +0200 +@@ -0,0 +1,146 @@ ++#include <string.h> ++ ++#include "sha1.h" ++ ++#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) ++ ++/* blk0() and blk() perform the initial expand. */ ++/* I got the idea of expanding during the round function from SSLeay */ ++#if (defined(BYTE_ORDER) && BYTE_ORDER==LITTLE_ENDIAN) || (!defined(BYTE_ORDER) && defined(LITTLE_ENDIAN)) ++#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ ++ |(rol(block->l[i],8)&0x00FF00FF)) ++#else ++#define blk0(i) block->l[i] ++#endif ++#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ++ ^block->l[(i+2)&15]^block->l[i&15],1)) ++ ++/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ ++#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); ++#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); ++#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); ++#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); ++#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); ++ ++ ++/* Hash a single 512-bit block. This is the core of the algorithm. */ ++ ++void SHA1Transform(unsigned long state[5], unsigned char buffer[64]) ++{ ++unsigned long a, b, c, d, e; ++typedef union { ++ unsigned char c[64]; ++ unsigned long l[16]; ++} CHAR64LONG16; ++CHAR64LONG16* block; ++#ifdef SHA1HANDSOFF ++static unsigned char workspace[64]; ++ block = (CHAR64LONG16*)workspace; ++ memcpy(block, buffer, 64); ++#else ++ block = (CHAR64LONG16*)buffer; ++#endif ++ /* Copy context->state[] to working vars */ ++ a = state[0]; ++ b = state[1]; ++ c = state[2]; ++ d = state[3]; ++ e = state[4]; ++ /* 4 rounds of 20 operations each. Loop unrolled. */ ++ R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); ++ R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); ++ R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); ++ R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); ++ R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); ++ R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); ++ R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); ++ R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); ++ R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); ++ R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); ++ R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); ++ R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); ++ R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); ++ R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); ++ R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); ++ R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); ++ R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); ++ R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); ++ R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); ++ R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); ++ /* Add the working vars back into context.state[] */ ++ state[0] += a; ++ state[1] += b; ++ state[2] += c; ++ state[3] += d; ++ state[4] += e; ++ /* Wipe variables */ ++ a = b = c = d = e = 0; ++} ++ ++ ++/* SHA1Init - Initialize new context */ ++ ++void SHA1Init(SHA1_CTX* context) ++{ ++ /* SHA1 initialization constants */ ++ context->state[0] = 0x67452301; ++ context->state[1] = 0xEFCDAB89; ++ context->state[2] = 0x98BADCFE; ++ context->state[3] = 0x10325476; ++ context->state[4] = 0xC3D2E1F0; ++ context->count[0] = context->count[1] = 0; ++} ++ ++ ++/* Run your data through this. */ ++ ++void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) ++{ ++unsigned int i, j; ++ ++ j = (context->count[0] >> 3) & 63; ++ if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; ++ context->count[1] += (len >> 29); ++ if ((j + len) > 63) { ++ memcpy(&context->buffer[j], data, (i = 64-j)); ++ SHA1Transform(context->state, context->buffer); ++ for ( ; i + 63 < len; i += 64) { ++ SHA1Transform(context->state, &data[i]); ++ } ++ j = 0; ++ } ++ else i = 0; ++ memcpy(&context->buffer[j], &data[i], len - i); ++} ++ ++ ++/* Add padding and return the message digest. */ ++ ++void SHA1Final(unsigned char digest[20], SHA1_CTX* context) ++{ ++unsigned long i, j; ++unsigned char finalcount[8]; ++ ++ for (i = 0; i < 8; i++) { ++ finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] ++ >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ ++ } ++ SHA1Update(context, (unsigned char *)"\200", 1); ++ while ((context->count[0] & 504) != 448) { ++ SHA1Update(context, (unsigned char *)"\0", 1); ++ } ++ SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ ++ for (i = 0; i < 20; i++) { ++ digest[i] = (unsigned char) ++ ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); ++ } ++ /* Wipe variables */ ++ i = j = 0; ++ memset(context->buffer, 0, 64); ++ memset(context->state, 0, 20); ++ memset(context->count, 0, 8); ++ memset(&finalcount, 0, 8); ++#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ ++ SHA1Transform(context->state, context->buffer); ++#endif ++} +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/sha1.h ctorrent-1.3.4/sha1.h +--- ctorrent-1.3.4.sav/sha1.h 1970-01-01 01:00:00.000000000 +0100 ++++ ctorrent-1.3.4/sha1.h 2006-06-28 19:30:02.000000000 +0200 +@@ -0,0 +1,43 @@ ++#ifndef SHA1_H ++#define SHA1_H ++ ++/* ++SHA-1 in C ++By Steve Reid <steve@edmweb.com> ++100% Public Domain ++ ++Test Vectors (from FIPS PUB 180-1) ++"abc" ++ A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D ++"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" ++ 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 ++A million repetitions of "a" ++ 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F ++*/ ++ ++#include <sys/types.h> ++ ++/* #define LITTLE_ENDIAN * This should be #define'd if true. */ ++/* #define SHA1HANDSOFF * Copies data before messing with it. */ ++#define SHA1HANDSOFF ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++typedef struct { ++ unsigned long state[5]; ++ unsigned long count[2]; ++ unsigned char buffer[64]; ++} SHA1_CTX; ++ ++void SHA1Transform(unsigned long state[5], unsigned char buffer[64]); ++void SHA1Init(SHA1_CTX* context); ++void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len); ++void SHA1Final(unsigned char digest[20], SHA1_CTX* context); ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/sigint.cpp ctorrent-1.3.4/sigint.cpp +--- ctorrent-1.3.4.sav/sigint.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/sigint.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -4,17 +4,28 @@ #include <signal.h> #include "btcontent.h" @@ -1934,6 +14762,7 @@ diff -u ctorrent-1.3.4.orig/sigint.cpp ctorrent-1.3.4/sigint.cpp { - if(SIGINT == sig_no){ + if(SIGINT == sig_no || SIGTERM == sig_no){ ++ if( Tracker.IsPaused() ) Tracker.ClearPause(); + Tracker.SetStoped(); + signal(sig_no,sig_catch2); + } @@ -1952,9 +14781,9 @@ diff -u ctorrent-1.3.4.orig/sigint.cpp ctorrent-1.3.4/sigint.cpp } } -diff -u ctorrent-1.3.4.orig/sigint.h ctorrent-1.3.4/sigint.h ---- ctorrent-1.3.4.orig/sigint.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/sigint.h 2005-08-11 23:45:29.435692768 +0200 +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/sigint.h ctorrent-1.3.4/sigint.h +--- ctorrent-1.3.4.sav/sigint.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/sigint.h 2006-06-28 19:30:02.000000000 +0200 @@ -2,7 +2,8 @@ #define SIGINT_H @@ -1965,15 +14794,30 @@ diff -u ctorrent-1.3.4.orig/sigint.h ctorrent-1.3.4/sigint.h #endif #endif -diff -u ctorrent-1.3.4.orig/tracker.cpp ctorrent-1.3.4/tracker.cpp ---- ctorrent-1.3.4.orig/tracker.cpp 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/tracker.cpp 2005-08-11 23:45:29.435692768 +0200 -@@ -31,11 +31,12 @@ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/tracker.cpp ctorrent-1.3.4/tracker.cpp +--- ctorrent-1.3.4.sav/tracker.cpp 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/tracker.cpp 2006-06-28 19:30:02.000000000 +0200 +@@ -20,6 +20,7 @@ + #include "iplist.h" + + #include "btconfig.h" ++#include "ctcs.h" + + btTracker Tracker; + +@@ -27,15 +28,19 @@ + { + memset(m_host,0,MAXHOSTNAMELEN); + memset(m_path,0,MAXPATHLEN); ++ memset(m_trackerid,0,PEER_ID_LEN+1); + m_sock = INVALID_SOCKET; m_port = 80; m_status = T_FREE; - m_f_started = m_f_stoped = m_f_pause = 0; + m_f_started = m_f_stoped = m_f_pause = m_f_completed = 0; ++ m_f_softquit = m_f_restart = 0; ++ m_interval = 15; m_connect_refuse_click = 0; @@ -1982,31 +14826,149 @@ diff -u ctorrent-1.3.4.orig/tracker.cpp ctorrent-1.3.4/tracker.cpp } btTracker::~btTracker() -@@ -54,7 +55,8 @@ +@@ -54,7 +59,11 @@ m_reponse_buffer.Reset(); time(&m_last_timestamp); - m_status = T_FREE; -+ if (m_f_stoped) m_status = T_FINISHED; ++ if (m_f_stoped){ ++ m_status = T_FINISHED; ++ if( m_f_restart ) Resume(); ++ } + else m_status = T_FREE; } int btTracker:: _IPsin(char *h, int p, struct sockaddr_in *psin) -@@ -111,6 +113,13 @@ +@@ -74,8 +83,8 @@ + if(psin->sin_addr.s_addr == INADDR_NONE){ + struct hostent *ph = gethostbyname(h); + if( !ph || ph->h_addrtype != AF_INET){ +- memset(psin,0,sizeof(struct sockaddr_in)); +- return -1; ++ memset(psin,0,sizeof(struct sockaddr_in)); ++ return -1; + } + memcpy(&psin->sin_addr,ph->h_addr_list[0],sizeof(struct in_addr)); + } +@@ -93,7 +102,7 @@ + + struct sockaddr_in addr; + +- if( decode_query(buf,bufsiz,"failure reason",&ps,&i,QUERY_STR) ){ ++ if( decode_query(buf,bufsiz,"failure reason",&ps,&i,(int64_t*) 0,QUERY_STR) ){ + char failreason[1024]; + if( i < 1024 ){ + memcpy(failreason, ps, i); +@@ -104,14 +113,55 @@ + strcat(failreason,"..."); + } + fprintf(stderr,"TRACKER FAILURE REASON: %s\n",failreason); ++ if(arg_ctcs){ ++ char ctcsinfo[1048]; ++ snprintf(ctcsinfo,1048,"TRACKER FAILURE REASON: %s",failreason); ++ CTCS.Send_Info(ctcsinfo); ++ } + return -1; + } ++ if( decode_query(buf,bufsiz,"warning message",&ps,&i,(int64_t*) 0,QUERY_STR) ){ ++ char warnmsg[1024]; ++ if( i < 1024 ){ ++ memcpy(warnmsg, ps, i); ++ warnmsg[i] = '\0'; ++ }else{ ++ memcpy(warnmsg, ps, 1000); ++ warnmsg[1000] = '\0'; ++ strcat(warnmsg,"..."); ++ } ++ fprintf(stderr,"TRACKER WARNING: %s\n",warnmsg); ++ if(arg_ctcs){ ++ char ctcsinfo[1048]; ++ snprintf(ctcsinfo,1048,"TRACKER WARNING: %s",warnmsg); ++ CTCS.Send_Info(ctcsinfo); ++ } ++ } + +- if(!decode_query(buf,bufsiz,"interval",(const char**) 0,&i,QUERY_INT)){return -1;} ++ m_peers_count = 0; ++ ++ if( decode_query(buf,bufsiz,"tracker id",&ps,&i,(int64_t*) 0,QUERY_STR) ){ ++ if( i <= PEER_ID_LEN ){ ++ memcpy(m_trackerid, ps, i); ++ m_trackerid[i] = '\0'; ++ }else{ ++ memcpy(m_trackerid, ps, PEER_ID_LEN); ++ m_trackerid[PEER_ID_LEN] = '\0'; ++ } ++ } ++ ++ if(!decode_query(buf,bufsiz,"interval",(const char**) 0,&i,(int64_t*) 0,QUERY_INT)){return -1;} if(m_interval != (time_t)i) m_interval = (time_t)i; -+ if(decode_query(buf,bufsiz,"complete",(const char**) 0,&i,QUERY_INT)) { -+ m_peers_count = i; +- pos = decode_query(buf,bufsiz,"peers",(const char**) 0,(size_t *) 0,QUERY_POS); ++ if(decode_query(buf,bufsiz,"complete",(const char**) 0,&i,(int64_t*) 0,QUERY_INT)) { ++ m_peers_count += i; + } -+ if(decode_query(buf,bufsiz,"incomplete",(const char**) 0,&i,QUERY_INT)) { ++ if(decode_query(buf,bufsiz,"incomplete",(const char**) 0,&i,(int64_t*) 0,QUERY_INT)) { + m_peers_count += i; + } + - pos = decode_query(buf,bufsiz,"peers",(const char**) 0,(size_t *) 0,QUERY_POS); ++ pos = decode_query(buf,bufsiz,"peers",(const char**) 0,(size_t *) 0,(int64_t*) 0,QUERY_POS); if( !pos ){ -@@ -161,7 +170,10 @@ + return -1; +@@ -123,32 +173,32 @@ + + ps = buf-1; + if (*ps != 'l') { // binary peers section if not 'l' +- addr.sin_family = AF_INET; +- i = 0; +- while (*ps != ':' ) i = i * 10 + (*ps++ - '0'); +- i /= 6; +- ps++; +- while (i-- > 0) { +- // if peer is not us +- if(memcmp(&Self.m_sin.sin_addr,ps,sizeof(struct in_addr))) { +- memcpy(&addr.sin_addr,ps,sizeof(struct in_addr)); +- memcpy(&addr.sin_port,ps+sizeof(struct in_addr),sizeof(unsigned short)); +- cnt++; +- IPQUEUE.Add(&addr); +- } +- ps += 6; +- } ++ addr.sin_family = AF_INET; ++ i = 0; ++ while (*ps != ':' ) i = i * 10 + (*ps++ - '0'); ++ i /= 6; ++ ps++; ++ while (i-- > 0) { ++ // if peer is not us ++ if(memcmp(&Self.m_sin.sin_addr,ps,sizeof(struct in_addr))) { ++ memcpy(&addr.sin_addr,ps,sizeof(struct in_addr)); ++ memcpy(&addr.sin_port,ps+sizeof(struct in_addr),sizeof(unsigned short)); ++ cnt++; ++ IPQUEUE.Add(&addr); ++ } ++ ps += 6; ++ } + } + else + for( ;bufsiz && *buf!='e'; buf += pos, bufsiz -= pos ){ + pos = decode_dict(buf,bufsiz,(char*) 0); + if(!pos) break; +- if(!decode_query(buf,pos,"ip",&ps,&i,QUERY_STR) || MAXHOSTNAMELEN < i) continue; ++ if(!decode_query(buf,pos,"ip",&ps,&i,(int64_t*) 0,QUERY_STR) || MAXHOSTNAMELEN < i) continue; + memcpy(tmphost,ps,i); tmphost[i] = '\0'; + +- if(!decode_query(buf,pos,"port",(const char**) 0,&tmpport,QUERY_INT)) continue; ++ if(!decode_query(buf,pos,"port",(const char**) 0,&tmpport,(int64_t*) 0,QUERY_INT)) continue; + +- if(!decode_query(buf,pos,"peer id",&ps,&i,QUERY_STR) && i != 20 ) continue; ++ if(!decode_query(buf,pos,"peer id",&ps,&i,(int64_t*) 0,QUERY_STR) && i != 20 ) continue; + + if(_IPsin(tmphost,tmpport,&addr) < 0){ + fprintf(stderr,"warn, detected invalid ip address %s.\n",tmphost); +@@ -161,14 +211,17 @@ } } @@ -2018,7 +14980,79 @@ diff -u ctorrent-1.3.4.orig/tracker.cpp ctorrent-1.3.4/tracker.cpp return 0; } -@@ -230,10 +242,14 @@ + int btTracker::CheckReponse() + { + #define MAX_LINE_SIZ 32 +- char *pdata; ++ char *pdata, *format; + ssize_t r; + size_t q, hlen, dlen; + +@@ -186,6 +239,12 @@ + if(getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n) < 0 || + error != 0 ){ + fprintf(stderr,"warn, received nothing from tracker! %s\n",strerror(error)); ++ if(arg_ctcs){ ++ char ctcsinfo[256]; ++ snprintf(ctcsinfo,256, ++ "warn, received nothing from tracker! %s",strerror(error)); ++ CTCS.Send_Info(ctcsinfo); ++ } + } + return -1; + } +@@ -194,6 +253,8 @@ + + if( !hlen ){ + fprintf(stderr,"warn, tracker reponse invalid. No html header found.\n"); ++ if(arg_ctcs) ++ CTCS.Send_Info("warn, tracker reponse invalid. No html header found."); + return -1; + } + +@@ -202,21 +263,32 @@ + if( r == 301 || r == 302 ){ + char redirect[MAXPATHLEN],ih_buf[20 * 3 + 1],pi_buf[20 * 3 + 1],tmppath[MAXPATHLEN]; + if( Http_get_header(m_reponse_buffer.BasePointer(), hlen, "Location", redirect) < 0 ) +- return -1; ++ return -1; + + if( Http_url_analyse(redirect,m_host,&m_port,m_path) < 0){ +- fprintf(stderr,"warn, tracker redirect to an invalid url %s!\n", redirect); +- return -1; ++ fprintf(stderr,"warn, tracker redirect to an invalid url %s!\n", redirect); ++ if(arg_ctcs){ ++ char ctcsinfo[256]; ++ snprintf(ctcsinfo,256, ++ "warn, tracker redirect to an invalid url %s!", redirect); ++ CTCS.Send_Info(ctcsinfo); ++ } ++ return -1; + } + + strcpy(tmppath,m_path); ++ ++ if(strchr(m_path, '?')) ++ format=REQ_URL_P1A_FMT; ++ else format=REQ_URL_P1_FMT; + +- if(MAXPATHLEN < snprintf(m_path,MAXPATHLEN,REQ_URL_P1_FMT, +- tmppath, +- Http_url_encode(ih_buf, (char*)BTCONTENT.GetInfoHash(), 20), +- Http_url_encode(pi_buf, (char*)BTCONTENT.GetPeerId(), 20), +- cfg_listen_port)){ +- return -1; ++ if(MAXPATHLEN < snprintf(m_path,MAXPATHLEN,format, ++ tmppath, ++ Http_url_encode(ih_buf, (char*)BTCONTENT.GetInfoHash(), 20), ++ Http_url_encode(pi_buf, (char*)BTCONTENT.GetPeerId(), 20), ++ cfg_listen_port, ++ m_key)){ ++ return -1; + } + + return Connect(); +@@ -230,10 +302,14 @@ return 0; } @@ -2034,7 +15068,123 @@ diff -u ctorrent-1.3.4.orig/tracker.cpp ctorrent-1.3.4/tracker.cpp return _UpdatePeerList(pdata,dlen); } -@@ -329,30 +345,34 @@ +@@ -241,6 +317,7 @@ + int btTracker::Initial() + { + char ih_buf[20 * 3 + 1],pi_buf[20 * 3 + 1],tmppath[MAXPATHLEN]; ++ char *format; + + if(Http_url_analyse(BTCONTENT.GetAnnounce(),m_host,&m_port,m_path) < 0){ + fprintf(stderr,"error, invalid tracker url format!\n"); +@@ -249,40 +326,50 @@ + + strcpy(tmppath,m_path); + +- if(MAXPATHLEN < snprintf((char*)m_path,MAXPATHLEN,REQ_URL_P1_FMT, +- tmppath, +- Http_url_encode(ih_buf,(char*)BTCONTENT.GetInfoHash(),20), +- Http_url_encode(pi_buf,(char*)BTCONTENT.GetPeerId(),20), +- cfg_listen_port)){ ++ if(strchr(m_path, '?')) ++ format=REQ_URL_P1A_FMT; ++ else format=REQ_URL_P1_FMT; ++ ++ char chars[37] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; ++ for(int i=0; i<8; i++) ++ m_key[i] = chars[random()%36]; ++ m_key[8] = 0; ++ ++ if(MAXPATHLEN < snprintf((char*)m_path,MAXPATHLEN,format, ++ tmppath, ++ Http_url_encode(ih_buf,(char*)BTCONTENT.GetInfoHash(),20), ++ Http_url_encode(pi_buf,(char*)BTCONTENT.GetPeerId(),20), ++ cfg_listen_port, ++ m_key)){ + return -1; + } +- ++ + /* get local ip address */ + // 1st: if behind firewall, this only gets local side + { + struct sockaddr_in addr; + socklen_t addrlen = sizeof(struct sockaddr_in); + if(getsockname(m_sock,(struct sockaddr*)&addr,&addrlen) == 0) +- Self.SetIp(addr); ++ Self.SetIp(addr); + } + // 2nd: better to use addr of our domain + { +- struct hostent *h; +- char hostname[128]; +- char *hostdots[2]={0,0}, *hdptr=hostname; +- +- if (gethostname(hostname, 128) == -1) return -1; +-// printf("%s\n", hostname); +- while(*hdptr) if(*hdptr++ == '.') { +- hostdots[0] = hostdots[1]; +- hostdots[1] = hdptr; +- } +- if (hostdots[0] == 0) return -1; +-// printf("%s\n", hostdots[0]); +- if ((h = gethostbyname(hostdots[0])) == NULL) return -1; +- //printf("Host domain : %s\n", h->h_name); +- //printf("IP Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr))); +- memcpy(&Self.m_sin.sin_addr,h->h_addr,sizeof(struct in_addr)); ++ struct hostent *h; ++ char hostname[128]; ++ char *hostdots[2]={0,0}, *hdptr=hostname; ++ ++ if (gethostname(hostname, 128) == -1) return -1; ++// printf("%s\n", hostname); ++ while(*hdptr) if(*hdptr++ == '.') { ++ hostdots[0] = hostdots[1]; ++ hostdots[1] = hdptr; ++ } ++ if (hostdots[0] == 0) return -1; ++// printf("%s\n", hostdots[0]); ++ if ((h = gethostbyname(hostdots[0])) == NULL) return -1; ++ //printf("Host domain : %s\n", h->h_name); ++ //printf("IP Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr))); ++ memcpy(&Self.m_sin.sin_addr,h->h_addr,sizeof(struct in_addr)); + } + return 0; + } +@@ -294,12 +381,33 @@ + + if(_s2sin(m_host,m_port,&m_sin) < 0) { + fprintf(stderr,"warn, get tracker's ip address failed."); ++ if(arg_ctcs) CTCS.Send_Info("warn, get tracker's ip address failed."); + return -1; + } + + m_sock = socket(AF_INET,SOCK_STREAM,0); + if(INVALID_SOCKET == m_sock) return -1; + ++ // we only need to bind if we have specified an ip ++ // we need it to bind here before the connect!!!! ++ if ( cfg_listen_ip != 0 ) { ++ struct sockaddr_in addr; ++ // clear the struct as requested in the manpages ++ memset(&addr,0, sizeof(sockaddr_in)); ++ // set the type ++ addr.sin_family = AF_INET; ++ // we want the system to choose port ++ addr.sin_port = 0; ++ // set the defined ip from the commandline ++ addr.sin_addr.s_addr = cfg_listen_ip; ++ // bind it or return... ++ if(bind(m_sock,(struct sockaddr*)&addr,sizeof(struct sockaddr_in)) != 0){ ++ fprintf(stderr, "warn, can't set up tracker connection: %s\n", ++ strerror(errno)); ++ return -1; ++ } ++ } ++ + if(setfd_nonblock(m_sock) < 0) {CLOSE_SOCKET(m_sock); return -1; } + + r = connect_nonb(m_sock,(struct sockaddr*)&m_sin); +@@ -329,34 +437,42 @@ // fprintf(stdout,"Old Set Self:"); // fprintf(stdout,"%s\n", inet_ntoa(Self.m_sin.sin_addr)); @@ -2058,47 +15208,83 @@ diff -u ctorrent-1.3.4.orig/tracker.cpp ctorrent-1.3.4/tracker.cpp if(event){ if(MAXPATHLEN < snprintf(REQ_BUFFER,MAXPATHLEN,REQ_URL_P2_FMT, - m_path, +- m_path, - (size_t)Self.TotalUL(), - (size_t)Self.TotalDL(), - (size_t)BTCONTENT.GetLeftBytes(), - event)){ -+ Self.TotalUL(), -+ Self.TotalDL(), -+ BTCONTENT.GetLeftBytes(), -+ event, -+ cfg_max_peers)){ ++ m_path, ++ Self.TotalUL(), ++ Self.TotalDL(), ++ BTCONTENT.GetLeftBytes(), ++ event, ++ cfg_max_peers, ++ m_key)){ return -1; } }else{ if(MAXPATHLEN < snprintf(REQ_BUFFER,MAXPATHLEN,REQ_URL_P3_FMT, - m_path, +- m_path, - (size_t)Self.TotalUL(), - (size_t)Self.TotalDL(), - (size_t)BTCONTENT.GetLeftBytes() -+ Self.TotalUL(), -+ Self.TotalDL(), -+ BTCONTENT.GetLeftBytes(), -+ cfg_max_peers - )){ +- )){ ++ m_path, ++ Self.TotalUL(), ++ Self.TotalDL(), ++ BTCONTENT.GetLeftBytes(), ++ cfg_max_peers, ++ m_key)){ return -1; } -@@ -380,8 +400,12 @@ + } ++ if( *m_trackerid && ++ MAXPATHLEN - strlen(m_path) > 11 + strlen(m_trackerid) ) ++ strcat(strcat(m_path, "&trackerid="), m_trackerid); + + if(_IPsin(m_host, m_port, &addr) < 0){ + char REQ_HOST[MAXHOSTNAMELEN]; +@@ -370,6 +486,12 @@ + + if( 0 != m_reponse_buffer.PutFlush(m_sock,REQ_BUFFER,strlen((char*)REQ_BUFFER))){ + fprintf(stderr,"warn, send request to tracker failed. %s\n",strerror(errno)); ++ if(arg_ctcs){ ++ char ctcsinfo[256]; ++ snprintf(ctcsinfo,256, ++ "warn, send request to tracker failed. %s",strerror(errno)); ++ CTCS.Send_Info(ctcsinfo); ++ } + return -1; + } + +@@ -380,23 +502,29 @@ { /* tracker communication */ if( T_FREE == m_status ){ - if((*pnow - m_last_timestamp >= m_interval) && - (cfg_min_peers > WORLD.TotalPeers())){ -+// if(*pnow - m_last_timestamp >= m_interval){ -+ if(*pnow - m_last_timestamp >= m_interval || -+ // Connect to tracker early if we run out of peers. -+ (!WORLD.TotalPeers() && m_prevpeers && -+ *pnow - m_last_timestamp >= 15) ){ ++ if( *pnow - m_last_timestamp >= m_interval || ++ // Connect to tracker early if we run low on peers. ++ (WORLD.TotalPeers() < cfg_min_peers && m_prevpeers >= cfg_min_peers && ++ *pnow - m_last_timestamp >= 15) || ++ (m_f_pause && !WORLD.TotalPeers()) ){ + m_prevpeers = WORLD.TotalPeers(); if(Connect() < 0){ Reset(15); return -1; } -@@ -396,7 +420,7 @@ + if( m_status == T_CONNECTING ){ +- FD_SET(m_sock, rfdp); +- FD_SET(m_sock, wfdp); ++ FD_SET(m_sock, rfdp); ++ FD_SET(m_sock, wfdp); + }else{ +- FD_SET(m_sock, rfdp); ++ FD_SET(m_sock, rfdp); + } ++ ++ if( m_f_pause && !WORLD.TotalPeers() ) m_f_stoped = 1; + } + }else{ if( m_status == T_CONNECTING ){ FD_SET(m_sock, rfdp); FD_SET(m_sock, wfdp); @@ -2107,19 +15293,94 @@ diff -u ctorrent-1.3.4.orig/tracker.cpp ctorrent-1.3.4/tracker.cpp FD_SET(m_sock, rfdp); } } -@@ -425,7 +449,7 @@ +@@ -407,28 +535,60 @@ + { + if( T_FREE == m_status ) return 0; + +- if( T_CONNECTING == m_status && +- (FD_ISSET(m_sock, wfdp) || FD_ISSET(m_sock,wfdp)) ){ ++ if( T_CONNECTING == m_status && FD_ISSET(m_sock,wfdp) ){ + int error = 0; + socklen_t n = sizeof(error); + (*nfds)--; + FD_CLR(m_sock, wfdp); + if(getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n) < 0 || + error != 0 ){ +- if( ECONNREFUSED != error ) +- fprintf(stderr,"warn, connect to tracker failed. %s\n",strerror(error)); +- else +- m_connect_refuse_click++; ++ if( ECONNREFUSED != error ){ ++ fprintf(stderr,"warn, connect to tracker failed. %s\n",strerror(error)); ++ if(arg_ctcs){ ++ char ctcsinfo[256]; ++ snprintf(ctcsinfo,256, ++ "warn, connect to tracker failed. %s\n",strerror(error)); ++ CTCS.Send_Info(ctcsinfo); ++ } ++ }else ++ m_connect_refuse_click++; + Reset(15); + return -1; + }else{ if( SendRequest() == 0 ) m_status = T_READY; else { Reset(15); return -1; } } - }else if(FD_ISSET(m_sock, rfdp) ){ ++ }else if( T_CONNECTING == m_status && FD_ISSET(m_sock,rfdp) ){ ++ int error = 0; ++ socklen_t n = sizeof(error); ++ (*nfds)--; ++ FD_CLR(m_sock, rfdp); ++ getsockopt(m_sock, SOL_SOCKET,SO_ERROR,&error,&n); ++ fprintf(stderr,"warn, connect to tracker failed. %s\n",strerror(error)); ++ if(arg_ctcs){ ++ char ctcsinfo[256]; ++ snprintf(ctcsinfo,256, ++ "warn, connect to tracker failed. %s\n",strerror(error)); ++ CTCS.Send_Info(ctcsinfo); ++ } ++ Reset(15); ++ return -1; + }else if(INVALID_SOCKET != m_sock && FD_ISSET(m_sock, rfdp) ){ (*nfds)--; FD_CLR(m_sock,rfdp); CheckReponse(); -diff -u ctorrent-1.3.4.orig/tracker.h ctorrent-1.3.4/tracker.h ---- ctorrent-1.3.4.orig/tracker.h 2004-09-09 01:10:51.000000000 +0200 -+++ ctorrent-1.3.4/tracker.h 2005-08-11 23:45:29.436692616 +0200 -@@ -21,6 +21,7 @@ + } + return 0; + } ++ ++void btTracker::Resume() ++{ ++ m_f_pause = m_f_stoped = 0; ++ ++ if( T_FINISHED == m_status ){ ++ m_status = T_FREE; ++ m_f_started = 0; ++ m_interval = 15; ++ } ++} ++ +diff -ur --unidirectional-new-file ctorrent-1.3.4.sav/tracker.h ctorrent-1.3.4/tracker.h +--- ctorrent-1.3.4.sav/tracker.h 2006-06-28 19:00:54.000000000 +0200 ++++ ctorrent-1.3.4/tracker.h 2006-06-28 19:30:02.000000000 +0200 +@@ -1,9 +1,9 @@ + #ifndef TRACKER_H + #define TRACKER_H + ++#include "./def.h" + #include <sys/types.h> + +-#include "./def.h" + #include "./bufio.h" + + #ifdef WINDOWS +@@ -18,9 +18,12 @@ + #include <sys/param.h> + #endif + ++#include "btconfig.h" ++ #define T_FREE 0 #define T_CONNECTING 1 #define T_READY 2 @@ -2127,7 +15388,15 @@ diff -u ctorrent-1.3.4.orig/tracker.h ctorrent-1.3.4/tracker.h class btTracker { -@@ -34,15 +35,20 @@ +@@ -28,21 +31,29 @@ + char m_host[MAXHOSTNAMELEN]; + char m_path[MAXPATHLEN]; + int m_port; ++ char m_key[9]; ++ char m_trackerid[PEER_ID_LEN+1]; + + struct sockaddr_in m_sin; + unsigned char m_status:2; unsigned char m_f_started:1; unsigned char m_f_stoped:1; @@ -2135,7 +15404,8 @@ diff -u ctorrent-1.3.4.orig/tracker.h ctorrent-1.3.4/tracker.h unsigned char m_f_pause:1; - unsigned char m_f_reserved:3; -+ unsigned char m_f_reserved:2; ++ unsigned char m_f_softquit:1; ++ unsigned char m_f_restart:1; time_t m_interval; // 与Tracker通信的时间间隔 @@ -2149,16 +15419,22 @@ diff -u ctorrent-1.3.4.orig/tracker.h ctorrent-1.3.4/tracker.h SOCKET m_sock; BufIo m_reponse_buffer; -@@ -66,6 +72,8 @@ +@@ -65,6 +76,14 @@ + void SetPause() { m_f_pause = 1; } void ClearPause() { m_f_pause = 0; } - -+ void SetStoped() { Reset(15); m_f_stoped = 1; m_last_timestamp -= 15;} ++ int IsPaused() const { return m_f_pause; } ++ void Resume(); ++ void SoftQuit() { m_f_softquit = 1; } ++ void DontQuit() { m_f_softquit = 0; } ++ int IsQuitting() const { return m_f_softquit; } ++ void SetRestart() { m_f_restart = 1; } + ++ void SetStoped() { Reset(15); m_f_stoped = 1; m_last_timestamp -= 15;} + int Connect(); int SendRequest(); - int CheckReponse(); -@@ -73,6 +81,8 @@ +@@ -73,6 +92,8 @@ int SocketReady(fd_set *rfdp, fd_set *wfdp, int *nfds); size_t GetRefuseClick() const { return m_connect_refuse_click; } |