List of the authors of code contained in BusyBox.

If you have code in BusyBox, you should be listed here.  If you should be
listed, or the description of what you have done needs more detail, or is
incorrect, _please_ let me know.

 -Erik

-----------

Peter Willis <psyphreak@phreaker.net>
    eject

Emanuele Aina <emanuele.aina@tiscali.it>
    run-parts

Erik Andersen <andersen@codepoet.org>
    Tons of new stuff, major rewrite of most of the
    core apps, tons of new apps as noted in header files.
    Lots of tedious effort writing these boring docs that
    nobody is going to actually read.

Laurence Anderson <l.d.anderson@warwick.ac.uk>
    rpm2cpio, unzip, get_header_cpio, read_gz interface, rpm

Jeff Angielski <jeff@theptrgroup.com>
    ftpput, ftpget

Enrik Berkhan <Enrik.Berkhan@inka.de>
    setconsole

Jim Bauer <jfbauer@nfr.com>
    modprobe shell dependency

Edward Betts <edward@debian.org>
    expr, hostid, logname, whoami

John Beppu <beppu@codepoet.org>
    du, nslookup, sort

David Brownell <dbrownell@users.sourceforge.net>
    zcip

Brian Candler <B.Candler@pobox.com>
    tiny-ls(ls)

Randolph Chung <tausq@debian.org>
    fbset, ping, hostname

Dave Cinege <dcinege@psychosis.com>
    more(v2), makedevs, dutmp, modularization, auto links file,
    various fixes, Linux Router Project maintenance

Jordan Crouse <jordan@cosmicpenguin.net>
    ipcalc

Magnus Damm <damm@opensource.se>
    tftp client
    insmod powerpc support

Larry Doolittle <ldoolitt@recycle.lbl.gov>
    pristine source directory compilation, lots of patches and fixes.

Glenn Engel <glenne@engel.org>
    httpd

Gennady Feldman <gfeldman@gena01.com>
    Sysklogd (single threaded syslogd, IPC Circular buffer support,
    logread), various fixes.

Robert Griebl <sandman@handhelds.org>
    modprobe, hwclock, suid/sgid handling, tinylogin integration
    many bugfixes and enhancements

Karl M. Hegbloom <karlheg@debian.org>
    cp_mv.c, the test suite, various fixes to utility.c, &c.

Daniel Jacobowitz <dan@debian.org>
    mktemp.c

Matt Kraai <kraai@alumni.cmu.edu>
    documentation, bugfixes, test suite

Rob Landley <rob@landley.net>
    sed (major rewrite in 2003, and I now maintain the thing).
    bunzip2 (complete from-scratch rewrite, then mjn3 optimized the result.)
    sort (more or less from scratch rewrite in 2004, I now maintain it).
    I've patched lots of other applets, but don't maintain 'em.

Stephan Linz <linz@li-pro.net>
    ipcalc, Red Hat equivalence

John Lombardo <john@deltanet.com>
    tr

Glenn McGrath <bug1@iinet.net.au>
    Common unarchiving code and unarchiving applets, ifupdown, ftpgetput,
    nameif, sed, patch, fold, install, uudecode.
    Various bugfixes, review and apply numerous patches.

Manuel Novoa III <mjn3@codepoet.org>
    cat, head, mkfifo, mknod, rmdir, sleep, tee, tty, uniq, usleep, wc, yes,
    mesg, vconfig, nice, renice,
    make_directory, parse_mode, dirname, mode_string,
    get_last_path_component, simplify_path, and a number trivial libbb routines

    also bug fixes, partial rewrites, and size optimizations in
    ash, basename, cal, cmp, cp, df, du, echo, env, ln, logname, md5sum, mkdir,
    mv, realpath, rm, sort, tail, touch, uname, watch, arith, human_readable,
    interface, dutmp, ifconfig, route

Vladimir Oleynik <dzo@simtreas.ru>
    cmdedit; bb_mkdep, xargs(current), httpd(current);
    ports: ash, crond, fdisk, inetd, stty, traceroute, top;
    locale, various fixes
    and irreconcilable critic of everything not perfect.

Bruce Perens <bruce@pixar.com>
    Original author of BusyBox in 1995, 1996. Some of his code can
    still be found hiding here and there...

Rodney Radford <rradford@mindspring.com>
    ipcs, ipcrm

Tim Riker <Tim@Rikers.org>
    bug fixes, member of fan club

Kent Robotti <robotti@metconnect.com>
    reset, tons and tons of bug reports and patches.

Chip Rosenthal <chip@unicom.com>, <crosenth@covad.com>
    wget - Contributed by permission of Covad Communications

Pavel Roskin <proski@gnu.org>
    Lots of bugs fixes and patches.

Gyepi Sam <gyepi@praxis-sw.com>
    Remote logging feature for syslogd

Rob Sullivan <cogito.ergo.cogito@gmail.com>
    comm

Linus Torvalds
    mkswap, fsck.minix, mkfs.minix

Mark Whitley <markw@codepoet.org>
    grep, sed, cut, xargs(previous),
    style-guide, new-applet-HOWTO, bug fixes, etc.

Charles P. Wright <cpwright@villagenet.com>
    gzip, mini-netcat(nc)

Enrique Zanardi <ezanardi@ull.es>
    tarcat (since removed), loadkmap, various fixes, Debian maintenance

Tito Ragusa <farmatito@tiscali.it>
    devfsd and size optimizations in strings, openvt, chvt, deallocvt, hdparm,
    fdformat, lsattr, chattr, id and eject.

Paul Fox <pgf@foxharp.boston.ma.us>
    vi editing mode for ash, various other patches/fixes
