P2PResearch

whats happening in the peersphere

Unworkable: A Free BitTorrent Implementation

Unworkable is a BSD-licensed BitTorrent implementation written by Niall O'Higgins <niallo@p2presearch.com>.
Goals of this project include efficiency, simplicity and high code quality.

Unworkable is single threaded and asynchronous, written in portable ANSI C using libevent and mmap() for performance.
Unworkable is developed primarily under OpenBSD, however it has been written with portability in mind and should compile and run out of the box on at least:

  • Various Linux flavours:
    • Arch Linux
    • Centos 5
    • Fedora 7 (Amazon EC 2)
    • Gentoo Linux
    • Ubuntu Linux 7.10 and up
    • Mandriva Linux 2008.1
  • FreeBSD 6.2
  • Mac OS X (both PPC and i386)
  • Solaris 10
  • Windows XP (cygwin)

I go out of my way to use slower, harsher platforms for development (e.g. old sparc64, g3 macppc, arm zaurus) to weed out endianness and pointer issues, and of course to get a feel for performance problems. This approach has led to quite reasonable CPU and memory requirements. Transferring at around 150KB/sec used 5% CPU and 1.4M memory on a 270Mhz UltraSparc II machine. Given that contemporary machines are roughly an order of magnitude faster than this, performance should be within acceptable bounds.

Screen shots

Windows XP via Cygwin: Unworkable on Windows XP

Large photo of unworkable running on a Sharp Zaurus PDA.

Latest updates

2008-10-01: Unworkable 0.51 [Google Code mirror] released.

2008-09-21: Unworkable 0.5 [Google Code mirror] released.

2008-01-07: Unworkable 0.4 released.

2007-12-20: Unworkable 0.3 released.

2007-12-05: Unworkable 0.2 released.

Features

Unworkable can download all the torrents I've thrown at it. However, there is still plenty of room for improvement. Patches are welcome.

In particular, unworkable currently lacks support for the following:

  • Encryption.
  • Trackerless (DHT) operation.
  • Multiple trackers.

Binary packages

Arch Linux
CVS build contributed by Tom K. Thanks Tom!

OpenBSD
As of this commit on 2007-11-26, Unworkable is available in the OpenBSD ports repository as 'net/unworkable'. Starting with the next packages snapshot, users should simply be able to type 'pkg_add unworkable' on their OpenBSD system and have Unworkable installed.

Other Platforms
I have not gotten around to making binary packages for any other platforms yet. Contributions welcome.

Building

Unworkable will build cleanly on OpenBSD (tested on i386, amd64, zaurus, sparc64, macppc) without any additional dependencies beyond the base install. Simply type 'make'.

On other platforms, you must use the SCons build tool. After installing scons, type 'scons' to compile. Make sure you have libevent, OpenSSL and some YACC implementation (e.g. BSD yacc(1) or GNU bison) installed. If you get it working on other platforms, please let me know and send along any portability diffs.

Usage

Unworkable is supposed to be simple to use.

$ ./unworkable mymusic.torrent
mymusic.torrent                          hash ok:  35% rx: 9538KB 103.0KB/s   02:38 ETA
A manual page is included in the source, and built by default under OpenBSD.

Getting the Source

The code is hosted here on Google Code. To get an anonymous checkout of Subversion trunk run this command:

svn checkout http://unworkable.googlecode.com/svn/trunk/ unworkable-read-only

A tarball of version 0.51 is available at http://p2presearch.com/unworkable/dist/unworkable-0.51.tar.gz [Google Code mirror].

$Id: index.shtml,v 1.14 2009/05/05 20:59:42 niallo Exp $