About Documentation Get BusyBox Development


Developer Pages

  • The Software Freedom Conservancy acts as the GPL enforcement agent for various BusyBox copyright holders. If you wish to report a GPL violation on BusyBox, please write to gpl@busybox.net.

  • I want to thank the following companies which are providing support for the BusyBox project:

  • 20 January 2014 -- BusyBox 1.22.1 (stable)

    BusyBox 1.22.1. (git, patches, how to add a patch)

    Bug fix release. 1.22.1 has fixes for find (was requiring the path argument in some cases, unlike GNU find), grep (fixes for -w handling), ntpd (wasn't slewing time after large negative step), compile fixes for some configurations.

  • 1 January 2014 -- BusyBox 1.22.0 (unstable)

    BusyBox 1.22.0. (git, patches, how to add a patch)

    Sizes of busybox-1.21.1 and busybox-1.22.0 (with equivalent config, static uclibc build):

       text    data     bss     dec     hex filename
     891522     497    7584  899603   dba13 busybox-1.21.1
     893754     497    7568  901819   dc2bb busybox-1.22.0

    Changes since previous release:

    Aaro Koskinen (9):
          fdisk_sun: fix corrupted partition data with blank disk
          fdisk_sun: fix partition alignment
          sendmail: avoid sending mail to wrong addresses
          sendmail: don't mangle e-mail headers
          sendmail: support addresses inside angle brackets
          sendmail: support address lists
          sendmail: support long header fields for recipients
          sendmail: don't add To: header if it already exists
          sendmail: don't add multiple To: headers
    Alexander Shiyan (2):
          nanddump: fix build if nandwrite isn't enabled
          flash_eraseall: implement -N
    Bartosz Golaszewski (6):
          grep: don't bail out on first mismatch if '-w' option is set
          networking: code shrink
          date: accept 'yyyy-mm-dd HH' and 'yyyy-mm-dd' date formats
          Refactor catv. Move visible() from stty to libbb.
          tail compat: fix header printing for tail -f
          bloat-o-meter: add usage info
    Bernhard Reutner-Fischer (11):
          awk: Fix handling of functions with empty body
          setserial: Fix typo: s/baund_rate/baud_rate/g
          chrt: remove warning for _POSIX_PRIORITY_SCHEDULING
          buildsys: Add helper to list suid applets
          awk: Fix handling of functions with empty body
          swaponoff: shrink
          ash: Use setvar2 some more
          ash: Set SHLVL in ASH_BASH_COMPAT
          fstrim: -17b
          fstrim: Indicate failure on error
          fstrim: Needs to fire at the mp, not bd
    Bernhard Walle:
          pgrep: fix -x option
    Bogdan Purcareata:
          init: halt on SIGPWR too
    Cristian Ionescu-Idbohrn:
          foo*sum: Correct syntax error
    Cédric Cabessa:
          syslogd: use _PATH_LOG when available
    Daniel Borca (4):
          platform: strchrnul is missing if __APPLE__
          dpkg-deb: cosmetic correction to usage text
          ping: try SOCK_DGRAM if no root privileges
          build system: fix make gconfig
    David A. Wheeler (2):
          sed: accept -E as a synonym for -r
          sed: accept s///i as a synonym for s///I ("ignore case")
    Denys Vlasenko:
          Call setlocale("") , not "C", if we want to set the default one
          Commonalize typical [b,]k,m suffix struct
          Make smart_ulltoa return pointer to end (allows for code shink in callers)
          Makefile.custom: make "make release" delete .gitignore files too
          Move create_icmp[6]_socket to its only user, and simplify it
          Use unsigned printf/scanf conversion where more appropriate
          adduser: check whether run with no USERNAME. Closes 6728
          ash: add comment about failures in source builtin. No code changes.
          awk: fix a bug in argc counting in recent change
          awk: fix length(array)
          awk: use "long long" as integer type, not "int"
          bootchartd: warn if .config looks wrong
          build system: use od -b instead of od -t x1
          bunzip2: fix off-by-one check
          chpst: fix a bug where -U USER was using wrong USER (one from -u USER)
          cryptpw: do not segfault on EOF. Closes 6350
          dd: do not reuse local variables for unrelated values.
          dd: fail if swab is attempted on odd-sized block
          dd: fix example in a comment. No code changes.
          dd: support conv=swab
          decompress_unlzma: 10% speedup in "small" code
          decompress_unlzma: make "fast" version a bit smaller
          decompress_unlzma: move function, no code changes
          devfsd: remove static variable
          ether-wake: shorten help text, reduce packet buffer size
          find: support -HLP
          find: get rid of nested function (it's a gcc-ism)
          fix assorted unused code and wrong format specs found by cppcheck (bug 6716)
          fix build error with musl libc due to if_slip.h
          fix error message on failure to open /dev/null; fix zcat's help text
          flashcp: pad output to BUFSIZE. Hopefully closes 5882
          foo*sum: report I/O errors, don't merely exit with 1.
          head,tail: use common suffix struct. simplify help text.
          head: support -n -NUM and -c -NUM
          hexdump: don't unconditionally limit the usable address range
          hexdump: need to use xstrtoull for off_t
          hostid: do not output sign-extended host id. Closes 6056
          httpd: don't allow tabs and multiple spaces in request string
          httpd: make sure pfd[TO_CGI].revents is cleared before poll()
          httpd: treat errors from stdin correctly.
          hush: fix build failure if FEATURE_EDITING=y && !HUSH_INTERACTIVE
          hush: fix for "while false && true; do echo BUG; break; done". closes 6170
          hush: source builtin should override $N only if it has args
          hush: typo fixes in comments
          ifplugd: make -k send SIGINT, not SIGQUIT
          ifupdown: support "source" stanza in /etc/network/interfaces
          init: don't use fixed size buffer for command
          init: remove special-case code for machines with less tham 1 MB of RAM.
          iplink: comment out include <net/if_packet.h>
          iplink: fix build error (IFLA_VLAN_PROTOCOL defined before include)
          less: support "less 1<>TTY"
          libbb: introduce and use strftime_[YYYYMMDD]HHMMSS()
          lineedit: \W on "/bin" should show "bin", not "/bin"
          lineedit: add handling of \H in prompt
          lineedit: fix multi-line PS1 handling: calculate PS1 length from last \n
          lineedit: implement \T \t \A \@ prompts escapes, fix \W escape, drop \!
          lineedit: improve Unicode handling (still buggy though)
          lineedit: use unicode_strwidth instead of unicode_strlen
          loadkmap: explain what happens with K_ALLOCATED key value
          logread: don't call shmdt() before exit, kernel does it for us.
          logread: flush output. closes 6710
          logread: intercept all fatal signals, not just SIGINT
          losetup: assorted fixes. Closes 6314
          lzop: fiq -q and OPTION_DECOMPRESS mismatch
          make --help return exitcode 0. Closes 5612
          man: install to /usr/bin, not /sbin
          md5/sha512: a better fix for strict aliasing warnings
          mdev: add environment variable match
          mdev: call index_in_strings on $ACTION only after we checked it for NULL
          mdev: chdir back to /dev after trying to read firmware
          mdev: extend debug logging output
          mdev: improve $SEQ handling; improve debug logging
          mkfs_minix: use get_volume_size_in_bytes instead of local version
          nc: don't redirect stderr to network in -e PROG mode
          nc: exit when both stdin and network are closed.
          nc: fix build failure ("subscripted value is neither array nor pointer")
          nc: remove some dead code
          nc: remove unnecessary "errno = 0"
          nc: use symbolic SHUT_WR instead of literal 1
          nc_bloaty: support -ll and -lk. Closes 2245
          nslookup: set default DNS server again. Hopefully helps with 675
          ntpd: do not invalidate datapoints after step
          ntpd: drop delay outliers; run "unsync" handler if no replies for some time
          ntpd: let user know if spike was detected
          ntpd: make "unsync" code actually work.
          ntpd: promote log level 3 to production
          ntpd: set G.last_script_run even if script isn't configured
          ntpd: set offset to 0.0 in "usync" event
          ntpd: speed up resyncing if our clock is seriously off
          ping[6]: accept and ignore -n. Code shrink
          ps: fix sscanf format specifier (%l); make uptime unsigned
          ps: seconds_since_boot: uint64_t -> ulong
          pstree: fix theoretically unsafe code
          rfkill: use new-style config/kbuild/applet
          rpm: make -ql display more compatible; improve help text
          rpm: stop using statics; move main() to the end of the source file
          rpm: unmap rpm file before working with next one
          rpm: use "create+rename" method of replacing existing files
          run-parts: stop providing incompatible short options
          sed: document where we are more liberal then GNU
          sed: fix "sed clusternewline" testcase
          sed: fix matching of newlines by $
          sed: fix memory leak in 'r FILE' command
          sed: open input files sequentially to avoid EMFILE
          sed: remove now-redundant backslash-newline handling
          stty: disable CIBAUD leak check - it is not necessary on Linux
          sulogin: use common password-checking routine
          tail: track file size only in -f mode
          tar: add a testcase for previous commit
          tar: fix exitcode check for MMU-spawned unpacking helpers
          tar: prevent empty file to be treated as valid tarball
          testsuite: fix false positives for du
          touch: add conditional support for -h
          ubi_tools: add forgotten argv++
          ubi_tools: enhance -s option to allow size multiplier to match mtd-utils
          ubi_tools: extend supported volume size to 64 bits; shrink code
          udhcpc6: fix port numbers used if !FEATURE_UDHCP_PORT
          udhcpc: allow zero server-id. Closes 6614.
          udhcpc: fix a problem with binary-encoded options #2
          udhcpd: add -I LOCAL_ADDR option
          unicode: check $LC_ALL to detect Unicode mode, not only $LANG
          unicode: check $LC_CTYPE too to detect Unicode mode
          unpackers: by users' request, print compression percentage if -v and DESKTOP
          unzip: increase PEEK_FROM_END from 16k to 64k
          unzip: survive lack of CDF on non-streaming zip files
          vasprintf: do not use xmalloc, it will deadlock on OOM
          vasprintf: return -1 on strdup failure
          vi: make regexp search case-insensitive if ":set ignorecase" is active
          volume_id_internal.h: drop unoptimized byteswap routines
          wall: access FILE under real user's credentials
          wget: do not abort if "_" is encountered in a HTTP header
          zcat: fix "zcat FILE" trying to do detection twice
          zcat: if seamless uncompressors are defined, autodetect file's format
    Flemming Madsen:
          ash,hush: history builtin
    Guilherme Maciel Ferreira (2):
          traceroute: free some memory allocated by xzalloc()
          wget: if FEATURE_CLEAN_UP, free(ptr_to_globals)
    James Hogan:
          grep: fix grep -x to not set REG_NOSUB
    Jeremy Kerr:
          udhcp: add PXELINUX config file option (code 209) definition
    Jody Bruchon:
          fdisk: fix GPT size math errors
    Johannes Stezenbach:
          udhcpc: make DHCP packets to have at least 300 DHCP bytes
    John Spencer:
          man: find posix man pages
    Jonathan Liu:
          sulogin: allow system maintenance login if root password is empty
    Kang Kai:
          testsuite/du/du-k-works: fix false positive
    Kuleshov Aleksey:
          arp: fix -H/-t handling.
    Lasse Collin (11):
          xz: omit explicit \0 from HEADER_MAGIC
          xz: update README
          xz: avoid "NOTE:" in xz.h
          xz: add a comment about using uint32_t as vli_type
          xz: make bcj_x86_test_msbyte() an inline function
          xz: remove an empty line from xz_dec_lzma2.c
          xz: add C++ support to xz.h
          xz: fix decoding of LZMA2 streams having no uncompressed data.
          xz: fix incorrect XZ_BUF_ERROR
          xz: mention xzminidec.c in README
          xz: support concatenated .xz streams
    Lauri Kasanen (2):
          wget: add support for connect timeout
          wget: user-friendly fallback to http
    Leonid Lisovskiy:
          xz: fix put_unaligned_{l,b}e32
    Malek Degachi:
          fstrim: New applet
    Mandeep Singh Baines:
          losetup: fix util-linux compatibility
    Michael Tokarev (4):
          fix bashisms in testsuite/
          expand: use printable_string instead of hard-coding implementation
          do not fail build if MAXSYMLINKS isn't defined
          hostname: do not use gethostbyname() for "hostname -s"
    Mike Frysinger (12):
          udhcpc: support resolv.conf symlinks
          udhcpc: tweak math shell style with the metric var
          bbunzip: ignore the -q flag with the decompressors
          bbunzip: fix order of flags vs bit defines
          archival: note implicit dependencies between lzop & bbunzip
          udhcpc: use readlink rather than realpath
          platform: use KERNEL_VERSION to simplify uClibc version checking
          readlink: uClibc supports automatic allocation too now
          readlink: note that our -f is really -e
          pstree: stop truncating thread names
          md5/sha512: fix strict aliasing warnings
          trylink: only prefix libs with -l
    Nicolas Dichtel:
          networking: fix potential overflow in ife_print6()
    Nikolaus Voss:
          mdev: use $DEVNAME in uevent sysfs file for device node name
    Oliver Metz:
          volume_id: fix ntfs attribute search
    Patrick McHardy:
          ip link: add VLAN support
    Paul B. Henson (2):
          ubimkvol: add -m option to create volume of maximum size
          ubi_tools: fix typo in strcpy
    Paulius Zaleckas:
          init: don't srop unterminated processes' entries during inittab reload
    Peter Korsgaard (3):
          run-parts: add --exit-on-error | -e support
          run-parts: fix unicode creep in --help
          ar: read_num(): fix reading fields using the entire width
    Rich Felker:
          *: change execl sentinels from NULL to (char*)0
    Ron Yorston:
          vi: fix adjustment of buffer on partial file read
    Ryan Mallon (2):
          libbb: Add xsetegid(), xseteuid(), xopen_as_uid_gid() functions
          wall,crontab: use xopen_as_uid_gid()
    SASAKI Suguru:
          tar: fix tar -T to add entries in the exact order as the input list
    Shawn J. Goff:
          lineedit: initialize delptr
    Stefan Hellermann (2):
          ash: move code to allow setting $HOME in /etc/profile
          ash: read $HOME/.profile instead of $(pwd)/.profile
    Sven-Göran Bergh (5):
          volume_id: Adopt to new kbuild style.
          volume_id: Adopt to new config style.
          volume_id: nilfs config description.
          volume_id: add f2fs detection
          awk: optionally support -e AWK_PROG
    Thomas De Schampheleire (2):
          nameif: fix use-after-free in ENABLE_FEATURE_CLEAN_UP code
          lsof: correct check for symbolic link
    Thomas Petazzoni:
          libbb: use <poll.h> instead of <sys/poll.h>
    Tito Ragusa (2):
          ifplugd: use a larger netlink buffer
          swapon: support "pri=NNN" in fstab
    Uros Vampl:
          killall5: return 2 if no processes got killed
    Yuan-Hsiang Lee:
          init: fix illegal memory access when max message length is reached

  • 29 June 2013 -- BusyBox 1.21.1 (stable)

    BusyBox 1.21.1. (git, patches, how to add a patch)

    Bug fix release. 1.21.1 has fixes for ntfs detection (big-endian fix), xz decompression of concatenated streams, mdev acquired a [ENV=regex;] extension instead of undocumented subsystem match hack it used to have prior to 1.21.x.

  • 21 January 2013 -- BusyBox 1.21.0 (unstable)

    BusyBox 1.21.0. (git, patches, how to add a patch)

    Sizes of busybox-1.20.2 and busybox-1.21.0 (with equivalent config, static uclibc build):

       text    data     bss     dec     hex filename
     895377     497    7584  903458   dc922 busybox-1.20.2
     897317     497    7584  905398   dd0b6 busybox-1.21.0

    Changes since previous release:

    Alexey Froloff (1):
          udhcpc: gracefully handle packets with CHECKSUM_PARTIAL
    Andreas Oberritter (2):
          ifupdown: improve compatibility with Debian
          get_linux_version_code: don't fail on Linux version strings like "3.0-foo"
    Anthony G. Basile (2):
          build system: fix build failure when only gunzip is selected
          CONFIG_PID_FILE_PATH: new configuration option for pidfile paths
    Aurelien Jarno (1):
          *: declare strings with ALIGN1, as appropriate
    Baruch Siach (3):
          nanddump: use the right operator of logic AND
          nanddump: skip bad blocks when instructed to do so
          nanddump: invert the meaning of the -o parameter to match upstream
    Bernhard Reutner-Fischer (1):
          mount: fix -o user=foo mishandling, fix unc= generation, add prefixpath=
    Bernhard Walle (1):
          build system: fix build of kconfig on Darwin
    Boris Reisig (1):
          tar: support -J, --xz explicit compression option
    Bradley M. Kuhn (1):
          Simplify copyright/license notice that appears in the binary
    Christoph Lohmann (1):
          mdev: tell kernel that we didn't find the firmware
    Cliff Frey (1):
          lineedit: fix Alt-D when cursor==0
    Dennis Groenen (1):
          lineedit: histfile can get emptied when CONFIG_FEATURE_EDITING_SAVE_ON_EXIT=y
    Denys Vlasenko:
          build system: stop .eh_frame generation
          build system: fix build failure when compressed help is selected, but bz2 compression is not
          scripts/kconfig/mconf: work on systems w/o SIGWINCH
          platform.h: disable ALIGNn macros for s390[x]
          adduser: install to /usr, not /, like all other similar tools
          ash: fix "read -s" + ^C. Closes 5504
          ash: fix a bug in >${varexp} handling. Closes 5282
          ash: implement export -n
          ash: revert wrong "fix" for an apparent memory leak. Closes 5822
          awk: fix FS assignment behavior. Closes 5108
          awk: make -F STR interpret escape sequences. Closes 5126
          brctl: fix build failure by s/strtotimeval/bb_strtotimeval/ (android has strtotimeval)
          busybox: tweak help text and copyright year
          decompress_uncompress: comment out debug printout on corrupted data
          decompress_uncompress: move 'code' variable into loop - sole user
          dhcpd: write lease file on exit
          dpkg: fix creation of .list files (were empty since b768aeb). Closes 5324
          du: document incompatibility with standard tool
          examples/mdev_fat.conf: small addition
          find: if DESKTOP=y, support -wholename (synonym for -path)
          find: make -mindepth N -xdev correctly stop on mountpoints
          ftpd: fix MDTM's month value. Closes 5336
          ftpd: free allocated string on error path
          getty: fix for NOCTTY killing us with SIGHUP
          grep: fix grep -Fw not respecting the -w option. Closes 5792
          ifconfig: do not accept "ifconfig eth0 up" (ip with mask). Closes 5786
          libbb: correctness/size tweaks in signal-related helpers
          lineedit: in !EDITING config, return -1 on fgets error
          login: increase login name size limit from 32 to 64
          lpr: don't send 0-byte print jobs (compat)
          man: fix handling of gzipped manpages
          mdev: add support for $DEVNAME and /dev/mdev.log debug aid
          mdev: fix mode of dir1 in =dir1/dir2/file rule
          mdev: remove undocumented subsystem/devname matching hack
          mdev: when found, print major,minor into mdev.log
          modprobe_small: make rmmod to NOT remove dependencies. Closes 5162
          mount: do not pass "comment=ANYTHING" option to kernel. Closes 5240
          mount: fix the wrongly stored fs creation time
          mount: set up RO loop device if mount -o ro. Closes 4784
          mount: support strictatime option. Closes 5240
          ntpd: on time step, kill all outstanding replies from other peers
          sed: fix handling of s/// which has empty matches
          sed: fix zero chars match/replace
          sha3: make size/speed optimization decision configurable
          syslogd: do not segfault on parse error when using default config. Closes 5762
          telnet: convert CR -> CR LF, not CR -> CR NUL when sending data to server
          telnet: convert Enter -> CR LF in line mode too
          tftpd: fix -u USER to work with chroot. Closes 5348
          top/ps: argv0:"gdm-session-worker [pam/gdm-password]" == comm:"gdm-session-wor"
          top: do not touch stdin if -b
          top: fix "last CPU" parsing
          top: implement scrolling up/down (_very_ useful)
          udhcp[cd]: fix binding to network aliases. Closes 5432, 5438
          udhcpc: make -O <numeric_opt> work. Closes 5402
          udhcpc[6]: show select timeout in log
          unzip: make options parsing more robust on getopt w/o gnu extensions
          vi: do not set autoindent by default
          vi: save/restore screen upon invocation
          volume_id/ext: detect ext4 too
          wget: correctly handle failure to -c (continue)
          wget: make -c _not_ truncate the file
          wget: reorder fread and poll: poll only if fread returns EAGAIN. Closes 5426
          wget: try reading after poll timeout - stdio may have buffered data. Closes 5426
    Eric Martin (1):
          acpid: add missing lid switch definition
    Etienne Le Sueur (1):
          tar: fix 256-bit encoded number decoding
    Felix Fietkau (1):
          udhcpc[6]: allow discover_retries == 0 (infinite)
    Jon Tollefson (1):
          ash: fix a memory leak
    Joshua Kahlenberg (1):
          sysctl: implement -q
    Lauri Hintsala (1):
          powertop: fix error message
    Lauri Kasanen (1):
          sha3sum: new applet
    Linus Walleij (2):
          fbset: respect rgba configuration lines in fb.modes
          fbsplash: support non-RGB565 pixels in 16-bit mode
    Manuel Zerpies (1):
          flashcp: remove unused variable opts
    Martin Santesson (1):
          mount: add unc option to CIFS mount (needed for Linux 3.4+)
    Matt Reimer (1):
          nanddump: make dumping read-only partitions work
    Michael Tokarev (2):
          ps: use separate get_uptime() and make it work on non-linux too
          *: declare strings with ALIGN1, as appropriate
    Mike Frysinger (5):
          udhcpc6: depend on ipv6
          include sys/resource.h where needed
          disable format security warnings
          build system: use pkg-config to look up selinux libs
          ifenslave: fix missing close paren
    Mimi Li (1):
          sed: allow 'w' cmd to use two address form
    Natanael Copa (2):
          tar: implement --no-recursion
          unzip: ignore chmod errors
    Nicolas Thill (1):
          brctl: fix description and usage
    Pascal Bellard (1):
          su: do not change to home dir unless -l
    Paul Marks (1):
          ntpd: fix incorrect m_status field in outgoing packets. Closes 5120
    Peter Korsgaard (4):
          dmesg: handle multi-char log levels
          klogd: handle multi-char log levels
          syslogd: add option to log to Linux kernel printk buffer
          syslogd: convert dummy functions to statics and get rid of IF_FEATURE_* checks
    Pierre Carrier (1):
          config: do not refer to HTTPS for wget
    Ron Yorston (2):
          sendmail: use host rather than NIS domain name for HELO
          mktemp: fix mktemp -u temp.XXXXXX returning garbage when TMPDIR is set
    S-G Bergh (2):
          blkid: show filesystem when both label and UUID are missing, but type is known
          volume_id: add exFAT detection
    Simon B (4):
          ln: support -T and -v
          sed: support long opts and -iSFX
          mkdir,rmdir: accept and ignore -v, --verbose
          mv: accept but ignore -v
    Sven-Göran Bergh (6):
          blkid: add type display for btrfs
          blkid: add support for nilfs2
          blkid: add type display for hfsplus
          volume_id: display hfs[+] 128-bit UUID properly
          volume_id: uuid_format small code shrink
          volume_id: add squashfs detection
    Tanguy Pruvot (2):
          testsuite: some more awk tests related to conditions
          modinfo: match more standard module fields and fix version field
    Tias Guns (5):
          inetd: fix build failure in Android
          android: fix 'stat', ifdef S_TYPEIS* in coreutiles/stat.c
          platform.h: Android tweaks: ioprio defines, BB_ADDITIONAL_PATH
          android: some sensible defconfig changes
          libbb: add missing_syscalls.c: for now, only Android syscalls
    Timo Teräs (1):
          fbsplash: fix regression from e4fa7b7
    Tito Ragusa (1):
          adduser: make it accept "adduser USER GROUP" form
    Vladimir Dronnikov (1):
          wget: add dummy --no-cache
    Yao Zhao (1):
          testsuite: make mkfs.minix test not fail spuriously on big endian
    walter harms (1):
          refactor correct_password.c to avoid one if

  • 2 July 2012 -- BusyBox 1.20.2 (stable)

    BusyBox 1.20.2. (git, patches, how to add a patch)

    Bug fix release. 1.20.2 has fixes for ash (fix for variable expansion in redirection), ifup/down (fix for "pre-up" and "pre-down" handling), man (fixes for compressed man pages handling), mke2fs (important fix! due to misplaced s_mkfs_time field, ext4 driver couldn't mount our images), ps (fix for getting uptime on non-Linux platforms), tar (fix base-256 decoding).

  • Old News

    Click here to read older news

Copyright © 1999-2008 Erik Andersen
Mail all comments, insults, suggestions and bribes to
Denys Vlasenko vda.linux@googlemail.com
This site created with the vi editor This site is kindly hosted by OSL