[tor-commits] [tor/master] Clean the contrib directory with torch and machete.

nickm at torproject.org nickm at torproject.org
Mon Apr 28 16:03:06 UTC 2014


commit 9230bc7c65cec68c66fa9c75751d6c6bd600e9fc
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Apr 28 11:34:53 2014 -0400

    Clean the contrib directory with torch and machete.
    
    We've accumulated a lot of cruft in this directory over the years: so
    much, that it passed the point of being so disorganized that we no
    longer browsed through it to see how bad it had gotten.
    
    This patch (based on changes by rl1987) tries to remove the most
    useless items, and split the others into reasonable directories.  It
    creates a new scripts/ directory for maint and test scripts.
    
    This patch was generated with the script below.  No other changes are made in
    this patch.
    
    #############
    # new directories
    mkdir -p contrib/test-tools
    mkdir -p contrib/or-tools
    mkdir -p contrib/dirauth-tools
    mkdir -p contrib/operator-tools
    mkdir -p contrib/client-tools
    mkdir -p contrib/test-tools
    mkdir -p contrib/dist
    mkdir -p contrib/dist/suse
    mkdir -p contrib/win32build
    
    mkdir -p scripts/maint
    mkdir -p scripts/test
    
    ############
    # Deleted -- nobody who wants this is going to be looking for it here any
    # longer.  Also, nobody wants it.
    git rm contrib/auto-naming/README
    
    # Deleted: We no longer do polipo.
    git rm contrib/polipo/Makefile.mingw
    git rm contrib/polipo/README
    git rm contrib/polipo/polipo-mingw.nsi
    
    # We haven't even tried to run this for ages. It is a relic of a bygone era
    git rm contrib/mdd.py
    
    # contrib/dir-tools/directory-archive/
    # Tools for running a directory archive. No longer used - deleting them.
    git rm contrib/directory-archive/crontab.sample
    git rm contrib/directory-archive/fetch-all
    git rm contrib/directory-archive/fetch-all-v3
    git rm contrib/directory-archive/tar-them-up
    git rm contrib/directory-archive/fetch-all-functions
    git rm contrib/directory-archive/sort-into-month-folder
    
    # This appears to be related to very old windows packaging stuff.
    git rm contrib/bundle.nsi
    git rm contrib/package_nsis-weasel.sh
    git rm contrib/package_nsis.sh
    git rm contrib/netinst.nsi
    git rm contrib/torinst32.ico
    git rm contrib/xenobite.ico
    
    # This should not be needed for cross-compilation any more, should it?
    git rm contrib/cross.sh
    
    # I don't think anyone ever used this.
    git rm contrib/make-signature.sh
    
    # These are attempts to send tor controller commands from the command-line.
    # They don't support modern authentication.
    git rm contrib/tor-ctrl.sh
    
    # this is for fetching about a tor server from a dirauth. But it
    # doesn't authenticate the dirauth: yuck.
    git rm contrib/sd
    
    # wow, such unused, very perl4.
    git rm contrib/tor-stress
    
    ####### contrib/dirauth-tools/
    # Tools for running a directory authority
    
    git mv contrib/add-tor contrib/dirauth-tools/
    git mv contrib/nagios-check-tor-authority-cert contrib/dirauth-tools/
    
    #######
    # contrib/or-tools/
    # Tools for examining relays
    git mv contrib/check-tor contrib/or-tools/check-tor
    git mv contrib/checksocks.pl contrib/or-tools/checksocks.pl
    git mv contrib/exitlist contrib/or-tools/exitlist
    
    #######
    # contrib/operator-tools
    
    # Tools for running a relay.
    git mv contrib/linux-tor-prio.sh contrib/operator-tools/linux-tor-prio.sh
    git mv contrib/tor-exit-notice.html contrib/operator-tools/tor-exit-notice.html
    git mv contrib/tor.logrotate.in contrib/operator-tools/
    
    ######
    # contrib/dist
    
    git mv contrib/rc.subr contrib/dist/
    git mv contrib/tor.sh.in contrib/dist/
    git mv contrib/torctl.in contrib/dist/
    git mv contrib/suse/* contrib/dist/suse/
    
    ######
    # client-tools
    git mv contrib/torify contrib/client-tools/torify
    git mv contrib/tor-resolve.py contrib/client-tools/
    
    ######
    # win32build
    
    git mv contrib/package_nsis-mingw.sh contrib/win32build/
    git mv contrib/tor.nsi.in contrib/win32build/
    # Erinn didn't ask for this...
    git mv contrib/tor-mingw.nsi.in contrib/win32build/
    git mv contrib/tor.ico contrib/win32build/
    
    ######
    # scripts/test
    git mv contrib/cov-blame scripts/test/cov-blame
    git mv contrib/cov-diff scripts/test/cov-diff
    git mv contrib/coverage scripts/test/coverage
    git mv contrib/scan-build.sh scripts/test/
    
    ######## scripts/maint
    # Maintainance scripts
    #
    # These are scripts for developers to use when hacking on Tor.  They mostly
    # look at the Tor source in one way or another.
    git mv contrib/findMergedChanges.pl scripts/maint/findMergedChanges.pl
    git mv contrib/checkOptionDocs.pl scripts/maint/checkOptionDocs.pl
    git mv contrib/checkSpace.pl scripts/maint/checkSpace.pl
    git mv contrib/redox.py scripts/maint/redox.py
    git mv contrib/updateVersions.pl scripts/maint/updateVersions.pl
    git mv contrib/checkLogs.pl scripts/maint/checkLogs.pl
    git mv contrib/format_changelog.py scripts/maint/
---
 contrib/add-tor                                    |  115 -------
 contrib/auto-naming/README                         |    6 -
 contrib/bundle.nsi                                 |   67 ----
 contrib/check-tor                                  |   41 ---
 contrib/checkLogs.pl                               |   51 ----
 contrib/checkOptionDocs.pl                         |   70 -----
 contrib/checkSpace.pl                              |  138 ---------
 contrib/checksocks.pl                              |   83 -----
 contrib/client-tools/tor-resolve.py                |  153 ++++++++++
 contrib/client-tools/torify                        |   61 ++++
 contrib/cov-blame                                  |   48 ---
 contrib/cov-diff                                   |   17 --
 contrib/coverage                                   |   46 ---
 contrib/cross.sh                                   |  195 ------------
 contrib/dirauth-tools/add-tor                      |  115 +++++++
 .../dirauth-tools/nagios-check-tor-authority-cert  |   86 ++++++
 contrib/directory-archive/crontab.sample           |    3 -
 contrib/directory-archive/fetch-all                |   77 -----
 contrib/directory-archive/fetch-all-functions      |   82 -----
 contrib/directory-archive/fetch-all-v3             |  111 -------
 contrib/directory-archive/sort-into-month-folder   |   74 -----
 contrib/directory-archive/tar-them-up              |  127 --------
 contrib/dist/rc.subr                               |   43 +++
 contrib/dist/suse/include.am                       |    1 +
 contrib/dist/suse/tor.sh.in                        |  118 +++++++
 contrib/dist/tor.sh.in                             |  123 ++++++++
 contrib/dist/torctl.in                             |  195 ++++++++++++
 contrib/exitlist                                   |  323 --------------------
 contrib/findMergedChanges.pl                       |   73 -----
 contrib/format_changelog.py                        |  162 ----------
 contrib/linux-tor-prio.sh                          |  192 ------------
 contrib/make-signature.sh                          |   79 -----
 contrib/mdd.py                                     |  169 ----------
 contrib/nagios-check-tor-authority-cert            |   86 ------
 contrib/netinst.nsi                                |   74 -----
 contrib/operator-tools/linux-tor-prio.sh           |  192 ++++++++++++
 contrib/operator-tools/tor-exit-notice.html        |  144 +++++++++
 contrib/operator-tools/tor.logrotate.in            |   14 +
 contrib/or-tools/check-tor                         |   41 +++
 contrib/or-tools/checksocks.pl                     |   83 +++++
 contrib/or-tools/exitlist                          |  323 ++++++++++++++++++++
 contrib/package_nsis-mingw.sh                      |   95 ------
 contrib/package_nsis-weasel.sh                     |   90 ------
 contrib/package_nsis.sh                            |   57 ----
 contrib/polipo/Makefile.mingw                      |  100 ------
 contrib/polipo/README                              |   47 ---
 contrib/polipo/polipo-mingw.nsi                    |  172 -----------
 contrib/rc.subr                                    |   43 ---
 contrib/redox.py                                   |  228 --------------
 contrib/scan-build.sh                              |   49 ---
 contrib/sd                                         |   84 -----
 contrib/suse/include.am                            |    1 -
 contrib/suse/tor.sh.in                             |  118 -------
 contrib/tor-ctrl.sh                                |  212 -------------
 contrib/tor-exit-notice.html                       |  144 ---------
 contrib/tor-mingw.nsi.in                           |  274 -----------------
 contrib/tor-resolve.py                             |  153 ----------
 contrib/tor-stress                                 |   27 --
 contrib/tor.ico                                    |  Bin 82726 -> 0 bytes
 contrib/tor.logrotate.in                           |   14 -
 contrib/tor.nsi.in                                 |  214 -------------
 contrib/tor.sh.in                                  |  123 --------
 contrib/torctl.in                                  |  195 ------------
 contrib/torify                                     |   61 ----
 contrib/torinst32.ico                              |  Bin 4286 -> 0 bytes
 contrib/updateVersions.pl                          |   59 ----
 contrib/win32build/package_nsis-mingw.sh           |   95 ++++++
 contrib/win32build/tor-mingw.nsi.in                |  274 +++++++++++++++++
 contrib/win32build/tor.ico                         |  Bin 0 -> 82726 bytes
 contrib/win32build/tor.nsi.in                      |  214 +++++++++++++
 contrib/xenobite.ico                               |  Bin 1150 -> 0 bytes
 scripts/maint/checkLogs.pl                         |   51 ++++
 scripts/maint/checkOptionDocs.pl                   |   70 +++++
 scripts/maint/checkSpace.pl                        |  138 +++++++++
 scripts/maint/findMergedChanges.pl                 |   73 +++++
 scripts/maint/format_changelog.py                  |  162 ++++++++++
 scripts/maint/redox.py                             |  228 ++++++++++++++
 scripts/maint/updateVersions.pl                    |   59 ++++
 scripts/test/cov-blame                             |   48 +++
 scripts/test/cov-diff                              |   17 ++
 scripts/test/coverage                              |   46 +++
 scripts/test/scan-build.sh                         |   49 +++
 82 files changed, 3216 insertions(+), 5069 deletions(-)

diff --git a/contrib/add-tor b/contrib/add-tor
deleted file mode 100755
index 5a12abc..0000000
--- a/contrib/add-tor
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/usr/bin/ruby
-
-# add-tor  -  Add a tor fingerprint line to the approved-routers file
-#
-# Tor's approved-routers file is expected to be versioned using RCS.
-# This script checks for uncommitted changes, does a checkout of the
-# file, adds the new fingerprint with a comment stating the server's
-# operator, and commits the file to RCS again (using -u so that the
-# working copy is not removed.
-#
-# Operator and fingerprint line are read from stdin.
-#
-# Before adding a fingerprint line, approved-routers is checked for
-# rough syntactical correctness.  This script also checks that the
-# nickname and fingerprint to be added do not already exist in the
-# binding list.
-
-
-# Copyright (c) 2006 by Peter Palfrader
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-BINDING = '/etc/tor/approved-routers'
-
-def mysys(cmd)
-	unless system(cmd)
-		STDERR.puts "ERROR: #{cmd} failed"
-		exit 1
-	end
-end
-
-def check_nick(n)
-	n =~ /^[a-zA-Z0-9]+$/
-end
-
-def check_fpr(fpr)
-	fpr =~ /^([0-9A-F]{4} ){9}[0-9A-F]{4}$/
-end
-
-def parse_fprline(fprline)
-	n = fprline[0 ... fprline.index(' ')]
-	f = fprline[fprline.index(' ') + 1 .. -1 ]
-	unless check_nick(n) and check_fpr(f)
-		STDERR.puts "Invalid fpr syntax '#{fprline}'"
-		exit 1
-	end
-	[n, f]
-end
-
-
-
-unless system("rcsdiff -q -u #{BINDING}")
-	STDERR.puts "Uncommitted changes in #{BINDING}.  Aborting."
-	exit 1
-end
-
-puts "Checking out #{BINDING}..."
-mysys("co -l #{BINDING}")
-
-print "Operator: "
- at operator = readline.chop
-unless @operator.index('@')
-	STDERR.puts "ERROR: No @ found"
-	exit 1
-end
-
-print "FPR Line: "
- at fprline = readline.chop
-(@nickname, @fpr) = parse_fprline(@fprline)
-
-binding = File.new(BINDING,  "r+")
-binding.readlines.each do |line|
-	line.chop!
-	next if line[0..0] == "#"
-	(n,f) = parse_fprline(line)
-	if (n == @nickname)
-		STDERR.puts
-		STDERR.puts "ERROR: Nickname #{n} already exists in #{BINDING} (fpr: #{f})"
-		exit 1
-	end
-	if (f == @fpr)
-		STDERR.puts
-		STDERR.puts "ERROR: Fpr #{f} already exists in #{BINDING} (nickname: #{n})"
-		exit 1
-	end
-end
-
-puts
-puts '| # ' + @operator
-puts '| '   + @fprline
-puts
-
-binding.puts '# '+ at operator
-binding.puts @fprline
-binding.close
-
-puts "Committing #{BINDING}..."
-mysys("ci -u -m'Add #{@nickname}' #{BINDING}")
diff --git a/contrib/auto-naming/README b/contrib/auto-naming/README
deleted file mode 100644
index e2f9ff8..0000000
--- a/contrib/auto-naming/README
+++ /dev/null
@@ -1,6 +0,0 @@
-Tor directory authorities may maintain a binding of server identities
-(their long term identity key) and nicknames.
-
-The auto-naming scripts have been moved to svn in
-projects/tor-naming/auto-naming/trunk/
-
diff --git a/contrib/bundle.nsi b/contrib/bundle.nsi
deleted file mode 100644
index 55f6b5f..0000000
--- a/contrib/bundle.nsi
+++ /dev/null
@@ -1,67 +0,0 @@
-!include "MUI.nsh"
-!include "LogicLib.nsh"
-!include "FileFunc.nsh"
-  
-!define VERSION "0.2.1.13"
-!define INSTALLER "TorBundle.exe"
-!define WEBSITE "https://www.torproject.org/"
-!define LICENSE "LICENSE"
- 
-SetCompressor /SOLID BZIP2
-RequestExecutionLevel user
-OutFile ${INSTALLER}
-InstallDir "$LOCALAPPDATA\TorInstPkgs"
-SetOverWrite on
-Name "Tor ${VERSION} Bundle"
-Caption "Tor ${VERSION} Bundle Setup"
-BrandingText "Tor Bundle Installer"
-CRCCheck on
-XPStyle on
-ShowInstDetails hide
-VIProductVersion "${VERSION}"
-VIAddVersionKey "ProductName" "Tor"
-VIAddVersionKey "Comments" "${WEBSITE}"
-VIAddVersionKey "LegalTrademarks" "Three line BSD"
-VIAddVersionKey "LegalCopyright" "©2004-2011, Roger Dingledine, Nick Mathewson, The Tor Project, Inc."
-VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}"
-VIAddVersionKey "FileVersion" "${VERSION}"
-
-!define MUI_ICON "torinst32.ico"
-!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_LANGUAGE "English"
-
-Section "Tor" Tor
-	SectionIn RO
-	SetOutPath $INSTDIR
-	Call ExtractPackages
-        Call RunInstallers
-	Call LaunchVidalia
-SectionEnd
-
-Function ExtractPackages
-	File "license.msi"
-	File "tor.msi"
-	File "torbutton.msi"
-	File "thandy.msi"
-	File "polipo.msi"
-	File "vidalia.msi"
-        File "tbcheck.bat"
-FunctionEnd
-
-Function RunInstallers
-	ExecWait 'msiexec /i "$INSTDIR\license.msi" /qn'
-	ExecWait 'msiexec /i "$INSTDIR\tor.msi" NOSC=1 /qn'
-	ExecWait 'msiexec /i "$INSTDIR\thandy.msi" NOSC=1 /qn'
-	ExecWait 'msiexec /i "$INSTDIR\polipo.msi" NOSC=1 /qn'
-	ExecWait 'msiexec /i "$INSTDIR\torbutton.msi" /qn'
-	ExecWait 'msiexec /i "$INSTDIR\vidalia.msi" /qn'
-        ExpandEnvStrings $0 %COMSPEC%
-        Exec '"$0" /C "$INSTDIR\tbcheck.bat"'
-FunctionEnd
-
-Function LaunchVidalia
-	SetOutPath "$LOCALAPPDATA\Programs\Vidalia"
-	Exec 'vidalia.exe -loglevel info -logfile log.txt'
-FunctionEnd
-
diff --git a/contrib/check-tor b/contrib/check-tor
deleted file mode 100755
index e981a35..0000000
--- a/contrib/check-tor
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/bin/sh
-
-## Originally written by Peter Palfrader.
-
-## This script lets you quickly check if a given router (by nickname)
-## will let you do a TLS handshake, or will let you download a directory.
-
-## Usage: check-tor nickname
-
-#set -x
-
-router="$1"
-dirserver="http://belegost.seul.org:80/tor/"
-
-lines=$( wget -q $dirserver --proxy=off -O - | grep -A5 '^router '"$router"' ' )
-line=$( echo "$lines" | head -n1 )
-
-if [ -z "$line" ]; then
-	echo "Not found" >&2
-	exit 1
-fi
-
-echo "$lines"
-echo
-
-ipor=$( echo "$line" | awk '{printf "%s:%s", $3, $4}' )
-
-op=$( echo "$line" | awk '{printf $6}' )
-ipop=$( echo "$line" | awk '{printf "%s:%s", $3, $6}' )
-
-echo
-echo ">>" openssl s_client -connect "$ipor"
-timeout 5 openssl s_client -connect "$ipor" < /dev/null
-if [ "$op" != "0" ]; then
-	echo
-	echo ">>" wget --proxy=off -O - http://$ipop/tor/
-	timeout 5 wget --proxy=off -O - http://$ipop/tor/ | head -n3
-fi
-
-echo
-echo -n "$router "; echo "$lines" | grep 'fingerprint' | sed -e 's/^opt //' -e 's/^fingerprint //';
diff --git a/contrib/checkLogs.pl b/contrib/checkLogs.pl
deleted file mode 100755
index b00503e..0000000
--- a/contrib/checkLogs.pl
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-
-my %count = ();
-my $more = 0;
-my $last = "";
-
-while (<>) {
-    if ($more) {
-        if (/LD_BUG/) {
-            $more = 0;
-            next;
-        }
-        if (/\"((?:[^\"\\]+|\\.*)+)\"(.*)/) {
-            $last .= $1;
-            if ($2 !~ /[,\)]/) {
-                $more = 1;
-            } else {
-                $count{lc $last}++;
-                $more = 0;
-            }
-        } elsif (/[,\)]/) {
-            $count{lc $last}++;
-            $more = 0;
-        } elsif ($more == 2) {
-            print "SKIPPED more\n";
-        }
-    } elsif (/log_(?:warn|err|notice)\(\s*(LD_[A-Z_]*)\s*,\s*\"((?:[^\"\\]+|\\.)*)\"(.*)/) {
-        next if ($1 eq 'LD_BUG');
-        my $s = $2;
-        if ($3 =~ /[,\)]/ ) {
-            $count{lc $s}++;
-        } else {
-            $more = 1;
-            $last = $s;
-        }
-    } elsif (/log_(?:warn|err|notice)\(\s*((?:LD_[A-Z_]*)?)(.*)/) {
-        next if ($1 eq 'LD_BUG');
-        my $extra = $2;
-        chomp $extra;
-        $last = "";
-        $more = 2 if ($extra eq '');
-    }
-}
-
-while ((my $phrase, my $count) = each %count) {
-    if ($count > 1) {
-        print "$count\t$phrase\n";
-    }
-}
diff --git a/contrib/checkOptionDocs.pl b/contrib/checkOptionDocs.pl
deleted file mode 100755
index 23e57b4..0000000
--- a/contrib/checkOptionDocs.pl
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-
-my %options = ();
-my %descOptions = ();
-my %torrcSampleOptions = ();
-my %manPageOptions = ();
-
-# Load the canonical list as actually accepted by Tor.
-open(F, "./src/or/tor --list-torrc-options |") or die;
-while (<F>) {
-    next if m!\[notice\] Tor v0\.!;
-    if (m!^([A-Za-z0-9_]+)!) {
-        $options{$1} = 1;
-    } else {
-        print "Unrecognized output> ";
-        print;
-    }
-}
-close F;
-
-# Load the contents of torrc.sample
-sub loadTorrc {
-    my ($fname, $options) = @_;
-    local *F;
-    open(F, "$fname") or die;
-    while (<F>) {
-        next if (m!##+!);
-        if (m!#([A-Za-z0-9_]+)!) {
-            $options->{$1} = 1;
-        }
-    }
-    close F;
-    0;
-}
-
-loadTorrc("./src/config/torrc.sample.in", \%torrcSampleOptions);
-
-# Try to figure out what's in the man page.
-
-my $considerNextLine = 0;
-open(F, "./doc/tor.1.txt") or die;
-while (<F>) {
-    if (m!^\*\*([A-Za-z0-9_]+)\*\*!) {
-        $manPageOptions{$1} = 1;
-    }
-}
-close F;
-
-# Now, display differences:
-
-sub subtractHashes {
-    my ($s, $a, $b) = @_;
-    my @lst = ();
-    for my $k (keys %$a) {
-        push @lst, $k unless (exists $b->{$k});
-    }
-    print "$s: ", join(' ', sort @lst), "\n\n";
-    0;
-}
-
-# subtractHashes("No online docs", \%options, \%descOptions);
-# subtractHashes("Orphaned online docs", \%descOptions, \%options);
-
-subtractHashes("Orphaned in torrc.sample.in", \%torrcSampleOptions, \%options);
-
-subtractHashes("Not in man page", \%options, \%manPageOptions);
-subtractHashes("Orphaned in man page", \%manPageOptions, \%options);
-
-
diff --git a/contrib/checkSpace.pl b/contrib/checkSpace.pl
deleted file mode 100755
index 682dbce..0000000
--- a/contrib/checkSpace.pl
+++ /dev/null
@@ -1,138 +0,0 @@
-#!/usr/bin/perl -w
-
-if ($ARGV[0] =~ /^-/) {
-    $lang = shift @ARGV;
-    $C = ($lang eq '-C');
-#    $TXT = ($lang eq '-txt');
-}
-
-for $fn (@ARGV) {
-    open(F, "$fn");
-    $lastnil = 0;
-    $lastline = "";
-    $incomment = 0;
-    while (<F>) {
-        ## Warn about windows-style newlines.
-        if (/\r/) {
-            print "       CR:$fn:$.\n";
-        }
-        ## Warn about tabs.
-        if (/\t/) {
-            print "      TAB:$fn:$.\n";
-        }
-        ## Warn about markers that don't have a space in front of them
-        if (/^[a-zA-Z_][a-zA-Z_0-9]*:/) {
-            print "nosplabel:$fn:$.\n";
-        }
-        ## Warn about trailing whitespace.
-        if (/ +$/) {
-            print "Space\@EOL:$fn:$.\n";
-        }
-        ## Warn about control keywords without following space.
-        if ($C && /\s(?:if|while|for|switch)\(/) {
-            print "      KW(:$fn:$.\n";
-        }
-        ## Warn about #else #if instead of #elif.
-        if (($lastline =~ /^\# *else/) and ($_ =~ /^\# *if/)) {
-            print " #else#if:$fn:$.\n";
-        }
-        ## Warn about some K&R violations
-        if (/^\s+\{/ and $lastline =~ /^\s*(if|while|for|else if)/ and
-	    $lastline !~ /\{$/) {
-            print "non-K&R {:$fn:$.\n";
-	}
-        if (/^\s*else/ and $lastline =~ /\}$/) {
-	    print "  }\\nelse:$fn:$.\n";
-	}
-        $lastline = $_;
-        ## Warn about unnecessary empty lines.
-        if ($lastnil && /^\s*}\n/) {
-            print "  UnnecNL:$fn:$.\n";
-        }
-        ## Warn about multiple empty lines.
-        if ($lastnil && /^$/) {
-            print " DoubleNL:$fn:$.\n";
-        } elsif (/^$/) {
-            $lastnil = 1;
-        } else {
-            $lastnil = 0;
-        }
-        ## Terminals are still 80 columns wide in my world.  I refuse to
-        ## accept double-line lines.
-        if (/^.{80}/) {
-            print "     Wide:$fn:$.\n";
-        }
-        ### Juju to skip over comments and strings, since the tests
-        ### we're about to do are okay there.
-        if ($C) {
-            if ($incomment) {
-                if (m!\*/!) {
-                    s!.*?\*/!!;
-                    $incomment = 0;
-                } else {
-                    next;
-                }
-            }
-            if (m!/\*.*?\*/!) {
-                s!\s*/\*.*?\*/!!;
-            } elsif (m!/\*!) {
-                s!\s*/\*!!;
-                $incomment = 1;
-                next;
-            }
-            s!"(?:[^\"]+|\\.)*"!"X"!g;
-            next if /^\#/;
-            ## Warn about C++-style comments.
-            if (m!//!) {
-                #    print "       //:$fn:$.\n";
-                s!//.*!!;
-            }
-            ## Warn about unquoted braces preceded by non-space.
-            if (/([^\s'])\{/) {
-                print "       $1\{:$fn:$.\n";
-            }
-            ## Warn about multiple internal spaces.
-            #if (/[^\s,:]\s{2,}[^\s\\=]/) {
-            #    print "     X  X:$fn:$.\n";
-            #}
-            ## Warn about { with stuff after.
-            #s/\s+$//;
-            #if (/\{[^\}\\]+$/) {
-            #    print "     {X:$fn:$.\n";
-            #}
-            ## Warn about function calls with space before parens.
-            if (/(\w+)\s\(([A-Z]*)/) {
-                if ($1 ne "if" and $1 ne "while" and $1 ne "for" and
-                    $1 ne "switch" and $1 ne "return" and $1 ne "int" and
-                    $1 ne "elsif" and $1 ne "WINAPI" and $2 ne "WINAPI" and
-                    $1 ne "void" and $1 ne "__attribute__" and $1 ne "op") {
-                    print "     fn ():$fn:$.\n";
-                }
-            }
-            ## Warn about functions not declared at start of line.
-            if ($in_func_head ||
-                ($fn !~ /\.h$/ && /^[a-zA-Z0-9_]/ &&
-                 ! /^(?:const |static )*(?:typedef|struct|union)[^\(]*$/ &&
-                 ! /= *\{$/ && ! /;$/)) {
-                if (/.\{$/){
-                    print "fn() {:$fn:$.\n";
-                    $in_func_head = 0;
-                } elsif (/^\S[^\(]* +\**[a-zA-Z0-9_]+\(/) {
-                    $in_func_head = -1; # started with tp fn
-                } elsif (/;$/) {
-                    $in_func_head = 0;
-                } elsif (/\{/) {
-                    if ($in_func_head == -1) {
-                        print "tp fn():$fn:$.\n";
-                    }
-                    $in_func_head = 0;
-                }
-            }
-        }
-    }
-    if (! $lastnil) {
-        print "  EOL\@EOF:$fn:$.\n";
-    }
-    close(F);
-}
-
diff --git a/contrib/checksocks.pl b/contrib/checksocks.pl
deleted file mode 100755
index 3fcc0df..0000000
--- a/contrib/checksocks.pl
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/usr/bin/perl -w
-
-require 5.005;
-use strict;
-use IO::Socket;
-use Getopt::Std;
-
-# Checks routers for open socks-ports and socks5
-# Successful connects go to STDOUT, failed ones to STDERR.
-# We only do one check per loop in -d mode, so it takes some time.
-
-# Contributed by Peter Kornherr <peter at wuschelpuschel dot org>, and
-# cleaned up by Peter Palfrader <peter at palfrader dot org>.
-
-our($opt_i,$opt_p,$opt_d,$opt_h,$opt_l);
-getopts('i:p:dhl:');
-
-if ($opt_h || !($opt_d||$opt_i||$opt_l)) {
-    print "Usage: $0 -d < file_with_routers_in_it\n";
-    print "or:    $0 -i IP -p Port\n";
-    print "or:    $0 -l IP:Port\n";
-    exit;
-}
-
-if ($opt_d) {
-    open (IN,"<-") or die $!;
-    while (<IN>) {
-        next unless /^router /;
-        (my $routername,my $checkip,my $checkport) = (split(" "))[1,2,4];
-        &do_check($checkip,$checkport,$routername);
-    }
-} elsif ($opt_i && $opt_p) {
-    &do_check($opt_i,$opt_p);
-} elsif ($opt_l) {
-    &do_check(split(":",$opt_l));
-}
-
-sub do_check {
-    (my $checkip, my $checkport,my $routername) = @_;
-    # as socksports may not be published (therefore "0") here,
-    # let's try 9050, the default port:
-    if ($checkport == 0) { $checkport = 9050; }
-    # print "Checking $checkip:$checkport\n";
-    my $s5socket = IO::Socket::INET->new(PeerAddr => $checkip,
-        PeerPort => $checkport, Proto => "tcp", Type => SOCK_STREAM,
-        Timeout => "20");
-    if ($s5socket) {
-        my @got;
-        print $s5socket pack("CCC",'5','1','0');
-        eval {
-            local $SIG{ALRM} = sub { die "alarm\n" };
-            alarm 10;
-            read ($s5socket,$got[0],1);
-            read ($s5socket,$got[1],1);
-            alarm 0;
-        };
-        if ($@) {
-            return; # die unless $@ eq "alarm\n";
-        }
-        if ($got[0] eq pack('C','5')) {
-            if(defined($routername)) {
-                print "Found SOCKS5 at $routername ($checkip:$checkport)\n";
-            } else {
-                print "Found SOCKS5 at $checkip:$checkport\n";
-            }
-        } else {
-            if(defined($routername)) {
-                print "$routername ($checkip:$checkport) answers - " .
-                      "but not SOCKS5.\n";
-            } else {
-                print "$checkip:$checkport answers - but not SOCKS5.\n";
-            }
-        }
-    } else {
-        if(defined($routername)) {
-            print STDERR "Can't connect to $routername " .
-                         "($checkip:$checkport) ($!)\n";
-        } else {
-            print STDERR "Can't connect to $checkip:$checkport ($!)\n";
-        }
-    }
-}
-
diff --git a/contrib/client-tools/tor-resolve.py b/contrib/client-tools/tor-resolve.py
new file mode 100755
index 0000000..47ae1a0
--- /dev/null
+++ b/contrib/client-tools/tor-resolve.py
@@ -0,0 +1,153 @@
+#!/usr/bin/python
+
+import socket
+import struct
+import sys
+
+def socks4AResolveRequest(hostname):
+    version = 4
+    command = 0xF0
+    port = 0
+    addr = 0x0000001
+    username = ""
+    reqheader = struct.pack("!BBHL", version, command, port, addr)
+    return "%s%s\x00%s\x00"%(reqheader,username,hostname)
+
+def socks4AParseResponse(response):
+    RESPONSE_LEN = 8
+    if len(response) < RESPONSE_LEN:
+        return None
+    assert len(response) >= RESPONSE_LEN
+    version,status,port = struct.unpack("!BBH",response[:4])
+    assert version == 0
+    assert port == 0
+    if status == 90:
+        return "%d.%d.%d.%d"%tuple(map(ord, response[4:]))
+    else:
+        return "ERROR (status %d)"%status
+
+def socks5Hello():
+    return "\x05\x01\x00"
+def socks5ParseHello(response):
+    if response != "\x05\x00":
+        raise ValueError("Bizarre socks5 response")
+def socks5ResolveRequest(hostname, atype=0x03, command=0xF0):
+    version = 5
+    rsv = 0
+    port = 0
+    reqheader = struct.pack("!BBBB",version, command, rsv, atype)
+    if atype == 0x03:
+        reqheader += struct.pack("!B", len(hostname))
+    portstr = struct.pack("!H",port)
+    return "%s%s%s"%(reqheader,hostname,portstr)
+
+def socks5ParseResponse(r):
+    if len(r)<8:
+        return None
+    version, reply, rsv, atype = struct.unpack("!BBBB",r[:4])
+    assert version==5
+    assert rsv==0
+    if reply != 0x00:
+        return "ERROR",reply
+    assert atype in (0x01,0x03,0x04)
+    if atype != 0x03:
+        expected_len = 4 + ({1:4,4:16}[atype]) + 2
+        if len(r) < expected_len:
+            return None
+        elif len(r) > expected_len:
+            raise ValueError("Overlong socks5 reply!")
+        addr = r[4:-2]
+        if atype == 0x01:
+            return "%d.%d.%d.%d"%tuple(map(ord,addr))
+        else:
+            # not really the right way to format IPv6
+            return "IPv6: %s"%(":".join([hex(ord(c)) for c in addr]))
+    else:
+        hlen, = struct.unpack("!B", r[4])
+        expected_len = 5 + hlen + 2
+        if len(r) < expected_len:
+            return None
+        return r[5:-2]
+
+def socks5ResolvePTRRequest(hostname):
+    return socks5ResolveRequest(socket.inet_aton(hostname),
+                                atype=1, command = 0xF1)
+
+
+def parseHostAndPort(h):
+    host, port = "localhost", 9050
+    if ":" in h:
+        i = h.index(":")
+        host = h[:i]
+        try:
+            port = int(h[i+1:])
+        except ValueError:
+            print "Bad hostname %r"%h
+            sys.exit(1)
+    elif h:
+        try:
+            port = int(h)
+        except ValueError:
+            host = h
+
+    return host, port
+
+def resolve(hostname, sockshost, socksport, socksver=4, reverse=0):
+    assert socksver in (4,5)
+    if socksver == 4:
+        fmt = socks4AResolveRequest
+        parse = socks4AParseResponse
+    elif not reverse:
+        fmt = socks5ResolveRequest
+        parse = socks5ParseResponse
+    else:
+        fmt = socks5ResolvePTRRequest
+        parse = socks5ParseResponse
+
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    s.connect((sockshost,socksport))
+    if socksver == 5:
+        s.send(socks5Hello())
+        socks5ParseHello(s.recv(2))
+    s.send(fmt(hostname))
+    answer = s.recv(6)
+    result = parse(answer)
+    while result is None:
+        more = s.recv(1)
+        if not more:
+            return None
+        answer += more
+        result = parse(answer)
+    print "Got answer",result
+    m = s.recv(1)
+    if m:
+        print "Got extra data too: %r"%m
+    return result
+
+if __name__ == '__main__':
+    if len(sys.argv) not in (2,3,4):
+        print "Syntax: resolve.py [-4|-5] hostname [sockshost:socksport]"
+        sys.exit(0)
+    socksver = 4
+    reverse = 0
+    while sys.argv[1][0] == '-':
+        if sys.argv[1] in ("-4", "-5"):
+            socksver = int(sys.argv[1][1])
+            del sys.argv[1]
+        elif sys.argv[1] == '-x':
+            reverse = 1
+            del sys.argv[1]
+        elif sys.argv[1] == '--':
+            break
+
+    if len(sys.argv) >= 4:
+        print "Syntax: resolve.py [-x] [-4|-5] hostname [sockshost:socksport]"
+        sys.exit(0)
+    if len(sys.argv) == 3:
+        sh,sp = parseHostAndPort(sys.argv[2])
+    else:
+        sh,sp = parseHostAndPort("")
+
+    if reverse and socksver == 4:
+        socksver = 5
+    resolve(sys.argv[1], sh, sp, socksver, reverse)
diff --git a/contrib/client-tools/torify b/contrib/client-tools/torify
new file mode 100755
index 0000000..54acfed
--- /dev/null
+++ b/contrib/client-tools/torify
@@ -0,0 +1,61 @@
+#! /bin/sh
+
+# This script used to call (the now deprecated) tsocks as a fallback in case
+# torsocks wasn't installed.
+# Now, it's just a backwards compatible shim around torsocks with reasonable
+# behavior if -v/--verbose or -h/--help arguments are passed.
+#
+# Copyright (c) 2004, 2006, 2009 Peter Palfrader
+# Modified by Jacob Appelbaum <jacob at appelbaum.net> April 16th 2006
+# Stripped of all the tsocks cruft by ugh on February 22nd 2012
+# May be distributed under the same terms as Tor itself
+
+
+compat() {
+	echo "torify is now just a wrapper around torsocks(1) for backwards compatibility."
+}
+
+usage() {
+	compat
+	echo "Usage: $0 [-hv] <command> [<options>...]"
+}
+
+case $# in 0)
+	usage >&2
+	exit 1
+esac
+
+case $# in 1)
+	case $1 in -h|--help)
+		usage
+		exit 0
+	esac
+esac
+
+case $1 in -v|--verbose)
+	compat >&2
+	shift
+esac
+
+# taken from Debian's Developer's Reference, 6.4
+pathfind() {
+       OLDIFS="$IFS"
+       IFS=:
+       for p in $PATH; do
+               if [ -x "$p/$*" ]; then
+                       IFS="$OLDIFS"
+                       return 0
+               fi
+       done
+       IFS="$OLDIFS"
+       return 1
+}
+
+if pathfind torsocks; then
+    exec torsocks "$@"
+    echo "$0: Failed to exec torsocks $@" >&2
+    exit 1
+else
+    echo "$0: torsocks not found in your PATH.  Perhaps it isn't installed?  (tsocks is no longer supported, for security reasons.)" >&2
+fi
+
diff --git a/contrib/cov-blame b/contrib/cov-blame
deleted file mode 100755
index 601f211..0000000
--- a/contrib/cov-blame
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/python
-
-import os
-import re
-import subprocess
-import sys
-
-def handle_file(source_fname, cov_fname):
-   
-   lines_blm = subprocess.Popen(["git", "blame", source_fname], stdout=subprocess.PIPE).stdout.readlines()
-   lines_cov = open(cov_fname).readlines()
-
-   # XXXX expensive!
-   while re.match(r'\s*-:\s*0:', lines_cov[0]):
-      del lines_cov[0]
-
-   if len(lines_blm) != len(lines_cov):
-      print >>sys.stderr, "MISMATCH IN NUMBER OF LINES in",source_fname
-
-   for b,c in zip(lines_blm, lines_cov):
-      m = re.match(r'\s*([^\s:]+):', c)
-      if not m:
-         print >>sys.stderr, "CONFUSING LINE %r"% c
-         cov = 'X'
-      elif m.group(1) == '-':
-         cov = '-'
-      elif m.group(1)[0] == '#':
-         cov = '#'
-      elif m.group(1)[0].isdigit():
-         cov = '1'
-      else:
-         print >>sys.stderr, "CONFUSING LINE %r"% c
-         cov = 'X'
-
-      print cov, b,
-
-COV_DIR = sys.argv[1]
-SOURCES = sys.argv[2:]
-
-for fn in SOURCES:
-   _, base = os.path.split(fn)
-   cfn = os.path.join(COV_DIR, base)
-   cfn += ".gcov"
-   if os.path.exists(cfn):
-      handle_file(fn, cfn)
-   else:
-      print >>sys.stderr, "NO FILE EXISTS CALLED ",cfn
-
diff --git a/contrib/cov-diff b/contrib/cov-diff
deleted file mode 100755
index 33a5480..0000000
--- a/contrib/cov-diff
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-# Copyright 2013  The Tor Project, Inc.
-# See LICENSE for licensing information.
-
-# cov-diff -- compare two directories full of gcov files.
-
-DIRA="$1"
-DIRB="$2"
-
-for A in $DIRA/*; do
-  B=$DIRB/`basename $A`
-  perl -pe 's/^\s*\d+:/        1:/; s/^([^:]+:)[\d\s]+:/$1/;' "$A" > "$A.tmp"
-  perl -pe 's/^\s*\d+:/        1:/; s/^([^:]+:)[\d\s]+:/$1/;' "$B" > "$B.tmp"
-  diff -u "$A.tmp" "$B.tmp"
-  rm "$A.tmp" "$B.tmp"
-done
-
diff --git a/contrib/coverage b/contrib/coverage
deleted file mode 100755
index f4ae475..0000000
--- a/contrib/coverage
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-# Copyright 2013  The Tor Project, Inc.
-# See LICENSE for licensing information.
-
-# coverage -- run gcov on the appropriate set of object files to extract
-# coverage information.
-
-dst=$1
-
-for fn in src/or/*.c src/common/*.c; do
-    BN=`basename $fn`
-    DN=`dirname $fn`
-    F=`echo $BN | sed -e 's/\.c$//;'`
-    GC="${BN}.gcov"
-    # Figure out the object file names
-    ONS=`echo ${DN}/src_*-${F}.o`
-    ONS_WILDCARD_LITERAL="${DN}/src_*-${F}.o"
-    # If the wildcard didn't expand, no files
-    if [ "$ONS" != "${ONS_WILDCARD_LITERAL}" ]
-    then
-      for on in $ONS; do
-        # We should have a gcno file
-        GCNO=`echo $on | sed -e 's/\.o$/\.gcno/;'`
-        if [ -e $GCNO ]
-        then
-          # No need to test for gcda, since gcov assumes no execution
-          # if it's absent
-          rm -f $GC
-          gcov -o $on $fn
-          if [ -e $GC ]
-          then
-            if [ -n $dst ]
-            then
-              mv $GC $dst/$GC
-            fi
-          else
-            echo "gcov -o $on $fn didn't make a .gcov file"
-          fi
-        else
-          echo "Couldn't find gcno file for $on"
-        fi
-      done
-    else
-      echo "No object file found matching source file $fn"
-    fi
-done
diff --git a/contrib/cross.sh b/contrib/cross.sh
deleted file mode 100755
index a6085a4..0000000
--- a/contrib/cross.sh
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/bin/bash
-# Copyright 2006 Michael Mohr with modifications by Roger Dingledine
-# See LICENSE for licensing information.
-
-#######################################################################
-#  Tor-cross: a tool to help cross-compile Tor
-#
-#  The purpose of a cross-compiler is to produce an executable for
-#  one system (CPU) on another.  This is useful, for example, when
-#  the target system does not have a native compiler available.
-#  You might, for example, wish to cross-compile a program on your
-#  host (the computer you're working on now) for a target such as
-#  a router or handheld computer.
-#
-#  A number of environment variables must be set in order for this
-#  script to work:
-#        $PREFIX, $CROSSPATH, $HOST_TRIPLET, $HOST,
-#        and (optionally) $BUILD
-#  Please run the script for a description of each one.  If automated
-#  builds are desired, the above variables can be exported at the top
-#  of this script.
-#
-#  Recent releases of Tor include test programs in configure. Normally
-#  this is a good thing, since it catches a number of problems.
-#  However, this also presents a problem when cross compiling, since
-#  you can't run binary images for the target system on the host.
-#
-#  Tor-cross assumes that you know what you're doing and removes a
-#  number of checks known to cause problems with this process.
-#  Note that this does not guarantee that the program will run or
-#  even compile; it simply allows configure to generate the Makefiles.
-#
-#  Stripping the binaries should almost always be done for an
-#  embedded environment where space is at an exacting premium.
-#  However, the default is NOT to strip them since they are useful for
-#  debugging.  If you do not plan to do any debugging and you
-#  don't care about the debugging symbols, set $STRIP to "yes" before
-#  running this script.
-#
-#  Tor-cross was written by Michael Mohr.  He can be contacted at
-#  m(dot)mohr(at)laposte(dot)net.  Comments are appreciated, but
-#  flames go to /dev/null.
-#
-#  The target with which this script is tested is little-endian
-#  MIPS Linux, built on an Athlon-based Linux desktop.
-#
-#######################################################################
-
-# disable the platform-specific tests in configure
-export CROSS_COMPILE=yes
-
-# for error conditions
-EXITVAL=0
-
-if [ ! -f autogen.sh ]
-then
-  echo "Please run this script from the root of the Tor distribution"
-  exit -1
-fi
-
-if [ ! -f configure ]
-then
-  if [ -z $GEN_BUILD ]
-  then
-    echo "To automatically generate the build environment, set \$GEN_BUILD"
-    echo "to yes; for example,"
-    echo "	export GEN_BUILD=yes"
-    EXITVAL=-1
-  fi
-fi
-
-if [ -z $PREFIX ]
-then
-  echo "You must define \$PREFIX since you are cross-compiling."
-  echo "Select a non-system location (i.e. /tmp/tor-cross):"
-  echo "	export PREFIX=/tmp/tor-cross"
-  EXITVAL=-1
-fi
-
-if [ -z $CROSSPATH ]
-then
-  echo "You must define the location of your cross-compiler's"
-  echo "directory using \$CROSSPATH; for example,"
-  echo "	export CROSSPATH=/opt/cross/staging_dir_mipsel/bin"
-  EXITVAL=-1
-fi
-
-if [ -z $HOST_TRIPLET ]
-then
-  echo "You must define \$HOST_TRIPLET to continue.  For example,"
-  echo "if you normally cross-compile applications using"
-  echo "mipsel-linux-uclibc-gcc, you would set \$HOST_TRIPLET like so:"
-  echo "	export HOST_TRIPLET=mipsel-linux-uclibc-"
-  EXITVAL=-1
-fi
-
-if [ -z $HOST ]
-then
-  echo "You must specify a target processor with \$HOST; for example:"
-  echo "	export HOST=mipsel-unknown-elf"
-  EXITVAL=-1
-fi
-
-if [ -z $BUILD ]
-then
-  echo "You should specify the host machine's type with \$BUILD; for example:"
-  echo "	export BUILD=i686-pc-linux-gnu"
-  echo "If you wish to let configure autodetect the host, set \$BUILD to 'auto':"
-  echo "	export BUILD=auto"
-  EXITVAL=-1
-fi
-
-if [ ! -x $CROSSPATH/$HOST_TRIPLETgcc ]
-then
-  echo "The specified toolchain does not contain an executable C compiler."
-  echo "Please double-check your settings and rerun cross.sh."
-  EXITVAL=-1
-fi
-
-if [ $EXITVAL -ne 0 ]
-then
-  echo "Remember, you can hard-code these values in cross.sh if needed."
-  exit $EXITVAL
-fi
-
-if [ ! -z "$GEN_BUILD" -a ! -f configure ]
-then
-  export NOCONF=yes
-  ./autogen.sh
-fi
-
-# clean up any existing object files
-if [ -f src/or/tor ]
-then
-  make clean
-fi
-
-# Set up the build environment and try to run configure
-export PATH=$PATH:$CROSSPATH
-export RANLIB=${HOST_TRIPLET}ranlib
-export CC=${HOST_TRIPLET}gcc
-
-if [ $BUILD == "auto" ]
-then
-  ./configure \
-	--enable-debug \
-	--enable-eventdns \
-	--prefix=$PREFIX \
-	--host=$HOST
-else
-  ./configure \
-	--enable-debug \
-	--enable-eventdns \
-	--prefix=$PREFIX \
-	--host=$HOST \
-	--build=$BUILD
-fi
-
-# has a problem occurred?
-if [ $? -ne 0 ]
-then
-  echo ""
-  echo "A problem has been detected with configure."
-  echo "Please check the output above and rerun cross.sh"
-  echo ""
-  exit -1
-fi
-
-# Now we're cookin'
-
-make
-
-# has a problem occurred?
-if [ $? -ne 0 ]
-then
-  echo ""
-  echo "A problem has been detected with make."
-  echo "Please check the output above and rerun make."
-  echo ""
-  exit -1
-fi
-
-# if $STRIP has length (i.e. STRIP=yes), strip the binaries
-if [ ! -z $STRIP ]
-then
-${HOST_TRIPLET}strip \
-	src/or/tor \
-	src/test/test \
-	src/tools/tor-resolve
-fi
-
-echo ""
-echo "Tor should be compiled at this point.  Now run 'make install' to"
-echo "install to $PREFIX"
-echo ""
diff --git a/contrib/dirauth-tools/add-tor b/contrib/dirauth-tools/add-tor
new file mode 100755
index 0000000..5a12abc
--- /dev/null
+++ b/contrib/dirauth-tools/add-tor
@@ -0,0 +1,115 @@
+#!/usr/bin/ruby
+
+# add-tor  -  Add a tor fingerprint line to the approved-routers file
+#
+# Tor's approved-routers file is expected to be versioned using RCS.
+# This script checks for uncommitted changes, does a checkout of the
+# file, adds the new fingerprint with a comment stating the server's
+# operator, and commits the file to RCS again (using -u so that the
+# working copy is not removed.
+#
+# Operator and fingerprint line are read from stdin.
+#
+# Before adding a fingerprint line, approved-routers is checked for
+# rough syntactical correctness.  This script also checks that the
+# nickname and fingerprint to be added do not already exist in the
+# binding list.
+
+
+# Copyright (c) 2006 by Peter Palfrader
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+BINDING = '/etc/tor/approved-routers'
+
+def mysys(cmd)
+	unless system(cmd)
+		STDERR.puts "ERROR: #{cmd} failed"
+		exit 1
+	end
+end
+
+def check_nick(n)
+	n =~ /^[a-zA-Z0-9]+$/
+end
+
+def check_fpr(fpr)
+	fpr =~ /^([0-9A-F]{4} ){9}[0-9A-F]{4}$/
+end
+
+def parse_fprline(fprline)
+	n = fprline[0 ... fprline.index(' ')]
+	f = fprline[fprline.index(' ') + 1 .. -1 ]
+	unless check_nick(n) and check_fpr(f)
+		STDERR.puts "Invalid fpr syntax '#{fprline}'"
+		exit 1
+	end
+	[n, f]
+end
+
+
+
+unless system("rcsdiff -q -u #{BINDING}")
+	STDERR.puts "Uncommitted changes in #{BINDING}.  Aborting."
+	exit 1
+end
+
+puts "Checking out #{BINDING}..."
+mysys("co -l #{BINDING}")
+
+print "Operator: "
+ at operator = readline.chop
+unless @operator.index('@')
+	STDERR.puts "ERROR: No @ found"
+	exit 1
+end
+
+print "FPR Line: "
+ at fprline = readline.chop
+(@nickname, @fpr) = parse_fprline(@fprline)
+
+binding = File.new(BINDING,  "r+")
+binding.readlines.each do |line|
+	line.chop!
+	next if line[0..0] == "#"
+	(n,f) = parse_fprline(line)
+	if (n == @nickname)
+		STDERR.puts
+		STDERR.puts "ERROR: Nickname #{n} already exists in #{BINDING} (fpr: #{f})"
+		exit 1
+	end
+	if (f == @fpr)
+		STDERR.puts
+		STDERR.puts "ERROR: Fpr #{f} already exists in #{BINDING} (nickname: #{n})"
+		exit 1
+	end
+end
+
+puts
+puts '| # ' + @operator
+puts '| '   + @fprline
+puts
+
+binding.puts '# '+ at operator
+binding.puts @fprline
+binding.close
+
+puts "Committing #{BINDING}..."
+mysys("ci -u -m'Add #{@nickname}' #{BINDING}")
diff --git a/contrib/dirauth-tools/nagios-check-tor-authority-cert b/contrib/dirauth-tools/nagios-check-tor-authority-cert
new file mode 100755
index 0000000..46dc728
--- /dev/null
+++ b/contrib/dirauth-tools/nagios-check-tor-authority-cert
@@ -0,0 +1,86 @@
+#!/bin/bash
+
+# nagios-check-tor-authority-cert - check certificate expiry time
+
+# A nagios check for Tor v3 directory authorities:
+# - Checks the current certificate expiry time
+#
+# Usage: nagios-check-tor-authority-cert <authority identity fingerprint>
+# e.g.: nagios-check-tor-authority-cert A9AC67E64B200BBF2FA26DF194AC0469E2A948C6
+
+# Copyright (c) 2008 Peter Palfrader <peter at palfrader.org>
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+set -e
+set -u
+
+if [ -z "${1:-}" ]; then
+	echo "Usage: $0 <authority identity fingerprint>" 2>&1
+	exit 3
+fi
+
+identity="$1"
+
+DIRSERVERS=""
+DIRSERVERS="$DIRSERVERS 86.59.21.38:80"         # tor26
+DIRSERVERS="$DIRSERVERS 128.31.0.34:9031"       # moria1
+DIRSERVERS="$DIRSERVERS 216.224.124.114:9030"   # ides
+DIRSERVERS="$DIRSERVERS 80.190.246.100:80"      # gabelmoo
+#DIRSERVERS="$DIRSERVERS 140.247.60.64:80"      # lefkada
+DIRSERVERS="$DIRSERVERS 194.109.206.212:80"     # dizum
+DIRSERVERS="$DIRSERVERS 213.73.91.31:80"        # dannenberg
+
+TMPFILE="`tempfile`"
+trap 'rm -f "$TMPFILE"' 0
+
+for dirserver in $DIRSERVERS; do
+	wget -q -O "$TMPFILE" "http://$dirserver/tor/keys/fp/$identity"
+	if [ "$?" = 0 ]; then
+		break
+	else
+		cat /dev/null > "$TMPFILE"
+		continue
+	fi
+done
+
+if ! [ -s "$TMPFILE" ] ; then
+	echo "UNKNOWN: Downloading certificate for $identity failed."
+	exit 3
+fi
+
+expirydate="$(awk '$1=="dir-key-expires" {printf "%s %s", $2, $3}' < "$TMPFILE")"
+expiryunix=$(TZ=UTC date -d "$expirydate" +%s)
+now=$(date +%s)
+
+if [ "$now" -ge "$expiryunix" ]; then
+	echo "CRITICAL: Certificate expired $expirydate (authority $identity)."
+	exit 2
+elif [ "$(( $now + 7*24*60*60 ))" -ge "$expiryunix" ]; then
+	echo "CRITICAL: Certificate expires $expirydate (authority $identity)."
+	exit 2
+elif [ "$(( $now + 30*24*60*60 ))" -ge "$expiryunix" ]; then
+	echo "WARNING: Certificate expires $expirydate (authority $identity)."
+	exit 1
+else
+	echo "OK: Certificate expires $expirydate (authority $identity)."
+	exit 0
+fi
diff --git a/contrib/directory-archive/crontab.sample b/contrib/directory-archive/crontab.sample
deleted file mode 100644
index e2821aa..0000000
--- a/contrib/directory-archive/crontab.sample
+++ /dev/null
@@ -1,3 +0,0 @@
-10 * * * * cd projects/tor-v2dir && ./fetch-all-v3
-40 * * * * cd projects/tor-v2dir && ./fetch-all
-15 3 6 * * cd projects/tor-v2dir && ./sort-into-month-folder > /dev/null && ./tar-them-up last > /dev/null
diff --git a/contrib/directory-archive/fetch-all b/contrib/directory-archive/fetch-all
deleted file mode 100755
index dfa5a1b..0000000
--- a/contrib/directory-archive/fetch-all
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/bin/bash
-
-# Download all current v2 directory status documents, then download
-# the descriptors and extra info documents.
-
-# Copyright (c) 2005, 2006, 2007, 2008 Peter Palfrader
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-TZ=UTC
-export TZ
-
-DIRSERVERS=""
-DIRSERVERS="$DIRSERVERS 86.59.21.38:80"		# tor26
-DIRSERVERS="$DIRSERVERS 128.31.0.34:9031"	# moria1
-DIRSERVERS="$DIRSERVERS 128.31.0.34:9032"	# moria2
-DIRSERVERS="$DIRSERVERS 194.109.206.212:80"	# dizum
-
-DATEDIR=$(date "+%Y/%m/%d")
-TIME=$(date "+%Y%m%d-%H%M%S")
-
-. fetch-all-functions
-
-statuses=""
-for dirserver in $DIRSERVERS; do
-	authorities=$(wget -q -O - http://$dirserver/tor/status/all | egrep '^fingerprint ' | awk '{print $2}')
-	if [ "$authorities" == "" ]; then
-		echo "Did not get a list of authorities from $dirserver, going to next" 2>&1
-		continue
-	fi
-
-	dir="status/$DATEDIR"
-	[ -d "$dir" ] || mkdir -p "$dir"
-
-	authprefix="$dir/$TIME-"
-	for fp in $authorities; do
-		wget -q -O "$authprefix$fp" http://$dirserver/tor/status/fp/"$fp"
-		bzip2 "$authprefix$fp"
-		statuses="$statuses $authprefix$fp.bz2"
-	done
-	if [ "$statuses" == "" ]; then
-		echo "Did not get any statuses from $dirserver, going to next" 2>&1
-		continue
-	else
-		break
-	fi
-done
-
-if [ "$statuses" = "" ]; then
-	echo "No statuses available" 2>&1
-	exit 1
-fi
-
-digests=$( for i in ` bzcat $statuses | awk '$1 == "r" {printf "%s=\n", $4}' | sort -u `; do
-		echo $i | \
-		base64-decode | \
-		perl -e 'undef $/; $a=<>; print unpack("H\*", $a),"\n";';
-	done )
-for digest in $digests; do
-	fetch_digest "$digest" "server-descriptor"
-done
diff --git a/contrib/directory-archive/fetch-all-functions b/contrib/directory-archive/fetch-all-functions
deleted file mode 100644
index a9335bd..0000000
--- a/contrib/directory-archive/fetch-all-functions
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/bin/bash
-
-# function used by fetch-all* to download server descriptors and
-# extra info documents
-
-# Copyright (c) 2005, 2006, 2007, 2008 Peter Palfrader
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-
-fetch_digest() {
-	local digest
-	local objecttype
-	local urlpart
-	local pathpart
-	local target
-	local targetdir
-	local dirserver
-	local ei
-
-	digest="$1"
-	objecttype="$2"
-	if [ "$objecttype" = "server-descriptor" ] ; then
-		urlpart="server"
-		pathpart="server-descriptor"
-	elif [ "$objecttype" = "extra-info" ] ; then
-		urlpart="extra"
-		pathpart="extra-info"
-	else
-		echo "Called fetch_digest with illegal objecttype '$objecttype'" >&2
-		exit 1
-	fi
-	target=$( echo $digest | sed -e 's#^\(.\)\(.\)#'"$pathpart"'/\1/\2/\1\2#' )
-	targetdir=$( dirname $target )
-	[ -d "$targetdir" ] || mkdir -p "$targetdir"
-	if ! [ -e "$target" ]; then
-		for dirserver in $DIRSERVERS; do
-			wget -q -O "$target" http://$dirserver/tor/$urlpart/d/"$digest" || rm -f "$target"
-			if [ -s "$target" ]; then
-				if egrep '^opt extra-info-digest ' "$target" > /dev/null; then
-					ei=$( egrep '^opt extra-info-digest ' "$target" | awk '{print $3}' | tr 'A-F' 'a-f' )
-					fetch_digest "$ei" "extra-info"
-				elif egrep '^extra-info-digest ' "$target" > /dev/null; then
-					ei=$( egrep '^extra-info-digest ' "$target" | awk '{print $2}' | tr 'A-F' 'a-f' )
-					fetch_digest "$ei" "extra-info"
-				fi
-				break
-			else
-				rm -f "$target"
-			fi
-		done
-	fi
-	#if ! [ -e "$target" ]; then
-	#	echo "$objecttype $digest" >> failed
-	#fi
-}
-
-if [ -x /usr/bin/base64 ] ; then
-	base64-decode() {
-		/usr/bin/base64 -d
-	}
-else
-	base64-decode() {
-		perl -MMIME::Base64 -e 'print decode_base64(<>)'
-	}
-fi
diff --git a/contrib/directory-archive/fetch-all-v3 b/contrib/directory-archive/fetch-all-v3
deleted file mode 100755
index a4746e0..0000000
--- a/contrib/directory-archive/fetch-all-v3
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/bash
-
-# Download all current v3 directory status votes and the consensus document,
-# then download the descriptors and extra info documents.
-
-# Copyright (c) 2005, 2006, 2007, 2008 Peter Palfrader
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-TZ=UTC
-export TZ
-
-DIRSERVERS=""
-DIRSERVERS="$DIRSERVERS 86.59.21.38:80"		# tor26
-DIRSERVERS="$DIRSERVERS 128.31.0.34:9031"	# moria1
-DIRSERVERS="$DIRSERVERS 216.224.124.114:9030"	# ides
-DIRSERVERS="$DIRSERVERS 80.190.246.100:80"	# gabelmoo
-#DIRSERVERS="$DIRSERVERS 140.247.60.64:80"	# lefkada
-DIRSERVERS="$DIRSERVERS 194.109.206.212:80"	# dizum
-#DIRSERVERS="$DIRSERVERS 128.31.0.34:9032"	# moria2
-DIRSERVERS="$DIRSERVERS 213.73.91.31:80"	# dannenberg
-DIRSERVERS="$DIRSERVERS 208.83.223.34:443"	# urras
-TIME=$(date "+%Y%m%d-%H%M%S")
-
-. fetch-all-functions
-
-consensus=""
-tmpdir="consensus/tmp"
-[ -d "$tmpdir" ] || mkdir -p "$tmpdir"
-for dirserver in $DIRSERVERS; do
-	wget -q -O "$tmpdir/$TIME-consensus" http://$dirserver/tor/status-vote/current/consensus
-	if [ "$?" != 0 ]; then
-		rm -f "$tmpdir/$TIME-consensus"
-		continue
-	fi
-
-	freshconsensus="$tmpdir/$TIME-consensus"
-
-	timestamp=$(awk '$1=="valid-after" {printf "%s-%s", $2, $3}' < "$freshconsensus")
-	datedir=$(awk '$1=="valid-after" {printf "%s", $2}' < "$freshconsensus" | tr '-' '/')
-	dir="consensus/$datedir"
-	[ -d "$dir" ] || mkdir -p "$dir"
-
-
-	consensus="$dir/$timestamp-consensus.bz2"
-	if ! [ -e "$consensus" ]; then
-		# the consensus is new, or at least we don't have it yet
-		bzip2 "$freshconsensus"
-		mv "$freshconsensus.bz2" "$consensus"
-		break
-	fi
-
-	rm -f "$freshconsensus"
-	echo "Consensus from $timestamp (gotten from $dirserver) already exists!" >&2
-	# maybe there is a newer one on a different authority, so try again.
-done
-
-if [ "$consensus" = "" ]; then
-	echo "No consensus available" 2>&1
-	exit 1
-fi
-
-
-votes=$(bzcat $consensus | awk '$1 == "vote-digest" {print $2}')
-for vote in $votes; do
-	for dirserver in $DIRSERVERS; do
-		wget -q -O "$dir/$TIME-vote-$vote" http://$dirserver/tor/status-vote/current/d/$vote
-		if [ "$?" != 0 ]; then
-			rm -f "$dir/$TIME-vote-$vote"
-			continue
-		fi
-		break
-	done
-	if [ -e "$dir/$TIME-vote-$vote" ]; then
-		voteridentity=$(awk '$1=="fingerprint" {print $2}' < "$dir/$TIME-vote-$vote")
-		if [ -e "$dir/$timestamp-vote-$voteridentity-$vote.bz2" ]; then
-			echo "Vote $vote from $voteridentity already exists!" >&2
-			rm -f "$dir/$TIME-vote-$vote"
-			continue;
-		fi
-		mv "$dir/$TIME-vote-$vote"  "$dir/$timestamp-vote-$voteridentity-$vote"
-		bzip2 "$dir/$timestamp-vote-$voteridentity-$vote"
-	else
-		echo "Failed to get vote $vote!" >&2
-	fi
-done
-
-digests=$( for i in ` bzcat $consensus | awk '$1 == "r" {printf "%s=\n", $4}' | sort -u `; do
-		echo $i | \
-		base64-decode | \
-		perl -e 'undef $/; $a=<>; print unpack("H\*", $a),"\n";';
-	done )
-for digest in $digests; do
-	fetch_digest "$digest" "server-descriptor"
-done
diff --git a/contrib/directory-archive/sort-into-month-folder b/contrib/directory-archive/sort-into-month-folder
deleted file mode 100755
index 95033c5..0000000
--- a/contrib/directory-archive/sort-into-month-folder
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/perl -w
-
-# Sort dumped consensuses, statuses, descriptors etc into per-month folders.
-
-# Copyright (c) 2006, 2007, 2008 Peter Palfrader
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-use strict;
-use File::Find;
-use File::Basename;
-use File::stat;
-use Time::Local;
-
-
-my $cutofftime;
-
-
-sub wanted() {
-	return unless -f;
-	my $mtime = stat($_)->mtime;
-	return if $mtime >= $cutofftime;
-
-	my (undef,undef,undef,undef,$mon,$year,undef,undef,undef) = gmtime $mtime;
-
-	my $bn = basename $_;
-	my $dn = dirname $_;
-	my @path = split /\//, $dn;
-	$path[0] .= sprintf 's-%4d-%02d', 1900+$year, $mon+1;
-	$dn = join '/', @path;
-
-	if (! -d $dn) {
-		my $p = '.';
-		for my $component (@path) {
-			$p .= '/'.$component;
-			if (! -d $p) {
-				mkdir $p or die ("Cannot mkdir $p: $!\n");
-			};
-		};
-	};
-
-	print "$_ -> $dn/$bn\n";
-	rename $_, $dn.'/'.$bn or die ("Cannot rename $_ to $dn/$bn: $!\n");
-};
-
-my (undef,undef,undef,undef,$mon,$year,undef,undef,undef) = gmtime(time - 5*24*3600);
-$cutofftime = timegm(0,0,0,1,$mon,$year);
-find(	{
-		wanted		=> \&wanted,
-		no_chdir	=> 1
-	},
-	'server-descriptor');
-
-find(	{
-		wanted		=> \&wanted,
-		no_chdir	=> 1
-	},
-	'extra-info');
diff --git a/contrib/directory-archive/tar-them-up b/contrib/directory-archive/tar-them-up
deleted file mode 100755
index 2775ca9..0000000
--- a/contrib/directory-archive/tar-them-up
+++ /dev/null
@@ -1,127 +0,0 @@
-#!/bin/sh
-
-# Tar up dumped consensuses, statuses, descriptors etc from per-month folders
-# into per-month tarballs.
-
-# Copyright (c) 2006, 2007, 2008 Peter Palfrader
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-set -e
-set -x
-set -u
-
-usage() {
-	echo "Usage: $0 <year> <month>" >&2
-	echo "       $0 last            (does last month)" >&2
-	exit 1
-}
-
-if [ -z "${1:-}" ]; then
-	usage
-fi
-
-if [ "$1" = "last" ]; then
-	year=`date --date="last month" +'%Y'`
-	month=`date --date="last month" +'%m'`
-elif [ -z "${2:-}" ]; then
-	usage
-else
-	year="$1"
-	month="$2"
-fi
-
-if [ "$year" -lt 2000 ] || [ "$year" -gt 2020 ] ||
-   [ "$month" -lt 1 ] || [ "$month" -gt 12 ] ||
-   [ "`echo -n $month | wc -c`" != 2 ]; then
-	usage
-fi
-
-
-this_year=`date --utc +'%Y'`
-this_month=`date --utc +'%m'`
-
-if [ "`date -d $this_year-$this_month-01 +%s`" -le "`date -d $year-$month-01 +%s`" ]; then
-	echo "Date in the future or current month?" >&2
-	exit 1
-fi
-
-
-
-
-
-for file in \
-	"extra-infos-$year-$month.tar.bz2"		\
-	"server-descriptors-$year-$month.tar.bz2"	\
-	"consensuses-$year-$month.tar.bz2"		\
-	"statuses-$year-$month.tar.bz2"			\
-	; do
-	if [ -e "$file" ]; then
-		echo "$file already exists" >&2
-		exit 1
-	fi
-done
-
-for dir in \
-	"extra-infos-$year-$month"		\
-	"server-descriptors-$year-$month"	\
-	"consensus/$year/$month"		\
-	"status/$year/$month"			\
-	; do
-	if ! [ -d "$dir" ]; then
-		echo "$dir not found" >&2
-		exit 1
-	fi
-done
-
-for dir in \
-	"consensuses-$year-$month"		\
-	"statuses-$year-$month"			\
-	; do
-	if [ -e "$dir" ]; then
-		echo "$dir already exists" >&2
-		exit 1
-	fi
-done
-
-for kind in consensus status; do
-	mv "$kind"/$year/$month "$kind"es-$year-$month
-	find "$kind"es-$year-$month -type f -name '*.bz2' -print0 | xargs -0 bunzip2 -v
-	tar cjvf "$kind"es-$year-$month.tar.bz2 "$kind"es-$year-$month
-	rm -rf "$kind"es-$year-$month
-done
-
-for kind in extra-infos server-descriptors; do
-	tar cjvf "$kind"-$year-$month.tar.bz2 "$kind"-$year-$month
-	rm -rf "$kind"-$year-$month
-done
-
-
-
-[ -d Archive ] || mkdir Archive
-
-for kind in consensus status; do
-	t="$kind"es-$year-$month.tar.bz2
-	! [ -e Archive/"$t" ] && mv "$t" Archive/"$t"
-done
-
-for kind in extra-infos server-descriptors; do
-	t="$kind"-$year-$month.tar.bz2
-	! [ -e Archive/"$t" ] && mv "$t" Archive/"$t"
-done
diff --git a/contrib/dist/rc.subr b/contrib/dist/rc.subr
new file mode 100644
index 0000000..d757e89
--- /dev/null
+++ b/contrib/dist/rc.subr
@@ -0,0 +1,43 @@
+#!/bin/sh
+# $FreeBSD: ports/security/tor-devel/files/tor.in,v 1.1 2006/02/17 22:21:25 mnag Exp $
+#
+# (rc.subr written by Peter Thoenen for Net/FreeBSD)
+#
+# REQUIRE: NETWORKING SERVERS USR
+# BEFORE: LOGIN
+#
+# Add the following lines to /etc/rc.conf to enable tor
+#
+# tor_enable (bool):    Set to "NO" by default
+#                       Set it to "YES" to enable tor
+# tor_conf (str):       Points to your tor conf file
+#                       Default: /usr/local/etc/tor/torrc
+# tor_user (str):       Tor Daemon user. Default _tor
+#
+
+. /etc/rc.subr
+
+name="tor"
+rcvar=${name}_enable
+
+load_rc_config ${name}
+
+: ${tor_enable="NO"}
+: ${tor_conf="/usr/local/etc/tor/torrc"}
+: ${tor_user="_tor"}
+: ${tor_pidfile="/var/run/tor/tor.pid"}
+: ${tor_logfile="/var/log/tor"}
+: ${tor_datadir="/var/run/tor"}
+
+required_files=${tor_conf}
+required_dirs=${tor_datadir}
+command="/usr/local/bin/${name}"
+command_args="-f ${tor_conf} --pidfile ${tor_pidfile} --runasdaemon 1 --datadirectory ${tor_datadir} --user ${tor_user}"
+extra_commands="log"
+log_cmd="${name}_log"
+
+tor_log() {
+        cat ${tor_logfile}
+}
+
+run_rc_command "$1"
diff --git a/contrib/dist/suse/include.am b/contrib/dist/suse/include.am
new file mode 100644
index 0000000..4aed0e1
--- /dev/null
+++ b/contrib/dist/suse/include.am
@@ -0,0 +1 @@
+EXTRA_DIST+= contrib/suse/tor.sh
diff --git a/contrib/dist/suse/tor.sh.in b/contrib/dist/suse/tor.sh.in
new file mode 100644
index 0000000..b7e9005
--- /dev/null
+++ b/contrib/dist/suse/tor.sh.in
@@ -0,0 +1,118 @@
+#!/bin/sh
+#
+# Copyright (c) 2006-2007 Andrew Lewman
+#
+# tor    The Onion Router
+#
+# Startup/shutdown script for tor. This is a wrapper around torctl;
+# torctl does the actual work in a relatively system-independent, or at least
+# distribution-independent, way, and this script deals with fitting the
+# whole thing into the conventions of the particular system at hand.
+#
+# These next couple of lines "declare" tor for the "chkconfig" program,
+# originally from SGI, used on Red Hat/Fedora and probably elsewhere.
+#
+# chkconfig: 2345 90 10
+# description: Onion Router - A low-latency anonymous proxy
+#
+
+### BEGIN INIT INFO
+# Provides: tor
+# Required-Start: $remote_fs $network
+# Required-Stop: $remote_fs $network
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 6
+# Short-Description: Start the tor daemon
+# Description:  Start the tor daemon:  the anon-proxy server
+### END INIT INFO
+
+. /etc/rc.status
+
+# Shell functions sourced from /etc/rc.status:
+#      rc_check         check and set local and overall rc status
+#      rc_status        check and set local and overall rc status
+#      rc_status -v     ditto but be verbose in local rc status
+#      rc_status -v -r  ditto and clear the local rc status
+#      rc_failed        set local and overall rc status to failed
+#      rc_reset         clear local rc status (overall remains)
+#      rc_exit          exit appropriate to overall rc status
+
+# First reset status of this service
+rc_reset
+
+# Increase open file descriptors a reasonable amount
+ulimit -n 8192
+
+TORCTL=@BINDIR@/torctl
+
+# torctl will use these environment variables
+TORUSER=@TORUSER@
+export TORUSER
+TORGROUP=@TORGROUP@
+export TORGROUP
+
+TOR_DAEMON_PID_DIR="@LOCALSTATEDIR@/run/tor"
+
+if [ -x /bin/su ] ; then
+    SUPROG=/bin/su
+elif [ -x /sbin/su ] ; then
+    SUPROG=/sbin/su
+elif [ -x /usr/bin/su ] ; then
+    SUPROG=/usr/bin/su
+elif [ -x /usr/sbin/su ] ; then
+    SUPROG=/usr/sbin/su
+else
+    SUPROG=/bin/su
+fi
+
+case "$1" in
+
+    start)
+    echo "Starting tor daemon"
+
+    if [ ! -d $TOR_DAEMON_PID_DIR ] ; then
+        mkdir -p $TOR_DAEMON_PID_DIR
+        chown $TORUSER:$TORGROUP $TOR_DAEMON_PID_DIR
+    fi
+
+    ## Start daemon with startproc(8). If this fails
+    ## the echo return value is set appropriate.
+
+    startproc -f $TORCTL start
+    # Remember status and be verbose
+    rc_status -v
+    ;;
+
+    stop)
+    echo "Stopping tor daemon" 
+    startproc -f $TORCTL stop
+    # Remember status and be verbose
+    rc_status -v
+    ;;
+
+    restart)
+    echo "Restarting tor daemon" 
+    startproc -f $TORCTL restart
+    # Remember status and be verbose
+    rc_status -v
+    ;;
+
+    reload)
+    echo "Reloading tor daemon" 
+    startproc -f $TORCTL reload
+    # Remember status and be verbose
+    rc_status -v
+    ;;
+
+    status)
+    startproc -f $TORCTL status
+    # Remember status and be verbose
+    rc_status -v
+    ;;
+
+    *)
+    echo "Usage: $0 (start|stop|restart|reload|status)"
+    RETVAL=1
+esac
+
+rc_exit
diff --git a/contrib/dist/tor.sh.in b/contrib/dist/tor.sh.in
new file mode 100644
index 0000000..92f8906
--- /dev/null
+++ b/contrib/dist/tor.sh.in
@@ -0,0 +1,123 @@
+#!/bin/sh
+#
+# tor    The Onion Router
+#
+# Startup/shutdown script for tor. This is a wrapper around torctl;
+# torctl does the actual work in a relatively system-independent, or at least
+# distribution-independent, way, and this script deals with fitting the
+# whole thing into the conventions of the particular system at hand.
+# This particular script is written for Red Hat/Fedora Linux, and may
+# also work on Mandrake, but not SuSE.
+#
+# These next couple of lines "declare" tor for the "chkconfig" program,
+# originally from SGI, used on Red Hat/Fedora and probably elsewhere.
+#
+# chkconfig: 2345 90 10
+# description: Onion Router - A low-latency anonymous proxy
+#
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/sbin/tor
+NAME=tor
+DESC="tor daemon"
+TORPIDDIR=/var/run/tor
+TORPID=$TORPIDDIR/tor.pid
+WAITFORDAEMON=60
+ARGS=""
+
+# Library functions
+if [ -f /etc/rc.d/init.d/functions ]; then
+   . /etc/rc.d/init.d/functions
+elif [ -f /etc/init.d/functions ]; then
+   . /etc/init.d/functions
+fi
+
+TORCTL=@BINDIR@/torctl
+
+# torctl will use these environment variables
+TORUSER=@TORUSER@
+export TORUSER
+
+if [ -x /bin/su ] ; then
+    SUPROG=/bin/su
+elif [ -x /sbin/su ] ; then
+    SUPROG=/sbin/su
+elif [ -x /usr/bin/su ] ; then
+    SUPROG=/usr/bin/su
+elif [ -x /usr/sbin/su ] ; then
+    SUPROG=/usr/sbin/su
+else
+    SUPROG=/bin/su
+fi
+
+# Raise ulimit based on number of file descriptors available (thanks, Debian)
+
+if [ -r /proc/sys/fs/file-max ]; then
+	system_max=`cat /proc/sys/fs/file-max`
+	if [ "$system_max" -gt "80000" ] ; then
+		MAX_FILEDESCRIPTORS=32768
+	elif [ "$system_max" -gt "40000" ] ; then
+		MAX_FILEDESCRIPTORS=16384
+	elif [ "$system_max" -gt "10000" ] ; then
+		MAX_FILEDESCRIPTORS=8192
+	else
+		MAX_FILEDESCRIPTORS=1024
+		cat << EOF
+
+Warning: Your system has very few filedescriptors available in total.
+
+Maybe you should try raising that by adding 'fs.file-max=100000' to your
+/etc/sysctl.conf file.  Feel free to pick any number that you deem appropriate.
+Then run 'sysctl -p'.  See /proc/sys/fs/file-max for the current value, and
+file-nr in the same directory for how many of those are used at the moment.
+
+EOF
+	fi
+else
+	MAX_FILEDESCRIPTORS=8192
+fi
+
+NICE=""
+
+case "$1" in
+
+    start)
+	if [ -n "$MAX_FILEDESCRIPTORS" ]; then
+		echo -n "Raising maximum number of filedescriptors (ulimit -n) to $MAX_FILEDESCRIPTORS"
+		if ulimit -n "$MAX_FILEDESCRIPTORS" ; then
+			echo "."
+		else
+			echo ": FAILED."
+		fi
+	fi
+
+    action $"Starting tor:" $TORCTL start
+    RETVAL=$?
+    ;;
+
+    stop)
+    action $"Stopping tor:" $TORCTL stop
+    RETVAL=$?
+    ;;
+
+    restart)
+    action $"Restarting tor:" $TORCTL restart
+    RETVAL=$?
+    ;;
+
+    reload)
+    action $"Reloading tor:" $TORCTL reload
+    RETVAL=$?
+    ;;
+
+    status)
+    $TORCTL status
+    RETVAL=$?
+    ;;
+
+    *)
+    echo "Usage: $0 (start|stop|restart|reload|status)"
+    RETVAL=1
+esac
+
+exit $RETVAL
diff --git a/contrib/dist/torctl.in b/contrib/dist/torctl.in
new file mode 100644
index 0000000..4cc137d
--- /dev/null
+++ b/contrib/dist/torctl.in
@@ -0,0 +1,195 @@
+#!/bin/sh
+#
+# TOR control script designed to allow an easy command line interface
+# to controlling The Onion Router
+#
+# The exit codes returned are:
+#       0 - operation completed successfully. For "status", tor running.
+#       1 - For "status", tor not running.
+#       2 - Command not supported
+#       3 - Could not be started or reloaded
+#       4 - Could not be stopped
+#       5 -
+#       6 -
+#       7 -
+#       8 -
+#
+# When multiple arguments are given, only the error from the _last_
+# one is reported.
+#
+#
+# |||||||||||||||||||| START CONFIGURATION SECTION  ||||||||||||||||||||
+# --------------------                              --------------------
+# Name of the executable
+EXEC=tor
+#
+# the path to your binary, including options if necessary
+TORBIN="@BINDIR@/$EXEC"
+#
+# the path to the configuration file
+TORCONF="@CONFDIR@/torrc"
+#
+# the path to your PID file
+PIDFILE="@LOCALSTATEDIR@/run/tor/tor.pid"
+#
+# The path to the log file
+LOGFILE="@LOCALSTATEDIR@/log/tor/tor.log"
+#
+# The path to the datadirectory
+TORDATA="@LOCALSTATEDIR@/lib/tor"
+#
+TORARGS="--pidfile $PIDFILE --log \"notice file $LOGFILE\" --runasdaemon 1"
+TORARGS="$TORARGS --datadirectory $TORDATA"
+
+# If user name is set in the environment, then use it;
+# otherwise run as the invoking user (or whatever user the config
+# file says)... unless the invoking user is root. The idea here is to
+# let an unprivileged user run tor for her own use using this script,
+# while still providing for it to be used as a system daemon.
+if [ "x`id -u`" = "x0" ]; then
+    TORUSER=@TORUSER@
+fi
+
+if [ "x$TORUSER" != "x" ]; then
+    TORARGS="$TORARGS --user $TORUSER"
+fi
+
+# We no longer wrap the Tor daemon startup in an su when running as
+# root, because it's too painful to make the use of su portable.
+# Just let the daemon set the UID and GID.
+START="$TORBIN -f $TORCONF $TORARGS"
+
+#
+# --------------------                              --------------------
+# ||||||||||||||||||||   END CONFIGURATION SECTION  ||||||||||||||||||||
+
+ERROR=0
+ARGV="$@"
+if [ "x$ARGV" = "x" ] ; then
+    ARGS="help"
+fi
+
+checkIfRunning ( ) {
+    # check for pidfile
+    PID=unknown
+    if [ -f $PIDFILE ] ; then
+        PID=`/bin/cat $PIDFILE`
+        if [ "x$PID" != "x" ] ; then
+            if kill -0 $PID 2>/dev/null ; then
+               STATUS="$EXEC (pid $PID) running"
+               RUNNING=1
+            else
+                STATUS="PID file ($PIDFILE) present, but $EXEC ($PID) not running"
+                RUNNING=0
+            fi
+        else
+            STATUS="$EXEC (pid $PID?) not running"
+            RUNNING=0
+        fi
+    else
+       STATUS="$EXEC apparently not running (no pid file)"
+       RUNNING=0
+    fi
+    return
+}
+
+for ARG in $@ $ARGS
+do
+    checkIfRunning
+
+    case $ARG in
+    start)
+        if [ $RUNNING -eq 1 ]; then
+            echo "$0 $ARG: $EXEC (pid $PID) already running"
+            continue
+        fi
+        if eval "$START" ; then
+            echo "$0 $ARG: $EXEC started"
+            # Make sure it stayed up!
+            /bin/sleep 1
+            checkIfRunning
+            if [ $RUNNING -eq 0 ]; then
+                echo "$0 $ARG: $EXEC (pid $PID) quit unexpectedly"
+            fi
+        else
+            echo "$0 $ARG: $EXEC could not be started"
+            ERROR=3
+        fi
+        ;;
+    stop)
+        if [ $RUNNING -eq 0 ]; then
+            echo "$0 $ARG: $STATUS"
+            continue
+        fi
+        if kill -15 $PID ; then
+            echo "$0 $ARG: $EXEC stopped"
+        else
+            /bin/sleep 1
+            if kill -9 $PID ; then
+                echo "$0 $ARG: $EXEC stopped"
+            else
+                echo "$0 $ARG: $EXEC could not be stopped"
+                ERROR=4
+            fi
+        fi
+        # Make sure it really died!
+        /bin/sleep 1
+        checkIfRunning
+        if [ $RUNNING -eq 1 ]; then
+            echo "$0 $ARG: $EXEC (pid $PID) unexpectedly still running"
+            ERROR=4
+        fi
+        ;;
+    restart)
+        $0 stop start
+        ;;
+    reload)
+        if [ $RUNNING -eq 0 ]; then
+            echo "$0 $ARG: $STATUS"
+            continue
+        fi
+        if kill -1 $PID; then
+            /bin/sleep 1
+            echo "$EXEC (PID $PID) reloaded"
+        else
+            echo "Can't reload $EXEC"
+            ERROR=3
+        fi
+        ;;
+    status)
+        echo $STATUS
+        if [ $RUNNING -eq 1 ]; then
+            ERROR=0
+        else
+            ERROR=1
+        fi
+        ;;
+    log)
+        cat $LOGFILE
+        ;;
+    help)
+        echo "usage: $0 (start|stop|restart|status|help)"
+        /bin/cat <<EOF
+
+start      - start $EXEC
+stop       - stop $EXEC
+restart    - stop and restart $EXEC if running or start if not running
+reload     - cause the running process to reinitialize itself
+status     - tell whether $EXEC is running or not
+log        - display the contents of the log file
+help       - this text
+
+EOF
+        ERROR=0
+        ;;
+    *)
+        $0 help
+        ERROR=2
+        ;;
+
+    esac
+
+done
+
+exit $ERROR
+
diff --git a/contrib/exitlist b/contrib/exitlist
deleted file mode 100755
index 3fd26b5..0000000
--- a/contrib/exitlist
+++ /dev/null
@@ -1,323 +0,0 @@
-#!/usr/bin/python
-# Copyright 2005-2006 Nick Mathewson
-# See the LICENSE file in the Tor distribution for licensing information.
-
-# Requires Python 2.2 or later.
-
-"""
- exitlist -- Given a Tor directory on stdin, lists the Tor servers
- that accept connections to given addreses.
-
- example usage:
-
-    cat ~/.tor/cached-descriptors* | python exitlist 18.244.0.188:80
-
- You should look at the "FetchUselessDescriptors" and "FetchDirInfoEarly"
- config options in the man page.
-
- Note that this script won't give you a perfect list of IP addresses
- that might connect to you using Tor.
- False negatives:
-   - Some Tor servers might exit from other addresses than the one they
-     publish in their descriptor.
- False positives:
-   - This script just looks at the descriptor lists, so it counts relays
-     that were running a day in the past and aren't running now (or are
-     now running at a different address).
-
- See https://check.torproject.org/ for an alternative (more accurate!)
-  approach.
-
-"""
-
-#
-# Change this to True if you want more verbose output.  By default, we
-# only print the IPs of the servers that accept any the listed
-# addresses, one per line.
-#
-VERBOSE = False
-
-#
-# Change this to True if you want to reverse the output, and list the
-# servers that accept *none* of the listed addresses.
-#
-INVERSE = False
-
-#
-# Change this list to contain all of the target services you are interested
-# in.  It must contain one entry per line, each consisting of an IPv4 address,
-# a colon, and a port number. This default is only used if we don't learn
-# about any addresses from the command-line.
-#
-ADDRESSES_OF_INTEREST = """
-    1.2.3.4:80
-"""
-
-
-#
-# YOU DO NOT NEED TO EDIT AFTER THIS POINT.
-#
-
-import sys
-import re
-import getopt
-import socket
-import struct
-import time
-
-assert sys.version_info >= (2,2)
-
-
-def maskIP(ip,mask):
-    return "".join([chr(ord(a) & ord(b)) for a,b in zip(ip,mask)])
-
-def maskFromLong(lng):
-    return struct.pack("!L", lng)
-
-def maskByBits(n):
-    return maskFromLong(0xffffffffl ^ ((1L<<(32-n))-1))
-
-class Pattern:
-    """
-    >>> import socket
-    >>> ip1 = socket.inet_aton("192.169.64.11")
-    >>> ip2 = socket.inet_aton("192.168.64.11")
-    >>> ip3 = socket.inet_aton("18.244.0.188")
-
-    >>> print Pattern.parse("18.244.0.188")
-    18.244.0.188/255.255.255.255:1-65535
-    >>> print Pattern.parse("18.244.0.188/16:*")
-    18.244.0.0/255.255.0.0:1-65535
-    >>> print Pattern.parse("18.244.0.188/2.2.2.2:80")
-    2.0.0.0/2.2.2.2:80-80
-    >>> print Pattern.parse("192.168.0.1/255.255.00.0:22-25")
-    192.168.0.0/255.255.0.0:22-25
-    >>> p1 = Pattern.parse("192.168.0.1/255.255.00.0:22-25")
-    >>> import socket
-    >>> p1.appliesTo(ip1, 22)
-    False
-    >>> p1.appliesTo(ip2, 22)
-    True
-    >>> p1.appliesTo(ip2, 25)
-    True
-    >>> p1.appliesTo(ip2, 26)
-    False
-    """
-    def __init__(self, ip, mask, portMin, portMax):
-        self.ip = maskIP(ip,mask)
-        self.mask = mask
-        self.portMin = portMin
-        self.portMax = portMax
-
-    def __str__(self):
-        return "%s/%s:%s-%s"%(socket.inet_ntoa(self.ip),
-                              socket.inet_ntoa(self.mask),
-                              self.portMin,
-                              self.portMax)
-
-    def parse(s):
-        if ":" in s:
-            addrspec, portspec = s.split(":",1)
-        else:
-            addrspec, portspec = s, "*"
-
-        if addrspec == '*':
-            ip,mask = "\x00\x00\x00\x00","\x00\x00\x00\x00"
-        elif '/' not in addrspec:
-            ip = socket.inet_aton(addrspec)
-            mask = "\xff\xff\xff\xff"
-        else:
-            ip,mask = addrspec.split("/",1)
-            ip = socket.inet_aton(ip)
-            if "." in mask:
-                mask = socket.inet_aton(mask)
-            else:
-                mask = maskByBits(int(mask))
-
-        if portspec == '*':
-            portMin = 1
-            portMax = 65535
-        elif '-' not in portspec:
-            portMin = portMax = int(portspec)
-        else:
-            portMin, portMax = map(int,portspec.split("-",1))
-
-        return Pattern(ip,mask,portMin,portMax)
-
-    parse = staticmethod(parse)
-
-    def appliesTo(self, ip, port):
-        return ((maskIP(ip,self.mask) == self.ip) and
-                (self.portMin <= port <= self.portMax))
-
-class Policy:
-    """
-    >>> import socket
-    >>> ip1 = socket.inet_aton("192.169.64.11")
-    >>> ip2 = socket.inet_aton("192.168.64.11")
-    >>> ip3 = socket.inet_aton("18.244.0.188")
-
-    >>> pol = Policy.parseLines(["reject *:80","accept 18.244.0.188:*"])
-    >>> print str(pol).strip()
-    reject 0.0.0.0/0.0.0.0:80-80
-    accept 18.244.0.188/255.255.255.255:1-65535
-    >>> pol.accepts(ip1,80)
-    False
-    >>> pol.accepts(ip3,80)
-    False
-    >>> pol.accepts(ip3,81)
-    True
-    """
-
-    def __init__(self, lst):
-        self.lst = lst
-
-    def parseLines(lines):
-        r = []
-        for item in lines:
-            a,p=item.split(" ",1)
-            if a == 'accept':
-                a = True
-            elif a == 'reject':
-                a = False
-            else:
-                raise ValueError("Unrecognized action %r",a)
-            p = Pattern.parse(p)
-            r.append((p,a))
-        return Policy(r)
-
-    parseLines = staticmethod(parseLines)
-
-    def __str__(self):
-        r = []
-        for pat, accept in self.lst:
-            rule = accept and "accept" or "reject"
-            r.append("%s %s\n"%(rule,pat))
-        return "".join(r)
-
-    def accepts(self, ip, port):
-        for pattern,accept in self.lst:
-            if pattern.appliesTo(ip,port):
-                return accept
-        return True
-
-class Server:
-    def __init__(self, name, ip, policy, published, fingerprint):
-        self.name = name
-        self.ip = ip
-        self.policy = policy
-        self.published = published
-        self.fingerprint = fingerprint
-
-def uniq_sort(lst):
-    d = {}
-    for item in lst: d[item] = 1
-    lst = d.keys()
-    lst.sort()
-    return lst
-
-def run():
-    global VERBOSE
-    global INVERSE
-    global ADDRESSES_OF_INTEREST
-
-    if len(sys.argv) > 1:
-        try:
-            opts, pargs = getopt.getopt(sys.argv[1:], "vx")
-        except getopt.GetoptError, e:
-            print """
-usage: cat ~/.tor/cached-routers* | %s [-v] [-x] [host:port [host:port [...]]]
-    -v  verbose output
-    -x  invert results
-""" % sys.argv[0]
-            sys.exit(0)
-
-        for o, a in opts:
-            if o == "-v":
-                VERBOSE = True
-            if o == "-x":
-                INVERSE = True
-        if len(pargs):
-            ADDRESSES_OF_INTEREST = "\n".join(pargs)
-
-    servers = []
-    policy = []
-    name = ip = None
-    published = 0
-    fp = ""
-    for line in sys.stdin.xreadlines():
-        if line.startswith('router '):
-            if name:
-                servers.append(Server(name, ip, Policy.parseLines(policy),
-                                      published, fp))
-            _, name, ip, rest = line.split(" ", 3)
-            policy = []
-            published = 0
-            fp = ""
-        elif line.startswith('fingerprint') or \
-                 line.startswith('opt fingerprint'):
-            elts = line.strip().split()
-            if elts[0] == 'opt': del elts[0]
-            assert elts[0] == 'fingerprint'
-            del elts[0]
-            fp = "".join(elts)
-        elif line.startswith('accept ') or line.startswith('reject '):
-            policy.append(line.strip())
-        elif line.startswith('published '):
-            date = time.strptime(line[len('published '):].strip(),
-                                 "%Y-%m-%d %H:%M:%S")
-            published = time.mktime(date)
-
-    if name:
-        servers.append(Server(name, ip, Policy.parseLines(policy), published,
-                              fp))
-
-    targets = []
-    for line in ADDRESSES_OF_INTEREST.split("\n"):
-        line = line.strip()
-        if not line: continue
-        p = Pattern.parse(line)
-        targets.append((p.ip, p.portMin))
-
-    # remove all but the latest server of each IP/Nickname pair.
-    latest = {}
-    for s in servers:
-        if (not latest.has_key((s.fingerprint))
-            or s.published > latest[(s.fingerprint)]):
-            latest[s.fingerprint] = s
-    servers = latest.values()
-
-    accepters, rejecters = {}, {}
-    for s in servers:
-        for ip,port in targets:
-            if s.policy.accepts(ip,port):
-                accepters[s.ip] = s
-                break
-        else:
-            rejecters[s.ip] = s
-
-    # If any server at IP foo accepts, the IP does not reject.
-    for k in accepters.keys():
-        if rejecters.has_key(k):
-            del rejecters[k]
-
-    if INVERSE:
-        printlist = rejecters.values()
-    else:
-        printlist = accepters.values()
-
-    ents = []
-    if VERBOSE:
-        ents = uniq_sort([ "%s\t%s"%(s.ip,s.name) for s in printlist ])
-    else:
-        ents = uniq_sort([ s.ip for s in printlist ])
-    for e in ents:
-        print e
-
-def _test():
-    import doctest, exitparse
-    return doctest.testmod(exitparse)
-#_test()
-
-run()
-
diff --git a/contrib/findMergedChanges.pl b/contrib/findMergedChanges.pl
deleted file mode 100755
index d6c4105..0000000
--- a/contrib/findMergedChanges.pl
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/usr/bin/perl
-
-use warnings;
-use strict;
-
-sub nChanges {
-    my ($branches, $fname) = @_;
-    local *F;
-    # requires perl 5.8.  Avoids shell issues if we ever get a changes
-    # file named by the parents of Little Johnny Tables.
-    open F, "-|", "git", "log", "--no-merges", "--pretty=format:%H", $branches, "--", $fname
-	or die "$!";
-    my @changes = <F>;
-    return scalar @changes
-}
-
-my $look_for_type = "merged";
-
-if (! @ARGV) {
-    print <<EOF
-Usage:
-   findMergedChanges.pl [--merged/--unmerged/--weird/--list] [--branch=<branchname] [--head=<branchname>] changes/*
-
-A change is "merged" if it has ever been merged to release-0.2.4 and it has had
-no subsequent changes in master.
-
-A change is "unmerged" if it has never been merged to release-0.2.4 and it
-has had changes in master.
-
-A change is "weird" if it has been merged to release-0.2.4 and it *has* had
-subsequent changes in master.
-
-Suggested application:
-   findMergedChanges.pl --merged changes/* | xargs -n 1 git rm
-
-EOF
-}
-
-my $target_branch = "origin/release-0.2.4";
-my $head = "origin/master";
-
-while (@ARGV and $ARGV[0] =~ /^--/) {
-    my $flag = shift @ARGV;
-    if ($flag =~ /^--(weird|merged|unmerged|list)/) {
-	$look_for_type = $1;
-    } elsif ($flag =~ /^--branch=(\S+)/) {
-        $target_branch = $1;
-    } elsif ($flag =~ /^--head=(\S+)/) {
-        $head = $1;
-    } else {
-	die "Unrecognized flag $flag";
-    }
-}
-
-for my $changefile (@ARGV) {
-    my $n_merged = nChanges($target_branch, $changefile);
-    my $n_postmerged = nChanges("${target_branch}..${head}", $changefile);
-    my $type;
-
-    if ($n_merged != 0 and $n_postmerged == 0) {
-	$type = "merged";
-    } elsif ($n_merged == 0 and $n_postmerged != 0) {
-	$type = "unmerged";
-    } else {
-	$type = "weird";
-    }
-
-    if ($type eq $look_for_type) {
-	print "$changefile\n";
-    } elsif ($look_for_type eq 'list') {
-	printf "% 8s: %s\n", $type, $changefile;
-    }
-}
diff --git a/contrib/format_changelog.py b/contrib/format_changelog.py
deleted file mode 100755
index 6997d95..0000000
--- a/contrib/format_changelog.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#!/usr/bin/python
-# Copyright (c) 2014, The Tor Project, Inc.
-# See LICENSE for licensing information
-#
-# This script reformats a section of the changelog to wrap everything to
-# the right width and put blank lines in the right places.  Eventually,
-# it might include a linter.
-#
-# To run it, pipe a section of the changelog (starting with "Changes
-# in Tor 0.x.y.z-alpha" through the script.)
-
-import os
-import re
-import sys
-import textwrap
-
-TP_MAINHEAD = 0
-TP_HEADTEXT = 1
-TP_BLANK = 2
-TP_SECHEAD = 3
-TP_ITEMFIRST = 4
-TP_ITEMBODY = 5
-TP_END = 6
-
-def head_parser(line):
-    if re.match(r'^[A-Z]', line):
-        return TP_MAINHEAD
-    elif re.match(r'^  o ', line):
-        return TP_SECHEAD
-    elif re.match(r'^\s*$', line):
-        return TP_BLANK
-    else:
-        return TP_HEADTEXT
-
-def body_parser(line):
-    if re.match(r'^  o ', line):
-        return TP_SECHEAD
-    elif re.match(r'^    -',line):
-        return TP_ITEMFIRST
-    elif re.match(r'^      \S', line):
-        return TP_ITEMBODY
-    elif re.match(r'^\s*$', line):
-        return TP_BLANK
-    elif re.match(r'^Changes in', line):
-        return TP_END
-    else:
-        print "Weird line %r"%line
-
-class ChangeLog(object):
-    def __init__(self):
-        self.mainhead = None
-        self.headtext = []
-        self.curgraf = None
-        self.sections = []
-        self.cursection = None
-        self.lineno = 0
-
-    def addLine(self, tp, line):
-        self.lineno += 1
-
-        if tp == TP_MAINHEAD:
-            assert not self.mainhead
-            self.mainhead = line
-
-        elif tp == TP_HEADTEXT:
-            if self.curgraf is None:
-                self.curgraf = []
-                self.headtext.append(self.curgraf)
-            self.curgraf.append(line)
-
-        elif tp == TP_BLANK:
-            self.curgraf = None
-
-        elif tp == TP_SECHEAD:
-            self.cursection = [ self.lineno, line, [] ]
-            self.sections.append(self.cursection)
-
-        elif tp == TP_ITEMFIRST:
-            item = ( self.lineno, [ [line] ])
-            self.curgraf = item[1][0]
-            self.cursection[2].append(item)
-
-        elif tp == TP_ITEMBODY:
-            if self.curgraf is None:
-                self.curgraf = []
-                self.cursection[2][1][-1].append(self.curgraf)
-            self.curgraf.append(line)
-
-        else:
-            assert "This" is "unreachable"
-
-    def lint_head(self, line, head):
-        m = re.match(r'^ *o ([^\(]+)((?:\([^\)]+\))?):', head)
-        if not m:
-            print >>sys.stderr, "Weird header format on line %s"%line
-
-    def lint_item(self, line, grafs, head_type):
-        pass
-
-    def lint(self):
-        self.head_lines = {}
-        for sec_line, sec_head, items in self.sections:
-            head_type = self.lint_head(sec_line, sec_head)
-            for item_line, grafs in items:
-                self.lint_item(item_line, grafs, head_type)
-
-    def dumpGraf(self,par,indent1,indent2=-1):
-        if indent2 == -1:
-            indent2 = indent1
-        text = " ".join(re.sub(r'\s+', ' ', line.strip()) for line in par)
-        print textwrap.fill(text, width=72,
-                            initial_indent=" "*indent1,
-                            subsequent_indent=" "*indent2,
-                            break_on_hyphens=False)
-
-    def dump(self):
-        print self.mainhead
-        for par in self.headtext:
-            self.dumpGraf(par, 2)
-            print
-        for _,head,items in self.sections:
-            if not head.endswith(':'):
-                print >>sys.stderr, "adding : to %r"%head
-                head = head + ":"
-            print head
-            for _,grafs in items:
-                self.dumpGraf(grafs[0],4,6)
-                for par in grafs[1:]:
-                    print
-                    self.dumpGraf(par,6,6)
-            print
-        print
-
-CL = ChangeLog()
-parser = head_parser
-
-sys.stdin = open('ChangeLog', 'r')
-
-for line in sys.stdin:
-    line = line.rstrip()
-    tp = parser(line)
-
-    if tp == TP_SECHEAD:
-        parser = body_parser
-    elif tp == TP_END:
-        nextline = line
-        break
-
-    CL.addLine(tp,line)
-
-CL.lint()
-
-sys.stdout = open('ChangeLog.new', 'w')
-
-CL.dump()
-
-print nextline
-
-for line in sys.stdin:
-    sys.stdout.write(line)
-
-os.rename('ChangeLog.new', 'ChangeLog')
diff --git a/contrib/linux-tor-prio.sh b/contrib/linux-tor-prio.sh
deleted file mode 100644
index ea9e0dd..0000000
--- a/contrib/linux-tor-prio.sh
+++ /dev/null
@@ -1,192 +0,0 @@
-#!/bin/bash
-# Written by Marco Bonetti & Mike Perry
-# Based on instructions from Dan Singletary's ADSL BW Management HOWTO:
-# http://www.faqs.org/docs/Linux-HOWTO/ADSL-Bandwidth-Management-HOWTO.html
-# This script is Public Domain.
-
-############################### README #################################
-
-# This script provides prioritization of Tor traffic below other
-# traffic on a Linux server. It has two modes of operation: UID based 
-# and IP based. 
-
-# UID BASED PRIORITIZATION
-#
-# The UID based method requires that Tor be launched from 
-# a specific user ID. The "User" Tor config setting is
-# insufficient, as it sets the UID after the socket is created.
-# Here is a C wrapper you can use to execute Tor and drop privs before 
-# it creates any sockets. 
-#
-# Compile with:
-# gcc -DUID=`id -u tor` -DGID=`id -g tor` tor_wrap.c -o tor_wrap
-#
-# #include <unistd.h>
-# int main(int argc, char **argv) {
-# if(initgroups("tor", GID) == -1) { perror("initgroups"); return 1; }
-# if(setresgid(GID, GID, GID) == -1) { perror("setresgid"); return 1; }
-# if(setresuid(UID, UID, UID) == -1) { perror("setresuid"); return 1; }
-# execl("/bin/tor", "/bin/tor", "-f", "/etc/tor/torrc", NULL);
-# perror("execl"); return 1;
-# }
-
-# IP BASED PRIORITIZATION
-#
-# The IP setting requires that a separate IP address be dedicated to Tor. 
-# Your Torrc should be set to bind to this IP for "OutboundBindAddress", 
-# "ListenAddress", and "Address".
-
-# GENERAL USAGE
-#
-# You should also tune the individual connection rate parameters below
-# to your individual connection. In particular, you should leave *some* 
-# minimum amount of bandwidth for Tor, so that Tor users are not 
-# completely choked out when you use your server's bandwidth. 30% is 
-# probably a reasonable choice. More is better of course.
-#
-# To start the shaping, run it as: 
-#   ./linux-tor-prio.sh 
-#
-# To get status information (useful to verify packets are getting marked
-# and prioritized), run:
-#   ./linux-tor-prio.sh status
-#
-# And to stop prioritization:
-#   ./linux-tor-prio.sh stop
-#
-########################################################################
-
-# BEGIN USER TUNABLE PARAMETERS
-
-DEV=eth0
-
-# NOTE! You must START Tor under this UID. Using the Tor User
-# config setting is NOT sufficient. See above.
-TOR_UID=$(id -u tor)
-
-# If the UID mechanism doesn't work for you, you can set this parameter
-# instead. If set, it will take precedence over the UID setting. Note that
-# you need multiple IPs with one specifically devoted to Tor for this to
-# work.
-#TOR_IP="42.42.42.42"
-
-# Average ping to most places on the net, milliseconds
-RTT_LATENCY=40
-
-# RATE_UP must be less than your connection's upload capacity in
-# kbits/sec. If it is larger, then the bottleneck will be at your
-# router's queue, which you do not control. This will cause congestion
-# and a revert to normal TCP fairness no matter what the queing
-# priority is.
-RATE_UP=5000
-
-# RATE_UP_TOR is the minimum speed your Tor connections will have in
-# kbits/sec.  They will have at least this much bandwidth for upload.
-# In general, you probably shouldn't set this too low, or else Tor
-# users who use your node will be completely choked out whenever your
-# machine does any other network activity. That is not very fun.
-RATE_UP_TOR=1500
-
-# RATE_UP_TOR_CEIL is the maximum rate allowed for all Tor trafic in
-# kbits/sec.
-RATE_UP_TOR_CEIL=5000
-
-CHAIN=OUTPUT
-#CHAIN=PREROUTING
-#CHAIN=POSTROUTING
-
-MTU=1500
-AVG_PKT=900 # should be more like 600 for non-exit nodes
-
-# END USER TUNABLE PARAMETERS
-
-
-
-# The queue size should be no larger than your bandwidth-delay
-# product. This is RT latency*bandwidth/MTU/2
-
-BDP=$(expr $RTT_LATENCY \* $RATE_UP / $AVG_PKT)
-
-# Further research indicates that the BDP calculations should use
-# RTT/sqrt(n) where n is the expected number of active connections..
-
-BDP=$(expr $BDP / 4)
-
-if [ "$1" = "status" ]
-then
-	echo "[qdisc]"
-	tc -s qdisc show dev $DEV
-	tc -s qdisc show dev imq0
-	echo "[class]"
-	tc -s class show dev $DEV
-	tc -s class show dev imq0
-	echo "[filter]"
-	tc -s filter show dev $DEV
-	tc -s filter show dev imq0
-	echo "[iptables]"
-	iptables -t mangle -L TORSHAPER-OUT -v -x 2> /dev/null
-	exit
-fi
-
-
-# Reset everything to a known state (cleared)
-tc qdisc del dev $DEV root 2> /dev/null > /dev/null
-tc qdisc del dev imq0 root 2> /dev/null > /dev/null
-iptables -t mangle -D POSTROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null
-iptables -t mangle -D PREROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null
-iptables -t mangle -D OUTPUT -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null
-iptables -t mangle -F TORSHAPER-OUT 2> /dev/null > /dev/null
-iptables -t mangle -X TORSHAPER-OUT 2> /dev/null > /dev/null
-ip link set imq0 down 2> /dev/null > /dev/null
-rmmod imq 2> /dev/null > /dev/null
-
-if [ "$1" = "stop" ]
-then
-	echo "Shaping removed on $DEV."
-	exit
-fi
-
-# Outbound Shaping (limits total bandwidth to RATE_UP)
-
-ip link set dev $DEV qlen $BDP
-
-# Add HTB root qdisc, default is high prio
-tc qdisc add dev $DEV root handle 1: htb default 20
-
-# Add main rate limit class
-tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATE_UP}kbit
-
-# Create the two classes, giving Tor at least RATE_UP_TOR kbit and capping
-# total upstream at RATE_UP so the queue is under our control.
-tc class add dev $DEV parent 1:1 classid 1:20 htb rate $(expr $RATE_UP - $RATE_UP_TOR)kbit ceil ${RATE_UP}kbit prio 0
-tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATE_UP_TOR]kbit ceil ${RATE_UP_TOR_CEIL}kbit prio 10
-
-# Start up pfifo
-tc qdisc add dev $DEV parent 1:20 handle 20: pfifo limit $BDP
-tc qdisc add dev $DEV parent 1:21 handle 21: pfifo limit $BDP
-
-# filter traffic into classes by fwmark
-tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
-tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
-
-# add TORSHAPER-OUT chain to the mangle table in iptables
-iptables -t mangle -N TORSHAPER-OUT
-iptables -t mangle -I $CHAIN -o $DEV -j TORSHAPER-OUT
-
-
-# Set firewall marks
-# Low priority to Tor
-if [ ""$TOR_IP == "" ]
-then
-	echo "Using UID-based QoS. UID $TOR_UID marked as low priority."
-	iptables -t mangle -A TORSHAPER-OUT -m owner --uid-owner $TOR_UID -j MARK --set-mark 21
-else
-	echo "Using IP-based QoS. $TOR_IP marked as low priority."
-	iptables -t mangle -A TORSHAPER-OUT -s $TOR_IP -j MARK --set-mark 21
-fi
-
-# High prio for everything else
-iptables -t mangle -A TORSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 20
-
-echo "Outbound shaping added to $DEV.  Rate for Tor upload at least: ${RATE_UP_TOR}Kbyte/sec."
-
diff --git a/contrib/make-signature.sh b/contrib/make-signature.sh
deleted file mode 100755
index 4aba08b..0000000
--- a/contrib/make-signature.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/sh
-
-set -eu
-
-if test "$1" = "" ; then
-    echo "I need a package as an argument."
-    exit 1
-fi
-
-PACKAGEFILE=$1
-
-if test ! -f "$PACKAGEFILE" ; then
-    echo "$PACKAGEFILE is not a file."
-    exit 1
-fi
-
-DIGESTNAME=sha256
-DIGESTOUTPUT=`gpg --print-md $DIGESTNAME $PACKAGEFILE`
-
-RAWDIGEST=`gpg --print-md $DIGESTNAME $PACKAGEFILE | sed -e 's/^[^ ]*: //' `
-
-# These regexes are a little fragile, but I think they work for us.
-VERSION=`echo $PACKAGEFILE | sed -e 's/^[a-z\-]*//' -e 's/\.[\.a-z]*$//' `
-PACKAGE=`echo $PACKAGEFILE | sed -e 's/-[0-9].*//'`
-SIGFILE_UNSIGNED="$PACKAGE-$VERSION-signature"
-SIGNATUREFILE="$SIGFILE_UNSIGNED.asc"
-
-cat >$SIGFILE_UNSIGNED <<EOF
-This is the signature file for "$PACKAGEFILE",
-which contains version "$VERSION" of "$PACKAGE".
-
-Here's how to check this signature.
-
-1) Make sure that this is really a signature file, and not a forgery,
-   with:
-
-     "gpg --verify $SIGNATUREFILE"
-
-   The key should be one of the keys that signs the Tor release; the
-   official Tor website has more information on those.
-
-   If this step fails, then either you are missing the correct key, or
-   this signature file was not really signed by a Tor packager.
-   Beware!
-
-2) Make sure that the package you wanted is indeed "$PACKAGE", and that
-   its version you wanted is indeed "$VERSION".  If you wanted a
-   different package, or a different version, this signature file is
-   not the right one!
-
-3) Now that you're sure you have the right signature file, make sure
-   that you got the right package.  Check its $DIGESTNAME digest with
-
-     "gpg --print-md $DIGESTNAME $PACKAGEFILE"
-
-   The output should match this, exactly:
-
-$DIGESTOUTPUT
-
-   Make sure that every part of the output matches: don't just check the
-   first few characters.  If the digest does not match, you do not have
-   the right package file.  It could even be a forgery.
-
-Frequently asked questions:
-
-Q: Why not just sign the package file, like you used to do?
-A: GPG signatures authenticate file contents, but not file names.  If
-   somebody gave you a renamed file with a matching renamed signature
-   file, the signature would still be given as "valid".
-
--- 
-FILENAME: $PACKAGEFILE
-PACKAGE: $PACKAGE
-VERSION: $VERSION
-DIGESTALG: $DIGESTNAME
-DIGEST: $RAWDIGEST
-EOF
-
-gpg --clearsign $SIGFILE_UNSIGNED
diff --git a/contrib/mdd.py b/contrib/mdd.py
deleted file mode 100755
index e0b496b..0000000
--- a/contrib/mdd.py
+++ /dev/null
@@ -1,169 +0,0 @@
-#!/usr/bin/env python2.3
-
-import re, sys
-import textwrap
-
-files = sys.argv[1:]
-funcDeclaredIn = {}
-fileDeclares = {}
-functionCalls = {}
-funcCalledByFile = {}
-funcCalledByFunc = {}
-
-cpp_re = re.compile(r'//.*$')
-c_re = re.compile(r'/[*]+(?:[^*]+|[*]+[^/*])*[*]+/', re.M|re.S)
-
-for fname in files:
-    f = open(fname, 'r')
-    curFunc = "???"
-    functionCalls.setdefault(curFunc,{})
-    lineno = 0
-    body = f.read()
-    body = cpp_re.sub(" ",body)
-    body = c_re.sub(" ",body)
-    #if fname == 'dns.c': print body
-    for line in body.split("\n"):
-        lineno += 1
-        m = re.match(r'^[^\s/].*\s(\w+)\([^;]*$', line)
-        if m:
-            #print line, "->", m.group(1)
-            curFunc = m.group(1)
-            if curFunc[0] == '_': curFunc = curFunc[1:]
-            functionCalls.setdefault(curFunc,{})
-            funcDeclaredIn[m.group(1)] = fname
-            fileDeclares.setdefault(fname, {})[m.group(1)] = 1
-            continue
-        m = re.match(r'^(\w+)\([^;]', line)
-        if m:
-            #print line, "->", m.group(1)
-            curFunc = m.group(1)
-            if curFunc[0] == '_': curFunc = curFunc[1:]
-            functionCalls.setdefault(curFunc,{})
-            funcDeclaredIn[m.group(1)] = fname
-            fileDeclares.setdefault(fname, {})[m.group(1)] = 1
-            continue
-        while line:
-            m = re.search(r'(\w+)\(', line)
-            if not m: break
-            #print fname, line, curFunc, "->", m.group(1)
-            fn = m.group(1)
-            if fn[0] == '_':
-                fn = fn[1:]
-            functionCalls[curFunc][m.group(1)] = 1
-            #if curFunc == "???":
-            #    print ">>!!!!! at %s:%s"%(fname,lineno)
-            funcCalledByFunc.setdefault(m.group(1), {})[curFunc]=1
-            funcCalledByFile.setdefault(m.group(1), {})[fname]=1
-            line = line[m.end():]
-
-    f.close()
-
-fileUsers = {}
-fileUses = {}
-
-for fname in files:
-    print "%s:"%fname
-    users = {}
-    for func in fileDeclares[fname]:
-        cb = funcCalledByFile.get(func,{}).keys()
-        for f in cb: users[f] = 1
-        #print "users[%s] = %s"%(f,users[f])
-    users = users.keys()
-    users.sort()
-    fileUsers[fname] = users
-    for user in users:
-        fileUses.setdefault(user,[]).append(fname)
-        if user == fname: continue
-        print "  from %s:"%user
-        for func in fileDeclares[fname]:
-            if funcCalledByFile.get(func,{}).get(user,0):
-                print "    %s()"%func
-
-def wrap(s, pre):
-    return textwrap.fill(s,
-                         width=77, initial_indent=pre,
-                         subsequent_indent=" "*len(pre))
-
-for fname in files:
-    print
-    print "===== %s"%fname
-    print wrap(" ".join(fileUses[fname]),
-               "        Calls: ")
-    print wrap(" ".join(fileUsers[fname]),
-              "    Called by: ")
-
-print "=============================="
-
-funcnames = functionCalls.keys()
-funcnames.sort()
-
-if 1:
-    for func in funcnames:
-        print "===== %s"%func
-        callers = [c for c in funcCalledByFunc.get(func,{}).keys()
-                   if c != "???"]
-        callers.sort()
-        called = [c for c in functionCalls[func].keys() if c != "???" and
-                  c in funcnames]
-        called.sort()
-        print wrap(" ".join(callers),
-                   "  Called by:")
-        print wrap(" ".join(called),
-                   "      Calls:")
-
-# simple topological sort.
-functionDepth = {}
-while 1:
-    BIG = 1000000
-    any = 0
-    for func in funcnames:
-        if functionDepth.has_key(func):
-            continue
-        called = [c for c in functionCalls[func] if c != func and
-                  functionCalls.has_key(c)]
-        if len(called) == 0:
-            functionDepth[func] = 0
-            #print "Depth(%s)=%s"%(func,0)
-            any = 1
-            continue
-        calledDepths = [ functionDepth.get(c,BIG) for c in called ]
-        if max(calledDepths) < BIG:
-            d = functionDepth[func] = max(calledDepths)+1
-            #print "Depth(%s)=%s"%(func,d)
-            any = 1
-            continue
-    if not any:
-        break
-
-# compute lexical closure.
-cycCalls = {}
-for func in funcnames:
-    if not functionDepth.has_key(func):
-        calls = [ c for c in functionCalls[func] if c != func and
-                  functionCalls.has_key(c) and not functionDepth.has_key(c)]
-        cycCalls[func] = d = {}
-        for c in calls:
-            d[c]=1
-
-cycNames = cycCalls.keys()
-while 1:
-    any = 0
-    for func in cycNames:
-        L = len(cycCalls[func])
-        for called in cycCalls[func].keys():
-            cycCalls[func].update(cycCalls[called])
-        if L != len(cycCalls[func]):
-            any = 1
-    if not any:
-        break
-
-depthList = [ (v,k) for k,v in functionDepth.items() ]
-depthList.sort()
-cycList = [ (len(v),k) for k,v in cycCalls.items() ]
-cycList.sort()
-for depth,name in depthList:
-    print "Depth[%s]=%s"%(name,depth)
-for bredth,name in cycList:
-    print "Width[%s]=%s"%(name,bredth)
-
-print "Sorted %s / %s"%(len(functionDepth),len(funcnames))
diff --git a/contrib/nagios-check-tor-authority-cert b/contrib/nagios-check-tor-authority-cert
deleted file mode 100755
index 46dc728..0000000
--- a/contrib/nagios-check-tor-authority-cert
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/bin/bash
-
-# nagios-check-tor-authority-cert - check certificate expiry time
-
-# A nagios check for Tor v3 directory authorities:
-# - Checks the current certificate expiry time
-#
-# Usage: nagios-check-tor-authority-cert <authority identity fingerprint>
-# e.g.: nagios-check-tor-authority-cert A9AC67E64B200BBF2FA26DF194AC0469E2A948C6
-
-# Copyright (c) 2008 Peter Palfrader <peter at palfrader.org>
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-
-set -e
-set -u
-
-if [ -z "${1:-}" ]; then
-	echo "Usage: $0 <authority identity fingerprint>" 2>&1
-	exit 3
-fi
-
-identity="$1"
-
-DIRSERVERS=""
-DIRSERVERS="$DIRSERVERS 86.59.21.38:80"         # tor26
-DIRSERVERS="$DIRSERVERS 128.31.0.34:9031"       # moria1
-DIRSERVERS="$DIRSERVERS 216.224.124.114:9030"   # ides
-DIRSERVERS="$DIRSERVERS 80.190.246.100:80"      # gabelmoo
-#DIRSERVERS="$DIRSERVERS 140.247.60.64:80"      # lefkada
-DIRSERVERS="$DIRSERVERS 194.109.206.212:80"     # dizum
-DIRSERVERS="$DIRSERVERS 213.73.91.31:80"        # dannenberg
-
-TMPFILE="`tempfile`"
-trap 'rm -f "$TMPFILE"' 0
-
-for dirserver in $DIRSERVERS; do
-	wget -q -O "$TMPFILE" "http://$dirserver/tor/keys/fp/$identity"
-	if [ "$?" = 0 ]; then
-		break
-	else
-		cat /dev/null > "$TMPFILE"
-		continue
-	fi
-done
-
-if ! [ -s "$TMPFILE" ] ; then
-	echo "UNKNOWN: Downloading certificate for $identity failed."
-	exit 3
-fi
-
-expirydate="$(awk '$1=="dir-key-expires" {printf "%s %s", $2, $3}' < "$TMPFILE")"
-expiryunix=$(TZ=UTC date -d "$expirydate" +%s)
-now=$(date +%s)
-
-if [ "$now" -ge "$expiryunix" ]; then
-	echo "CRITICAL: Certificate expired $expirydate (authority $identity)."
-	exit 2
-elif [ "$(( $now + 7*24*60*60 ))" -ge "$expiryunix" ]; then
-	echo "CRITICAL: Certificate expires $expirydate (authority $identity)."
-	exit 2
-elif [ "$(( $now + 30*24*60*60 ))" -ge "$expiryunix" ]; then
-	echo "WARNING: Certificate expires $expirydate (authority $identity)."
-	exit 1
-else
-	echo "OK: Certificate expires $expirydate (authority $identity)."
-	exit 0
-fi
diff --git a/contrib/netinst.nsi b/contrib/netinst.nsi
deleted file mode 100644
index 08d950a..0000000
--- a/contrib/netinst.nsi
+++ /dev/null
@@ -1,74 +0,0 @@
-!include "MUI.nsh"
-!include "LogicLib.nsh"
-!include "FileFunc.nsh"
-  
-!define VERSION "0.2.1.13"
-!define INSTALLER "TorNetInstaller.exe"
-!define WEBSITE "https://www.torproject.org/"
-!define LICENSE "LICENSE"
- 
-SetCompressor /SOLID BZIP2
-RequestExecutionLevel user
-OutFile ${INSTALLER}
-InstallDir "$TEMP\TorInstTmp"
-SetOverWrite on
-Name "Tor Network Installer"
-Caption "Tor Network Installer"
-BrandingText "Tor Network Installer"
-CRCCheck on
-XPStyle on
-ShowInstDetails hide
-VIProductVersion "${VERSION}"
-VIAddVersionKey "ProductName" "Tor"
-VIAddVersionKey "Comments" "${WEBSITE}"
-VIAddVersionKey "LegalTrademarks" "Three line BSD"
-VIAddVersionKey "LegalCopyright" "©2004-2011, Roger Dingledine, Nick Mathewson, The Tor Project, Inc."
-VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}"
-VIAddVersionKey "FileVersion" "${VERSION}"
-
-!define MUI_ICON "torinst32.ico"
-!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_LANGUAGE "English"
-
-Section "Tor" Tor
-	SectionIn RO
-	SetOutPath $INSTDIR
-	Call ExtractPackages
-        Call RunInstallers
-        Call LaunchVidalia
-	Call CleanUpTemp
-SectionEnd
-
-Function ExtractPackages
-	File "license.msi"
-	File "thandy.msi"
-FunctionEnd
-
-Function RunInstallers
-	ExecWait 'msiexec /i "$INSTDIR\license.msi" /qn'
-	ExecWait 'msiexec /i "$INSTDIR\thandy.msi" NOSC=1 /qn'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update "--repo=$LOCALAPPDATA\Thandy\Tor Updates" /bundleinfo/tor/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update "--repo=$LOCALAPPDATA\Thandy\Polipo Updates" /bundleinfo/polipo/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update "--repo=$LOCALAPPDATA\Thandy\TorButton Updates" /bundleinfo/torbutton/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update "--repo=$LOCALAPPDATA\Thandy\Vidalia Updates" /bundleinfo/vidalia/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update --install "--repo=$LOCALAPPDATA\Thandy\Tor Updates" /bundleinfo/tor/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update --install "--repo=$LOCALAPPDATA\Thandy\Polipo Updates" /bundleinfo/polipo/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update --install "--repo=$LOCALAPPDATA\Thandy\TorButton Updates" /bundleinfo/torbutton/win32/'
-	ExecWait '"$LOCALAPPDATA\Programs\Thandy\thandy.exe" update --install "--repo=$LOCALAPPDATA\Thandy\Vidalia Updates" /bundleinfo/vidalia/win32/'
-        ExpandEnvStrings $0 %COMSPEC%
-        Exec '"$0" /C "$INSTDIR\tbcheck.bat"'
-FunctionEnd
-
-Function LaunchVidalia
-	SetOutPath "$LOCALAPPDATA\Programs\Vidalia"
-	Exec 'vidalia.exe -loglevel info -logfile log.txt'
-FunctionEnd
-
-Function CleanUpTemp
-	ExecWait '"del" "$INSTDIR\license.msi"'
-	ExecWait '"del" "$INSTDIR\thandy.msi"'
-	SetOutPath $TEMP
-	RMDir /r $TEMP\TorInstTmp
-FunctionEnd
-
diff --git a/contrib/operator-tools/linux-tor-prio.sh b/contrib/operator-tools/linux-tor-prio.sh
new file mode 100644
index 0000000..ea9e0dd
--- /dev/null
+++ b/contrib/operator-tools/linux-tor-prio.sh
@@ -0,0 +1,192 @@
+#!/bin/bash
+# Written by Marco Bonetti & Mike Perry
+# Based on instructions from Dan Singletary's ADSL BW Management HOWTO:
+# http://www.faqs.org/docs/Linux-HOWTO/ADSL-Bandwidth-Management-HOWTO.html
+# This script is Public Domain.
+
+############################### README #################################
+
+# This script provides prioritization of Tor traffic below other
+# traffic on a Linux server. It has two modes of operation: UID based 
+# and IP based. 
+
+# UID BASED PRIORITIZATION
+#
+# The UID based method requires that Tor be launched from 
+# a specific user ID. The "User" Tor config setting is
+# insufficient, as it sets the UID after the socket is created.
+# Here is a C wrapper you can use to execute Tor and drop privs before 
+# it creates any sockets. 
+#
+# Compile with:
+# gcc -DUID=`id -u tor` -DGID=`id -g tor` tor_wrap.c -o tor_wrap
+#
+# #include <unistd.h>
+# int main(int argc, char **argv) {
+# if(initgroups("tor", GID) == -1) { perror("initgroups"); return 1; }
+# if(setresgid(GID, GID, GID) == -1) { perror("setresgid"); return 1; }
+# if(setresuid(UID, UID, UID) == -1) { perror("setresuid"); return 1; }
+# execl("/bin/tor", "/bin/tor", "-f", "/etc/tor/torrc", NULL);
+# perror("execl"); return 1;
+# }
+
+# IP BASED PRIORITIZATION
+#
+# The IP setting requires that a separate IP address be dedicated to Tor. 
+# Your Torrc should be set to bind to this IP for "OutboundBindAddress", 
+# "ListenAddress", and "Address".
+
+# GENERAL USAGE
+#
+# You should also tune the individual connection rate parameters below
+# to your individual connection. In particular, you should leave *some* 
+# minimum amount of bandwidth for Tor, so that Tor users are not 
+# completely choked out when you use your server's bandwidth. 30% is 
+# probably a reasonable choice. More is better of course.
+#
+# To start the shaping, run it as: 
+#   ./linux-tor-prio.sh 
+#
+# To get status information (useful to verify packets are getting marked
+# and prioritized), run:
+#   ./linux-tor-prio.sh status
+#
+# And to stop prioritization:
+#   ./linux-tor-prio.sh stop
+#
+########################################################################
+
+# BEGIN USER TUNABLE PARAMETERS
+
+DEV=eth0
+
+# NOTE! You must START Tor under this UID. Using the Tor User
+# config setting is NOT sufficient. See above.
+TOR_UID=$(id -u tor)
+
+# If the UID mechanism doesn't work for you, you can set this parameter
+# instead. If set, it will take precedence over the UID setting. Note that
+# you need multiple IPs with one specifically devoted to Tor for this to
+# work.
+#TOR_IP="42.42.42.42"
+
+# Average ping to most places on the net, milliseconds
+RTT_LATENCY=40
+
+# RATE_UP must be less than your connection's upload capacity in
+# kbits/sec. If it is larger, then the bottleneck will be at your
+# router's queue, which you do not control. This will cause congestion
+# and a revert to normal TCP fairness no matter what the queing
+# priority is.
+RATE_UP=5000
+
+# RATE_UP_TOR is the minimum speed your Tor connections will have in
+# kbits/sec.  They will have at least this much bandwidth for upload.
+# In general, you probably shouldn't set this too low, or else Tor
+# users who use your node will be completely choked out whenever your
+# machine does any other network activity. That is not very fun.
+RATE_UP_TOR=1500
+
+# RATE_UP_TOR_CEIL is the maximum rate allowed for all Tor trafic in
+# kbits/sec.
+RATE_UP_TOR_CEIL=5000
+
+CHAIN=OUTPUT
+#CHAIN=PREROUTING
+#CHAIN=POSTROUTING
+
+MTU=1500
+AVG_PKT=900 # should be more like 600 for non-exit nodes
+
+# END USER TUNABLE PARAMETERS
+
+
+
+# The queue size should be no larger than your bandwidth-delay
+# product. This is RT latency*bandwidth/MTU/2
+
+BDP=$(expr $RTT_LATENCY \* $RATE_UP / $AVG_PKT)
+
+# Further research indicates that the BDP calculations should use
+# RTT/sqrt(n) where n is the expected number of active connections..
+
+BDP=$(expr $BDP / 4)
+
+if [ "$1" = "status" ]
+then
+	echo "[qdisc]"
+	tc -s qdisc show dev $DEV
+	tc -s qdisc show dev imq0
+	echo "[class]"
+	tc -s class show dev $DEV
+	tc -s class show dev imq0
+	echo "[filter]"
+	tc -s filter show dev $DEV
+	tc -s filter show dev imq0
+	echo "[iptables]"
+	iptables -t mangle -L TORSHAPER-OUT -v -x 2> /dev/null
+	exit
+fi
+
+
+# Reset everything to a known state (cleared)
+tc qdisc del dev $DEV root 2> /dev/null > /dev/null
+tc qdisc del dev imq0 root 2> /dev/null > /dev/null
+iptables -t mangle -D POSTROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null
+iptables -t mangle -D PREROUTING -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null
+iptables -t mangle -D OUTPUT -o $DEV -j TORSHAPER-OUT 2> /dev/null > /dev/null
+iptables -t mangle -F TORSHAPER-OUT 2> /dev/null > /dev/null
+iptables -t mangle -X TORSHAPER-OUT 2> /dev/null > /dev/null
+ip link set imq0 down 2> /dev/null > /dev/null
+rmmod imq 2> /dev/null > /dev/null
+
+if [ "$1" = "stop" ]
+then
+	echo "Shaping removed on $DEV."
+	exit
+fi
+
+# Outbound Shaping (limits total bandwidth to RATE_UP)
+
+ip link set dev $DEV qlen $BDP
+
+# Add HTB root qdisc, default is high prio
+tc qdisc add dev $DEV root handle 1: htb default 20
+
+# Add main rate limit class
+tc class add dev $DEV parent 1: classid 1:1 htb rate ${RATE_UP}kbit
+
+# Create the two classes, giving Tor at least RATE_UP_TOR kbit and capping
+# total upstream at RATE_UP so the queue is under our control.
+tc class add dev $DEV parent 1:1 classid 1:20 htb rate $(expr $RATE_UP - $RATE_UP_TOR)kbit ceil ${RATE_UP}kbit prio 0
+tc class add dev $DEV parent 1:1 classid 1:21 htb rate $[$RATE_UP_TOR]kbit ceil ${RATE_UP_TOR_CEIL}kbit prio 10
+
+# Start up pfifo
+tc qdisc add dev $DEV parent 1:20 handle 20: pfifo limit $BDP
+tc qdisc add dev $DEV parent 1:21 handle 21: pfifo limit $BDP
+
+# filter traffic into classes by fwmark
+tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
+tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
+
+# add TORSHAPER-OUT chain to the mangle table in iptables
+iptables -t mangle -N TORSHAPER-OUT
+iptables -t mangle -I $CHAIN -o $DEV -j TORSHAPER-OUT
+
+
+# Set firewall marks
+# Low priority to Tor
+if [ ""$TOR_IP == "" ]
+then
+	echo "Using UID-based QoS. UID $TOR_UID marked as low priority."
+	iptables -t mangle -A TORSHAPER-OUT -m owner --uid-owner $TOR_UID -j MARK --set-mark 21
+else
+	echo "Using IP-based QoS. $TOR_IP marked as low priority."
+	iptables -t mangle -A TORSHAPER-OUT -s $TOR_IP -j MARK --set-mark 21
+fi
+
+# High prio for everything else
+iptables -t mangle -A TORSHAPER-OUT -m mark --mark 0 -j MARK --set-mark 20
+
+echo "Outbound shaping added to $DEV.  Rate for Tor upload at least: ${RATE_UP_TOR}Kbyte/sec."
+
diff --git a/contrib/operator-tools/tor-exit-notice.html b/contrib/operator-tools/tor-exit-notice.html
new file mode 100644
index 0000000..8cf5c29
--- /dev/null
+++ b/contrib/operator-tools/tor-exit-notice.html
@@ -0,0 +1,144 @@
+<?xml version="1.0"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<title>This is a Tor Exit Router</title>
+
+<!--
+
+This notice is intended to be placed on a virtual host for a domain that
+your Tor exit node IP reverse resolves to so that people who may be about
+to file an abuse complaint would check it first before bothering you or
+your ISP. Ex:
+http://tor-exit.yourdomain.org or http://tor-readme.yourdomain.org.
+
+This type of setup has proven very effective at reducing abuse complaints
+for exit node operators.
+
+There are a few places in this document that you may want to customize.
+They are marked with FIXME.
+
+-->
+
+</head>
+<body>
+
+<p style="text-align:center; font-size:xx-large; font-weight:bold">This is a
+Tor Exit Router</p>
+
+<p>
+Most likely you are accessing this website because you had some issue with
+the traffic coming from this IP. This router is part of the <a
+href="https://www.torproject.org/">Tor Anonymity Network</a>, which is
+dedicated to <a href="https://www.torproject.org/about/overview">providing
+privacy</a> to people who need it most: average computer users. This
+router IP should be generating no other traffic, unless it has been
+compromised.</p>
+
+
+<!-- FIXME: you should probably grab your own copy of how_tor_works_thumb.png
+     and serve it locally -->
+
+<p style="text-align:center">
+<a href="https://www.torproject.org/about/overview">
+<img src="https://www.torproject.org/images/how_tor_works_thumb.png" alt="How Tor works" style="border-style:none"/>
+</a></p>
+
+<p>
+Tor sees use by <a href="https://www.torproject.org/about/torusers">many
+important segments of the population</a>, including whistle blowers,
+journalists, Chinese dissidents skirting the Great Firewall and oppressive
+censorship, abuse victims, stalker targets, the US military, and law
+enforcement, just to name a few.  While Tor is not designed for malicious
+computer users, it is true that they can use the network for malicious ends.
+In reality however, the actual amount of <a
+href="https://www.torproject.org/docs/faq-abuse">abuse</a> is quite low. This
+is largely because criminals and hackers have significantly better access to
+privacy and anonymity than do the regular users whom they prey upon. Criminals
+can and do <a
+href="http://voices.washingtonpost.com/securityfix/2008/08/web_fraud_20_tools.html">build,
+sell, and trade</a> far larger and <a
+href="http://voices.washingtonpost.com/securityfix/2008/08/web_fraud_20_distributing_your.html">more
+powerful networks</a> than Tor on a daily basis. Thus, in the mind of this
+operator, the social need for easily accessible censorship-resistant private,
+anonymous communication trumps the risk of unskilled bad actors, who are
+almost always more easily uncovered by traditional police work than by
+extensive monitoring and surveillance anyway.</p>
+
+<p>
+In terms of applicable law, the best way to understand Tor is to consider it a
+network of routers operating as common carriers, much like the Internet
+backbone. However, unlike the Internet backbone routers, Tor routers
+explicitly do not contain identifiable routing information about the source of
+a packet, and no single Tor node can determine both the origin and destination
+of a given transmission.</p>
+
+<p>
+As such, there is little the operator of this router can do to help you track
+the connection further. This router maintains no logs of any of the Tor
+traffic, so there is little that can be done to trace either legitimate or
+illegitimate traffic (or to filter one from the other).  Attempts to
+seize this router will accomplish nothing.</p>
+
+<!-- FIXME: US-Only section. Remove if you are a non-US operator -->
+
+<p>
+Furthermore, this machine also serves as a carrier of email, which means that
+its contents are further protected under the ECPA. <a
+href="http://www.law.cornell.edu/uscode/text/18/2707">18
+USC 2707</a> explicitly allows for civil remedies ($1000/account
+<i><b>plus</b></i>  legal fees)
+in the event of a seizure executed without good faith or probable cause (it
+should be clear at this point that traffic with an originating IP address of
+FIXME_DNS_NAME should not constitute probable cause to seize the
+machine). Similar considerations exist for 1st amendment content on this
+machine.</p>
+
+<!-- FIXME: May or may not be US-only. Some non-US tor nodes have in
+     fact reported DMCA harassment... -->
+
+<p>
+If you are a representative of a company who feels that this router is being
+used to violate the DMCA, please be aware that this machine does not host or
+contain any illegal content. Also be aware that network infrastructure
+maintainers are not liable for the type of content that passes over their
+equipment, in accordance with <a
+href="http://www.law.cornell.edu/uscode/text/17/512">DMCA
+"safe harbor" provisions</a>. In other words, you will have just as much luck
+sending a takedown notice to the Internet backbone providers. Please consult
+<a href="https://www.torproject.org/eff/tor-dmca-response">EFF's prepared
+response</a> for more information on this matter.</p>
+
+<p>For more information, please consult the following documentation:</p>
+
+<ol>
+<li><a href="https://www.torproject.org/about/overview">Tor Overview</a></li>
+<li><a href="https://www.torproject.org/docs/faq-abuse">Tor Abuse FAQ</a></li>
+<li><a href="https://www.torproject.org/eff/tor-legal-faq">Tor Legal FAQ</a></li>
+</ol>
+
+<p>
+That being said, if you still have a complaint about the router,  you may
+email the <a href="mailto:FIXME_YOUR_EMAIL_ADDRESS">maintainer</a>. If
+complaints are related to a particular service that is being abused, I will
+consider removing that service from my exit policy, which would prevent my
+router from allowing that traffic to exit through it. I can only do this on an
+IP+destination port basis, however. Common P2P ports are
+already blocked.</p>
+
+<p>
+You also have the option of blocking this IP address and others on
+the Tor network if you so desire. The Tor project provides a <a
+href="https://check.torproject.org/cgi-bin/TorBulkExitList.py">web service</a>
+to fetch a list of all IP addresses of Tor exit nodes that allow exiting to a
+specified IP:port combination, and an official <a
+href="https://www.torproject.org/tordnsel/dist/">DNSRBL</a> is also available to
+determine if a given IP address is actually a Tor exit server. Please
+be considerate
+when using these options. It would be unfortunate to deny all Tor users access
+to your site indefinitely simply because of a few bad apples.</p>
+
+</body>
+</html>
diff --git a/contrib/operator-tools/tor.logrotate.in b/contrib/operator-tools/tor.logrotate.in
new file mode 100644
index 0000000..6e75f80
--- /dev/null
+++ b/contrib/operator-tools/tor.logrotate.in
@@ -0,0 +1,14 @@
+ at LOCALSTATEDIR@/log/tor/*log {
+	daily
+	rotate 5
+	compress
+	delaycompress
+	missingok
+	notifempty
+	# you may need to change the username/groupname below
+	create 0640 _tor _tor
+	sharedscripts
+	postrotate
+		/etc/init.d/tor reload > /dev/null
+	endscript
+}
diff --git a/contrib/or-tools/check-tor b/contrib/or-tools/check-tor
new file mode 100755
index 0000000..e981a35
--- /dev/null
+++ b/contrib/or-tools/check-tor
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+## Originally written by Peter Palfrader.
+
+## This script lets you quickly check if a given router (by nickname)
+## will let you do a TLS handshake, or will let you download a directory.
+
+## Usage: check-tor nickname
+
+#set -x
+
+router="$1"
+dirserver="http://belegost.seul.org:80/tor/"
+
+lines=$( wget -q $dirserver --proxy=off -O - | grep -A5 '^router '"$router"' ' )
+line=$( echo "$lines" | head -n1 )
+
+if [ -z "$line" ]; then
+	echo "Not found" >&2
+	exit 1
+fi
+
+echo "$lines"
+echo
+
+ipor=$( echo "$line" | awk '{printf "%s:%s", $3, $4}' )
+
+op=$( echo "$line" | awk '{printf $6}' )
+ipop=$( echo "$line" | awk '{printf "%s:%s", $3, $6}' )
+
+echo
+echo ">>" openssl s_client -connect "$ipor"
+timeout 5 openssl s_client -connect "$ipor" < /dev/null
+if [ "$op" != "0" ]; then
+	echo
+	echo ">>" wget --proxy=off -O - http://$ipop/tor/
+	timeout 5 wget --proxy=off -O - http://$ipop/tor/ | head -n3
+fi
+
+echo
+echo -n "$router "; echo "$lines" | grep 'fingerprint' | sed -e 's/^opt //' -e 's/^fingerprint //';
diff --git a/contrib/or-tools/checksocks.pl b/contrib/or-tools/checksocks.pl
new file mode 100755
index 0000000..3fcc0df
--- /dev/null
+++ b/contrib/or-tools/checksocks.pl
@@ -0,0 +1,83 @@
+#!/usr/bin/perl -w
+
+require 5.005;
+use strict;
+use IO::Socket;
+use Getopt::Std;
+
+# Checks routers for open socks-ports and socks5
+# Successful connects go to STDOUT, failed ones to STDERR.
+# We only do one check per loop in -d mode, so it takes some time.
+
+# Contributed by Peter Kornherr <peter at wuschelpuschel dot org>, and
+# cleaned up by Peter Palfrader <peter at palfrader dot org>.
+
+our($opt_i,$opt_p,$opt_d,$opt_h,$opt_l);
+getopts('i:p:dhl:');
+
+if ($opt_h || !($opt_d||$opt_i||$opt_l)) {
+    print "Usage: $0 -d < file_with_routers_in_it\n";
+    print "or:    $0 -i IP -p Port\n";
+    print "or:    $0 -l IP:Port\n";
+    exit;
+}
+
+if ($opt_d) {
+    open (IN,"<-") or die $!;
+    while (<IN>) {
+        next unless /^router /;
+        (my $routername,my $checkip,my $checkport) = (split(" "))[1,2,4];
+        &do_check($checkip,$checkport,$routername);
+    }
+} elsif ($opt_i && $opt_p) {
+    &do_check($opt_i,$opt_p);
+} elsif ($opt_l) {
+    &do_check(split(":",$opt_l));
+}
+
+sub do_check {
+    (my $checkip, my $checkport,my $routername) = @_;
+    # as socksports may not be published (therefore "0") here,
+    # let's try 9050, the default port:
+    if ($checkport == 0) { $checkport = 9050; }
+    # print "Checking $checkip:$checkport\n";
+    my $s5socket = IO::Socket::INET->new(PeerAddr => $checkip,
+        PeerPort => $checkport, Proto => "tcp", Type => SOCK_STREAM,
+        Timeout => "20");
+    if ($s5socket) {
+        my @got;
+        print $s5socket pack("CCC",'5','1','0');
+        eval {
+            local $SIG{ALRM} = sub { die "alarm\n" };
+            alarm 10;
+            read ($s5socket,$got[0],1);
+            read ($s5socket,$got[1],1);
+            alarm 0;
+        };
+        if ($@) {
+            return; # die unless $@ eq "alarm\n";
+        }
+        if ($got[0] eq pack('C','5')) {
+            if(defined($routername)) {
+                print "Found SOCKS5 at $routername ($checkip:$checkport)\n";
+            } else {
+                print "Found SOCKS5 at $checkip:$checkport\n";
+            }
+        } else {
+            if(defined($routername)) {
+                print "$routername ($checkip:$checkport) answers - " .
+                      "but not SOCKS5.\n";
+            } else {
+                print "$checkip:$checkport answers - but not SOCKS5.\n";
+            }
+        }
+    } else {
+        if(defined($routername)) {
+            print STDERR "Can't connect to $routername " .
+                         "($checkip:$checkport) ($!)\n";
+        } else {
+            print STDERR "Can't connect to $checkip:$checkport ($!)\n";
+        }
+    }
+}
+
diff --git a/contrib/or-tools/exitlist b/contrib/or-tools/exitlist
new file mode 100755
index 0000000..3fd26b5
--- /dev/null
+++ b/contrib/or-tools/exitlist
@@ -0,0 +1,323 @@
+#!/usr/bin/python
+# Copyright 2005-2006 Nick Mathewson
+# See the LICENSE file in the Tor distribution for licensing information.
+
+# Requires Python 2.2 or later.
+
+"""
+ exitlist -- Given a Tor directory on stdin, lists the Tor servers
+ that accept connections to given addreses.
+
+ example usage:
+
+    cat ~/.tor/cached-descriptors* | python exitlist 18.244.0.188:80
+
+ You should look at the "FetchUselessDescriptors" and "FetchDirInfoEarly"
+ config options in the man page.
+
+ Note that this script won't give you a perfect list of IP addresses
+ that might connect to you using Tor.
+ False negatives:
+   - Some Tor servers might exit from other addresses than the one they
+     publish in their descriptor.
+ False positives:
+   - This script just looks at the descriptor lists, so it counts relays
+     that were running a day in the past and aren't running now (or are
+     now running at a different address).
+
+ See https://check.torproject.org/ for an alternative (more accurate!)
+  approach.
+
+"""
+
+#
+# Change this to True if you want more verbose output.  By default, we
+# only print the IPs of the servers that accept any the listed
+# addresses, one per line.
+#
+VERBOSE = False
+
+#
+# Change this to True if you want to reverse the output, and list the
+# servers that accept *none* of the listed addresses.
+#
+INVERSE = False
+
+#
+# Change this list to contain all of the target services you are interested
+# in.  It must contain one entry per line, each consisting of an IPv4 address,
+# a colon, and a port number. This default is only used if we don't learn
+# about any addresses from the command-line.
+#
+ADDRESSES_OF_INTEREST = """
+    1.2.3.4:80
+"""
+
+
+#
+# YOU DO NOT NEED TO EDIT AFTER THIS POINT.
+#
+
+import sys
+import re
+import getopt
+import socket
+import struct
+import time
+
+assert sys.version_info >= (2,2)
+
+
+def maskIP(ip,mask):
+    return "".join([chr(ord(a) & ord(b)) for a,b in zip(ip,mask)])
+
+def maskFromLong(lng):
+    return struct.pack("!L", lng)
+
+def maskByBits(n):
+    return maskFromLong(0xffffffffl ^ ((1L<<(32-n))-1))
+
+class Pattern:
+    """
+    >>> import socket
+    >>> ip1 = socket.inet_aton("192.169.64.11")
+    >>> ip2 = socket.inet_aton("192.168.64.11")
+    >>> ip3 = socket.inet_aton("18.244.0.188")
+
+    >>> print Pattern.parse("18.244.0.188")
+    18.244.0.188/255.255.255.255:1-65535
+    >>> print Pattern.parse("18.244.0.188/16:*")
+    18.244.0.0/255.255.0.0:1-65535
+    >>> print Pattern.parse("18.244.0.188/2.2.2.2:80")
+    2.0.0.0/2.2.2.2:80-80
+    >>> print Pattern.parse("192.168.0.1/255.255.00.0:22-25")
+    192.168.0.0/255.255.0.0:22-25
+    >>> p1 = Pattern.parse("192.168.0.1/255.255.00.0:22-25")
+    >>> import socket
+    >>> p1.appliesTo(ip1, 22)
+    False
+    >>> p1.appliesTo(ip2, 22)
+    True
+    >>> p1.appliesTo(ip2, 25)
+    True
+    >>> p1.appliesTo(ip2, 26)
+    False
+    """
+    def __init__(self, ip, mask, portMin, portMax):
+        self.ip = maskIP(ip,mask)
+        self.mask = mask
+        self.portMin = portMin
+        self.portMax = portMax
+
+    def __str__(self):
+        return "%s/%s:%s-%s"%(socket.inet_ntoa(self.ip),
+                              socket.inet_ntoa(self.mask),
+                              self.portMin,
+                              self.portMax)
+
+    def parse(s):
+        if ":" in s:
+            addrspec, portspec = s.split(":",1)
+        else:
+            addrspec, portspec = s, "*"
+
+        if addrspec == '*':
+            ip,mask = "\x00\x00\x00\x00","\x00\x00\x00\x00"
+        elif '/' not in addrspec:
+            ip = socket.inet_aton(addrspec)
+            mask = "\xff\xff\xff\xff"
+        else:
+            ip,mask = addrspec.split("/",1)
+            ip = socket.inet_aton(ip)
+            if "." in mask:
+                mask = socket.inet_aton(mask)
+            else:
+                mask = maskByBits(int(mask))
+
+        if portspec == '*':
+            portMin = 1
+            portMax = 65535
+        elif '-' not in portspec:
+            portMin = portMax = int(portspec)
+        else:
+            portMin, portMax = map(int,portspec.split("-",1))
+
+        return Pattern(ip,mask,portMin,portMax)
+
+    parse = staticmethod(parse)
+
+    def appliesTo(self, ip, port):
+        return ((maskIP(ip,self.mask) == self.ip) and
+                (self.portMin <= port <= self.portMax))
+
+class Policy:
+    """
+    >>> import socket
+    >>> ip1 = socket.inet_aton("192.169.64.11")
+    >>> ip2 = socket.inet_aton("192.168.64.11")
+    >>> ip3 = socket.inet_aton("18.244.0.188")
+
+    >>> pol = Policy.parseLines(["reject *:80","accept 18.244.0.188:*"])
+    >>> print str(pol).strip()
+    reject 0.0.0.0/0.0.0.0:80-80
+    accept 18.244.0.188/255.255.255.255:1-65535
+    >>> pol.accepts(ip1,80)
+    False
+    >>> pol.accepts(ip3,80)
+    False
+    >>> pol.accepts(ip3,81)
+    True
+    """
+
+    def __init__(self, lst):
+        self.lst = lst
+
+    def parseLines(lines):
+        r = []
+        for item in lines:
+            a,p=item.split(" ",1)
+            if a == 'accept':
+                a = True
+            elif a == 'reject':
+                a = False
+            else:
+                raise ValueError("Unrecognized action %r",a)
+            p = Pattern.parse(p)
+            r.append((p,a))
+        return Policy(r)
+
+    parseLines = staticmethod(parseLines)
+
+    def __str__(self):
+        r = []
+        for pat, accept in self.lst:
+            rule = accept and "accept" or "reject"
+            r.append("%s %s\n"%(rule,pat))
+        return "".join(r)
+
+    def accepts(self, ip, port):
+        for pattern,accept in self.lst:
+            if pattern.appliesTo(ip,port):
+                return accept
+        return True
+
+class Server:
+    def __init__(self, name, ip, policy, published, fingerprint):
+        self.name = name
+        self.ip = ip
+        self.policy = policy
+        self.published = published
+        self.fingerprint = fingerprint
+
+def uniq_sort(lst):
+    d = {}
+    for item in lst: d[item] = 1
+    lst = d.keys()
+    lst.sort()
+    return lst
+
+def run():
+    global VERBOSE
+    global INVERSE
+    global ADDRESSES_OF_INTEREST
+
+    if len(sys.argv) > 1:
+        try:
+            opts, pargs = getopt.getopt(sys.argv[1:], "vx")
+        except getopt.GetoptError, e:
+            print """
+usage: cat ~/.tor/cached-routers* | %s [-v] [-x] [host:port [host:port [...]]]
+    -v  verbose output
+    -x  invert results
+""" % sys.argv[0]
+            sys.exit(0)
+
+        for o, a in opts:
+            if o == "-v":
+                VERBOSE = True
+            if o == "-x":
+                INVERSE = True
+        if len(pargs):
+            ADDRESSES_OF_INTEREST = "\n".join(pargs)
+
+    servers = []
+    policy = []
+    name = ip = None
+    published = 0
+    fp = ""
+    for line in sys.stdin.xreadlines():
+        if line.startswith('router '):
+            if name:
+                servers.append(Server(name, ip, Policy.parseLines(policy),
+                                      published, fp))
+            _, name, ip, rest = line.split(" ", 3)
+            policy = []
+            published = 0
+            fp = ""
+        elif line.startswith('fingerprint') or \
+                 line.startswith('opt fingerprint'):
+            elts = line.strip().split()
+            if elts[0] == 'opt': del elts[0]
+            assert elts[0] == 'fingerprint'
+            del elts[0]
+            fp = "".join(elts)
+        elif line.startswith('accept ') or line.startswith('reject '):
+            policy.append(line.strip())
+        elif line.startswith('published '):
+            date = time.strptime(line[len('published '):].strip(),
+                                 "%Y-%m-%d %H:%M:%S")
+            published = time.mktime(date)
+
+    if name:
+        servers.append(Server(name, ip, Policy.parseLines(policy), published,
+                              fp))
+
+    targets = []
+    for line in ADDRESSES_OF_INTEREST.split("\n"):
+        line = line.strip()
+        if not line: continue
+        p = Pattern.parse(line)
+        targets.append((p.ip, p.portMin))
+
+    # remove all but the latest server of each IP/Nickname pair.
+    latest = {}
+    for s in servers:
+        if (not latest.has_key((s.fingerprint))
+            or s.published > latest[(s.fingerprint)]):
+            latest[s.fingerprint] = s
+    servers = latest.values()
+
+    accepters, rejecters = {}, {}
+    for s in servers:
+        for ip,port in targets:
+            if s.policy.accepts(ip,port):
+                accepters[s.ip] = s
+                break
+        else:
+            rejecters[s.ip] = s
+
+    # If any server at IP foo accepts, the IP does not reject.
+    for k in accepters.keys():
+        if rejecters.has_key(k):
+            del rejecters[k]
+
+    if INVERSE:
+        printlist = rejecters.values()
+    else:
+        printlist = accepters.values()
+
+    ents = []
+    if VERBOSE:
+        ents = uniq_sort([ "%s\t%s"%(s.ip,s.name) for s in printlist ])
+    else:
+        ents = uniq_sort([ s.ip for s in printlist ])
+    for e in ents:
+        print e
+
+def _test():
+    import doctest, exitparse
+    return doctest.testmod(exitparse)
+#_test()
+
+run()
+
diff --git a/contrib/package_nsis-mingw.sh b/contrib/package_nsis-mingw.sh
deleted file mode 100644
index b8a46cd..0000000
--- a/contrib/package_nsis-mingw.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/sh
-#
-# ===============================================================================
-# package_nsis-ming.sh is distributed under this license:
-
-# Copyright (c) 2006-2007 Andrew Lewman
-# Copyright (c) 2008 The Tor Project, Inc.
-
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-
-#     * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-
-#     * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-
-#     * Neither the names of the copyright owners nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-# ===============================================================================
-
-# Script to package a Tor installer on win32.  This script assumes that
-# you have already built Tor, that you are running msys/mingw, and that
-# you know what you are doing.
-
-# Start in the tor source directory after you've compiled tor.exe
-# This means start as ./contrib/package_nsis-mingw.sh
-
-rm -rf win_tmp
-mkdir win_tmp
-mkdir win_tmp/bin
-mkdir win_tmp/contrib
-mkdir win_tmp/doc
-mkdir win_tmp/doc/spec
-mkdir win_tmp/doc/design-paper
-mkdir win_tmp/doc/contrib
-mkdir win_tmp/src
-mkdir win_tmp/src/config
-mkdir win_tmp/tmp
-
-cp src/or/tor.exe win_tmp/bin/
-cp src/tools/tor-resolve.exe win_tmp/bin/
-cp contrib/tor.ico win_tmp/bin/
-cp src/config/geoip win_tmp/bin/
-strip win_tmp/bin/*.exe
-
-# There is no man2html in mingw.  
-# Maybe we should add this into make dist instead.
-# One has to do this manually and cp it do the tor-source/doc dir
-#man2html doc/tor.1.in > win_tmp/tmp/tor-reference.html
-#man2html doc/tor-resolve.1 > win_tmp/tmp/tor-resolve.html
-
-clean_newlines() {
-    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg;' $1 >$2
-}
-
-clean_localstatedir() {
-    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2
-}
-
-for fn in address-spec.txt bridges-spec.txt control-spec.txt dir-spec.txt path-spec.txt rend-spec.txt socks-extensions.txt tor-spec.txt version-spec.txt; do
-    clean_newlines doc/spec/$fn win_tmp/doc/spec/$fn
-done
-
-for fn in HACKING tor-gencert.html tor.html torify.html tor-resolve.html; do
-    clean_newlines doc/$fn win_tmp/doc/$fn
-done
-
-for fn in README ChangeLog LICENSE; do
-    clean_newlines $fn win_tmp/$fn
-done
-
-clean_localstatedir src/config/torrc.sample.in win_tmp/src/config/torrc.sample
-
-cp contrib/tor-mingw.nsi.in win_tmp/contrib/
-
-cd win_tmp
-makensis.exe contrib/tor-mingw.nsi.in
-
diff --git a/contrib/package_nsis-weasel.sh b/contrib/package_nsis-weasel.sh
deleted file mode 100755
index 8dd4948..0000000
--- a/contrib/package_nsis-weasel.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/sh
-
-set -e
-
-#
-# Script to package a Tor installer on win32.  This script assumes that
-# you have already built Tor, that you are running cygwin, and that your
-# environment is basically exactly the same as Nick's.
-
-if ! [ -d Win32Build ] || ! [ -d contrib ]; then
-	echo "No Win32Build and/or no contrib directory here.  Are we in the right place?" >&2
-	exit 1
-fi
-
-rm -rf win_tmp
-mkdir win_tmp
-mkdir win_tmp/bin
-mkdir win_tmp/contrib
-mkdir win_tmp/doc
-mkdir win_tmp/doc/website
-mkdir win_tmp/doc/design-paper
-mkdir win_tmp/doc/contrib
-mkdir win_tmp/src
-mkdir win_tmp/src/config
-mkdir win_tmp/tmp
-
-cp Win32Build/vc7/Tor/Debug/Tor.exe win_tmp/bin/tor.exe
-cp Win32Build/vc7/tor_resolve/Debug/tor_resolve.exe win_tmp/bin
-cp ../c-windows-system32/libeay32.dll win_tmp/bin
-cp ../c-windows-system32/ssleay32.dll win_tmp/bin
-
-man2html doc/tor.1.in > win_tmp/tmp/tor-reference.html
-man2html doc/tor-resolve.1 > win_tmp/tmp/tor-resolve.html
-
-clean_newlines() {
-    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg;' $1 >$2
-}
-
-clean_localstatedir() {
-    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2
-}
-
-for fn in \
-	doc/HACKING \
-	doc/control-spec.txt \
-	doc/dir-spec.txt \
-	doc/rend-spec.txt \
-	doc/socks-extensions.txt \
-	doc/tor-spec.txt \
-	doc/version-spec.txt \
-	\
-	doc/website/* \
-	; do
-    clean_newlines "$fn" win_tmp/"$fn"
-done
-mmv win_tmp/doc/website/"*.html.*" win_tmp/doc/website/"#1.#2.html"
-
-cp doc/design-paper/tor-design.pdf win_tmp/doc/design-paper/tor-design.pdf
-
-for fn in tor-reference.html tor-resolve.html; do \
-    clean_newlines win_tmp/tmp/$fn win_tmp/doc/$fn
-done
-
-for fn in README AUTHORS ChangeLog LICENSE; do \
-    clean_newlines $fn win_tmp/$fn
-done
-
-clean_localstatedir src/config/torrc.sample.in win_tmp/src/config/torrc.sample
-
-cp contrib/tor.nsi.in win_tmp/contrib/tor.nsi
-(
-	echo '/WEBSITE-FILES-HERE/'
-	echo 'a' # append
-	for fn in win_tmp/doc/website/*; do
-		echo -n 'File "..\doc\website\'
-		echo -n "`basename $fn`"
-		echo '"'
-	done
-	echo "." # end input
-	echo "w" # write
-	echo "q" # quit
-) | ed win_tmp/contrib/tor.nsi
-
-cd win_tmp/contrib
-
-echo "Now run"
-echo '  t:'
-echo '  cd \tor\win_tmp\contrib'
-echo '  c:\programme\nsis\makensis tor.nsi'
-echo '  move tor-*.exe ../../..'
diff --git a/contrib/package_nsis.sh b/contrib/package_nsis.sh
deleted file mode 100644
index 863dfdf..0000000
--- a/contrib/package_nsis.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/sh
-#
-# Script to package a Tor installer on win32.  This script assumes that
-# you have already built Tor, that you are running cygwin, and that your
-# environment is basically exactly the same as Nick's.
-
-# This file is obsolete.
-
-rm -rf win_tmp
-mkdir win_tmp
-mkdir win_tmp/bin
-mkdir win_tmp/contrib
-mkdir win_tmp/doc
-mkdir win_tmp/doc/design-paper
-mkdir win_tmp/doc/contrib
-mkdir win_tmp/src
-mkdir win_tmp/src/config
-mkdir win_tmp/tmp
-
-cp Win32Build/vc7/Tor/Debug/Tor.exe win_tmp/bin/tor.exe
-cp Win32Build/vc7/tor_resolve/Debug/tor_resolve.exe win_tmp/bin
-cp c:/windows/system32/libeay32.dll win_tmp/bin
-cp c:/windows/system32/ssleay32.dll win_tmp/bin
-
-man2html doc/tor.1.in > win_tmp/tmp/tor-reference.html
-man2html doc/tor-resolve.1 > win_tmp/tmp/tor-resolve.html
-
-clean_newlines() {
-    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg;' $1 >$2
-}
-
-clean_localstatedir() {
-    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2
-}
-
-for fn in tor-spec.txt HACKING rend-spec.txt control-spec.txt \
-   tor-doc.html tor-doc.css version-spec.txt; do
-    clean_newlines doc/$fn win_tmp/doc/$fn
-done
-
-cp doc/design-paper/tor-design.pdf win_tmp/doc/design-paper/tor-design.pdf
-
-for fn in tor-reference.html tor-resolve.html; do \
-    clean_newlines win_tmp/tmp/$fn win_tmp/doc/$fn
-done
-
-for fn in README AUTHORS ChangeLog LICENSE; do \
-    clean_newlines $fn win_tmp/$fn
-done
-
-clean_localstatedir src/config/torrc.sample.in win_tmp/src/config/torrc.sample
-
-cp contrib/tor.nsi win_tmp/contrib
-
-cd win_tmp/contrib
-makensis tor.nsi
-mv tor-*.exe ../..
diff --git a/contrib/polipo/Makefile.mingw b/contrib/polipo/Makefile.mingw
deleted file mode 100644
index ddb20ec..0000000
--- a/contrib/polipo/Makefile.mingw
+++ /dev/null
@@ -1,100 +0,0 @@
-PREFIX = Polipo
-BINDIR = $(PREFIX)\bin
-MANDIR = $(PREFIX)\man
-INFODIR = $(PREFIX)\info
-LOCAL_ROOT = $(PREFIX)
-DISK_CACHE_ROOT = $(PREFIX)\cache
-
-# To compile with Unix CC:
-
-# CDEBUGFLAGS=-O
-
-# To compile with GCC:
-
-# CC = gcc
-# CDEBUGFLAGS = -Os -g -Wall -std=gnu99
-CDEBUGFLAGS = -Os -g -Wall
-# CDEBUGFLAGS = -Os -Wall
-# CDEBUGFLAGS = -g -Wall
-
-# To compile on a pure POSIX system:
-
-# CC = c89
-# CC = c99
-# CDEBUGFLAGS=-O
-
-# To compile with icc 7, you need -restrict.  (Their bug.)
-
-# CC=icc
-# CDEBUGFLAGS = -O -restrict
-
-# On System V (Solaris, HP/UX) you need the following:
-
-# PLATFORM_DEFINES = -DSVR4
-
-# On Solaris, you need the following:
-
-# LDLIBS = -lsocket -lnsl -lresolv
-
-# On mingw, you need
-
- EXE=.exe
- LDLIBS = -lwsock32 -lregex
-
-FILE_DEFINES = -DHAVE_REGEX
-
-# You may optionally also add any of the following to DEFINES:
-#
-#  -DNO_DISK_CACHE to compile out the on-disk cache and local web server;
-#  -DNO_IPv6 to avoid using the RFC 3493 API and stick to stock
-#      Berkeley sockets;
-#  -DHAVE_IPv6 to force the use of the RFC 3493 API on systems other
-#      than GNU/Linux and BSD (let me know if it works);
-#  -DNO_FANCY_RESOLVER to compile out the asynchronous name resolution
-#      code;
-#  -DNO_STANDARD_RESOLVER to compile out the code that falls back to
-#      gethostbyname/getaddrinfo when DNS requests fail;
-#  -DNO_TUNNEL to compile out the code that handles CONNECT requests;
-#  -DNO_SOCKS to compile out the SOCKS gateway code.
-#  -DNO_FORBIDDEN to compile out the all of the forbidden URL code
-#  -DNO_REDIRECTOR to compile out the Squid-style redirector code
-#  -DNO_SYSLOG to compile out logging to syslog
-
-DEFINES = $(FILE_DEFINES) $(PLATFORM_DEFINES)
-
-CFLAGS = $(MD5INCLUDES) $(CDEBUGFLAGS) $(DEFINES) $(EXTRA_DEFINES)
-
-SRCS = util.c event.c io.c chunk.c atom.c object.c log.c diskcache.c main.c \
-       config.c local.c http.c client.c server.c auth.c tunnel.c \
-       http_parse.c parse_time.c dns.c forbidden.c \
-       md5import.c md5.c ftsimport.c fts_compat.c socks.c mingw.c
-
-OBJS = util.o event.o io.o chunk.o atom.o object.o log.o diskcache.o main.o \
-       config.o local.o http.o client.o server.o auth.o tunnel.o \
-       http_parse.o parse_time.o dns.o forbidden.o \
-       md5import.o ftsimport.o socks.o mingw.o
-
-polipo$(EXE): $(OBJS)
-	$(CC) $(CFLAGS) $(LDFLAGS) -o polipo$(EXE) $(OBJS) $(MD5LIBS) $(LDLIBS)
-
-ftsimport.o: ftsimport.c fts_compat.c
-
-md5import.o: md5import.c md5.c
-
-.PHONY: all install install.binary install.man
-
-all: polipo$(EXE) polipo.info html/index.html localindex.html
-
-TAGS: $(SRCS)
-	etags $(SRCS)
-
-.PHONY: clean
-
-clean:
-	-rm -f polipo$(EXE) *.o *~ core TAGS gmon.out
-	-rm -f polipo.cp polipo.fn polipo.log polipo.vr
-	-rm -f polipo.cps polipo.info* polipo.pg polipo.toc polipo.vrs
-	-rm -f polipo.aux polipo.dvi polipo.ky polipo.ps polipo.tp
-	-rm -f polipo.dvi polipo.ps polipo.ps.gz polipo.pdf polipo.html
-	-rm -rf ./html/
-	-rm -f polipo.man.html
diff --git a/contrib/polipo/README b/contrib/polipo/README
deleted file mode 100644
index 1110ca2..0000000
--- a/contrib/polipo/README
+++ /dev/null
@@ -1,47 +0,0 @@
-Copyright 2007-2008, Andrew Lewman
-Copyright 2009-2011, The Tor Project
-
-----------------
-General Comments
-----------------
-
-These are some hacks for making polipo work and install a package native
-to Windows.
-
-They need some work before they can be committed upstream:
-  - Change the Makefile so it has a specific build such as "make
-    dist-win32"
-  - Configure the options for tor in polipo config, just leave them
-    commented out for easy activation.
-  - Work out better polipo config options for Tor.
-
-As always, I'm happy to accept patches.
-
---------------------------
-Pre-requisites for Windows
---------------------------
-
-Polipo for Win32 requires the mingw gnu regex library and dlls at
-http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=73286&release_id=140957
-
-You'll need to download the -bin and -dev tarballs.  And extract them
-into your MinGW directory.
-
-Instructions for building polipo under mingw32 for Windows:
-1) Copy Makefile.mingw over Makefile.
-2) Run 'make'. 
-
-You should have a polipo.exe in the current directory.
-
--------------------------------------------
-Creating an installation package in Windows
--------------------------------------------
-
-If you want to build an installer using the Nullsoft Installer, install
-the NSI Compiler.  In Windows Explorer, navigate to the directory in
-which you placed polipo-mingw.nsi.  Right click on polipo-mingw.nsi and
-choose Compile NSIS Script.  You'll then create a polipo installer.
-
-The Polipo NSI installer assumes libgnurx-0.dll is in the same directory as polipo.exe.
-You'll need to copy libgnurx-0.dll into "./" in order to make the
-installation package.
diff --git a/contrib/polipo/polipo-mingw.nsi b/contrib/polipo/polipo-mingw.nsi
deleted file mode 100644
index f119675..0000000
--- a/contrib/polipo/polipo-mingw.nsi
+++ /dev/null
@@ -1,172 +0,0 @@
-;polipo-mingw.nsi - A basic win32 installer for Polipo
-; Originally written by J Doe.
-; Modified by Andrew Lewman
-; This is licensed under a Modified BSD license.
-;-----------------------------------------
-;
-!include "MUI.nsh"
-
-!define VERSION "1.0.4.0-forbidden-1"
-!define INSTALLER "polipo-${VERSION}-win32.exe"
-!define WEBSITE "http://www.pps.jussieu.fr/~jch/software/polipo/"
-
-!define LICENSE "COPYING"
-;BIN is where it expects to find polipo.exe
-!define BIN "."
-
-SetCompressor lzma
-OutFile ${INSTALLER}
-InstallDir $PROGRAMFILES\Polipo
-SetOverWrite ifnewer
-
-Name "Polipo"
-Caption "Polipo ${VERSION} Setup"
-BrandingText "A Caching Web Proxy"
-CRCCheck on
-XPStyle on
-VIProductVersion "${VERSION}"
-VIAddVersionKey "ProductName" "Polipo: A caching web proxy"
-VIAddVersionKey "Comments" "http://www.pps.jussieu.fr/~jch/software/polipo/"
-VIAddVersionKey "LegalTrademarks" "See COPYING"
-VIAddVersionKey "LegalCopyright" "©2008, Juliusz Chroboczek"
-VIAddVersionKey "FileDescription" "Polipo is a caching web proxy."
-VIAddVersionKey "FileVersion" "${VERSION}"
-
-!define MUI_WELCOMEPAGE_TITLE "Welcome to the Polipo ${VERSION} Setup Wizard"
-!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Polipo ${VERSION}.\r\n\r\nIf you have previously installed Polipo and it is currently running, please exit Polipo first before continuing this installation.\r\n\r\n$_CLICK"
-!define MUI_ABORTWARNING
-!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico"
-!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico"
-!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
-!define MUI_HEADERIMAGE
-;!define MUI_FINISHPAGE_RUN 
-!define MUI_FINISHPAGE_LINK "Visit the Polipo website for the latest updates."
-!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE}
-
-!insertmacro MUI_PAGE_WELCOME
-!insertmacro MUI_PAGE_COMPONENTS
-!insertmacro MUI_PAGE_DIRECTORY
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_PAGE_FINISH
-!insertmacro MUI_UNPAGE_WELCOME
-!insertmacro MUI_UNPAGE_CONFIRM
-!insertmacro MUI_UNPAGE_INSTFILES
-!insertmacro MUI_UNPAGE_FINISH
-!insertmacro MUI_LANGUAGE "English"
-
-Var configfile
-Var forbiddenfile
-
-;Sections
-;--------
-
-Section "Polipo" Polipo
-;Files that have to be installed for polipo to run and that the user
-;cannot choose not to install
-   SectionIn RO
-   SetOutPath $INSTDIR
-   File "${BIN}\polipo.exe"
-   File "${BIN}\COPYING"
-   File "${BIN}\CHANGES"
-   File "${BIN}\config.sample"
-   File "${BIN}\forbidden.sample"
-   File "${BIN}\README.Windows"
-   File "${BIN}\libgnurx-0.dll"
-   WriteIniStr "$INSTDIR\Polipo Website.url" "InternetShortcut" "URL" ${WEBSITE}
-
-   StrCpy $configfile "config"
-   StrCpy $forbiddenfile "forbidden"
-   SetOutPath $INSTDIR
-   ;If there's already a polipo config file, ask if they want to
-   ;overwrite it with the new one.
-   IfFileExists "$INSTDIR\config" "" endifconfig
-      MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Polipo config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDNO yesreplace
-      Delete $INSTDIR\config
-      Goto endifconfig
-     yesreplace:
-      StrCpy $configfile ".\config.sample"
-   endifconfig:
-   File /oname=$configfile ".\config.sample"
-   ;If there's already a polipo forbidden file, ask if they want to
-   ;overwrite it with the new one.
-   IfFileExists "$INSTDIR\forbidden" "" endifforbidden
-      MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Polipo forbidden file.$\r$\nDo you want to overwrite it with the default sample forbidden file?" IDNO forbidyesreplace
-      Delete $INSTDIR\forbidden
-      Goto endifforbidden
-     forbidyesreplace:
-      StrCpy $forbiddenfile ".\forbidden.sample"
-   endifforbidden:
-   File /oname=$forbiddenfile ".\forbidden.sample"
-   IfFileExists "$INSTDIR\bin\*.*" "" endifbinroot
-	CreateDirectory "$INSTDIR\bin"
-   endifbinroot:
-   CopyFiles "${BIN}\localindex.html" $INSTDIR\index.html
-   IfFileExists "$INSTDIR\cache\*.*" "" endifcache
-	CreateDirectory "$INSTDIR\cache"
-   endifcache:
-SectionEnd
-
-SubSection /e "Shortcuts" Shortcuts
-
-Section "Start Menu" StartMenu
-   SetOutPath $INSTDIR
-   IfFileExists "$SMPROGRAMS\Polipo\*.*" "" +2
-      RMDir /r "$SMPROGRAMS\Polipo"
-   CreateDirectory "$SMPROGRAMS\Polipo"
-   CreateShortCut "$SMPROGRAMS\Polipo\Polipo.lnk" "$INSTDIR\polipo.exe" "-c config" 
-   CreateShortCut "$SMPROGRAMS\Polipo\Poliporc.lnk" "Notepad.exe" "$INSTDIR\config"
-   CreateShortCut "$SMPROGRAMS\Polipo\Polipo Documentation.lnk" "$INSTDIR\www\index.html"
-   CreateShortCut "$SMPROGRAMS\Polipo\Polipo Website.lnk" "$INSTDIR\Polipo Website.url"
-   CreateShortCut "$SMPROGRAMS\Polipo\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
-SectionEnd
-
-Section "Desktop" Desktop
-   SetOutPath $INSTDIR
-   CreateShortCut "$DESKTOP\Polipo.lnk" "$INSTDIR\polipo.exe" "-c config" 
-SectionEnd
-
-Section /o "Run at startup" Startup
-   SetOutPath $INSTDIR
-   CreateShortCut "$SMSTARTUP\Polipo.lnk" "$INSTDIR\polipo.exe" "-c config -f forbidden" "" "" "" SW_SHOWMINIMIZED
-SectionEnd
-
-SubSectionEnd
-
-Section "Uninstall"
-   Delete "$DESKTOP\Polipo.lnk"
-   Delete "$INSTDIR\polipo.exe"
-   Delete "$INSTDIR\Polipo Website.url"
-   Delete "$INSTDIR\config"
-   Delete "$INSTDIR\config.sample"
-   Delete "$INSTDIR\forbidden.sample"
-   Delete "$INSTDIR\libgnurx-0.dll"
-   Delete "$INSTDIR\COPYING"
-   Delete "$INSTDIR\CHANGES"
-   Delete "$INSTDIR\README.Windows"
-   StrCmp $INSTDIR $INSTDIR +2 ""
-      RMDir /r $INSTDIR
-   Delete "$INSTDIR\Uninstall.exe"
-   RMDir /r "$INSTDIR\Documents"
-   RMDir $INSTDIR
-   RMDir /r "$SMPROGRAMS\Polipo"
-   RMDir /r "$APPDATA\Polipo"
-   Delete "$SMSTARTUP\Polipo.lnk"
-   DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Polipo"
-SectionEnd
-
-Section -End
-    WriteUninstaller "$INSTDIR\Uninstall.exe"
-    ;The registry entries simply add the Polipo uninstaller to the Windows
-    ;uninstall list.
-    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Polipo" "DisplayName" "Polipo (remove only)"
-    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Polipo" "UninstallString" '"$INSTDIR\Uninstall.exe"'
-SectionEnd
-
-!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
-  !insertmacro MUI_DESCRIPTION_TEXT ${Polipo} "The core executable and config files needed for Polipo to run."
-  !insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Polipo"
-  !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Polipo and its documentation from the Start Menu"
-  !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Polipo from the desktop"
-  !insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Polipo automatically at startup in a minimized window"
-!insertmacro MUI_FUNCTION_DESCRIPTION_END
-
diff --git a/contrib/rc.subr b/contrib/rc.subr
deleted file mode 100644
index d757e89..0000000
--- a/contrib/rc.subr
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/bin/sh
-# $FreeBSD: ports/security/tor-devel/files/tor.in,v 1.1 2006/02/17 22:21:25 mnag Exp $
-#
-# (rc.subr written by Peter Thoenen for Net/FreeBSD)
-#
-# REQUIRE: NETWORKING SERVERS USR
-# BEFORE: LOGIN
-#
-# Add the following lines to /etc/rc.conf to enable tor
-#
-# tor_enable (bool):    Set to "NO" by default
-#                       Set it to "YES" to enable tor
-# tor_conf (str):       Points to your tor conf file
-#                       Default: /usr/local/etc/tor/torrc
-# tor_user (str):       Tor Daemon user. Default _tor
-#
-
-. /etc/rc.subr
-
-name="tor"
-rcvar=${name}_enable
-
-load_rc_config ${name}
-
-: ${tor_enable="NO"}
-: ${tor_conf="/usr/local/etc/tor/torrc"}
-: ${tor_user="_tor"}
-: ${tor_pidfile="/var/run/tor/tor.pid"}
-: ${tor_logfile="/var/log/tor"}
-: ${tor_datadir="/var/run/tor"}
-
-required_files=${tor_conf}
-required_dirs=${tor_datadir}
-command="/usr/local/bin/${name}"
-command_args="-f ${tor_conf} --pidfile ${tor_pidfile} --runasdaemon 1 --datadirectory ${tor_datadir} --user ${tor_user}"
-extra_commands="log"
-log_cmd="${name}_log"
-
-tor_log() {
-        cat ${tor_logfile}
-}
-
-run_rc_command "$1"
diff --git a/contrib/redox.py b/contrib/redox.py
deleted file mode 100755
index 550f846..0000000
--- a/contrib/redox.py
+++ /dev/null
@@ -1,228 +0,0 @@
-#!/usr/bin/python
-#
-#  Copyright (c) 2008-2013, The Tor Project, Inc.
-#  See LICENSE for licensing information.
-#
-# Hi!
-# I'm redox.py, the Tor redocumentation tool!
-# I am a horrible hack!
-# I read the output of doxygen from stderr, and add missing DOCDOC comments
-#   to tell you where documentation should go!
-# To use me, edit the stuff below...
-#  ...and run 'make doxygen 2>doxygen.stderr' ...
-#  ...and run ./contrib/redox.py < doxygen.stderr !
-# I'll make a bunch of new files by adding missing DOCDOC comments to your
-#    source.  Those files will have names like ./src/common/util.c.newdoc.
-# You will want to look over the changes by hand before checking them in.
-#
-# So, here's your workflow:
-#
-# 0. Make sure you're running a bourne shell for the redirects below.
-# 1. make doxygen 1>doxygen.stdout 2>doxygen.stderr.
-# 2. grep Warning doxygen.stderr | grep -v 'is not documented' | less
-#      [This will tell you about all the bogus doxygen output you have]
-# 3. python ./contrib/redox.py <doxygen.stderr
-#      [This will make lots of .newdoc files with DOCDOC comments for
-#       whatever was missing documentation.]
-# 4. Look over those .newdoc files, and see which docdoc comments you
-#     want to merge into the main file.  If it's all good, just run
-#     "mv fname.c.newdoc fname.c".  Otherwise, you'll need to merge
-#     the parts you like by hand.
-
-# Which files should we ignore warning from?  Mostly, these are external
-# files that we've snarfed in from somebody else, whose C we do no intend
-# to document for them.
-SKIP_FILES = [ "OpenBSD_malloc_Linux.c",
-               "eventdns.c",
-               "eventdns.h",
-               "strlcat.c",
-               "strlcpy.c",
-               "sha256.c",
-               "sha256.h",
-               "aes.c",
-               "aes.h" ]
-
-# What names of things never need javadoc
-SKIP_NAME_PATTERNS = [ r'^.*_c_id$',
-                       r'^.*_H_ID$' ]
-
-# Which types of things should get DOCDOC comments added if they are
-# missing documentation?  Recognized types are in KINDS below.
-ADD_DOCDOCS_TO_TYPES = [ 'function', 'type', 'typedef' ]
-ADD_DOCDOCS_TO_TYPES += [ 'variable', ]
-
-# ====================
-# The rest of this should not need hacking.
-
-import re
-import sys
-
-KINDS = [ "type", "field", "typedef", "define", "function", "variable",
-          "enumeration" ]
-
-NODOC_LINE_RE = re.compile(r'^([^:]+):(\d+): (\w+): (.*) is not documented\.$')
-
-THING_RE = re.compile(r'^Member ([a-zA-Z0-9_]+).*\((typedef|define|function|variable|enumeration|macro definition)\) of (file|class) ')
-
-SKIP_NAMES = [re.compile(s) for s in SKIP_NAME_PATTERNS]
-
-def parsething(thing):
-    """I figure out what 'foobar baz in quux quum is not documented' means,
-       and return: the name of the foobar, and the kind of the foobar.
-    """
-    if thing.startswith("Compound "):
-        tp, name = "type", thing.split()[1]
-    else:
-        m = THING_RE.match(thing)
-        if not m:
-            print thing, "???? Format didn't match."
-            return None, None
-        else:
-            name, tp, parent = m.groups()
-            if parent == 'class':
-                if tp == 'variable' or tp == 'function':
-                    tp = 'field'
-
-    return name, tp
-
-def read():
-    """I snarf doxygen stderr from stdin, and parse all the "foo has no
-       documentation messages.  I return a map from filename to lists
-       of tuples of (alleged line number, name of thing, kind of thing)
-    """
-    errs = {}
-    for line in sys.stdin:
-        m = NODOC_LINE_RE.match(line)
-        if m:
-            file, line, tp, thing = m.groups()
-            assert tp.lower() == 'warning'
-            name, kind = parsething(thing)
-            errs.setdefault(file, []).append((int(line), name, kind))
-
-    return errs
-
-def findline(lines, lineno, ident):
-    """Given a list of all the lines in the file (adjusted so 1-indexing works),
-       a line number that ident is alledgedly on, and ident, I figure out
-       the line where ident was really declared."""
-    lno = lineno
-    for lineno in xrange(lineno, 0, -1):
-        try:
-            if ident in lines[lineno]:
-                return lineno
-        except IndexError:
-            continue
-
-    return None
-
-FUNC_PAT = re.compile(r"^[A-Za-z0-9_]+\(")
-
-def hascomment(lines, lineno, kind):
-    """I return true if it looks like there's already a good comment about
-       the thing on lineno of lines of type kind. """
-    if "*/" in lines[lineno-1]:
-        return True
-    if kind == 'function' and FUNC_PAT.match(lines[lineno]):
-        if "*/" in lines[lineno-2]:
-            return True
-    return False
-
-def hasdocdoc(lines, lineno, kind):
-    """I return true if it looks like there's already a docdoc comment about
-       the thing on lineno of lines of type kind."""
-    try:
-        if "DOCDOC" in lines[lineno]:
-            return True
-    except IndexError:
-        pass
-    try:
-        if "DOCDOC" in lines[lineno-1]:
-            return True
-    except IndexError:
-        pass
-    if kind == 'function' and FUNC_PAT.match(lines[lineno]):
-        if "DOCDOC" in lines[lineno-2]:
-            return True
-    return False
-
-def checkf(fn, errs):
-    """I go through the output of read() for a single file, and build a list
-       of tuples of things that want DOCDOC comments.  Each tuple has:
-       the line number where the comment goes; the kind of thing; its name.
-    """
-    for skip in SKIP_FILES:
-        if fn.endswith(skip):
-            print "Skipping",fn
-            return
-
-    comments = []
-    lines = [ None ]
-    try:
-        lines.extend( open(fn, 'r').readlines() )
-    except IOError:
-        return
-
-    for line, name, kind in errs:
-        if any(pat.match(name) for pat in SKIP_NAMES):
-            continue
-
-        if kind not in ADD_DOCDOCS_TO_TYPES:
-            continue
-
-        ln = findline(lines, line, name)
-        if ln == None:
-            print "Couldn't find the definition of %s allegedly on %s of %s"%(
-                name, line, fn)
-        else:
-            if hasdocdoc(lines, line, kind):
-#                print "Has a DOCDOC"
-#                print fn, line, name, kind
-#                print "\t",lines[line-2],
-#                print "\t",lines[line-1],
-#                print "\t",lines[line],
-#                print "-------"
-                pass
-            else:
-                if kind == 'function' and FUNC_PAT.match(lines[ln]):
-                    ln = ln - 1
-
-                comments.append((ln, kind, name))
-
-    return comments
-
-def applyComments(fn, entries):
-    """I apply lots of comments to the file in fn, making a new .newdoc file.
-    """
-    N = 0
-
-    lines = [ None ]
-    try:
-        lines.extend( open(fn, 'r').readlines() )
-    except IOError:
-        return
-
-    # Process the comments in reverse order by line number, so that
-    # the line numbers for the ones we haven't added yet remain valid
-    # until we add them.  Standard trick.
-    entries.sort()
-    entries.reverse()
-
-    for ln, kind, name in entries:
-
-        lines.insert(ln, "/* DOCDOC %s */\n"%name)
-        N += 1
-
-    outf = open(fn+".newdoc", 'w')
-    for line in lines[1:]:
-        outf.write(line)
-    outf.close()
-
-    print "Added %s DOCDOCs to %s" %(N, fn)
-
-e = read()
-
-for fn, errs in e.iteritems():
-    print `(fn, errs)`
-    comments = checkf(fn, errs)
-    if comments:
-        applyComments(fn, comments)
diff --git a/contrib/scan-build.sh b/contrib/scan-build.sh
deleted file mode 100644
index 623b227..0000000
--- a/contrib/scan-build.sh
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-# Copyright 2014 The Tor Project, Inc
-# See LICENSE for licensing information
-#
-# This script is used for running a bunch of clang scan-build checkers
-# on Tor.  
-#
-# It has hardwired paths for Nick's desktop at the moment.
-
-CHECKERS="\
-    --use-analyzer=/opt/clang-3.4/bin/clang \
-    -disable-checker deadcode.DeadStores \
-    -enable-checker alpha.core.CastSize \
-    -enable-checker alpha.core.CastToStruct \
-    -enable-checker alpha.core.IdenticalExpr \
-    -enable-checker alpha.core.SizeofPtr \
-    -enable-checker alpha.security.ArrayBoundV2 \
-    -enable-checker alpha.security.MallocOverflow \
-    -enable-checker alpha.security.ReturnPtrRange \
-    -enable-checker alpha.unix.SimpleStream
-    -enable-checker alpha.unix.cstring.BufferOverlap \
-    -enable-checker alpha.unix.cstring.NotNullTerminated \
-    -enable-checker alpha.unix.cstring.OutOfBounds \
-    -enable-checker alpha.core.FixedAddr \
-    -enable-checker security.insecureAPI.strcpy
-"
-
-/opt/clang-3.4/bin/scan-build/scan-build \
-    $CHECKERS \
-    --use-analyzer=/opt/clang-3.4/bin/clang \
-    ./configure
-
-/opt/clang-3.4/bin/scan-build/scan-build \
-    $CHECKERS \
-    --use-analyzer=/opt/clang-3.4/bin/clang \
-    make -j2
-
-
-# Haven't tried this yet.
-#    -enable-checker alpha.unix.PthreadLock
-
-# This one gives a false positive on every strcmp.
-#    -enable-checker alpha.core.PointerSub
-
-# This one hates it when we stick a nonzero const in a pointer.
-#    -enable-checker alpha.core.FixedAddr
-
-# This one crashes sometimes for me.
-#    -enable-checker alpha.deadcode.IdempotentOperations
diff --git a/contrib/sd b/contrib/sd
deleted file mode 100755
index 232e8ac..0000000
--- a/contrib/sd
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/bin/bash
-#
-# Copyright (c) 2005, 2006, 2007, 2008 Peter Palfrader <peter at palfrader.org>
-# Copyright (c) 2008, 2009 Jacob Appelbaum <jacob at appelbaum.net>
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be
-# included in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-# 
-# This small script fetches information about a server when given a nickname.
-# It currently uses the v2 dir information and not the v3 consensus by default.
-# It requires wget, perl, awk to function properly. This is based on a zsh
-# dotfile from weasel and adapted to be a small bash utility.
-# 
-
-# Feel free to set any authority you desire, we're using weasel's by default
-# You could also try the v3 directory infomation in weasel's dir authority:
-# http://tor.noreply.org/tor/status-vote/current/consensus
-#
-
-# Users can select between the two
-v3authority="http://tor.noreply.org/tor/status-vote/current/consensus";
-v2authority="http://tor.noreply.org:80/tor/status/authority";
-authority=$v2authority;
-
-function usage {
-    echo "Usage: $0 [-2|-3] nodenickname";
-}
-
-if [ -z "$1" ];
-then
-    usage;
-    exit;
-fi
-
-# Are we switching between v2 or v3?
-if [ "$1" == "-2" -o "$1" == "-3" ];
-then
-    if [ "$1" == "-2" -a -n "$2" ]; 
-    then    
-        authority=$v2authority;
-        nickname="$2";
-    elif [ "$1" == "-3" -a -n "$2" ];
-    then
-        authority=$v3authority;
-        nickname="$2";
-    else
-        usage;
-        exit;
-    fi
-else
-    nickname="$1";
-fi
-
-# Fetch it and decode the fingerprint 
-fp=`wget -q -O - $authority | \
-	awk '$1 == "r" && $2 == "'$nickname'" {printf "%s===", $3}' | \
-	perl -MMIME::Base64 -e "print unpack(\"H*\", decode_base64(<>)),\"\n\"";`
-
-# If we don't have a fingerprint, we don't have a match
-if [ "$fp" != "" ];
-then
-	wget -q -O - http://tor.noreply.org:80/tor/server/fp/$fp;
-	exit $?;	
-else
-	echo "It appears the nickname is not currently known by the directory" \
-         "authority."
-	exit 1;
-fi
diff --git a/contrib/suse/include.am b/contrib/suse/include.am
deleted file mode 100644
index 4aed0e1..0000000
--- a/contrib/suse/include.am
+++ /dev/null
@@ -1 +0,0 @@
-EXTRA_DIST+= contrib/suse/tor.sh
diff --git a/contrib/suse/tor.sh.in b/contrib/suse/tor.sh.in
deleted file mode 100644
index b7e9005..0000000
--- a/contrib/suse/tor.sh.in
+++ /dev/null
@@ -1,118 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2006-2007 Andrew Lewman
-#
-# tor    The Onion Router
-#
-# Startup/shutdown script for tor. This is a wrapper around torctl;
-# torctl does the actual work in a relatively system-independent, or at least
-# distribution-independent, way, and this script deals with fitting the
-# whole thing into the conventions of the particular system at hand.
-#
-# These next couple of lines "declare" tor for the "chkconfig" program,
-# originally from SGI, used on Red Hat/Fedora and probably elsewhere.
-#
-# chkconfig: 2345 90 10
-# description: Onion Router - A low-latency anonymous proxy
-#
-
-### BEGIN INIT INFO
-# Provides: tor
-# Required-Start: $remote_fs $network
-# Required-Stop: $remote_fs $network
-# Default-Start: 3 5
-# Default-Stop: 0 1 2 6
-# Short-Description: Start the tor daemon
-# Description:  Start the tor daemon:  the anon-proxy server
-### END INIT INFO
-
-. /etc/rc.status
-
-# Shell functions sourced from /etc/rc.status:
-#      rc_check         check and set local and overall rc status
-#      rc_status        check and set local and overall rc status
-#      rc_status -v     ditto but be verbose in local rc status
-#      rc_status -v -r  ditto and clear the local rc status
-#      rc_failed        set local and overall rc status to failed
-#      rc_reset         clear local rc status (overall remains)
-#      rc_exit          exit appropriate to overall rc status
-
-# First reset status of this service
-rc_reset
-
-# Increase open file descriptors a reasonable amount
-ulimit -n 8192
-
-TORCTL=@BINDIR@/torctl
-
-# torctl will use these environment variables
-TORUSER=@TORUSER@
-export TORUSER
-TORGROUP=@TORGROUP@
-export TORGROUP
-
-TOR_DAEMON_PID_DIR="@LOCALSTATEDIR@/run/tor"
-
-if [ -x /bin/su ] ; then
-    SUPROG=/bin/su
-elif [ -x /sbin/su ] ; then
-    SUPROG=/sbin/su
-elif [ -x /usr/bin/su ] ; then
-    SUPROG=/usr/bin/su
-elif [ -x /usr/sbin/su ] ; then
-    SUPROG=/usr/sbin/su
-else
-    SUPROG=/bin/su
-fi
-
-case "$1" in
-
-    start)
-    echo "Starting tor daemon"
-
-    if [ ! -d $TOR_DAEMON_PID_DIR ] ; then
-        mkdir -p $TOR_DAEMON_PID_DIR
-        chown $TORUSER:$TORGROUP $TOR_DAEMON_PID_DIR
-    fi
-
-    ## Start daemon with startproc(8). If this fails
-    ## the echo return value is set appropriate.
-
-    startproc -f $TORCTL start
-    # Remember status and be verbose
-    rc_status -v
-    ;;
-
-    stop)
-    echo "Stopping tor daemon" 
-    startproc -f $TORCTL stop
-    # Remember status and be verbose
-    rc_status -v
-    ;;
-
-    restart)
-    echo "Restarting tor daemon" 
-    startproc -f $TORCTL restart
-    # Remember status and be verbose
-    rc_status -v
-    ;;
-
-    reload)
-    echo "Reloading tor daemon" 
-    startproc -f $TORCTL reload
-    # Remember status and be verbose
-    rc_status -v
-    ;;
-
-    status)
-    startproc -f $TORCTL status
-    # Remember status and be verbose
-    rc_status -v
-    ;;
-
-    *)
-    echo "Usage: $0 (start|stop|restart|reload|status)"
-    RETVAL=1
-esac
-
-rc_exit
diff --git a/contrib/tor-ctrl.sh b/contrib/tor-ctrl.sh
deleted file mode 100644
index 58320ce..0000000
--- a/contrib/tor-ctrl.sh
+++ /dev/null
@@ -1,212 +0,0 @@
-#!/bin/bash
-#
-# tor-ctrl is a commandline tool for executing commands on a tor server via
-# the controlport.  In order to get this to work, add "ControlPort 9051" and
-# "CookieAuthentication 1" to your torrc and reload tor.  Or - if you want a
-# fixed password - leave out "CookieAuthentication 1" and use the following
-# line to create the appropriate HashedControlPassword entry for your torrc
-# (you need to change yourpassword, of course):
-#
-# echo "HashedControlPassword $(tor --hash-password yourpassword | tail -n 1)"
-#
-# tor-ctrl will return 0 if it was successful and 1 if not, 2 will be returned
-# if something (telnet, xxd) is missing.  4 will be returned if it executed
-# several commands from a file.
-#
-# For setting the bandwidth for specific times of the day, I suggest calling
-# tor-ctrl via cron, e.g.:
-#
-# 0 22 * * * /path/to/tor-ctrl -c "SETCONF bandwidthrate=1mb"
-# 0 7 * * *  /path/to/tor-ctrl -c "SETCONF bandwidthrate=100kb"
-#
-# This would set the bandwidth to 100kb at 07:00 and to 1mb at 22:00.  You can
-# use notations like 1mb, 1kb or the number of bytes.
-#
-# Many, many other things are possible, see
-#              https://www.torproject.org/svn/trunk/doc/spec/control-spec.txt
-#
-# Copyright (c) 2007 by Stefan Behte
-#
-# tor-ctrl is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# tor-ctrl 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 tor-ctrl; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
-# Written by Stefan Behte
-#
-# Please send bugs, comments, wishes, thanks and success stories to:
-# Stefan dot Behte at gmx dot net
-#
-# Also have a look at my page:
-# http://ge.mine.nu/
-#
-# 2007-10-03: First version, only changing bandwidth possible.
-# 2007-10-04: Renaming to "tor-ctrl", added a lot of functions, it's now a
-#             general-purpose tool.
-#             Added control_auth_cookie/controlpassword auth, getopts,
-#             program checks, reading from file etc.
-
-VERSION=v1
-TORCTLIP=127.0.0.1
-TORCTLPORT=9051
-TOR_COOKIE="/var/lib/tor/data/control_auth_cookie"
-SLEEP_AFTER_CMD=1
-VERBOSE=0
-
-usage()
-{
-cat <<EOF
-
-tor-ctrl $VERSION by Stefan Behte (http://ge.mine.nu)
-You should have a look at 
-https://www.torproject.org/svn/trunk/doc/spec/control-spec.txt
-
-usage: tor-ctrl [-switch] [variable]
-
-       [-c] [command] = command to execute
-                        notice: always "quote" your command
-
-       [-f] [file]    = file to execute commands from
-                        notice: only one command per line
-
-       [-a] [path]    = path to tor's control_auth_cookie
-                        default: /var/lib/tor/data/control_auth_cookie
-                        notice: do not forget to adjust your torrc
-
-       [-s] [time]    = sleep [var] seconds after each command sent
-                        default: 1 second
-                        notice: for GETCONF, you can use smaller pause times
-                        than for SETCONF; this is due to telnet's behaviour.
-
-       [-p] [pwd]     = Use password [var] instead of tor's control_auth_cookie
-                        default: not used
-                        notice: do not forget to adjust your torrc
-                                
-       [-P] [port]     = Tor ControlPort
-                        default: 9051
-
-       [-v]           = verbose
-                        default: not set
-                        notice: the default output is the return code ;)
-                        You propably want to set -v when running manually
-
-       Examples:      $0 -c "SETCONF bandwidthrate=1mb"
-                      $0 -v -c "GETINFO version"
-                      $0 -v -s 0 -P 9051 -p foobar -c "GETCONF bandwidthrate"
-
-EOF
-exit 2
-}
-
-checkprogs()
-{
-        programs="telnet"
-        if [ "$PASSWORD" = "" ]   
-        then
-                # you only need xxd when using control_auth_cookie
-                programs="$programs xxd"
-        fi
-
-        for p in $programs
-        do
-                which $p &>/dev/null            # are you there?
-                if [ "$?" != "0" ]
-                then
-                        echo "$p is missing."
-                        exit 2
-                fi
-        done
-}
-
-sendcmd()
-{
-        echo "$@"
-        sleep ${SLEEP_AFTER_CMD}
-}
-
-login()
-{
-        if [ "$PASSWORD" = "" ]
-        then
-                sendcmd "AUTHENTICATE $(xxd -c 32 -g 0 ${TOR_COOKIE} | awk '{print $2}')"
-        else
-                sendcmd "AUTHENTICATE \"${PASSWORD}\""
-        fi
-}
-
-cmdpipe()
-{
-        login
-        sendcmd "$@"
-        sendcmd "QUIT"
-}
-
-vecho()
-{
-        if [ $VERBOSE -ge 1 ]
-        then
-                echo "$@"
-        fi
-}
-
-myecho()
-{
-        STR=$(cat)
-        vecho "$STR"
-
-        echo "$STR" | if [ "$(grep -c ^"250 ")" = 3 ]
-        then
-                exit 0
-        else
-                exit 1
-        fi
-}
-
-filepipe()
-{
-        login
-        cat "$1" | while read line
-        do
-                sendcmd "$line"
-        done
-        sendcmd "QUIT"
-}
-
-while getopts ":a:c:s:p:P:f:vh" Option
-do
-        case $Option in
-                a) TOR_COOKIE="${OPTARG}";;
-                c) CMD="${OPTARG}";;
-                s) SLEEP_AFTER_CMD="${OPTARG}";;
-                p) PASSWORD="${OPTARG}";;
-                P) TORCTLPORT="${OPTARG}";;
-                f) FILE="${OPTARG}";;
-                v) VERBOSE=1;;
-                h) usage;;
-                *) usage;;
-        esac
-done
-
-if [ -e "$FILE" ]
-then
-        checkprogs
-        filepipe "$FILE" | telnet $TORCTLIP $TORCTLPORT 2>/dev/null | myecho
-        exit 4
-fi
-
-if [ "$CMD" != "" ]
-then
-        checkprogs
-        cmdpipe $CMD | telnet $TORCTLIP $TORCTLPORT 2>/dev/null | myecho
-else
-        usage
-fi
diff --git a/contrib/tor-exit-notice.html b/contrib/tor-exit-notice.html
deleted file mode 100644
index 8cf5c29..0000000
--- a/contrib/tor-exit-notice.html
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<title>This is a Tor Exit Router</title>
-
-<!--
-
-This notice is intended to be placed on a virtual host for a domain that
-your Tor exit node IP reverse resolves to so that people who may be about
-to file an abuse complaint would check it first before bothering you or
-your ISP. Ex:
-http://tor-exit.yourdomain.org or http://tor-readme.yourdomain.org.
-
-This type of setup has proven very effective at reducing abuse complaints
-for exit node operators.
-
-There are a few places in this document that you may want to customize.
-They are marked with FIXME.
-
--->
-
-</head>
-<body>
-
-<p style="text-align:center; font-size:xx-large; font-weight:bold">This is a
-Tor Exit Router</p>
-
-<p>
-Most likely you are accessing this website because you had some issue with
-the traffic coming from this IP. This router is part of the <a
-href="https://www.torproject.org/">Tor Anonymity Network</a>, which is
-dedicated to <a href="https://www.torproject.org/about/overview">providing
-privacy</a> to people who need it most: average computer users. This
-router IP should be generating no other traffic, unless it has been
-compromised.</p>
-
-
-<!-- FIXME: you should probably grab your own copy of how_tor_works_thumb.png
-     and serve it locally -->
-
-<p style="text-align:center">
-<a href="https://www.torproject.org/about/overview">
-<img src="https://www.torproject.org/images/how_tor_works_thumb.png" alt="How Tor works" style="border-style:none"/>
-</a></p>
-
-<p>
-Tor sees use by <a href="https://www.torproject.org/about/torusers">many
-important segments of the population</a>, including whistle blowers,
-journalists, Chinese dissidents skirting the Great Firewall and oppressive
-censorship, abuse victims, stalker targets, the US military, and law
-enforcement, just to name a few.  While Tor is not designed for malicious
-computer users, it is true that they can use the network for malicious ends.
-In reality however, the actual amount of <a
-href="https://www.torproject.org/docs/faq-abuse">abuse</a> is quite low. This
-is largely because criminals and hackers have significantly better access to
-privacy and anonymity than do the regular users whom they prey upon. Criminals
-can and do <a
-href="http://voices.washingtonpost.com/securityfix/2008/08/web_fraud_20_tools.html">build,
-sell, and trade</a> far larger and <a
-href="http://voices.washingtonpost.com/securityfix/2008/08/web_fraud_20_distributing_your.html">more
-powerful networks</a> than Tor on a daily basis. Thus, in the mind of this
-operator, the social need for easily accessible censorship-resistant private,
-anonymous communication trumps the risk of unskilled bad actors, who are
-almost always more easily uncovered by traditional police work than by
-extensive monitoring and surveillance anyway.</p>
-
-<p>
-In terms of applicable law, the best way to understand Tor is to consider it a
-network of routers operating as common carriers, much like the Internet
-backbone. However, unlike the Internet backbone routers, Tor routers
-explicitly do not contain identifiable routing information about the source of
-a packet, and no single Tor node can determine both the origin and destination
-of a given transmission.</p>
-
-<p>
-As such, there is little the operator of this router can do to help you track
-the connection further. This router maintains no logs of any of the Tor
-traffic, so there is little that can be done to trace either legitimate or
-illegitimate traffic (or to filter one from the other).  Attempts to
-seize this router will accomplish nothing.</p>
-
-<!-- FIXME: US-Only section. Remove if you are a non-US operator -->
-
-<p>
-Furthermore, this machine also serves as a carrier of email, which means that
-its contents are further protected under the ECPA. <a
-href="http://www.law.cornell.edu/uscode/text/18/2707">18
-USC 2707</a> explicitly allows for civil remedies ($1000/account
-<i><b>plus</b></i>  legal fees)
-in the event of a seizure executed without good faith or probable cause (it
-should be clear at this point that traffic with an originating IP address of
-FIXME_DNS_NAME should not constitute probable cause to seize the
-machine). Similar considerations exist for 1st amendment content on this
-machine.</p>
-
-<!-- FIXME: May or may not be US-only. Some non-US tor nodes have in
-     fact reported DMCA harassment... -->
-
-<p>
-If you are a representative of a company who feels that this router is being
-used to violate the DMCA, please be aware that this machine does not host or
-contain any illegal content. Also be aware that network infrastructure
-maintainers are not liable for the type of content that passes over their
-equipment, in accordance with <a
-href="http://www.law.cornell.edu/uscode/text/17/512">DMCA
-"safe harbor" provisions</a>. In other words, you will have just as much luck
-sending a takedown notice to the Internet backbone providers. Please consult
-<a href="https://www.torproject.org/eff/tor-dmca-response">EFF's prepared
-response</a> for more information on this matter.</p>
-
-<p>For more information, please consult the following documentation:</p>
-
-<ol>
-<li><a href="https://www.torproject.org/about/overview">Tor Overview</a></li>
-<li><a href="https://www.torproject.org/docs/faq-abuse">Tor Abuse FAQ</a></li>
-<li><a href="https://www.torproject.org/eff/tor-legal-faq">Tor Legal FAQ</a></li>
-</ol>
-
-<p>
-That being said, if you still have a complaint about the router,  you may
-email the <a href="mailto:FIXME_YOUR_EMAIL_ADDRESS">maintainer</a>. If
-complaints are related to a particular service that is being abused, I will
-consider removing that service from my exit policy, which would prevent my
-router from allowing that traffic to exit through it. I can only do this on an
-IP+destination port basis, however. Common P2P ports are
-already blocked.</p>
-
-<p>
-You also have the option of blocking this IP address and others on
-the Tor network if you so desire. The Tor project provides a <a
-href="https://check.torproject.org/cgi-bin/TorBulkExitList.py">web service</a>
-to fetch a list of all IP addresses of Tor exit nodes that allow exiting to a
-specified IP:port combination, and an official <a
-href="https://www.torproject.org/tordnsel/dist/">DNSRBL</a> is also available to
-determine if a given IP address is actually a Tor exit server. Please
-be considerate
-when using these options. It would be unfortunate to deny all Tor users access
-to your site indefinitely simply because of a few bad apples.</p>
-
-</body>
-</html>
diff --git a/contrib/tor-mingw.nsi.in b/contrib/tor-mingw.nsi.in
deleted file mode 100644
index 0e1594d..0000000
--- a/contrib/tor-mingw.nsi.in
+++ /dev/null
@@ -1,274 +0,0 @@
-;tor.nsi - A basic win32 installer for Tor
-; Originally written by J Doe.
-; Modified by Steve Topletz, Andrew Lewman
-; See the Tor LICENSE for licensing information
-;-----------------------------------------
-;
-!include "MUI.nsh"
-!include "LogicLib.nsh"
-!include "FileFunc.nsh"
-!insertmacro GetParameters
-!define VERSION "0.2.5.4-alpha-dev"
-!define INSTALLER "tor-${VERSION}-win32.exe"
-!define WEBSITE "https://www.torproject.org/"
-!define LICENSE "LICENSE"
-!define BIN "..\bin" ;BIN is where it expects to find tor.exe, tor-resolve.exe
-  
- 
-SetCompressor /SOLID LZMA ;Tighter compression
-RequestExecutionLevel user ;Updated for Vista compatibility
-OutFile ${INSTALLER}
-InstallDir $PROGRAMFILES\Tor
-SetOverWrite ifnewer
-Name "Tor"
-Caption "Tor ${VERSION} Setup"
-BrandingText "The Onion Router"
-CRCCheck on
-XPStyle on
-VIProductVersion "${VERSION}"
-VIAddVersionKey "ProductName" "The Onion Router: Tor"
-VIAddVersionKey "Comments" "${WEBSITE}"
-VIAddVersionKey "LegalTrademarks" "Three line BSD"
-VIAddVersionKey "LegalCopyright" "©2004-2008, Roger Dingledine, Nick Mathewson. ©2009 The Tor Project, Inc. "
-VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}"
-VIAddVersionKey "FileVersion" "${VERSION}"
-
-!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor Setup Wizard"
-!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK"
-!define MUI_ABORTWARNING
-!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico"
-!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico"
-!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
-!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe"
-!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates."
-!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE}
-
-!insertmacro MUI_PAGE_WELCOME
-; There's no point in having a clickthrough license: Our license adds
-; certain rights, but doesn't remove them.
-; !insertmacro MUI_PAGE_LICENSE "${LICENSE}"
-!insertmacro MUI_PAGE_COMPONENTS
-!insertmacro MUI_PAGE_DIRECTORY
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_PAGE_FINISH
-!insertmacro MUI_UNPAGE_WELCOME
-!insertmacro MUI_UNPAGE_CONFIRM
-!insertmacro MUI_UNPAGE_INSTFILES
-!insertmacro MUI_UNPAGE_FINISH
-!insertmacro MUI_LANGUAGE "English"
-
-Var CONFIGDIR
-Var CONFIGFILE
-
-Function .onInit
-	Call ParseCmdLine
-FunctionEnd
-
-;Sections
-;--------
-
-Section "Tor" Tor
-;Files that have to be installed for tor to run and that the user
-;cannot choose not to install
-	SectionIn RO
-	SetOutPath $INSTDIR
-	Call ExtractBinaries
-	Call ExtractIcon
-	WriteINIStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE}
-
-	StrCpy $CONFIGFILE "torrc"
-	StrCpy $CONFIGDIR $APPDATA\Tor
-;   ;If $APPDATA isn't valid here (Early win95 releases with no updated
-;   ; shfolder.dll) then we put it in the program directory instead.
-;   StrCmp $APPDATA "" "" +2
-;      StrCpy $CONFIGDIR $INSTDIR
-	SetOutPath $CONFIGDIR
-	;If there's already a torrc config file, ask if they want to
-	;overwrite it with the new one.
-	${If} ${FileExists} "$CONFIGDIR\torrc"
-		MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDYES Yes IDNO No
-		Yes:
-			Delete $CONFIGDIR\torrc
-			Goto Next
-		No:
-			StrCpy $CONFIGFILE "torrc.sample"
-		Next:
-	${EndIf}
-	File /oname=$CONFIGFILE "..\src\config\torrc.sample"
-
-; the geoip file needs to be included and stuffed into the right directory
-; otherwise tor is unhappy
-	SetOutPath $APPDATA\Tor
-	Call ExtractGEOIP
-SectionEnd
-
-Section "Documents" Docs
-	Call ExtractDocuments
-SectionEnd
-
-SubSection /e "Shortcuts" Shortcuts
-
-Section "Start Menu" StartMenu
-  SetOutPath $INSTDIR
-  ${If} ${FileExists} "$SMPROGRAMS\Tor\*.*"
-    RMDir /r "$SMPROGRAMS\Tor"
-  ${EndIf}
-  Call CreateTorLinks
-  ${If} ${FileExists} "$INSTDIR\Documents\*.*"
-    Call CreateDocLinks
-  ${EndIf}
-SectionEnd
-
-Section "Desktop" Desktop
-   SetOutPath $INSTDIR
-   CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" 
-SectionEnd
-
-Section /o "Run at startup" Startup
-   SetOutPath $INSTDIR
-   CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" "" SW_SHOWMINIMIZED
-SectionEnd
-
-SubSectionEnd
-
-Section "Uninstall"
-   Call un.InstallPackage
-SectionEnd
-
-Section -End
-    WriteUninstaller "$INSTDIR\Uninstall.exe"
-    ;The registry entries simply add the Tor uninstaller to the Windows
-    ;uninstall list.
-    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)"
-    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"'
-SectionEnd
-
-!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
-!insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run."
-!insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor."
-!insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor"
-!insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu"
-!insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop"
-!insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window"
-!insertmacro MUI_FUNCTION_DESCRIPTION_END
-
-;####################Functions#########################
-
-Function ExtractBinaries
-	File "${BIN}\tor.exe"
-	File "${BIN}\tor-resolve.exe"
-FunctionEnd
-
-Function ExtractGEOIP
-	File "${BIN}\geoip"
-FunctionEnd
-
-Function ExtractIcon
-	File "${BIN}\tor.ico"
-FunctionEnd
-
-Function ExtractSpecs
-	File "..\doc\HACKING"
-	File "..\doc\spec\address-spec.txt"
-	File "..\doc\spec\bridges-spec.txt"
-	File "..\doc\spec\control-spec.txt"
-	File "..\doc\spec\dir-spec.txt"
-	File "..\doc\spec\path-spec.txt"
-	File "..\doc\spec\rend-spec.txt"
-	File "..\doc\spec\socks-extensions.txt"
-	File "..\doc\spec\tor-spec.txt"
-	File "..\doc\spec\version-spec.txt"
-FunctionEnd
-
-Function ExtractHTML
-	File "..\doc\tor.html"
-	File "..\doc\torify.html"
-	File "..\doc\tor-resolve.html"
-	File "..\doc\tor-gencert.html"
-FunctionEnd
-
-Function ExtractReleaseDocs
-	File "..\README"
-	File "..\ChangeLog"
-	File "..\LICENSE"
-FunctionEnd
-
-Function ExtractDocuments
-	SetOutPath "$INSTDIR\Documents"
-	Call ExtractSpecs
-	Call ExtractHTML
-	Call ExtractReleaseDocs
-FunctionEnd
-
-Function un.InstallFiles
-	Delete "$DESKTOP\Tor.lnk"
-	Delete "$INSTDIR\tor.exe"
-	Delete "$INSTDIR\tor-resolve.exe"
-	Delete "$INSTDIR\Tor Website.url"
-	Delete "$INSTDIR\torrc"
-	Delete "$INSTDIR\torrc.sample"
-	Delete "$INSTDIR\tor.ico"
-	Delete "$SMSTARTUP\Tor.lnk"
-	Delete "$INSTDIR\Uninstall.exe"
-    Delete "$INSTDIR\geoip"
-FunctionEnd
-
-Function un.InstallDirectories
-	${If} $CONFIGDIR == $INSTDIR
-		RMDir /r $CONFIGDIR
-	${EndIf}
-	RMDir /r "$INSTDIR\Documents"
-	RMDir $INSTDIR
-	RMDir /r "$SMPROGRAMS\Tor"
-	RMDir /r "$APPDATA\Tor"
-FunctionEnd
-
-Function un.WriteRegistry
-	DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor"
-FunctionEnd
-
-Function un.InstallPackage
-	Call un.InstallFiles
-	Call un.InstallDirectories
-	Call un.WriteRegistry
-FunctionEnd
-
-Function CreateTorLinks
-	CreateDirectory "$SMPROGRAMS\Tor"
-	CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico"
-	CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$CONFIGDIR\torrc"
-	CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url"
-	CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
-FunctionEnd
-
-Function CreateDocLinks
-	CreateDirectory "$SMPROGRAMS\Tor\Documents"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Address Specification.lnk" "$INSTDIR\Documents\address-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Bridges Specification.lnk" "$INSTDIR\Documents\bridges-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Control Specification.lnk" "$INSTDIR\Documents\control-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Directory Specification.lnk" "$INSTDIR\Documents\dir-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Path Specification.lnk" "$INSTDIR\Documents\path-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Rend Specification.lnk" "$INSTDIR\Documents\rend-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Version Specification.lnk" "$INSTDIR\Documents\version-spec.txt"
-	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor SOCKS Extensions.lnk" "$INSTDIR\Documents\socks-extensions.txt"
-FunctionEnd
-
-Function ParseCmdLine
-	${GetParameters} $1
-	${If} $1 == "-x" ;Extract All Files
-		StrCpy $INSTDIR $EXEDIR
-		Call ExtractBinaries
-		Call ExtractDocuments
-		Quit
-	${ElseIf} $1 == "-b" ;Extract Binaries Only
-		StrCpy $INSTDIR $EXEDIR
-		Call ExtractBinaries
-		Quit
-	${ElseIf} $1 != ""
-		MessageBox MB_OK|MB_TOPMOST `${Installer} [-x|-b]$\r$\n$\r$\n  -x    Extract all files$\r$\n  -b    Extract binary files only`
-		Quit
-	${EndIf}
-FunctionEnd
-
diff --git a/contrib/tor-resolve.py b/contrib/tor-resolve.py
deleted file mode 100755
index 47ae1a0..0000000
--- a/contrib/tor-resolve.py
+++ /dev/null
@@ -1,153 +0,0 @@
-#!/usr/bin/python
-
-import socket
-import struct
-import sys
-
-def socks4AResolveRequest(hostname):
-    version = 4
-    command = 0xF0
-    port = 0
-    addr = 0x0000001
-    username = ""
-    reqheader = struct.pack("!BBHL", version, command, port, addr)
-    return "%s%s\x00%s\x00"%(reqheader,username,hostname)
-
-def socks4AParseResponse(response):
-    RESPONSE_LEN = 8
-    if len(response) < RESPONSE_LEN:
-        return None
-    assert len(response) >= RESPONSE_LEN
-    version,status,port = struct.unpack("!BBH",response[:4])
-    assert version == 0
-    assert port == 0
-    if status == 90:
-        return "%d.%d.%d.%d"%tuple(map(ord, response[4:]))
-    else:
-        return "ERROR (status %d)"%status
-
-def socks5Hello():
-    return "\x05\x01\x00"
-def socks5ParseHello(response):
-    if response != "\x05\x00":
-        raise ValueError("Bizarre socks5 response")
-def socks5ResolveRequest(hostname, atype=0x03, command=0xF0):
-    version = 5
-    rsv = 0
-    port = 0
-    reqheader = struct.pack("!BBBB",version, command, rsv, atype)
-    if atype == 0x03:
-        reqheader += struct.pack("!B", len(hostname))
-    portstr = struct.pack("!H",port)
-    return "%s%s%s"%(reqheader,hostname,portstr)
-
-def socks5ParseResponse(r):
-    if len(r)<8:
-        return None
-    version, reply, rsv, atype = struct.unpack("!BBBB",r[:4])
-    assert version==5
-    assert rsv==0
-    if reply != 0x00:
-        return "ERROR",reply
-    assert atype in (0x01,0x03,0x04)
-    if atype != 0x03:
-        expected_len = 4 + ({1:4,4:16}[atype]) + 2
-        if len(r) < expected_len:
-            return None
-        elif len(r) > expected_len:
-            raise ValueError("Overlong socks5 reply!")
-        addr = r[4:-2]
-        if atype == 0x01:
-            return "%d.%d.%d.%d"%tuple(map(ord,addr))
-        else:
-            # not really the right way to format IPv6
-            return "IPv6: %s"%(":".join([hex(ord(c)) for c in addr]))
-    else:
-        hlen, = struct.unpack("!B", r[4])
-        expected_len = 5 + hlen + 2
-        if len(r) < expected_len:
-            return None
-        return r[5:-2]
-
-def socks5ResolvePTRRequest(hostname):
-    return socks5ResolveRequest(socket.inet_aton(hostname),
-                                atype=1, command = 0xF1)
-
-
-def parseHostAndPort(h):
-    host, port = "localhost", 9050
-    if ":" in h:
-        i = h.index(":")
-        host = h[:i]
-        try:
-            port = int(h[i+1:])
-        except ValueError:
-            print "Bad hostname %r"%h
-            sys.exit(1)
-    elif h:
-        try:
-            port = int(h)
-        except ValueError:
-            host = h
-
-    return host, port
-
-def resolve(hostname, sockshost, socksport, socksver=4, reverse=0):
-    assert socksver in (4,5)
-    if socksver == 4:
-        fmt = socks4AResolveRequest
-        parse = socks4AParseResponse
-    elif not reverse:
-        fmt = socks5ResolveRequest
-        parse = socks5ParseResponse
-    else:
-        fmt = socks5ResolvePTRRequest
-        parse = socks5ParseResponse
-
-    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    s.connect((sockshost,socksport))
-    if socksver == 5:
-        s.send(socks5Hello())
-        socks5ParseHello(s.recv(2))
-    s.send(fmt(hostname))
-    answer = s.recv(6)
-    result = parse(answer)
-    while result is None:
-        more = s.recv(1)
-        if not more:
-            return None
-        answer += more
-        result = parse(answer)
-    print "Got answer",result
-    m = s.recv(1)
-    if m:
-        print "Got extra data too: %r"%m
-    return result
-
-if __name__ == '__main__':
-    if len(sys.argv) not in (2,3,4):
-        print "Syntax: resolve.py [-4|-5] hostname [sockshost:socksport]"
-        sys.exit(0)
-    socksver = 4
-    reverse = 0
-    while sys.argv[1][0] == '-':
-        if sys.argv[1] in ("-4", "-5"):
-            socksver = int(sys.argv[1][1])
-            del sys.argv[1]
-        elif sys.argv[1] == '-x':
-            reverse = 1
-            del sys.argv[1]
-        elif sys.argv[1] == '--':
-            break
-
-    if len(sys.argv) >= 4:
-        print "Syntax: resolve.py [-x] [-4|-5] hostname [sockshost:socksport]"
-        sys.exit(0)
-    if len(sys.argv) == 3:
-        sh,sp = parseHostAndPort(sys.argv[2])
-    else:
-        sh,sp = parseHostAndPort("")
-
-    if reverse and socksver == 4:
-        socksver = 5
-    resolve(sys.argv[1], sh, sp, socksver, reverse)
diff --git a/contrib/tor-stress b/contrib/tor-stress
deleted file mode 100755
index a0c88c2..0000000
--- a/contrib/tor-stress
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/perl
-
-#require 'sys/syscall.ph';
-$|=1;
-
-$total = 1;
-$target = "http://www.cnn.com/";
-
-for($i=0;$i<$total;$i++) {
-  print "Starting client $i\n";
-  $pid = fork();
-  if(!$pid) {
-    open(FD,"wget -q -O - $target|");
-    $c = 0;
-    while(<FD>) {
-      $c += length($_);
-    }
-#    $TIMEVAL_T = "LL";
-#    $now = pack($TIMEVAL_T, ());
-#    syscall(&SYS_gettimeofday, $now, 0) != -1 or die "gettimeofday: $!";
-#    @now = unpack($TIMEVAL_T, $now);
-    print "Client $i exiting ($c chars).\n";
-    exit(0);
-  }
-# sleep(1);
-}
-
diff --git a/contrib/tor.ico b/contrib/tor.ico
deleted file mode 100644
index 0cac297..0000000
Binary files a/contrib/tor.ico and /dev/null differ
diff --git a/contrib/tor.logrotate.in b/contrib/tor.logrotate.in
deleted file mode 100644
index 6e75f80..0000000
--- a/contrib/tor.logrotate.in
+++ /dev/null
@@ -1,14 +0,0 @@
- at LOCALSTATEDIR@/log/tor/*log {
-	daily
-	rotate 5
-	compress
-	delaycompress
-	missingok
-	notifempty
-	# you may need to change the username/groupname below
-	create 0640 _tor _tor
-	sharedscripts
-	postrotate
-		/etc/init.d/tor reload > /dev/null
-	endscript
-}
diff --git a/contrib/tor.nsi.in b/contrib/tor.nsi.in
deleted file mode 100644
index dd24df4..0000000
--- a/contrib/tor.nsi.in
+++ /dev/null
@@ -1,214 +0,0 @@
-;tor.nsi - A basic win32 installer for Tor
-; Originally written by J Doe.
-; See LICENSE for licensing information
-;-----------------------------------------
-; NOTE: This file might be obsolete. Look at tor-mingw.nsi.in instead.
-;-----------------------------------------
-; How to make an installer:
-;   Step 0. If you are a Tor maintainer, make sure that tor.nsi and
-;           src/win32/orconfig.h all have the correct version number.
-;   Step 1. Download and install OpenSSL.  Make sure that the OpenSSL
-;           version listed below matches the one you downloaded.
-;   Step 2. Download and install NSIS (http://nsis.sourceforge.net)
-;   Step 3. Make a directory under the main tor directory called "bin".
-;   Step 4. Copy ssleay32.dll and libeay32.dll from OpenSSL into "bin".
-;   Step 5. Run man2html on tor.1.in; call the result tor-reference.html
-;           Run man2html on tor-resolve.1; call the result tor-resolve.html
-;   Step 6. Copy torrc.sample.in to torrc.sample.
-;   Step 7. Build tor.exe and tor_resolve.exe; save the result into bin.
-;   Step 8. cd into contrib and run "makensis tor.nsi".
-;
-; Problems:
-;   - Copying torrc.sample.in to torrc.sample and tor.1.in (implicitly)
-;     to tor.1 is a Bad Thing, and leaves us with @autoconf@ vars in the final
-;     result.
-;   - Building Tor requires too much windows C clue.
-;     - We should have actual makefiles for VC that do the right thing.
-;   - I need to learn more NSIS juju to solve these:
-;     - There should be a batteries-included installer that comes with
-;       privoxy too. (Check privoxy license on this; be sure to include
-;       all privoxy documents.)
-;   - The filename should probably have a revision number.
-
-!include "MUI.nsh"
-
-!define VERSION "0.1.2.3-alpha-dev"
-!define INSTALLER "tor-${VERSION}-win32.exe"
-!define WEBSITE "https://www.torproject.org/"
-
-!define LICENSE "..\LICENSE"
-;BIN is where it expects to find tor.exe, tor_resolve.exe, libeay32.dll and
-;  ssleay32.dll
-!define BIN "..\bin"
-
-SetCompressor lzma
-;SetCompressor zlib
-OutFile ${INSTALLER}
-InstallDir $PROGRAMFILES\Tor
-SetOverWrite ifnewer
-
-Name "Tor"
-Caption "Tor ${VERSION} Setup"
-BrandingText "The Onion Router"
-CRCCheck on
-
-;Use upx on the installer header to shrink the size.
-!packhdr header.dat "upx --best header.dat"
-
-!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor ${VERSION} Setup Wizard"
-!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK"
-!define MUI_ABORTWARNING
-!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico"
-!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico"
-!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
-!define MUI_HEADERIMAGE
-!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe"
-!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates."
-!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE}
-
-!insertmacro MUI_PAGE_WELCOME
-; There's no point in having a clickthrough license: Our license adds
-; certain rights, but doesn't remove them.
-; !insertmacro MUI_PAGE_LICENSE "${LICENSE}"
-!insertmacro MUI_PAGE_COMPONENTS
-!insertmacro MUI_PAGE_DIRECTORY
-!insertmacro MUI_PAGE_INSTFILES
-!insertmacro MUI_PAGE_FINISH
-!insertmacro MUI_UNPAGE_WELCOME
-!insertmacro MUI_UNPAGE_CONFIRM
-!insertmacro MUI_UNPAGE_INSTFILES
-!insertmacro MUI_UNPAGE_FINISH
-!insertmacro MUI_LANGUAGE "English"
-
-Var configdir
-Var configfile
-
-;Sections
-;--------
-
-Section "Tor" Tor
-;Files that have to be installed for tor to run and that the user
-;cannot choose not to install
-   SectionIn RO
-   SetOutPath $INSTDIR
-   File "${BIN}\tor.exe"
-   File "${BIN}\tor_resolve.exe"
-   WriteIniStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE}
-
-   StrCpy $configfile "torrc"
-   StrCpy $configdir $APPDATA\Tor
-;   ;If $APPDATA isn't valid here (Early win95 releases with no updated
-;   ; shfolder.dll) then we put it in the program directory instead.
-;   StrCmp $APPDATA "" "" +2
-;      StrCpy $configdir $INSTDIR
-   SetOutPath $configdir
-   ;If there's already a torrc config file, ask if they want to
-   ;overwrite it with the new one.
-   IfFileExists "$configdir\torrc" "" endiftorrc
-      MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDNO yesreplace
-      Delete $configdir\torrc
-      Goto endiftorrc
-     yesreplace:
-      StrCpy $configfile "torrc.sample"
-   endiftorrc:
-   File /oname=$configfile "..\src\config\torrc.sample"
-SectionEnd
-
-Section "OpenSSL 0.9.8a" OpenSSL
-   SetOutPath $INSTDIR
-   File "${BIN}\libeay32.dll"
-   File "${BIN}\ssleay32.dll"
-SectionEnd
-
-Section "Documents" Docs
-   SetOutPath "$INSTDIR\Documents"
-   ;File "..\doc\FAQ"
-   File "..\doc\HACKING"
-   File "..\doc\spec\control-spec.txt"
-   File "..\doc\spec\dir-spec.txt"
-   File "..\doc\spec\rend-spec.txt"
-   File "..\doc\spec\socks-extensions.txt"
-   File "..\doc\spec\tor-spec.txt"
-   File "..\doc\spec\version-spec.txt"
-   ;
-   ; WEBSITE-FILES-HERE
-   ;
-   File "..\doc\tor-resolve.html"
-   File "..\doc\tor-reference.html"
-   ;
-   File "..\doc\design-paper\tor-design.pdf"
-   ;
-   File "..\README"
-   File "..\AUTHORS"
-   File "..\ChangeLog"
-   File "..\LICENSE"
-SectionEnd
-
-SubSection /e "Shortcuts" Shortcuts
-
-Section "Start Menu" StartMenu
-   SetOutPath $INSTDIR
-   IfFileExists "$SMPROGRAMS\Tor\*.*" "" +2
-      RMDir /r "$SMPROGRAMS\Tor"
-   CreateDirectory "$SMPROGRAMS\Tor"
-   CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe"
-   CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$configdir\torrc"
-   CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url"
-   CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
-   IfFileExists "$INSTDIR\Documents\*.*" "" endifdocs
-      CreateDirectory "$SMPROGRAMS\Tor\Documents"
-      CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Manual.lnk" "$INSTDIR\Documents\tor-reference.html"
-      CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents"
-      CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt"
-   endifdocs:
-SectionEnd
-
-Section "Desktop" Desktop
-   SetOutPath $INSTDIR
-   CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe"
-SectionEnd
-
-Section /o "Run at startup" Startup
-   SetOutPath $INSTDIR
-   CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "" 0 SW_SHOWMINIMIZED
-SectionEnd
-
-SubSectionEnd
-
-Section "Uninstall"
-   Delete "$DESKTOP\Tor.lnk"
-   Delete "$INSTDIR\libeay32.dll"
-   Delete "$INSTDIR\ssleay32.dll"
-   Delete "$INSTDIR\tor.exe"
-   Delete "$INSTDIR\tor_resolve.exe"
-   Delete "$INSTDIR\Tor Website.url"
-   Delete "$INSTDIR\torrc"
-   Delete "$INSTDIR\torrc.sample"
-   StrCmp $configdir $INSTDIR +2 ""
-      RMDir /r $configdir
-   Delete "$INSTDIR\Uninstall.exe"
-   RMDir /r "$INSTDIR\Documents"
-   RMDir $INSTDIR
-   RMDir /r "$SMPROGRAMS\Tor"
-   Delete "$SMSTARTUP\Tor.lnk"
-   DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor"
-SectionEnd
-
-Section -End
-    WriteUninstaller "$INSTDIR\Uninstall.exe"
-    ;The registry entries simply add the Tor uninstaller to the Windows
-    ;uninstall list.
-    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)"
-    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"'
-SectionEnd
-
-!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
-  !insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run."
-  !insertmacro MUI_DESCRIPTION_TEXT ${OpenSSL} "OpenSSL libraries required by Tor."
-  !insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor."
-  !insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor"
-  !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu"
-  !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop"
-  !insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window"
-!insertmacro MUI_FUNCTION_DESCRIPTION_END
-
diff --git a/contrib/tor.sh.in b/contrib/tor.sh.in
deleted file mode 100644
index 92f8906..0000000
--- a/contrib/tor.sh.in
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/bin/sh
-#
-# tor    The Onion Router
-#
-# Startup/shutdown script for tor. This is a wrapper around torctl;
-# torctl does the actual work in a relatively system-independent, or at least
-# distribution-independent, way, and this script deals with fitting the
-# whole thing into the conventions of the particular system at hand.
-# This particular script is written for Red Hat/Fedora Linux, and may
-# also work on Mandrake, but not SuSE.
-#
-# These next couple of lines "declare" tor for the "chkconfig" program,
-# originally from SGI, used on Red Hat/Fedora and probably elsewhere.
-#
-# chkconfig: 2345 90 10
-# description: Onion Router - A low-latency anonymous proxy
-#
-
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-DAEMON=/usr/sbin/tor
-NAME=tor
-DESC="tor daemon"
-TORPIDDIR=/var/run/tor
-TORPID=$TORPIDDIR/tor.pid
-WAITFORDAEMON=60
-ARGS=""
-
-# Library functions
-if [ -f /etc/rc.d/init.d/functions ]; then
-   . /etc/rc.d/init.d/functions
-elif [ -f /etc/init.d/functions ]; then
-   . /etc/init.d/functions
-fi
-
-TORCTL=@BINDIR@/torctl
-
-# torctl will use these environment variables
-TORUSER=@TORUSER@
-export TORUSER
-
-if [ -x /bin/su ] ; then
-    SUPROG=/bin/su
-elif [ -x /sbin/su ] ; then
-    SUPROG=/sbin/su
-elif [ -x /usr/bin/su ] ; then
-    SUPROG=/usr/bin/su
-elif [ -x /usr/sbin/su ] ; then
-    SUPROG=/usr/sbin/su
-else
-    SUPROG=/bin/su
-fi
-
-# Raise ulimit based on number of file descriptors available (thanks, Debian)
-
-if [ -r /proc/sys/fs/file-max ]; then
-	system_max=`cat /proc/sys/fs/file-max`
-	if [ "$system_max" -gt "80000" ] ; then
-		MAX_FILEDESCRIPTORS=32768
-	elif [ "$system_max" -gt "40000" ] ; then
-		MAX_FILEDESCRIPTORS=16384
-	elif [ "$system_max" -gt "10000" ] ; then
-		MAX_FILEDESCRIPTORS=8192
-	else
-		MAX_FILEDESCRIPTORS=1024
-		cat << EOF
-
-Warning: Your system has very few filedescriptors available in total.
-
-Maybe you should try raising that by adding 'fs.file-max=100000' to your
-/etc/sysctl.conf file.  Feel free to pick any number that you deem appropriate.
-Then run 'sysctl -p'.  See /proc/sys/fs/file-max for the current value, and
-file-nr in the same directory for how many of those are used at the moment.
-
-EOF
-	fi
-else
-	MAX_FILEDESCRIPTORS=8192
-fi
-
-NICE=""
-
-case "$1" in
-
-    start)
-	if [ -n "$MAX_FILEDESCRIPTORS" ]; then
-		echo -n "Raising maximum number of filedescriptors (ulimit -n) to $MAX_FILEDESCRIPTORS"
-		if ulimit -n "$MAX_FILEDESCRIPTORS" ; then
-			echo "."
-		else
-			echo ": FAILED."
-		fi
-	fi
-
-    action $"Starting tor:" $TORCTL start
-    RETVAL=$?
-    ;;
-
-    stop)
-    action $"Stopping tor:" $TORCTL stop
-    RETVAL=$?
-    ;;
-
-    restart)
-    action $"Restarting tor:" $TORCTL restart
-    RETVAL=$?
-    ;;
-
-    reload)
-    action $"Reloading tor:" $TORCTL reload
-    RETVAL=$?
-    ;;
-
-    status)
-    $TORCTL status
-    RETVAL=$?
-    ;;
-
-    *)
-    echo "Usage: $0 (start|stop|restart|reload|status)"
-    RETVAL=1
-esac
-
-exit $RETVAL
diff --git a/contrib/torctl.in b/contrib/torctl.in
deleted file mode 100644
index 4cc137d..0000000
--- a/contrib/torctl.in
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/bin/sh
-#
-# TOR control script designed to allow an easy command line interface
-# to controlling The Onion Router
-#
-# The exit codes returned are:
-#       0 - operation completed successfully. For "status", tor running.
-#       1 - For "status", tor not running.
-#       2 - Command not supported
-#       3 - Could not be started or reloaded
-#       4 - Could not be stopped
-#       5 -
-#       6 -
-#       7 -
-#       8 -
-#
-# When multiple arguments are given, only the error from the _last_
-# one is reported.
-#
-#
-# |||||||||||||||||||| START CONFIGURATION SECTION  ||||||||||||||||||||
-# --------------------                              --------------------
-# Name of the executable
-EXEC=tor
-#
-# the path to your binary, including options if necessary
-TORBIN="@BINDIR@/$EXEC"
-#
-# the path to the configuration file
-TORCONF="@CONFDIR@/torrc"
-#
-# the path to your PID file
-PIDFILE="@LOCALSTATEDIR@/run/tor/tor.pid"
-#
-# The path to the log file
-LOGFILE="@LOCALSTATEDIR@/log/tor/tor.log"
-#
-# The path to the datadirectory
-TORDATA="@LOCALSTATEDIR@/lib/tor"
-#
-TORARGS="--pidfile $PIDFILE --log \"notice file $LOGFILE\" --runasdaemon 1"
-TORARGS="$TORARGS --datadirectory $TORDATA"
-
-# If user name is set in the environment, then use it;
-# otherwise run as the invoking user (or whatever user the config
-# file says)... unless the invoking user is root. The idea here is to
-# let an unprivileged user run tor for her own use using this script,
-# while still providing for it to be used as a system daemon.
-if [ "x`id -u`" = "x0" ]; then
-    TORUSER=@TORUSER@
-fi
-
-if [ "x$TORUSER" != "x" ]; then
-    TORARGS="$TORARGS --user $TORUSER"
-fi
-
-# We no longer wrap the Tor daemon startup in an su when running as
-# root, because it's too painful to make the use of su portable.
-# Just let the daemon set the UID and GID.
-START="$TORBIN -f $TORCONF $TORARGS"
-
-#
-# --------------------                              --------------------
-# ||||||||||||||||||||   END CONFIGURATION SECTION  ||||||||||||||||||||
-
-ERROR=0
-ARGV="$@"
-if [ "x$ARGV" = "x" ] ; then
-    ARGS="help"
-fi
-
-checkIfRunning ( ) {
-    # check for pidfile
-    PID=unknown
-    if [ -f $PIDFILE ] ; then
-        PID=`/bin/cat $PIDFILE`
-        if [ "x$PID" != "x" ] ; then
-            if kill -0 $PID 2>/dev/null ; then
-               STATUS="$EXEC (pid $PID) running"
-               RUNNING=1
-            else
-                STATUS="PID file ($PIDFILE) present, but $EXEC ($PID) not running"
-                RUNNING=0
-            fi
-        else
-            STATUS="$EXEC (pid $PID?) not running"
-            RUNNING=0
-        fi
-    else
-       STATUS="$EXEC apparently not running (no pid file)"
-       RUNNING=0
-    fi
-    return
-}
-
-for ARG in $@ $ARGS
-do
-    checkIfRunning
-
-    case $ARG in
-    start)
-        if [ $RUNNING -eq 1 ]; then
-            echo "$0 $ARG: $EXEC (pid $PID) already running"
-            continue
-        fi
-        if eval "$START" ; then
-            echo "$0 $ARG: $EXEC started"
-            # Make sure it stayed up!
-            /bin/sleep 1
-            checkIfRunning
-            if [ $RUNNING -eq 0 ]; then
-                echo "$0 $ARG: $EXEC (pid $PID) quit unexpectedly"
-            fi
-        else
-            echo "$0 $ARG: $EXEC could not be started"
-            ERROR=3
-        fi
-        ;;
-    stop)
-        if [ $RUNNING -eq 0 ]; then
-            echo "$0 $ARG: $STATUS"
-            continue
-        fi
-        if kill -15 $PID ; then
-            echo "$0 $ARG: $EXEC stopped"
-        else
-            /bin/sleep 1
-            if kill -9 $PID ; then
-                echo "$0 $ARG: $EXEC stopped"
-            else
-                echo "$0 $ARG: $EXEC could not be stopped"
-                ERROR=4
-            fi
-        fi
-        # Make sure it really died!
-        /bin/sleep 1
-        checkIfRunning
-        if [ $RUNNING -eq 1 ]; then
-            echo "$0 $ARG: $EXEC (pid $PID) unexpectedly still running"
-            ERROR=4
-        fi
-        ;;
-    restart)
-        $0 stop start
-        ;;
-    reload)
-        if [ $RUNNING -eq 0 ]; then
-            echo "$0 $ARG: $STATUS"
-            continue
-        fi
-        if kill -1 $PID; then
-            /bin/sleep 1
-            echo "$EXEC (PID $PID) reloaded"
-        else
-            echo "Can't reload $EXEC"
-            ERROR=3
-        fi
-        ;;
-    status)
-        echo $STATUS
-        if [ $RUNNING -eq 1 ]; then
-            ERROR=0
-        else
-            ERROR=1
-        fi
-        ;;
-    log)
-        cat $LOGFILE
-        ;;
-    help)
-        echo "usage: $0 (start|stop|restart|status|help)"
-        /bin/cat <<EOF
-
-start      - start $EXEC
-stop       - stop $EXEC
-restart    - stop and restart $EXEC if running or start if not running
-reload     - cause the running process to reinitialize itself
-status     - tell whether $EXEC is running or not
-log        - display the contents of the log file
-help       - this text
-
-EOF
-        ERROR=0
-        ;;
-    *)
-        $0 help
-        ERROR=2
-        ;;
-
-    esac
-
-done
-
-exit $ERROR
-
diff --git a/contrib/torify b/contrib/torify
deleted file mode 100755
index 54acfed..0000000
--- a/contrib/torify
+++ /dev/null
@@ -1,61 +0,0 @@
-#! /bin/sh
-
-# This script used to call (the now deprecated) tsocks as a fallback in case
-# torsocks wasn't installed.
-# Now, it's just a backwards compatible shim around torsocks with reasonable
-# behavior if -v/--verbose or -h/--help arguments are passed.
-#
-# Copyright (c) 2004, 2006, 2009 Peter Palfrader
-# Modified by Jacob Appelbaum <jacob at appelbaum.net> April 16th 2006
-# Stripped of all the tsocks cruft by ugh on February 22nd 2012
-# May be distributed under the same terms as Tor itself
-
-
-compat() {
-	echo "torify is now just a wrapper around torsocks(1) for backwards compatibility."
-}
-
-usage() {
-	compat
-	echo "Usage: $0 [-hv] <command> [<options>...]"
-}
-
-case $# in 0)
-	usage >&2
-	exit 1
-esac
-
-case $# in 1)
-	case $1 in -h|--help)
-		usage
-		exit 0
-	esac
-esac
-
-case $1 in -v|--verbose)
-	compat >&2
-	shift
-esac
-
-# taken from Debian's Developer's Reference, 6.4
-pathfind() {
-       OLDIFS="$IFS"
-       IFS=:
-       for p in $PATH; do
-               if [ -x "$p/$*" ]; then
-                       IFS="$OLDIFS"
-                       return 0
-               fi
-       done
-       IFS="$OLDIFS"
-       return 1
-}
-
-if pathfind torsocks; then
-    exec torsocks "$@"
-    echo "$0: Failed to exec torsocks $@" >&2
-    exit 1
-else
-    echo "$0: torsocks not found in your PATH.  Perhaps it isn't installed?  (tsocks is no longer supported, for security reasons.)" >&2
-fi
-
diff --git a/contrib/torinst32.ico b/contrib/torinst32.ico
deleted file mode 100644
index ccbad9b..0000000
Binary files a/contrib/torinst32.ico and /dev/null differ
diff --git a/contrib/updateVersions.pl b/contrib/updateVersions.pl
deleted file mode 100755
index 9dae1ff..0000000
--- a/contrib/updateVersions.pl
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/perl -w
-
-$CONFIGURE_IN = './configure.ac';
-$ORCONFIG_H = './src/win32/orconfig.h';
-$TOR_NSI = './contrib/tor-mingw.nsi.in';
-
-$quiet = 1;
-
-sub demand {
-    my $fn = shift;
-    die "Missing file $fn" unless (-f $fn);
-}
-
-demand($CONFIGURE_IN);
-demand($ORCONFIG_H);
-demand($TOR_NSI);
-
-# extract version from configure.ac
-
-open(F, $CONFIGURE_IN) or die "$!";
-$version = undef;
-while (<F>) {
-    if (/AC_INIT\(\[tor\],\s*\[([^\]]*)\]\)/) {
-	$version = $1;
-	last;
-    }
-}
-die "No version found" unless $version;
-print "Tor version is $version\n" unless $quiet;
-close F;
-
-sub correctversion {
-    my ($fn, $defchar) = @_;
-    undef $/;
-    open(F, $fn) or die "$!";
-    my $s = <F>;
-    close F;
-    if ($s =~ /^$defchar(?:)define\s+VERSION\s+\"([^\"]+)\"/m) {
-	$oldver = $1;
-	if ($oldver ne $version) {
-	    print "Version mismatch in $fn: It thinks that the version is $oldver.  I think it's $version.  Fixing.\n";
-	    $line = $defchar . "define VERSION \"$version\"";
-	    open(F, ">$fn.bak");
-	    print F $s;
-	    close F;
-	    $s =~ s/^$defchar(?:)define\s+VERSION.*?$/$line/m;
-	    open(F, ">$fn");
-	    print F $s;
-	    close F;
-	} else {
-	    print "$fn has the correct version. Good.\n" unless $quiet;
-	}
-    } else {
-	print "Didn't find a version line in $fn -- uh oh.\n";
-    }
-}
-
-correctversion($TOR_NSI, "!");
-correctversion($ORCONFIG_H, "#");
diff --git a/contrib/win32build/package_nsis-mingw.sh b/contrib/win32build/package_nsis-mingw.sh
new file mode 100644
index 0000000..b8a46cd
--- /dev/null
+++ b/contrib/win32build/package_nsis-mingw.sh
@@ -0,0 +1,95 @@
+#!/bin/sh
+#
+# ===============================================================================
+# package_nsis-ming.sh is distributed under this license:
+
+# Copyright (c) 2006-2007 Andrew Lewman
+# Copyright (c) 2008 The Tor Project, Inc.
+
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+
+#     * Neither the names of the copyright owners nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# ===============================================================================
+
+# Script to package a Tor installer on win32.  This script assumes that
+# you have already built Tor, that you are running msys/mingw, and that
+# you know what you are doing.
+
+# Start in the tor source directory after you've compiled tor.exe
+# This means start as ./contrib/package_nsis-mingw.sh
+
+rm -rf win_tmp
+mkdir win_tmp
+mkdir win_tmp/bin
+mkdir win_tmp/contrib
+mkdir win_tmp/doc
+mkdir win_tmp/doc/spec
+mkdir win_tmp/doc/design-paper
+mkdir win_tmp/doc/contrib
+mkdir win_tmp/src
+mkdir win_tmp/src/config
+mkdir win_tmp/tmp
+
+cp src/or/tor.exe win_tmp/bin/
+cp src/tools/tor-resolve.exe win_tmp/bin/
+cp contrib/tor.ico win_tmp/bin/
+cp src/config/geoip win_tmp/bin/
+strip win_tmp/bin/*.exe
+
+# There is no man2html in mingw.  
+# Maybe we should add this into make dist instead.
+# One has to do this manually and cp it do the tor-source/doc dir
+#man2html doc/tor.1.in > win_tmp/tmp/tor-reference.html
+#man2html doc/tor-resolve.1 > win_tmp/tmp/tor-resolve.html
+
+clean_newlines() {
+    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg;' $1 >$2
+}
+
+clean_localstatedir() {
+    perl -pe 's/^\n$/\r\n/mg; s/([^\r])\n$/\1\r\n/mg; s{\@LOCALSTATEDIR\@/(lib|log)/tor/}{C:\\Documents and Settings\\Application Data\\Tor\\}' $1 >$2
+}
+
+for fn in address-spec.txt bridges-spec.txt control-spec.txt dir-spec.txt path-spec.txt rend-spec.txt socks-extensions.txt tor-spec.txt version-spec.txt; do
+    clean_newlines doc/spec/$fn win_tmp/doc/spec/$fn
+done
+
+for fn in HACKING tor-gencert.html tor.html torify.html tor-resolve.html; do
+    clean_newlines doc/$fn win_tmp/doc/$fn
+done
+
+for fn in README ChangeLog LICENSE; do
+    clean_newlines $fn win_tmp/$fn
+done
+
+clean_localstatedir src/config/torrc.sample.in win_tmp/src/config/torrc.sample
+
+cp contrib/tor-mingw.nsi.in win_tmp/contrib/
+
+cd win_tmp
+makensis.exe contrib/tor-mingw.nsi.in
+
diff --git a/contrib/win32build/tor-mingw.nsi.in b/contrib/win32build/tor-mingw.nsi.in
new file mode 100644
index 0000000..0e1594d
--- /dev/null
+++ b/contrib/win32build/tor-mingw.nsi.in
@@ -0,0 +1,274 @@
+;tor.nsi - A basic win32 installer for Tor
+; Originally written by J Doe.
+; Modified by Steve Topletz, Andrew Lewman
+; See the Tor LICENSE for licensing information
+;-----------------------------------------
+;
+!include "MUI.nsh"
+!include "LogicLib.nsh"
+!include "FileFunc.nsh"
+!insertmacro GetParameters
+!define VERSION "0.2.5.4-alpha-dev"
+!define INSTALLER "tor-${VERSION}-win32.exe"
+!define WEBSITE "https://www.torproject.org/"
+!define LICENSE "LICENSE"
+!define BIN "..\bin" ;BIN is where it expects to find tor.exe, tor-resolve.exe
+  
+ 
+SetCompressor /SOLID LZMA ;Tighter compression
+RequestExecutionLevel user ;Updated for Vista compatibility
+OutFile ${INSTALLER}
+InstallDir $PROGRAMFILES\Tor
+SetOverWrite ifnewer
+Name "Tor"
+Caption "Tor ${VERSION} Setup"
+BrandingText "The Onion Router"
+CRCCheck on
+XPStyle on
+VIProductVersion "${VERSION}"
+VIAddVersionKey "ProductName" "The Onion Router: Tor"
+VIAddVersionKey "Comments" "${WEBSITE}"
+VIAddVersionKey "LegalTrademarks" "Three line BSD"
+VIAddVersionKey "LegalCopyright" "©2004-2008, Roger Dingledine, Nick Mathewson. ©2009 The Tor Project, Inc. "
+VIAddVersionKey "FileDescription" "Tor is an implementation of Onion Routing. You can read more at ${WEBSITE}"
+VIAddVersionKey "FileVersion" "${VERSION}"
+
+!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor Setup Wizard"
+!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK"
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico"
+!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico"
+!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
+!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe"
+!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates."
+!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE}
+
+!insertmacro MUI_PAGE_WELCOME
+; There's no point in having a clickthrough license: Our license adds
+; certain rights, but doesn't remove them.
+; !insertmacro MUI_PAGE_LICENSE "${LICENSE}"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+!insertmacro MUI_LANGUAGE "English"
+
+Var CONFIGDIR
+Var CONFIGFILE
+
+Function .onInit
+	Call ParseCmdLine
+FunctionEnd
+
+;Sections
+;--------
+
+Section "Tor" Tor
+;Files that have to be installed for tor to run and that the user
+;cannot choose not to install
+	SectionIn RO
+	SetOutPath $INSTDIR
+	Call ExtractBinaries
+	Call ExtractIcon
+	WriteINIStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE}
+
+	StrCpy $CONFIGFILE "torrc"
+	StrCpy $CONFIGDIR $APPDATA\Tor
+;   ;If $APPDATA isn't valid here (Early win95 releases with no updated
+;   ; shfolder.dll) then we put it in the program directory instead.
+;   StrCmp $APPDATA "" "" +2
+;      StrCpy $CONFIGDIR $INSTDIR
+	SetOutPath $CONFIGDIR
+	;If there's already a torrc config file, ask if they want to
+	;overwrite it with the new one.
+	${If} ${FileExists} "$CONFIGDIR\torrc"
+		MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDYES Yes IDNO No
+		Yes:
+			Delete $CONFIGDIR\torrc
+			Goto Next
+		No:
+			StrCpy $CONFIGFILE "torrc.sample"
+		Next:
+	${EndIf}
+	File /oname=$CONFIGFILE "..\src\config\torrc.sample"
+
+; the geoip file needs to be included and stuffed into the right directory
+; otherwise tor is unhappy
+	SetOutPath $APPDATA\Tor
+	Call ExtractGEOIP
+SectionEnd
+
+Section "Documents" Docs
+	Call ExtractDocuments
+SectionEnd
+
+SubSection /e "Shortcuts" Shortcuts
+
+Section "Start Menu" StartMenu
+  SetOutPath $INSTDIR
+  ${If} ${FileExists} "$SMPROGRAMS\Tor\*.*"
+    RMDir /r "$SMPROGRAMS\Tor"
+  ${EndIf}
+  Call CreateTorLinks
+  ${If} ${FileExists} "$INSTDIR\Documents\*.*"
+    Call CreateDocLinks
+  ${EndIf}
+SectionEnd
+
+Section "Desktop" Desktop
+   SetOutPath $INSTDIR
+   CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" 
+SectionEnd
+
+Section /o "Run at startup" Startup
+   SetOutPath $INSTDIR
+   CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico" "" SW_SHOWMINIMIZED
+SectionEnd
+
+SubSectionEnd
+
+Section "Uninstall"
+   Call un.InstallPackage
+SectionEnd
+
+Section -End
+    WriteUninstaller "$INSTDIR\Uninstall.exe"
+    ;The registry entries simply add the Tor uninstaller to the Windows
+    ;uninstall list.
+    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)"
+    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"'
+SectionEnd
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+!insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run."
+!insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor."
+!insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor"
+!insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu"
+!insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop"
+!insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+;####################Functions#########################
+
+Function ExtractBinaries
+	File "${BIN}\tor.exe"
+	File "${BIN}\tor-resolve.exe"
+FunctionEnd
+
+Function ExtractGEOIP
+	File "${BIN}\geoip"
+FunctionEnd
+
+Function ExtractIcon
+	File "${BIN}\tor.ico"
+FunctionEnd
+
+Function ExtractSpecs
+	File "..\doc\HACKING"
+	File "..\doc\spec\address-spec.txt"
+	File "..\doc\spec\bridges-spec.txt"
+	File "..\doc\spec\control-spec.txt"
+	File "..\doc\spec\dir-spec.txt"
+	File "..\doc\spec\path-spec.txt"
+	File "..\doc\spec\rend-spec.txt"
+	File "..\doc\spec\socks-extensions.txt"
+	File "..\doc\spec\tor-spec.txt"
+	File "..\doc\spec\version-spec.txt"
+FunctionEnd
+
+Function ExtractHTML
+	File "..\doc\tor.html"
+	File "..\doc\torify.html"
+	File "..\doc\tor-resolve.html"
+	File "..\doc\tor-gencert.html"
+FunctionEnd
+
+Function ExtractReleaseDocs
+	File "..\README"
+	File "..\ChangeLog"
+	File "..\LICENSE"
+FunctionEnd
+
+Function ExtractDocuments
+	SetOutPath "$INSTDIR\Documents"
+	Call ExtractSpecs
+	Call ExtractHTML
+	Call ExtractReleaseDocs
+FunctionEnd
+
+Function un.InstallFiles
+	Delete "$DESKTOP\Tor.lnk"
+	Delete "$INSTDIR\tor.exe"
+	Delete "$INSTDIR\tor-resolve.exe"
+	Delete "$INSTDIR\Tor Website.url"
+	Delete "$INSTDIR\torrc"
+	Delete "$INSTDIR\torrc.sample"
+	Delete "$INSTDIR\tor.ico"
+	Delete "$SMSTARTUP\Tor.lnk"
+	Delete "$INSTDIR\Uninstall.exe"
+    Delete "$INSTDIR\geoip"
+FunctionEnd
+
+Function un.InstallDirectories
+	${If} $CONFIGDIR == $INSTDIR
+		RMDir /r $CONFIGDIR
+	${EndIf}
+	RMDir /r "$INSTDIR\Documents"
+	RMDir $INSTDIR
+	RMDir /r "$SMPROGRAMS\Tor"
+	RMDir /r "$APPDATA\Tor"
+FunctionEnd
+
+Function un.WriteRegistry
+	DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor"
+FunctionEnd
+
+Function un.InstallPackage
+	Call un.InstallFiles
+	Call un.InstallDirectories
+	Call un.WriteRegistry
+FunctionEnd
+
+Function CreateTorLinks
+	CreateDirectory "$SMPROGRAMS\Tor"
+	CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe" "" "$INSTDIR\tor.ico"
+	CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$CONFIGDIR\torrc"
+	CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url"
+	CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+FunctionEnd
+
+Function CreateDocLinks
+	CreateDirectory "$SMPROGRAMS\Tor\Documents"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Address Specification.lnk" "$INSTDIR\Documents\address-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Bridges Specification.lnk" "$INSTDIR\Documents\bridges-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Control Specification.lnk" "$INSTDIR\Documents\control-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Directory Specification.lnk" "$INSTDIR\Documents\dir-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Path Specification.lnk" "$INSTDIR\Documents\path-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Rend Specification.lnk" "$INSTDIR\Documents\rend-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Version Specification.lnk" "$INSTDIR\Documents\version-spec.txt"
+	CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor SOCKS Extensions.lnk" "$INSTDIR\Documents\socks-extensions.txt"
+FunctionEnd
+
+Function ParseCmdLine
+	${GetParameters} $1
+	${If} $1 == "-x" ;Extract All Files
+		StrCpy $INSTDIR $EXEDIR
+		Call ExtractBinaries
+		Call ExtractDocuments
+		Quit
+	${ElseIf} $1 == "-b" ;Extract Binaries Only
+		StrCpy $INSTDIR $EXEDIR
+		Call ExtractBinaries
+		Quit
+	${ElseIf} $1 != ""
+		MessageBox MB_OK|MB_TOPMOST `${Installer} [-x|-b]$\r$\n$\r$\n  -x    Extract all files$\r$\n  -b    Extract binary files only`
+		Quit
+	${EndIf}
+FunctionEnd
+
diff --git a/contrib/win32build/tor.ico b/contrib/win32build/tor.ico
new file mode 100644
index 0000000..0cac297
Binary files /dev/null and b/contrib/win32build/tor.ico differ
diff --git a/contrib/win32build/tor.nsi.in b/contrib/win32build/tor.nsi.in
new file mode 100644
index 0000000..dd24df4
--- /dev/null
+++ b/contrib/win32build/tor.nsi.in
@@ -0,0 +1,214 @@
+;tor.nsi - A basic win32 installer for Tor
+; Originally written by J Doe.
+; See LICENSE for licensing information
+;-----------------------------------------
+; NOTE: This file might be obsolete. Look at tor-mingw.nsi.in instead.
+;-----------------------------------------
+; How to make an installer:
+;   Step 0. If you are a Tor maintainer, make sure that tor.nsi and
+;           src/win32/orconfig.h all have the correct version number.
+;   Step 1. Download and install OpenSSL.  Make sure that the OpenSSL
+;           version listed below matches the one you downloaded.
+;   Step 2. Download and install NSIS (http://nsis.sourceforge.net)
+;   Step 3. Make a directory under the main tor directory called "bin".
+;   Step 4. Copy ssleay32.dll and libeay32.dll from OpenSSL into "bin".
+;   Step 5. Run man2html on tor.1.in; call the result tor-reference.html
+;           Run man2html on tor-resolve.1; call the result tor-resolve.html
+;   Step 6. Copy torrc.sample.in to torrc.sample.
+;   Step 7. Build tor.exe and tor_resolve.exe; save the result into bin.
+;   Step 8. cd into contrib and run "makensis tor.nsi".
+;
+; Problems:
+;   - Copying torrc.sample.in to torrc.sample and tor.1.in (implicitly)
+;     to tor.1 is a Bad Thing, and leaves us with @autoconf@ vars in the final
+;     result.
+;   - Building Tor requires too much windows C clue.
+;     - We should have actual makefiles for VC that do the right thing.
+;   - I need to learn more NSIS juju to solve these:
+;     - There should be a batteries-included installer that comes with
+;       privoxy too. (Check privoxy license on this; be sure to include
+;       all privoxy documents.)
+;   - The filename should probably have a revision number.
+
+!include "MUI.nsh"
+
+!define VERSION "0.1.2.3-alpha-dev"
+!define INSTALLER "tor-${VERSION}-win32.exe"
+!define WEBSITE "https://www.torproject.org/"
+
+!define LICENSE "..\LICENSE"
+;BIN is where it expects to find tor.exe, tor_resolve.exe, libeay32.dll and
+;  ssleay32.dll
+!define BIN "..\bin"
+
+SetCompressor lzma
+;SetCompressor zlib
+OutFile ${INSTALLER}
+InstallDir $PROGRAMFILES\Tor
+SetOverWrite ifnewer
+
+Name "Tor"
+Caption "Tor ${VERSION} Setup"
+BrandingText "The Onion Router"
+CRCCheck on
+
+;Use upx on the installer header to shrink the size.
+!packhdr header.dat "upx --best header.dat"
+
+!define MUI_WELCOMEPAGE_TITLE "Welcome to the Tor ${VERSION} Setup Wizard"
+!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Tor ${VERSION}.\r\n\r\nIf you have previously installed Tor and it is currently running, please exit Tor first before continuing this installation.\r\n\r\n$_CLICK"
+!define MUI_ABORTWARNING
+!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\win-install.ico"
+!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\win-uninstall.ico"
+!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
+!define MUI_HEADERIMAGE
+!define MUI_FINISHPAGE_RUN "$INSTDIR\tor.exe"
+!define MUI_FINISHPAGE_LINK "Visit the Tor website for the latest updates."
+!define MUI_FINISHPAGE_LINK_LOCATION ${WEBSITE}
+
+!insertmacro MUI_PAGE_WELCOME
+; There's no point in having a clickthrough license: Our license adds
+; certain rights, but doesn't remove them.
+; !insertmacro MUI_PAGE_LICENSE "${LICENSE}"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+!insertmacro MUI_PAGE_INSTFILES
+!insertmacro MUI_PAGE_FINISH
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+!insertmacro MUI_UNPAGE_FINISH
+!insertmacro MUI_LANGUAGE "English"
+
+Var configdir
+Var configfile
+
+;Sections
+;--------
+
+Section "Tor" Tor
+;Files that have to be installed for tor to run and that the user
+;cannot choose not to install
+   SectionIn RO
+   SetOutPath $INSTDIR
+   File "${BIN}\tor.exe"
+   File "${BIN}\tor_resolve.exe"
+   WriteIniStr "$INSTDIR\Tor Website.url" "InternetShortcut" "URL" ${WEBSITE}
+
+   StrCpy $configfile "torrc"
+   StrCpy $configdir $APPDATA\Tor
+;   ;If $APPDATA isn't valid here (Early win95 releases with no updated
+;   ; shfolder.dll) then we put it in the program directory instead.
+;   StrCmp $APPDATA "" "" +2
+;      StrCpy $configdir $INSTDIR
+   SetOutPath $configdir
+   ;If there's already a torrc config file, ask if they want to
+   ;overwrite it with the new one.
+   IfFileExists "$configdir\torrc" "" endiftorrc
+      MessageBox MB_ICONQUESTION|MB_YESNO "You already have a Tor config file.$\r$\nDo you want to overwrite it with the default sample config file?" IDNO yesreplace
+      Delete $configdir\torrc
+      Goto endiftorrc
+     yesreplace:
+      StrCpy $configfile "torrc.sample"
+   endiftorrc:
+   File /oname=$configfile "..\src\config\torrc.sample"
+SectionEnd
+
+Section "OpenSSL 0.9.8a" OpenSSL
+   SetOutPath $INSTDIR
+   File "${BIN}\libeay32.dll"
+   File "${BIN}\ssleay32.dll"
+SectionEnd
+
+Section "Documents" Docs
+   SetOutPath "$INSTDIR\Documents"
+   ;File "..\doc\FAQ"
+   File "..\doc\HACKING"
+   File "..\doc\spec\control-spec.txt"
+   File "..\doc\spec\dir-spec.txt"
+   File "..\doc\spec\rend-spec.txt"
+   File "..\doc\spec\socks-extensions.txt"
+   File "..\doc\spec\tor-spec.txt"
+   File "..\doc\spec\version-spec.txt"
+   ;
+   ; WEBSITE-FILES-HERE
+   ;
+   File "..\doc\tor-resolve.html"
+   File "..\doc\tor-reference.html"
+   ;
+   File "..\doc\design-paper\tor-design.pdf"
+   ;
+   File "..\README"
+   File "..\AUTHORS"
+   File "..\ChangeLog"
+   File "..\LICENSE"
+SectionEnd
+
+SubSection /e "Shortcuts" Shortcuts
+
+Section "Start Menu" StartMenu
+   SetOutPath $INSTDIR
+   IfFileExists "$SMPROGRAMS\Tor\*.*" "" +2
+      RMDir /r "$SMPROGRAMS\Tor"
+   CreateDirectory "$SMPROGRAMS\Tor"
+   CreateShortCut "$SMPROGRAMS\Tor\Tor.lnk" "$INSTDIR\tor.exe"
+   CreateShortCut "$SMPROGRAMS\Tor\Torrc.lnk" "Notepad.exe" "$configdir\torrc"
+   CreateShortCut "$SMPROGRAMS\Tor\Tor Website.lnk" "$INSTDIR\Tor Website.url"
+   CreateShortCut "$SMPROGRAMS\Tor\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
+   IfFileExists "$INSTDIR\Documents\*.*" "" endifdocs
+      CreateDirectory "$SMPROGRAMS\Tor\Documents"
+      CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Manual.lnk" "$INSTDIR\Documents\tor-reference.html"
+      CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Documentation.lnk" "$INSTDIR\Documents"
+      CreateShortCut "$SMPROGRAMS\Tor\Documents\Tor Specification.lnk" "$INSTDIR\Documents\tor-spec.txt"
+   endifdocs:
+SectionEnd
+
+Section "Desktop" Desktop
+   SetOutPath $INSTDIR
+   CreateShortCut "$DESKTOP\Tor.lnk" "$INSTDIR\tor.exe"
+SectionEnd
+
+Section /o "Run at startup" Startup
+   SetOutPath $INSTDIR
+   CreateShortCut "$SMSTARTUP\Tor.lnk" "$INSTDIR\tor.exe" "" "" 0 SW_SHOWMINIMIZED
+SectionEnd
+
+SubSectionEnd
+
+Section "Uninstall"
+   Delete "$DESKTOP\Tor.lnk"
+   Delete "$INSTDIR\libeay32.dll"
+   Delete "$INSTDIR\ssleay32.dll"
+   Delete "$INSTDIR\tor.exe"
+   Delete "$INSTDIR\tor_resolve.exe"
+   Delete "$INSTDIR\Tor Website.url"
+   Delete "$INSTDIR\torrc"
+   Delete "$INSTDIR\torrc.sample"
+   StrCmp $configdir $INSTDIR +2 ""
+      RMDir /r $configdir
+   Delete "$INSTDIR\Uninstall.exe"
+   RMDir /r "$INSTDIR\Documents"
+   RMDir $INSTDIR
+   RMDir /r "$SMPROGRAMS\Tor"
+   Delete "$SMSTARTUP\Tor.lnk"
+   DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Tor"
+SectionEnd
+
+Section -End
+    WriteUninstaller "$INSTDIR\Uninstall.exe"
+    ;The registry entries simply add the Tor uninstaller to the Windows
+    ;uninstall list.
+    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "DisplayName" "Tor (remove only)"
+    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Tor" "UninstallString" '"$INSTDIR\Uninstall.exe"'
+SectionEnd
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+  !insertmacro MUI_DESCRIPTION_TEXT ${Tor} "The core executable and config files needed for Tor to run."
+  !insertmacro MUI_DESCRIPTION_TEXT ${OpenSSL} "OpenSSL libraries required by Tor."
+  !insertmacro MUI_DESCRIPTION_TEXT ${Docs} "Documentation about Tor."
+  !insertmacro MUI_DESCRIPTION_TEXT ${ShortCuts} "Shortcuts to easily start Tor"
+  !insertmacro MUI_DESCRIPTION_TEXT ${StartMenu} "Shortcuts to access Tor and its documentation from the Start Menu"
+  !insertmacro MUI_DESCRIPTION_TEXT ${Desktop} "A shortcut to start Tor from the desktop"
+  !insertmacro MUI_DESCRIPTION_TEXT ${Startup} "Launches Tor automatically at startup in a minimized window"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
diff --git a/contrib/xenobite.ico b/contrib/xenobite.ico
deleted file mode 100644
index 352394e..0000000
Binary files a/contrib/xenobite.ico and /dev/null differ
diff --git a/scripts/maint/checkLogs.pl b/scripts/maint/checkLogs.pl
new file mode 100755
index 0000000..b00503e
--- /dev/null
+++ b/scripts/maint/checkLogs.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/perl -w
+
+use strict;
+
+my %count = ();
+my $more = 0;
+my $last = "";
+
+while (<>) {
+    if ($more) {
+        if (/LD_BUG/) {
+            $more = 0;
+            next;
+        }
+        if (/\"((?:[^\"\\]+|\\.*)+)\"(.*)/) {
+            $last .= $1;
+            if ($2 !~ /[,\)]/) {
+                $more = 1;
+            } else {
+                $count{lc $last}++;
+                $more = 0;
+            }
+        } elsif (/[,\)]/) {
+            $count{lc $last}++;
+            $more = 0;
+        } elsif ($more == 2) {
+            print "SKIPPED more\n";
+        }
+    } elsif (/log_(?:warn|err|notice)\(\s*(LD_[A-Z_]*)\s*,\s*\"((?:[^\"\\]+|\\.)*)\"(.*)/) {
+        next if ($1 eq 'LD_BUG');
+        my $s = $2;
+        if ($3 =~ /[,\)]/ ) {
+            $count{lc $s}++;
+        } else {
+            $more = 1;
+            $last = $s;
+        }
+    } elsif (/log_(?:warn|err|notice)\(\s*((?:LD_[A-Z_]*)?)(.*)/) {
+        next if ($1 eq 'LD_BUG');
+        my $extra = $2;
+        chomp $extra;
+        $last = "";
+        $more = 2 if ($extra eq '');
+    }
+}
+
+while ((my $phrase, my $count) = each %count) {
+    if ($count > 1) {
+        print "$count\t$phrase\n";
+    }
+}
diff --git a/scripts/maint/checkOptionDocs.pl b/scripts/maint/checkOptionDocs.pl
new file mode 100755
index 0000000..23e57b4
--- /dev/null
+++ b/scripts/maint/checkOptionDocs.pl
@@ -0,0 +1,70 @@
+#!/usr/bin/perl -w
+use strict;
+
+my %options = ();
+my %descOptions = ();
+my %torrcSampleOptions = ();
+my %manPageOptions = ();
+
+# Load the canonical list as actually accepted by Tor.
+open(F, "./src/or/tor --list-torrc-options |") or die;
+while (<F>) {
+    next if m!\[notice\] Tor v0\.!;
+    if (m!^([A-Za-z0-9_]+)!) {
+        $options{$1} = 1;
+    } else {
+        print "Unrecognized output> ";
+        print;
+    }
+}
+close F;
+
+# Load the contents of torrc.sample
+sub loadTorrc {
+    my ($fname, $options) = @_;
+    local *F;
+    open(F, "$fname") or die;
+    while (<F>) {
+        next if (m!##+!);
+        if (m!#([A-Za-z0-9_]+)!) {
+            $options->{$1} = 1;
+        }
+    }
+    close F;
+    0;
+}
+
+loadTorrc("./src/config/torrc.sample.in", \%torrcSampleOptions);
+
+# Try to figure out what's in the man page.
+
+my $considerNextLine = 0;
+open(F, "./doc/tor.1.txt") or die;
+while (<F>) {
+    if (m!^\*\*([A-Za-z0-9_]+)\*\*!) {
+        $manPageOptions{$1} = 1;
+    }
+}
+close F;
+
+# Now, display differences:
+
+sub subtractHashes {
+    my ($s, $a, $b) = @_;
+    my @lst = ();
+    for my $k (keys %$a) {
+        push @lst, $k unless (exists $b->{$k});
+    }
+    print "$s: ", join(' ', sort @lst), "\n\n";
+    0;
+}
+
+# subtractHashes("No online docs", \%options, \%descOptions);
+# subtractHashes("Orphaned online docs", \%descOptions, \%options);
+
+subtractHashes("Orphaned in torrc.sample.in", \%torrcSampleOptions, \%options);
+
+subtractHashes("Not in man page", \%options, \%manPageOptions);
+subtractHashes("Orphaned in man page", \%manPageOptions, \%options);
+
+
diff --git a/scripts/maint/checkSpace.pl b/scripts/maint/checkSpace.pl
new file mode 100755
index 0000000..682dbce
--- /dev/null
+++ b/scripts/maint/checkSpace.pl
@@ -0,0 +1,138 @@
+#!/usr/bin/perl -w
+
+if ($ARGV[0] =~ /^-/) {
+    $lang = shift @ARGV;
+    $C = ($lang eq '-C');
+#    $TXT = ($lang eq '-txt');
+}
+
+for $fn (@ARGV) {
+    open(F, "$fn");
+    $lastnil = 0;
+    $lastline = "";
+    $incomment = 0;
+    while (<F>) {
+        ## Warn about windows-style newlines.
+        if (/\r/) {
+            print "       CR:$fn:$.\n";
+        }
+        ## Warn about tabs.
+        if (/\t/) {
+            print "      TAB:$fn:$.\n";
+        }
+        ## Warn about markers that don't have a space in front of them
+        if (/^[a-zA-Z_][a-zA-Z_0-9]*:/) {
+            print "nosplabel:$fn:$.\n";
+        }
+        ## Warn about trailing whitespace.
+        if (/ +$/) {
+            print "Space\@EOL:$fn:$.\n";
+        }
+        ## Warn about control keywords without following space.
+        if ($C && /\s(?:if|while|for|switch)\(/) {
+            print "      KW(:$fn:$.\n";
+        }
+        ## Warn about #else #if instead of #elif.
+        if (($lastline =~ /^\# *else/) and ($_ =~ /^\# *if/)) {
+            print " #else#if:$fn:$.\n";
+        }
+        ## Warn about some K&R violations
+        if (/^\s+\{/ and $lastline =~ /^\s*(if|while|for|else if)/ and
+	    $lastline !~ /\{$/) {
+            print "non-K&R {:$fn:$.\n";
+	}
+        if (/^\s*else/ and $lastline =~ /\}$/) {
+	    print "  }\\nelse:$fn:$.\n";
+	}
+        $lastline = $_;
+        ## Warn about unnecessary empty lines.
+        if ($lastnil && /^\s*}\n/) {
+            print "  UnnecNL:$fn:$.\n";
+        }
+        ## Warn about multiple empty lines.
+        if ($lastnil && /^$/) {
+            print " DoubleNL:$fn:$.\n";
+        } elsif (/^$/) {
+            $lastnil = 1;
+        } else {
+            $lastnil = 0;
+        }
+        ## Terminals are still 80 columns wide in my world.  I refuse to
+        ## accept double-line lines.
+        if (/^.{80}/) {
+            print "     Wide:$fn:$.\n";
+        }
+        ### Juju to skip over comments and strings, since the tests
+        ### we're about to do are okay there.
+        if ($C) {
+            if ($incomment) {
+                if (m!\*/!) {
+                    s!.*?\*/!!;
+                    $incomment = 0;
+                } else {
+                    next;
+                }
+            }
+            if (m!/\*.*?\*/!) {
+                s!\s*/\*.*?\*/!!;
+            } elsif (m!/\*!) {
+                s!\s*/\*!!;
+                $incomment = 1;
+                next;
+            }
+            s!"(?:[^\"]+|\\.)*"!"X"!g;
+            next if /^\#/;
+            ## Warn about C++-style comments.
+            if (m!//!) {
+                #    print "       //:$fn:$.\n";
+                s!//.*!!;
+            }
+            ## Warn about unquoted braces preceded by non-space.
+            if (/([^\s'])\{/) {
+                print "       $1\{:$fn:$.\n";
+            }
+            ## Warn about multiple internal spaces.
+            #if (/[^\s,:]\s{2,}[^\s\\=]/) {
+            #    print "     X  X:$fn:$.\n";
+            #}
+            ## Warn about { with stuff after.
+            #s/\s+$//;
+            #if (/\{[^\}\\]+$/) {
+            #    print "     {X:$fn:$.\n";
+            #}
+            ## Warn about function calls with space before parens.
+            if (/(\w+)\s\(([A-Z]*)/) {
+                if ($1 ne "if" and $1 ne "while" and $1 ne "for" and
+                    $1 ne "switch" and $1 ne "return" and $1 ne "int" and
+                    $1 ne "elsif" and $1 ne "WINAPI" and $2 ne "WINAPI" and
+                    $1 ne "void" and $1 ne "__attribute__" and $1 ne "op") {
+                    print "     fn ():$fn:$.\n";
+                }
+            }
+            ## Warn about functions not declared at start of line.
+            if ($in_func_head ||
+                ($fn !~ /\.h$/ && /^[a-zA-Z0-9_]/ &&
+                 ! /^(?:const |static )*(?:typedef|struct|union)[^\(]*$/ &&
+                 ! /= *\{$/ && ! /;$/)) {
+                if (/.\{$/){
+                    print "fn() {:$fn:$.\n";
+                    $in_func_head = 0;
+                } elsif (/^\S[^\(]* +\**[a-zA-Z0-9_]+\(/) {
+                    $in_func_head = -1; # started with tp fn
+                } elsif (/;$/) {
+                    $in_func_head = 0;
+                } elsif (/\{/) {
+                    if ($in_func_head == -1) {
+                        print "tp fn():$fn:$.\n";
+                    }
+                    $in_func_head = 0;
+                }
+            }
+        }
+    }
+    if (! $lastnil) {
+        print "  EOL\@EOF:$fn:$.\n";
+    }
+    close(F);
+}
+
diff --git a/scripts/maint/findMergedChanges.pl b/scripts/maint/findMergedChanges.pl
new file mode 100755
index 0000000..d6c4105
--- /dev/null
+++ b/scripts/maint/findMergedChanges.pl
@@ -0,0 +1,73 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+sub nChanges {
+    my ($branches, $fname) = @_;
+    local *F;
+    # requires perl 5.8.  Avoids shell issues if we ever get a changes
+    # file named by the parents of Little Johnny Tables.
+    open F, "-|", "git", "log", "--no-merges", "--pretty=format:%H", $branches, "--", $fname
+	or die "$!";
+    my @changes = <F>;
+    return scalar @changes
+}
+
+my $look_for_type = "merged";
+
+if (! @ARGV) {
+    print <<EOF
+Usage:
+   findMergedChanges.pl [--merged/--unmerged/--weird/--list] [--branch=<branchname] [--head=<branchname>] changes/*
+
+A change is "merged" if it has ever been merged to release-0.2.4 and it has had
+no subsequent changes in master.
+
+A change is "unmerged" if it has never been merged to release-0.2.4 and it
+has had changes in master.
+
+A change is "weird" if it has been merged to release-0.2.4 and it *has* had
+subsequent changes in master.
+
+Suggested application:
+   findMergedChanges.pl --merged changes/* | xargs -n 1 git rm
+
+EOF
+}
+
+my $target_branch = "origin/release-0.2.4";
+my $head = "origin/master";
+
+while (@ARGV and $ARGV[0] =~ /^--/) {
+    my $flag = shift @ARGV;
+    if ($flag =~ /^--(weird|merged|unmerged|list)/) {
+	$look_for_type = $1;
+    } elsif ($flag =~ /^--branch=(\S+)/) {
+        $target_branch = $1;
+    } elsif ($flag =~ /^--head=(\S+)/) {
+        $head = $1;
+    } else {
+	die "Unrecognized flag $flag";
+    }
+}
+
+for my $changefile (@ARGV) {
+    my $n_merged = nChanges($target_branch, $changefile);
+    my $n_postmerged = nChanges("${target_branch}..${head}", $changefile);
+    my $type;
+
+    if ($n_merged != 0 and $n_postmerged == 0) {
+	$type = "merged";
+    } elsif ($n_merged == 0 and $n_postmerged != 0) {
+	$type = "unmerged";
+    } else {
+	$type = "weird";
+    }
+
+    if ($type eq $look_for_type) {
+	print "$changefile\n";
+    } elsif ($look_for_type eq 'list') {
+	printf "% 8s: %s\n", $type, $changefile;
+    }
+}
diff --git a/scripts/maint/format_changelog.py b/scripts/maint/format_changelog.py
new file mode 100755
index 0000000..6997d95
--- /dev/null
+++ b/scripts/maint/format_changelog.py
@@ -0,0 +1,162 @@
+#!/usr/bin/python
+# Copyright (c) 2014, The Tor Project, Inc.
+# See LICENSE for licensing information
+#
+# This script reformats a section of the changelog to wrap everything to
+# the right width and put blank lines in the right places.  Eventually,
+# it might include a linter.
+#
+# To run it, pipe a section of the changelog (starting with "Changes
+# in Tor 0.x.y.z-alpha" through the script.)
+
+import os
+import re
+import sys
+import textwrap
+
+TP_MAINHEAD = 0
+TP_HEADTEXT = 1
+TP_BLANK = 2
+TP_SECHEAD = 3
+TP_ITEMFIRST = 4
+TP_ITEMBODY = 5
+TP_END = 6
+
+def head_parser(line):
+    if re.match(r'^[A-Z]', line):
+        return TP_MAINHEAD
+    elif re.match(r'^  o ', line):
+        return TP_SECHEAD
+    elif re.match(r'^\s*$', line):
+        return TP_BLANK
+    else:
+        return TP_HEADTEXT
+
+def body_parser(line):
+    if re.match(r'^  o ', line):
+        return TP_SECHEAD
+    elif re.match(r'^    -',line):
+        return TP_ITEMFIRST
+    elif re.match(r'^      \S', line):
+        return TP_ITEMBODY
+    elif re.match(r'^\s*$', line):
+        return TP_BLANK
+    elif re.match(r'^Changes in', line):
+        return TP_END
+    else:
+        print "Weird line %r"%line
+
+class ChangeLog(object):
+    def __init__(self):
+        self.mainhead = None
+        self.headtext = []
+        self.curgraf = None
+        self.sections = []
+        self.cursection = None
+        self.lineno = 0
+
+    def addLine(self, tp, line):
+        self.lineno += 1
+
+        if tp == TP_MAINHEAD:
+            assert not self.mainhead
+            self.mainhead = line
+
+        elif tp == TP_HEADTEXT:
+            if self.curgraf is None:
+                self.curgraf = []
+                self.headtext.append(self.curgraf)
+            self.curgraf.append(line)
+
+        elif tp == TP_BLANK:
+            self.curgraf = None
+
+        elif tp == TP_SECHEAD:
+            self.cursection = [ self.lineno, line, [] ]
+            self.sections.append(self.cursection)
+
+        elif tp == TP_ITEMFIRST:
+            item = ( self.lineno, [ [line] ])
+            self.curgraf = item[1][0]
+            self.cursection[2].append(item)
+
+        elif tp == TP_ITEMBODY:
+            if self.curgraf is None:
+                self.curgraf = []
+                self.cursection[2][1][-1].append(self.curgraf)
+            self.curgraf.append(line)
+
+        else:
+            assert "This" is "unreachable"
+
+    def lint_head(self, line, head):
+        m = re.match(r'^ *o ([^\(]+)((?:\([^\)]+\))?):', head)
+        if not m:
+            print >>sys.stderr, "Weird header format on line %s"%line
+
+    def lint_item(self, line, grafs, head_type):
+        pass
+
+    def lint(self):
+        self.head_lines = {}
+        for sec_line, sec_head, items in self.sections:
+            head_type = self.lint_head(sec_line, sec_head)
+            for item_line, grafs in items:
+                self.lint_item(item_line, grafs, head_type)
+
+    def dumpGraf(self,par,indent1,indent2=-1):
+        if indent2 == -1:
+            indent2 = indent1
+        text = " ".join(re.sub(r'\s+', ' ', line.strip()) for line in par)
+        print textwrap.fill(text, width=72,
+                            initial_indent=" "*indent1,
+                            subsequent_indent=" "*indent2,
+                            break_on_hyphens=False)
+
+    def dump(self):
+        print self.mainhead
+        for par in self.headtext:
+            self.dumpGraf(par, 2)
+            print
+        for _,head,items in self.sections:
+            if not head.endswith(':'):
+                print >>sys.stderr, "adding : to %r"%head
+                head = head + ":"
+            print head
+            for _,grafs in items:
+                self.dumpGraf(grafs[0],4,6)
+                for par in grafs[1:]:
+                    print
+                    self.dumpGraf(par,6,6)
+            print
+        print
+
+CL = ChangeLog()
+parser = head_parser
+
+sys.stdin = open('ChangeLog', 'r')
+
+for line in sys.stdin:
+    line = line.rstrip()
+    tp = parser(line)
+
+    if tp == TP_SECHEAD:
+        parser = body_parser
+    elif tp == TP_END:
+        nextline = line
+        break
+
+    CL.addLine(tp,line)
+
+CL.lint()
+
+sys.stdout = open('ChangeLog.new', 'w')
+
+CL.dump()
+
+print nextline
+
+for line in sys.stdin:
+    sys.stdout.write(line)
+
+os.rename('ChangeLog.new', 'ChangeLog')
diff --git a/scripts/maint/redox.py b/scripts/maint/redox.py
new file mode 100755
index 0000000..550f846
--- /dev/null
+++ b/scripts/maint/redox.py
@@ -0,0 +1,228 @@
+#!/usr/bin/python
+#
+#  Copyright (c) 2008-2013, The Tor Project, Inc.
+#  See LICENSE for licensing information.
+#
+# Hi!
+# I'm redox.py, the Tor redocumentation tool!
+# I am a horrible hack!
+# I read the output of doxygen from stderr, and add missing DOCDOC comments
+#   to tell you where documentation should go!
+# To use me, edit the stuff below...
+#  ...and run 'make doxygen 2>doxygen.stderr' ...
+#  ...and run ./contrib/redox.py < doxygen.stderr !
+# I'll make a bunch of new files by adding missing DOCDOC comments to your
+#    source.  Those files will have names like ./src/common/util.c.newdoc.
+# You will want to look over the changes by hand before checking them in.
+#
+# So, here's your workflow:
+#
+# 0. Make sure you're running a bourne shell for the redirects below.
+# 1. make doxygen 1>doxygen.stdout 2>doxygen.stderr.
+# 2. grep Warning doxygen.stderr | grep -v 'is not documented' | less
+#      [This will tell you about all the bogus doxygen output you have]
+# 3. python ./contrib/redox.py <doxygen.stderr
+#      [This will make lots of .newdoc files with DOCDOC comments for
+#       whatever was missing documentation.]
+# 4. Look over those .newdoc files, and see which docdoc comments you
+#     want to merge into the main file.  If it's all good, just run
+#     "mv fname.c.newdoc fname.c".  Otherwise, you'll need to merge
+#     the parts you like by hand.
+
+# Which files should we ignore warning from?  Mostly, these are external
+# files that we've snarfed in from somebody else, whose C we do no intend
+# to document for them.
+SKIP_FILES = [ "OpenBSD_malloc_Linux.c",
+               "eventdns.c",
+               "eventdns.h",
+               "strlcat.c",
+               "strlcpy.c",
+               "sha256.c",
+               "sha256.h",
+               "aes.c",
+               "aes.h" ]
+
+# What names of things never need javadoc
+SKIP_NAME_PATTERNS = [ r'^.*_c_id$',
+                       r'^.*_H_ID$' ]
+
+# Which types of things should get DOCDOC comments added if they are
+# missing documentation?  Recognized types are in KINDS below.
+ADD_DOCDOCS_TO_TYPES = [ 'function', 'type', 'typedef' ]
+ADD_DOCDOCS_TO_TYPES += [ 'variable', ]
+
+# ====================
+# The rest of this should not need hacking.
+
+import re
+import sys
+
+KINDS = [ "type", "field", "typedef", "define", "function", "variable",
+          "enumeration" ]
+
+NODOC_LINE_RE = re.compile(r'^([^:]+):(\d+): (\w+): (.*) is not documented\.$')
+
+THING_RE = re.compile(r'^Member ([a-zA-Z0-9_]+).*\((typedef|define|function|variable|enumeration|macro definition)\) of (file|class) ')
+
+SKIP_NAMES = [re.compile(s) for s in SKIP_NAME_PATTERNS]
+
+def parsething(thing):
+    """I figure out what 'foobar baz in quux quum is not documented' means,
+       and return: the name of the foobar, and the kind of the foobar.
+    """
+    if thing.startswith("Compound "):
+        tp, name = "type", thing.split()[1]
+    else:
+        m = THING_RE.match(thing)
+        if not m:
+            print thing, "???? Format didn't match."
+            return None, None
+        else:
+            name, tp, parent = m.groups()
+            if parent == 'class':
+                if tp == 'variable' or tp == 'function':
+                    tp = 'field'
+
+    return name, tp
+
+def read():
+    """I snarf doxygen stderr from stdin, and parse all the "foo has no
+       documentation messages.  I return a map from filename to lists
+       of tuples of (alleged line number, name of thing, kind of thing)
+    """
+    errs = {}
+    for line in sys.stdin:
+        m = NODOC_LINE_RE.match(line)
+        if m:
+            file, line, tp, thing = m.groups()
+            assert tp.lower() == 'warning'
+            name, kind = parsething(thing)
+            errs.setdefault(file, []).append((int(line), name, kind))
+
+    return errs
+
+def findline(lines, lineno, ident):
+    """Given a list of all the lines in the file (adjusted so 1-indexing works),
+       a line number that ident is alledgedly on, and ident, I figure out
+       the line where ident was really declared."""
+    lno = lineno
+    for lineno in xrange(lineno, 0, -1):
+        try:
+            if ident in lines[lineno]:
+                return lineno
+        except IndexError:
+            continue
+
+    return None
+
+FUNC_PAT = re.compile(r"^[A-Za-z0-9_]+\(")
+
+def hascomment(lines, lineno, kind):
+    """I return true if it looks like there's already a good comment about
+       the thing on lineno of lines of type kind. """
+    if "*/" in lines[lineno-1]:
+        return True
+    if kind == 'function' and FUNC_PAT.match(lines[lineno]):
+        if "*/" in lines[lineno-2]:
+            return True
+    return False
+
+def hasdocdoc(lines, lineno, kind):
+    """I return true if it looks like there's already a docdoc comment about
+       the thing on lineno of lines of type kind."""
+    try:
+        if "DOCDOC" in lines[lineno]:
+            return True
+    except IndexError:
+        pass
+    try:
+        if "DOCDOC" in lines[lineno-1]:
+            return True
+    except IndexError:
+        pass
+    if kind == 'function' and FUNC_PAT.match(lines[lineno]):
+        if "DOCDOC" in lines[lineno-2]:
+            return True
+    return False
+
+def checkf(fn, errs):
+    """I go through the output of read() for a single file, and build a list
+       of tuples of things that want DOCDOC comments.  Each tuple has:
+       the line number where the comment goes; the kind of thing; its name.
+    """
+    for skip in SKIP_FILES:
+        if fn.endswith(skip):
+            print "Skipping",fn
+            return
+
+    comments = []
+    lines = [ None ]
+    try:
+        lines.extend( open(fn, 'r').readlines() )
+    except IOError:
+        return
+
+    for line, name, kind in errs:
+        if any(pat.match(name) for pat in SKIP_NAMES):
+            continue
+
+        if kind not in ADD_DOCDOCS_TO_TYPES:
+            continue
+
+        ln = findline(lines, line, name)
+        if ln == None:
+            print "Couldn't find the definition of %s allegedly on %s of %s"%(
+                name, line, fn)
+        else:
+            if hasdocdoc(lines, line, kind):
+#                print "Has a DOCDOC"
+#                print fn, line, name, kind
+#                print "\t",lines[line-2],
+#                print "\t",lines[line-1],
+#                print "\t",lines[line],
+#                print "-------"
+                pass
+            else:
+                if kind == 'function' and FUNC_PAT.match(lines[ln]):
+                    ln = ln - 1
+
+                comments.append((ln, kind, name))
+
+    return comments
+
+def applyComments(fn, entries):
+    """I apply lots of comments to the file in fn, making a new .newdoc file.
+    """
+    N = 0
+
+    lines = [ None ]
+    try:
+        lines.extend( open(fn, 'r').readlines() )
+    except IOError:
+        return
+
+    # Process the comments in reverse order by line number, so that
+    # the line numbers for the ones we haven't added yet remain valid
+    # until we add them.  Standard trick.
+    entries.sort()
+    entries.reverse()
+
+    for ln, kind, name in entries:
+
+        lines.insert(ln, "/* DOCDOC %s */\n"%name)
+        N += 1
+
+    outf = open(fn+".newdoc", 'w')
+    for line in lines[1:]:
+        outf.write(line)
+    outf.close()
+
+    print "Added %s DOCDOCs to %s" %(N, fn)
+
+e = read()
+
+for fn, errs in e.iteritems():
+    print `(fn, errs)`
+    comments = checkf(fn, errs)
+    if comments:
+        applyComments(fn, comments)
diff --git a/scripts/maint/updateVersions.pl b/scripts/maint/updateVersions.pl
new file mode 100755
index 0000000..9dae1ff
--- /dev/null
+++ b/scripts/maint/updateVersions.pl
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+
+$CONFIGURE_IN = './configure.ac';
+$ORCONFIG_H = './src/win32/orconfig.h';
+$TOR_NSI = './contrib/tor-mingw.nsi.in';
+
+$quiet = 1;
+
+sub demand {
+    my $fn = shift;
+    die "Missing file $fn" unless (-f $fn);
+}
+
+demand($CONFIGURE_IN);
+demand($ORCONFIG_H);
+demand($TOR_NSI);
+
+# extract version from configure.ac
+
+open(F, $CONFIGURE_IN) or die "$!";
+$version = undef;
+while (<F>) {
+    if (/AC_INIT\(\[tor\],\s*\[([^\]]*)\]\)/) {
+	$version = $1;
+	last;
+    }
+}
+die "No version found" unless $version;
+print "Tor version is $version\n" unless $quiet;
+close F;
+
+sub correctversion {
+    my ($fn, $defchar) = @_;
+    undef $/;
+    open(F, $fn) or die "$!";
+    my $s = <F>;
+    close F;
+    if ($s =~ /^$defchar(?:)define\s+VERSION\s+\"([^\"]+)\"/m) {
+	$oldver = $1;
+	if ($oldver ne $version) {
+	    print "Version mismatch in $fn: It thinks that the version is $oldver.  I think it's $version.  Fixing.\n";
+	    $line = $defchar . "define VERSION \"$version\"";
+	    open(F, ">$fn.bak");
+	    print F $s;
+	    close F;
+	    $s =~ s/^$defchar(?:)define\s+VERSION.*?$/$line/m;
+	    open(F, ">$fn");
+	    print F $s;
+	    close F;
+	} else {
+	    print "$fn has the correct version. Good.\n" unless $quiet;
+	}
+    } else {
+	print "Didn't find a version line in $fn -- uh oh.\n";
+    }
+}
+
+correctversion($TOR_NSI, "!");
+correctversion($ORCONFIG_H, "#");
diff --git a/scripts/test/cov-blame b/scripts/test/cov-blame
new file mode 100755
index 0000000..601f211
--- /dev/null
+++ b/scripts/test/cov-blame
@@ -0,0 +1,48 @@
+#!/usr/bin/python
+
+import os
+import re
+import subprocess
+import sys
+
+def handle_file(source_fname, cov_fname):
+   
+   lines_blm = subprocess.Popen(["git", "blame", source_fname], stdout=subprocess.PIPE).stdout.readlines()
+   lines_cov = open(cov_fname).readlines()
+
+   # XXXX expensive!
+   while re.match(r'\s*-:\s*0:', lines_cov[0]):
+      del lines_cov[0]
+
+   if len(lines_blm) != len(lines_cov):
+      print >>sys.stderr, "MISMATCH IN NUMBER OF LINES in",source_fname
+
+   for b,c in zip(lines_blm, lines_cov):
+      m = re.match(r'\s*([^\s:]+):', c)
+      if not m:
+         print >>sys.stderr, "CONFUSING LINE %r"% c
+         cov = 'X'
+      elif m.group(1) == '-':
+         cov = '-'
+      elif m.group(1)[0] == '#':
+         cov = '#'
+      elif m.group(1)[0].isdigit():
+         cov = '1'
+      else:
+         print >>sys.stderr, "CONFUSING LINE %r"% c
+         cov = 'X'
+
+      print cov, b,
+
+COV_DIR = sys.argv[1]
+SOURCES = sys.argv[2:]
+
+for fn in SOURCES:
+   _, base = os.path.split(fn)
+   cfn = os.path.join(COV_DIR, base)
+   cfn += ".gcov"
+   if os.path.exists(cfn):
+      handle_file(fn, cfn)
+   else:
+      print >>sys.stderr, "NO FILE EXISTS CALLED ",cfn
+
diff --git a/scripts/test/cov-diff b/scripts/test/cov-diff
new file mode 100755
index 0000000..33a5480
--- /dev/null
+++ b/scripts/test/cov-diff
@@ -0,0 +1,17 @@
+#!/bin/sh
+# Copyright 2013  The Tor Project, Inc.
+# See LICENSE for licensing information.
+
+# cov-diff -- compare two directories full of gcov files.
+
+DIRA="$1"
+DIRB="$2"
+
+for A in $DIRA/*; do
+  B=$DIRB/`basename $A`
+  perl -pe 's/^\s*\d+:/        1:/; s/^([^:]+:)[\d\s]+:/$1/;' "$A" > "$A.tmp"
+  perl -pe 's/^\s*\d+:/        1:/; s/^([^:]+:)[\d\s]+:/$1/;' "$B" > "$B.tmp"
+  diff -u "$A.tmp" "$B.tmp"
+  rm "$A.tmp" "$B.tmp"
+done
+
diff --git a/scripts/test/coverage b/scripts/test/coverage
new file mode 100755
index 0000000..f4ae475
--- /dev/null
+++ b/scripts/test/coverage
@@ -0,0 +1,46 @@
+#!/bin/sh
+# Copyright 2013  The Tor Project, Inc.
+# See LICENSE for licensing information.
+
+# coverage -- run gcov on the appropriate set of object files to extract
+# coverage information.
+
+dst=$1
+
+for fn in src/or/*.c src/common/*.c; do
+    BN=`basename $fn`
+    DN=`dirname $fn`
+    F=`echo $BN | sed -e 's/\.c$//;'`
+    GC="${BN}.gcov"
+    # Figure out the object file names
+    ONS=`echo ${DN}/src_*-${F}.o`
+    ONS_WILDCARD_LITERAL="${DN}/src_*-${F}.o"
+    # If the wildcard didn't expand, no files
+    if [ "$ONS" != "${ONS_WILDCARD_LITERAL}" ]
+    then
+      for on in $ONS; do
+        # We should have a gcno file
+        GCNO=`echo $on | sed -e 's/\.o$/\.gcno/;'`
+        if [ -e $GCNO ]
+        then
+          # No need to test for gcda, since gcov assumes no execution
+          # if it's absent
+          rm -f $GC
+          gcov -o $on $fn
+          if [ -e $GC ]
+          then
+            if [ -n $dst ]
+            then
+              mv $GC $dst/$GC
+            fi
+          else
+            echo "gcov -o $on $fn didn't make a .gcov file"
+          fi
+        else
+          echo "Couldn't find gcno file for $on"
+        fi
+      done
+    else
+      echo "No object file found matching source file $fn"
+    fi
+done
diff --git a/scripts/test/scan-build.sh b/scripts/test/scan-build.sh
new file mode 100644
index 0000000..623b227
--- /dev/null
+++ b/scripts/test/scan-build.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+# Copyright 2014 The Tor Project, Inc
+# See LICENSE for licensing information
+#
+# This script is used for running a bunch of clang scan-build checkers
+# on Tor.  
+#
+# It has hardwired paths for Nick's desktop at the moment.
+
+CHECKERS="\
+    --use-analyzer=/opt/clang-3.4/bin/clang \
+    -disable-checker deadcode.DeadStores \
+    -enable-checker alpha.core.CastSize \
+    -enable-checker alpha.core.CastToStruct \
+    -enable-checker alpha.core.IdenticalExpr \
+    -enable-checker alpha.core.SizeofPtr \
+    -enable-checker alpha.security.ArrayBoundV2 \
+    -enable-checker alpha.security.MallocOverflow \
+    -enable-checker alpha.security.ReturnPtrRange \
+    -enable-checker alpha.unix.SimpleStream
+    -enable-checker alpha.unix.cstring.BufferOverlap \
+    -enable-checker alpha.unix.cstring.NotNullTerminated \
+    -enable-checker alpha.unix.cstring.OutOfBounds \
+    -enable-checker alpha.core.FixedAddr \
+    -enable-checker security.insecureAPI.strcpy
+"
+
+/opt/clang-3.4/bin/scan-build/scan-build \
+    $CHECKERS \
+    --use-analyzer=/opt/clang-3.4/bin/clang \
+    ./configure
+
+/opt/clang-3.4/bin/scan-build/scan-build \
+    $CHECKERS \
+    --use-analyzer=/opt/clang-3.4/bin/clang \
+    make -j2
+
+
+# Haven't tried this yet.
+#    -enable-checker alpha.unix.PthreadLock
+
+# This one gives a false positive on every strcmp.
+#    -enable-checker alpha.core.PointerSub
+
+# This one hates it when we stick a nonzero const in a pointer.
+#    -enable-checker alpha.core.FixedAddr
+
+# This one crashes sometimes for me.
+#    -enable-checker alpha.deadcode.IdempotentOperations






More information about the tor-commits mailing list