summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--abs/core/audiofile/aclocal-fixes.patch11
l---------abs/core/coreutils/coreutils-8.5-2-i686.pkg.tar.gz1
-rw-r--r--abs/core/cpio/cpio-2.9-gcc43.patch31
-rw-r--r--abs/core/curl/ChangeLog69
-rw-r--r--abs/core/curl/m4-typo.patch13
-rw-r--r--abs/core/device-mapper/ChangeLog103
-rw-r--r--abs/core/device-mapper/PKGBUILD64
-rw-r--r--abs/core/device-mapper/lvm2_hook25
-rw-r--r--abs/core/device-mapper/lvm2_install30
-rw-r--r--abs/core/directfb/ChangeLog5
-rw-r--r--abs/core/directfb/dfb_serial.diff10
-rw-r--r--abs/core/faac/libmp4v2.patch11
-rw-r--r--abs/core/faac/pipe-output.patch18
-rw-r--r--abs/core/freetype2/bytecode.patch29
-rw-r--r--abs/core/freetype2/freetype-2.2.1-memcpy-fix.patch14
-rw-r--r--abs/core/freetype2/freetype-2.3.3-ftbitmap.patch25
-rw-r--r--abs/core/freetype2/freetype2.install23
-rw-r--r--abs/core/ftgl/ftgl-gcc411.patch12
-rw-r--r--abs/core/gawk/gawk-3.1.5-segfault_fix-1.patch43
-rw-r--r--abs/core/grep/01-fgrep.patch145
-rw-r--r--abs/core/grep/02-bracket.patch11
-rw-r--r--abs/core/grep/03-i18n.patch303
-rw-r--r--abs/core/grep/04-oi.patch48
-rw-r--r--abs/core/grep/05-manpage.patch19
-rw-r--r--abs/core/grep/06-color.patch10
-rw-r--r--abs/core/grep/07-icolor.patch36
-rw-r--r--abs/core/grep/08-skip.patch42
-rw-r--r--abs/core/grep/09-egf-speedup.patch823
-rw-r--r--abs/core/grep/10-dfa-optional.patch67
-rw-r--r--abs/core/grep/11-tests.patch138
-rw-r--r--abs/core/grep/12-w.patch121
-rw-r--r--abs/core/grep/13-P.patch14
-rw-r--r--abs/core/grep/14-mem-exhausted.patch15
-rw-r--r--abs/core/grep/15-empty-pattern.patch36
-rw-r--r--abs/core/grep/64-egf-speedup.patch791
-rw-r--r--abs/core/groff/man-utf8.tmac9
-rw-r--r--abs/core/gzip/gzip-fixpaths.patch37
-rw-r--r--abs/core/gzip/gzip-fixutimens.patch36
-rw-r--r--abs/core/gzip/gzip-security-update.patch186
-rw-r--r--abs/core/iproute2/iproute2-2.4.7-now-ss020116.patch9823
-rw-r--r--abs/core/iproute2/libdir.patch129
-rw-r--r--abs/core/iproute2/tc.patch26
-rw-r--r--abs/core/iptables/PKGBUILD.orig36
-rw-r--r--abs/core/libcap/libcap-1.10-debian.patch766
-rw-r--r--abs/core/libcap/libcap-1.10-fixcflags.patch22
-rw-r--r--abs/core/libcap/libcap-1.10-shared.patch17
-rw-r--r--abs/core/libpcap/libpcap-shared.patch51
-rw-r--r--abs/core/libpng/ChangeLog55
-rw-r--r--abs/core/libpng/libpng-1.2.29-apng.patch1671
-rw-r--r--abs/core/libpng/libpng-1.2.31-apng.patch1644
l---------abs/core/libtool/libtool-2.2.10-3-i686.pkg.tar.gz1
-rw-r--r--abs/core/libx86/lrmi.patch16
-rw-r--r--abs/core/linux-atm/linux-atm-2.5.0-glibc28.patch11
-rw-r--r--abs/core/mdadm/raid-partitions_hook21
-rw-r--r--abs/core/mdadm/raid-partitions_install32
-rw-r--r--abs/core/php/db-configure.patch51
-rw-r--r--abs/core/pm-utils/pm-utils.install15
-rw-r--r--abs/core/pm-utils/service.patch15
-rw-r--r--abs/core/projectm/projectm.install13
-rw-r--r--abs/core/shadow/shadow-4.0.18.2-useradd-fix-1.patch26
-rw-r--r--abs/core/shadow/shadow-UID_GID.patch34
-rw-r--r--abs/core/shadow/useradd6
-rw-r--r--abs/core/shadow/useradd-default.patch14
-rw-r--r--abs/core/sqlite3/build_fts_as_part_of_libsqlite.patch139
-rw-r--r--abs/core/sqlite3/sqlite-3.5.8-pkgconfig-version.patch12
-rw-r--r--abs/core/squashfs-tools/mksquashfs-fix-race.patch23
-rw-r--r--abs/core/sysvinit/halt-init.patch17
-rw-r--r--abs/core/udev/arch-udev-rules.patch50
-rw-r--r--abs/core/udev/logitech-rules.patch14
-rwxr-xr-xabs/core/udev/root-link.sh7
-rw-r--r--abs/extra/community/lua/lua-5.1.3-official-patch3.diff21
-rw-r--r--abs/extra/community/lua/lua-5.1.3-official-patch4.diff18
-rw-r--r--abs/extra/miro/ChangeLog34
-rw-r--r--abs/extra/miro/Changelog2
-rw-r--r--abs/extra/miro/Miro-xulrunner.patch64
-rw-r--r--abs/extra/miro/boost_1.36.0_fix.patch32
-rw-r--r--abs/extra/miro/miro-xine.patch12
-rw-r--r--abs/extra/miro/miro.exec.patch9
-rw-r--r--abs/extra/miro/miro_python26.patch16
-rw-r--r--abs/extra/miro/missing-headers.patch33
-rw-r--r--abs/extra/monitorix-linhes.tar.gzbin1970 -> 0 bytes
-rw-r--r--abs/extra/xine-lib/xine-header.patch11
-rw-r--r--abs/extra/xine-lib/xine-imagemagick.patch11
83 files changed, 0 insertions, 18444 deletions
diff --git a/abs/core/audiofile/aclocal-fixes.patch b/abs/core/audiofile/aclocal-fixes.patch
deleted file mode 100644
index ef4d258..0000000
--- a/abs/core/audiofile/aclocal-fixes.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- audiofile.m4.orig 2006-03-05 13:06:01.000000000 +0000
-+++ audiofile.m4 2006-03-05 13:06:17.000000000 +0000
-@@ -9,7 +9,7 @@
- dnl AM_PATH_AUDIOFILE([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
- dnl Test for Audio File Library, and define AUDIOFILE_CFLAGS and AUDIOFILE_LIBS.
- dnl
--AC_DEFUN(AM_PATH_AUDIOFILE,
-+AC_DEFUN([AM_PATH_AUDIOFILE],
- [dnl
- dnl Get compiler flags and libraries from the audiofile-config script.
- dnl
diff --git a/abs/core/coreutils/coreutils-8.5-2-i686.pkg.tar.gz b/abs/core/coreutils/coreutils-8.5-2-i686.pkg.tar.gz
deleted file mode 120000
index 3eef1a4..0000000
--- a/abs/core/coreutils/coreutils-8.5-2-i686.pkg.tar.gz
+++ /dev/null
@@ -1 +0,0 @@
-/data/pkg_repo/packages/coreutils-8.5-2-i686.pkg.tar.gz \ No newline at end of file
diff --git a/abs/core/cpio/cpio-2.9-gcc43.patch b/abs/core/cpio/cpio-2.9-gcc43.patch
deleted file mode 100644
index da9004a..0000000
--- a/abs/core/cpio/cpio-2.9-gcc43.patch
+++ /dev/null
@@ -1,31 +0,0 @@
---- tar-1.19/lib/argp-fmtstream.h.gcc43 2007-09-28 15:11:36.000000000 +0200
-+++ tar-1.19/lib/argp-fmtstream.h 2008-02-13 16:56:58.000000000 +0100
-@@ -198,7 +198,11 @@ extern int __argp_fmtstream_ensure (argp
- #endif
-
- #ifndef ARGP_FS_EI
--#define ARGP_FS_EI extern inline
-+# ifdef __GNUC_STDC_INLINE__
-+# define ARGP_FS_EI extern inline __attribute__((__gnu_inline__))
-+# else
-+# define ARGP_FS_EI extern inline
-+# endif
- #endif
-
- ARGP_FS_EI size_t
-diff -up tar-1.19/lib/argp.h.gcc43 tar-1.19/lib/argp.h
---- tar-1.19/lib/argp.h.gcc43 2007-09-28 15:11:36.000000000 +0200
-+++ tar-1.19/lib/argp.h 2008-02-13 16:55:36.000000000 +0100
-@@ -580,7 +580,11 @@ extern void *__argp_input (const struct
- # endif
-
- # ifndef ARGP_EI
--# define ARGP_EI extern __inline__
-+# if defined __GNUC_STDC_INLINE__
-+# define ARGP_EI extern __inline__ __attribute__((__gnu_inline__))
-+# else
-+# define ARGP_EI extern __inline__
-+# endif
- # endif
-
- ARGP_EI void
diff --git a/abs/core/curl/ChangeLog b/abs/core/curl/ChangeLog
deleted file mode 100644
index abcd7af..0000000
--- a/abs/core/curl/ChangeLog
+++ /dev/null
@@ -1,69 +0,0 @@
-2010-02-09 Eric Belanger <eric@archlinux.org>
-
- * curl 7.20.0-1
- * Upstream update
-
-2009-11-04 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.7-1
- * Upstream update
-
-2009-10-03 Robson Peixoto <robsonpeixoto@gmail.com>
-
- * curl 7.19.6-2
- * Compile with ca-path like Debian and Gentoo
-
-2009-08-12 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.6-1
- * Upstream update
-
-2009-05-18 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.5-1
- * Upstream update
-
-2009-03-03 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.4-1
- * Upstream update
-
-2009-01-21 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.3-1
- * Upstream update
-
-2008-11-14 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.2-1
- * Upstream update
-
-2008-11-08 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.1-1
- * Upstream update
-
-2008-09-20 Eric Belanger <eric@archlinux.org>
-
- * curl 7.19.0-1
- * Upstream update
-
-2008-06-04 Eric Belanger <eric@archlinux.org>
-
- * curl 7.18.2-1
- * Upstream update
- * Switched to the CA Root Certificates provided by the ca-certificates package (close FS#10569)
- * Removed bundled certificates
- * Removed perl-libwww makedepends
-
-2008-04-30 Eric Belanger <eric@archlinux.org>
-
- * curl 7.18.1-2
- * Added CA Root Certificates (close FS#10129)
- * Added perl-libwww makedepends
-
-2008-03-31 Eric Belanger <eric@archlinux.org>
-
- * curl 7.18.1-1
- * Upstream update
- * Added ChangeLog
diff --git a/abs/core/curl/m4-typo.patch b/abs/core/curl/m4-typo.patch
deleted file mode 100644
index 2e46dff..0000000
--- a/abs/core/curl/m4-typo.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/docs/libcurl/libcurl.m4 b/docs/libcurl/libcurl.m4
-index ce8e476..50dc20d 100644
---- a/docs/libcurl/libcurl.m4
-+++ b/docs/libcurl/libcurl.m4
-@@ -198,7 +198,7 @@ x=CURLOPT_VERBOSE;
-
- # We don't have --protocols, so just assume that all
- # protocols are available
-- _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP
-+ _libcurl_protocols="HTTP FTP FILE TELNET LDAP DICT TFTP"
-
- if test x$libcurl_feature_SSL = xyes ; then
- _libcurl_protocols="$_libcurl_protocols HTTPS"
diff --git a/abs/core/device-mapper/ChangeLog b/abs/core/device-mapper/ChangeLog
deleted file mode 100644
index 5809ab5..0000000
--- a/abs/core/device-mapper/ChangeLog
+++ /dev/null
@@ -1,103 +0,0 @@
-2010-07-11 Thomas Bächler <thomas@archlinux.org>
-
- * lvm2/device-mapper 2.02.70-1
- * Upstream update
- * Do not move the dmeventd manpage, has been fixed upstream
- * Remove all the || return 1 in PKGBUILD
-
-2010-07-01 Eric Belanger <eric@archlinux.org>
-
- * lvm2/device-mapper 2.02.69-1
- * Upstream update
- * Moved dmeventd man page from lvm2 to device-mapper package
-
-2010-06-25 Eric Belanger <eric@archlinux.org>
-
- * lvm2/device-mapper 2.02.68-1
- * Upstream update
- * Fixed tr path in lvmdump
-
-2010-04-05 Eric Belanger <eric@archlinux.org>
-
- * lvm2/device-mapper 2.02.62-1
- * Upstream update
- * Fixed license
-
-2010-02-27 Eric Belanger <eric@archlinux.org>
-
- * lvm2/device-mapper 2.02.61-1
- * Upstream update
-
-2010-01-24 Thomas Bächler <thomas@archlinux.org>
- * lvm2/device-mapper 2.02.60-2
- * Rebuilt without -Wl,--as-needed, it breaks dmeventd monitoring
-
-2010-01-24 Thomas Bächler <thomas@archlinux.org>
- * lvm2/device-mapper update to 2.02.60-1
- * Clean up PKGBUILD, fix internal paths to dmeventd and its helpers
-
-2009-11-27 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.56-1
- * device-mapper 1.02.40-1
- * Upstream update
-
-2009-10-31 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.54-1
- * device-mapper 1.02.39-1
- * Upstream update
- * Enabled the device-mapper event daemon
- * Moved the udev rule from /etc to /lib
-
-2009-09-27 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.53-1
- * device-mapper 1.02.38-1
- * Upstream update
-
-2009-09-18 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.52-1
- * device-mapper 1.02.37-1
- * Upstream update
- * Implemented split packages
- * PKGBUILD clean up
- * Renamed pkgconfig file (close FS#15909)
-
-2009-07-09 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.48-1
- * device-mapper 1.02.33-1
- * Upstream update
- * Removed unneeded readline depends (close FS#15205)
-
-2009-05-24 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.47-1
- * device-mapper 1.02.32-1
- * Upstream update
- * Added dmsetup.static
-
-2009-03-07 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.45-1
- * device-mapper 1.02.31-1
- * Upstream update
-
-2009-01-31 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.44-1
- * device-mapper 1.02.30-1
- * Upstream update
- * Added bash depends
- * Added readline depends
- * Added pkgconfig file
-
-2008-11-11 Eric Belanger <eric@archlinux.org>
-
- * lvm2 2.02.43-1
- * device-mapper 1.02.29-1
- * Upstream update
- * Disabled SMP build
- * Added ChangeLog
diff --git a/abs/core/device-mapper/PKGBUILD b/abs/core/device-mapper/PKGBUILD
deleted file mode 100644
index b4be343..0000000
--- a/abs/core/device-mapper/PKGBUILD
+++ /dev/null
@@ -1,64 +0,0 @@
-# $Id: PKGBUILD 85275 2010-07-11 10:26:53Z thomas $
-# Maintainer: Eric Belanger <eric@archlinux.org>
-
-pkgbase=lvm2
-pkgname=('lvm2' 'device-mapper')
-pkgver=2.02.70
-_pkgverdm=1.02.52
-_pkgverlvm=${pkgver}
-pkgrel=1
-arch=('i686' 'x86_64')
-url="http://sourceware.org/lvm2/"
-license=('GPL2' 'LGPL2.1')
-groups=('base')
-conflicts=('mkinitcpio<0.5.99')
-changelog=ChangeLog
-source=(ftp://sources.redhat.com/pub/lvm2/LVM2.${_pkgverlvm}.tgz
- lvm2_install
- lvm2_hook)
-md5sums=('39c26d5a821754cc347d7a19e82d4a24'
- 'f781c9f5dd4f9934952c687b73d26a18'
- '95bed25bdbc2c2d8500e7a07aeff7f65')
-sha1sums=('6f88114e72204feee491befd5f0e203036b90f11'
- '583424bb0a6f89ffe4e4ea446b912f0fedac7050'
- '0dc0c0d620f634c4d078afdb78e3bae15ccf957b')
-
-build() {
- cd "${srcdir}/LVM2.${_pkgverlvm}"
- sed -i 's|/usr/bin/tr|/bin/tr|' scripts/lvmdump.sh
- unset LDFLAGS
- ./configure --prefix= --sysconfdir=/etc --localstatedir=/var --datarootdir=/usr/share \
- --includedir=/usr/include --with-usrlibdir=/usr/lib \
- --enable-pkgconfig --enable-readline --enable-dmeventd --enable-cmdlib --enable-applib \
- --with-udevdir=/lib/udev/rules.d/ --enable-udev_sync --enable-udev_rules
- make
-}
-
-package_device-mapper() {
- pkgdesc="Device mapper userspace library and tools"
- url="http://sourceware.org/dm/"
- depends=('glibc' 'udev')
-
- cd "${srcdir}/LVM2.${_pkgverlvm}"
- make DESTDIR="${pkgdir}" install_device-mapper
-}
-
-package_lvm2() {
- pkgdesc="Logical Volume Manager 2 utilities"
- depends=('bash' "device-mapper>=${pkgver}" 'udev' 'readline')
- conflicts=('lvm' 'mkinitcpio<0.5.99')
- backup=('etc/lvm/lvm.conf')
- options=('!makeflags')
-
- cd "${srcdir}/LVM2.${_pkgverlvm}"
- make DESTDIR="${pkgdir}" install_lvm2
- # install applib
- cd liblvm
- make DESTDIR="${pkgdir}" install
- cd ..
- # /etc directories
- install -d "${pkgdir}"/etc/lvm/{archive,backup}
- # mkinitcpio hook
- install -D -m644 "${srcdir}/lvm2_hook" "${pkgdir}/lib/initcpio/hooks/lvm2"
- install -D -m644 "${srcdir}/lvm2_install" "${pkgdir}/lib/initcpio/install/lvm2"
-}
diff --git a/abs/core/device-mapper/lvm2_hook b/abs/core/device-mapper/lvm2_hook
deleted file mode 100644
index 13183c6..0000000
--- a/abs/core/device-mapper/lvm2_hook
+++ /dev/null
@@ -1,25 +0,0 @@
-# vim:set ft=sh:
-run_hook ()
-{
- /sbin/modprobe -q dm-mod >/dev/null 2>&1
- if [ -e "/sys/class/misc/device-mapper" ]; then
- if [ ! -e "/dev/mapper/control" ]; then
- /bin/mknod "/dev/mapper/control" c $(cat /sys/class/misc/device-mapper/dev | sed 's|:| |')
- fi
-
- # If the lvmwait= parameter has been specified on the command line
- # wait for the device(s) before trying to activate the volume group(s)
- if [ -n "${lvmwait}" ]; then
- for pvdev in $(echo ${lvmwait} | sed 's|,| |g'); do
- poll_device ${pvdev} ${rootdelay}
- done
- fi
-
- [ "${quiet}" = "y" ] && LVMQUIET=">/dev/null"
-
- msg "Scanning logical volumes..."
- eval /sbin/lvm vgscan --ignorelockingfailure $LVMQUIET
- msg "Activating logical volumes..."
- eval /sbin/lvm vgchange --ignorelockingfailure --ignoremonitoring -ay $LVMQUIET
- fi
-}
diff --git a/abs/core/device-mapper/lvm2_install b/abs/core/device-mapper/lvm2_install
deleted file mode 100644
index 4ce9f18..0000000
--- a/abs/core/device-mapper/lvm2_install
+++ /dev/null
@@ -1,30 +0,0 @@
-# vim: set ft=sh:
-
-install ()
-{
- MODULES=" dm-mod dm-snapshot dm-mirror"
- BINARIES=""
- FILES=""
- SCRIPT="lvm2"
-
- add_dir "/dev/mapper"
- add_binary "/sbin/lvm"
- add_binary "/sbin/dmsetup"
- add_binary "/sbin/dmeventd"
- add_file "/lib/udev/rules.d/10-dm.rules"
- add_file "/lib/udev/rules.d/13-dm-disk.rules"
- add_file "/lib/udev/rules.d/95-dm-notify.rules"
- add_file "/lib/udev/rules.d/11-dm-lvm.rules"
-}
-
-help ()
-{
-cat<<HELPEOF
- This hook loads the necessary modules for an LVM2 root device.
-
- The optional lvmwait= parameter followed by a comma-separated
- list of device names can be given on the command line.
- It will cause the hook to wait until all given devices exist
- before trying to scan and activate any volume groups.
-HELPEOF
-}
diff --git a/abs/core/directfb/ChangeLog b/abs/core/directfb/ChangeLog
deleted file mode 100644
index 4e10ded..0000000
--- a/abs/core/directfb/ChangeLog
+++ /dev/null
@@ -1,5 +0,0 @@
-2008-07-29 Eric Belanger <eric@archlinux.org>
-
- * directfb 1.2.0-1
- * Upstream update
- * Added ChangeLog
diff --git a/abs/core/directfb/dfb_serial.diff b/abs/core/directfb/dfb_serial.diff
deleted file mode 100644
index 638467b..0000000
--- a/abs/core/directfb/dfb_serial.diff
+++ /dev/null
@@ -1,10 +0,0 @@
---- lib/direct/serial.h.orig 2009-02-11 05:40:20.000000000 +0000
-+++ lib/direct/serial.h 2009-02-11 05:40:44.000000000 +0000
-@@ -31,6 +31,7 @@
-
- #include <direct/types.h>
- #include <direct/debug.h>
-+#include <linux/types.h>
-
- struct __D_DirectSerial {
- int magic;
diff --git a/abs/core/faac/libmp4v2.patch b/abs/core/faac/libmp4v2.patch
deleted file mode 100644
index b2c0165..0000000
--- a/abs/core/faac/libmp4v2.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- faac/configure.in 2006-08-13 14:17:26.000000000 +0000
-+++ faac-patched/configure.in 2007-01-29 19:18:45.000000000 +0000
-@@ -35,6 +35,8 @@
-
- if test x$external_mp4v2 = xyes; then
- AC_MSG_NOTICE([*** Building with external mp4v2 ***])
-+ MY_DEFINE(HAVE_LIBMP4V2)
-+ LIBS="-lmp4v2 $LIBS"
- else
- if test x$WITHMP4V2 = xyes; then
- AC_MSG_NOTICE([*** Building with internal mp4v2 ***])
diff --git a/abs/core/faac/pipe-output.patch b/abs/core/faac/pipe-output.patch
deleted file mode 100644
index a8581f3..0000000
--- a/abs/core/faac/pipe-output.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- faac/frontend/main.c 2004-12-08 11:07:17.000000000 +0000
-+++ faac-patched/frontend/main.c 2007-01-29 19:17:26.000000000 +0000
-@@ -918,7 +918,14 @@
- {
- #endif
- /* open the aac output file */
-- outfile = fopen(aacFileName, "wb");
-+ if (aacFileName[0] == '-')
-+ {
-+ outfile = stdout;
-+ }
-+ else
-+ {
-+ outfile = fopen(aacFileName, "wb");
-+ }
- if (!outfile)
- {
- fprintf(stderr, "Couldn't create output file %s\n", aacFileName);
diff --git a/abs/core/freetype2/bytecode.patch b/abs/core/freetype2/bytecode.patch
deleted file mode 100644
index dd901ad..0000000
--- a/abs/core/freetype2/bytecode.patch
+++ /dev/null
@@ -1,29 +0,0 @@
---- include/freetype/config/ftoption.h.old 2006-05-12 02:05:49.000000000 +0800
-+++ include/freetype/config/ftoption.h 2006-10-02 01:22:50.000000000 +0800
-@@ -436,7 +436,7 @@
- /* Do not #undef this macro here, since the build system might */
- /* define it for certain configurations only. */
- /* */
--/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
-+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
-
-
- /*************************************************************************/
-@@ -448,7 +448,7 @@
- /* FT_PARAM_TAG_UNPATENTED_HINTING; or when the debug hook */
- /* FT_DEBUG_HOOK_UNPATENTED_HINTING is globally activated. */
- /* */
--#define TT_CONFIG_OPTION_UNPATENTED_HINTING
-+#undef TT_CONFIG_OPTION_UNPATENTED_HINTING
-
-
- /*************************************************************************/
-@@ -480,7 +480,7 @@
- /* http://partners.adobe.com/asn/developer/opentype/glyf.html */
- /* http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html */
- /* */
--#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
-+#define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
-
-
- /*************************************************************************/
diff --git a/abs/core/freetype2/freetype-2.2.1-memcpy-fix.patch b/abs/core/freetype2/freetype-2.2.1-memcpy-fix.patch
deleted file mode 100644
index 67a1c07..0000000
--- a/abs/core/freetype2/freetype-2.2.1-memcpy-fix.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- freetype-2.2.1/src/psaux/psobjs.c~ 2006-04-26 16:38:17.000000000 +0200
-+++ freetype-2.2.1/src/psaux/psobjs.c 2006-09-10 15:01:13.000000000 +0200
-@@ -165,6 +165,11 @@
- return PSaux_Err_Invalid_Argument;
- }
-
-+ if ( length < 0 ) {
-+ FT_ERROR(( "ps_table_add: invalid length\n" ));
-+ return PSaux_Err_Invalid_Argument;
-+ }
-+
- /* grow the base block if needed */
- if ( table->cursor + length > table->capacity )
- {
diff --git a/abs/core/freetype2/freetype-2.3.3-ftbitmap.patch b/abs/core/freetype2/freetype-2.3.3-ftbitmap.patch
deleted file mode 100644
index bbb8b2b..0000000
--- a/abs/core/freetype2/freetype-2.3.3-ftbitmap.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-===================================================================
-RCS file: /var/lib/cvs/sources/freetype/freetype2/src/base/ftbitmap.c,v
-retrieving revision 1.17
-retrieving revision 1.18
-diff -u -r1.17 -r1.18
---- freetype/freetype2/src/base/ftbitmap.c 2007/03/29 11:56:21 1.17
-+++ freetype/freetype2/src/base/ftbitmap.c 2007/04/06 08:19:04 1.18
-@@ -149,15 +149,15 @@
- if ( bit_last < bit_width )
- {
- FT_Byte* line = bitmap->buffer + ( bit_last >> 3 );
-+ FT_Byte* end = bitmap->buffer + pitch;
- FT_Int shift = bit_last & 7;
- FT_UInt mask = 0xFF00U >> shift;
- FT_Int count = height;
-
-
-- for ( ; count > 0; count--, line += pitch )
-+ for ( ; count > 0; count--, line += pitch, end += pitch )
- {
- FT_Byte* write = line;
-- FT_Byte* end = line + pitch;
-
-
- if ( shift > 0 )
diff --git a/abs/core/freetype2/freetype2.install b/abs/core/freetype2/freetype2.install
deleted file mode 100644
index 704adac..0000000
--- a/abs/core/freetype2/freetype2.install
+++ /dev/null
@@ -1,23 +0,0 @@
-# arg 1: the new package version
-post_install() {
- echo -n "updating font cache... "
- /sbin/ldconfig -r .
- /usr/bin/fc-cache -f
- echo "done."
-}
-
-# arg 1: the new package version
-# arg 2: the old package version
-post_upgrade() {
- post_install $1
-}
-
-# arg 1: the old package version
-pre_remove() {
- /bin/true
-}
-
-op=$1
-shift
-
-$op $*
diff --git a/abs/core/ftgl/ftgl-gcc411.patch b/abs/core/ftgl/ftgl-gcc411.patch
deleted file mode 100644
index f52d48b..0000000
--- a/abs/core/ftgl/ftgl-gcc411.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ruN FTGL.org/include/FTTextureGlyph.h FTGL/include/FTTextureGlyph.h
---- FTGL.org/include/FTTextureGlyph.h 2006-07-11 17:49:42.000000000 +0200
-+++ FTGL/include/FTTextureGlyph.h 2006-07-11 17:50:23.000000000 +0200
-@@ -52,7 +52,7 @@
- * Reset the currently active texture to zero to get into a known state before
- * drawing a string. This is to get round possible threading issues.
- */
-- static void FTTextureGlyph::ResetActiveTexture(){ activeTextureID = 0;}
-+ static void ResetActiveTexture(){ activeTextureID = 0;}
-
- private:
- /**
diff --git a/abs/core/gawk/gawk-3.1.5-segfault_fix-1.patch b/abs/core/gawk/gawk-3.1.5-segfault_fix-1.patch
deleted file mode 100644
index aa2f17b..0000000
--- a/abs/core/gawk/gawk-3.1.5-segfault_fix-1.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-Submitted By: Matthew Burgess <matthew@linuxfromscratch.org>
-Date: 2005-09-24
-Initial Package Version: 3.1.5
-Upstream Status: From Upstream
-Origin: http://lists.gnu.org/archive/html/bug-gnu-utils/2005-08/msg00047.html
-Description: Fixes a bug which causes gawk to segfault when operating on a non-existent file.
-
-diff -Naur gawk-3.1.5.orig/io.c gawk-3.1.5/io.c
---- gawk-3.1.5.orig/io.c 2005-07-26 18:07:43.000000000 +0000
-+++ gawk-3.1.5/io.c 2005-09-24 14:43:13.771380264 +0000
-@@ -2480,9 +2480,12 @@
- {
- struct stat sbuf;
- struct open_hook *oh;
-+ int iop_malloced = FALSE;
-
-- if (iop == NULL)
-+ if (iop == NULL) {
- emalloc(iop, IOBUF *, sizeof(IOBUF), "iop_alloc");
-+ iop_malloced = TRUE;
-+ }
- memset(iop, '\0', sizeof(IOBUF));
- iop->flag = 0;
- iop->fd = fd;
-@@ -2495,7 +2498,8 @@
- }
-
- if (iop->fd == INVALID_HANDLE) {
-- free(iop);
-+ if (iop_malloced)
-+ free(iop);
- return NULL;
- }
- if (isatty(iop->fd))
-@@ -2503,7 +2507,7 @@
- iop->readsize = iop->size = optimal_bufsize(iop->fd, & sbuf);
- iop->sbuf = sbuf;
- if (do_lint && S_ISREG(sbuf.st_mode) && sbuf.st_size == 0)
-- lintwarn(_("data file `%s' is empty"), name);
-+ lintwarn(_("data file `%s' is empty"), name);
- errno = 0;
- iop->count = iop->scanoff = 0;
- emalloc(iop->buf, char *, iop->size += 2, "iop_alloc");
diff --git a/abs/core/grep/01-fgrep.patch b/abs/core/grep/01-fgrep.patch
deleted file mode 100644
index c7f8f96..0000000
--- a/abs/core/grep/01-fgrep.patch
+++ /dev/null
@@ -1,145 +0,0 @@
---- grep-2.5.1/src/search.c.fgrep 2001-04-19 04:42:14.000000000 +0100
-+++ grep-2.5.1/src/search.c 2004-02-26 13:09:32.000000000 +0000
-@@ -360,13 +360,7 @@
- /* Find a possible match using the KWset matcher. */
- size_t offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
- if (offset == (size_t) -1)
-- {
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- free(mb_properties);
--#endif
-- return (size_t)-1;
-- }
-+ goto failure;
- beg += offset;
- /* Narrow down to the line containing the candidate, and
- run it through DFA. */
-@@ -379,7 +373,7 @@
- while (beg > buf && beg[-1] != eol)
- --beg;
- if (kwsm.index < kwset_exact_matches)
-- goto success;
-+ goto success_in_beg_and_end;
- if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
- continue;
- }
-@@ -398,7 +392,7 @@
- }
- /* Successful, no backreferences encountered! */
- if (!backref)
-- goto success;
-+ goto success_in_beg_and_end;
- }
- else
- end = beg + size;
-@@ -413,14 +407,11 @@
- end - beg - 1, &(patterns[i].regs))))
- {
- len = patterns[i].regs.end[0] - start;
-- if (exact)
-- {
-- *match_size = len;
-- return start;
-- }
-+ if (exact && !match_words)
-+ goto success_in_start_and_len;
- if ((!match_lines && !match_words)
- || (match_lines && len == end - beg - 1))
-- goto success;
-+ goto success_in_beg_and_end;
- /* If -w, check if the match aligns with word boundaries.
- We do this iteratively because:
- (a) the line may contain more than one occurence of the
-@@ -434,7 +425,7 @@
- if ((start == 0 || !WCHAR ((unsigned char) beg[start - 1]))
- && (len == end - beg - 1
- || !WCHAR ((unsigned char) beg[start + len])))
-- goto success;
-+ goto success_in_beg_and_end;
- if (len > 0)
- {
- /* Try a shorter length anchored at the same place. */
-@@ -461,19 +452,26 @@
- }
- } /* for Regex patterns. */
- } /* for (beg = end ..) */
-+
-+ failure:
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1 && mb_properties)
- free (mb_properties);
- #endif /* MBS_SUPPORT */
- return (size_t) -1;
-
-- success:
-+ success_in_beg_and_end:
-+ len = end - beg;
-+ start = beg - buf;
-+ /* FALLTHROUGH */
-+
-+ success_in_start_and_len:
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1 && mb_properties)
- free (mb_properties);
- #endif /* MBS_SUPPORT */
-- *match_size = end - beg;
-- return beg - buf;
-+ *match_size = len;
-+ return start;
- }
-
- static void
-@@ -516,28 +514,15 @@
- {
- size_t offset = kwsexec (kwset, beg, buf + size - beg, &kwsmatch);
- if (offset == (size_t) -1)
-- {
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- free(mb_properties);
--#endif /* MBS_SUPPORT */
-- return offset;
-- }
-+ goto failure;
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1 && mb_properties[offset+beg-buf] == 0)
- continue; /* It is a part of multibyte character. */
- #endif /* MBS_SUPPORT */
- beg += offset;
- len = kwsmatch.size[0];
-- if (exact)
-- {
-- *match_size = len;
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- free (mb_properties);
--#endif /* MBS_SUPPORT */
-- return beg - buf;
-- }
-+ if (exact && !match_words)
-+ goto success_in_beg_and_len;
- if (match_lines)
- {
- if (beg > buf && beg[-1] != eol)
-@@ -551,6 +536,7 @@
- goto success;
- }
-
-+ failure:
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1)
- free (mb_properties);
-@@ -583,7 +569,11 @@
- end++;
- while (buf < beg && beg[-1] != eol)
- --beg;
-- *match_size = end - beg;
-+ len = end - beg;
-+ /* FALLTHROUGH */
-+
-+ success_in_beg_and_len:
-+ *match_size = len;
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1)
- free (mb_properties);
diff --git a/abs/core/grep/02-bracket.patch b/abs/core/grep/02-bracket.patch
deleted file mode 100644
index f99571c..0000000
--- a/abs/core/grep/02-bracket.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- grep-2.5.1/src/dfa.c.bracket 2003-10-30 16:21:14.000000000 +0000
-+++ grep-2.5.1/src/dfa.c 2003-10-30 16:22:38.000000000 +0000
-@@ -586,7 +586,7 @@
- work_mbc->coll_elems[work_mbc->ncoll_elems++] = elem;
- }
- }
-- wc = -1;
-+ wc1 = wc = -1;
- }
- else
- /* We treat '[' as a normal character here. */
diff --git a/abs/core/grep/03-i18n.patch b/abs/core/grep/03-i18n.patch
deleted file mode 100644
index 8dc3dfe..0000000
--- a/abs/core/grep/03-i18n.patch
+++ /dev/null
@@ -1,303 +0,0 @@
---- grep-2.5.1/src/dfa.c 2004-02-26 13:09:54.000000000 +0000
-+++ grep-2.5.1/src/dfa.c 2004-05-18 16:43:31.189200479 +0100
-@@ -414,7 +414,7 @@
-
- /* This function fetch a wide character, and update cur_mb_len,
- used only if the current locale is a multibyte environment. */
--static wchar_t
-+static wint_t
- fetch_wc (char const *eoferr)
- {
- wchar_t wc;
-@@ -423,7 +423,7 @@
- if (eoferr != 0)
- dfaerror (eoferr);
- else
-- return -1;
-+ return WEOF;
- }
-
- cur_mb_len = mbrtowc(&wc, lexptr, lexleft, &mbs);
-@@ -459,7 +459,7 @@
- static void
- parse_bracket_exp_mb ()
- {
-- wchar_t wc, wc1, wc2;
-+ wint_t wc, wc1, wc2;
-
- /* Work area to build a mb_char_classes. */
- struct mb_char_classes *work_mbc;
-@@ -496,7 +496,7 @@
- work_mbc->invert = 0;
- do
- {
-- wc1 = -1; /* mark wc1 is not initialized". */
-+ wc1 = WEOF; /* mark wc1 is not initialized". */
-
- /* Note that if we're looking at some other [:...:] construct,
- we just treat it as a bunch of ordinary characters. We can do
-@@ -586,7 +586,7 @@
- work_mbc->coll_elems[work_mbc->ncoll_elems++] = elem;
- }
- }
-- wc1 = wc = -1;
-+ wc1 = wc = WEOF;
- }
- else
- /* We treat '[' as a normal character here. */
-@@ -600,7 +600,7 @@
- wc = fetch_wc(("Unbalanced ["));
- }
-
-- if (wc1 == -1)
-+ if (wc1 == WEOF)
- wc1 = fetch_wc(_("Unbalanced ["));
-
- if (wc1 == L'-')
-@@ -630,17 +630,17 @@
- }
- REALLOC_IF_NECESSARY(work_mbc->range_sts, wchar_t,
- range_sts_al, work_mbc->nranges + 1);
-- work_mbc->range_sts[work_mbc->nranges] = wc;
-+ work_mbc->range_sts[work_mbc->nranges] = (wchar_t)wc;
- REALLOC_IF_NECESSARY(work_mbc->range_ends, wchar_t,
- range_ends_al, work_mbc->nranges + 1);
-- work_mbc->range_ends[work_mbc->nranges++] = wc2;
-+ work_mbc->range_ends[work_mbc->nranges++] = (wchar_t)wc2;
- }
-- else if (wc != -1)
-+ else if (wc != WEOF)
- /* build normal characters. */
- {
- REALLOC_IF_NECESSARY(work_mbc->chars, wchar_t, chars_al,
- work_mbc->nchars + 1);
-- work_mbc->chars[work_mbc->nchars++] = wc;
-+ work_mbc->chars[work_mbc->nchars++] = (wchar_t)wc;
- }
- }
- while ((wc = wc1) != L']');
-@@ -2552,6 +2552,8 @@
- }
-
- /* match with a character? */
-+ if (case_fold)
-+ wc = towlower (wc);
- for (i = 0; i<work_mbc->nchars; i++)
- {
- if (wc == work_mbc->chars[i])
---- grep-2.5.1/src/grep.c.i18n 2002-03-26 15:54:12.000000000 +0000
-+++ grep-2.5.1/src/grep.c 2004-02-26 13:09:54.000000000 +0000
-@@ -30,6 +30,12 @@
- # include <sys/time.h>
- # include <sys/resource.h>
- #endif
-+#if defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H && defined HAVE_MBRTOWC
-+/* We can handle multibyte string. */
-+# define MBS_SUPPORT
-+# include <wchar.h>
-+# include <wctype.h>
-+#endif
- #include <stdio.h>
- #include "system.h"
- #include "getopt.h"
-@@ -1697,6 +1703,37 @@
- if (!install_matcher (matcher) && !install_matcher ("default"))
- abort ();
-
-+#ifdef MBS_SUPPORT
-+ if (MB_CUR_MAX != 1 && match_icase)
-+ {
-+ wchar_t wc;
-+ mbstate_t cur_state, prev_state;
-+ int i, len = strlen(keys);
-+
-+ memset(&cur_state, 0, sizeof(mbstate_t));
-+ for (i = 0; i <= len ;)
-+ {
-+ size_t mbclen;
-+ mbclen = mbrtowc(&wc, keys + i, len - i, &cur_state);
-+ if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0)
-+ {
-+ /* An invalid sequence, or a truncated multibyte character.
-+ We treat it as a singlebyte character. */
-+ mbclen = 1;
-+ }
-+ else
-+ {
-+ if (iswupper((wint_t)wc))
-+ {
-+ wc = towlower((wint_t)wc);
-+ wcrtomb(keys + i, wc, &cur_state);
-+ }
-+ }
-+ i += mbclen;
-+ }
-+ }
-+#endif /* MBS_SUPPORT */
-+
- (*compile)(keys, keycc);
-
- if ((argc - optind > 1 && !no_filenames) || with_filenames)
---- grep-2.5.1/src/search.c.i18n 2004-02-26 13:09:54.000000000 +0000
-+++ grep-2.5.1/src/search.c 2004-02-26 13:17:12.000000000 +0000
-@@ -149,15 +149,16 @@
- static char*
- check_multibyte_string(char const *buf, size_t size)
- {
-- char *mb_properties = malloc(size);
-+ char *mb_properties = xmalloc(size);
- mbstate_t cur_state;
-+ wchar_t wc;
- int i;
- memset(&cur_state, 0, sizeof(mbstate_t));
- memset(mb_properties, 0, sizeof(char)*size);
- for (i = 0; i < size ;)
- {
- size_t mbclen;
-- mbclen = mbrlen(buf + i, size - i, &cur_state);
-+ mbclen = mbrtowc(&wc, buf + i, size - i, &cur_state);
-
- if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0)
- {
-@@ -165,6 +166,14 @@
- We treat it as a singlebyte character. */
- mbclen = 1;
- }
-+ else if (match_icase)
-+ {
-+ if (iswupper((wint_t)wc))
-+ {
-+ wc = towlower((wint_t)wc);
-+ wcrtomb(buf + i, wc, &cur_state);
-+ }
-+ }
- mb_properties[i] = mbclen;
- i += mbclen;
- }
-@@ -233,7 +242,7 @@
- static char const line_end[] = "\\)$";
- static char const word_beg[] = "\\(^\\|[^[:alnum:]_]\\)\\(";
- static char const word_end[] = "\\)\\([^[:alnum:]_]\\|$\\)";
-- char *n = malloc (sizeof word_beg - 1 + size + sizeof word_end);
-+ char *n = xmalloc (sizeof word_beg - 1 + size + sizeof word_end);
- size_t i;
- strcpy (n, match_lines ? line_beg : word_beg);
- i = strlen (n);
-@@ -316,7 +325,7 @@
- static char const line_end[] = ")$";
- static char const word_beg[] = "(^|[^[:alnum:]_])(";
- static char const word_end[] = ")([^[:alnum:]_]|$)";
-- char *n = malloc (sizeof word_beg - 1 + size + sizeof word_end);
-+ char *n = xmalloc (sizeof word_beg - 1 + size + sizeof word_end);
- size_t i;
- strcpy (n, match_lines ? line_beg : word_beg);
- i = strlen(n);
-@@ -339,14 +348,20 @@
- char eol = eolbyte;
- int backref, start, len;
- struct kwsmatch kwsm;
-- size_t i;
-+ size_t i, ret_val;
- #ifdef MBS_SUPPORT
- char *mb_properties = NULL;
--#endif /* MBS_SUPPORT */
--
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && kwset)
-- mb_properties = check_multibyte_string(buf, size);
-+ if (MB_CUR_MAX > 1)
-+ {
-+ if (match_icase)
-+ {
-+ char *case_buf = xmalloc(size);
-+ memcpy(case_buf, buf, size);
-+ buf = case_buf;
-+ }
-+ if (kwset)
-+ mb_properties = check_multibyte_string(buf, size);
-+ }
- #endif /* MBS_SUPPORT */
-
- buflim = buf + size;
-@@ -455,8 +470,13 @@
-
- failure:
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && mb_properties)
-- free (mb_properties);
-+ if (MB_CUR_MAX > 1)
-+ {
-+ if (mb_properties)
-+ free (mb_properties);
-+ if (match_icase)
-+ free ((char *) buf);
-+ }
- #endif /* MBS_SUPPORT */
- return (size_t) -1;
-
-@@ -467,8 +487,13 @@
-
- success_in_start_and_len:
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && mb_properties)
-- free (mb_properties);
-+ if (MB_CUR_MAX > 1)
-+ {
-+ if (mb_properties)
-+ free (mb_properties);
-+ if (match_icase)
-+ free ((char *) buf);
-+ }
- #endif /* MBS_SUPPORT */
- *match_size = len;
- return start;
-@@ -504,10 +529,19 @@
- register size_t len;
- char eol = eolbyte;
- struct kwsmatch kwsmatch;
-+ size_t ret_val;
- #ifdef MBS_SUPPORT
-- char *mb_properties;
-+ char *mb_properties = NULL;
- if (MB_CUR_MAX > 1)
-- mb_properties = check_multibyte_string (buf, size);
-+ {
-+ if (match_icase)
-+ {
-+ char *case_buf = xmalloc(size);
-+ memcpy(case_buf, buf, size);
-+ buf = case_buf;
-+ }
-+ mb_properties = check_multibyte_string(buf, size);
-+ }
- #endif /* MBS_SUPPORT */
-
- for (beg = buf; beg <= buf + size; ++beg)
-@@ -565,7 +599,12 @@
- failure:
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1)
-- free (mb_properties);
-+ {
-+ if (match_icase)
-+ free((char *) buf);
-+ if (mb_properties)
-+ free(mb_properties);
-+ }
- #endif /* MBS_SUPPORT */
- return -1;
-
-@@ -581,7 +620,12 @@
- *match_size = len;
- #ifdef MBS_SUPPORT
- if (MB_CUR_MAX > 1)
-- free (mb_properties);
-+ {
-+ if (mb_properties)
-+ free (mb_properties);
-+ if (match_icase)
-+ free ((char *) buf);
-+ }
- #endif /* MBS_SUPPORT */
- return beg - buf;
- }
diff --git a/abs/core/grep/04-oi.patch b/abs/core/grep/04-oi.patch
deleted file mode 100644
index eb997ad..0000000
--- a/abs/core/grep/04-oi.patch
+++ /dev/null
@@ -1,48 +0,0 @@
---- grep-2.5.1/lib/posix/regex.h.oi 2004-01-05 12:09:12.984391131 +0000
-+++ grep-2.5.1/lib/posix/regex.h 2004-01-05 12:09:24.717990622 +0000
-@@ -109,6 +109,10 @@
- If not set, \{, \}, {, and } are literals. */
- #define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
-
-+/* If this bit is set, then ignore case when matching.
-+ If not set, then case is significant. */
-+#define RE_ICASE (RE_INVALID_INTERVAL_ORD << 1)
-+
- /* If this bit is set, +, ? and | aren't recognized as operators.
- If not set, they are. */
- #define RE_LIMITED_OPS (RE_INTERVALS << 1)
---- grep-2.5.1/src/search.c.oi 2004-01-05 12:07:00.550199415 +0000
-+++ grep-2.5.1/src/search.c 2004-01-05 12:07:00.566197505 +0000
-@@ -31,7 +31,7 @@
-
- #include "system.h"
- #include "grep.h"
--#include "regex.h"
-+#include <regex.h>
- #include "dfa.h"
- #include "kwset.h"
- #include "error.h"
-@@ -190,7 +190,7 @@
- size_t total = size;
- char const *motif = pattern;
-
-- re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE);
-+ re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | (match_icase ? RE_ICASE : 0));
- dfasyntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE, match_icase, eolbyte);
-
- /* For GNU regex compiler we have to pass the patterns separately to detect
-@@ -268,12 +268,12 @@
-
- if (strcmp (matcher, "awk") == 0)
- {
-- re_set_syntax (RE_SYNTAX_AWK);
-+ re_set_syntax (RE_SYNTAX_AWK | (match_icase ? RE_ICASE : 0));
- dfasyntax (RE_SYNTAX_AWK, match_icase, eolbyte);
- }
- else
- {
-- re_set_syntax (RE_SYNTAX_POSIX_EGREP);
-+ re_set_syntax (RE_SYNTAX_POSIX_EGREP | (match_icase ? RE_ICASE : 0));
- dfasyntax (RE_SYNTAX_POSIX_EGREP, match_icase, eolbyte);
- }
-
diff --git a/abs/core/grep/05-manpage.patch b/abs/core/grep/05-manpage.patch
deleted file mode 100644
index 284f0c4..0000000
--- a/abs/core/grep/05-manpage.patch
+++ /dev/null
@@ -1,19 +0,0 @@
---- grep-2.5.1/doc/grep.1.manpage 2002-01-22 13:20:04.000000000 +0000
-+++ grep-2.5.1/doc/grep.1 2003-10-08 09:37:32.000000000 +0100
-@@ -191,6 +191,7 @@
- .I PATTERN
- as a list of fixed strings, separated by newlines,
- any of which is to be matched.
-+.TP
- .BR \-P ", " \-\^\-perl-regexp
- Interpret
- .I PATTERN
-@@ -302,7 +303,7 @@
- This is especially useful for tools like zgrep, e.g.
- .B "gzip -cd foo.gz |grep --label=foo something"
- .TP
--.BR \-\^\-line-buffering
-+.BR \-\^\-line-buffered
- Use line buffering, it can be a performance penality.
- .TP
- .BR \-q ", " \-\^\-quiet ", " \-\^\-silent
diff --git a/abs/core/grep/06-color.patch b/abs/core/grep/06-color.patch
deleted file mode 100644
index f54c258..0000000
--- a/abs/core/grep/06-color.patch
+++ /dev/null
@@ -1,10 +0,0 @@
---- grep-2.5.1/src/grep.c.color 2004-11-16 16:46:22.845505847 +0000
-+++ grep-2.5.1/src/grep.c 2004-11-16 16:46:27.961530537 +0000
-@@ -607,6 +607,7 @@
- fputs ("\33[00m", stdout);
- beg = b + match_size;
- }
-+ fputs ("\33[K", stdout);
- }
- fwrite (beg, 1, lim - beg, stdout);
- if (ferror (stdout))
diff --git a/abs/core/grep/07-icolor.patch b/abs/core/grep/07-icolor.patch
deleted file mode 100644
index 14b2617..0000000
--- a/abs/core/grep/07-icolor.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- grep-2.5.1a/src/grep.c.icolor 2005-01-07 12:05:20.877785250 +0000
-+++ grep-2.5.1a/src/grep.c 2005-01-07 12:05:44.690194388 +0000
-@@ -564,33 +564,6 @@
- {
- size_t match_size;
- size_t match_offset;
-- if(match_icase)
-- {
-- /* Yuck, this is tricky */
-- char *buf = (char*) xmalloc (lim - beg);
-- char *ibeg = buf;
-- char *ilim = ibeg + (lim - beg);
-- int i;
-- for (i = 0; i < lim - beg; i++)
-- ibeg[i] = tolower (beg[i]);
-- while ((match_offset = (*execute) (ibeg, ilim-ibeg, &match_size, 1))
-- != (size_t) -1)
-- {
-- char const *b = beg + match_offset;
-- if (b == lim)
-- break;
-- fwrite (beg, sizeof (char), match_offset, stdout);
-- printf ("\33[%sm", grep_color);
-- fwrite (b, sizeof (char), match_size, stdout);
-- fputs ("\33[00m", stdout);
-- beg = b + match_size;
-- ibeg = ibeg + match_offset + match_size;
-- }
-- fwrite (beg, 1, lim - beg, stdout);
-- free (buf);
-- lastout = lim;
-- return;
-- }
- while (lim-beg && (match_offset = (*execute) (beg, lim - beg, &match_size, 1))
- != (size_t) -1)
- {
diff --git a/abs/core/grep/08-skip.patch b/abs/core/grep/08-skip.patch
deleted file mode 100644
index fb6645f..0000000
--- a/abs/core/grep/08-skip.patch
+++ /dev/null
@@ -1,42 +0,0 @@
---- grep-2.5.1a/src/grep.c.skip 2006-05-31 09:26:58.000000000 +0100
-+++ grep-2.5.1a/src/grep.c 2006-05-31 09:28:24.000000000 +0100
-@@ -261,19 +261,6 @@
- bufbeg[-1] = eolbyte;
- bufdesc = fd;
-
-- if (fstat (fd, &stats->stat) != 0)
-- {
-- error (0, errno, "fstat");
-- return 0;
-- }
-- if (directories == SKIP_DIRECTORIES && S_ISDIR (stats->stat.st_mode))
-- return 0;
--#ifndef DJGPP
-- if (devices == SKIP_DEVICES && (S_ISCHR(stats->stat.st_mode) || S_ISBLK(stats->stat.st_mode) || S_ISSOCK(stats->stat.st_mode)))
--#else
-- if (devices == SKIP_DEVICES && (S_ISCHR(stats->stat.st_mode) || S_ISBLK(stats->stat.st_mode)))
--#endif
-- return 0;
- if (S_ISREG (stats->stat.st_mode))
- {
- if (file)
-@@ -875,6 +862,19 @@
- }
- else
- {
-+ if (stat (file, &stats->stat) != 0)
-+ {
-+ suppressible_error (file, errno);
-+ return 1;
-+ }
-+ if (directories == SKIP_DIRECTORIES && S_ISDIR (stats->stat.st_mode))
-+ return 1;
-+#ifndef DJGPP
-+ if (devices == SKIP_DEVICES && (S_ISCHR(stats->stat.st_mode) || S_ISBLK(stats->stat.st_mode) || S_ISSOCK(stats->stat.st_mode) || S_ISFIFO(stats->stat.st_mode)))
-+#else
-+ if (devices == SKIP_DEVICES && (S_ISCHR(stats->stat.st_mode) || S_ISBLK(stats->stat.st_mode)))
-+#endif
-+ return 1;
- while ((desc = open (file, O_RDONLY)) < 0 && errno == EINTR)
- continue;
-
diff --git a/abs/core/grep/09-egf-speedup.patch b/abs/core/grep/09-egf-speedup.patch
deleted file mode 100644
index 08e92c7..0000000
--- a/abs/core/grep/09-egf-speedup.patch
+++ /dev/null
@@ -1,823 +0,0 @@
---- grep-2.5.1/src/search.c 2004-12-31 15:28:35.720391036 +0000
-+++ grep-2.5.1a/src/search.c 2005-01-07 14:53:10.308860193 +0000
-@@ -18,9 +18,13 @@
-
- /* Written August 1992 by Mike Haertel. */
-
-+#ifndef _GNU_SOURCE
-+# define _GNU_SOURCE 1
-+#endif
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
-+#include <assert.h>
- #include <sys/types.h>
- #if defined HAVE_WCTYPE_H && defined HAVE_WCHAR_H && defined HAVE_MBRTOWC
- /* We can handle multibyte string. */
-@@ -39,6 +43,9 @@
- #ifdef HAVE_LIBPCRE
- # include <pcre.h>
- #endif
-+#ifdef HAVE_LANGINFO_CODESET
-+# include <langinfo.h>
-+#endif
-
- #define NCHAR (UCHAR_MAX + 1)
-
-@@ -70,9 +77,10 @@
- call the regexp matcher at all. */
- static int kwset_exact_matches;
-
--#if defined(MBS_SUPPORT)
--static char* check_multibyte_string PARAMS ((char const *buf, size_t size));
--#endif
-+/* UTF-8 encoding allows some optimizations that we can't otherwise
-+ assume in a multibyte encoding. */
-+static int using_utf8;
-+
- static void kwsinit PARAMS ((void));
- static void kwsmusts PARAMS ((void));
- static void Gcompile PARAMS ((char const *, size_t));
-@@ -84,6 +92,15 @@
- static size_t Pexecute PARAMS ((char const *, size_t, size_t *, int));
-
- void
-+check_utf8 (void)
-+{
-+#ifdef HAVE_LANGINFO_CODESET
-+ if (strcmp (nl_langinfo (CODESET), "UTF-8") == 0)
-+ using_utf8 = 1;
-+#endif
-+}
-+
-+void
- dfaerror (char const *mesg)
- {
- error (2, 0, mesg);
-@@ -141,47 +158,6 @@
- }
- }
-
--#ifdef MBS_SUPPORT
--/* This function allocate the array which correspond to "buf".
-- Then this check multibyte string and mark on the positions which
-- are not singlebyte character nor the first byte of a multibyte
-- character. Caller must free the array. */
--static char*
--check_multibyte_string(char const *buf, size_t size)
--{
-- char *mb_properties = xmalloc(size);
-- mbstate_t cur_state;
-- wchar_t wc;
-- int i;
-- memset(&cur_state, 0, sizeof(mbstate_t));
-- memset(mb_properties, 0, sizeof(char)*size);
-- for (i = 0; i < size ;)
-- {
-- size_t mbclen;
-- mbclen = mbrtowc(&wc, buf + i, size - i, &cur_state);
--
-- if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0)
-- {
-- /* An invalid sequence, or a truncated multibyte character.
-- We treat it as a singlebyte character. */
-- mbclen = 1;
-- }
-- else if (match_icase)
-- {
-- if (iswupper((wint_t)wc))
-- {
-- wc = towlower((wint_t)wc);
-- wcrtomb(buf + i, wc, &cur_state);
-- }
-- }
-- mb_properties[i] = mbclen;
-- i += mbclen;
-- }
--
-- return mb_properties;
--}
--#endif
--
- static void
- Gcompile (char const *pattern, size_t size)
- {
-@@ -190,6 +166,7 @@
- size_t total = size;
- char const *motif = pattern;
-
-+ check_utf8 ();
- re_set_syntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE | (match_icase ? RE_ICASE : 0));
- dfasyntax (RE_SYNTAX_GREP | RE_HAT_LISTS_NOT_NEWLINE, match_icase, eolbyte);
-
-@@ -266,6 +243,7 @@
- size_t total = size;
- char const *motif = pattern;
-
-+ check_utf8 ();
- if (strcmp (matcher, "awk") == 0)
- {
- re_set_syntax (RE_SYNTAX_AWK | (match_icase ? RE_ICASE : 0));
-@@ -350,18 +328,9 @@
- struct kwsmatch kwsm;
- size_t i, ret_val;
- #ifdef MBS_SUPPORT
-- char *mb_properties = NULL;
-- if (MB_CUR_MAX > 1)
-- {
-- if (match_icase)
-- {
-- char *case_buf = xmalloc(size);
-- memcpy(case_buf, buf, size);
-- buf = case_buf;
-- }
-- if (kwset)
-- mb_properties = check_multibyte_string(buf, size);
-- }
-+ int mb_cur_max = MB_CUR_MAX;
-+ mbstate_t mbs;
-+ memset (&mbs, '\0', sizeof (mbstate_t));
- #endif /* MBS_SUPPORT */
-
- buflim = buf + size;
-@@ -373,21 +342,63 @@
- if (kwset)
- {
- /* Find a possible match using the KWset matcher. */
-- size_t offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
-+#ifdef MBS_SUPPORT
-+ size_t bytes_left = 0;
-+#endif /* MBS_SUPPORT */
-+ size_t offset;
-+#ifdef MBS_SUPPORT
-+ /* kwsexec doesn't work with match_icase and multibyte input. */
-+ if (match_icase && mb_cur_max > 1)
-+ /* Avoid kwset */
-+ offset = 0;
-+ else
-+#endif /* MBS_SUPPORT */
-+ offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
- if (offset == (size_t) -1)
- goto failure;
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ /* Offset points inside multibyte character:
-+ * no good. */
-+ break;
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
- beg += offset;
- /* Narrow down to the line containing the candidate, and
- run it through DFA. */
- end = memchr(beg, eol, buflim - beg);
- end++;
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && mb_properties[beg - buf] == 0)
-+ if (mb_cur_max > 1 && bytes_left)
- continue;
--#endif
-+#endif /* MBS_SUPPORT */
- while (beg > buf && beg[-1] != eol)
- --beg;
-- if (kwsm.index < kwset_exact_matches)
-+ if (
-+#ifdef MBS_SUPPORT
-+ !(match_icase && mb_cur_max > 1) &&
-+#endif /* MBS_SUPPORT */
-+ (kwsm.index < kwset_exact_matches))
- goto success_in_beg_and_end;
- if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
- continue;
-@@ -395,13 +406,47 @@
- else
- {
- /* No good fixed strings; start with DFA. */
-+#ifdef MBS_SUPPORT
-+ size_t bytes_left = 0;
-+#endif /* MBS_SUPPORT */
- size_t offset = dfaexec (&dfa, beg, buflim - beg, &backref);
- if (offset == (size_t) -1)
- break;
- /* Narrow down to the line we've found. */
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ /* Offset points inside multibyte character:
-+ * no good. */
-+ break;
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
- beg += offset;
- end = memchr (beg, eol, buflim - beg);
- end++;
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && bytes_left)
-+ continue;
-+#endif /* MBS_SUPPORT */
- while (beg > buf && beg[-1] != eol)
- --beg;
- }
-@@ -469,15 +514,6 @@
- } /* for (beg = end ..) */
-
- failure:
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- {
-- if (mb_properties)
-- free (mb_properties);
-- if (match_icase)
-- free ((char *) buf);
-- }
--#endif /* MBS_SUPPORT */
- return (size_t) -1;
-
- success_in_beg_and_end:
-@@ -486,24 +522,144 @@
- /* FALLTHROUGH */
-
- success_in_start_and_len:
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- {
-- if (mb_properties)
-- free (mb_properties);
-- if (match_icase)
-- free ((char *) buf);
-- }
--#endif /* MBS_SUPPORT */
- *match_size = len;
- return start;
- }
-
-+#ifdef MBS_SUPPORT
-+static int f_i_multibyte; /* whether we're using the new -Fi MB method */
-+static struct
-+{
-+ wchar_t **patterns;
-+ size_t count, maxlen;
-+ unsigned char *match;
-+} Fimb;
-+#endif
-+
- static void
- Fcompile (char const *pattern, size_t size)
- {
-+ int mb_cur_max = MB_CUR_MAX;
- char const *beg, *lim, *err;
-
-+ check_utf8 ();
-+#ifdef MBS_SUPPORT
-+ /* Support -F -i for UTF-8 input. */
-+ if (match_icase && mb_cur_max > 1)
-+ {
-+ mbstate_t mbs;
-+ wchar_t *wcpattern = xmalloc ((size + 1) * sizeof (wchar_t));
-+ const char *patternend = pattern;
-+ size_t wcsize;
-+ kwset_t fimb_kwset = NULL;
-+ char *starts = NULL;
-+ wchar_t *wcbeg, *wclim;
-+ size_t allocated = 0;
-+
-+ memset (&mbs, '\0', sizeof (mbs));
-+# ifdef __GNU_LIBRARY__
-+ wcsize = mbsnrtowcs (wcpattern, &patternend, size, size, &mbs);
-+ if (patternend != pattern + size)
-+ wcsize = (size_t) -1;
-+# else
-+ {
-+ char *patterncopy = xmalloc (size + 1);
-+
-+ memcpy (patterncopy, pattern, size);
-+ patterncopy[size] = '\0';
-+ patternend = patterncopy;
-+ wcsize = mbsrtowcs (wcpattern, &patternend, size, &mbs);
-+ if (patternend != patterncopy + size)
-+ wcsize = (size_t) -1;
-+ free (patterncopy);
-+ }
-+# endif
-+ if (wcsize + 2 <= 2)
-+ {
-+fimb_fail:
-+ free (wcpattern);
-+ free (starts);
-+ if (fimb_kwset)
-+ kwsfree (fimb_kwset);
-+ free (Fimb.patterns);
-+ Fimb.patterns = NULL;
-+ }
-+ else
-+ {
-+ if (!(fimb_kwset = kwsalloc (NULL)))
-+ error (2, 0, _("memory exhausted"));
-+
-+ starts = xmalloc (mb_cur_max * 3);
-+ wcbeg = wcpattern;
-+ do
-+ {
-+ int i;
-+ size_t wclen;
-+
-+ if (Fimb.count >= allocated)
-+ {
-+ if (allocated == 0)
-+ allocated = 128;
-+ else
-+ allocated *= 2;
-+ Fimb.patterns = xrealloc (Fimb.patterns,
-+ sizeof (wchar_t *) * allocated);
-+ }
-+ Fimb.patterns[Fimb.count++] = wcbeg;
-+ for (wclim = wcbeg;
-+ wclim < wcpattern + wcsize && *wclim != L'\n'; ++wclim)
-+ *wclim = towlower (*wclim);
-+ *wclim = L'\0';
-+ wclen = wclim - wcbeg;
-+ if (wclen > Fimb.maxlen)
-+ Fimb.maxlen = wclen;
-+ if (wclen > 3)
-+ wclen = 3;
-+ if (wclen == 0)
-+ {
-+ if ((err = kwsincr (fimb_kwset, "", 0)) != 0)
-+ error (2, 0, err);
-+ }
-+ else
-+ for (i = 0; i < (1 << wclen); i++)
-+ {
-+ char *p = starts;
-+ int j, k;
-+
-+ for (j = 0; j < wclen; ++j)
-+ {
-+ wchar_t wc = wcbeg[j];
-+ if (i & (1 << j))
-+ {
-+ wc = towupper (wc);
-+ if (wc == wcbeg[j])
-+ continue;
-+ }
-+ k = wctomb (p, wc);
-+ if (k <= 0)
-+ goto fimb_fail;
-+ p += k;
-+ }
-+ if ((err = kwsincr (fimb_kwset, starts, p - starts)) != 0)
-+ error (2, 0, err);
-+ }
-+ if (wclim < wcpattern + wcsize)
-+ ++wclim;
-+ wcbeg = wclim;
-+ }
-+ while (wcbeg < wcpattern + wcsize);
-+ f_i_multibyte = 1;
-+ kwset = fimb_kwset;
-+ free (starts);
-+ Fimb.match = xmalloc (Fimb.count);
-+ if ((err = kwsprep (kwset)) != 0)
-+ error (2, 0, err);
-+ return;
-+ }
-+ }
-+#endif /* MBS_SUPPORT */
-+
-+
- kwsinit ();
- beg = pattern;
- do
-@@ -522,6 +678,76 @@
- error (2, 0, err);
- }
-
-+#ifdef MBS_SUPPORT
-+static int
-+Fimbexec (const char *buf, size_t size, size_t *plen, int exact)
-+{
-+ size_t len, letter, i;
-+ int ret = -1;
-+ mbstate_t mbs;
-+ wchar_t wc;
-+ int patterns_left;
-+
-+ assert (match_icase && f_i_multibyte == 1);
-+ assert (MB_CUR_MAX > 1);
-+
-+ memset (&mbs, '\0', sizeof (mbs));
-+ memset (Fimb.match, '\1', Fimb.count);
-+ letter = len = 0;
-+ patterns_left = 1;
-+ while (patterns_left && len <= size)
-+ {
-+ size_t c;
-+
-+ patterns_left = 0;
-+ if (len < size)
-+ {
-+ c = mbrtowc (&wc, buf + len, size - len, &mbs);
-+ if (c + 2 <= 2)
-+ return ret;
-+
-+ wc = towlower (wc);
-+ }
-+ else
-+ {
-+ c = 1;
-+ wc = L'\0';
-+ }
-+
-+ for (i = 0; i < Fimb.count; i++)
-+ {
-+ if (Fimb.match[i])
-+ {
-+ if (Fimb.patterns[i][letter] == L'\0')
-+ {
-+ /* Found a match. */
-+ *plen = len;
-+ if (!exact && !match_words)
-+ return 0;
-+ else
-+ {
-+ /* For -w or exact look for longest match. */
-+ ret = 0;
-+ Fimb.match[i] = '\0';
-+ continue;
-+ }
-+ }
-+
-+ if (Fimb.patterns[i][letter] == wc)
-+ patterns_left = 1;
-+ else
-+ Fimb.match[i] = '\0';
-+ }
-+ }
-+
-+ len += c;
-+ letter++;
-+ }
-+
-+ return ret;
-+}
-+#endif /* MBS_SUPPORT */
-+
- static size_t
- Fexecute (char const *buf, size_t size, size_t *match_size, int exact)
- {
-@@ -531,80 +757,258 @@
- struct kwsmatch kwsmatch;
- size_t ret_val;
- #ifdef MBS_SUPPORT
-- char *mb_properties = NULL;
-- if (MB_CUR_MAX > 1)
-- {
-- if (match_icase)
-- {
-- char *case_buf = xmalloc(size);
-- memcpy(case_buf, buf, size);
-- buf = case_buf;
-- }
-- mb_properties = check_multibyte_string(buf, size);
-- }
-+ int mb_cur_max = MB_CUR_MAX;
-+ mbstate_t mbs;
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ const char *last_char = NULL;
- #endif /* MBS_SUPPORT */
-
- for (beg = buf; beg <= buf + size; ++beg)
- {
-- size_t offset = kwsexec (kwset, beg, buf + size - beg, &kwsmatch);
-+ size_t offset;
-+ offset = kwsexec (kwset, beg, buf + size - beg, &kwsmatch);
-+
- if (offset == (size_t) -1)
- goto failure;
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && mb_properties[offset+beg-buf] == 0)
-- continue; /* It is a part of multibyte character. */
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ size_t bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+ last_char = beg;
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ /* Offset points inside multibyte character: no good. */
-+ break;
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+
-+ if (bytes_left)
-+ continue;
-+ }
-+ else
- #endif /* MBS_SUPPORT */
- beg += offset;
-+#ifdef MBS_SUPPORT
-+ /* For f_i_multibyte, the string at beg now matches first 3 chars of
-+ one of the search strings (less if there are shorter search strings).
-+ See if this is a real match. */
-+ if (f_i_multibyte
-+ && Fimbexec (beg, buf + size - beg, &kwsmatch.size[0], exact))
-+ goto next_char;
-+#endif /* MBS_SUPPORT */
- len = kwsmatch.size[0];
- if (exact && !match_words)
- goto success_in_beg_and_len;
- if (match_lines)
- {
- if (beg > buf && beg[-1] != eol)
-- continue;
-+ goto next_char;
- if (beg + len < buf + size && beg[len] != eol)
-- continue;
-+ goto next_char;
- goto success;
- }
- else if (match_words)
-- for (try = beg; len; )
-- {
-- if (try > buf && WCHAR((unsigned char) try[-1]))
-- break;
-- if (try + len < buf + size && WCHAR((unsigned char) try[len]))
-- {
-- offset = kwsexec (kwset, beg, --len, &kwsmatch);
-- if (offset == (size_t) -1)
-- {
-+ {
-+ while (len)
-+ {
-+ int word_match = 0;
-+ if (beg > buf)
-+ {
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- free (mb_properties);
-+ if (mb_cur_max > 1)
-+ {
-+ const char *s;
-+ int mr;
-+ wchar_t pwc;
-+
-+ if (using_utf8)
-+ {
-+ s = beg - 1;
-+ while (s > buf
-+ && (unsigned char) *s >= 0x80
-+ && (unsigned char) *s <= 0xbf)
-+ --s;
-+ }
-+ else
-+ s = last_char;
-+ mr = mbtowc (&pwc, s, beg - s);
-+ if (mr <= 0)
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ else if ((iswalnum (pwc) || pwc == L'_')
-+ && mr == (int) (beg - s))
-+ goto next_char;
-+ }
-+ else
- #endif /* MBS_SUPPORT */
-- return offset;
-- }
-- try = beg + offset;
-- len = kwsmatch.size[0];
-- }
-- else
-- goto success;
-- }
-+ if (WCHAR ((unsigned char) beg[-1]))
-+ goto next_char;
-+ }
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1)
-+ {
-+ wchar_t nwc;
-+ int mr;
-+
-+ mr = mbtowc (&nwc, beg + len, buf + size - beg - len);
-+ if (mr <= 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ word_match = 1;
-+ }
-+ else if (!iswalnum (nwc) && nwc != L'_')
-+ word_match = 1;
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ if (beg + len >= buf + size || !WCHAR ((unsigned char) beg[len]))
-+ word_match = 1;
-+ if (word_match)
-+ {
-+ if (!exact)
-+ /* Returns the whole line now we know there's a word match. */
-+ goto success;
-+ else
-+ /* Returns just this word match. */
-+ goto success_in_beg_and_len;
-+ }
-+ if (len > 0)
-+ {
-+ /* Try a shorter length anchored at the same place. */
-+ --len;
-+ offset = kwsexec (kwset, beg, len, &kwsmatch);
-+
-+ if (offset == -1)
-+ goto next_char; /* Try a different anchor. */
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ size_t bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+ last_char = beg;
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ {
-+ /* Offset points inside multibyte character:
-+ * no good. */
-+ break;
-+ }
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+
-+ if (bytes_left)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ goto next_char; /* Try a different anchor. */
-+ }
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ beg += offset;
-+#ifdef MBS_SUPPORT
-+ /* The string at beg now matches first 3 chars of one of
-+ the search strings (less if there are shorter search
-+ strings). See if this is a real match. */
-+ if (f_i_multibyte
-+ && Fimbexec (beg, len - offset, &kwsmatch.size[0],
-+ exact))
-+ goto next_char;
-+#endif /* MBS_SUPPORT */
-+ len = kwsmatch.size[0];
-+ }
-+ }
-+ }
- else
- goto success;
-+next_char:;
-+#ifdef MBS_SUPPORT
-+ /* Advance to next character. For MB_CUR_MAX == 1 case this is handled
-+ by ++beg above. */
-+ if (mb_cur_max > 1)
-+ {
-+ if (using_utf8)
-+ {
-+ unsigned char c = *beg;
-+ if (c >= 0xc2)
-+ {
-+ if (c < 0xe0)
-+ ++beg;
-+ else if (c < 0xf0)
-+ beg += 2;
-+ else if (c < 0xf8)
-+ beg += 3;
-+ else if (c < 0xfc)
-+ beg += 4;
-+ else if (c < 0xfe)
-+ beg += 5;
-+ }
-+ }
-+ else
-+ {
-+ size_t l = mbrlen (beg, buf + size - beg, &mbs);
-+
-+ last_char = beg;
-+ if (l + 2 >= 2)
-+ beg += l - 1;
-+ else
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ }
-+ }
-+#endif /* MBS_SUPPORT */
- }
-
- failure:
-+ return -1;
-+
-+ success:
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-+ if (mb_cur_max > 1 && !using_utf8)
- {
-- if (match_icase)
-- free((char *) buf);
-- if (mb_properties)
-- free(mb_properties);
-+ end = beg + len;
-+ while (end < buf + size)
-+ {
-+ size_t mlen = mbrlen (end, buf + size - end, &mbs);
-+ if (mlen == (size_t) -1 || mlen == (size_t) -2 || mlen == 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ mlen = 1;
-+ }
-+ if (mlen == 1 && *end == eol)
-+ break;
-+
-+ end += mlen;
-+ }
- }
-+ else
- #endif /* MBS_SUPPORT */
-- return -1;
--
-- success:
- end = memchr (beg + len, eol, (buf + size) - (beg + len));
-+
- end++;
- while (buf < beg && beg[-1] != eol)
- --beg;
-@@ -613,15 +1017,6 @@
-
- success_in_beg_and_len:
- *match_size = len;
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- {
-- if (mb_properties)
-- free (mb_properties);
-- if (match_icase)
-- free ((char *) buf);
-- }
--#endif /* MBS_SUPPORT */
- return beg - buf;
- }
-
diff --git a/abs/core/grep/10-dfa-optional.patch b/abs/core/grep/10-dfa-optional.patch
deleted file mode 100644
index 784eba9..0000000
--- a/abs/core/grep/10-dfa-optional.patch
+++ /dev/null
@@ -1,67 +0,0 @@
---- grep-2.5.1a/src/search.c.dfa-optional 2005-01-07 14:58:45.714869815 +0000
-+++ grep-2.5.1a/src/search.c 2005-01-07 14:58:45.725867716 +0000
-@@ -327,12 +327,34 @@
- int backref, start, len;
- struct kwsmatch kwsm;
- size_t i, ret_val;
-+ static int use_dfa;
-+ static int use_dfa_checked = 0;
- #ifdef MBS_SUPPORT
- int mb_cur_max = MB_CUR_MAX;
- mbstate_t mbs;
- memset (&mbs, '\0', sizeof (mbstate_t));
- #endif /* MBS_SUPPORT */
-
-+ if (!use_dfa_checked)
-+ {
-+ char *grep_use_dfa = getenv ("GREP_USE_DFA");
-+ if (!grep_use_dfa)
-+ {
-+#ifdef MBS_SUPPORT
-+ /* Turn off DFA when processing multibyte input. */
-+ use_dfa = (MB_CUR_MAX == 1);
-+#else
-+ use_dfa = 1;
-+#endif /* MBS_SUPPORT */
-+ }
-+ else
-+ {
-+ use_dfa = atoi (grep_use_dfa);
-+ }
-+
-+ use_dfa_checked = 1;
-+ }
-+
- buflim = buf + size;
-
- for (beg = end = buf; end < buflim; beg = end)
-@@ -400,7 +422,8 @@
- #endif /* MBS_SUPPORT */
- (kwsm.index < kwset_exact_matches))
- goto success_in_beg_and_end;
-- if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
-+ if (use_dfa &&
-+ dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
- continue;
- }
- else
-@@ -409,7 +432,9 @@
- #ifdef MBS_SUPPORT
- size_t bytes_left = 0;
- #endif /* MBS_SUPPORT */
-- size_t offset = dfaexec (&dfa, beg, buflim - beg, &backref);
-+ size_t offset = 0;
-+ if (use_dfa)
-+ offset = dfaexec (&dfa, beg, buflim - beg, &backref);
- if (offset == (size_t) -1)
- break;
- /* Narrow down to the line we've found. */
-@@ -451,7 +476,7 @@
- --beg;
- }
- /* Successful, no backreferences encountered! */
-- if (!backref)
-+ if (use_dfa && !backref)
- goto success_in_beg_and_end;
- }
- else
diff --git a/abs/core/grep/11-tests.patch b/abs/core/grep/11-tests.patch
deleted file mode 100644
index 2934a21..0000000
--- a/abs/core/grep/11-tests.patch
+++ /dev/null
@@ -1,138 +0,0 @@
---- grep-2.5.1/tests/Makefile.am.jj 2001-03-07 05:11:27.000000000 +0100
-+++ grep-2.5.1/tests/Makefile.am 2004-12-31 11:42:41.595492300 +0100
-@@ -3,7 +3,8 @@
- AWK=@AWK@
-
- TESTS = warning.sh khadafy.sh spencer1.sh bre.sh ere.sh \
-- status.sh empty.sh options.sh backref.sh file.sh
-+ status.sh empty.sh options.sh backref.sh file.sh \
-+ fmbtest.sh
- EXTRA_DIST = $(TESTS) \
- khadafy.lines khadafy.regexp \
- spencer1.awk spencer1.tests \
---- grep-2.5.1/tests/fmbtest.sh 2004-12-31 13:30:23.942871250 +0100
-+++ grep-2.5.1/tests/fmbtest.sh 2004-12-31 14:09:13.219463855 +0100
-@@ -0,0 +1,111 @@
-+#!/bin/sh
-+
-+: ${srcdir=.}
-+
-+# If cs_CZ.UTF-8 locale doesn't work, skip this test silently
-+LC_ALL=cs_CZ.UTF-8 locale -k LC_CTYPE 2>/dev/null | ${GREP} -q charmap.*UTF-8 \
-+ || exit 77
-+
-+failures=0
-+
-+cat > csinput <<EOF
-+01 Žluťoučká číše
-+ČíŠE 02
-+03 Z číší Čiší cosi
-+04 Čí
-+Še 05
-+06 ČČČČČČČíšČÍŠčíš
-+07 ČČČ ČČČČíšČÍŠčíšEEEE
-+čAs 08
-+09Čapka
-+10ČaSy se měnÍ
-+ČÍšE11
-+Čas12
-+𝇕ČÍšE𝇓13
-+ŽČÍšE𝇓14
-+𝇕ČÍšEŽ15
-+ŽČÍšEŽ16
-+ČÍšE𝇓17
-+ČÍšEŽ18
-+19𝇕ČÍše
-+20ŽČÍše
-+EOF
-+cat > cspatfile <<EOF
-+ČÍšE
-+Čas
-+EOF
-+
-+for mode in F G E; do
-+
-+test1="$(echo `LC_ALL=cs_CZ.UTF-8 ${GREP} -${mode} -f cspatfile csinput \
-+ | LC_ALL=C sed 's/^.*\([0-9][0-9]\).*$/\1/'`)"
-+if test "$test1" != "11 12 13 14 15 16 17 18"; then
-+ echo "Test #1 ${mode} failed: $test1"
-+ failures=1
-+fi
-+
-+test2="$(echo `LC_ALL=cs_CZ.UTF-8 ${GREP} -${mode}i -f cspatfile csinput \
-+ | LC_ALL=C sed 's/^.*\([0-9][0-9]\).*$/\1/'`)"
-+if test "$test2" != "01 02 07 08 10 11 12 13 14 15 16 17 18 19 20"; then
-+ echo "Test #2 ${mode} failed: $test2"
-+ failures=1
-+fi
-+
-+test3="$(echo `LC_ALL=cs_CZ.UTF-8 ${GREP} -${mode}i -e 'ČÍšE' -e 'Čas' csinput \
-+ | LC_ALL=C sed 's/^.*\([0-9][0-9]\).*$/\1/'`)"
-+if test "$test3" != "01 02 07 08 10 11 12 13 14 15 16 17 18 19 20"; then
-+ echo "Test #3 ${mode} failed: $test3"
-+ failures=1
-+fi
-+
-+test4="$(echo `LC_ALL=cs_CZ.UTF-8 ${GREP} -${mode}iw -f cspatfile csinput \
-+ | LC_ALL=C sed 's/^.*\([0-9][0-9]\).*$/\1/'`)"
-+if test "$test4" != "01 02 08 13 17 19"; then
-+ echo "Test #4 ${mode} failed: $test4"
-+ failures=1
-+fi
-+
-+done
-+
-+# Test that -F --color=always prefers longer matches.
-+test5="`echo 'Cosi tu ČišÍ...' \
-+ | LC_ALL=cs_CZ.UTF-8 ${GREP} --color=always -Fi -e 'čiš' -e 'čiší'`"
-+if echo "$test5" | LC_ALL=C ${GREP} -q 'Cosi tu .*\[.*mČišÍ.*\[.*m\(.\[K\)\?\.\.\.'; then
-+ :
-+else
-+ echo "Test #5 F failed: $test5"
-+ failures=1
-+fi
-+
-+for mode in G E; do
-+
-+# Test that -{G,E} --color=always prefers earlier pattern matches.
-+test6="`echo 'Cosi tu ČišÍ...' \
-+ | LC_ALL=cs_CZ.UTF-8 ${GREP} --color=always -${mode}i -e 'čiš' -e 'čiší'`"
-+if echo "$test6" | LC_ALL=C ${GREP} -q 'Cosi tu .*\[.*mČiš.*\[.*m\(.\[K\)\?Í\.\.\.'; then
-+ :
-+else
-+ echo "Test #6 ${mode} failed: $test6"
-+ failures=1
-+fi
-+
-+# Test that -{G,E} --color=always prefers earlier pattern matches.
-+test7="`echo 'Cosi tu ČišÍ...' \
-+ | LC_ALL=cs_CZ.UTF-8 ${GREP} --color=always -${mode}i -e 'čiší' -e 'čiš'`"
-+if echo "$test7" | LC_ALL=C ${GREP} -q 'Cosi tu .*\[.*mČišÍ.*\[.*m\(.\[K\)\?\.\.\.'; then
-+ :
-+else
-+ echo "Test #7 ${mode} failed: $test7"
-+ failures=1
-+fi
-+
-+test8="$(echo `LC_ALL=cs_CZ.UTF-8 ${GREP} -${mode}i -e 'Č.šE' -e 'Č[a-f]s' csinput \
-+ | LC_ALL=C sed 's/^.*\([0-9][0-9]\).*$/\1/'`)"
-+if test "$test8" != "01 02 07 08 10 11 12 13 14 15 16 17 18 19 20"; then
-+ echo "Test #8 ${mode} failed: $test8"
-+ failures=1
-+fi
-+
-+done
-+
-+exit $failures
---- grep-2.5.1/tests/Makefile.in.jj 2004-12-31 11:42:53.000000000 +0100
-+++ grep-2.5.1/tests/Makefile.in 2004-12-31 11:43:36.871514505 +0100
-@@ -97,7 +97,8 @@ install_sh = @install_sh@
- AWK = @AWK@
-
- TESTS = warning.sh khadafy.sh spencer1.sh bre.sh ere.sh \
-- status.sh empty.sh options.sh backref.sh file.sh
-+ status.sh empty.sh options.sh backref.sh file.sh \
-+ fmbtest.sh
-
- EXTRA_DIST = $(TESTS) \
- khadafy.lines khadafy.regexp \
diff --git a/abs/core/grep/12-w.patch b/abs/core/grep/12-w.patch
deleted file mode 100644
index 79ae2ae..0000000
--- a/abs/core/grep/12-w.patch
+++ /dev/null
@@ -1,121 +0,0 @@
---- grep-2.5.1a/src/search.c.w 2006-02-20 14:27:27.000000000 +0000
-+++ grep-2.5.1a/src/search.c 2006-02-20 14:32:07.000000000 +0000
-@@ -507,10 +507,114 @@
- if (match_words)
- while (start >= 0)
- {
-- if ((start == 0 || !WCHAR ((unsigned char) beg[start - 1]))
-- && (len == end - beg - 1
-- || !WCHAR ((unsigned char) beg[start + len])))
-- goto success_in_beg_and_end;
-+ int lword_match = 0;
-+ if (start == 0)
-+ lword_match = 1;
-+ else
-+ {
-+ assert (start > 0);
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1)
-+ {
-+ const char *s;
-+ size_t mr;
-+ wchar_t pwc;
-+
-+ /* Locate the start of the multibyte character
-+ before the match position (== beg + start). */
-+ if (using_utf8)
-+ {
-+ /* UTF-8 is a special case: scan backwards
-+ until we find a 7-bit character or a
-+ lead byte. */
-+ s = beg + start - 1;
-+ while (s > buf
-+ && (unsigned char) *s >= 0x80
-+ && (unsigned char) *s <= 0xbf)
-+ --s;
-+ }
-+ else
-+ {
-+ /* Scan forwards to find the start of the
-+ last complete character before the
-+ match position. */
-+ size_t bytes_left = start - 1;
-+ s = beg;
-+ while (bytes_left > 0)
-+ {
-+ mr = mbrlen (s, bytes_left, &mbs);
-+ if (mr == (size_t) -1 || mr == 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbs));
-+ s++;
-+ bytes_left--;
-+ continue;
-+ }
-+ if (mr == (size_t) -2)
-+ {
-+ memset (&mbs, '\0', sizeof (mbs));
-+ break;
-+ }
-+ s += mr;
-+ bytes_left -= mr;
-+ }
-+ }
-+ mr = mbrtowc (&pwc, s, beg + start - s, &mbs);
-+ if (mr == (size_t) -2 || mr == (size_t) -1 ||
-+ mr == 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ lword_match = 1;
-+ }
-+ else if (!(iswalnum (pwc) || pwc == L'_')
-+ && mr == beg + start - s)
-+ lword_match = 1;
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ if (!WCHAR ((unsigned char) beg[start - 1]))
-+ lword_match = 1;
-+ }
-+
-+ if (lword_match)
-+ {
-+ int rword_match = 0;
-+ if (start + len == end - beg - 1)
-+ rword_match = 1;
-+ else
-+ {
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1)
-+ {
-+ wchar_t nwc;
-+ int mr;
-+
-+ mr = mbtowc (&nwc, beg + start + len,
-+ end - beg - start - len - 1);
-+ if (mr <= 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ rword_match = 1;
-+ }
-+ else if (!iswalnum (nwc) && nwc != L'_')
-+ rword_match = 1;
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ if (!WCHAR ((unsigned char) beg[start + len]))
-+ rword_match = 1;
-+ }
-+
-+ if (rword_match)
-+ {
-+ if (!exact)
-+ /* Returns the whole line. */
-+ goto success_in_beg_and_end;
-+ else
-+ /* Returns just this word match. */
-+ goto success_in_start_and_len;
-+ }
-+ }
- if (len > 0)
- {
- /* Try a shorter length anchored at the same place. */
diff --git a/abs/core/grep/13-P.patch b/abs/core/grep/13-P.patch
deleted file mode 100644
index 9dca4ad..0000000
--- a/abs/core/grep/13-P.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- grep-2.5.1a/src/search.c.P 2006-02-03 14:08:00.000000000 +0000
-+++ grep-2.5.1a/src/search.c 2006-02-03 14:11:20.000000000 +0000
-@@ -1234,8 +1234,9 @@
- char eol = eolbyte;
- if (!exact)
- {
-- end = memchr (end, eol, buflim - end);
-- end++;
-+ while (end < buflim)
-+ if (*end++ == eol)
-+ break;
- while (buf < beg && beg[-1] != eol)
- --beg;
- }
diff --git a/abs/core/grep/14-mem-exhausted.patch b/abs/core/grep/14-mem-exhausted.patch
deleted file mode 100644
index d6a996d..0000000
--- a/abs/core/grep/14-mem-exhausted.patch
+++ /dev/null
@@ -1,15 +0,0 @@
---- grep-2.5.1a/src/grep.c.mem-exhausted 2006-11-22 14:49:35.000000000 +0000
-+++ grep-2.5.1a/src/grep.c 2006-11-22 14:53:12.000000000 +0000
-@@ -299,6 +299,12 @@
- int cc = 1;
- char *readbuf;
- size_t readsize;
-+ const size_t max_save = 200 * 1024 * 1024;
-+
-+ /* Limit the amount of saved data to 200Mb so we don't fail on
-+ * large files. */
-+ if (save > max_save)
-+ save = max_save;
-
- /* Offset from start of buffer to start of old stuff
- that we want to save. */
diff --git a/abs/core/grep/15-empty-pattern.patch b/abs/core/grep/15-empty-pattern.patch
deleted file mode 100644
index acb702a..0000000
--- a/abs/core/grep/15-empty-pattern.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- grep-2.5.1a/src/grep.c.empty-pattern 2006-11-22 19:05:43.000000000 +0000
-+++ grep-2.5.1a/src/grep.c 2006-11-22 19:22:04.000000000 +0000
-@@ -1667,9 +1667,6 @@
- out_invert ^= 1;
- match_lines = match_words = 0;
- }
-- else
-- /* Strip trailing newline. */
-- --keycc;
- }
- else
- if (optind < argc)
---- grep-2.5.1a/src/search.c.empty-pattern 2006-11-22 19:21:11.000000000 +0000
-+++ grep-2.5.1a/src/search.c 2006-11-22 19:35:06.000000000 +0000
-@@ -204,6 +204,10 @@
- motif = sep;
- } while (sep && total != 0);
-
-+ /* Strip trailing newline. */
-+ if (size && pattern[size - 1] == '\n')
-+ size--;
-+
- /* In the match_words and match_lines cases, we use a different pattern
- for the DFA matcher that will quickly throw out cases that won't work.
- Then if DFA succeeds we do some hairy stuff using the regex matcher
-@@ -288,6 +292,10 @@
- motif = sep;
- } while (sep && total != 0);
-
-+ /* Strip trailing newline. */
-+ if (size && pattern[size - 1] == '\n')
-+ size--;
-+
- /* In the match_words and match_lines cases, we use a different pattern
- for the DFA matcher that will quickly throw out cases that won't work.
- Then if DFA succeeds we do some hairy stuff using the regex matcher
diff --git a/abs/core/grep/64-egf-speedup.patch b/abs/core/grep/64-egf-speedup.patch
deleted file mode 100644
index a1fa024..0000000
--- a/abs/core/grep/64-egf-speedup.patch
+++ /dev/null
@@ -1,791 +0,0 @@
---- a/src/search.c.orig
-+++ b/src/search.c
-@@ -18,10 +18,15 @@
-
- /* Written August 1992 by Mike Haertel. */
-
-+#ifndef _GNU_SOURCE
-+# define _GNU_SOURCE 1
-+#endif
- #ifdef HAVE_CONFIG_H
- # include <config.h>
- #endif
-
-+#include <assert.h>
-+
- #include <sys/types.h>
-
- #include "mbsupport.h"
-@@ -43,6 +48,9 @@
- #ifdef HAVE_LIBPCRE
- # include <pcre.h>
- #endif
-+#ifdef HAVE_LANGINFO_CODESET
-+# include <langinfo.h>
-+#endif
-
- #define NCHAR (UCHAR_MAX + 1)
-
-@@ -68,6 +76,19 @@
- error (2, 0, _("memory exhausted"));
- }
-
-+/* UTF-8 encoding allows some optimizations that we can't otherwise
-+ assume in a multibyte encoding. */
-+static int using_utf8;
-+
-+void
-+check_utf8 (void)
-+{
-+#ifdef HAVE_LANGINFO_CODESET
-+ if (strcmp (nl_langinfo (CODESET), "UTF-8") == 0)
-+ using_utf8 = 1;
-+#endif
-+}
-+
- #ifndef FGREP_PROGRAM
- /* DFA compiled regexp. */
- static struct dfa dfa;
-@@ -134,49 +155,6 @@
- }
- #endif /* !FGREP_PROGRAM */
-
--#ifdef MBS_SUPPORT
--/* This function allocate the array which correspond to "buf".
-- Then this check multibyte string and mark on the positions which
-- are not single byte character nor the first byte of a multibyte
-- character. Caller must free the array. */
--static char*
--check_multibyte_string(char const *buf, size_t size)
--{
-- char *mb_properties = xmalloc(size);
-- mbstate_t cur_state;
-- wchar_t wc;
-- int i;
--
-- memset(&cur_state, 0, sizeof(mbstate_t));
-- memset(mb_properties, 0, sizeof(char)*size);
--
-- for (i = 0; i < size ;)
-- {
-- size_t mbclen;
-- mbclen = mbrtowc(&wc, buf + i, size - i, &cur_state);
--
-- if (mbclen == (size_t) -1 || mbclen == (size_t) -2 || mbclen == 0)
-- {
-- /* An invalid sequence, or a truncated multibyte character.
-- We treat it as a single byte character. */
-- mbclen = 1;
-- }
-- else if (match_icase)
-- {
-- if (iswupper((wint_t)wc))
-- {
-- wc = towlower((wint_t)wc);
-- wcrtomb(buf + i, wc, &cur_state);
-- }
-- }
-- mb_properties[i] = mbclen;
-- i += mbclen;
-- }
--
-- return mb_properties;
--}
--#endif /* MBS_SUPPORT */
--
- #if defined(GREP_PROGRAM) || defined(EGREP_PROGRAM)
- #ifdef EGREP_PROGRAM
- COMPILE_FCT(Ecompile)
-@@ -193,6 +171,7 @@
- size_t total = size;
- char const *motif = pattern;
-
-+ check_utf8 ();
- #if 0
- if (match_icase)
- syntax_bits |= RE_ICASE;
-@@ -303,20 +282,9 @@ hunk6
- struct kwsmatch kwsm;
- size_t i, ret_val;
- #ifdef MBS_SUPPORT
-- char *mb_properties = NULL;
-- if (MB_CUR_MAX > 1)
-- {
-- if (match_icase)
-- {
-- char *case_buf = xmalloc(size);
-- memcpy(case_buf, buf, size);
-- if (start_ptr)
-- start_ptr = case_buf + (start_ptr - buf);
-- buf = case_buf;
-- }
-- if (kwset)
-- mb_properties = check_multibyte_string(buf, size);
-- }
-+ int mb_cur_max = MB_CUR_MAX;
-+ mbstate_t mbs;
-+ memset (&mbs, '\0', sizeof (mbstate_t));
- #endif /* MBS_SUPPORT */
-
- buflim = buf + size;
-@@ -329,21 +282,63 @@ hunk6
- if (kwset)
- {
- /* Find a possible match using the KWset matcher. */
-- size_t offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
-+#ifdef MBS_SUPPORT
-+ size_t bytes_left = 0;
-+#endif /* MBS_SUPPORT */
-+ size_t offset;
-+#ifdef MBS_SUPPORT
-+ /* kwsexec doesn't work with match_icase and multibyte input. */
-+ if (match_icase && mb_cur_max > 1)
-+ /* Avoid kwset */
-+ offset = 0;
-+ else
-+#endif /* MBS_SUPPORT */
-+ offset = kwsexec (kwset, beg, buflim - beg, &kwsm);
- if (offset == (size_t) -1)
-- goto failure;
-+ return (size_t)-1;
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ /* Offset points inside multibyte character:
-+ * no good. */
-+ break;
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
- beg += offset;
- /* Narrow down to the line containing the candidate, and
- run it through DFA. */
- end = memchr(beg, eol, buflim - beg);
- end++;
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && mb_properties[beg - buf] == 0)
-+ if (mb_cur_max > 1 && bytes_left)
- continue;
- #endif
- while (beg > buf && beg[-1] != eol)
- --beg;
-- if (kwsm.index < kwset_exact_matches)
-+ if (
-+#ifdef MBS_SUPPORT
-+ !(match_icase && mb_cur_max > 1) &&
-+#endif /* MBS_SUPPORT */
-+ (kwsm.index < kwset_exact_matches))
- goto success;
- if (dfaexec (&dfa, beg, end - beg, &backref) == (size_t) -1)
- continue;
-@@ -351,13 +363,47 @@
- else
- {
- /* No good fixed strings; start with DFA. */
-+#ifdef MBS_SUPPORT
-+ size_t bytes_left = 0;
-+#endif /* MBS_SUPPORT */
- size_t offset = dfaexec (&dfa, beg, buflim - beg, &backref);
- if (offset == (size_t) -1)
- break;
- /* Narrow down to the line we've found. */
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ /* Offset points inside multibyte character:
-+ * no good. */
-+ break;
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
- beg += offset;
- end = memchr (beg, eol, buflim - beg);
- end++;
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && bytes_left)
-+ continue;
-+#endif /* MBS_SUPPORT */
- while (beg > buf && beg[-1] != eol)
- --beg;
- }
-@@ -475,24 +521,144 @@
- *match_size = len;
- ret_val = beg - buf;
- out:
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- {
-- if (match_icase)
-- free((char*)buf);
-- if (mb_properties)
-- free(mb_properties);
-- }
--#endif /* MBS_SUPPORT */
- return ret_val;
- }
- #endif /* defined(GREP_PROGRAM) || defined(EGREP_PROGRAM) */
-
-+#ifdef MBS_SUPPORT
-+static int f_i_multibyte; /* whether we're using the new -Fi MB method */
-+static struct
-+{
-+ wchar_t **patterns;
-+ size_t count, maxlen;
-+ unsigned char *match;
-+} Fimb;
-+#endif
-+
- #if defined(GREP_PROGRAM) || defined(FGREP_PROGRAM)
- COMPILE_FCT(Fcompile)
- {
-+ int mb_cur_max = MB_CUR_MAX;
- char const *beg, *lim, *err;
-
-+ check_utf8 ();
-+#ifdef MBS_SUPPORT
-+ /* Support -F -i for UTF-8 input. */
-+ if (match_icase && mb_cur_max > 1)
-+ {
-+ mbstate_t mbs;
-+ wchar_t *wcpattern = xmalloc ((size + 1) * sizeof (wchar_t));
-+ const char *patternend = pattern;
-+ size_t wcsize;
-+ kwset_t fimb_kwset = NULL;
-+ char *starts = NULL;
-+ wchar_t *wcbeg, *wclim;
-+ size_t allocated = 0;
-+
-+ memset (&mbs, '\0', sizeof (mbs));
-+# ifdef __GNU_LIBRARY__
-+ wcsize = mbsnrtowcs (wcpattern, &patternend, size, size, &mbs);
-+ if (patternend != pattern + size)
-+ wcsize = (size_t) -1;
-+# else
-+ {
-+ char *patterncopy = xmalloc (size + 1);
-+
-+ memcpy (patterncopy, pattern, size);
-+ patterncopy[size] = '\0';
-+ patternend = patterncopy;
-+ wcsize = mbsrtowcs (wcpattern, &patternend, size, &mbs);
-+ if (patternend != patterncopy + size)
-+ wcsize = (size_t) -1;
-+ free (patterncopy);
-+ }
-+# endif
-+ if (wcsize + 2 <= 2)
-+ {
-+fimb_fail:
-+ free (wcpattern);
-+ free (starts);
-+ if (fimb_kwset)
-+ kwsfree (fimb_kwset);
-+ free (Fimb.patterns);
-+ Fimb.patterns = NULL;
-+ }
-+ else
-+ {
-+ if (!(fimb_kwset = kwsalloc (NULL)))
-+ error (2, 0, _("memory exhausted"));
-+
-+ starts = xmalloc (mb_cur_max * 3);
-+ wcbeg = wcpattern;
-+ do
-+ {
-+ int i;
-+ size_t wclen;
-+
-+ if (Fimb.count >= allocated)
-+ {
-+ if (allocated == 0)
-+ allocated = 128;
-+ else
-+ allocated *= 2;
-+ Fimb.patterns = xrealloc (Fimb.patterns,
-+ sizeof (wchar_t *) * allocated);
-+ }
-+ Fimb.patterns[Fimb.count++] = wcbeg;
-+ for (wclim = wcbeg;
-+ wclim < wcpattern + wcsize && *wclim != L'\n'; ++wclim)
-+ *wclim = towlower (*wclim);
-+ *wclim = L'\0';
-+ wclen = wclim - wcbeg;
-+ if (wclen > Fimb.maxlen)
-+ Fimb.maxlen = wclen;
-+ if (wclen > 3)
-+ wclen = 3;
-+ if (wclen == 0)
-+ {
-+ if ((err = kwsincr (fimb_kwset, "", 0)) != 0)
-+ error (2, 0, err);
-+ }
-+ else
-+ for (i = 0; i < (1 << wclen); i++)
-+ {
-+ char *p = starts;
-+ int j, k;
-+
-+ for (j = 0; j < wclen; ++j)
-+ {
-+ wchar_t wc = wcbeg[j];
-+ if (i & (1 << j))
-+ {
-+ wc = towupper (wc);
-+ if (wc == wcbeg[j])
-+ continue;
-+ }
-+ k = wctomb (p, wc);
-+ if (k <= 0)
-+ goto fimb_fail;
-+ p += k;
-+ }
-+ if ((err = kwsincr (fimb_kwset, starts, p - starts)) != 0)
-+ error (2, 0, err);
-+ }
-+ if (wclim < wcpattern + wcsize)
-+ ++wclim;
-+ wcbeg = wclim;
-+ }
-+ while (wcbeg < wcpattern + wcsize);
-+ f_i_multibyte = 1;
-+ kwset = fimb_kwset;
-+ free (starts);
-+ Fimb.match = xmalloc (Fimb.count);
-+ if ((err = kwsprep (kwset)) != 0)
-+ error (2, 0, err);
-+ return;
-+ }
-+ }
-+#endif /* MBS_SUPPORT */
-+
-+
- kwsinit ();
- beg = pattern;
- do
-@@ -511,6 +677,76 @@
- error (2, 0, err);
- }
-
-+#ifdef MBS_SUPPORT
-+static int
-+Fimbexec (const char *buf, size_t size, size_t *plen, int exact)
-+{
-+ size_t len, letter, i;
-+ int ret = -1;
-+ mbstate_t mbs;
-+ wchar_t wc;
-+ int patterns_left;
-+
-+ assert (match_icase && f_i_multibyte == 1);
-+ assert (MB_CUR_MAX > 1);
-+
-+ memset (&mbs, '\0', sizeof (mbs));
-+ memset (Fimb.match, '\1', Fimb.count);
-+ letter = len = 0;
-+ patterns_left = 1;
-+ while (patterns_left && len <= size)
-+ {
-+ size_t c;
-+
-+ patterns_left = 0;
-+ if (len < size)
-+ {
-+ c = mbrtowc (&wc, buf + len, size - len, &mbs);
-+ if (c + 2 <= 2)
-+ return ret;
-+
-+ wc = towlower (wc);
-+ }
-+ else
-+ {
-+ c = 1;
-+ wc = L'\0';
-+ }
-+
-+ for (i = 0; i < Fimb.count; i++)
-+ {
-+ if (Fimb.match[i])
-+ {
-+ if (Fimb.patterns[i][letter] == L'\0')
-+ {
-+ /* Found a match. */
-+ *plen = len;
-+ if (!exact && !match_words)
-+ return 0;
-+ else
-+ {
-+ /* For -w or exact look for longest match. */
-+ ret = 0;
-+ Fimb.match[i] = '\0';
-+ continue;
-+ }
-+ }
-+
-+ if (Fimb.patterns[i][letter] == wc)
-+ patterns_left = 1;
-+ else
-+ Fimb.match[i] = '\0';
-+ }
-+ }
-+
-+ len += c;
-+ letter++;
-+ }
-+
-+ return ret;
-+}
-+#endif /* MBS_SUPPORT */
-+
- EXECUTE_FCT(Fexecute)
- {
- register char const *beg, *try, *end;
-@@ -519,69 +755,256 @@
- struct kwsmatch kwsmatch;
- size_t ret_val;
- #ifdef MBS_SUPPORT
-- char *mb_properties = NULL;
-- if (MB_CUR_MAX > 1)
-- {
-- if (match_icase)
-- {
-- char *case_buf = xmalloc(size);
-- memcpy(case_buf, buf, size);
-- if (start_ptr)
-- start_ptr = case_buf + (start_ptr - buf);
-- buf = case_buf;
-- }
-- mb_properties = check_multibyte_string(buf, size);
-- }
-+ int mb_cur_max = MB_CUR_MAX;
-+ mbstate_t mbs;
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ const char *last_char = NULL;
- #endif /* MBS_SUPPORT */
-
- for (beg = start_ptr ? start_ptr : buf; beg <= buf + size; beg++)
- {
- size_t offset = kwsexec (kwset, beg, buf + size - beg, &kwsmatch);
- if (offset == (size_t) -1)
-- goto failure;
-+ return offset;
- #ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1 && mb_properties[offset+beg-buf] == 0)
-- continue; /* It is a part of multibyte character. */
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ size_t bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+ last_char = beg;
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ /* Offset points inside multibyte character: no good. */
-+ break;
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+
-+ if (bytes_left)
-+ continue;
-+ }
-+ else
- #endif /* MBS_SUPPORT */
- beg += offset;
-+#ifdef MBS_SUPPORT
-+ /* For f_i_multibyte, the string at beg now matches first 3 chars of
-+ one of the search strings (less if there are shorter search strings).
-+ See if this is a real match. */
-+ if (f_i_multibyte
-+ && Fimbexec (beg, buf + size - beg, &kwsmatch.size[0], start_ptr == NULL))
-+ goto next_char;
-+#endif /* MBS_SUPPORT */
- len = kwsmatch.size[0];
- if (start_ptr && !match_words)
- goto success_in_beg_and_len;
- if (match_lines)
- {
- if (beg > buf && beg[-1] != eol)
-- continue;
-+ goto next_char;
- if (beg + len < buf + size && beg[len] != eol)
-- continue;
-+ goto next_char;
- goto success;
- }
- else if (match_words)
-- for (try = beg; len; )
-- {
-- if (try > buf && WCHAR((unsigned char) try[-1]))
-- break;
-- if (try + len < buf + size && WCHAR((unsigned char) try[len]))
-- {
-- offset = kwsexec (kwset, beg, --len, &kwsmatch);
-- if (offset == (size_t) -1)
-- break;
-- try = beg + offset;
-- len = kwsmatch.size[0];
-- }
-- else if (!start_ptr)
-- goto success;
-- else
-- goto success_in_beg_and_len;
-- } /* for (try) */
-- else
-- goto success;
-- } /* for (beg in buf) */
-+ {
-+ while (len)
-+ {
-+ int word_match = 0;
-+ if (beg > buf)
-+ {
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1)
-+ {
-+ const char *s;
-+ int mr;
-+ wchar_t pwc;
-+
-+ if (using_utf8)
-+ {
-+ s = beg - 1;
-+ while (s > buf
-+ && (unsigned char) *s >= 0x80
-+ && (unsigned char) *s <= 0xbf)
-+ --s;
-+ }
-+ else
-+ s = last_char;
-+ mr = mbtowc (&pwc, s, beg - s);
-+ if (mr <= 0)
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ else if ((iswalnum (pwc) || pwc == L'_')
-+ && mr == (int) (beg - s))
-+ goto next_char;
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ if (WCHAR ((unsigned char) beg[-1]))
-+ goto next_char;
-+ }
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1)
-+ {
-+ wchar_t nwc;
-+ int mr;
-
-- failure:
-- ret_val = -1;
-- goto out;
-+ mr = mbtowc (&nwc, beg + len, buf + size - beg - len);
-+ if (mr <= 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ word_match = 1;
-+ }
-+ else if (!iswalnum (nwc) && nwc != L'_')
-+ word_match = 1;
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ if (beg + len >= buf + size || !WCHAR ((unsigned char) beg[len]))
-+ word_match = 1;
-+ if (word_match)
-+ {
-+ if (start_ptr == NULL)
-+ /* Returns the whole line now we know there's a word match. */
-+ goto success;
-+ else {
-+ /* Returns just this word match. */
-+ *match_size = len;
-+ return beg - buf;
-+ }
-+ }
-+ if (len > 0)
-+ {
-+ /* Try a shorter length anchored at the same place. */
-+ --len;
-+ offset = kwsexec (kwset, beg, len, &kwsmatch);
-+
-+ if (offset == -1)
-+ goto next_char; /* Try a different anchor. */
-+#ifdef MBS_SUPPORT
-+
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ size_t bytes_left = offset;
-+ while (bytes_left)
-+ {
-+ size_t mlen = mbrlen (beg, bytes_left, &mbs);
-+
-+ last_char = beg;
-+ if (mlen == (size_t) -1 || mlen == 0)
-+ {
-+ /* Incomplete character: treat as single-byte. */
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ beg++;
-+ bytes_left--;
-+ continue;
-+ }
-+
-+ if (mlen == (size_t) -2)
-+ {
-+ /* Offset points inside multibyte character:
-+ * no good. */
-+ break;
-+ }
-+
-+ beg += mlen;
-+ bytes_left -= mlen;
-+ }
-+
-+ if (bytes_left)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ goto next_char; /* Try a different anchor. */
-+ }
-+ }
-+ else
-+#endif /* MBS_SUPPORT */
-+ beg += offset;
-+#ifdef MBS_SUPPORT
-+ /* The string at beg now matches first 3 chars of one of
-+ the search strings (less if there are shorter search
-+ strings). See if this is a real match. */
-+ if (f_i_multibyte
-+ && Fimbexec (beg, len - offset, &kwsmatch.size[0],
-+ start_ptr == NULL))
-+ goto next_char;
-+#endif /* MBS_SUPPORT */
-+ len = kwsmatch.size[0];
-+ }
-+ }
-+ }
-+ else
-+ goto success;
-+next_char:;
-+#ifdef MBS_SUPPORT
-+ /* Advance to next character. For MB_CUR_MAX == 1 case this is handled
-+ by ++beg above. */
-+ if (mb_cur_max > 1)
-+ {
-+ if (using_utf8)
-+ {
-+ unsigned char c = *beg;
-+ if (c >= 0xc2)
-+ {
-+ if (c < 0xe0)
-+ ++beg;
-+ else if (c < 0xf0)
-+ beg += 2;
-+ else if (c < 0xf8)
-+ beg += 3;
-+ else if (c < 0xfc)
-+ beg += 4;
-+ else if (c < 0xfe)
-+ beg += 5;
-+ }
-+ }
-+ else
-+ {
-+ size_t l = mbrlen (beg, buf + size - beg, &mbs);
-+
-+ last_char = beg;
-+ if (l + 2 >= 2)
-+ beg += l - 1;
-+ else
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ }
-+ }
-+#endif /* MBS_SUPPORT */
-+ }
-+
-+ return -1;
-
- success:
-+#ifdef MBS_SUPPORT
-+ if (mb_cur_max > 1 && !using_utf8)
-+ {
-+ end = beg + len;
-+ while (end < buf + size)
-+ {
-+ size_t mlen = mbrlen (end, buf + size - end, &mbs);
-+ if (mlen == (size_t) -1 || mlen == (size_t) -2 || mlen == 0)
-+ {
-+ memset (&mbs, '\0', sizeof (mbstate_t));
-+ mlen = 1;
-+ }
-+ if (mlen == 1 && *end == eol)
-+ break;
-+
-+ end += mlen;
-+ }
-+ }
-+ else
-+ #endif /* MBS_SUPPORT */
- end = memchr (beg + len, eol, (buf + size) - (beg + len));
- end++;
- while (buf < beg && beg[-1] != eol)
-@@ -591,15 +1016,6 @@
- *match_size = len;
- ret_val = beg - buf;
- out:
--#ifdef MBS_SUPPORT
-- if (MB_CUR_MAX > 1)
-- {
-- if (match_icase)
-- free((char*)buf);
-- if (mb_properties)
-- free(mb_properties);
-- }
--#endif /* MBS_SUPPORT */
- return ret_val;
- }
- #endif /* defined(GREP_PROGRAM) || defined(FGREP_PROGRAM) */
diff --git a/abs/core/groff/man-utf8.tmac b/abs/core/groff/man-utf8.tmac
deleted file mode 100644
index 17c0983..0000000
--- a/abs/core/groff/man-utf8.tmac
+++ /dev/null
@@ -1,9 +0,0 @@
-.\" This file is loaded after an-old.tmac.
-.\" Put any local modifications to an-old.tmac here.
-
-.if '\*[.T]'utf8' \
-. char \- \N'45'
-. char - \N'45'
-. char ' \N'39'
-..
-
diff --git a/abs/core/gzip/gzip-fixpaths.patch b/abs/core/gzip/gzip-fixpaths.patch
deleted file mode 100644
index c95dc67..0000000
--- a/abs/core/gzip/gzip-fixpaths.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-diff -Naur gzip-1.2.4a-orig/Makefile.in gzip-1.2.4a/Makefile.in
---- gzip-1.2.4a-orig/Makefile.in 1993-08-17 10:12:40.000000000 -0700
-+++ gzip-1.2.4a/Makefile.in 2005-04-21 11:45:27.000000000 -0700
-@@ -348,27 +348,27 @@
- rm -f _match.s
-
- $(G)zdiff: zdiff.in
-- sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zdiff.in > $@
-+ sed -e "$(SEDCMD)" -e "s|BINDIR|/bin|" $(srcdir)/zdiff.in > $@
- chmod 755 $@
-
- $(G)zgrep: zgrep.in
-- sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zgrep.in > $@
-+ sed -e "$(SEDCMD)" -e "s|BINDIR|/bin|" $(srcdir)/zgrep.in > $@
- chmod 755 $@
-
- $(G)zmore: zmore.in
-- sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zmore.in > $@
-+ sed -e "$(SEDCMD)" -e "s|BINDIR|/bin|" $(srcdir)/zmore.in > $@
- chmod 755 $@
-
- $(G)znew: znew.in
-- sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/znew.in > $@
-+ sed -e "$(SEDCMD)" -e "s|BINDIR|/bin|" $(srcdir)/znew.in > $@
- chmod 755 $@
-
- $(G)zforce: zforce.in
-- sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/zforce.in > $@
-+ sed -e "$(SEDCMD)" -e "s|BINDIR|/bin|" $(srcdir)/zforce.in > $@
- chmod 755 $@
-
- gzexe: gzexe.in
-- sed -e "$(SEDCMD)" -e "s|BINDIR|$(bindir)|" $(srcdir)/gzexe.in > $@
-+ sed -e "$(SEDCMD)" -e "s|BINDIR|/bin|" $(srcdir)/gzexe.in > $@
- chmod 755 $@
-
- gzip.info: gzip.texi
diff --git a/abs/core/gzip/gzip-fixutimens.patch b/abs/core/gzip/gzip-fixutimens.patch
deleted file mode 100644
index a78aa79..0000000
--- a/abs/core/gzip/gzip-fixutimens.patch
+++ /dev/null
@@ -1,36 +0,0 @@
---- gzip-1.3.12.orig/gzip.c
-+++ gzip-1.3.12/gzip.c
-@@ -1637,7 +1642,7 @@
- }
- }
-
-- if (futimens (ofd, ofname, timespec) != 0)
-+ if (gz_futimens (ofd, ofname, timespec) != 0)
- {
- int e = errno;
- WARN ((stderr, "%s: ", program_name));
---- gzip-1.3.12.orig/lib/utimens.h
-+++ gzip-1.3.12/lib/utimens.h
-@@ -1,3 +1,3 @@
- #include <time.h>
--int futimens (int, char const *, struct timespec const [2]);
-+int gz_futimens (int, char const *, struct timespec const [2]);
- int utimens (char const *, struct timespec const [2]);
---- gzip-1.3.12.orig/lib/utimens.c
-+++ gzip-1.3.12/lib/utimens.c
-@@ -75,7 +75,7 @@
- Return 0 on success, -1 (setting errno) on failure. */
-
- int
--futimens (int fd ATTRIBUTE_UNUSED,
-+gz_futimens (int fd ATTRIBUTE_UNUSED,
- char const *file, struct timespec const timespec[2])
- {
- /* Some Linux-based NFS clients are buggy, and mishandle time stamps
-@@ -185,5 +185,5 @@
- int
- utimens (char const *file, struct timespec const timespec[2])
- {
-- return futimens (-1, file, timespec);
-+ return gz_futimens (-1, file, timespec);
- }
diff --git a/abs/core/gzip/gzip-security-update.patch b/abs/core/gzip/gzip-security-update.patch
deleted file mode 100644
index 2fff599..0000000
--- a/abs/core/gzip/gzip-security-update.patch
+++ /dev/null
@@ -1,186 +0,0 @@
-Only in gzip-1.3.5: cscope.out
-diff -ru gzip-1.3.5.orig/gzip.h gzip-1.3.5/gzip.h
---- gzip-1.3.5.orig/gzip.h 2001-10-01 07:53:41.000000000 +0100
-+++ gzip-1.3.5/gzip.h 2006-08-18 22:44:38.755598000 +0100
-@@ -198,6 +198,8 @@
- extern int to_stdout; /* output to stdout (-c) */
- extern int save_orig_name; /* set if original name must be saved */
-
-+#define MIN(a,b) ((a) <= (b) ? (a) : (b))
-+
- #define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(0))
- #define try_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf(1))
-
-diff -ru gzip-1.3.5.orig/inflate.c gzip-1.3.5/inflate.c
---- gzip-1.3.5.orig/inflate.c 2002-09-25 22:20:13.000000000 +0100
-+++ gzip-1.3.5/inflate.c 2006-07-21 09:10:43.350376000 +0100
-@@ -337,7 +337,7 @@
- {
- *t = (struct huft *)NULL;
- *m = 0;
-- return 0;
-+ return 2;
- }
-
-
-Only in gzip-1.3.5: testcases
-diff -ru gzip-1.3.5.orig/unlzh.c gzip-1.3.5/unlzh.c
---- gzip-1.3.5.orig/unlzh.c 1999-10-06 06:00:00.000000000 +0100
-+++ gzip-1.3.5/unlzh.c 2006-08-18 22:56:19.446997000 +0100
-@@ -149,13 +149,17 @@
- unsigned i, k, len, ch, jutbits, avail, nextcode, mask;
-
- for (i = 1; i <= 16; i++) count[i] = 0;
-- for (i = 0; i < (unsigned)nchar; i++) count[bitlen[i]]++;
-+ for (i = 0; i < (unsigned)nchar; i++) {
-+ if (bitlen[i] > 16)
-+ error("Bad table (case a)\n");
-+ else count[bitlen[i]]++;
-+ }
-
- start[1] = 0;
- for (i = 1; i <= 16; i++)
- start[i + 1] = start[i] + (count[i] << (16 - i));
-- if ((start[17] & 0xffff) != 0)
-- error("Bad table\n");
-+ if ((start[17] & 0xffff) != 0 || tablebits > 16) /* 16 for weight below */
-+ error("Bad table (case b)\n");
-
- jutbits = 16 - tablebits;
- for (i = 1; i <= (unsigned)tablebits; i++) {
-@@ -169,15 +173,15 @@
-
- i = start[tablebits + 1] >> jutbits;
- if (i != 0) {
-- k = 1 << tablebits;
-- while (i != k) table[i++] = 0;
-+ k = MIN(1 << tablebits, DIST_BUFSIZE);
-+ while (i < k) table[i++] = 0;
- }
-
- avail = nchar;
- mask = (unsigned) 1 << (15 - tablebits);
- for (ch = 0; ch < (unsigned)nchar; ch++) {
- if ((len = bitlen[ch]) == 0) continue;
-- nextcode = start[len] + weight[len];
-+ nextcode = MIN(start[len] + weight[len], DIST_BUFSIZE);
- if (len <= (unsigned)tablebits) {
- for (i = start[len]; i < nextcode; i++) table[i] = ch;
- } else {
-@@ -218,7 +222,7 @@
- for (i = 0; i < 256; i++) pt_table[i] = c;
- } else {
- i = 0;
-- while (i < n) {
-+ while (i < MIN(n,NPT)) {
- c = bitbuf >> (BITBUFSIZ - 3);
- if (c == 7) {
- mask = (unsigned) 1 << (BITBUFSIZ - 1 - 3);
-@@ -228,7 +232,7 @@
- pt_len[i++] = c;
- if (i == i_special) {
- c = getbits(2);
-- while (--c >= 0) pt_len[i++] = 0;
-+ while (--c >= 0 && i < NPT) pt_len[i++] = 0;
- }
- }
- while (i < nn) pt_len[i++] = 0;
-@@ -248,7 +252,7 @@
- for (i = 0; i < 4096; i++) c_table[i] = c;
- } else {
- i = 0;
-- while (i < n) {
-+ while (i < MIN(n,NC)) {
- c = pt_table[bitbuf >> (BITBUFSIZ - 8)];
- if (c >= NT) {
- mask = (unsigned) 1 << (BITBUFSIZ - 1 - 8);
-@@ -256,14 +260,14 @@
- if (bitbuf & mask) c = right[c];
- else c = left [c];
- mask >>= 1;
-- } while (c >= NT);
-+ } while (c >= NT && (mask || c != left[c]));
- }
- fillbuf((int) pt_len[c]);
- if (c <= 2) {
- if (c == 0) c = 1;
- else if (c == 1) c = getbits(4) + 3;
- else c = getbits(CBIT) + 20;
-- while (--c >= 0) c_len[i++] = 0;
-+ while (--c >= 0 && i < NC) c_len[i++] = 0;
- } else c_len[i++] = c - 2;
- }
- while (i < NC) c_len[i++] = 0;
-@@ -292,7 +296,7 @@
- if (bitbuf & mask) j = right[j];
- else j = left [j];
- mask >>= 1;
-- } while (j >= NC);
-+ } while (j >= NC && (mask || j != left[j]));
- }
- fillbuf((int) c_len[j]);
- return j;
-@@ -309,7 +313,7 @@
- if (bitbuf & mask) j = right[j];
- else j = left [j];
- mask >>= 1;
-- } while (j >= NP);
-+ } while (j >= NP && (mask || j != left[j]));
- }
- fillbuf((int) pt_len[j]);
- if (j != 0) j = ((unsigned) 1 << (j - 1)) + getbits((int) (j - 1));
-@@ -356,7 +360,7 @@
- while (--j >= 0) {
- buffer[r] = buffer[i];
- i = (i + 1) & (DICSIZ - 1);
-- if (++r == count) return r;
-+ if (++r >= count) return r;
- }
- for ( ; ; ) {
- c = decode_c();
-@@ -366,14 +370,14 @@
- }
- if (c <= UCHAR_MAX) {
- buffer[r] = c;
-- if (++r == count) return r;
-+ if (++r >= count) return r;
- } else {
- j = c - (UCHAR_MAX + 1 - THRESHOLD);
- i = (r - decode_p() - 1) & (DICSIZ - 1);
- while (--j >= 0) {
- buffer[r] = buffer[i];
- i = (i + 1) & (DICSIZ - 1);
-- if (++r == count) return r;
-+ if (++r >= count) return r;
- }
- }
- }
-diff -ru gzip-1.3.5.orig/unpack.c gzip-1.3.5/unpack.c
---- gzip-1.3.5.orig/unpack.c 1999-10-06 06:00:00.000000000 +0100
-+++ gzip-1.3.5/unpack.c 2006-07-21 15:49:48.615190000 +0100
-@@ -13,7 +13,6 @@
- #include "gzip.h"
- #include "crypt.h"
-
--#define MIN(a,b) ((a) <= (b) ? (a) : (b))
- /* The arguments must not have side effects. */
-
- #define MAX_BITLEN 25
-@@ -133,7 +132,7 @@
- /* Remember where the literals of this length start in literal[] : */
- lit_base[len] = base;
- /* And read the literals: */
-- for (n = leaves[len]; n > 0; n--) {
-+ for (n = leaves[len]; n > 0 && base < LITERALS; n--) {
- literal[base++] = (uch)get_byte();
- }
- }
-@@ -169,7 +168,7 @@
- prefixp = &prefix_len[1<<peek_bits];
- for (len = 1; len <= peek_bits; len++) {
- int prefixes = leaves[len] << (peek_bits-len); /* may be 0 */
-- while (prefixes--) *--prefixp = (uch)len;
-+ while (prefixes-- && prefixp > prefix_len) *--prefixp = (uch)len;
- }
- /* The length of all other codes is unknown: */
- while (prefixp > prefix_len) *--prefixp = 0;
diff --git a/abs/core/iproute2/iproute2-2.4.7-now-ss020116.patch b/abs/core/iproute2/iproute2-2.4.7-now-ss020116.patch
deleted file mode 100644
index 0e37865..0000000
--- a/abs/core/iproute2/iproute2-2.4.7-now-ss020116.patch
+++ /dev/null
@@ -1,9823 +0,0 @@
-diff -Naur iproute2-orig/Makefile iproute2/Makefile
---- iproute2-orig/Makefile 2002-01-15 15:30:32.000000000 -0800
-+++ iproute2/Makefile 2004-05-21 00:16:36.000000000 -0700
-@@ -4,8 +4,6 @@
- CONFDIR=/etc/iproute2
- DOCDIR=/usr/doc/iproute2
-
--KERNEL_INCLUDE=/usr/src/linux/include
--LIBC_INCLUDE=/usr/include
-
- DEFINES= -DRESOLVE_HOSTNAMES
-
-@@ -23,19 +21,11 @@
- #options for ipx
- ADDLIB+=ipx_ntop.o ipx_pton.o
-
--ifeq ($(LIBC_INCLUDE)/socketbits.h,$(wildcard $(LIBC_INCLUDE)/socketbits.h))
-- ifeq ($(LIBC_INCLUDE)/net/if_packet.h,$(wildcard $(LIBC_INCLUDE)/net/if_packet.h))
-- GLIBCFIX=-I../include-glibc -include ../include-glibc/glibc-bugs.h
-- endif
--endif
--ifeq ($(LIBC_INCLUDE)/bits/socket.h,$(wildcard $(LIBC_INCLUDE)/bits/socket.h))
-- GLIBCFIX=-I../include-glibc -I/usr/include/db3 -include ../include-glibc/glibc-bugs.h
--endif
-
-
- CC = gcc
- CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g
--CFLAGS = $(CCOPTS) $(GLIBCFIX) -I$(KERNEL_INCLUDE) -I../include $(DEFINES)
-+CFLAGS = $(CCOPTS) -I../include $(DEFINES)
-
- LDLIBS += -L../lib -lnetlink -lutil
-
-@@ -43,19 +33,11 @@
-
- LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
-
--all: check-kernel
-+all:
- @set -e; \
- for i in $(SUBDIRS); \
- do $(MAKE) -C $$i; done
-
--check-kernel:
--ifeq ($(KERNEL_INCLUDE),)
-- @echo "Please, set correct KERNEL_INCLUDE"; false
--else
-- @set -e; \
-- if [ ! -r $(KERNEL_INCLUDE)/linux/autoconf.h ]; then \
-- echo "Please, compile the kernel first"; false; fi
--endif
-
- install: all
- install -m 0755 -d $(DESTDIR)$(SBINDIR)
-diff -Naur iproute2-orig/Makefile~ iproute2/Makefile~
---- iproute2-orig/Makefile~ 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/Makefile~ 2002-01-15 15:30:32.000000000 -0800
-@@ -0,0 +1,77 @@
-+# Path to parent kernel include files directory
-+DESTDIR=
-+SBINDIR=/sbin
-+CONFDIR=/etc/iproute2
-+DOCDIR=/usr/doc/iproute2
-+
-+KERNEL_INCLUDE=/usr/src/linux/include
-+LIBC_INCLUDE=/usr/include
-+
-+DEFINES= -DRESOLVE_HOSTNAMES
-+
-+#options if you have a bind>=4.9.4 libresolv (or, maybe, glibc)
-+LDLIBS=-lresolv
-+ADDLIB=
-+
-+#options if you compile with libc5, and without a bind>=4.9.4 libresolv
-+#LDLIBS=
-+#ADDLIB=inet_ntop.o inet_pton.o
-+
-+#options for decnet
-+ADDLIB+=dnet_ntop.o dnet_pton.o
-+
-+#options for ipx
-+ADDLIB+=ipx_ntop.o ipx_pton.o
-+
-+ifeq ($(LIBC_INCLUDE)/socketbits.h,$(wildcard $(LIBC_INCLUDE)/socketbits.h))
-+ ifeq ($(LIBC_INCLUDE)/net/if_packet.h,$(wildcard $(LIBC_INCLUDE)/net/if_packet.h))
-+ GLIBCFIX=-I../include-glibc -include ../include-glibc/glibc-bugs.h
-+ endif
-+endif
-+ifeq ($(LIBC_INCLUDE)/bits/socket.h,$(wildcard $(LIBC_INCLUDE)/bits/socket.h))
-+ GLIBCFIX=-I../include-glibc -I/usr/include/db3 -include ../include-glibc/glibc-bugs.h
-+endif
-+
-+
-+CC = gcc
-+CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g
-+CFLAGS = $(CCOPTS) $(GLIBCFIX) -I$(KERNEL_INCLUDE) -I../include $(DEFINES)
-+
-+LDLIBS += -L../lib -lnetlink -lutil
-+
-+SUBDIRS=lib ip tc misc
-+
-+LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
-+
-+all: check-kernel
-+ @set -e; \
-+ for i in $(SUBDIRS); \
-+ do $(MAKE) -C $$i; done
-+
-+check-kernel:
-+ifeq ($(KERNEL_INCLUDE),)
-+ @echo "Please, set correct KERNEL_INCLUDE"; false
-+else
-+ @set -e; \
-+ if [ ! -r $(KERNEL_INCLUDE)/linux/autoconf.h ]; then \
-+ echo "Please, compile the kernel first"; false; fi
-+endif
-+
-+install: all
-+ install -m 0755 -d $(DESTDIR)$(SBINDIR)
-+ install -m 0755 -d $(DESTDIR)$(CONFDIR)
-+ install -m 0755 -d $(DESTDIR)$(DOCDIR)/examples
-+ install -m 0755 -d $(DESTDIR)$(DOCDIR)/examples/diffserv
-+ install -m 0644 README.iproute2+tc $(shell find examples -type f -maxdepth 1) $(DESTDIR)$(DOCDIR)/examples
-+ install -m 0644 $(shell echo examples/diffserv/*) $(DESTDIR)$(DOCDIR)/examples/diffserv
-+ @for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done
-+ @cd etc/iproute2; for i in *; do \
-+ if [ ! -e $(DESTDIR)$(CONFDIR)/$$i ]; then \
-+ echo install -m 0644 $$i $(DESTDIR)$(CONFDIR); \
-+ install -m 0644 $$i $(DESTDIR)$(CONFDIR); fi; done
-+
-+clean:
-+ for i in $(SUBDIRS) doc; \
-+ do $(MAKE) -C $$i clean; done
-+
-+.EXPORT_ALL_VARIABLES:
-diff -Naur iproute2-orig/debian/README.Debian iproute2/debian/README.Debian
---- iproute2-orig/debian/README.Debian 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/README.Debian 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,4 @@
-+This version of "iproute" includes the HTB Linux queuing discipline
-+explained in http://luxik.cdi.cz/~devik/qos/htb/
-+
-+You need kernel version 2.4.21 or newer in order to use it.
-diff -Naur iproute2-orig/debian/changelog iproute2/debian/changelog
---- iproute2-orig/debian/changelog 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/changelog 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,207 @@
-+iproute (20010824-13) unstable; urgency=low
-+
-+ * debian/rules: Run dpkg-shlibdeps with all the executables,
-+ to fix dependency problem (closes: Bug#224063)
-+ * Really removed references to obsolete include files
-+ (Bug#223165 was not fixed properly)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 25 Jan 2004 23:04:20 +0100
-+
-+iproute (20010824-12) unstable; urgency=low
-+
-+ * Updated README.Debian and copyright file
-+ * Added two new manpages from http://lartc.org/manpages/:
-+ ip(8) and tc-cbq-details(8).
-+ * Removed references to obsolete include files which made
-+ compilation fail (closes: Bug#223165)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 14 Dec 2003 00:40:10 +0100
-+
-+iproute (20010824-11) unstable; urgency=low
-+
-+ * Changed priority to "optional"
-+ * Fixed "tc -s qdisc" on sparc (patch by "Nicolas S. Dade"
-+ <ndade@nsd.dyndns.org>) (closes: Bug#194128)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 17 Aug 2003 00:22:47 +0200
-+
-+iproute (20010824-10) unstable; urgency=low
-+
-+ * Updated manual pages from http://www.lartc.org/manpages/
-+ (closes: Bug#156353, Bug#175313, Bug#176989, Bug#189095)
-+ * New Standards-Version
-+ * Don't "rm -rf /etc/iproute2" on purge (closes: Bug#202862)
-+ * Include "iproute2" in the description (closes: Bug#182999)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sat, 16 Aug 2003 18:29:27 +0200
-+
-+iproute (20010824-9) unstable; urgency=medium
-+
-+ * Added patch for HTB v3.6 to be able to work with kernel 2.4.20
-+ (from http://luxik.cdi.cz/~devik/qos/htb/v3/htb3.6-020525.tgz)
-+ (closes: Bug#147550, Bug#167149, Bug#167597, Bug#171277)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Thu, 05 Dec 2002 13:44:10 +0100
-+
-+iproute (20010824-8) unstable; urgency=medium
-+
-+ * Added support for HTB queuing discipline (closes: Bug#133381)
-+ NOTE: you need a patched kernel in order to use it
-+
-+ -- Juan Cespedes <cespedes@debian.org> Tue, 2 Apr 2002 20:29:40 +0200
-+
-+iproute (20010824-7) unstable; urgency=medium
-+
-+ * Move `ip' binary to /bin to fix FHS violation (closes: Bug#134812)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Mon, 4 Mar 2002 00:20:30 +0100
-+
-+iproute (20010824-6) unstable; urgency=low
-+
-+ * Added a couple of #ifdef's to be able to compile with older
-+ kernel headers (needed for arm) (closes: Bug#131695)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sat, 16 Feb 2002 19:27:15 +0100
-+
-+iproute (20010824-5) unstable; urgency=low
-+
-+ * Really fix Bug#121589 (dead gateway bug); apparently I
-+ forgot to include the patch in 20010824-2
-+
-+ -- Juan Cespedes <cespedes@debian.org> Tue, 29 Jan 2002 23:22:24 +0100
-+
-+iproute (20010824-4) unstable; urgency=low
-+
-+ * Added support for DIFFSERV and ATM in tc
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 13 Jan 2002 03:01:47 +0100
-+
-+iproute (20010824-3) unstable; urgency=low
-+
-+ * Updated tc* man pages (thanks to bert hubert <ahu@ds9a.nl>)
-+ * Fixed spurious space in `tc -s qdisc' output (closes: Bug#128501)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Thu, 10 Jan 2002 22:18:25 +0100
-+
-+iproute (20010824-2) unstable; urgency=low
-+
-+ * Fixed the following important and serious bugs:
-+ + iproute doesn't compile on Alpha (closes: Bug#118113, Bug#123224)
-+ + iproute doesn't compile on MIPS (closes: Bug#118424)
-+ + iproute doesn't compile on powerpc (closes: Bug#119601)
-+ * Added man pages for tc (closes: Bug#124230), tc-cbq, tc-red, tc-tbf,
-+ tc-prio and tc-sfq
-+ * Removed references to old programs from iproute(7) (closes: Bug#99536)
-+ * Fixed bug which presented first hop as dead in equal cost multipath
-+ (closes: Bug#121589)
-+ * Do not process .ps with through `psnup' (closes: Bug#119820)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Tue, 8 Jan 2002 16:07:27 +0100
-+
-+iproute (20010824-1) unstable; urgency=low
-+
-+ * New upstream version
-+ * Make ingress qdisc work again with tc (closes: Bug#84444)
-+ * Make it compile properly with new include files (closes: Bug#113112)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 28 Oct 2001 16:38:00 +0100
-+
-+iproute (20001007-1) unstable; urgency=low
-+
-+ * New upstream version (closes: Bug#63701)
-+ * Remove /etc/iproute2 on purge (closes: Bug#72743)
-+ * Fixed Lintian warnings (no-priority-field and no-section-field)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sat, 14 Oct 2000 19:27:12 +0200
-+
-+iproute (991023-2) unstable; urgency=low
-+
-+ * New Standards-Version (3.1.1) (closes: Bug#47923)
-+ * Modified description of package to show which kernel options are
-+ necessary to use the package (closes: Bug#47922)
-+ * Updated manual page to point at /usr/share/doc/iproute (closes: Bug#47924)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 19 Dec 1999 04:00:21 +0100
-+
-+iproute (991023-1) unstable; urgency=low
-+
-+ * New upstream version (closes: Bug#48733)
-+
-+ -- Juan Cespedes <cespedes@debian.org> Tue, 2 Nov 1999 16:29:37 +0100
-+
-+iproute (990824-1) unstable; urgency=low
-+
-+ * New maintainer
-+ * New upstream version
-+ * New Standards-Version: 3.1.0
-+ * Minor fix in "ip rule list": mask in "from" address was not shown
-+ correctly
-+ * Removed obsoleted documentation from "debian/" directory
-+
-+ -- Juan Cespedes <cespedes@debian.org> Sun, 24 Oct 1999 19:02:56 +0200
-+
-+iproute (990630-1) unstable; urgency=low
-+
-+ * New upstream version.
-+ * FHS and standards 3.0.1.0.
-+
-+ -- Roberto Lumbreras <rover@debian.org> Tue, 3 Aug 1999 02:49:28 +0200
-+
-+iproute (990530-1) unstable; urgency=low
-+
-+ * New upstream version.
-+ * Build with 2.2.10 kernel headers.
-+ * Install new scripts ip/routef ip/routel, but not ip/ifcfg ip/rtpr by
-+ now, I don't know who/what needs rtpr; ifcfg uses arping, and it isn't
-+ available in debian for now.
-+
-+ -- Roberto Lumbreras <rover@debian.org> Tue, 22 Jun 1999 02:28:53 +0200
-+
-+iproute (990329-1) unstable; urgency=low
-+
-+ * New upstream version.
-+ * Build with 2.2.5 kernel headers.
-+
-+ -- Roberto Lumbreras <rover@debian.org> Sun, 4 Apr 1999 18:50:39 +0200
-+
-+iproute (980630-1) unstable; urgency=low
-+
-+ * New upstream version.
-+ * Build with 2.1.112 kernel headers.
-+ * Rewrote the rules file.
-+
-+ -- Roberto Lumbreras <rover@debian.org> Wed, 29 Jul 1998 23:37:52 +0200
-+
-+iproute (980119-1) unstable; urgency=low
-+
-+ * Outdated documentation. Upstream docs are scarce.
-+ * Non-Maintainer release
-+ * This package has no correct copyright file!
-+ * Include all the README.* docs from the upstream site.
-+ * Modified to build under glibc
-+ * Build with 2.1.85 kernel headers.
-+ * produce a correct diff.
-+ * Reworked the rules file to utilize debmake fully
-+ * Newest upstream release
-+ * glibc compilation
-+
-+ -- Christoph Lameter <christoph@lameter.com> Wed, 4 Feb 1998 13:37:28 -0800
-+
-+iproute (961225-2) unstable frozen; urgency=low
-+
-+ * Added a man page for iproute. (Fixes #8080).
-+ * Removed out-of-date patches.
-+ * Added routing.txt from /usr/src/linux/Documentation/networking/routing.txt
-+ * Newer version of debmake.
-+
-+ -- Tom Lees <tom@lpsg.demon.co.uk> Mon, 17 Apr 1997 17:00:36 +0100
-+
-+iproute (961225-1) unstable; urgency=low
-+
-+ * Initial Release.
-+
-+ -- Tom Lees <tom@lpsg.demon.co.uk> Mon, 30 Dec 1996 11:12:23 +0000
-+
-+Local variables:
-+mode: debian-changelog
-+End:
-diff -Naur iproute2-orig/debian/conffiles iproute2/debian/conffiles
---- iproute2-orig/debian/conffiles 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/conffiles 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,5 @@
-+/etc/iproute2/rt_dsfield
-+/etc/iproute2/rt_protos
-+/etc/iproute2/rt_realms
-+/etc/iproute2/rt_scopes
-+/etc/iproute2/rt_tables
-diff -Naur iproute2-orig/debian/control iproute2/debian/control
---- iproute2-orig/debian/control 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/control 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,19 @@
-+Source: iproute
-+Section: net
-+Priority: optional
-+Maintainer: Juan Cespedes <cespedes@debian.org>
-+Standards-Version: 3.6.0
-+Build-Depends: tetex-bin, atm-dev
-+
-+Package: iproute
-+Architecture: any
-+Depends: ${shlibs:Depends}
-+Description: Professional tools to control the networking in Linux kernels
-+ This is `iproute', the professional set of tools to control the
-+ networking behavior in kernels 2.2.x and later.
-+ .
-+ At least, the options CONFIG_NETLINK and CONFIG_RTNETLINK must
-+ be compiled in the running kernel
-+ .
-+ This package is also known as iproute2 upstream and in some
-+ documentation.
-diff -Naur iproute2-orig/debian/copyright iproute2/debian/copyright
---- iproute2-orig/debian/copyright 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/copyright 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,42 @@
-+This is the Debian GNU/Linux's prepackaged version of the
-+Linux Traffic Control engine and related utils, "iproute"
-+
-+This package was put together from sources obtained from:
-+ ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.4.7-now-ss010824.tar.gz
-+
-+Changes for Debian:
-+ * added Debian GNU/Linux package maintenance system files
-+ * Added HTB v3.6 from
-+ <http://luxik.cdi.cz/~devik/qos/htb/v3/htb3.6-020525.tgz>
-+
-+
-+Copyrights
-+----------
-+Copyright (C) 1996-2001 Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
-+
-+Modifications for Debian:
-+ Copyright (C) 1996 Tom Lees <tom@lpsg.demon.co.uk>
-+ Copyright (C) 1998 Christoph Lameter <christoph@lameter.com>
-+ Copyright (C) 1998-1999 Roberto Lumbreras <rover@debian.org>
-+ Copyright (C) 1999-2003 Juan Cespedes <cespedes@debian.org>
-+
-+
-+License
-+-------
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+This program is distributed in the hope that it will be useful, but
-+WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+General Public License for more details.
-+
-+A copy of the GNU General Public License is available as
-+`/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution
-+or on the World Wide Web at `http://www.gnu.org/copyleft/gpl.html'.
-+You can also obtain it by writing to the Free Software Foundation,
-+Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
-+
-diff -Naur iproute2-orig/debian/manpages/ip.8 iproute2/debian/manpages/ip.8
---- iproute2-orig/debian/manpages/ip.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/ip.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,1809 @@
-+.TH IP 8 "17 January 2002" "iproute2" "Linux"
-+.SH NAME
-+ip \- show / manipulate routing, devices, policy routing and tunnels
-+.SH SYNOPSIS
-+
-+.ad l
-+.in +8
-+.ti -8
-+.B ip
-+.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | "
-+.BR help " }"
-+.sp
-+
-+.ti -8
-+.IR OBJECT " := { "
-+.BR link " | " addr " | " route " | " rule " | " neigh " | " tunnel " | "\
-+maddr " | " mroute " | " monitor " }"
-+.sp
-+
-+.ti -8
-+.IR OPTIONS " := { "
-+\fB\-V\fR[\fIersion\fR] |
-+\fB\-s\fR[\fItatistics\fR] |
-+\fB\-r\fR[\fIesolve\fR] |
-+\fB\-f\fR[\fIamily\fR] {
-+.BR inet " | " inet6 " | " ipx " | " dnet " | " link " } | "
-+\fB\-o\fR[\fIneline\fR] }
-+
-+.ti -8
-+.BI "ip link set " DEVICE
-+.RB "{ " up " | " down " | " arp " { " on " | " off " } |"
-+.br
-+.BR promisc " { " on " | " off " } |"
-+.br
-+.BR allmulti " { " on " | " off " } |"
-+.br
-+.BR dynamic " { " on " | " off " } |"
-+.br
-+.BR multicast " { " on " | " off " } |"
-+.br
-+.B txqueuelen
-+.IR PACKETS " |"
-+.br
-+.B name
-+.IR NEWNAME " |"
-+.br
-+.B address
-+.IR LLADDR " |"
-+.B broadcast
-+.IR LLADDR " |"
-+.br
-+.B mtu
-+.IR MTU " }"
-+
-+.ti -8
-+.B ip link show
-+.RI "[ " DEVICE " ]"
-+
-+.ti -8
-+.BR "ip addr" " { " add " | " del " } "
-+.IB IFADDR " dev " STRING
-+
-+.ti -8
-+.BR "ip addr" " { " show " | " flush " } [ " dev
-+.IR STRING " ] [ "
-+.B scope
-+.IR SCOPE-ID " ] [ "
-+.B to
-+.IR PREFIX " ] [ " FLAG-LIST " ] [ "
-+.B label
-+.IR PATTERN " ]"
-+
-+.ti -8
-+.IR IFADDR " := " PREFIX " | " ADDR
-+.B peer
-+.IR PREFIX " [ "
-+.B broadcast
-+.IR ADDR " ] [ "
-+.B anycast
-+.IR ADDR " ] [ "
-+.B label
-+.IR STRING " ] [ "
-+.B scope
-+.IR SCOPE-ID " ]"
-+
-+.ti -8
-+.IR SCOPE-ID " := "
-+.RB "[ " host " | " link " | " global " | "
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR FLAG-LIST " := [ " FLAG-LIST " ] " FLAG
-+
-+.ti -8
-+.IR FLAG " := "
-+.RB "[ " permanent " | " dynamic " | " secondary " | " primary " | "\
-+tentative " | " deprecated " ]"
-+
-+.ti -8
-+.BR "ip route" " { "
-+.BR list " | " flush " } "
-+.I SELECTOR
-+
-+.ti -8
-+.B ip route get
-+.IR ADDRESS " [ "
-+.BI from " ADDRESS " iif " STRING"
-+.RB " ] [ " oif
-+.IR STRING " ] [ "
-+.B tos
-+.IR TOS " ]"
-+
-+.ti -8
-+.BR "ip route" " { " add " | " del " | " change " | " append " | "\
-+replace " | " monitor " } "
-+.I ROUTE
-+
-+.ti -8
-+.IR SELECTOR " := "
-+.RB "[ " root
-+.IR PREFIX " ] [ "
-+.B match
-+.IR PREFIX " ] [ "
-+.B exact
-+.IR PREFIX " ] [ "
-+.B table
-+.IR TABLE_ID " ] [ "
-+.B proto
-+.IR RTPROTO " ] [ "
-+.B type
-+.IR TYPE " ] [ "
-+.B scope
-+.IR SCOPE " ]"
-+
-+.ti -8
-+.IR ROUTE " := " NODE_SPEC " [ " INFO_SPEC " ]"
-+
-+.ti -8
-+.IR NODE_SPEC " := [ " TYPE " ] " PREFIX " ["
-+.B tos
-+.IR TOS " ] [ "
-+.B table
-+.IR TABLE_ID " ] [ "
-+.B proto
-+.IR RTPROTO " ] [ "
-+.B scope
-+.IR SCOPE " ] [ "
-+.B metric
-+.IR METRIC " ]"
-+
-+.ti -8
-+.IR INFO_SPEC " := " "NH OPTIONS FLAGS" " ["
-+.B nexthop
-+.IR NH " ] ..."
-+
-+.ti -8
-+.IR NH " := [ "
-+.B via
-+.IR ADDRESS " ] [ "
-+.B dev
-+.IR STRING " ] [ "
-+.B weight
-+.IR NUMBER " ] " NHFLAGS
-+
-+.ti -8
-+.IR OPTIONS " := " FLAGS " [ "
-+.B mtu
-+.IR NUMBER " ] [ "
-+.B advmss
-+.IR NUMBER " ] [ "
-+.B rtt
-+.IR NUMBER " ] [ "
-+.B rttvar
-+.IR NUMBER " ] [ "
-+.B window
-+.IR NUMBER " ] [ "
-+.B cwnd
-+.IR NUMBER " ] [ "
-+.B ssthresh
-+.IR REALM " ] [ "
-+.B realms
-+.IR REALM " ]"
-+
-+.ti -8
-+.IR TYPE " := [ "
-+.BR unicast " | " local " | " broadcast " | " multicast " | "\
-+throw " | " unreachable " | " prohibit " | " blackhole " | " nat " ]"
-+
-+.ti -8
-+.IR TABLE_ID " := [ "
-+.BR local "| " main " | " default " | " all " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR SCOPE " := [ "
-+.BR host " | " link " | " global " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR FLAGS " := [ "
-+.BR equalize " ]"
-+
-+.ti -8
-+.IR NHFLAGS " := [ "
-+.BR onlink " | " pervasive " ]"
-+
-+.ti -8
-+.IR RTPROTO " := [ "
-+.BR kernel " | " boot " | " static " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.B ip rule
-+.RB " [ " list " | " add " | " del " ]"
-+.I SELECTOR ACTION
-+
-+.ti -8
-+.IR SELECTOR " := [ "
-+.B from
-+.IR PREFIX " ] [ "
-+.B to
-+.IR PREFIX " ] [ "
-+.B tos
-+.IR TOS " ] [ "
-+.B fwmark
-+.IR FWMARK " ] [ "
-+.B dev
-+.IR STRING " ] [ "
-+.B pref
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR ACTION " := [ "
-+.B table
-+.IR TABLE_ID " ] [ "
-+.B nat
-+.IR ADDRESS " ] [ "
-+.BR prohibit " | " reject " | " unreachable " ] [ " realms
-+.RI "[" SRCREALM "/]" DSTREALM " ]"
-+
-+.ti -8
-+.IR TABLE_ID " := [ "
-+.BR local " | " main " | " default " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.BR "ip neigh" " { " add " | " del " | " change " | " replace " } { "
-+.IR ADDR " [ "
-+.B lladdr
-+.IR LLADDR " ] [ "
-+.BR nud " { " permanent " | " noarp " | " stale " | " reachable " } ] | " proxy
-+.IR ADDR " } [ "
-+.B dev
-+.IR DEV " ]"
-+
-+.ti -8
-+.BR "ip neigh" " { " show " | " flush " } [ " to
-+.IR PREFIX " ] [ "
-+.B dev
-+.IR DEV " ] [ "
-+.B nud
-+.IR STATE " ]"
-+
-+.ti -8
-+.BR "ip tunnel" " { " add " | " change " | " del " | " show " }"
-+.RI "[ " NAME " ]"
-+.br
-+.RB "[ " mode " { " ipip " | " gre " | " sit " } ]"
-+.br
-+.RB "[ " remote
-+.IR ADDR " ] [ "
-+.B local
-+.IR ADDR " ]"
-+.br
-+.RB "[ [" i "|" o "]" seq " ] [ [" i "|" o "]" key
-+.IR KEY " ] [ "
-+.RB "[" i "|" o "]" csum " ] ]"
-+.br
-+.RB "[ " ttl
-+.IR TTL " ] [ "
-+.B tos
-+.IR TOS " ] [ "
-+.RB "[" no "]" pmtudisc " ]"
-+.br
-+.RB "[ " dev
-+.IR PHYS_DEV " ]"
-+
-+.ti -8
-+.IR ADDR " := { " IP_ADDRESS " |"
-+.BR any " }"
-+
-+.ti -8
-+.IR TOS " := { " NUMBER " |"
-+.BR inherit " }"
-+
-+.ti -8
-+.IR TTL " := { " 1 ".." 255 " | "
-+.BR inherit " }"
-+
-+.ti -8
-+.IR KEY " := { " DOTTED_QUAD " | " NUMBER " }"
-+
-+.ti -8
-+.BR "ip maddr" " [ " add " | " del " ]"
-+.IB MULTIADDR " dev " STRING
-+
-+.ti -8
-+.BR "ip maddr show" " [ " dev
-+.IR STRING " ]"
-+
-+.ti -8
-+.BR "ip mroute show" " ["
-+.IR PREFIX " ] [ "
-+.B from
-+.IR PREFIX " ] [ "
-+.B iif
-+.IR DEVICE " ]"
-+
-+.ti -8
-+.BR "ip monitor" " [ " all " |"
-+.IR LISTofOBJECTS " ]"
-+.in -8
-+.ad b
-+
-+.SH OPTIONS
-+
-+.TP
-+.BR "\-V" , " -Version"
-+print the version of the
-+.B ip
-+utility and exit.
-+
-+.TP
-+.BR "\-s" , " \-stats", " \-statistics"
-+output more information. If the option
-+appears twice or more, the amount of information increases.
-+As a rule, the information is statistics or some time values.
-+
-+.TP
-+.BR "\-f" , " \-family"
-+followed by protocol family identifier:
-+.BR "inet" , " inet6"
-+or
-+.B link
-+,enforce the protocol family to use. If the option is not present,
-+the protocol family is guessed from other arguments. If the rest
-+of the command line does not give enough information to guess the
-+family,
-+.B ip
-+falls back to the default one, usually
-+.B inet
-+or
-+.BR "any" .
-+.B link
-+is a special family identifier meaning that no networking protocol
-+is involved.
-+
-+.TP
-+.B \-4
-+shortcut for
-+.BR "-family inet" .
-+
-+.TP
-+.B \-6
-+shortcut for
-+.BR "\-family inet6" .
-+
-+.TP
-+.B \-0
-+shortcut for
-+.BR "\-family link" .
-+
-+.TP
-+.BR "\-o" , " \-oneline"
-+output each record on a single line, replacing line feeds
-+with the
-+.B '\'
-+character. This is convenient when you want to count records
-+with
-+.BR wc (1)
-+ or to
-+.BR grep (1)
-+the output.
-+
-+.TP
-+.BR "\-r" , " \-resolve"
-+use the system's name resolver to print DNS names instead of
-+host addresses.
-+
-+.SH IP - COMMAND SYNTAX
-+
-+.SS
-+.I OBJECT
-+
-+.TP
-+.B link
-+- network device.
-+
-+.TP
-+.B address
-+- protocol (IP or IPv6) address on a device.
-+.TP
-+.B neighbour
-+- ARP or NDISC cache entry.
-+
-+.TP
-+.B route
-+- routing table entry.
-+
-+.TP
-+.B rule
-+- rule in routing policy database.
-+
-+.TP
-+.B maddress
-+- multicast address.
-+
-+.TP
-+.B mroute
-+- multicast routing cache entry.
-+
-+.TP
-+.B tunnel
-+- tunnel over IP.
-+
-+.PP
-+The names of all objects may be written in full or
-+abbreviated form, f.e.
-+.B address
-+is abbreviated as
-+.B addr
-+or just
-+.B a.
-+
-+.SS
-+.I COMMAND
-+
-+Specifies the action to perform on the object.
-+The set of possible actions depends on the object type.
-+As a rule, it is possible to
-+.BR "add" , " delete"
-+and
-+.B show
-+(or
-+.B list
-+) objects, but some objects do not allow all of these operations
-+or have some additional commands. The
-+.B help
-+command is available for all objects. It prints
-+out a list of available commands and argument syntax conventions.
-+.sp
-+If no command is given, some default command is assumed.
-+Usually it is
-+.B list
-+or, if the objects of this class cannot be listed,
-+.BR "help" .
-+
-+.SH ip link - network device configuration
-+
-+.B link
-+is a network device and the corresponding commands
-+display and change the state of devices.
-+
-+.SS ip link set - change device attributes
-+
-+.TP
-+.BI dev " NAME " (default)
-+.I NAME
-+specifies network device to operate on.
-+
-+.TP
-+.BR up " and " down
-+change the state of the device to
-+.B UP
-+or
-+.BR "DOWN" .
-+
-+.TP
-+.BR "arp on " or " arp off"
-+change the
-+.B NOARP
-+flag on the device.
-+
-+.TP
-+.BR "multicast on " or " multicast off"
-+change the
-+.B MULTICAST
-+flag on the device.
-+
-+.TP
-+.BR "dynamic on " or " dynamic off"
-+change the
-+.B DYNAMIC
-+flag on the device.
-+
-+.TP
-+.BI name " NAME"
-+change the name of the device. This operation is not
-+recommended if the device is running or has some addresses
-+already configured.
-+
-+.TP
-+.BI txqueuelen " NUMBER"
-+.TP
-+.BI txqlen " NUMBER"
-+change the transmit queue length of the device.
-+
-+.TP
-+.BI mtu " NUMBER"
-+change the
-+.I MTU
-+of the device.
-+
-+.TP
-+.BI address " LLADDRESS"
-+change the station address of the interface.
-+
-+.TP
-+.BI broadcast " LLADDRESS"
-+.TP
-+.BI brd " LLADDRESS"
-+.TP
-+.BI peer " LLADDRESS"
-+change the link layer broadcast address or the peer address when
-+the interface is
-+.IR "POINTOPOINT" .
-+
-+.PP
-+.B Warning:
-+If multiple parameter changes are requested,
-+.B ip
-+aborts immediately after any of the changes have failed.
-+This is the only case when
-+.B ip
-+can move the system to an unpredictable state. The solution
-+is to avoid changing several parameters with one
-+.B ip link set
-+call.
-+
-+.SS ip link show - display device attributes
-+
-+.TP
-+.BI dev " NAME " (default)
-+.I NAME
-+specifies the network device to show.
-+If this argument is omitted all devices are listed.
-+
-+.TP
-+.B up
-+only display running interfaces.
-+
-+.SH ip address - protocol address management.
-+
-+The
-+.B address
-+is a protocol (IP or IPv6) address attached
-+to a network device. Each device must have at least one address
-+to use the corresponding protocol. It is possible to have several
-+different addresses attached to one device. These addresses are not
-+discriminated, so that the term
-+.B alias
-+is not quite appropriate for them and we do not use it in this document.
-+.sp
-+The
-+.B ip addr
-+command displays addresses and their properties, adds new addresses
-+and deletes old ones.
-+
-+.SS ip address add - add new protocol address.
-+
-+.TP
-+.BI dev " NAME"
-+the name of the device to add the address to.
-+
-+.TP
-+.BI local " ADDRESS " (default)
-+the address of the interface. The format of the address depends
-+on the protocol. It is a dotted quad for IP and a sequence of
-+hexadecimal halfwords separated by colons for IPv6. The
-+.I ADDRESS
-+may be followed by a slash and a decimal number which encodes
-+the network prefix length.
-+
-+.TP
-+.BI peer " ADDRESS"
-+the address of the remote endpoint for pointopoint interfaces.
-+Again, the
-+.I ADDRESS
-+may be followed by a slash and a decimal number, encoding the network
-+prefix length. If a peer address is specified, the local address
-+cannot have a prefix length. The network prefix is associated
-+with the peer rather than with the local address.
-+
-+.TP
-+.BI broadcast " ADDRESS"
-+the broadcast address on the interface.
-+.sp
-+It is possible to use the special symbols
-+.B '+'
-+and
-+.B '-'
-+instead of the broadcast address. In this case, the broadcast address
-+is derived by setting/resetting the host bits of the interface prefix.
-+
-+.TP
-+.BI label " NAME"
-+Each address may be tagged with a label string.
-+In order to preserve compatibility with Linux-2.0 net aliases,
-+this string must coincide with the name of the device or must be prefixed
-+with the device name followed by colon.
-+
-+.TP
-+.BI scope " SCOPE_VALUE"
-+the scope of the area where this address is valid.
-+The available scopes are listed in file
-+.BR "/etc/iproute2/rt_scopes" .
-+Predefined scope values are:
-+
-+.in +8
-+.B global
-+- the address is globally valid.
-+.sp
-+.B site
-+- (IPv6 only) the address is site local, i.e. it is
-+valid inside this site.
-+.sp
-+.B link
-+- the address is link local, i.e. it is valid only on this device.
-+.sp
-+.B host
-+- the address is valid only inside this host.
-+.in -8
-+
-+.SS ip address delete - delete protocol address
-+.B Arguments:
-+coincide with the arguments of
-+.B ip addr add.
-+The device name is a required argument. The rest are optional.
-+If no arguments are given, the first address is deleted.
-+
-+.SS ip address show - look at protocol addresses
-+
-+.TP
-+.BI dev " NAME " (default)
-+name of device.
-+
-+.TP
-+.BI scope " SCOPE_VAL"
-+only list addresses with this scope.
-+
-+.TP
-+.BI to " PREFIX"
-+only list addresses matching this prefix.
-+
-+.TP
-+.BI label " PATTERN"
-+only list addresses with labels matching the
-+.IR "PATTERN" .
-+.I PATTERN
-+is a usual shell style pattern.
-+
-+.TP
-+.BR dynamic " and " permanent
-+(IPv6 only) only list addresses installed due to stateless
-+address configuration or only list permanent (not dynamic)
-+addresses.
-+
-+.TP
-+.B tentative
-+(IPv6 only) only list addresses which did not pass duplicate
-+address detection.
-+
-+.TP
-+.B deprecated
-+(IPv6 only) only list deprecated addresses.
-+
-+.TP
-+.BR primary " and " secondary
-+only list primary (or secondary) addresses.
-+
-+.SS ip address flush - flush protocol addresses
-+This command flushes the protocol addresses selected by some criteria.
-+
-+.PP
-+This command has the same arguments as
-+.B show.
-+The difference is that it does not run when no arguments are given.
-+
-+.PP
-+.B Warning:
-+This command (and other
-+.B flush
-+commands described below) is pretty dangerous. If you make a mistake,
-+it will not forgive it, but will cruelly purge all the addresses.
-+
-+.PP
-+With the
-+.B -statistics
-+option, the command becomes verbose. It prints out the number of deleted
-+addresses and the number of rounds made to flush the address list. If
-+this option is given twice,
-+.B ip addr flush
-+also dumps all the deleted addresses in the format described in the
-+previous subsection.
-+
-+.SH ip neighbour - neighbour/arp tables management.
-+
-+.B neighbour
-+objects establish bindings between protocol addresses and
-+link layer addresses for hosts sharing the same link.
-+Neighbour entries are organized into tables. The IPv4 neighbour table
-+is known by another name - the ARP table.
-+
-+.P
-+The corresponding commands display neighbour bindings
-+and their properties, add new neighbour entries and delete old ones.
-+
-+.SS ip neighbour add - add a new neighbour entry
-+.SS ip neighbour change - change an existing entry
-+.SS ip neighbour replace - add a new entry or change an existing one
-+
-+These commands create new neighbour records or update existing ones.
-+
-+.TP
-+.BI to " ADDRESS " (default)
-+the protocol address of the neighbour. It is either an IPv4 or IPv6 address.
-+
-+.TP
-+.BI dev " NAME"
-+the interface to which this neighbour is attached.
-+
-+.TP
-+.BI lladdr " LLADDRESS"
-+the link layer address of the neighbour.
-+.I LLADDRESS
-+can also be
-+.BR "null" .
-+
-+.TP
-+.BI nud " NUD_STATE"
-+the state of the neighbour entry.
-+.B nud
-+is an abbreviation for 'Neigh bour Unreachability Detection'.
-+The state can take one of the following values:
-+
-+.in +8
-+.B permanent
-+- the neighbour entry is valid forever and can be only
-+be removed administratively.
-+.sp
-+
-+.B noarp
-+- the neighbour entry is valid. No attempts to validate
-+this entry will be made but it can be removed when its lifetime expires.
-+.sp
-+
-+.B reachable
-+- the neighbour entry is valid until the reachability
-+timeout expires.
-+.sp
-+
-+.B stale
-+- the neighbour entry is valid but suspicious.
-+This option to
-+.B ip neigh
-+does not change the neighbour state if it was valid and the address
-+is not changed by this command.
-+.in -8
-+
-+.SS ip neighbour delete - delete a neighbour entry
-+This command invalidates a neighbour entry.
-+
-+.PP
-+The arguments are the same as with
-+.BR "ip neigh add" ,
-+except that
-+.B lladdr
-+and
-+.B nud
-+are ignored.
-+
-+.PP
-+.B Warning:
-+Attempts to delete or manually change a
-+.B noarp
-+entry created by the kernel may result in unpredictable behaviour.
-+Particularly, the kernel may try to resolve this address even
-+on a
-+.B NOARP
-+interface or if the address is multicast or broadcast.
-+
-+.SS ip neighbour show - list neighbour entries
-+
-+This commands displays neighbour tables.
-+
-+.TP
-+.BI to " ADDRESS " (default)
-+the prefix selecting the neighbours to list.
-+
-+.TP
-+.BI dev " NAME"
-+only list the neighbours attached to this device.
-+
-+.TP
-+.B unused
-+only list neighbours which are not currently in use.
-+
-+.TP
-+.BI nud " NUD_STATE"
-+only list neighbour entries in this state.
-+.I NUD_STATE
-+takes values listed below or the special value
-+.B all
-+which means all states. This option may occur more than once.
-+If this option is absent,
-+.B ip
-+lists all entries except for
-+.B none
-+and
-+.BR "noarp" .
-+
-+.SS ip neighbour flush - flush neighbour entries
-+This command flushes neighbour tables, selecting
-+entries to flush by some criteria.
-+
-+.PP
-+This command has the same arguments as
-+.B show.
-+The differences are that it does not run when no arguments are given,
-+and that the default neighbour states to be flushed do not include
-+.B permanent
-+and
-+.BR "noarp" .
-+
-+.PP
-+With the
-+.B -statistics
-+option, the command becomes verbose. It prints out the number of
-+deleted neighbours and the number of rounds made to flush the
-+neighbour table. If the option is given
-+twice,
-+.B ip neigh flush
-+also dumps all the deleted neighbours.
-+
-+.SH ip route - routing table management
-+Manipulate route entries in the kernel routing tables keep
-+information about paths to other networked nodes.
-+.sp
-+.B Route types:
-+
-+.in +8
-+.B unicast
-+- the route entry describes real paths to the destinations covered
-+by the route prefix.
-+
-+.sp
-+.B unreachable
-+- these destinations are unreachable. Packets are discarded and the
-+ICMP message
-+.I host unreachable
-+is generated.
-+The local senders get an
-+.I EHOSTUNREACH
-+error.
-+
-+.sp
-+.B blackhole
-+- these destinations are unreachable. Packets are discarded silently.
-+The local senders get an
-+.I EINVAL
-+error.
-+
-+.sp
-+.B prohibit
-+- these destinations are unreachable. Packets are discarded and the
-+ICMP message
-+.I communication administratively prohibited
-+is generated. The local senders get an
-+.I EACCES
-+error.
-+
-+.sp
-+.B local
-+- the destinations are assigned to this host. The packets are looped
-+back and delivered locally.
-+
-+.sp
-+.B broadcast
-+- the destinations are broadcast addresses. The packets are sent as
-+link broadcasts.
-+
-+.sp
-+.B throw
-+- a special control route used together with policy rules. If such a
-+route is selected, lookup in this table is terminated pretending that
-+no route was found. Without policy routing it is equivalent to the
-+absence of the route in the routing table. The packets are dropped
-+and the ICMP message
-+.I net unreachable
-+is generated. The local senders get an
-+.I ENETUNREACH
-+error.
-+
-+.sp
-+.B nat
-+- a special NAT route. Destinations covered by the prefix
-+are considered to be dummy (or external) addresses which require translation
-+to real (or internal) ones before forwarding. The addresses to translate to
-+are selected with the attribute
-+.BR "via" .
-+
-+.sp
-+.B anycast
-+.RI "- " "not implemented"
-+the destinations are
-+.I anycast
-+addresses assigned to this host. They are mainly equivalent
-+to
-+.B local
-+with one difference: such addresses are invalid when used
-+as the source address of any packet.
-+
-+.sp
-+.B multicast
-+- a special type used for multicast routing. It is not present in
-+normal routing tables.
-+.in -8
-+
-+.P
-+.B Route tables:
-+Linux-2.x can pack routes into several routing
-+tables identified by a number in the range from 1 to 255 or by
-+name from the file
-+.B /etc/iproute2/rt_tables
-+. By default all normal routes are inserted into the
-+.B main
-+table (ID 254) and the kernel only uses this table when calculating routes.
-+
-+.sp
-+Actually, one other table always exists, which is invisible but
-+even more important. It is the
-+.B local
-+table (ID 255). This table
-+consists of routes for local and broadcast addresses. The kernel maintains
-+this table automatically and the administrator usually need not modify it
-+or even look at it.
-+
-+The multiple routing tables enter the game when
-+.I policy routing
-+is used.
-+
-+.SS ip route add - add new route
-+.SS ip route change - change route
-+.SS ip route replace - change or add new one
-+
-+.TP
-+.BI to " TYPE PREFIX " (default)
-+the destination prefix of the route. If
-+.I TYPE
-+is omitted,
-+.B ip
-+assumes type
-+.BR "unicast" .
-+Other values of
-+.I TYPE
-+are listed above.
-+.I PREFIX
-+is an IP or IPv6 address optionally followed by a slash and the
-+prefix length. If the length of the prefix is missing,
-+.B ip
-+assumes a full-length host route. There is also a special
-+.I PREFIX
-+.B default
-+- which is equivalent to IP
-+.B 0/0
-+or to IPv6
-+.BR "::/0" .
-+
-+.TP
-+.BI tos " TOS"
-+.TP
-+.BI dsfield " TOS"
-+the Type Of Service (TOS) key. This key has no associated mask and
-+the longest match is understood as: First, compare the TOS
-+of the route and of the packet. If they are not equal, then the packet
-+may still match a route with a zero TOS.
-+.I TOS
-+is either an 8 bit hexadecimal number or an identifier
-+from
-+.BR "/etc/iproute2/rt_dsfield" .
-+
-+.TP
-+.BI metric " NUMBER"
-+.TP
-+.BI preference " NUMBER"
-+the preference value of the route.
-+.I NUMBER
-+is an arbitrary 32bit number.
-+
-+.TP
-+.BI table " TABLEID"
-+the table to add this route to.
-+.I TABLEID
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_tables" .
-+If this parameter is omitted,
-+.B ip
-+assumes the
-+.B main
-+table, with the exception of
-+.BR local " , " broadcast " and " nat
-+routes, which are put into the
-+.B local
-+table by default.
-+
-+.TP
-+.BI dev " NAME"
-+the output device name.
-+
-+.TP
-+.BI via " ADDRESS"
-+the address of the nexthop router. Actually, the sense of this field
-+depends on the route type. For normal
-+.B unicast
-+routes it is either the true next hop router or, if it is a direct
-+route installed in BSD compatibility mode, it can be a local address
-+of the interface. For NAT routes it is the first address of the block
-+of translated IP destinations.
-+
-+.TP
-+.BI src " ADDRESS"
-+the source address to prefer when sending to the destinations
-+covered by the route prefix.
-+
-+.TP
-+.BI realm " REALMID"
-+the realm to which this route is assigned.
-+.I REALMID
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_realms" .
-+
-+.TP
-+.BI mtu " MTU"
-+.TP
-+.BI "mtu lock" " MTU"
-+the MTU along the path to the destination. If the modifier
-+.B lock
-+is not used, the MTU may be updated by the kernel due to
-+Path MTU Discovery. If the modifier
-+.B lock
-+is used, no path MTU discovery will be tried, all packets
-+will be sent without the DF bit in IPv4 case or fragmented
-+to MTU for IPv6.
-+
-+.TP
-+.BI window " NUMBER"
-+the maximal window for TCP to advertise to these destinations,
-+measured in bytes. It limits maximal data bursts that our TCP
-+peers are allowed to send to us.
-+
-+.TP
-+.BI rtt " NUMBER"
-+the initial RTT ('Round Trip Time') estimate.
-+
-+.TP
-+.BI rttvar " NUMBER " "(2.3.15+ only)"
-+the initial RTT variance estimate.
-+
-+.TP
-+.BI ssthresh " NUMBER " "(2.3.15+ only)"
-+an estimate for the initial slow start threshold.
-+
-+.TP
-+.BI cwnd " NUMBER " "(2.3.15+ only)"
-+the clamp for congestion window. It is ignored if the
-+.B lock
-+flag is not used.
-+
-+.TP
-+.BI advmss " NUMBER " "(2.3.15+ only)"
-+the MSS ('Maximal Segment Size') to advertise to these
-+destinations when establishing TCP connections. If it is not given,
-+Linux uses a default value calculated from the first hop device MTU.
-+(If the path to these destination is asymmetric, this guess may be wrong.)
-+
-+.TP
-+.BI reordering " NUMBER " "(2.3.15+ only)"
-+Maximal reordering on the path to this destination.
-+If it is not given, Linux uses the value selected with
-+.B sysctl
-+variable
-+.BR "net/ipv4/tcp_reordering" .
-+
-+.TP
-+.BI nexthop " NEXTHOP"
-+the nexthop of a multipath route.
-+.I NEXTHOP
-+is a complex value with its own syntax similar to the top level
-+argument lists:
-+
-+.in +8
-+.BI via " ADDRESS"
-+- is the nexthop router.
-+.sp
-+
-+.BI dev " NAME"
-+- is the output device.
-+.sp
-+
-+.BI weight " NUMBER"
-+- is a weight for this element of a multipath
-+route reflecting its relative bandwidth or quality.
-+.in -8
-+
-+.TP
-+.BI scope " SCOPE_VAL"
-+the scope of the destinations covered by the route prefix.
-+.I SCOPE_VAL
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_scopes" .
-+If this parameter is omitted,
-+.B ip
-+assumes scope
-+.B global
-+for all gatewayed
-+.B unicast
-+routes, scope
-+.B link
-+for direct
-+.BR unicast " and " broadcast
-+routes and scope
-+.BR host " for " local
-+routes.
-+
-+.TP
-+.BI protocol " RTPROTO"
-+the routing protocol identifier of this route.
-+.I RTPROTO
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_protos" .
-+If the routing protocol ID is not given,
-+.B ip assumes protocol
-+.B boot
-+(i.e. it assumes the route was added by someone who doesn't
-+understand what they are doing). Several protocol values have
-+a fixed interpretation.
-+Namely:
-+
-+.in +8
-+.B redirect
-+- the route was installed due to an ICMP redirect.
-+.sp
-+
-+.B kernel
-+- the route was installed by the kernel during autoconfiguration.
-+.sp
-+
-+.B boot
-+- the route was installed during the bootup sequence.
-+If a routing daemon starts, it will purge all of them.
-+.sp
-+
-+.B static
-+- the route was installed by the administrator
-+to override dynamic routing. Routing daemon will respect them
-+and, probably, even advertise them to its peers.
-+.sp
-+
-+.B ra
-+- the route was installed by Router Discovery protocol.
-+.in -8
-+
-+.sp
-+The rest of the values are not reserved and the administrator is free
-+to assign (or not to assign) protocol tags.
-+
-+.TP
-+.B onlink
-+pretend that the nexthop is directly attached to this link,
-+even if it does not match any interface prefix.
-+
-+.TP
-+.B equalize
-+allow packet by packet randomization on multipath routes.
-+Without this modifier, the route will be frozen to one selected
-+nexthop, so that load splitting will only occur on per-flow base.
-+.B equalize
-+only works if the kernel is patched.
-+
-+.SS ip route delete - delete route
-+
-+.B ip route del
-+has the same arguments as
-+.BR "ip route add" ,
-+but their semantics are a bit different.
-+
-+Key values
-+.RB "(" to ", " tos ", " preference " and " table ")"
-+select the route to delete. If optional attributes are present,
-+.B ip
-+verifies that they coincide with the attributes of the route to delete.
-+If no route with the given key and attributes was found,
-+.B ip route del
-+fails.
-+
-+.SS ip route show - list routes
-+the command displays the contents of the routing tables or the route(s)
-+selected by some criteria.
-+
-+.TP
-+.BI to " SELECTOR " (default)
-+only select routes from the given range of destinations.
-+.I SELECTOR
-+consists of an optional modifier
-+.RB "(" root ", " match " or " exact ")"
-+and a prefix.
-+.BI root " PREFIX"
-+selects routes with prefixes not shorter than
-+.IR PREFIX "."
-+F.e.
-+.BI root " 0/0"
-+selects the entire routing table.
-+.BI match " PREFIX"
-+selects routes with prefixes not longer than
-+.IR PREFIX "."
-+F.e.
-+.BI match " 10.0/16"
-+selects
-+.IR 10.0/16 ","
-+.IR 10/8 " and " 0/0 ,
-+but it does not select
-+.IR 10.1/16 " and " 10.0.0/24 .
-+And
-+.BI exact " PREFIX"
-+(or just
-+.IR PREFIX ")"
-+selects routes with this exact prefix. If neither of these options
-+are present,
-+.B ip
-+assumes
-+.BI root " 0/0"
-+i.e. it lists the entire table.
-+
-+.TP
-+.BI tos " TOS"
-+.BI dsfield " TOS"
-+only select routes with the given TOS.
-+
-+.TP
-+.BI table " TABLEID"
-+show the routes from this table(s). The default setting is to show
-+.BR table main "."
-+.I TABLEID
-+may either be the ID of a real table or one of the special values:
-+.sp
-+.in +8
-+.B all
-+- list all of the tables.
-+.sp
-+.B cache
-+- dump the routing cache.
-+.in -8
-+
-+.TP
-+.B cloned
-+.TP
-+.B cached
-+list cloned routes i.e. routes which were dynamically forked from
-+other routes because some route attribute (f.e. MTU) was updated.
-+Actually, it is equivalent to
-+.BR "table cache" "."
-+
-+.TP
-+.BI from " SELECTOR"
-+the same syntax as for
-+.BR to ","
-+but it binds the source address range rather than destinations.
-+Note that the
-+.B from
-+option only works with cloned routes.
-+
-+.TP
-+.BI protocol " RTPROTO"
-+only list routes of this protocol.
-+
-+.TP
-+.BI scope " SCOPE_VAL"
-+only list routes with this scope.
-+
-+.TP
-+.BI type " TYPE"
-+only list routes of this type.
-+
-+.TP
-+.BI dev " NAME"
-+only list routes going via this device.
-+
-+.TP
-+.BI via " PREFIX"
-+only list routes going via the nexthop routers selected by
-+.IR PREFIX "."
-+
-+.TP
-+.BI src " PREFIX"
-+only list routes with preferred source addresses selected
-+by
-+.IR PREFIX "."
-+
-+.TP
-+.BI realm " REALMID"
-+.TP
-+.BI realms " FROMREALM/TOREALM"
-+only list routes with these realms.
-+
-+.SS ip route flush - flush routing tables
-+this command flushes routes selected by some criteria.
-+
-+.sp
-+The arguments have the same syntax and semantics as the arguments of
-+.BR "ip route show" ,
-+but routing tables are not listed but purged. The only difference is
-+the default action:
-+.B show
-+dumps all the IP main routing table but
-+.B flush
-+prints the helper page.
-+
-+.sp
-+With the
-+.B -statistics
-+option, the command becomes verbose. It prints out the number of
-+deleted routes and the number of rounds made to flush the routing
-+table. If the option is given
-+twice,
-+.B ip route flush
-+also dumps all the deleted routes in the format described in the
-+previous subsection.
-+
-+.SS ip route get - get a single route
-+this command gets a single route to a destination and prints its
-+contents exactly as the kernel sees it.
-+
-+.TP
-+.BI to " ADDRESS " (default)
-+the destination address.
-+
-+.TP
-+.BI from " ADDRESS"
-+the source address.
-+
-+.TP
-+.BI tos " TOS"
-+.TP
-+.BI dsfield " TOS"
-+the Type Of Service.
-+
-+.TP
-+.BI iif " NAME"
-+the device from which this packet is expected to arrive.
-+
-+.TP
-+.BI oif " NAME"
-+force the output device on which this packet will be routed.
-+
-+.TP
-+.B connected
-+if no source address
-+.RB "(option " from ")"
-+was given, relookup the route with the source set to the preferred
-+address received from the first lookup.
-+If policy routing is used, it may be a different route.
-+
-+.P
-+Note that this operation is not equivalent to
-+.BR "ip route show" .
-+.B show
-+shows existing routes.
-+.B get
-+resolves them and creates new clones if necessary. Essentially,
-+.B get
-+is equivalent to sending a packet along this path.
-+If the
-+.B iif
-+argument is not given, the kernel creates a route
-+to output packets towards the requested destination.
-+This is equivalent to pinging the destination
-+with a subsequent
-+.BR "ip route ls cache" ,
-+however, no packets are actually sent. With the
-+.B iif
-+argument, the kernel pretends that a packet arrived from this interface
-+and searches for a path to forward the packet.
-+
-+.SH ip rule - routing policy database management
-+
-+.BR "Rule" s
-+in the routing policy database control the route selection algorithm.
-+
-+.P
-+Classic routing algorithms used in the Internet make routing decisions
-+based only on the destination address of packets (and in theory,
-+but not in practice, on the TOS field).
-+
-+.P
-+In some circumstances we want to route packets differently depending not only
-+on destination addresses, but also on other packet fields: source address,
-+IP protocol, transport protocol ports or even packet payload.
-+This task is called 'policy routing'.
-+
-+.P
-+To solve this task, the conventional destination based routing table, ordered
-+according to the longest match rule, is replaced with a 'routing policy
-+database' (or RPDB), which selects routes by executing some set of rules.
-+
-+.P
-+Each policy routing rule consists of a
-+.B selector
-+and an
-+.B action predicate.
-+The RPDB is scanned in the order of increasing priority. The selector
-+of each rule is applied to {source address, destination address, incoming
-+interface, tos, fwmark} and, if the selector matches the packet,
-+the action is performed. The action predicate may return with success.
-+In this case, it will either give a route or failure indication
-+and the RPDB lookup is terminated. Otherwise, the RPDB program
-+continues on the next rule.
-+
-+.P
-+Semantically, natural action is to select the nexthop and the output device.
-+
-+.P
-+At startup time the kernel configures the default RPDB consisting of three
-+rules:
-+
-+.TP
-+1.
-+Priority: 0, Selector: match anything, Action: lookup routing
-+table
-+.B local
-+(ID 255).
-+The
-+.B local
-+table is a special routing table containing
-+high priority control routes for local and broadcast addresses.
-+.sp
-+Rule 0 is special. It cannot be deleted or overridden.
-+
-+.TP
-+2.
-+Priority: 32766, Selector: match anything, Action: lookup routing
-+table
-+.B main
-+(ID 254).
-+The
-+.B main
-+table is the normal routing table containing all non-policy
-+routes. This rule may be deleted and/or overridden with other
-+ones by the administrator.
-+
-+.TP
-+3.
-+Priority: 32767, Selector: match anything, Action: lookup routing
-+table
-+.B default
-+(ID 253).
-+The
-+.B default
-+table is empty. It is reserved for some post-processing if no previous
-+default rules selected the packet.
-+This rule may also be deleted.
-+
-+.P
-+Each RPDB entry has additional
-+attributes. F.e. each rule has a pointer to some routing
-+table. NAT and masquerading rules have an attribute to select new IP
-+address to translate/masquerade. Besides that, rules have some
-+optional attributes, which routes have, namely
-+.BR "realms" .
-+These values do not override those contained in the routing tables. They
-+are only used if the route did not select any attributes.
-+
-+.sp
-+The RPDB may contain rules of the following types:
-+
-+.in +8
-+.B unicast
-+- the rule prescribes to return the route found
-+in the routing table referenced by the rule.
-+
-+.B blackhole
-+- the rule prescribes to silently drop the packet.
-+
-+.B unreachable
-+- the rule prescribes to generate a 'Network is unreachable' error.
-+
-+.B prohibit
-+- the rule prescribes to generate 'Communication is administratively
-+prohibited' error.
-+
-+.B nat
-+- the rule prescribes to translate the source address
-+of the IP packet into some other value.
-+.in -8
-+
-+.SS ip rule add - insert a new rule
-+.SS ip rule delete - delete a rule
-+
-+.TP
-+.BI type " TYPE " (default)
-+the type of this rule. The list of valid types was given in the previous
-+subsection.
-+
-+.TP
-+.BI from " PREFIX"
-+select the source prefix to match.
-+
-+.TP
-+.BI to " PREFIX"
-+select the destination prefix to match.
-+
-+.TP
-+.BI iif " NAME"
-+select the incoming device to match. If the interface is loopback,
-+the rule only matches packets originating from this host. This means
-+that you may create separate routing tables for forwarded and local
-+packets and, hence, completely segregate them.
-+
-+.TP
-+.BI tos " TOS"
-+.TP
-+.BI dsfield " TOS"
-+select the TOS value to match.
-+
-+.TP
-+.BI fwmark " MARK"
-+select the
-+.B fwmark
-+value to match.
-+
-+.TP
-+.BI priority " PREFERENCE"
-+the priority of this rule. Each rule should have an explicitly
-+set
-+.I unique
-+priority value.
-+
-+.TP
-+.BI table " TABLEID"
-+the routing table identifier to lookup if the rule selector matches.
-+
-+.TP
-+.BI realms " FROM/TO"
-+Realms to select if the rule matched and the routing table lookup
-+succeeded. Realm
-+.I TO
-+is only used if the route did not select any realm.
-+
-+.TP
-+.BI nat " ADDRESS"
-+The base of the IP address block to translate (for source addresses).
-+The
-+.I ADDRESS
-+may be either the start of the block of NAT addresses (selected by NAT
-+routes) or a local host address (or even zero).
-+In the last case the router does not translate the packets, but
-+masquerades them to this address.
-+
-+.B Warning:
-+Changes to the RPDB made with these commands do not become active
-+immediately. It is assumed that after a script finishes a batch of
-+updates, it flushes the routing cache with
-+.BR "ip route flush cache" .
-+
-+.SS ip rule show - list rules
-+This command has no arguments.
-+
-+.SH ip maddress - multicast addresses management
-+
-+.B maddress
-+objects are multicast addresses.
-+
-+.SS ip maddress show - list multicast addresses
-+
-+.TP
-+.BI dev " NAME " (default)
-+the device name.
-+
-+.SS ip maddress add - add a multicast address
-+.SS ip maddress delete - delete a multicast address
-+these commands attach/detach a static link layer multicast address
-+to listen on the interface.
-+Note that it is impossible to join protocol multicast groups
-+statically. This command only manages link layer addresses.
-+
-+.TP
-+.BI address " LLADDRESS " (default)
-+the link layer multicast address.
-+
-+.TP
-+.BI dev " NAME"
-+the device to join/leave this multicast address.
-+
-+.SH ip mroute - multicast routing cache management
-+.B mroute
-+objects are multicast routing cache entries created by a user level
-+mrouting daemon (f.e.
-+.B pimd
-+or
-+.B mrouted
-+).
-+
-+Due to the limitations of the current interface to the multicast routing
-+engine, it is impossible to change
-+.B mroute
-+objects administratively, so we may only display them. This limitation
-+will be removed in the future.
-+
-+.SS ip mroute show - list mroute cache entries
-+
-+.TP
-+.BI to " PREFIX " (default)
-+the prefix selecting the destination multicast addresses to list.
-+
-+.TP
-+.BI iif " NAME"
-+the interface on which multicast packets are received.
-+
-+.TP
-+.BI from " PREFIX"
-+the prefix selecting the IP source addresses of the multicast route.
-+
-+.SH ip tunnel - tunnel configuration
-+.B tunnel
-+objects are tunnels, encapsulating packets in IPv4 packets and then
-+sending them over the IP infrastructure.
-+
-+.SS ip tunnel add - add a new tunnel
-+.SS ip tunnel change - change an existing tunnel
-+.SS ip tunnel delete - destroy a tunnel
-+
-+.TP
-+.BI name " NAME " (default)
-+select the tunnel device name.
-+
-+.TP
-+.BI mode " MODE"
-+set the tunnel mode. Three modes are currently available:
-+.BR ipip ", " sit " and " gre "."
-+
-+.TP
-+.BI remote " ADDRESS"
-+set the remote endpoint of the tunnel.
-+
-+.TP
-+.BI local " ADDRESS"
-+set the fixed local address for tunneled packets.
-+It must be an address on another interface of this host.
-+
-+.TP
-+.BI ttl " N"
-+set a fixed TTL
-+.I N
-+on tunneled packets.
-+.I N
-+is a number in the range 1--255. 0 is a special value
-+meaning that packets inherit the TTL value.
-+The default value is:
-+.BR "inherit" .
-+
-+.TP
-+.BI tos " T"
-+.TP
-+.BI dsfield " T"
-+set a fixed TOS
-+.I T
-+on tunneled packets.
-+The default value is:
-+.BR "inherit" .
-+
-+.TP
-+.BI dev " NAME"
-+bind the tunnel to the device
-+.I NAME
-+so that tunneled packets will only be routed via this device and will
-+not be able to escape to another device when the route to endpoint
-+changes.
-+
-+.TP
-+.B nopmtudisc
-+disable Path MTU Discovery on this tunnel.
-+It is enabled by default. Note that a fixed ttl is incompatible
-+with this option: tunnelling with a fixed ttl always makes pmtu
-+discovery.
-+
-+.TP
-+.BI key " K"
-+.TP
-+.BI ikey " K"
-+.TP
-+.BI okey " K"
-+.RB ( " only GRE tunnels " )
-+use keyed GRE with key
-+.IR K ". " K
-+is either a number or an IP address-like dotted quad.
-+The
-+.B key
-+parameter sets the key to use in both directions.
-+The
-+.BR ikey " and " okey
-+parameters set different keys for input and output.
-+
-+.TP
-+.BR csum ", " icsum ", " ocsum
-+.RB ( " only GRE tunnels " )
-+generate/require checksums for tunneled packets.
-+The
-+.B ocsum
-+flag calculates checksums for outgoing packets.
-+The
-+.B icsum
-+flag requires that all input packets have the correct
-+checksum. The
-+.B csum
-+flag is equivalent to the combination
-+.BR "icsum ocsum" .
-+
-+.TP
-+.BR seq ", " iseq ", " oseq
-+.RB ( " only GRE tunnels " )
-+serialize packets.
-+The
-+.B oseq
-+flag enables sequencing of outgoing packets.
-+The
-+.B iseq
-+flag requires that all input packets are serialized.
-+The
-+.B seq
-+flag is equivalent to the combination
-+.BR "iseq oseq" .
-+.B It isn't work. Don't use it.
-+
-+.SS ip tunnel show - list tunnels
-+This command has no arguments.
-+
-+.SH ip monitor and rtmon - state monitoring
-+
-+The
-+.B ip
-+utility can monitor the state of devices, addresses
-+and routes continuously. This option has a slightly different format.
-+Namely, the
-+.B monitor
-+command is the first in the command line and then the object list follows:
-+
-+.BR "ip monitor" " [ " all " |"
-+.IR LISTofOBJECTS " ]"
-+
-+.I OBJECT-LIST
-+is the list of object types that we want to monitor.
-+It may contain
-+.BR link ", " address " and " route "."
-+If no
-+.B file
-+argument is given,
-+.B ip
-+opens RTNETLINK, listens on it and dumps state changes in the format
-+described in previous sections.
-+
-+.P
-+If a file name is given, it does not listen on RTNETLINK,
-+but opens the file containing RTNETLINK messages saved in binary format
-+and dumps them. Such a history file can be generated with the
-+.B rtmon
-+utility. This utility has a command line syntax similar to
-+.BR "ip monitor" .
-+Ideally,
-+.B rtmon
-+should be started before the first network configuration command
-+is issued. F.e. if you insert:
-+.sp
-+.in +8
-+rtmon file /var/log/rtmon.log
-+.in -8
-+.sp
-+in a startup script, you will be able to view the full history
-+later.
-+
-+.P
-+Certainly, it is possible to start
-+.B rtmon
-+at any time.
-+It prepends the history with the state snapshot dumped at the moment
-+of starting.
-+
-+.SH HISTORY
-+
-+.B ip
-+was written by Alexey N. Kuznetsov and added in Linux 2.2.
-+.SH SEE ALSO
-+.BR tc (8)
-+.br
-+.RB "IP Command reference " ip-cref.ps
-+.br
-+.RB "IP tunnels " ip-cref.ps
-+
-+.SH AUTHOR
-+
-+Manpage maintained by Michail Litvak <mci@owl.openwall.com>
-diff -Naur iproute2-orig/debian/manpages/old/ip.8 iproute2/debian/manpages/old/ip.8
---- iproute2-orig/debian/manpages/old/ip.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/ip.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,1809 @@
-+.TH IP 8 "17 January 2002" "iproute2" "Linux"
-+.SH NAME
-+ip \- show / manipulate routing, devices, policy routing and tunnels
-+.SH SYNOPSIS
-+
-+.ad l
-+.in +8
-+.ti -8
-+.B ip
-+.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | "
-+.BR help " }"
-+.sp
-+
-+.ti -8
-+.IR OBJECT " := { "
-+.BR link " | " addr " | " route " | " rule " | " neigh " | " tunnel " | "\
-+maddr " | " mroute " | " monitor " }"
-+.sp
-+
-+.ti -8
-+.IR OPTIONS " := { "
-+\fB\-V\fR[\fIersion\fR] |
-+\fB\-s\fR[\fItatistics\fR] |
-+\fB\-r\fR[\fIesolve\fR] |
-+\fB\-f\fR[\fIamily\fR] {
-+.BR inet " | " inet6 " | " ipx " | " dnet " | " link " } | "
-+\fB\-o\fR[\fIneline\fR] }
-+
-+.ti -8
-+.BI "ip link set " DEVICE
-+.RB "{ " up " | " down " | " arp " { " on " | " off " } |"
-+.br
-+.BR promisc " { " on " | " off " } |"
-+.br
-+.BR allmulti " { " on " | " off " } |"
-+.br
-+.BR dynamic " { " on " | " off " } |"
-+.br
-+.BR multicast " { " on " | " off " } |"
-+.br
-+.B txqueuelen
-+.IR PACKETS " |"
-+.br
-+.B name
-+.IR NEWNAME " |"
-+.br
-+.B address
-+.IR LLADDR " |"
-+.B broadcast
-+.IR LLADDR " |"
-+.br
-+.B mtu
-+.IR MTU " }"
-+
-+.ti -8
-+.B ip link show
-+.RI "[ " DEVICE " ]"
-+
-+.ti -8
-+.BR "ip addr" " { " add " | " del " } "
-+.IB IFADDR " dev " STRING
-+
-+.ti -8
-+.BR "ip addr" " { " show " | " flush " } [ " dev
-+.IR STRING " ] [ "
-+.B scope
-+.IR SCOPE-ID " ] [ "
-+.B to
-+.IR PREFIX " ] [ " FLAG-LIST " ] [ "
-+.B label
-+.IR PATTERN " ]"
-+
-+.ti -8
-+.IR IFADDR " := " PREFIX " | " ADDR
-+.B peer
-+.IR PREFIX " [ "
-+.B broadcast
-+.IR ADDR " ] [ "
-+.B anycast
-+.IR ADDR " ] [ "
-+.B label
-+.IR STRING " ] [ "
-+.B scope
-+.IR SCOPE-ID " ]"
-+
-+.ti -8
-+.IR SCOPE-ID " := "
-+.RB "[ " host " | " link " | " global " | "
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR FLAG-LIST " := [ " FLAG-LIST " ] " FLAG
-+
-+.ti -8
-+.IR FLAG " := "
-+.RB "[ " permanent " | " dynamic " | " secondary " | " primary " | "\
-+tentative " | " deprecated " ]"
-+
-+.ti -8
-+.BR "ip route" " { "
-+.BR list " | " flush " } "
-+.I SELECTOR
-+
-+.ti -8
-+.B ip route get
-+.IR ADDRESS " [ "
-+.BI from " ADDRESS " iif " STRING"
-+.RB " ] [ " oif
-+.IR STRING " ] [ "
-+.B tos
-+.IR TOS " ]"
-+
-+.ti -8
-+.BR "ip route" " { " add " | " del " | " change " | " append " | "\
-+replace " | " monitor " } "
-+.I ROUTE
-+
-+.ti -8
-+.IR SELECTOR " := "
-+.RB "[ " root
-+.IR PREFIX " ] [ "
-+.B match
-+.IR PREFIX " ] [ "
-+.B exact
-+.IR PREFIX " ] [ "
-+.B table
-+.IR TABLE_ID " ] [ "
-+.B proto
-+.IR RTPROTO " ] [ "
-+.B type
-+.IR TYPE " ] [ "
-+.B scope
-+.IR SCOPE " ]"
-+
-+.ti -8
-+.IR ROUTE " := " NODE_SPEC " [ " INFO_SPEC " ]"
-+
-+.ti -8
-+.IR NODE_SPEC " := [ " TYPE " ] " PREFIX " ["
-+.B tos
-+.IR TOS " ] [ "
-+.B table
-+.IR TABLE_ID " ] [ "
-+.B proto
-+.IR RTPROTO " ] [ "
-+.B scope
-+.IR SCOPE " ] [ "
-+.B metric
-+.IR METRIC " ]"
-+
-+.ti -8
-+.IR INFO_SPEC " := " "NH OPTIONS FLAGS" " ["
-+.B nexthop
-+.IR NH " ] ..."
-+
-+.ti -8
-+.IR NH " := [ "
-+.B via
-+.IR ADDRESS " ] [ "
-+.B dev
-+.IR STRING " ] [ "
-+.B weight
-+.IR NUMBER " ] " NHFLAGS
-+
-+.ti -8
-+.IR OPTIONS " := " FLAGS " [ "
-+.B mtu
-+.IR NUMBER " ] [ "
-+.B advmss
-+.IR NUMBER " ] [ "
-+.B rtt
-+.IR NUMBER " ] [ "
-+.B rttvar
-+.IR NUMBER " ] [ "
-+.B window
-+.IR NUMBER " ] [ "
-+.B cwnd
-+.IR NUMBER " ] [ "
-+.B ssthresh
-+.IR REALM " ] [ "
-+.B realms
-+.IR REALM " ]"
-+
-+.ti -8
-+.IR TYPE " := [ "
-+.BR unicast " | " local " | " broadcast " | " multicast " | "\
-+throw " | " unreachable " | " prohibit " | " blackhole " | " nat " ]"
-+
-+.ti -8
-+.IR TABLE_ID " := [ "
-+.BR local "| " main " | " default " | " all " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR SCOPE " := [ "
-+.BR host " | " link " | " global " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR FLAGS " := [ "
-+.BR equalize " ]"
-+
-+.ti -8
-+.IR NHFLAGS " := [ "
-+.BR onlink " | " pervasive " ]"
-+
-+.ti -8
-+.IR RTPROTO " := [ "
-+.BR kernel " | " boot " | " static " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.B ip rule
-+.RB " [ " list " | " add " | " del " ]"
-+.I SELECTOR ACTION
-+
-+.ti -8
-+.IR SELECTOR " := [ "
-+.B from
-+.IR PREFIX " ] [ "
-+.B to
-+.IR PREFIX " ] [ "
-+.B tos
-+.IR TOS " ] [ "
-+.B fwmark
-+.IR FWMARK " ] [ "
-+.B dev
-+.IR STRING " ] [ "
-+.B pref
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.IR ACTION " := [ "
-+.B table
-+.IR TABLE_ID " ] [ "
-+.B nat
-+.IR ADDRESS " ] [ "
-+.BR prohibit " | " reject " | " unreachable " ] [ " realms
-+.RI "[" SRCREALM "/]" DSTREALM " ]"
-+
-+.ti -8
-+.IR TABLE_ID " := [ "
-+.BR local " | " main " | " default " |"
-+.IR NUMBER " ]"
-+
-+.ti -8
-+.BR "ip neigh" " { " add " | " del " | " change " | " replace " } { "
-+.IR ADDR " [ "
-+.B lladdr
-+.IR LLADDR " ] [ "
-+.BR nud " { " permanent " | " noarp " | " stale " | " reachable " } ] | " proxy
-+.IR ADDR " } [ "
-+.B dev
-+.IR DEV " ]"
-+
-+.ti -8
-+.BR "ip neigh" " { " show " | " flush " } [ " to
-+.IR PREFIX " ] [ "
-+.B dev
-+.IR DEV " ] [ "
-+.B nud
-+.IR STATE " ]"
-+
-+.ti -8
-+.BR "ip tunnel" " { " add " | " change " | " del " | " show " }"
-+.RI "[ " NAME " ]"
-+.br
-+.RB "[ " mode " { " ipip " | " gre " | " sit " } ]"
-+.br
-+.RB "[ " remote
-+.IR ADDR " ] [ "
-+.B local
-+.IR ADDR " ]"
-+.br
-+.RB "[ [" i "|" o "]" seq " ] [ [" i "|" o "]" key
-+.IR KEY " ] [ "
-+.RB "[" i "|" o "]" csum " ] ]"
-+.br
-+.RB "[ " ttl
-+.IR TTL " ] [ "
-+.B tos
-+.IR TOS " ] [ "
-+.RB "[" no "]" pmtudisc " ]"
-+.br
-+.RB "[ " dev
-+.IR PHYS_DEV " ]"
-+
-+.ti -8
-+.IR ADDR " := { " IP_ADDRESS " |"
-+.BR any " }"
-+
-+.ti -8
-+.IR TOS " := { " NUMBER " |"
-+.BR inherit " }"
-+
-+.ti -8
-+.IR TTL " := { " 1 ".." 255 " | "
-+.BR inherit " }"
-+
-+.ti -8
-+.IR KEY " := { " DOTTED_QUAD " | " NUMBER " }"
-+
-+.ti -8
-+.BR "ip maddr" " [ " add " | " del " ]"
-+.IB MULTIADDR " dev " STRING
-+
-+.ti -8
-+.BR "ip maddr show" " [ " dev
-+.IR STRING " ]"
-+
-+.ti -8
-+.BR "ip mroute show" " ["
-+.IR PREFIX " ] [ "
-+.B from
-+.IR PREFIX " ] [ "
-+.B iif
-+.IR DEVICE " ]"
-+
-+.ti -8
-+.BR "ip monitor" " [ " all " |"
-+.IR LISTofOBJECTS " ]"
-+.in -8
-+.ad b
-+
-+.SH OPTIONS
-+
-+.TP
-+.BR "\-V" , " -Version"
-+print the version of the
-+.B ip
-+utility and exit.
-+
-+.TP
-+.BR "\-s" , " \-stats", " \-statistics"
-+output more information. If the option
-+appears twice or more, the amount of information increases.
-+As a rule, the information is statistics or some time values.
-+
-+.TP
-+.BR "\-f" , " \-family"
-+followed by protocol family identifier:
-+.BR "inet" , " inet6"
-+or
-+.B link
-+,enforce the protocol family to use. If the option is not present,
-+the protocol family is guessed from other arguments. If the rest
-+of the command line does not give enough information to guess the
-+family,
-+.B ip
-+falls back to the default one, usually
-+.B inet
-+or
-+.BR "any" .
-+.B link
-+is a special family identifier meaning that no networking protocol
-+is involved.
-+
-+.TP
-+.B \-4
-+shortcut for
-+.BR "-family inet" .
-+
-+.TP
-+.B \-6
-+shortcut for
-+.BR "\-family inet6" .
-+
-+.TP
-+.B \-0
-+shortcut for
-+.BR "\-family link" .
-+
-+.TP
-+.BR "\-o" , " \-oneline"
-+output each record on a single line, replacing line feeds
-+with the
-+.B '\'
-+character. This is convenient when you want to count records
-+with
-+.BR wc (1)
-+ or to
-+.BR grep (1)
-+the output.
-+
-+.TP
-+.BR "\-r" , " \-resolve"
-+use the system's name resolver to print DNS names instead of
-+host addresses.
-+
-+.SH IP - COMMAND SYNTAX
-+
-+.SS
-+.I OBJECT
-+
-+.TP
-+.B link
-+- network device.
-+
-+.TP
-+.B address
-+- protocol (IP or IPv6) address on a device.
-+.TP
-+.B neighbour
-+- ARP or NDISC cache entry.
-+
-+.TP
-+.B route
-+- routing table entry.
-+
-+.TP
-+.B rule
-+- rule in routing policy database.
-+
-+.TP
-+.B maddress
-+- multicast address.
-+
-+.TP
-+.B mroute
-+- multicast routing cache entry.
-+
-+.TP
-+.B tunnel
-+- tunnel over IP.
-+
-+.PP
-+The names of all objects may be written in full or
-+abbreviated form, f.e.
-+.B address
-+is abbreviated as
-+.B addr
-+or just
-+.B a.
-+
-+.SS
-+.I COMMAND
-+
-+Specifies the action to perform on the object.
-+The set of possible actions depends on the object type.
-+As a rule, it is possible to
-+.BR "add" , " delete"
-+and
-+.B show
-+(or
-+.B list
-+) objects, but some objects do not allow all of these operations
-+or have some additional commands. The
-+.B help
-+command is available for all objects. It prints
-+out a list of available commands and argument syntax conventions.
-+.sp
-+If no command is given, some default command is assumed.
-+Usually it is
-+.B list
-+or, if the objects of this class cannot be listed,
-+.BR "help" .
-+
-+.SH ip link - network device configuration
-+
-+.B link
-+is a network device and the corresponding commands
-+display and change the state of devices.
-+
-+.SS ip link set - change device attributes
-+
-+.TP
-+.BI dev " NAME " (default)
-+.I NAME
-+specifies network device to operate on.
-+
-+.TP
-+.BR up " and " down
-+change the state of the device to
-+.B UP
-+or
-+.BR "DOWN" .
-+
-+.TP
-+.BR "arp on " or " arp off"
-+change the
-+.B NOARP
-+flag on the device.
-+
-+.TP
-+.BR "multicast on " or " multicast off"
-+change the
-+.B MULTICAST
-+flag on the device.
-+
-+.TP
-+.BR "dynamic on " or " dynamic off"
-+change the
-+.B DYNAMIC
-+flag on the device.
-+
-+.TP
-+.BI name " NAME"
-+change the name of the device. This operation is not
-+recommended if the device is running or has some addresses
-+already configured.
-+
-+.TP
-+.BI txqueuelen " NUMBER"
-+.TP
-+.BI txqlen " NUMBER"
-+change the transmit queue length of the device.
-+
-+.TP
-+.BI mtu " NUMBER"
-+change the
-+.I MTU
-+of the device.
-+
-+.TP
-+.BI address " LLADDRESS"
-+change the station address of the interface.
-+
-+.TP
-+.BI broadcast " LLADDRESS"
-+.TP
-+.BI brd " LLADDRESS"
-+.TP
-+.BI peer " LLADDRESS"
-+change the link layer broadcast address or the peer address when
-+the interface is
-+.IR "POINTOPOINT" .
-+
-+.PP
-+.B Warning:
-+If multiple parameter changes are requested,
-+.B ip
-+aborts immediately after any of the changes have failed.
-+This is the only case when
-+.B ip
-+can move the system to an unpredictable state. The solution
-+is to avoid changing several parameters with one
-+.B ip link set
-+call.
-+
-+.SS ip link show - display device attributes
-+
-+.TP
-+.BI dev " NAME " (default)
-+.I NAME
-+specifies the network device to show.
-+If this argument is omitted all devices are listed.
-+
-+.TP
-+.B up
-+only display running interfaces.
-+
-+.SH ip address - protocol address management.
-+
-+The
-+.B address
-+is a protocol (IP or IPv6) address attached
-+to a network device. Each device must have at least one address
-+to use the corresponding protocol. It is possible to have several
-+different addresses attached to one device. These addresses are not
-+discriminated, so that the term
-+.B alias
-+is not quite appropriate for them and we do not use it in this document.
-+.sp
-+The
-+.B ip addr
-+command displays addresses and their properties, adds new addresses
-+and deletes old ones.
-+
-+.SS ip address add - add new protocol address.
-+
-+.TP
-+.BI dev " NAME"
-+the name of the device to add the address to.
-+
-+.TP
-+.BI local " ADDRESS " (default)
-+the address of the interface. The format of the address depends
-+on the protocol. It is a dotted quad for IP and a sequence of
-+hexadecimal halfwords separated by colons for IPv6. The
-+.I ADDRESS
-+may be followed by a slash and a decimal number which encodes
-+the network prefix length.
-+
-+.TP
-+.BI peer " ADDRESS"
-+the address of the remote endpoint for pointopoint interfaces.
-+Again, the
-+.I ADDRESS
-+may be followed by a slash and a decimal number, encoding the network
-+prefix length. If a peer address is specified, the local address
-+cannot have a prefix length. The network prefix is associated
-+with the peer rather than with the local address.
-+
-+.TP
-+.BI broadcast " ADDRESS"
-+the broadcast address on the interface.
-+.sp
-+It is possible to use the special symbols
-+.B '+'
-+and
-+.B '-'
-+instead of the broadcast address. In this case, the broadcast address
-+is derived by setting/resetting the host bits of the interface prefix.
-+
-+.TP
-+.BI label " NAME"
-+Each address may be tagged with a label string.
-+In order to preserve compatibility with Linux-2.0 net aliases,
-+this string must coincide with the name of the device or must be prefixed
-+with the device name followed by colon.
-+
-+.TP
-+.BI scope " SCOPE_VALUE"
-+the scope of the area where this address is valid.
-+The available scopes are listed in file
-+.BR "/etc/iproute2/rt_scopes" .
-+Predefined scope values are:
-+
-+.in +8
-+.B global
-+- the address is globally valid.
-+.sp
-+.B site
-+- (IPv6 only) the address is site local, i.e. it is
-+valid inside this site.
-+.sp
-+.B link
-+- the address is link local, i.e. it is valid only on this device.
-+.sp
-+.B host
-+- the address is valid only inside this host.
-+.in -8
-+
-+.SS ip address delete - delete protocol address
-+.B Arguments:
-+coincide with the arguments of
-+.B ip addr add.
-+The device name is a required argument. The rest are optional.
-+If no arguments are given, the first address is deleted.
-+
-+.SS ip address show - look at protocol addresses
-+
-+.TP
-+.BI dev " NAME " (default)
-+name of device.
-+
-+.TP
-+.BI scope " SCOPE_VAL"
-+only list addresses with this scope.
-+
-+.TP
-+.BI to " PREFIX"
-+only list addresses matching this prefix.
-+
-+.TP
-+.BI label " PATTERN"
-+only list addresses with labels matching the
-+.IR "PATTERN" .
-+.I PATTERN
-+is a usual shell style pattern.
-+
-+.TP
-+.BR dynamic " and " permanent
-+(IPv6 only) only list addresses installed due to stateless
-+address configuration or only list permanent (not dynamic)
-+addresses.
-+
-+.TP
-+.B tentative
-+(IPv6 only) only list addresses which did not pass duplicate
-+address detection.
-+
-+.TP
-+.B deprecated
-+(IPv6 only) only list deprecated addresses.
-+
-+.TP
-+.BR primary " and " secondary
-+only list primary (or secondary) addresses.
-+
-+.SS ip address flush - flush protocol addresses
-+This command flushes the protocol addresses selected by some criteria.
-+
-+.PP
-+This command has the same arguments as
-+.B show.
-+The difference is that it does not run when no arguments are given.
-+
-+.PP
-+.B Warning:
-+This command (and other
-+.B flush
-+commands described below) is pretty dangerous. If you make a mistake,
-+it will not forgive it, but will cruelly purge all the addresses.
-+
-+.PP
-+With the
-+.B -statistics
-+option, the command becomes verbose. It prints out the number of deleted
-+addresses and the number of rounds made to flush the address list. If
-+this option is given twice,
-+.B ip addr flush
-+also dumps all the deleted addresses in the format described in the
-+previous subsection.
-+
-+.SH ip neighbour - neighbour/arp tables management.
-+
-+.B neighbour
-+objects establish bindings between protocol addresses and
-+link layer addresses for hosts sharing the same link.
-+Neighbour entries are organized into tables. The IPv4 neighbour table
-+is known by another name - the ARP table.
-+
-+.P
-+The corresponding commands display neighbour bindings
-+and their properties, add new neighbour entries and delete old ones.
-+
-+.SS ip neighbour add - add a new neighbour entry
-+.SS ip neighbour change - change an existing entry
-+.SS ip neighbour replace - add a new entry or change an existing one
-+
-+These commands create new neighbour records or update existing ones.
-+
-+.TP
-+.BI to " ADDRESS " (default)
-+the protocol address of the neighbour. It is either an IPv4 or IPv6 address.
-+
-+.TP
-+.BI dev " NAME"
-+the interface to which this neighbour is attached.
-+
-+.TP
-+.BI lladdr " LLADDRESS"
-+the link layer address of the neighbour.
-+.I LLADDRESS
-+can also be
-+.BR "null" .
-+
-+.TP
-+.BI nud " NUD_STATE"
-+the state of the neighbour entry.
-+.B nud
-+is an abbreviation for 'Neigh bour Unreachability Detection'.
-+The state can take one of the following values:
-+
-+.in +8
-+.B permanent
-+- the neighbour entry is valid forever and can be only
-+be removed administratively.
-+.sp
-+
-+.B noarp
-+- the neighbour entry is valid. No attempts to validate
-+this entry will be made but it can be removed when its lifetime expires.
-+.sp
-+
-+.B reachable
-+- the neighbour entry is valid until the reachability
-+timeout expires.
-+.sp
-+
-+.B stale
-+- the neighbour entry is valid but suspicious.
-+This option to
-+.B ip neigh
-+does not change the neighbour state if it was valid and the address
-+is not changed by this command.
-+.in -8
-+
-+.SS ip neighbour delete - delete a neighbour entry
-+This command invalidates a neighbour entry.
-+
-+.PP
-+The arguments are the same as with
-+.BR "ip neigh add" ,
-+except that
-+.B lladdr
-+and
-+.B nud
-+are ignored.
-+
-+.PP
-+.B Warning:
-+Attempts to delete or manually change a
-+.B noarp
-+entry created by the kernel may result in unpredictable behaviour.
-+Particularly, the kernel may try to resolve this address even
-+on a
-+.B NOARP
-+interface or if the address is multicast or broadcast.
-+
-+.SS ip neighbour show - list neighbour entries
-+
-+This commands displays neighbour tables.
-+
-+.TP
-+.BI to " ADDRESS " (default)
-+the prefix selecting the neighbours to list.
-+
-+.TP
-+.BI dev " NAME"
-+only list the neighbours attached to this device.
-+
-+.TP
-+.B unused
-+only list neighbours which are not currently in use.
-+
-+.TP
-+.BI nud " NUD_STATE"
-+only list neighbour entries in this state.
-+.I NUD_STATE
-+takes values listed below or the special value
-+.B all
-+which means all states. This option may occur more than once.
-+If this option is absent,
-+.B ip
-+lists all entries except for
-+.B none
-+and
-+.BR "noarp" .
-+
-+.SS ip neighbour flush - flush neighbour entries
-+This command flushes neighbour tables, selecting
-+entries to flush by some criteria.
-+
-+.PP
-+This command has the same arguments as
-+.B show.
-+The differences are that it does not run when no arguments are given,
-+and that the default neighbour states to be flushed do not include
-+.B permanent
-+and
-+.BR "noarp" .
-+
-+.PP
-+With the
-+.B -statistics
-+option, the command becomes verbose. It prints out the number of
-+deleted neighbours and the number of rounds made to flush the
-+neighbour table. If the option is given
-+twice,
-+.B ip neigh flush
-+also dumps all the deleted neighbours.
-+
-+.SH ip route - routing table management
-+Manipulate route entries in the kernel routing tables keep
-+information about paths to other networked nodes.
-+.sp
-+.B Route types:
-+
-+.in +8
-+.B unicast
-+- the route entry describes real paths to the destinations covered
-+by the route prefix.
-+
-+.sp
-+.B unreachable
-+- these destinations are unreachable. Packets are discarded and the
-+ICMP message
-+.I host unreachable
-+is generated.
-+The local senders get an
-+.I EHOSTUNREACH
-+error.
-+
-+.sp
-+.B blackhole
-+- these destinations are unreachable. Packets are discarded silently.
-+The local senders get an
-+.I EINVAL
-+error.
-+
-+.sp
-+.B prohibit
-+- these destinations are unreachable. Packets are discarded and the
-+ICMP message
-+.I communication administratively prohibited
-+is generated. The local senders get an
-+.I EACCES
-+error.
-+
-+.sp
-+.B local
-+- the destinations are assigned to this host. The packets are looped
-+back and delivered locally.
-+
-+.sp
-+.B broadcast
-+- the destinations are broadcast addresses. The packets are sent as
-+link broadcasts.
-+
-+.sp
-+.B throw
-+- a special control route used together with policy rules. If such a
-+route is selected, lookup in this table is terminated pretending that
-+no route was found. Without policy routing it is equivalent to the
-+absence of the route in the routing table. The packets are dropped
-+and the ICMP message
-+.I net unreachable
-+is generated. The local senders get an
-+.I ENETUNREACH
-+error.
-+
-+.sp
-+.B nat
-+- a special NAT route. Destinations covered by the prefix
-+are considered to be dummy (or external) addresses which require translation
-+to real (or internal) ones before forwarding. The addresses to translate to
-+are selected with the attribute
-+.BR "via" .
-+
-+.sp
-+.B anycast
-+.RI "- " "not implemented"
-+the destinations are
-+.I anycast
-+addresses assigned to this host. They are mainly equivalent
-+to
-+.B local
-+with one difference: such addresses are invalid when used
-+as the source address of any packet.
-+
-+.sp
-+.B multicast
-+- a special type used for multicast routing. It is not present in
-+normal routing tables.
-+.in -8
-+
-+.P
-+.B Route tables:
-+Linux-2.x can pack routes into several routing
-+tables identified by a number in the range from 1 to 255 or by
-+name from the file
-+.B /etc/iproute2/rt_tables
-+. By default all normal routes are inserted into the
-+.B main
-+table (ID 254) and the kernel only uses this table when calculating routes.
-+
-+.sp
-+Actually, one other table always exists, which is invisible but
-+even more important. It is the
-+.B local
-+table (ID 255). This table
-+consists of routes for local and broadcast addresses. The kernel maintains
-+this table automatically and the administrator usually need not modify it
-+or even look at it.
-+
-+The multiple routing tables enter the game when
-+.I policy routing
-+is used.
-+
-+.SS ip route add - add new route
-+.SS ip route change - change route
-+.SS ip route replace - change or add new one
-+
-+.TP
-+.BI to " TYPE PREFIX " (default)
-+the destination prefix of the route. If
-+.I TYPE
-+is omitted,
-+.B ip
-+assumes type
-+.BR "unicast" .
-+Other values of
-+.I TYPE
-+are listed above.
-+.I PREFIX
-+is an IP or IPv6 address optionally followed by a slash and the
-+prefix length. If the length of the prefix is missing,
-+.B ip
-+assumes a full-length host route. There is also a special
-+.I PREFIX
-+.B default
-+- which is equivalent to IP
-+.B 0/0
-+or to IPv6
-+.BR "::/0" .
-+
-+.TP
-+.BI tos " TOS"
-+.TP
-+.BI dsfield " TOS"
-+the Type Of Service (TOS) key. This key has no associated mask and
-+the longest match is understood as: First, compare the TOS
-+of the route and of the packet. If they are not equal, then the packet
-+may still match a route with a zero TOS.
-+.I TOS
-+is either an 8 bit hexadecimal number or an identifier
-+from
-+.BR "/etc/iproute2/rt_dsfield" .
-+
-+.TP
-+.BI metric " NUMBER"
-+.TP
-+.BI preference " NUMBER"
-+the preference value of the route.
-+.I NUMBER
-+is an arbitrary 32bit number.
-+
-+.TP
-+.BI table " TABLEID"
-+the table to add this route to.
-+.I TABLEID
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_tables" .
-+If this parameter is omitted,
-+.B ip
-+assumes the
-+.B main
-+table, with the exception of
-+.BR local " , " broadcast " and " nat
-+routes, which are put into the
-+.B local
-+table by default.
-+
-+.TP
-+.BI dev " NAME"
-+the output device name.
-+
-+.TP
-+.BI via " ADDRESS"
-+the address of the nexthop router. Actually, the sense of this field
-+depends on the route type. For normal
-+.B unicast
-+routes it is either the true next hop router or, if it is a direct
-+route installed in BSD compatibility mode, it can be a local address
-+of the interface. For NAT routes it is the first address of the block
-+of translated IP destinations.
-+
-+.TP
-+.BI src " ADDRESS"
-+the source address to prefer when sending to the destinations
-+covered by the route prefix.
-+
-+.TP
-+.BI realm " REALMID"
-+the realm to which this route is assigned.
-+.I REALMID
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_realms" .
-+
-+.TP
-+.BI mtu " MTU"
-+.TP
-+.BI "mtu lock" " MTU"
-+the MTU along the path to the destination. If the modifier
-+.B lock
-+is not used, the MTU may be updated by the kernel due to
-+Path MTU Discovery. If the modifier
-+.B lock
-+is used, no path MTU discovery will be tried, all packets
-+will be sent without the DF bit in IPv4 case or fragmented
-+to MTU for IPv6.
-+
-+.TP
-+.BI window " NUMBER"
-+the maximal window for TCP to advertise to these destinations,
-+measured in bytes. It limits maximal data bursts that our TCP
-+peers are allowed to send to us.
-+
-+.TP
-+.BI rtt " NUMBER"
-+the initial RTT ('Round Trip Time') estimate.
-+
-+.TP
-+.BI rttvar " NUMBER " "(2.3.15+ only)"
-+the initial RTT variance estimate.
-+
-+.TP
-+.BI ssthresh " NUMBER " "(2.3.15+ only)"
-+an estimate for the initial slow start threshold.
-+
-+.TP
-+.BI cwnd " NUMBER " "(2.3.15+ only)"
-+the clamp for congestion window. It is ignored if the
-+.B lock
-+flag is not used.
-+
-+.TP
-+.BI advmss " NUMBER " "(2.3.15+ only)"
-+the MSS ('Maximal Segment Size') to advertise to these
-+destinations when establishing TCP connections. If it is not given,
-+Linux uses a default value calculated from the first hop device MTU.
-+(If the path to these destination is asymmetric, this guess may be wrong.)
-+
-+.TP
-+.BI reordering " NUMBER " "(2.3.15+ only)"
-+Maximal reordering on the path to this destination.
-+If it is not given, Linux uses the value selected with
-+.B sysctl
-+variable
-+.BR "net/ipv4/tcp_reordering" .
-+
-+.TP
-+.BI nexthop " NEXTHOP"
-+the nexthop of a multipath route.
-+.I NEXTHOP
-+is a complex value with its own syntax similar to the top level
-+argument lists:
-+
-+.in +8
-+.BI via " ADDRESS"
-+- is the nexthop router.
-+.sp
-+
-+.BI dev " NAME"
-+- is the output device.
-+.sp
-+
-+.BI weight " NUMBER"
-+- is a weight for this element of a multipath
-+route reflecting its relative bandwidth or quality.
-+.in -8
-+
-+.TP
-+.BI scope " SCOPE_VAL"
-+the scope of the destinations covered by the route prefix.
-+.I SCOPE_VAL
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_scopes" .
-+If this parameter is omitted,
-+.B ip
-+assumes scope
-+.B global
-+for all gatewayed
-+.B unicast
-+routes, scope
-+.B link
-+for direct
-+.BR unicast " and " broadcast
-+routes and scope
-+.BR host " for " local
-+routes.
-+
-+.TP
-+.BI protocol " RTPROTO"
-+the routing protocol identifier of this route.
-+.I RTPROTO
-+may be a number or a string from the file
-+.BR "/etc/iproute2/rt_protos" .
-+If the routing protocol ID is not given,
-+.B ip assumes protocol
-+.B boot
-+(i.e. it assumes the route was added by someone who doesn't
-+understand what they are doing). Several protocol values have
-+a fixed interpretation.
-+Namely:
-+
-+.in +8
-+.B redirect
-+- the route was installed due to an ICMP redirect.
-+.sp
-+
-+.B kernel
-+- the route was installed by the kernel during autoconfiguration.
-+.sp
-+
-+.B boot
-+- the route was installed during the bootup sequence.
-+If a routing daemon starts, it will purge all of them.
-+.sp
-+
-+.B static
-+- the route was installed by the administrator
-+to override dynamic routing. Routing daemon will respect them
-+and, probably, even advertise them to its peers.
-+.sp
-+
-+.B ra
-+- the route was installed by Router Discovery protocol.
-+.in -8
-+
-+.sp
-+The rest of the values are not reserved and the administrator is free
-+to assign (or not to assign) protocol tags.
-+
-+.TP
-+.B onlink
-+pretend that the nexthop is directly attached to this link,
-+even if it does not match any interface prefix.
-+
-+.TP
-+.B equalize
-+allow packet by packet randomization on multipath routes.
-+Without this modifier, the route will be frozen to one selected
-+nexthop, so that load splitting will only occur on per-flow base.
-+.B equalize
-+only works if the kernel is patched.
-+
-+.SS ip route delete - delete route
-+
-+.B ip route del
-+has the same arguments as
-+.BR "ip route add" ,
-+but their semantics are a bit different.
-+
-+Key values
-+.RB "(" to ", " tos ", " preference " and " table ")"
-+select the route to delete. If optional attributes are present,
-+.B ip
-+verifies that they coincide with the attributes of the route to delete.
-+If no route with the given key and attributes was found,
-+.B ip route del
-+fails.
-+
-+.SS ip route show - list routes
-+the command displays the contents of the routing tables or the route(s)
-+selected by some criteria.
-+
-+.TP
-+.BI to " SELECTOR " (default)
-+only select routes from the given range of destinations.
-+.I SELECTOR
-+consists of an optional modifier
-+.RB "(" root ", " match " or " exact ")"
-+and a prefix.
-+.BI root " PREFIX"
-+selects routes with prefixes not shorter than
-+.IR PREFIX "."
-+F.e.
-+.BI root " 0/0"
-+selects the entire routing table.
-+.BI match " PREFIX"
-+selects routes with prefixes not longer than
-+.IR PREFIX "."
-+F.e.
-+.BI match " 10.0/16"
-+selects
-+.IR 10.0/16 ","
-+.IR 10/8 " and " 0/0 ,
-+but it does not select
-+.IR 10.1/16 " and " 10.0.0/24 .
-+And
-+.BI exact " PREFIX"
-+(or just
-+.IR PREFIX ")"
-+selects routes with this exact prefix. If neither of these options
-+are present,
-+.B ip
-+assumes
-+.BI root " 0/0"
-+i.e. it lists the entire table.
-+
-+.TP
-+.BI tos " TOS"
-+.BI dsfield " TOS"
-+only select routes with the given TOS.
-+
-+.TP
-+.BI table " TABLEID"
-+show the routes from this table(s). The default setting is to show
-+.BR table main "."
-+.I TABLEID
-+may either be the ID of a real table or one of the special values:
-+.sp
-+.in +8
-+.B all
-+- list all of the tables.
-+.sp
-+.B cache
-+- dump the routing cache.
-+.in -8
-+
-+.TP
-+.B cloned
-+.TP
-+.B cached
-+list cloned routes i.e. routes which were dynamically forked from
-+other routes because some route attribute (f.e. MTU) was updated.
-+Actually, it is equivalent to
-+.BR "table cache" "."
-+
-+.TP
-+.BI from " SELECTOR"
-+the same syntax as for
-+.BR to ","
-+but it binds the source address range rather than destinations.
-+Note that the
-+.B from
-+option only works with cloned routes.
-+
-+.TP
-+.BI protocol " RTPROTO"
-+only list routes of this protocol.
-+
-+.TP
-+.BI scope " SCOPE_VAL"
-+only list routes with this scope.
-+
-+.TP
-+.BI type " TYPE"
-+only list routes of this type.
-+
-+.TP
-+.BI dev " NAME"
-+only list routes going via this device.
-+
-+.TP
-+.BI via " PREFIX"
-+only list routes going via the nexthop routers selected by
-+.IR PREFIX "."
-+
-+.TP
-+.BI src " PREFIX"
-+only list routes with preferred source addresses selected
-+by
-+.IR PREFIX "."
-+
-+.TP
-+.BI realm " REALMID"
-+.TP
-+.BI realms " FROMREALM/TOREALM"
-+only list routes with these realms.
-+
-+.SS ip route flush - flush routing tables
-+this command flushes routes selected by some criteria.
-+
-+.sp
-+The arguments have the same syntax and semantics as the arguments of
-+.BR "ip route show" ,
-+but routing tables are not listed but purged. The only difference is
-+the default action:
-+.B show
-+dumps all the IP main routing table but
-+.B flush
-+prints the helper page.
-+
-+.sp
-+With the
-+.B -statistics
-+option, the command becomes verbose. It prints out the number of
-+deleted routes and the number of rounds made to flush the routing
-+table. If the option is given
-+twice,
-+.B ip route flush
-+also dumps all the deleted routes in the format described in the
-+previous subsection.
-+
-+.SS ip route get - get a single route
-+this command gets a single route to a destination and prints its
-+contents exactly as the kernel sees it.
-+
-+.TP
-+.BI to " ADDRESS " (default)
-+the destination address.
-+
-+.TP
-+.BI from " ADDRESS"
-+the source address.
-+
-+.TP
-+.BI tos " TOS"
-+.TP
-+.BI dsfield " TOS"
-+the Type Of Service.
-+
-+.TP
-+.BI iif " NAME"
-+the device from which this packet is expected to arrive.
-+
-+.TP
-+.BI oif " NAME"
-+force the output device on which this packet will be routed.
-+
-+.TP
-+.B connected
-+if no source address
-+.RB "(option " from ")"
-+was given, relookup the route with the source set to the preferred
-+address received from the first lookup.
-+If policy routing is used, it may be a different route.
-+
-+.P
-+Note that this operation is not equivalent to
-+.BR "ip route show" .
-+.B show
-+shows existing routes.
-+.B get
-+resolves them and creates new clones if necessary. Essentially,
-+.B get
-+is equivalent to sending a packet along this path.
-+If the
-+.B iif
-+argument is not given, the kernel creates a route
-+to output packets towards the requested destination.
-+This is equivalent to pinging the destination
-+with a subsequent
-+.BR "ip route ls cache" ,
-+however, no packets are actually sent. With the
-+.B iif
-+argument, the kernel pretends that a packet arrived from this interface
-+and searches for a path to forward the packet.
-+
-+.SH ip rule - routing policy database management
-+
-+.BR "Rule" s
-+in the routing policy database control the route selection algorithm.
-+
-+.P
-+Classic routing algorithms used in the Internet make routing decisions
-+based only on the destination address of packets (and in theory,
-+but not in practice, on the TOS field).
-+
-+.P
-+In some circumstances we want to route packets differently depending not only
-+on destination addresses, but also on other packet fields: source address,
-+IP protocol, transport protocol ports or even packet payload.
-+This task is called 'policy routing'.
-+
-+.P
-+To solve this task, the conventional destination based routing table, ordered
-+according to the longest match rule, is replaced with a 'routing policy
-+database' (or RPDB), which selects routes by executing some set of rules.
-+
-+.P
-+Each policy routing rule consists of a
-+.B selector
-+and an
-+.B action predicate.
-+The RPDB is scanned in the order of increasing priority. The selector
-+of each rule is applied to {source address, destination address, incoming
-+interface, tos, fwmark} and, if the selector matches the packet,
-+the action is performed. The action predicate may return with success.
-+In this case, it will either give a route or failure indication
-+and the RPDB lookup is terminated. Otherwise, the RPDB program
-+continues on the next rule.
-+
-+.P
-+Semantically, natural action is to select the nexthop and the output device.
-+
-+.P
-+At startup time the kernel configures the default RPDB consisting of three
-+rules:
-+
-+.TP
-+1.
-+Priority: 0, Selector: match anything, Action: lookup routing
-+table
-+.B local
-+(ID 255).
-+The
-+.B local
-+table is a special routing table containing
-+high priority control routes for local and broadcast addresses.
-+.sp
-+Rule 0 is special. It cannot be deleted or overridden.
-+
-+.TP
-+2.
-+Priority: 32766, Selector: match anything, Action: lookup routing
-+table
-+.B main
-+(ID 254).
-+The
-+.B main
-+table is the normal routing table containing all non-policy
-+routes. This rule may be deleted and/or overridden with other
-+ones by the administrator.
-+
-+.TP
-+3.
-+Priority: 32767, Selector: match anything, Action: lookup routing
-+table
-+.B default
-+(ID 253).
-+The
-+.B default
-+table is empty. It is reserved for some post-processing if no previous
-+default rules selected the packet.
-+This rule may also be deleted.
-+
-+.P
-+Each RPDB entry has additional
-+attributes. F.e. each rule has a pointer to some routing
-+table. NAT and masquerading rules have an attribute to select new IP
-+address to translate/masquerade. Besides that, rules have some
-+optional attributes, which routes have, namely
-+.BR "realms" .
-+These values do not override those contained in the routing tables. They
-+are only used if the route did not select any attributes.
-+
-+.sp
-+The RPDB may contain rules of the following types:
-+
-+.in +8
-+.B unicast
-+- the rule prescribes to return the route found
-+in the routing table referenced by the rule.
-+
-+.B blackhole
-+- the rule prescribes to silently drop the packet.
-+
-+.B unreachable
-+- the rule prescribes to generate a 'Network is unreachable' error.
-+
-+.B prohibit
-+- the rule prescribes to generate 'Communication is administratively
-+prohibited' error.
-+
-+.B nat
-+- the rule prescribes to translate the source address
-+of the IP packet into some other value.
-+.in -8
-+
-+.SS ip rule add - insert a new rule
-+.SS ip rule delete - delete a rule
-+
-+.TP
-+.BI type " TYPE " (default)
-+the type of this rule. The list of valid types was given in the previous
-+subsection.
-+
-+.TP
-+.BI from " PREFIX"
-+select the source prefix to match.
-+
-+.TP
-+.BI to " PREFIX"
-+select the destination prefix to match.
-+
-+.TP
-+.BI iif " NAME"
-+select the incoming device to match. If the interface is loopback,
-+the rule only matches packets originating from this host. This means
-+that you may create separate routing tables for forwarded and local
-+packets and, hence, completely segregate them.
-+
-+.TP
-+.BI tos " TOS"
-+.TP
-+.BI dsfield " TOS"
-+select the TOS value to match.
-+
-+.TP
-+.BI fwmark " MARK"
-+select the
-+.B fwmark
-+value to match.
-+
-+.TP
-+.BI priority " PREFERENCE"
-+the priority of this rule. Each rule should have an explicitly
-+set
-+.I unique
-+priority value.
-+
-+.TP
-+.BI table " TABLEID"
-+the routing table identifier to lookup if the rule selector matches.
-+
-+.TP
-+.BI realms " FROM/TO"
-+Realms to select if the rule matched and the routing table lookup
-+succeeded. Realm
-+.I TO
-+is only used if the route did not select any realm.
-+
-+.TP
-+.BI nat " ADDRESS"
-+The base of the IP address block to translate (for source addresses).
-+The
-+.I ADDRESS
-+may be either the start of the block of NAT addresses (selected by NAT
-+routes) or a local host address (or even zero).
-+In the last case the router does not translate the packets, but
-+masquerades them to this address.
-+
-+.B Warning:
-+Changes to the RPDB made with these commands do not become active
-+immediately. It is assumed that after a script finishes a batch of
-+updates, it flushes the routing cache with
-+.BR "ip route flush cache" .
-+
-+.SS ip rule show - list rules
-+This command has no arguments.
-+
-+.SH ip maddress - multicast addresses management
-+
-+.B maddress
-+objects are multicast addresses.
-+
-+.SS ip maddress show - list multicast addresses
-+
-+.TP
-+.BI dev " NAME " (default)
-+the device name.
-+
-+.SS ip maddress add - add a multicast address
-+.SS ip maddress delete - delete a multicast address
-+these commands attach/detach a static link layer multicast address
-+to listen on the interface.
-+Note that it is impossible to join protocol multicast groups
-+statically. This command only manages link layer addresses.
-+
-+.TP
-+.BI address " LLADDRESS " (default)
-+the link layer multicast address.
-+
-+.TP
-+.BI dev " NAME"
-+the device to join/leave this multicast address.
-+
-+.SH ip mroute - multicast routing cache management
-+.B mroute
-+objects are multicast routing cache entries created by a user level
-+mrouting daemon (f.e.
-+.B pimd
-+or
-+.B mrouted
-+).
-+
-+Due to the limitations of the current interface to the multicast routing
-+engine, it is impossible to change
-+.B mroute
-+objects administratively, so we may only display them. This limitation
-+will be removed in the future.
-+
-+.SS ip mroute show - list mroute cache entries
-+
-+.TP
-+.BI to " PREFIX " (default)
-+the prefix selecting the destination multicast addresses to list.
-+
-+.TP
-+.BI iif " NAME"
-+the interface on which multicast packets are received.
-+
-+.TP
-+.BI from " PREFIX"
-+the prefix selecting the IP source addresses of the multicast route.
-+
-+.SH ip tunnel - tunnel configuration
-+.B tunnel
-+objects are tunnels, encapsulating packets in IPv4 packets and then
-+sending them over the IP infrastructure.
-+
-+.SS ip tunnel add - add a new tunnel
-+.SS ip tunnel change - change an existing tunnel
-+.SS ip tunnel delete - destroy a tunnel
-+
-+.TP
-+.BI name " NAME " (default)
-+select the tunnel device name.
-+
-+.TP
-+.BI mode " MODE"
-+set the tunnel mode. Three modes are currently available:
-+.BR ipip ", " sit " and " gre "."
-+
-+.TP
-+.BI remote " ADDRESS"
-+set the remote endpoint of the tunnel.
-+
-+.TP
-+.BI local " ADDRESS"
-+set the fixed local address for tunneled packets.
-+It must be an address on another interface of this host.
-+
-+.TP
-+.BI ttl " N"
-+set a fixed TTL
-+.I N
-+on tunneled packets.
-+.I N
-+is a number in the range 1--255. 0 is a special value
-+meaning that packets inherit the TTL value.
-+The default value is:
-+.BR "inherit" .
-+
-+.TP
-+.BI tos " T"
-+.TP
-+.BI dsfield " T"
-+set a fixed TOS
-+.I T
-+on tunneled packets.
-+The default value is:
-+.BR "inherit" .
-+
-+.TP
-+.BI dev " NAME"
-+bind the tunnel to the device
-+.I NAME
-+so that tunneled packets will only be routed via this device and will
-+not be able to escape to another device when the route to endpoint
-+changes.
-+
-+.TP
-+.B nopmtudisc
-+disable Path MTU Discovery on this tunnel.
-+It is enabled by default. Note that a fixed ttl is incompatible
-+with this option: tunnelling with a fixed ttl always makes pmtu
-+discovery.
-+
-+.TP
-+.BI key " K"
-+.TP
-+.BI ikey " K"
-+.TP
-+.BI okey " K"
-+.RB ( " only GRE tunnels " )
-+use keyed GRE with key
-+.IR K ". " K
-+is either a number or an IP address-like dotted quad.
-+The
-+.B key
-+parameter sets the key to use in both directions.
-+The
-+.BR ikey " and " okey
-+parameters set different keys for input and output.
-+
-+.TP
-+.BR csum ", " icsum ", " ocsum
-+.RB ( " only GRE tunnels " )
-+generate/require checksums for tunneled packets.
-+The
-+.B ocsum
-+flag calculates checksums for outgoing packets.
-+The
-+.B icsum
-+flag requires that all input packets have the correct
-+checksum. The
-+.B csum
-+flag is equivalent to the combination
-+.BR "icsum ocsum" .
-+
-+.TP
-+.BR seq ", " iseq ", " oseq
-+.RB ( " only GRE tunnels " )
-+serialize packets.
-+The
-+.B oseq
-+flag enables sequencing of outgoing packets.
-+The
-+.B iseq
-+flag requires that all input packets are serialized.
-+The
-+.B seq
-+flag is equivalent to the combination
-+.BR "iseq oseq" .
-+.B It isn't work. Don't use it.
-+
-+.SS ip tunnel show - list tunnels
-+This command has no arguments.
-+
-+.SH ip monitor and rtmon - state monitoring
-+
-+The
-+.B ip
-+utility can monitor the state of devices, addresses
-+and routes continuously. This option has a slightly different format.
-+Namely, the
-+.B monitor
-+command is the first in the command line and then the object list follows:
-+
-+.BR "ip monitor" " [ " all " |"
-+.IR LISTofOBJECTS " ]"
-+
-+.I OBJECT-LIST
-+is the list of object types that we want to monitor.
-+It may contain
-+.BR link ", " address " and " route "."
-+If no
-+.B file
-+argument is given,
-+.B ip
-+opens RTNETLINK, listens on it and dumps state changes in the format
-+described in previous sections.
-+
-+.P
-+If a file name is given, it does not listen on RTNETLINK,
-+but opens the file containing RTNETLINK messages saved in binary format
-+and dumps them. Such a history file can be generated with the
-+.B rtmon
-+utility. This utility has a command line syntax similar to
-+.BR "ip monitor" .
-+Ideally,
-+.B rtmon
-+should be started before the first network configuration command
-+is issued. F.e. if you insert:
-+.sp
-+.in +8
-+rtmon file /var/log/rtmon.log
-+.in -8
-+.sp
-+in a startup script, you will be able to view the full history
-+later.
-+
-+.P
-+Certainly, it is possible to start
-+.B rtmon
-+at any time.
-+It prepends the history with the state snapshot dumped at the moment
-+of starting.
-+
-+.SH HISTORY
-+
-+.B ip
-+was written by Alexey N. Kuznetsov and added in Linux 2.2.
-+.SH SEE ALSO
-+.BR tc (8)
-+.br
-+.RB "IP Command reference " ip-cref.ps
-+.br
-+.RB "IP tunnels " ip-cref.ps
-+
-+.SH AUTHOR
-+
-+Manpage maintained by Michail Litvak <mci@owl.openwall.com>
-diff -Naur iproute2-orig/debian/manpages/old/tc-cbq-details.8 iproute2/debian/manpages/old/tc-cbq-details.8
---- iproute2-orig/debian/manpages/old/tc-cbq-details.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-cbq-details.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,425 @@
-+.TH CBQ 8 "8 December 2001" "iproute2" "Linux"
-+.SH NAME
-+CBQ \- Class Based Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] cbq avpkt
-+bytes
-+.B bandwidth
-+rate
-+.B [ cell
-+bytes
-+.B ] [ ewma
-+log
-+.B ] [ mpu
-+bytes
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] cbq allot
-+bytes
-+.B [ bandwidth
-+rate
-+.B ] [ rate
-+rate
-+.B ] prio
-+priority
-+.B [ weight
-+weight
-+.B ] [ minburst
-+packets
-+.B ] [ maxburst
-+packets
-+.B ] [ ewma
-+log
-+.B ] [ cell
-+bytes
-+.B ] avpkt
-+bytes
-+.B [ mpu
-+bytes
-+.B ] [ bounded isolated ] [ split
-+handle
-+.B & defmap
-+defmap
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+Class Based Queueing is a classful qdisc that implements a rich
-+linksharing hierarchy of classes. It contains shaping elements as
-+well as prioritizing capabilities. Shaping is performed using link
-+idle time calculations based on the timing of dequeue events and
-+underlying link bandwidth.
-+
-+.SH SHAPING ALGORITHM
-+Shaping is done using link idle time calculations, and actions taken if
-+these calculations deviate from set limits.
-+
-+When shaping a 10mbit/s connection to 1mbit/s, the link will
-+be idle 90% of the time. If it isn't, it needs to be throttled so that it
-+IS idle 90% of the time.
-+
-+From the kernel's perspective, this is hard to measure, so CBQ instead
-+derives the idle time from the number of microseconds (in fact, jiffies)
-+that elapse between requests from the device driver for more data. Combined
-+with the knowledge of packet sizes, this is used to approximate how full or
-+empty the link is.
-+
-+This is rather circumspect and doesn't always arrive at proper
-+results. For example, what is the actual link speed of an interface
-+that is not really able to transmit the full 100mbit/s of data,
-+perhaps because of a badly implemented driver? A PCMCIA network card
-+will also never achieve 100mbit/s because of the way the bus is
-+designed - again, how do we calculate the idle time?
-+
-+The physical link bandwidth may be ill defined in case of not-quite-real
-+network devices like PPP over Ethernet or PPTP over TCP/IP. The effective
-+bandwidth in that case is probably determined by the efficiency of pipes
-+to userspace - which not defined.
-+
-+During operations, the effective idletime is measured using an
-+exponential weighted moving average (EWMA), which considers recent
-+packets to be exponentially more important than past ones. The Unix
-+loadaverage is calculated in the same way.
-+
-+The calculated idle time is subtracted from the EWMA measured one,
-+the resulting number is called 'avgidle'. A perfectly loaded link has
-+an avgidle of zero: packets arrive exactly at the calculated
-+interval.
-+
-+An overloaded link has a negative avgidle and if it gets too negative,
-+CBQ throttles and is then 'overlimit'.
-+
-+Conversely, an idle link might amass a huge avgidle, which would then
-+allow infinite bandwidths after a few hours of silence. To prevent
-+this, avgidle is capped at
-+.B maxidle.
-+
-+If overlimit, in theory, the CBQ could throttle itself for exactly the
-+amount of time that was calculated to pass between packets, and then
-+pass one packet, and throttle again. Due to timer resolution constraints,
-+this may not be feasible, see the
-+.B minburst
-+parameter below.
-+
-+.SH CLASSIFICATION
-+Within the one CBQ instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, CBQ starts at the root and uses various methods to
-+determine which class should receive the data. If a verdict is reached, this
-+process is repeated for the recipient class which might have further
-+means of classifying traffic to its children, if any.
-+
-+CBQ has the following methods available to classify a packet to any child
-+classes.
-+.TP
-+(i)
-+.B skb->priority class encoding.
-+Can be set from userspace by an application with the
-+.B SO_PRIORITY
-+setsockopt.
-+The
-+.B skb->priority class encoding
-+only applies if the skb->priority holds a major:minor handle of an existing
-+class within this qdisc.
-+.TP
-+(ii)
-+tc filters attached to the class.
-+.TP
-+(iii)
-+The defmap of a class, as set with the
-+.B split & defmap
-+parameters. The defmap may contain instructions for each possible Linux packet
-+priority.
-+
-+.P
-+Each class also has a
-+.B level.
-+Leaf nodes, attached to the bottom of the class hierarchy, have a level of 0.
-+.SH CLASSIFICATION ALGORITHM
-+
-+Classification is a loop, which terminates when a leaf class is found. At any
-+point the loop may jump to the fallback algorithm.
-+
-+The loop consists of the following steps:
-+.TP
-+(i)
-+If the packet is generated locally and has a valid classid encoded within its
-+.B skb->priority,
-+choose it and terminate.
-+
-+.TP
-+(ii)
-+Consult the tc filters, if any, attached to this child. If these return
-+a class which is not a leaf class, restart loop from the class returned.
-+If it is a leaf, choose it and terminate.
-+.TP
-+(iii)
-+If the tc filters did not return a class, but did return a classid,
-+try to find a class with that id within this qdisc.
-+Check if the found class is of a lower
-+.B level
-+than the current class. If so, and the returned class is not a leaf node,
-+restart the loop at the found class. If it is a leaf node, terminate.
-+If we found an upward reference to a higher level, enter the fallback
-+algorithm.
-+.TP
-+(iv)
-+If the tc filters did not return a class, nor a valid reference to one,
-+consider the minor number of the reference to be the priority. Retrieve
-+a class from the defmap of this class for the priority. If this did not
-+contain a class, consult the defmap of this class for the
-+.B BEST_EFFORT
-+class. If this is an upward reference, or no
-+.B BEST_EFFORT
-+class was defined,
-+enter the fallback algorithm. If a valid class was found, and it is not a
-+leaf node, restart the loop at this class. If it is a leaf, choose it and
-+terminate. If
-+neither the priority distilled from the classid, nor the
-+.B BEST_EFFORT
-+priority yielded a class, enter the fallback algorithm.
-+.P
-+The fallback algorithm resides outside of the loop and is as follows.
-+.TP
-+(i)
-+Consult the defmap of the class at which the jump to fallback occured. If
-+the defmap contains a class for the
-+.B
-+priority
-+of the class (which is related to the TOS field), choose this class and
-+terminate.
-+.TP
-+(ii)
-+Consult the map for a class for the
-+.B BEST_EFFORT
-+priority. If found, choose it, and terminate.
-+.TP
-+(iii)
-+Choose the class at which break out to the fallback algorithm occured. Terminate.
-+.P
-+The packet is enqueued to the class which was chosen when either algorithm
-+terminated. It is therefore possible for a packet to be enqueued *not* at a
-+leaf node, but in the middle of the hierarchy.
-+
-+.SH LINK SHARING ALGORITHM
-+When dequeuing for sending to the network device, CBQ decides which of its
-+classes will be allowed to send. It does so with a Weighted Round Robin process
-+in which each class with packets gets a chance to send in turn. The WRR process
-+starts by asking the highest priority classes (lowest numerically -
-+highest semantically) for packets, and will continue to do so until they
-+have no more data to offer, in which case the process repeats for lower
-+priorities.
-+
-+.B CERTAINTY ENDS HERE, ANK PLEASE HELP
-+
-+Each class is not allowed to send at length though - they can only dequeue a
-+configurable amount of data during each round.
-+
-+If a class is about to go overlimit, and it is not
-+.B bounded
-+it will try to borrow avgidle from siblings that are not
-+.B isolated.
-+This process is repeated from the bottom upwards. If a class is unable
-+to borrow enough avgidle to send a packet, it is throttled and not asked
-+for a packet for enough time for the avgidle to increase above zero.
-+
-+.B I REALLY NEED HELP FIGURING THIS OUT. REST OF DOCUMENT IS PRETTY CERTAIN
-+.B AGAIN.
-+
-+.SH QDISC
-+The root qdisc of a CBQ class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the CBQ instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional.
-+.TP
-+avpkt bytes
-+For calculations, the average packet size must be known. It is silently capped
-+at a minimum of 2/3 of the interface MTU. Mandatory.
-+.TP
-+bandwidth rate
-+To determine the idle time, CBQ must know the bandwidth of your underlying
-+physical interface, or parent qdisc. This is a vital parameter, more about it
-+later. Mandatory.
-+.TP
-+cell
-+The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
-+.TP
-+mpu
-+A zero sized packet may still take time to transmit. This value is the lower
-+cap for packet transmission time calculations - packets smaller than this value
-+are still deemed to have this size. Defaults to zero.
-+.TP
-+ewma log
-+When CBQ needs to measure the average idle time, it does so using an
-+Exponentially Weighted Moving Average which smoothes out measurements into
-+a moving average. The EWMA LOG determines how much smoothing occurs. Defaults
-+to 5. Lower values imply greater sensitivity. Must be between 0 and 31.
-+.P
-+A CBQ qdisc does not shape out of its own accord. It only needs to know certain
-+parameters about the underlying link. Actual shaping is done in classes.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+weight weight
-+When dequeuing to the interface, classes are tried for traffic in a
-+round-robin fashion. Classes with a higher configured qdisc will generally
-+have more traffic to offer during each round, so it makes sense to allow
-+it to dequeue more traffic. All weights under a class are normalized, so
-+only the ratios matter. Defaults to the configured rate, unless the priority
-+of this class is maximal, in which case it is set to 1.
-+.TP
-+allot bytes
-+Allot specifies how many bytes a qdisc can dequeue
-+during each round of the process. This parameter is weighted using the
-+renormalized class weight described above.
-+
-+.TP
-+priority priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children combined can send at. Mandatory.
-+
-+.TP
-+bandwidth rate
-+This is different from the bandwidth specified when creating a CBQ disc. Only
-+used to determine maxidle and offtime, which are only calculated when
-+specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
-+
-+.TP
-+maxburst
-+This number of packets is used to calculate maxidle so that when
-+avgidle is at maxidle, this number of average packets can be burst
-+before avgidle drops to 0. Set it higher to be more tolerant of
-+bursts. You can't set maxidle directly, only via this parameter.
-+
-+.TP
-+minburst
-+As mentioned before, CBQ needs to throttle in case of
-+overlimit. The ideal solution is to do so for exactly the calculated
-+idle time, and pass 1 packet. However, Unix kernels generally have a
-+hard time scheduling events shorter than 10ms, so it is better to
-+throttle for a longer period, and then pass minburst packets in one
-+go, and then sleep minburst times longer.
-+
-+The time to wait is called the offtime. Higher values of minburst lead
-+to more accurate shaping in the long term, but to bigger bursts at
-+millisecond timescales.
-+
-+.TP
-+minidle
-+If avgidle is below 0, we are overlimits and need to wait until
-+avgidle will be big enough to send one packet. To prevent a sudden
-+burst from shutting down the link for a prolonged period of time,
-+avgidle is reset to minidle if it gets too low.
-+
-+Minidle is specified in negative microseconds, so 10 means that
-+avgidle is capped at -10us.
-+
-+.TP
-+bounded
-+Signifies that this class will not borrow bandwidth from its siblings.
-+.TP
-+isolated
-+Means that this class will not borrow bandwidth to its siblings
-+
-+.TP
-+split major:minor & defmap bitmap[/bitmap]
-+If consulting filters attached to a class did not give a verdict,
-+CBQ can also classify based on the packet's priority. There are 16
-+priorities available, numbered from 0 to 15.
-+
-+The defmap specifies which priorities this class wants to receive,
-+specified as a bitmap. The Least Significant Bit corresponds to priority
-+zero. The
-+.B split
-+parameter tells CBQ at which class the decision must be made, which should
-+be a (grand)parent of the class you are adding.
-+
-+As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
-+configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
-+
-+The complimentary configuration would then
-+be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
-+Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
-+.TP
-+estimator interval timeconstant
-+CBQ can measure how much bandwidth each class is using, which tc filters
-+can use to classify packets with. In order to determine the bandwidth
-+it uses a very simple estimator that measures once every
-+.B interval
-+microseconds how much traffic has passed. This again is a EWMA, for which
-+the time constant can be specified, also in microseconds. The
-+.B time constant
-+corresponds to the sluggishness of the measurement or, conversely, to the
-+sensitivity of the average to short bursts. Higher values mean less
-+sensitivity.
-+
-+
-+
-+.SH SOURCES
-+.TP
-+o
-+Sally Floyd and Van Jacobson, "Link-sharing and Resource
-+Management Models for Packet Networks",
-+IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on CBQ and Guarantee Service", 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on Class-Based Queueing: Setting
-+Parameters", 1996
-+
-+.TP
-+o
-+Sally Floyd and Michael Speer, "Experimental Results
-+for Class-Based Queueing", 1998, not published.
-+
-+
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-cbq.8 iproute2/debian/manpages/old/tc-cbq.8
---- iproute2-orig/debian/manpages/old/tc-cbq.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-cbq.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,353 @@
-+.TH CBQ 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+CBQ \- Class Based Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] cbq [ allot
-+bytes
-+.B ] avpkt
-+bytes
-+.B bandwidth
-+rate
-+.B [ cell
-+bytes
-+.B ] [ ewma
-+log
-+.B ] [ mpu
-+bytes
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] cbq allot
-+bytes
-+.B [ bandwidth
-+rate
-+.B ] [ rate
-+rate
-+.B ] prio
-+priority
-+.B [ weight
-+weight
-+.B ] [ minburst
-+packets
-+.B ] [ maxburst
-+packets
-+.B ] [ ewma
-+log
-+.B ] [ cell
-+bytes
-+.B ] avpkt
-+bytes
-+.B [ mpu
-+bytes
-+.B ] [ bounded isolated ] [ split
-+handle
-+.B & defmap
-+defmap
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+Class Based Queueing is a classful qdisc that implements a rich
-+linksharing hierarchy of classes. It contains shaping elements as
-+well as prioritizing capabilities. Shaping is performed using link
-+idle time calculations based on the timing of dequeue events and
-+underlying link bandwidth.
-+
-+.SH SHAPING ALGORITHM
-+When shaping a 10mbit/s connection to 1mbit/s, the link will
-+be idle 90% of the time. If it isn't, it needs to be throttled so that it
-+IS idle 90% of the time.
-+
-+During operations, the effective idletime is measured using an
-+exponential weighted moving average (EWMA), which considers recent
-+packets to be exponentially more important than past ones. The Unix
-+loadaverage is calculated in the same way.
-+
-+The calculated idle time is subtracted from the EWMA measured one,
-+the resulting number is called 'avgidle'. A perfectly loaded link has
-+an avgidle of zero: packets arrive exactly at the calculated
-+interval.
-+
-+An overloaded link has a negative avgidle and if it gets too negative,
-+CBQ throttles and is then 'overlimit'.
-+
-+Conversely, an idle link might amass a huge avgidle, which would then
-+allow infinite bandwidths after a few hours of silence. To prevent
-+this, avgidle is capped at
-+.B maxidle.
-+
-+If overlimit, in theory, the CBQ could throttle itself for exactly the
-+amount of time that was calculated to pass between packets, and then
-+pass one packet, and throttle again. Due to timer resolution constraints,
-+this may not be feasible, see the
-+.B minburst
-+parameter below.
-+
-+.SH CLASSIFICATION
-+Within the one CBQ instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, CBQ starts at the root and uses various methods to
-+determine which class should receive the data.
-+
-+In the absence of uncommon configuration options, the process is rather easy.
-+At each node we look for an instruction, and then go to the class the
-+instruction refers us to. If the class found is a barren leaf-node (without
-+children), we enqueue the packet there. If it is not yet a leaf node, we do
-+the whole thing over again starting from that node.
-+
-+The following actions are performed, in order at each node we visit, until one
-+sends us to another node, or terminates the process.
-+.TP
-+(i)
-+Consult filters attached to the class. If sent to a leafnode, we are done.
-+Otherwise, restart.
-+.TP
-+(ii)
-+Consult the defmap for the priority assigned to this packet, which depends
-+on the TOS bits. Check if the referral is leafless, otherwise restart.
-+.TP
-+(iii)
-+Ask the defmap for instructions for the 'best effort' priority. Check the
-+answer for leafness, otherwise restart.
-+.TP
-+(iv)
-+If none of the above returned with an instruction, enqueue at this node.
-+.P
-+This algorithm makes sure that a packet always ends up somewhere, even while
-+you are busy building your configuration.
-+
-+For more details, see
-+.BR tc-cbq-details(8).
-+
-+.SH LINK SHARING ALGORITHM
-+When dequeuing for sending to the network device, CBQ decides which of its
-+classes will be allowed to send. It does so with a Weighted Round Robin process
-+in which each class with packets gets a chance to send in turn. The WRR process
-+starts by asking the highest priority classes (lowest numerically -
-+highest semantically) for packets, and will continue to do so until they
-+have no more data to offer, in which case the process repeats for lower
-+priorities.
-+
-+Classes by default borrow bandwidth from their siblings. A class can be
-+prevented from doing so by declaring it 'bounded'. A class can also indicate
-+its unwillingness to lend out bandwidth by being 'isolated'.
-+
-+.SH QDISC
-+The root of a CBQ qdisc class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the CBQ instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional, but very useful if classes
-+will be generated within this qdisc.
-+.TP
-+allot bytes
-+This allotment is the 'chunkiness' of link sharing and is used for determining packet
-+transmission time tables. The qdisc allot differs slightly from the class allot discussed
-+below. Optional. Defaults to a reasonable value, related to avpkt.
-+.TP
-+avpkt bytes
-+The average size of a packet is needed for calculating maxidle, and is also used
-+for making sure 'allot' has a safe value. Mandatory.
-+.TP
-+bandwidth rate
-+To determine the idle time, CBQ must know the bandwidth of your underlying
-+physical interface, or parent qdisc. This is a vital parameter, more about it
-+later. Mandatory.
-+.TP
-+cell
-+The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
-+.TP
-+mpu
-+A zero sized packet may still take time to transmit. This value is the lower
-+cap for packet transmission time calculations - packets smaller than this value
-+are still deemed to have this size. Defaults to zero.
-+.TP
-+ewma log
-+When CBQ needs to measure the average idle time, it does so using an
-+Exponentially Weighted Moving Average which smoothes out measurements into
-+a moving average. The EWMA LOG determines how much smoothing occurs. Lower
-+values imply greater sensitivity. Must be between 0 and 31. Defaults
-+to 5.
-+.P
-+A CBQ qdisc does not shape out of its own accord. It only needs to know certain
-+parameters about the underlying link. Actual shaping is done in classes.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+weight weight
-+When dequeuing to the interface, classes are tried for traffic in a
-+round-robin fashion. Classes with a higher configured qdisc will generally
-+have more traffic to offer during each round, so it makes sense to allow
-+it to dequeue more traffic. All weights under a class are normalized, so
-+only the ratios matter. Defaults to the configured rate, unless the priority
-+of this class is maximal, in which case it is set to 1.
-+.TP
-+allot bytes
-+Allot specifies how many bytes a qdisc can dequeue
-+during each round of the process. This parameter is weighted using the
-+renormalized class weight described above. Silently capped at a minimum of
-+3/2 avpkt. Mandatory.
-+
-+.TP
-+prio priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+avpkt
-+See the QDISC section.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children combined can send at. Mandatory.
-+
-+.TP
-+bandwidth rate
-+This is different from the bandwidth specified when creating a CBQ disc! Only
-+used to determine maxidle and offtime, which are only calculated when
-+specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
-+
-+.TP
-+maxburst
-+This number of packets is used to calculate maxidle so that when
-+avgidle is at maxidle, this number of average packets can be burst
-+before avgidle drops to 0. Set it higher to be more tolerant of
-+bursts. You can't set maxidle directly, only via this parameter.
-+
-+.TP
-+minburst
-+As mentioned before, CBQ needs to throttle in case of
-+overlimit. The ideal solution is to do so for exactly the calculated
-+idle time, and pass 1 packet. However, Unix kernels generally have a
-+hard time scheduling events shorter than 10ms, so it is better to
-+throttle for a longer period, and then pass minburst packets in one
-+go, and then sleep minburst times longer.
-+
-+The time to wait is called the offtime. Higher values of minburst lead
-+to more accurate shaping in the long term, but to bigger bursts at
-+millisecond timescales. Optional.
-+
-+.TP
-+minidle
-+If avgidle is below 0, we are overlimits and need to wait until
-+avgidle will be big enough to send one packet. To prevent a sudden
-+burst from shutting down the link for a prolonged period of time,
-+avgidle is reset to minidle if it gets too low.
-+
-+Minidle is specified in negative microseconds, so 10 means that
-+avgidle is capped at -10us. Optional.
-+
-+.TP
-+bounded
-+Signifies that this class will not borrow bandwidth from its siblings.
-+.TP
-+isolated
-+Means that this class will not borrow bandwidth to its siblings
-+
-+.TP
-+split major:minor & defmap bitmap[/bitmap]
-+If consulting filters attached to a class did not give a verdict,
-+CBQ can also classify based on the packet's priority. There are 16
-+priorities available, numbered from 0 to 15.
-+
-+The defmap specifies which priorities this class wants to receive,
-+specified as a bitmap. The Least Significant Bit corresponds to priority
-+zero. The
-+.B split
-+parameter tells CBQ at which class the decision must be made, which should
-+be a (grand)parent of the class you are adding.
-+
-+As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
-+configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
-+
-+The complimentary configuration would then
-+be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
-+Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
-+.TP
-+estimator interval timeconstant
-+CBQ can measure how much bandwidth each class is using, which tc filters
-+can use to classify packets with. In order to determine the bandwidth
-+it uses a very simple estimator that measures once every
-+.B interval
-+microseconds how much traffic has passed. This again is a EWMA, for which
-+the time constant can be specified, also in microseconds. The
-+.B time constant
-+corresponds to the sluggishness of the measurement or, conversely, to the
-+sensitivity of the average to short bursts. Higher values mean less
-+sensitivity.
-+
-+.SH BUGS
-+The actual bandwidth of the underlying link may not be known, for example
-+in the case of PPoE or PPTP connections which in fact may send over a
-+pipe, instead of over a physical device. CBQ is quite resilient to major
-+errors in the configured bandwidth, probably a the cost of coarser shaping.
-+
-+Default kernels rely on coarse timing information for making decisions. These
-+may make shaping precise in the long term, but inaccurate on second long scales.
-+
-+See
-+.BR tc-cbq-details(8)
-+for hints on how to improve this.
-+
-+.SH SOURCES
-+.TP
-+o
-+Sally Floyd and Van Jacobson, "Link-sharing and Resource
-+Management Models for Packet Networks",
-+IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on Class-Based Queueing: Setting
-+Parameters", 1996
-+
-+.TP
-+o
-+Sally Floyd and Michael Speer, "Experimental Results
-+for Class-Based Queueing", 1998, not published.
-+
-+
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-htb.8 iproute2/debian/manpages/old/tc-htb.8
---- iproute2-orig/debian/manpages/old/tc-htb.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-htb.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,150 @@
-+.TH HTB 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+HTB \- Hierarchy Token Bucket
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] htb [ default
-+minor-id
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] htb rate
-+rate
-+.B [ ceil
-+rate
-+.B ] burst
-+bytes
-+.B [ cburst
-+bytes
-+.B ] [ prio
-+priority
-+.B ]
-+
-+.SH DESCRIPTION
-+HTB is meant as a more understandable and intuitive replacement for
-+the CBQ qdisc in Linux. Both CBQ and HTB help you to control the use
-+of the outbound bandwidth on a given link. Both allow you to use one
-+physical link to simulate several slower links and to send different
-+kinds of traffic on different simulated links. In both cases, you have
-+to specify how to divide the physical link into simulated links and
-+how to decide which simulated link to use for a given packet to be sent.
-+
-+Unlike CBQ, HTB shapes traffic based on the Token Bucket Filter algorithm
-+which does not depend on interface characteristics and so does not need to
-+know the underlying bandwidth of the outgoing interface.
-+
-+.SH SHAPING ALGORITHM
-+Shaping works as documented in
-+.B tc-tbf (8).
-+
-+.SH CLASSIFICATION
-+Within the one HRB instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, HTB starts at the root and uses various methods to
-+determine which class should receive the data.
-+
-+In the absence of uncommon configuration options, the process is rather easy.
-+At each node we look for an instruction, and then go to the class the
-+instruction refers us to. If the class found is a barren leaf-node (without
-+children), we enqueue the packet there. If it is not yet a leaf node, we do
-+the whole thing over again starting from that node.
-+
-+The following actions are performed, in order at each node we visit, until one
-+sends us to another node, or terminates the process.
-+.TP
-+(i)
-+Consult filters attached to the class. If sent to a leafnode, we are done.
-+Otherwise, restart.
-+.TP
-+(ii)
-+If none of the above returned with an instruction, enqueue at this node.
-+.P
-+This algorithm makes sure that a packet always ends up somewhere, even while
-+you are busy building your configuration.
-+
-+.SH LINK SHARING ALGORITHM
-+FIXME
-+
-+.SH QDISC
-+The root of a HTB qdisc class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the HTB instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the HTB can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional, but very useful if classes
-+will be generated within this qdisc.
-+.TP
-+default minor-id
-+Unclassified traffic gets sent to the class with this minor-id.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+prio priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children are guaranteed. Mandatory.
-+
-+.TP
-+ceil rate
-+Maximum rate at which a class can send, if its parent has bandwidth to spare.
-+Defaults to the configured rate, which implies no borrowing
-+
-+.TP
-+burst bytes
-+Amount of bytes that can be burst at
-+.B ceil
-+speed, in excess of the configured
-+.B rate.
-+Should be at least as high as the highest burst of all children.
-+
-+.TP
-+cburst bytes
-+Amount of bytes that can be burst at 'infinite' speed, in other words, as fast
-+as the interface can transmit them. For perfect evening out, should be equal to at most one average
-+packet. Should be at least as high as the highest cburst of all children.
-+
-+.SH NOTES
-+Due to Unix timing constraints, the maximum ceil rate is not infinite and may in fact be quite low. On Intel,
-+there are 100 timer events per second, the maximum rate is that rate at which 'burst' bytes are sent each timer tick.
-+From this, the mininum burst size for a specified rate can be calculated. For i386, a 10mbit rate requires a 12 kilobyte
-+burst as 100*12kb*8 equals 10mbit.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+.P
-+HTB website: http://luxik.cdi.cz/~devik/qos/htb/
-+.SH AUTHOR
-+Martin Devera <devik@cdi.cz>. This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-pbfifo.8 iproute2/debian/manpages/old/tc-pbfifo.8
---- iproute2-orig/debian/manpages/old/tc-pbfifo.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-pbfifo.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,72 @@
-+.TH PBFIFO 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+pfifo \- Packet limited First In, First Out queue
-+.P
-+bfifo \- Byte limited First In, First Out queue
-+
-+.SH SYNOPSIS
-+.B tc qdisc ... add pfifo
-+.B [ limit
-+packets
-+.B ]
-+.P
-+.B tc qdisc ... add bfifo
-+.B [ limit
-+bytes
-+.B ]
-+
-+.SH DESCRIPTION
-+The pfifo and bfifo qdiscs are unadorned First In, First Out queues. They are the
-+simplest queues possible and therefore have no overhead.
-+.B pfifo
-+constrains the queue size as measured in packets.
-+.B bfifo
-+does so as measured in bytes.
-+
-+Like all non-default qdiscs, they maintain statistics. This might be a reason to prefer
-+pfifo or bfifo over the default.
-+
-+.SH ALGORITHM
-+A list of packets is maintained, when a packet is enqueued it gets inserted at the tail of
-+a list. When a packet needs to be sent out to the network, it is taken from the head of the list.
-+
-+If the list is too long, no further packets are allowed on. This is called 'tail drop'.
-+
-+.SH PARAMETERS
-+.TP
-+limit
-+Maximum queue size. Specified in bytes for bfifo, in packets for pfifo. For pfifo, defaults
-+to the interface txqueuelen, as specified with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+
-+For bfifo, it defaults to the txqueuelen multiplied by the interface MTU.
-+
-+.SH OUTPUT
-+The output of
-+.B tc -s qdisc ls
-+contains the limit, either in packets or in bytes, and the number of bytes
-+and packets actually sent. An unsent and dropped packet only appears between braces
-+and is not counted as 'Sent'.
-+
-+In this example, the queue length is 100 packets, 45894 bytes were sent over 681 packets.
-+No packets were dropped, and as the pfifo queue does not slow down packets, there were also no
-+overlimits:
-+.P
-+.nf
-+# tc -s qdisc ls dev eth0
-+qdisc pfifo 8001: dev eth0 limit 100p
-+ Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)
-+.fi
-+
-+If a backlog occurs, this is displayed as well.
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-pfifo_fast.8 iproute2/debian/manpages/old/tc-pfifo_fast.8
---- iproute2-orig/debian/manpages/old/tc-pfifo_fast.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-pfifo_fast.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,59 @@
-+.TH PFIFO_FAST 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+pfifo_fast \- three-band first in, first out queue
-+
-+.SH DESCRIPTION
-+pfifo_fast is the default qdisc of each interface.
-+
-+Whenever an interface is created, the pfifo_fast qdisc is automatically used
-+as a queue. If another qdisc is attached, it preempts the default
-+pfifo_fast, which automatically returns to function when an existing qdisc
-+is detached.
-+
-+In this sense this qdisc is magic, and unlike other qdiscs.
-+
-+.SH ALGORITHM
-+The algorithm is very similar to that of the classful
-+.BR tc-prio (8)
-+qdisc.
-+.B pfifo_fast
-+is like three
-+.BR tc-pfifo (8)
-+queues side by side, where packets can be enqueued in any of the three bands
-+based on their Type of Service bits or assigned priority.
-+
-+Not all three bands are dequeued simultaneously - as long as lower bands
-+have traffic, higher bands are never dequeued. This can be used to
-+prioritize interactive traffic or penalize 'lowest cost' traffic.
-+
-+Each band can be txqueuelen packets long, as configured with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+Additional packets coming in are not enqueued but are instead dropped.
-+
-+See
-+.BR tc-prio (8)
-+for complete details on how TOS bits are translated into bands.
-+.SH PARAMETERS
-+.TP
-+txqueuelen
-+The length of the three bands depends on the interface txqueuelen, as
-+specified with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+
-+.SH BUGS
-+Does not maintain statistics and does not show up in tc qdisc ls. This is because
-+it is the automatic default in the absence of a configured qdisc.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-prio.8 iproute2/debian/manpages/old/tc-prio.8
---- iproute2-orig/debian/manpages/old/tc-prio.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-prio.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,187 @@
-+.TH PRIO 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+PRIO \- Priority qdisc
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] prio [ bands
-+bands
-+.B ] [ priomap
-+band,band,band...
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+The PRIO qdisc is a simple classful queueing discipline that contains
-+an arbitrary number of classes of differing priority. The classes are
-+dequeued in numerical descending order of priority. PRIO is a scheduler
-+and never delays packets - it is a work-conserving qdisc, though the qdiscs
-+contained in the classes may not be.
-+
-+Very useful for lowering latency when there is no need for slowing down
-+traffic.
-+
-+.SH ALGORITHM
-+On creation with 'tc qdisc add', a fixed number of bands is created. Each
-+band is a class, although is not possible to add classes with 'tc qdisc
-+add', the number of bands to be created must instead be specified on the
-+commandline attaching PRIO to its root.
-+
-+When dequeueing, band 0 is tried first and only if it did not deliver a
-+packet does PRIO try band 1, and so onwards. Maximum reliability packets
-+should therefore go to band 0, minimum delay to band 1 and the rest to band
-+2.
-+
-+As the PRIO qdisc itself will have minor number 0, band 0 is actually
-+major:1, band 1 is major:2, etc. For major, substitute the major number
-+assigned to the qdisc on 'tc qdisc add' with the
-+.B handle
-+parameter.
-+
-+.SH CLASSIFICATION
-+Three methods are available to PRIO to determine in which band a packet will
-+be enqueued.
-+.TP
-+From userspace
-+A process with sufficient privileges can encode the destination class
-+directly with SO_PRIORITY, see
-+.BR tc(7).
-+.TP
-+with a tc filter
-+A tc filter attached to the root qdisc can point traffic directly to a class
-+.TP
-+with the priomap
-+Based on the packet priority, which in turn is derived from the Type of
-+Service assigned to the packet.
-+.P
-+Only the priomap is specific to this qdisc.
-+.SH QDISC PARAMETERS
-+.TP
-+bands
-+Number of bands. If changed from the default of 3,
-+.B priomap
-+must be updated as well.
-+.TP
-+priomap
-+The priomap maps the priority of
-+a packet to a class. The priority can either be set directly from userspace,
-+or be derived from the Type of Service of the packet.
-+
-+Determines how packet priorities, as assigned by the kernel, map to
-+bands. Mapping occurs based on the TOS octet of the packet, which looks like
-+this:
-+
-+.nf
-+0 1 2 3 4 5 6 7
-++---+---+---+---+---+---+---+---+
-+| | | |
-+|PRECEDENCE | TOS |MBZ|
-+| | | |
-++---+---+---+---+---+---+---+---+
-+.fi
-+
-+The four TOS bits (the 'TOS field') are defined as:
-+
-+.nf
-+Binary Decimcal Meaning
-+-----------------------------------------
-+1000 8 Minimize delay (md)
-+0100 4 Maximize throughput (mt)
-+0010 2 Maximize reliability (mr)
-+0001 1 Minimize monetary cost (mmc)
-+0000 0 Normal Service
-+.fi
-+
-+As there is 1 bit to the right of these four bits, the actual value of the
-+TOS field is double the value of the TOS bits. Tcpdump -v -v shows you the
-+value of the entire TOS field, not just the four bits. It is the value you
-+see in the first column of this table:
-+
-+.nf
-+TOS Bits Means Linux Priority Band
-+------------------------------------------------------------
-+0x0 0 Normal Service 0 Best Effort 1
-+0x2 1 Minimize Monetary Cost 1 Filler 2
-+0x4 2 Maximize Reliability 0 Best Effort 1
-+0x6 3 mmc+mr 0 Best Effort 1
-+0x8 4 Maximize Throughput 2 Bulk 2
-+0xa 5 mmc+mt 2 Bulk 2
-+0xc 6 mr+mt 2 Bulk 2
-+0xe 7 mmc+mr+mt 2 Bulk 2
-+0x10 8 Minimize Delay 6 Interactive 0
-+0x12 9 mmc+md 6 Interactive 0
-+0x14 10 mr+md 6 Interactive 0
-+0x16 11 mmc+mr+md 6 Interactive 0
-+0x18 12 mt+md 4 Int. Bulk 1
-+0x1a 13 mmc+mt+md 4 Int. Bulk 1
-+0x1c 14 mr+mt+md 4 Int. Bulk 1
-+0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1
-+.fi
-+
-+The second column contains the value of the relevant
-+four TOS bits, followed by their translated meaning. For example, 15 stands
-+for a packet wanting Minimal Montetary Cost, Maximum Reliability, Maximum
-+Throughput AND Minimum Delay.
-+
-+The fourth column lists the way the Linux kernel interprets the TOS bits, by
-+showing to which Priority they are mapped.
-+
-+The last column shows the result of the default priomap. On the commandline,
-+the default priomap looks like this:
-+
-+ 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
-+
-+This means that priority 4, for example, gets mapped to band number 1.
-+The priomap also allows you to list higher priorities (> 7) which do not
-+correspond to TOS mappings, but which are set by other means.
-+
-+This table from RFC 1349 (read it for more details) explains how
-+applications might very well set their TOS bits:
-+
-+.nf
-+TELNET 1000 (minimize delay)
-+FTP
-+ Control 1000 (minimize delay)
-+ Data 0100 (maximize throughput)
-+
-+TFTP 1000 (minimize delay)
-+
-+SMTP
-+ Command phase 1000 (minimize delay)
-+ DATA phase 0100 (maximize throughput)
-+
-+Domain Name Service
-+ UDP Query 1000 (minimize delay)
-+ TCP Query 0000
-+ Zone Transfer 0100 (maximize throughput)
-+
-+NNTP 0001 (minimize monetary cost)
-+
-+ICMP
-+ Errors 0000
-+ Requests 0000 (mostly)
-+ Responses <same as request> (mostly)
-+.fi
-+
-+
-+.SH CLASSES
-+PRIO classes cannot be configured further - they are automatically created
-+when the PRIO qdisc is attached. Each class however can contain yet a
-+further qdisc.
-+
-+.SH BUGS
-+Large amounts of traffic in the lower bands can cause starvation of higher
-+bands. Can be prevented by attaching a shaper (for example,
-+.BR tc-tbf(8)
-+to these bands to make sure they cannot dominate the link.
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, J Hadi Salim
-+<hadi@cyberus.ca>. This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-red.8 iproute2/debian/manpages/old/tc-red.8
---- iproute2-orig/debian/manpages/old/tc-red.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-red.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,131 @@
-+.TH RED 8 "13 December 2001" "iproute2" "Linux"
-+.SH NAME
-+red \- Random Early Detection
-+.SH SYNOPSIS
-+.B tc qdisc ... red
-+.B limit
-+bytes
-+.B min
-+bytes
-+.B max
-+bytes
-+.B avpkt
-+bytes
-+.B burst
-+packets
-+.B [ ecn ] [ bandwidth
-+rate
-+.B ] probability
-+chance
-+
-+.SH DESCRIPTION
-+Random Early Detection is a classless qdisc which manages its queue size
-+smartly. Regular queues simply drop packets from the tail when they are
-+full, which may not be the optimal behaviour. RED also performs tail drop,
-+but does so in a more gradual way.
-+
-+Once the queue hits a certain average length, packets enqueued have a
-+configurable chance of being marked (which may mean dropped). This chance
-+increases linearly up to a point called the
-+.B max
-+average queue length, although the queue might get bigger.
-+
-+This has a host of benefits over simple taildrop, while not being processor
-+intensive. It prevents synchronous retransmits after a burst in traffic,
-+which cause further retransmits, etc.
-+
-+The goal is the have a small queue size, which is good for interactivity
-+while not disturbing TCP/IP traffic with too many sudden drops after a burst
-+of traffic.
-+
-+Depending on if ECN is configured, marking either means dropping or
-+purely marking a packet as overlimit.
-+.SH ALGORITHM
-+The average queue size is used for determining the marking
-+probability. This is calculated using an Exponential Weighted Moving
-+Average, which can be more or less sensitive to bursts.
-+
-+When the average queue size is below
-+.B min
-+bytes, no packet will ever be marked. When it exceeds
-+.B min,
-+the probability of doing so climbs linearly up
-+to
-+.B probability,
-+until the average queue size hits
-+.B max
-+bytes. Because
-+.B probability
-+is normally not set to 100%, the queue size might
-+conceivably rise above
-+.B max
-+bytes, so the
-+.B limit
-+parameter is provided to set a hard maximum for the size of the queue.
-+
-+.SH PARAMETERS
-+.TP
-+min
-+Average queue size at which marking becomes a possibility.
-+.TP
-+max
-+At this average queue size, the marking probability is maximal. Should be at
-+least twice
-+.B min
-+to prevent synchronous retransmits, higher for low
-+.B min.
-+.TP
-+probability
-+Maximum probability for marking, specified as a floating point
-+number from 0.0 to 1.0. Suggested values are 0.01 or 0.02 (1 or 2%,
-+respectively).
-+.TP
-+limit
-+Hard limit on the real (not average) queue size in bytes. Further packets
-+are dropped. Should be set higher than max+burst. It is advised to set this
-+a few times higher than
-+.B max.
-+.TP
-+burst
-+Used for determining how fast the average queue size is influenced by the
-+real queue size. Larger values make the calculation more sluggish, allowing
-+longer bursts of traffic before marking starts. Real life experiments
-+support the following guideline: (min+min+max)/(3*avpkt).
-+.TP
-+avpkt
-+Specified in bytes. Used with burst to determine the time constant for
-+average queue size calculations. 1000 is a good value.
-+.TP
-+bandwidth
-+This rate is used for calculating the average queue size after some
-+idle time. Should be set to the bandwidth of your interface. Does not mean
-+that RED will shape for you! Optional.
-+.TP
-+ecn
-+As mentioned before, RED can either 'mark' or 'drop'. Explicit Congestion
-+Notification allows RED to notify remote hosts that their rate exceeds the
-+amount of bandwidth available. Non-ECN capable hosts can only be notified by
-+dropping a packet. If this parameter is specified, packets which indicate
-+that their hosts honor ECN will only be marked and not dropped, unless the
-+queue size hits
-+.B limit
-+bytes. Needs a tc binary with RED support compiled in. Recommended.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH SOURCES
-+.TP
-+o
-+Floyd, S., and Jacobson, V., Random Early Detection gateways for
-+Congestion Avoidance. http://www.aciri.org/floyd/papers/red/red.html
-+.TP
-+o
-+Some changes to the algorithm by Alexey N. Kuznetsov.
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, Alexey Makarenko
-+<makar@phoenix.kharkov.ua>, J Hadi Salim <hadi@nortelnetworks.com>.
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-sfq.8 iproute2/debian/manpages/old/tc-sfq.8
---- iproute2-orig/debian/manpages/old/tc-sfq.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-sfq.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,107 @@
-+.TH TC 8 "8 December 2001" "iproute2" "Linux"
-+.SH NAME
-+sfq \- Stochastic Fairness Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... perturb
-+seconds
-+.B quantum
-+bytes
-+
-+.SH DESCRIPTION
-+
-+Stochastic Fairness Queueing is a classless queueing discipline available for
-+traffic control with the
-+.BR tc (8)
-+command.
-+
-+SFQ does not shape traffic but only schedules the transmission of packets, based on 'flows'.
-+The goal is to ensure fairness so that each flow is able to send data in turn, thus preventing
-+any single flow from drowning out the rest.
-+
-+This may in fact have some effect in mitigating a Denial of Service attempt.
-+
-+SFQ is work-conserving and therefore always delivers a packet if it has one available.
-+.SH ALGORITHM
-+On enqueueing, each packet is assigned to a hash bucket, based on
-+.TP
-+(i)
-+Source address
-+.TP
-+(ii)
-+Destination address
-+.TP
-+(iii)
-+Source port
-+.P
-+If these are available. SFQ knows about ipv4 and ipv6 and also UDP, TCP and ESP.
-+Packets with other protocols are hashed based on the 32bits representation of their
-+destination and the socket they belong to. A flow corresponds mostly to a TCP/IP
-+connection.
-+
-+Each of these buckets should represent a unique flow. Because multiple flows may
-+get hashed to the same bucket, the hashing algorithm is perturbed at configurable
-+intervals so that the unfairness lasts only for a short while. Perturbation may
-+however cause some inadvertent packet reordering to occur.
-+
-+When dequeuing, each hashbucket with data is queried in a round robin fashion.
-+
-+The compile time maximum length of the SFQ is 128 packets, which can be spread over
-+at most 128 buckets of 1024 available. In case of overflow, tail-drop is performed
-+on the fullest bucket, thus maintaining fairness.
-+
-+.SH PARAMETERS
-+.TP
-+perturb
-+Interval in seconds for queue algorithm perturbation. Defaults to 0, which means that
-+no perturbation occurs. Do not set too low for each perturbation may cause some packet
-+reordering. Advised value: 10
-+.TP
-+quantum
-+Amount of bytes a flow is allowed to dequeue during a round of the round robin process.
-+Defaults to the MTU of the interface which is also the advised value and the minimum value.
-+
-+.SH EXAMPLE & USAGE
-+
-+To attach to device ppp0:
-+.P
-+# tc qdisc add dev ppp0 root sfq perturb 10
-+.P
-+Please note that SFQ, like all non-shaping (work-conserving) qdiscs, is only useful
-+if it owns the queue.
-+This is the case when the link speed equals the actually available bandwidth. This holds
-+for regular phone modems, ISDN connections and direct non-switched ethernet links.
-+.P
-+Most often, cable modems and DSL devices do not fall into this category. The same holds
-+for when connected to a switch and trying to send data to a congested segment also
-+connected to the switch.
-+.P
-+In this case, the effective queue does not reside within Linux and is therefore not
-+available for scheduling.
-+.P
-+Embed SFQ in a classful qdisc to make sure it owns the queue.
-+
-+.SH SOURCE
-+.TP
-+o
-+Paul E. McKenney "Stochastic Fairness Queuing",
-+IEEE INFOCOMM'90 Proceedings, San Francisco, 1990.
-+
-+.TP
-+o
-+Paul E. McKenney "Stochastic Fairness Queuing",
-+"Interworking: Research and Experience", v.2, 1991, p.113-131.
-+
-+.TP
-+o
-+See also:
-+M. Shreedhar and George Varghese "Efficient Fair
-+Queuing using Deficit Round Robin", Proc. SIGCOMM 95.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc-tbf.8 iproute2/debian/manpages/old/tc-tbf.8
---- iproute2-orig/debian/manpages/old/tc-tbf.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc-tbf.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,138 @@
-+.TH TC 8 "13 December 2001" "iproute2" "Linux"
-+.SH NAME
-+tbf \- Token Bucket Filter
-+.SH SYNOPSIS
-+.B tc qdisc ... tbf rate
-+rate
-+.B burst
-+bytes/cell
-+.B ( latency
-+ms
-+.B | limit
-+bytes
-+.B ) [ mpu
-+bytes
-+.B [ peakrate
-+rate
-+.B mtu
-+bytes/cell
-+.B ] ]
-+.P
-+burst is also known as buffer and maxburst. mtu is also known as minburst.
-+.SH DESCRIPTION
-+
-+The Token Bucket Filter is a classless queueing discipline available for
-+traffic control with the
-+.BR tc (8)
-+command.
-+
-+TBF is a pure shaper and never schedules traffic. It is non-work-conserving and may throttle
-+itself, although packets are available, to ensure that the configured rate is not exceeded.
-+On all platforms except for Alpha,
-+it is able to shape up to 1mbit/s of normal traffic with ideal minimal burstiness,
-+sending out data exactly at the configured rates.
-+
-+Much higher rates are possible but at the cost of losing the minimal burstiness. In that
-+case, data is on average dequeued at the configured rate but may be sent much faster at millisecond
-+timescales. Because of further queues living in network adaptors, this is often not a problem.
-+
-+Kernels with a higher 'HZ' can achieve higher rates with perfect burstiness. On Alpha, HZ is ten
-+times higher, leading to a 10mbit/s limit to perfection. These calculations hold for packets of on
-+average 1000 bytes.
-+
-+.SH ALGORITHM
-+As the name implies, traffic is filtered based on the expenditure of
-+.B tokens.
-+Tokens roughly correspond to bytes, with the additional constraint that each packet consumes
-+some tokens, no matter how small it is. This reflects the fact that even a zero-sized packet occupies
-+the link for some time.
-+
-+On creation, the TBF is stocked with tokens which correspond to the amount of traffic that can be burst
-+in one go. Tokens arrive at a steady rate, until the bucket is full.
-+
-+If no tokens are available, packets are queued, up to a configured limit. The TBF now
-+calculates the token deficit, and throttles until the first packet in the queue can be sent.
-+
-+If it is not acceptable to burst out packets at maximum speed, a peakrate can be configured
-+to limit the speed at which the bucket empties. This peakrate is implemented as a second TBF
-+with a very small bucket, so that it doesn't burst.
-+
-+To achieve perfection, the second bucket may contain only a single packet, which leads to
-+the earlier mentioned 1mbit/s limit.
-+
-+This limit is caused by the fact that the kernel can only throttle for at minimum 1 'jiffy', which depends
-+on HZ as 1/HZ. For perfect shaping, only a single packet can get sent per jiffy - for HZ=100, this means 100
-+packets of on average 1000 bytes each, which roughly corresponds to 1mbit/s.
-+
-+.SH PARAMETERS
-+See
-+.BR tc (8)
-+for how to specify the units of these values.
-+.TP
-+limit or latency
-+Limit is the number of bytes that can be queued waiting for tokens to become
-+available. You can also specify this the other way around by setting the
-+latency parameter, which specifies the maximum amount of time a packet can
-+sit in the TBF. The latter calculation takes into account the size of the
-+bucket, the rate and possibly the peakrate (if set). These two parameters
-+are mutually exclusive.
-+.TP
-+burst
-+Also known as buffer or maxburst.
-+Size of the bucket, in bytes. This is the maximum amount of bytes that tokens can be available for instantaneously.
-+In general, larger shaping rates require a larger buffer. For 10mbit/s on Intel, you need at least 10kbyte buffer
-+if you want to reach your configured rate!
-+
-+If your buffer is too small, packets may be dropped because more tokens arrive per timer tick than fit in your bucket.
-+The minimum buffer size can be calculated by dividing the rate by HZ.
-+
-+Token usage calculations are performed using a table which by default has a resolution of 8 packets.
-+This resolution can be changed by specifying the
-+.B cell
-+size with the burst. For example, to specify a 6000 byte buffer with a 16
-+byte cell size, set a burst of 6000/16. You will probably never have to set
-+this. Must be an integral power of 2.
-+.TP
-+mpu
-+A zero-sized packet does not use zero bandwidth. For ethernet, no packet uses less than 64 bytes. The Minimum Packet Unit
-+determines the minimal token usage (specified in bytes) for a packet. Defaults to zero.
-+.TP
-+rate
-+The speed knob. See remarks above about limits! See
-+.BR tc (8)
-+for units.
-+.PP
-+Furthermore, if a peakrate is desired, the following parameters are available:
-+
-+.TP
-+peakrate
-+Maximum depletion rate of the bucket. Limited to 1mbit/s on Intel, 10mbit/s on Alpha. The peakrate does
-+not need to be set, it is only necessary if perfect millisecond timescale shaping is required.
-+
-+.TP
-+mtu/minburst
-+Specifies the size of the peakrate bucket. For perfect accuracy, should be set to the MTU of the interface.
-+If a peakrate is needed, but some burstiness is acceptable, this size can be raised. A 3000 byte minburst
-+allows around 3mbit/s of peakrate, given 1000 byte packets.
-+
-+Like the regular burstsize you can also specify a
-+.B cell
-+size.
-+.SH EXAMPLE & USAGE
-+
-+To attach a TBF with a sustained maximum rate of 0.5mbit/s, a peakrate of 1.0mbit/s,
-+a 5kilobyte buffer, with a pre-bucket queue size limit calculated so the TBF causes
-+at most 70ms of latency, with perfect peakrate behaviour, issue:
-+.P
-+# tc qdisc add dev eth0 root tbf rate 0.5mbit \\
-+ burst 5kb latency 70ms peakrate 1mbit \\
-+ minburst 1540
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/old/tc.8 iproute2/debian/manpages/old/tc.8
---- iproute2-orig/debian/manpages/old/tc.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/old/tc.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,348 @@
-+.TH TC 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+tc \- show / manipulate traffic control settings
-+.SH SYNOPSIS
-+.B tc qdisc [ add | change | replace | link ] dev
-+DEV
-+.B
-+[ parent
-+qdisc-id
-+.B | root ]
-+.B [ handle
-+qdisc-id ] qdisc
-+[ qdisc specific parameters ]
-+.P
-+
-+.B tc class [ add | change | replace ] dev
-+DEV
-+.B parent
-+qdisc-id
-+.B [ classid
-+class-id ] qdisc
-+[ qdisc specific parameters ]
-+.P
-+
-+.B tc filter [ add | change | replace ] dev
-+DEV
-+.B [ parent
-+qdisc-id
-+.B | root ] protocol
-+protocol
-+.B prio
-+priority filtertype
-+[ filtertype specific parameters ]
-+.B flowid
-+flow-id
-+
-+.B tc [-s | -d ] qdisc show [ dev
-+DEV
-+.B ]
-+.P
-+.B tc [-s | -d ] class show dev
-+DEV
-+.P
-+.B tc filter show dev
-+DEV
-+
-+.SH DESCRIPTION
-+.B Tc
-+is used to configure Traffic Control in the Linux kernel. Traffic Control consists
-+of the following:
-+
-+.TP
-+SHAPING
-+When traffic is shaped, its rate of transmission is under control. Shaping may
-+be more than lowering the available bandwidth - it is also used to smooth out
-+bursts in traffic for better network behaviour. Shaping occurs on egress.
-+
-+.TP
-+SCHEDULING
-+By scheduling the transmission of packets it is possible to improve interactivity
-+for traffic that needs it while still guaranteeing bandwidth to bulk transfers. Reordering
-+is also called prioritizing, and happens only on egress.
-+
-+.TP
-+POLICING
-+Where shaping deals with transmission of traffic, policing pertains to traffic
-+arriving. Policing thus occurs on ingress.
-+
-+.TP
-+DROPPING
-+Traffic exceeding a set bandwidth may also be dropped forthwith, both on
-+ingress and on egress.
-+
-+.P
-+Processing of traffic is controlled by three kinds of objects: qdiscs,
-+classes and filters.
-+
-+.SH QDISCS
-+.B qdisc
-+is short for 'queueing discipline' and it is elementary to
-+understanding traffic control. Whenever the kernel needs to send a
-+packet to an interface, it is
-+.B enqueued
-+to the qdisc configured for that interface. Immediately afterwards, the kernel
-+tries to get as many packets as possible from the qdisc, for giving them
-+to the network adaptor driver.
-+
-+A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure
-+First In, First Out queue. It does however store traffic when the network interface
-+can't handle it momentarily.
-+
-+.SH CLASSES
-+Some qdiscs can contain classes, which contain further qdiscs - traffic may
-+then be enqueued in any of the inner qdiscs, which are within the
-+.B classes.
-+When the kernel tries to dequeue a packet from such a
-+.B classful qdisc
-+it can come from any of the classes. A qdisc may for example prioritize
-+certain kinds of traffic by trying to dequeue from certain classes
-+before others.
-+
-+.SH FILTERS
-+A
-+.B filter
-+is used by a classful qdisc to determine in which class a packet will
-+be enqueued. Whenever traffic arrives at a class with subclasses, it needs
-+to be classified. Various methods may be employed to do so, one of these
-+are the filters. All filters attached to the class are called, until one of
-+them returns with a verdict. If no verdict was made, other criteria may be
-+available. This differs per qdisc.
-+
-+It is important to notice that filters reside
-+.B within
-+qdiscs - they are not masters of what happens.
-+
-+.SH CLASSLESS QDISCS
-+The classless qdiscs are:
-+.TP
-+[p|b]fifo
-+Simplest usable qdisc, pure First In, First Out behaviour. Limited in
-+packets or in bytes.
-+.TP
-+pfifo_fast
-+Standard qdisc for 'Advanced Router' enabled kernels. Consists of a three-band
-+queue which honors Type of Service flags, as well as the priority that may be
-+assigned to a packet.
-+.TP
-+red
-+Random Early Detection simulates physical congestion by randomly dropping
-+packets when nearing configured bandwidth allocation. Well suited to very
-+large bandwidth applications.
-+.TP
-+sfq
-+Stochastic Fairness Queueing reorders queued traffic so each 'session'
-+gets to send a packet in turn.
-+.TP
-+tbf
-+The Token Bucket Filter is suited for slowing traffic down to a precisely
-+configured rate. Scales well to large bandwidths.
-+.SH CONFIGURING CLASSLESS QDISCS
-+In the absence of classful qdiscs, classless qdiscs can only be attached at
-+the root of a device. Full syntax:
-+.P
-+.B tc qdisc add dev
-+DEV
-+.B root
-+QDISC QDISC-PARAMETERS
-+
-+To remove, issue
-+.P
-+.B tc qdisc del dev
-+DEV
-+.B root
-+
-+The
-+.B pfifo_fast
-+qdisc is the automatic default in the absence of a configured qdisc.
-+
-+.SH CLASSFUL QDISCS
-+The classful qdiscs are:
-+.TP
-+CBQ
-+Class Based Queueing implements a rich linksharing hierarchy of classes.
-+It contains shaping elements as well as prioritizing capabilities. Shaping is
-+performed using link idle time calculations based on average packet size and
-+underlying link bandwidth. The latter may be ill-defined for some interfaces.
-+.TP
-+HTB
-+The Hierarchy Token Bucket implements a rich linksharing hierarchy of
-+classes with an emphasis on conforming to existing practices. HTB facilitates
-+guaranteeing bandwidth to classes, while also allowing specification of upper
-+limits to inter-class sharing. It contains shaping elements, based on TBF and
-+can prioritize classes.
-+.TP
-+PRIO
-+The PRIO qdisc is a non-shaping container for a configurable number of
-+classes which are dequeued in order. This allows for easy prioritization
-+of traffic, where lower classes are only able to send if higher ones have
-+no packets available. To facilitate configuration, Type Of Service bits are
-+honored by default.
-+.SH THEORY OF OPERATION
-+Classes form a tree, where each class has a single parent.
-+A class may have multiple children. Some qdiscs allow for runtime addition
-+of classes (CBQ, HTB) while others (PRIO) are created with a static number of
-+children.
-+
-+Qdiscs which allow dynamic addition of classes can have zero or more
-+subclasses to which traffic may be enqueued.
-+
-+Furthermore, each class contains a
-+.B leaf qdisc
-+which by default has
-+.B pfifo
-+behaviour though another qdisc can be attached in place. This qdisc may again
-+contain classes, but each class can have only one leaf qdisc.
-+
-+When a packet enters a classful qdisc it can be
-+.B classified
-+to one of the classes within. Three criteria are available, although not all
-+qdiscs will use all three:
-+.TP
-+tc filters
-+If tc filters are attached to a class, they are consulted first
-+for relevant instructions. Filters can match on all fields of a packet header,
-+as well as on the firewall mark applied by ipchains or iptables. See
-+.BR tc-filters (8).
-+.TP
-+Type of Service
-+Some qdiscs have built in rules for classifying packets based on the TOS field.
-+.TP
-+skb->priority
-+Userspace programs can encode a class-id in the 'skb->priority' field using
-+the SO_PRIORITY option.
-+.P
-+Each node within the tree can have its own filters but higher level filters
-+may also point directly to lower classes.
-+
-+If classification did not succeed, packets are enqueued to the leaf qdisc
-+attached to that class. Check qdisc specific manpages for details, however.
-+
-+.SH NAMING
-+All qdiscs, classes and filters have IDs, which can either be specified
-+or be automatically assigned.
-+
-+IDs consist of a major number and a minor number, separated by a colon.
-+
-+.TP
-+QDISCS
-+A qdisc, which potentially can have children,
-+gets assigned a major number, called a 'handle', leaving the minor
-+number namespace available for classes. The handle is expressed as '10:'.
-+It is customary to explicitly assign a handle to qdiscs expected to have
-+children.
-+
-+.TP
-+CLASSES
-+Classes residing under a qdisc share their qdisc major number, but each have
-+a separate minor number called a 'classid' that has no relation to their
-+parent classes, only to their parent qdisc. The same naming custom as for
-+qdiscs applies.
-+
-+.TP
-+FILTERS
-+Filters have a three part ID, which is only needed when using a hashed
-+filter hierarchy, for which see
-+.BR tc-filters (8).
-+.SH UNITS
-+All parameters accept a floating point number, possibly followed by a unit.
-+.P
-+Bandwidths or rates can be specified in:
-+.TP
-+kbps
-+Kilobytes per second
-+.TP
-+mbps
-+Megabytes per second
-+.TP
-+kbit
-+Kilobits per second
-+.TP
-+mbit
-+Megabits per second
-+.TP
-+bps or a bare number
-+Bytes per second
-+.P
-+Amounts of data can be specified in:
-+.TP
-+kb or k
-+Kilobytes
-+.TP
-+mb or m
-+Megabytes
-+.TP
-+mbit
-+Megabits
-+.TP
-+kbit
-+Kilobits
-+.TP
-+b or a bare number
-+Bytes.
-+.P
-+Lengths of time can be specified in:
-+.TP
-+s, sec or secs
-+Whole seconds
-+.TP
-+ms, msec or msecs
-+Milliseconds
-+.TP
-+us, usec, usecs or a bare number
-+Microseconds.
-+
-+.SH TC COMMANDS
-+The following commands are available for qdiscs, classes and filter:
-+.TP
-+add
-+Add a qdisc, class or filter to a node. For all entities, a
-+.B parent
-+must be passed, either by passing its ID or by attaching directly to the root of a device.
-+When creating a qdisc or a filter, it can be named with the
-+.B handle
-+parameter. A class is named with the
-+.B classid
-+parameter.
-+
-+.TP
-+remove
-+A qdisc can be removed by specifying its handle, which may also be 'root'. All subclasses and their leaf qdiscs
-+are automatically deleted, as well as any filters attached to them.
-+
-+.TP
-+change
-+Some entities can be modified 'in place'. Shares the syntax of 'add', with the exception
-+that the handle cannot be changed and neither can the parent. In other words,
-+.B
-+change
-+cannot move a node.
-+
-+.TP
-+replace
-+Performs a nearly atomic remove/add on an existing node id. If the node does not exist yet
-+it is created.
-+
-+.TP
-+link
-+Only available for qdiscs and performs a replace where the node
-+must exist already.
-+
-+
-+.SH HISTORY
-+.B tc
-+was written by Alexey N. Kuznetsov and added in Linux 2.2.
-+.SH SEE ALSO
-+.BR tc-cbq (8),
-+.BR tc-htb (8),
-+.BR tc-sfq (8),
-+.BR tc-red (8),
-+.BR tc-tbf (8),
-+.BR tc-pfifo (8),
-+.BR tc-bfifo (8),
-+.BR tc-pfifo_fast (8),
-+.BR tc-filters (8)
-+
-+.SH AUTHOR
-+Manpage maintained by bert hubert (ahu@ds9a.nl)
-+
-diff -Naur iproute2-orig/debian/manpages/tc-cbq-details.8 iproute2/debian/manpages/tc-cbq-details.8
---- iproute2-orig/debian/manpages/tc-cbq-details.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-cbq-details.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,425 @@
-+.TH CBQ 8 "8 December 2001" "iproute2" "Linux"
-+.SH NAME
-+CBQ \- Class Based Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] cbq avpkt
-+bytes
-+.B bandwidth
-+rate
-+.B [ cell
-+bytes
-+.B ] [ ewma
-+log
-+.B ] [ mpu
-+bytes
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] cbq allot
-+bytes
-+.B [ bandwidth
-+rate
-+.B ] [ rate
-+rate
-+.B ] prio
-+priority
-+.B [ weight
-+weight
-+.B ] [ minburst
-+packets
-+.B ] [ maxburst
-+packets
-+.B ] [ ewma
-+log
-+.B ] [ cell
-+bytes
-+.B ] avpkt
-+bytes
-+.B [ mpu
-+bytes
-+.B ] [ bounded isolated ] [ split
-+handle
-+.B & defmap
-+defmap
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+Class Based Queueing is a classful qdisc that implements a rich
-+linksharing hierarchy of classes. It contains shaping elements as
-+well as prioritizing capabilities. Shaping is performed using link
-+idle time calculations based on the timing of dequeue events and
-+underlying link bandwidth.
-+
-+.SH SHAPING ALGORITHM
-+Shaping is done using link idle time calculations, and actions taken if
-+these calculations deviate from set limits.
-+
-+When shaping a 10mbit/s connection to 1mbit/s, the link will
-+be idle 90% of the time. If it isn't, it needs to be throttled so that it
-+IS idle 90% of the time.
-+
-+From the kernel's perspective, this is hard to measure, so CBQ instead
-+derives the idle time from the number of microseconds (in fact, jiffies)
-+that elapse between requests from the device driver for more data. Combined
-+with the knowledge of packet sizes, this is used to approximate how full or
-+empty the link is.
-+
-+This is rather circumspect and doesn't always arrive at proper
-+results. For example, what is the actual link speed of an interface
-+that is not really able to transmit the full 100mbit/s of data,
-+perhaps because of a badly implemented driver? A PCMCIA network card
-+will also never achieve 100mbit/s because of the way the bus is
-+designed - again, how do we calculate the idle time?
-+
-+The physical link bandwidth may be ill defined in case of not-quite-real
-+network devices like PPP over Ethernet or PPTP over TCP/IP. The effective
-+bandwidth in that case is probably determined by the efficiency of pipes
-+to userspace - which not defined.
-+
-+During operations, the effective idletime is measured using an
-+exponential weighted moving average (EWMA), which considers recent
-+packets to be exponentially more important than past ones. The Unix
-+loadaverage is calculated in the same way.
-+
-+The calculated idle time is subtracted from the EWMA measured one,
-+the resulting number is called 'avgidle'. A perfectly loaded link has
-+an avgidle of zero: packets arrive exactly at the calculated
-+interval.
-+
-+An overloaded link has a negative avgidle and if it gets too negative,
-+CBQ throttles and is then 'overlimit'.
-+
-+Conversely, an idle link might amass a huge avgidle, which would then
-+allow infinite bandwidths after a few hours of silence. To prevent
-+this, avgidle is capped at
-+.B maxidle.
-+
-+If overlimit, in theory, the CBQ could throttle itself for exactly the
-+amount of time that was calculated to pass between packets, and then
-+pass one packet, and throttle again. Due to timer resolution constraints,
-+this may not be feasible, see the
-+.B minburst
-+parameter below.
-+
-+.SH CLASSIFICATION
-+Within the one CBQ instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, CBQ starts at the root and uses various methods to
-+determine which class should receive the data. If a verdict is reached, this
-+process is repeated for the recipient class which might have further
-+means of classifying traffic to its children, if any.
-+
-+CBQ has the following methods available to classify a packet to any child
-+classes.
-+.TP
-+(i)
-+.B skb->priority class encoding.
-+Can be set from userspace by an application with the
-+.B SO_PRIORITY
-+setsockopt.
-+The
-+.B skb->priority class encoding
-+only applies if the skb->priority holds a major:minor handle of an existing
-+class within this qdisc.
-+.TP
-+(ii)
-+tc filters attached to the class.
-+.TP
-+(iii)
-+The defmap of a class, as set with the
-+.B split & defmap
-+parameters. The defmap may contain instructions for each possible Linux packet
-+priority.
-+
-+.P
-+Each class also has a
-+.B level.
-+Leaf nodes, attached to the bottom of the class hierarchy, have a level of 0.
-+.SH CLASSIFICATION ALGORITHM
-+
-+Classification is a loop, which terminates when a leaf class is found. At any
-+point the loop may jump to the fallback algorithm.
-+
-+The loop consists of the following steps:
-+.TP
-+(i)
-+If the packet is generated locally and has a valid classid encoded within its
-+.B skb->priority,
-+choose it and terminate.
-+
-+.TP
-+(ii)
-+Consult the tc filters, if any, attached to this child. If these return
-+a class which is not a leaf class, restart loop from the class returned.
-+If it is a leaf, choose it and terminate.
-+.TP
-+(iii)
-+If the tc filters did not return a class, but did return a classid,
-+try to find a class with that id within this qdisc.
-+Check if the found class is of a lower
-+.B level
-+than the current class. If so, and the returned class is not a leaf node,
-+restart the loop at the found class. If it is a leaf node, terminate.
-+If we found an upward reference to a higher level, enter the fallback
-+algorithm.
-+.TP
-+(iv)
-+If the tc filters did not return a class, nor a valid reference to one,
-+consider the minor number of the reference to be the priority. Retrieve
-+a class from the defmap of this class for the priority. If this did not
-+contain a class, consult the defmap of this class for the
-+.B BEST_EFFORT
-+class. If this is an upward reference, or no
-+.B BEST_EFFORT
-+class was defined,
-+enter the fallback algorithm. If a valid class was found, and it is not a
-+leaf node, restart the loop at this class. If it is a leaf, choose it and
-+terminate. If
-+neither the priority distilled from the classid, nor the
-+.B BEST_EFFORT
-+priority yielded a class, enter the fallback algorithm.
-+.P
-+The fallback algorithm resides outside of the loop and is as follows.
-+.TP
-+(i)
-+Consult the defmap of the class at which the jump to fallback occured. If
-+the defmap contains a class for the
-+.B
-+priority
-+of the class (which is related to the TOS field), choose this class and
-+terminate.
-+.TP
-+(ii)
-+Consult the map for a class for the
-+.B BEST_EFFORT
-+priority. If found, choose it, and terminate.
-+.TP
-+(iii)
-+Choose the class at which break out to the fallback algorithm occured. Terminate.
-+.P
-+The packet is enqueued to the class which was chosen when either algorithm
-+terminated. It is therefore possible for a packet to be enqueued *not* at a
-+leaf node, but in the middle of the hierarchy.
-+
-+.SH LINK SHARING ALGORITHM
-+When dequeuing for sending to the network device, CBQ decides which of its
-+classes will be allowed to send. It does so with a Weighted Round Robin process
-+in which each class with packets gets a chance to send in turn. The WRR process
-+starts by asking the highest priority classes (lowest numerically -
-+highest semantically) for packets, and will continue to do so until they
-+have no more data to offer, in which case the process repeats for lower
-+priorities.
-+
-+.B CERTAINTY ENDS HERE, ANK PLEASE HELP
-+
-+Each class is not allowed to send at length though - they can only dequeue a
-+configurable amount of data during each round.
-+
-+If a class is about to go overlimit, and it is not
-+.B bounded
-+it will try to borrow avgidle from siblings that are not
-+.B isolated.
-+This process is repeated from the bottom upwards. If a class is unable
-+to borrow enough avgidle to send a packet, it is throttled and not asked
-+for a packet for enough time for the avgidle to increase above zero.
-+
-+.B I REALLY NEED HELP FIGURING THIS OUT. REST OF DOCUMENT IS PRETTY CERTAIN
-+.B AGAIN.
-+
-+.SH QDISC
-+The root qdisc of a CBQ class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the CBQ instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional.
-+.TP
-+avpkt bytes
-+For calculations, the average packet size must be known. It is silently capped
-+at a minimum of 2/3 of the interface MTU. Mandatory.
-+.TP
-+bandwidth rate
-+To determine the idle time, CBQ must know the bandwidth of your underlying
-+physical interface, or parent qdisc. This is a vital parameter, more about it
-+later. Mandatory.
-+.TP
-+cell
-+The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
-+.TP
-+mpu
-+A zero sized packet may still take time to transmit. This value is the lower
-+cap for packet transmission time calculations - packets smaller than this value
-+are still deemed to have this size. Defaults to zero.
-+.TP
-+ewma log
-+When CBQ needs to measure the average idle time, it does so using an
-+Exponentially Weighted Moving Average which smoothes out measurements into
-+a moving average. The EWMA LOG determines how much smoothing occurs. Defaults
-+to 5. Lower values imply greater sensitivity. Must be between 0 and 31.
-+.P
-+A CBQ qdisc does not shape out of its own accord. It only needs to know certain
-+parameters about the underlying link. Actual shaping is done in classes.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+weight weight
-+When dequeuing to the interface, classes are tried for traffic in a
-+round-robin fashion. Classes with a higher configured qdisc will generally
-+have more traffic to offer during each round, so it makes sense to allow
-+it to dequeue more traffic. All weights under a class are normalized, so
-+only the ratios matter. Defaults to the configured rate, unless the priority
-+of this class is maximal, in which case it is set to 1.
-+.TP
-+allot bytes
-+Allot specifies how many bytes a qdisc can dequeue
-+during each round of the process. This parameter is weighted using the
-+renormalized class weight described above.
-+
-+.TP
-+priority priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children combined can send at. Mandatory.
-+
-+.TP
-+bandwidth rate
-+This is different from the bandwidth specified when creating a CBQ disc. Only
-+used to determine maxidle and offtime, which are only calculated when
-+specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
-+
-+.TP
-+maxburst
-+This number of packets is used to calculate maxidle so that when
-+avgidle is at maxidle, this number of average packets can be burst
-+before avgidle drops to 0. Set it higher to be more tolerant of
-+bursts. You can't set maxidle directly, only via this parameter.
-+
-+.TP
-+minburst
-+As mentioned before, CBQ needs to throttle in case of
-+overlimit. The ideal solution is to do so for exactly the calculated
-+idle time, and pass 1 packet. However, Unix kernels generally have a
-+hard time scheduling events shorter than 10ms, so it is better to
-+throttle for a longer period, and then pass minburst packets in one
-+go, and then sleep minburst times longer.
-+
-+The time to wait is called the offtime. Higher values of minburst lead
-+to more accurate shaping in the long term, but to bigger bursts at
-+millisecond timescales.
-+
-+.TP
-+minidle
-+If avgidle is below 0, we are overlimits and need to wait until
-+avgidle will be big enough to send one packet. To prevent a sudden
-+burst from shutting down the link for a prolonged period of time,
-+avgidle is reset to minidle if it gets too low.
-+
-+Minidle is specified in negative microseconds, so 10 means that
-+avgidle is capped at -10us.
-+
-+.TP
-+bounded
-+Signifies that this class will not borrow bandwidth from its siblings.
-+.TP
-+isolated
-+Means that this class will not borrow bandwidth to its siblings
-+
-+.TP
-+split major:minor & defmap bitmap[/bitmap]
-+If consulting filters attached to a class did not give a verdict,
-+CBQ can also classify based on the packet's priority. There are 16
-+priorities available, numbered from 0 to 15.
-+
-+The defmap specifies which priorities this class wants to receive,
-+specified as a bitmap. The Least Significant Bit corresponds to priority
-+zero. The
-+.B split
-+parameter tells CBQ at which class the decision must be made, which should
-+be a (grand)parent of the class you are adding.
-+
-+As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
-+configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
-+
-+The complimentary configuration would then
-+be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
-+Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
-+.TP
-+estimator interval timeconstant
-+CBQ can measure how much bandwidth each class is using, which tc filters
-+can use to classify packets with. In order to determine the bandwidth
-+it uses a very simple estimator that measures once every
-+.B interval
-+microseconds how much traffic has passed. This again is a EWMA, for which
-+the time constant can be specified, also in microseconds. The
-+.B time constant
-+corresponds to the sluggishness of the measurement or, conversely, to the
-+sensitivity of the average to short bursts. Higher values mean less
-+sensitivity.
-+
-+
-+
-+.SH SOURCES
-+.TP
-+o
-+Sally Floyd and Van Jacobson, "Link-sharing and Resource
-+Management Models for Packet Networks",
-+IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on CBQ and Guarantee Service", 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on Class-Based Queueing: Setting
-+Parameters", 1996
-+
-+.TP
-+o
-+Sally Floyd and Michael Speer, "Experimental Results
-+for Class-Based Queueing", 1998, not published.
-+
-+
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-cbq.8 iproute2/debian/manpages/tc-cbq.8
---- iproute2-orig/debian/manpages/tc-cbq.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-cbq.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,353 @@
-+.TH CBQ 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+CBQ \- Class Based Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] cbq [ allot
-+bytes
-+.B ] avpkt
-+bytes
-+.B bandwidth
-+rate
-+.B [ cell
-+bytes
-+.B ] [ ewma
-+log
-+.B ] [ mpu
-+bytes
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] cbq allot
-+bytes
-+.B [ bandwidth
-+rate
-+.B ] [ rate
-+rate
-+.B ] prio
-+priority
-+.B [ weight
-+weight
-+.B ] [ minburst
-+packets
-+.B ] [ maxburst
-+packets
-+.B ] [ ewma
-+log
-+.B ] [ cell
-+bytes
-+.B ] avpkt
-+bytes
-+.B [ mpu
-+bytes
-+.B ] [ bounded isolated ] [ split
-+handle
-+.B & defmap
-+defmap
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+Class Based Queueing is a classful qdisc that implements a rich
-+linksharing hierarchy of classes. It contains shaping elements as
-+well as prioritizing capabilities. Shaping is performed using link
-+idle time calculations based on the timing of dequeue events and
-+underlying link bandwidth.
-+
-+.SH SHAPING ALGORITHM
-+When shaping a 10mbit/s connection to 1mbit/s, the link will
-+be idle 90% of the time. If it isn't, it needs to be throttled so that it
-+IS idle 90% of the time.
-+
-+During operations, the effective idletime is measured using an
-+exponential weighted moving average (EWMA), which considers recent
-+packets to be exponentially more important than past ones. The Unix
-+loadaverage is calculated in the same way.
-+
-+The calculated idle time is subtracted from the EWMA measured one,
-+the resulting number is called 'avgidle'. A perfectly loaded link has
-+an avgidle of zero: packets arrive exactly at the calculated
-+interval.
-+
-+An overloaded link has a negative avgidle and if it gets too negative,
-+CBQ throttles and is then 'overlimit'.
-+
-+Conversely, an idle link might amass a huge avgidle, which would then
-+allow infinite bandwidths after a few hours of silence. To prevent
-+this, avgidle is capped at
-+.B maxidle.
-+
-+If overlimit, in theory, the CBQ could throttle itself for exactly the
-+amount of time that was calculated to pass between packets, and then
-+pass one packet, and throttle again. Due to timer resolution constraints,
-+this may not be feasible, see the
-+.B minburst
-+parameter below.
-+
-+.SH CLASSIFICATION
-+Within the one CBQ instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, CBQ starts at the root and uses various methods to
-+determine which class should receive the data.
-+
-+In the absence of uncommon configuration options, the process is rather easy.
-+At each node we look for an instruction, and then go to the class the
-+instruction refers us to. If the class found is a barren leaf-node (without
-+children), we enqueue the packet there. If it is not yet a leaf node, we do
-+the whole thing over again starting from that node.
-+
-+The following actions are performed, in order at each node we visit, until one
-+sends us to another node, or terminates the process.
-+.TP
-+(i)
-+Consult filters attached to the class. If sent to a leafnode, we are done.
-+Otherwise, restart.
-+.TP
-+(ii)
-+Consult the defmap for the priority assigned to this packet, which depends
-+on the TOS bits. Check if the referral is leafless, otherwise restart.
-+.TP
-+(iii)
-+Ask the defmap for instructions for the 'best effort' priority. Check the
-+answer for leafness, otherwise restart.
-+.TP
-+(iv)
-+If none of the above returned with an instruction, enqueue at this node.
-+.P
-+This algorithm makes sure that a packet always ends up somewhere, even while
-+you are busy building your configuration.
-+
-+For more details, see
-+.BR tc-cbq-details(8).
-+
-+.SH LINK SHARING ALGORITHM
-+When dequeuing for sending to the network device, CBQ decides which of its
-+classes will be allowed to send. It does so with a Weighted Round Robin process
-+in which each class with packets gets a chance to send in turn. The WRR process
-+starts by asking the highest priority classes (lowest numerically -
-+highest semantically) for packets, and will continue to do so until they
-+have no more data to offer, in which case the process repeats for lower
-+priorities.
-+
-+Classes by default borrow bandwidth from their siblings. A class can be
-+prevented from doing so by declaring it 'bounded'. A class can also indicate
-+its unwillingness to lend out bandwidth by being 'isolated'.
-+
-+.SH QDISC
-+The root of a CBQ qdisc class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the CBQ instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional, but very useful if classes
-+will be generated within this qdisc.
-+.TP
-+allot bytes
-+This allotment is the 'chunkiness' of link sharing and is used for determining packet
-+transmission time tables. The qdisc allot differs slightly from the class allot discussed
-+below. Optional. Defaults to a reasonable value, related to avpkt.
-+.TP
-+avpkt bytes
-+The average size of a packet is needed for calculating maxidle, and is also used
-+for making sure 'allot' has a safe value. Mandatory.
-+.TP
-+bandwidth rate
-+To determine the idle time, CBQ must know the bandwidth of your underlying
-+physical interface, or parent qdisc. This is a vital parameter, more about it
-+later. Mandatory.
-+.TP
-+cell
-+The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
-+.TP
-+mpu
-+A zero sized packet may still take time to transmit. This value is the lower
-+cap for packet transmission time calculations - packets smaller than this value
-+are still deemed to have this size. Defaults to zero.
-+.TP
-+ewma log
-+When CBQ needs to measure the average idle time, it does so using an
-+Exponentially Weighted Moving Average which smoothes out measurements into
-+a moving average. The EWMA LOG determines how much smoothing occurs. Lower
-+values imply greater sensitivity. Must be between 0 and 31. Defaults
-+to 5.
-+.P
-+A CBQ qdisc does not shape out of its own accord. It only needs to know certain
-+parameters about the underlying link. Actual shaping is done in classes.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+weight weight
-+When dequeuing to the interface, classes are tried for traffic in a
-+round-robin fashion. Classes with a higher configured qdisc will generally
-+have more traffic to offer during each round, so it makes sense to allow
-+it to dequeue more traffic. All weights under a class are normalized, so
-+only the ratios matter. Defaults to the configured rate, unless the priority
-+of this class is maximal, in which case it is set to 1.
-+.TP
-+allot bytes
-+Allot specifies how many bytes a qdisc can dequeue
-+during each round of the process. This parameter is weighted using the
-+renormalized class weight described above. Silently capped at a minimum of
-+3/2 avpkt. Mandatory.
-+
-+.TP
-+prio priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+avpkt
-+See the QDISC section.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children combined can send at. Mandatory.
-+
-+.TP
-+bandwidth rate
-+This is different from the bandwidth specified when creating a CBQ disc! Only
-+used to determine maxidle and offtime, which are only calculated when
-+specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
-+
-+.TP
-+maxburst
-+This number of packets is used to calculate maxidle so that when
-+avgidle is at maxidle, this number of average packets can be burst
-+before avgidle drops to 0. Set it higher to be more tolerant of
-+bursts. You can't set maxidle directly, only via this parameter.
-+
-+.TP
-+minburst
-+As mentioned before, CBQ needs to throttle in case of
-+overlimit. The ideal solution is to do so for exactly the calculated
-+idle time, and pass 1 packet. However, Unix kernels generally have a
-+hard time scheduling events shorter than 10ms, so it is better to
-+throttle for a longer period, and then pass minburst packets in one
-+go, and then sleep minburst times longer.
-+
-+The time to wait is called the offtime. Higher values of minburst lead
-+to more accurate shaping in the long term, but to bigger bursts at
-+millisecond timescales. Optional.
-+
-+.TP
-+minidle
-+If avgidle is below 0, we are overlimits and need to wait until
-+avgidle will be big enough to send one packet. To prevent a sudden
-+burst from shutting down the link for a prolonged period of time,
-+avgidle is reset to minidle if it gets too low.
-+
-+Minidle is specified in negative microseconds, so 10 means that
-+avgidle is capped at -10us. Optional.
-+
-+.TP
-+bounded
-+Signifies that this class will not borrow bandwidth from its siblings.
-+.TP
-+isolated
-+Means that this class will not borrow bandwidth to its siblings
-+
-+.TP
-+split major:minor & defmap bitmap[/bitmap]
-+If consulting filters attached to a class did not give a verdict,
-+CBQ can also classify based on the packet's priority. There are 16
-+priorities available, numbered from 0 to 15.
-+
-+The defmap specifies which priorities this class wants to receive,
-+specified as a bitmap. The Least Significant Bit corresponds to priority
-+zero. The
-+.B split
-+parameter tells CBQ at which class the decision must be made, which should
-+be a (grand)parent of the class you are adding.
-+
-+As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
-+configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
-+
-+The complimentary configuration would then
-+be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
-+Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
-+.TP
-+estimator interval timeconstant
-+CBQ can measure how much bandwidth each class is using, which tc filters
-+can use to classify packets with. In order to determine the bandwidth
-+it uses a very simple estimator that measures once every
-+.B interval
-+microseconds how much traffic has passed. This again is a EWMA, for which
-+the time constant can be specified, also in microseconds. The
-+.B time constant
-+corresponds to the sluggishness of the measurement or, conversely, to the
-+sensitivity of the average to short bursts. Higher values mean less
-+sensitivity.
-+
-+.SH BUGS
-+The actual bandwidth of the underlying link may not be known, for example
-+in the case of PPoE or PPTP connections which in fact may send over a
-+pipe, instead of over a physical device. CBQ is quite resilient to major
-+errors in the configured bandwidth, probably a the cost of coarser shaping.
-+
-+Default kernels rely on coarse timing information for making decisions. These
-+may make shaping precise in the long term, but inaccurate on second long scales.
-+
-+See
-+.BR tc-cbq-details(8)
-+for hints on how to improve this.
-+
-+.SH SOURCES
-+.TP
-+o
-+Sally Floyd and Van Jacobson, "Link-sharing and Resource
-+Management Models for Packet Networks",
-+IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on Class-Based Queueing: Setting
-+Parameters", 1996
-+
-+.TP
-+o
-+Sally Floyd and Michael Speer, "Experimental Results
-+for Class-Based Queueing", 1998, not published.
-+
-+
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-htb.8 iproute2/debian/manpages/tc-htb.8
---- iproute2-orig/debian/manpages/tc-htb.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-htb.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,150 @@
-+.TH HTB 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+HTB \- Hierarchy Token Bucket
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] htb [ default
-+minor-id
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] htb rate
-+rate
-+.B [ ceil
-+rate
-+.B ] burst
-+bytes
-+.B [ cburst
-+bytes
-+.B ] [ prio
-+priority
-+.B ]
-+
-+.SH DESCRIPTION
-+HTB is meant as a more understandable and intuitive replacement for
-+the CBQ qdisc in Linux. Both CBQ and HTB help you to control the use
-+of the outbound bandwidth on a given link. Both allow you to use one
-+physical link to simulate several slower links and to send different
-+kinds of traffic on different simulated links. In both cases, you have
-+to specify how to divide the physical link into simulated links and
-+how to decide which simulated link to use for a given packet to be sent.
-+
-+Unlike CBQ, HTB shapes traffic based on the Token Bucket Filter algorithm
-+which does not depend on interface characteristics and so does not need to
-+know the underlying bandwidth of the outgoing interface.
-+
-+.SH SHAPING ALGORITHM
-+Shaping works as documented in
-+.B tc-tbf (8).
-+
-+.SH CLASSIFICATION
-+Within the one HRB instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, HTB starts at the root and uses various methods to
-+determine which class should receive the data.
-+
-+In the absence of uncommon configuration options, the process is rather easy.
-+At each node we look for an instruction, and then go to the class the
-+instruction refers us to. If the class found is a barren leaf-node (without
-+children), we enqueue the packet there. If it is not yet a leaf node, we do
-+the whole thing over again starting from that node.
-+
-+The following actions are performed, in order at each node we visit, until one
-+sends us to another node, or terminates the process.
-+.TP
-+(i)
-+Consult filters attached to the class. If sent to a leafnode, we are done.
-+Otherwise, restart.
-+.TP
-+(ii)
-+If none of the above returned with an instruction, enqueue at this node.
-+.P
-+This algorithm makes sure that a packet always ends up somewhere, even while
-+you are busy building your configuration.
-+
-+.SH LINK SHARING ALGORITHM
-+FIXME
-+
-+.SH QDISC
-+The root of a HTB qdisc class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the HTB instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the HTB can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional, but very useful if classes
-+will be generated within this qdisc.
-+.TP
-+default minor-id
-+Unclassified traffic gets sent to the class with this minor-id.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+prio priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children are guaranteed. Mandatory.
-+
-+.TP
-+ceil rate
-+Maximum rate at which a class can send, if its parent has bandwidth to spare.
-+Defaults to the configured rate, which implies no borrowing
-+
-+.TP
-+burst bytes
-+Amount of bytes that can be burst at
-+.B ceil
-+speed, in excess of the configured
-+.B rate.
-+Should be at least as high as the highest burst of all children.
-+
-+.TP
-+cburst bytes
-+Amount of bytes that can be burst at 'infinite' speed, in other words, as fast
-+as the interface can transmit them. For perfect evening out, should be equal to at most one average
-+packet. Should be at least as high as the highest cburst of all children.
-+
-+.SH NOTES
-+Due to Unix timing constraints, the maximum ceil rate is not infinite and may in fact be quite low. On Intel,
-+there are 100 timer events per second, the maximum rate is that rate at which 'burst' bytes are sent each timer tick.
-+From this, the mininum burst size for a specified rate can be calculated. For i386, a 10mbit rate requires a 12 kilobyte
-+burst as 100*12kb*8 equals 10mbit.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+.P
-+HTB website: http://luxik.cdi.cz/~devik/qos/htb/
-+.SH AUTHOR
-+Martin Devera <devik@cdi.cz>. This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-pbfifo.8 iproute2/debian/manpages/tc-pbfifo.8
---- iproute2-orig/debian/manpages/tc-pbfifo.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-pbfifo.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,72 @@
-+.TH PBFIFO 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+pfifo \- Packet limited First In, First Out queue
-+.P
-+bfifo \- Byte limited First In, First Out queue
-+
-+.SH SYNOPSIS
-+.B tc qdisc ... add pfifo
-+.B [ limit
-+packets
-+.B ]
-+.P
-+.B tc qdisc ... add bfifo
-+.B [ limit
-+bytes
-+.B ]
-+
-+.SH DESCRIPTION
-+The pfifo and bfifo qdiscs are unadorned First In, First Out queues. They are the
-+simplest queues possible and therefore have no overhead.
-+.B pfifo
-+constrains the queue size as measured in packets.
-+.B bfifo
-+does so as measured in bytes.
-+
-+Like all non-default qdiscs, they maintain statistics. This might be a reason to prefer
-+pfifo or bfifo over the default.
-+
-+.SH ALGORITHM
-+A list of packets is maintained, when a packet is enqueued it gets inserted at the tail of
-+a list. When a packet needs to be sent out to the network, it is taken from the head of the list.
-+
-+If the list is too long, no further packets are allowed on. This is called 'tail drop'.
-+
-+.SH PARAMETERS
-+.TP
-+limit
-+Maximum queue size. Specified in bytes for bfifo, in packets for pfifo. For pfifo, defaults
-+to the interface txqueuelen, as specified with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+
-+For bfifo, it defaults to the txqueuelen multiplied by the interface MTU.
-+
-+.SH OUTPUT
-+The output of
-+.B tc -s qdisc ls
-+contains the limit, either in packets or in bytes, and the number of bytes
-+and packets actually sent. An unsent and dropped packet only appears between braces
-+and is not counted as 'Sent'.
-+
-+In this example, the queue length is 100 packets, 45894 bytes were sent over 681 packets.
-+No packets were dropped, and as the pfifo queue does not slow down packets, there were also no
-+overlimits:
-+.P
-+.nf
-+# tc -s qdisc ls dev eth0
-+qdisc pfifo 8001: dev eth0 limit 100p
-+ Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)
-+.fi
-+
-+If a backlog occurs, this is displayed as well.
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-pfifo_fast.8 iproute2/debian/manpages/tc-pfifo_fast.8
---- iproute2-orig/debian/manpages/tc-pfifo_fast.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-pfifo_fast.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,59 @@
-+.TH PFIFO_FAST 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+pfifo_fast \- three-band first in, first out queue
-+
-+.SH DESCRIPTION
-+pfifo_fast is the default qdisc of each interface.
-+
-+Whenever an interface is created, the pfifo_fast qdisc is automatically used
-+as a queue. If another qdisc is attached, it preempts the default
-+pfifo_fast, which automatically returns to function when an existing qdisc
-+is detached.
-+
-+In this sense this qdisc is magic, and unlike other qdiscs.
-+
-+.SH ALGORITHM
-+The algorithm is very similar to that of the classful
-+.BR tc-prio (8)
-+qdisc.
-+.B pfifo_fast
-+is like three
-+.BR tc-pfifo (8)
-+queues side by side, where packets can be enqueued in any of the three bands
-+based on their Type of Service bits or assigned priority.
-+
-+Not all three bands are dequeued simultaneously - as long as lower bands
-+have traffic, higher bands are never dequeued. This can be used to
-+prioritize interactive traffic or penalize 'lowest cost' traffic.
-+
-+Each band can be txqueuelen packets long, as configured with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+Additional packets coming in are not enqueued but are instead dropped.
-+
-+See
-+.BR tc-prio (8)
-+for complete details on how TOS bits are translated into bands.
-+.SH PARAMETERS
-+.TP
-+txqueuelen
-+The length of the three bands depends on the interface txqueuelen, as
-+specified with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+
-+.SH BUGS
-+Does not maintain statistics and does not show up in tc qdisc ls. This is because
-+it is the automatic default in the absence of a configured qdisc.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-prio.8 iproute2/debian/manpages/tc-prio.8
---- iproute2-orig/debian/manpages/tc-prio.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-prio.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,187 @@
-+.TH PRIO 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+PRIO \- Priority qdisc
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] prio [ bands
-+bands
-+.B ] [ priomap
-+band,band,band...
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+The PRIO qdisc is a simple classful queueing discipline that contains
-+an arbitrary number of classes of differing priority. The classes are
-+dequeued in numerical descending order of priority. PRIO is a scheduler
-+and never delays packets - it is a work-conserving qdisc, though the qdiscs
-+contained in the classes may not be.
-+
-+Very useful for lowering latency when there is no need for slowing down
-+traffic.
-+
-+.SH ALGORITHM
-+On creation with 'tc qdisc add', a fixed number of bands is created. Each
-+band is a class, although is not possible to add classes with 'tc qdisc
-+add', the number of bands to be created must instead be specified on the
-+commandline attaching PRIO to its root.
-+
-+When dequeueing, band 0 is tried first and only if it did not deliver a
-+packet does PRIO try band 1, and so onwards. Maximum reliability packets
-+should therefore go to band 0, minimum delay to band 1 and the rest to band
-+2.
-+
-+As the PRIO qdisc itself will have minor number 0, band 0 is actually
-+major:1, band 1 is major:2, etc. For major, substitute the major number
-+assigned to the qdisc on 'tc qdisc add' with the
-+.B handle
-+parameter.
-+
-+.SH CLASSIFICATION
-+Three methods are available to PRIO to determine in which band a packet will
-+be enqueued.
-+.TP
-+From userspace
-+A process with sufficient privileges can encode the destination class
-+directly with SO_PRIORITY, see
-+.BR tc(7).
-+.TP
-+with a tc filter
-+A tc filter attached to the root qdisc can point traffic directly to a class
-+.TP
-+with the priomap
-+Based on the packet priority, which in turn is derived from the Type of
-+Service assigned to the packet.
-+.P
-+Only the priomap is specific to this qdisc.
-+.SH QDISC PARAMETERS
-+.TP
-+bands
-+Number of bands. If changed from the default of 3,
-+.B priomap
-+must be updated as well.
-+.TP
-+priomap
-+The priomap maps the priority of
-+a packet to a class. The priority can either be set directly from userspace,
-+or be derived from the Type of Service of the packet.
-+
-+Determines how packet priorities, as assigned by the kernel, map to
-+bands. Mapping occurs based on the TOS octet of the packet, which looks like
-+this:
-+
-+.nf
-+0 1 2 3 4 5 6 7
-++---+---+---+---+---+---+---+---+
-+| | | |
-+|PRECEDENCE | TOS |MBZ|
-+| | | |
-++---+---+---+---+---+---+---+---+
-+.fi
-+
-+The four TOS bits (the 'TOS field') are defined as:
-+
-+.nf
-+Binary Decimcal Meaning
-+-----------------------------------------
-+1000 8 Minimize delay (md)
-+0100 4 Maximize throughput (mt)
-+0010 2 Maximize reliability (mr)
-+0001 1 Minimize monetary cost (mmc)
-+0000 0 Normal Service
-+.fi
-+
-+As there is 1 bit to the right of these four bits, the actual value of the
-+TOS field is double the value of the TOS bits. Tcpdump -v -v shows you the
-+value of the entire TOS field, not just the four bits. It is the value you
-+see in the first column of this table:
-+
-+.nf
-+TOS Bits Means Linux Priority Band
-+------------------------------------------------------------
-+0x0 0 Normal Service 0 Best Effort 1
-+0x2 1 Minimize Monetary Cost 1 Filler 2
-+0x4 2 Maximize Reliability 0 Best Effort 1
-+0x6 3 mmc+mr 0 Best Effort 1
-+0x8 4 Maximize Throughput 2 Bulk 2
-+0xa 5 mmc+mt 2 Bulk 2
-+0xc 6 mr+mt 2 Bulk 2
-+0xe 7 mmc+mr+mt 2 Bulk 2
-+0x10 8 Minimize Delay 6 Interactive 0
-+0x12 9 mmc+md 6 Interactive 0
-+0x14 10 mr+md 6 Interactive 0
-+0x16 11 mmc+mr+md 6 Interactive 0
-+0x18 12 mt+md 4 Int. Bulk 1
-+0x1a 13 mmc+mt+md 4 Int. Bulk 1
-+0x1c 14 mr+mt+md 4 Int. Bulk 1
-+0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1
-+.fi
-+
-+The second column contains the value of the relevant
-+four TOS bits, followed by their translated meaning. For example, 15 stands
-+for a packet wanting Minimal Montetary Cost, Maximum Reliability, Maximum
-+Throughput AND Minimum Delay.
-+
-+The fourth column lists the way the Linux kernel interprets the TOS bits, by
-+showing to which Priority they are mapped.
-+
-+The last column shows the result of the default priomap. On the commandline,
-+the default priomap looks like this:
-+
-+ 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
-+
-+This means that priority 4, for example, gets mapped to band number 1.
-+The priomap also allows you to list higher priorities (> 7) which do not
-+correspond to TOS mappings, but which are set by other means.
-+
-+This table from RFC 1349 (read it for more details) explains how
-+applications might very well set their TOS bits:
-+
-+.nf
-+TELNET 1000 (minimize delay)
-+FTP
-+ Control 1000 (minimize delay)
-+ Data 0100 (maximize throughput)
-+
-+TFTP 1000 (minimize delay)
-+
-+SMTP
-+ Command phase 1000 (minimize delay)
-+ DATA phase 0100 (maximize throughput)
-+
-+Domain Name Service
-+ UDP Query 1000 (minimize delay)
-+ TCP Query 0000
-+ Zone Transfer 0100 (maximize throughput)
-+
-+NNTP 0001 (minimize monetary cost)
-+
-+ICMP
-+ Errors 0000
-+ Requests 0000 (mostly)
-+ Responses <same as request> (mostly)
-+.fi
-+
-+
-+.SH CLASSES
-+PRIO classes cannot be configured further - they are automatically created
-+when the PRIO qdisc is attached. Each class however can contain yet a
-+further qdisc.
-+
-+.SH BUGS
-+Large amounts of traffic in the lower bands can cause starvation of higher
-+bands. Can be prevented by attaching a shaper (for example,
-+.BR tc-tbf(8)
-+to these bands to make sure they cannot dominate the link.
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, J Hadi Salim
-+<hadi@cyberus.ca>. This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-red.8 iproute2/debian/manpages/tc-red.8
---- iproute2-orig/debian/manpages/tc-red.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-red.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,131 @@
-+.TH RED 8 "13 December 2001" "iproute2" "Linux"
-+.SH NAME
-+red \- Random Early Detection
-+.SH SYNOPSIS
-+.B tc qdisc ... red
-+.B limit
-+bytes
-+.B min
-+bytes
-+.B max
-+bytes
-+.B avpkt
-+bytes
-+.B burst
-+packets
-+.B [ ecn ] [ bandwidth
-+rate
-+.B ] probability
-+chance
-+
-+.SH DESCRIPTION
-+Random Early Detection is a classless qdisc which manages its queue size
-+smartly. Regular queues simply drop packets from the tail when they are
-+full, which may not be the optimal behaviour. RED also performs tail drop,
-+but does so in a more gradual way.
-+
-+Once the queue hits a certain average length, packets enqueued have a
-+configurable chance of being marked (which may mean dropped). This chance
-+increases linearly up to a point called the
-+.B max
-+average queue length, although the queue might get bigger.
-+
-+This has a host of benefits over simple taildrop, while not being processor
-+intensive. It prevents synchronous retransmits after a burst in traffic,
-+which cause further retransmits, etc.
-+
-+The goal is the have a small queue size, which is good for interactivity
-+while not disturbing TCP/IP traffic with too many sudden drops after a burst
-+of traffic.
-+
-+Depending on if ECN is configured, marking either means dropping or
-+purely marking a packet as overlimit.
-+.SH ALGORITHM
-+The average queue size is used for determining the marking
-+probability. This is calculated using an Exponential Weighted Moving
-+Average, which can be more or less sensitive to bursts.
-+
-+When the average queue size is below
-+.B min
-+bytes, no packet will ever be marked. When it exceeds
-+.B min,
-+the probability of doing so climbs linearly up
-+to
-+.B probability,
-+until the average queue size hits
-+.B max
-+bytes. Because
-+.B probability
-+is normally not set to 100%, the queue size might
-+conceivably rise above
-+.B max
-+bytes, so the
-+.B limit
-+parameter is provided to set a hard maximum for the size of the queue.
-+
-+.SH PARAMETERS
-+.TP
-+min
-+Average queue size at which marking becomes a possibility.
-+.TP
-+max
-+At this average queue size, the marking probability is maximal. Should be at
-+least twice
-+.B min
-+to prevent synchronous retransmits, higher for low
-+.B min.
-+.TP
-+probability
-+Maximum probability for marking, specified as a floating point
-+number from 0.0 to 1.0. Suggested values are 0.01 or 0.02 (1 or 2%,
-+respectively).
-+.TP
-+limit
-+Hard limit on the real (not average) queue size in bytes. Further packets
-+are dropped. Should be set higher than max+burst. It is advised to set this
-+a few times higher than
-+.B max.
-+.TP
-+burst
-+Used for determining how fast the average queue size is influenced by the
-+real queue size. Larger values make the calculation more sluggish, allowing
-+longer bursts of traffic before marking starts. Real life experiments
-+support the following guideline: (min+min+max)/(3*avpkt).
-+.TP
-+avpkt
-+Specified in bytes. Used with burst to determine the time constant for
-+average queue size calculations. 1000 is a good value.
-+.TP
-+bandwidth
-+This rate is used for calculating the average queue size after some
-+idle time. Should be set to the bandwidth of your interface. Does not mean
-+that RED will shape for you! Optional.
-+.TP
-+ecn
-+As mentioned before, RED can either 'mark' or 'drop'. Explicit Congestion
-+Notification allows RED to notify remote hosts that their rate exceeds the
-+amount of bandwidth available. Non-ECN capable hosts can only be notified by
-+dropping a packet. If this parameter is specified, packets which indicate
-+that their hosts honor ECN will only be marked and not dropped, unless the
-+queue size hits
-+.B limit
-+bytes. Needs a tc binary with RED support compiled in. Recommended.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH SOURCES
-+.TP
-+o
-+Floyd, S., and Jacobson, V., Random Early Detection gateways for
-+Congestion Avoidance. http://www.aciri.org/floyd/papers/red/red.html
-+.TP
-+o
-+Some changes to the algorithm by Alexey N. Kuznetsov.
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, Alexey Makarenko
-+<makar@phoenix.kharkov.ua>, J Hadi Salim <hadi@nortelnetworks.com>.
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-sfq.8 iproute2/debian/manpages/tc-sfq.8
---- iproute2-orig/debian/manpages/tc-sfq.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-sfq.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,107 @@
-+.TH TC 8 "8 December 2001" "iproute2" "Linux"
-+.SH NAME
-+sfq \- Stochastic Fairness Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... perturb
-+seconds
-+.B quantum
-+bytes
-+
-+.SH DESCRIPTION
-+
-+Stochastic Fairness Queueing is a classless queueing discipline available for
-+traffic control with the
-+.BR tc (8)
-+command.
-+
-+SFQ does not shape traffic but only schedules the transmission of packets, based on 'flows'.
-+The goal is to ensure fairness so that each flow is able to send data in turn, thus preventing
-+any single flow from drowning out the rest.
-+
-+This may in fact have some effect in mitigating a Denial of Service attempt.
-+
-+SFQ is work-conserving and therefore always delivers a packet if it has one available.
-+.SH ALGORITHM
-+On enqueueing, each packet is assigned to a hash bucket, based on
-+.TP
-+(i)
-+Source address
-+.TP
-+(ii)
-+Destination address
-+.TP
-+(iii)
-+Source port
-+.P
-+If these are available. SFQ knows about ipv4 and ipv6 and also UDP, TCP and ESP.
-+Packets with other protocols are hashed based on the 32bits representation of their
-+destination and the socket they belong to. A flow corresponds mostly to a TCP/IP
-+connection.
-+
-+Each of these buckets should represent a unique flow. Because multiple flows may
-+get hashed to the same bucket, the hashing algorithm is perturbed at configurable
-+intervals so that the unfairness lasts only for a short while. Perturbation may
-+however cause some inadvertent packet reordering to occur.
-+
-+When dequeuing, each hashbucket with data is queried in a round robin fashion.
-+
-+The compile time maximum length of the SFQ is 128 packets, which can be spread over
-+at most 128 buckets of 1024 available. In case of overflow, tail-drop is performed
-+on the fullest bucket, thus maintaining fairness.
-+
-+.SH PARAMETERS
-+.TP
-+perturb
-+Interval in seconds for queue algorithm perturbation. Defaults to 0, which means that
-+no perturbation occurs. Do not set too low for each perturbation may cause some packet
-+reordering. Advised value: 10
-+.TP
-+quantum
-+Amount of bytes a flow is allowed to dequeue during a round of the round robin process.
-+Defaults to the MTU of the interface which is also the advised value and the minimum value.
-+
-+.SH EXAMPLE & USAGE
-+
-+To attach to device ppp0:
-+.P
-+# tc qdisc add dev ppp0 root sfq perturb 10
-+.P
-+Please note that SFQ, like all non-shaping (work-conserving) qdiscs, is only useful
-+if it owns the queue.
-+This is the case when the link speed equals the actually available bandwidth. This holds
-+for regular phone modems, ISDN connections and direct non-switched ethernet links.
-+.P
-+Most often, cable modems and DSL devices do not fall into this category. The same holds
-+for when connected to a switch and trying to send data to a congested segment also
-+connected to the switch.
-+.P
-+In this case, the effective queue does not reside within Linux and is therefore not
-+available for scheduling.
-+.P
-+Embed SFQ in a classful qdisc to make sure it owns the queue.
-+
-+.SH SOURCE
-+.TP
-+o
-+Paul E. McKenney "Stochastic Fairness Queuing",
-+IEEE INFOCOMM'90 Proceedings, San Francisco, 1990.
-+
-+.TP
-+o
-+Paul E. McKenney "Stochastic Fairness Queuing",
-+"Interworking: Research and Experience", v.2, 1991, p.113-131.
-+
-+.TP
-+o
-+See also:
-+M. Shreedhar and George Varghese "Efficient Fair
-+Queuing using Deficit Round Robin", Proc. SIGCOMM 95.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc-tbf.8 iproute2/debian/manpages/tc-tbf.8
---- iproute2-orig/debian/manpages/tc-tbf.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc-tbf.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,138 @@
-+.TH TC 8 "13 December 2001" "iproute2" "Linux"
-+.SH NAME
-+tbf \- Token Bucket Filter
-+.SH SYNOPSIS
-+.B tc qdisc ... tbf rate
-+rate
-+.B burst
-+bytes/cell
-+.B ( latency
-+ms
-+.B | limit
-+bytes
-+.B ) [ mpu
-+bytes
-+.B [ peakrate
-+rate
-+.B mtu
-+bytes/cell
-+.B ] ]
-+.P
-+burst is also known as buffer and maxburst. mtu is also known as minburst.
-+.SH DESCRIPTION
-+
-+The Token Bucket Filter is a classless queueing discipline available for
-+traffic control with the
-+.BR tc (8)
-+command.
-+
-+TBF is a pure shaper and never schedules traffic. It is non-work-conserving and may throttle
-+itself, although packets are available, to ensure that the configured rate is not exceeded.
-+On all platforms except for Alpha,
-+it is able to shape up to 1mbit/s of normal traffic with ideal minimal burstiness,
-+sending out data exactly at the configured rates.
-+
-+Much higher rates are possible but at the cost of losing the minimal burstiness. In that
-+case, data is on average dequeued at the configured rate but may be sent much faster at millisecond
-+timescales. Because of further queues living in network adaptors, this is often not a problem.
-+
-+Kernels with a higher 'HZ' can achieve higher rates with perfect burstiness. On Alpha, HZ is ten
-+times higher, leading to a 10mbit/s limit to perfection. These calculations hold for packets of on
-+average 1000 bytes.
-+
-+.SH ALGORITHM
-+As the name implies, traffic is filtered based on the expenditure of
-+.B tokens.
-+Tokens roughly correspond to bytes, with the additional constraint that each packet consumes
-+some tokens, no matter how small it is. This reflects the fact that even a zero-sized packet occupies
-+the link for some time.
-+
-+On creation, the TBF is stocked with tokens which correspond to the amount of traffic that can be burst
-+in one go. Tokens arrive at a steady rate, until the bucket is full.
-+
-+If no tokens are available, packets are queued, up to a configured limit. The TBF now
-+calculates the token deficit, and throttles until the first packet in the queue can be sent.
-+
-+If it is not acceptable to burst out packets at maximum speed, a peakrate can be configured
-+to limit the speed at which the bucket empties. This peakrate is implemented as a second TBF
-+with a very small bucket, so that it doesn't burst.
-+
-+To achieve perfection, the second bucket may contain only a single packet, which leads to
-+the earlier mentioned 1mbit/s limit.
-+
-+This limit is caused by the fact that the kernel can only throttle for at minimum 1 'jiffy', which depends
-+on HZ as 1/HZ. For perfect shaping, only a single packet can get sent per jiffy - for HZ=100, this means 100
-+packets of on average 1000 bytes each, which roughly corresponds to 1mbit/s.
-+
-+.SH PARAMETERS
-+See
-+.BR tc (8)
-+for how to specify the units of these values.
-+.TP
-+limit or latency
-+Limit is the number of bytes that can be queued waiting for tokens to become
-+available. You can also specify this the other way around by setting the
-+latency parameter, which specifies the maximum amount of time a packet can
-+sit in the TBF. The latter calculation takes into account the size of the
-+bucket, the rate and possibly the peakrate (if set). These two parameters
-+are mutually exclusive.
-+.TP
-+burst
-+Also known as buffer or maxburst.
-+Size of the bucket, in bytes. This is the maximum amount of bytes that tokens can be available for instantaneously.
-+In general, larger shaping rates require a larger buffer. For 10mbit/s on Intel, you need at least 10kbyte buffer
-+if you want to reach your configured rate!
-+
-+If your buffer is too small, packets may be dropped because more tokens arrive per timer tick than fit in your bucket.
-+The minimum buffer size can be calculated by dividing the rate by HZ.
-+
-+Token usage calculations are performed using a table which by default has a resolution of 8 packets.
-+This resolution can be changed by specifying the
-+.B cell
-+size with the burst. For example, to specify a 6000 byte buffer with a 16
-+byte cell size, set a burst of 6000/16. You will probably never have to set
-+this. Must be an integral power of 2.
-+.TP
-+mpu
-+A zero-sized packet does not use zero bandwidth. For ethernet, no packet uses less than 64 bytes. The Minimum Packet Unit
-+determines the minimal token usage (specified in bytes) for a packet. Defaults to zero.
-+.TP
-+rate
-+The speed knob. See remarks above about limits! See
-+.BR tc (8)
-+for units.
-+.PP
-+Furthermore, if a peakrate is desired, the following parameters are available:
-+
-+.TP
-+peakrate
-+Maximum depletion rate of the bucket. Limited to 1mbit/s on Intel, 10mbit/s on Alpha. The peakrate does
-+not need to be set, it is only necessary if perfect millisecond timescale shaping is required.
-+
-+.TP
-+mtu/minburst
-+Specifies the size of the peakrate bucket. For perfect accuracy, should be set to the MTU of the interface.
-+If a peakrate is needed, but some burstiness is acceptable, this size can be raised. A 3000 byte minburst
-+allows around 3mbit/s of peakrate, given 1000 byte packets.
-+
-+Like the regular burstsize you can also specify a
-+.B cell
-+size.
-+.SH EXAMPLE & USAGE
-+
-+To attach a TBF with a sustained maximum rate of 0.5mbit/s, a peakrate of 1.0mbit/s,
-+a 5kilobyte buffer, with a pre-bucket queue size limit calculated so the TBF causes
-+at most 70ms of latency, with perfect peakrate behaviour, issue:
-+.P
-+# tc qdisc add dev eth0 root tbf rate 0.5mbit \\
-+ burst 5kb latency 70ms peakrate 1mbit \\
-+ minburst 1540
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/manpages/tc.8 iproute2/debian/manpages/tc.8
---- iproute2-orig/debian/manpages/tc.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/manpages/tc.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,348 @@
-+.TH TC 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+tc \- show / manipulate traffic control settings
-+.SH SYNOPSIS
-+.B tc qdisc [ add | change | replace | link ] dev
-+DEV
-+.B
-+[ parent
-+qdisc-id
-+.B | root ]
-+.B [ handle
-+qdisc-id ] qdisc
-+[ qdisc specific parameters ]
-+.P
-+
-+.B tc class [ add | change | replace ] dev
-+DEV
-+.B parent
-+qdisc-id
-+.B [ classid
-+class-id ] qdisc
-+[ qdisc specific parameters ]
-+.P
-+
-+.B tc filter [ add | change | replace ] dev
-+DEV
-+.B [ parent
-+qdisc-id
-+.B | root ] protocol
-+protocol
-+.B prio
-+priority filtertype
-+[ filtertype specific parameters ]
-+.B flowid
-+flow-id
-+
-+.B tc [-s | -d ] qdisc show [ dev
-+DEV
-+.B ]
-+.P
-+.B tc [-s | -d ] class show dev
-+DEV
-+.P
-+.B tc filter show dev
-+DEV
-+
-+.SH DESCRIPTION
-+.B Tc
-+is used to configure Traffic Control in the Linux kernel. Traffic Control consists
-+of the following:
-+
-+.TP
-+SHAPING
-+When traffic is shaped, its rate of transmission is under control. Shaping may
-+be more than lowering the available bandwidth - it is also used to smooth out
-+bursts in traffic for better network behaviour. Shaping occurs on egress.
-+
-+.TP
-+SCHEDULING
-+By scheduling the transmission of packets it is possible to improve interactivity
-+for traffic that needs it while still guaranteeing bandwidth to bulk transfers. Reordering
-+is also called prioritizing, and happens only on egress.
-+
-+.TP
-+POLICING
-+Where shaping deals with transmission of traffic, policing pertains to traffic
-+arriving. Policing thus occurs on ingress.
-+
-+.TP
-+DROPPING
-+Traffic exceeding a set bandwidth may also be dropped forthwith, both on
-+ingress and on egress.
-+
-+.P
-+Processing of traffic is controlled by three kinds of objects: qdiscs,
-+classes and filters.
-+
-+.SH QDISCS
-+.B qdisc
-+is short for 'queueing discipline' and it is elementary to
-+understanding traffic control. Whenever the kernel needs to send a
-+packet to an interface, it is
-+.B enqueued
-+to the qdisc configured for that interface. Immediately afterwards, the kernel
-+tries to get as many packets as possible from the qdisc, for giving them
-+to the network adaptor driver.
-+
-+A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure
-+First In, First Out queue. It does however store traffic when the network interface
-+can't handle it momentarily.
-+
-+.SH CLASSES
-+Some qdiscs can contain classes, which contain further qdiscs - traffic may
-+then be enqueued in any of the inner qdiscs, which are within the
-+.B classes.
-+When the kernel tries to dequeue a packet from such a
-+.B classful qdisc
-+it can come from any of the classes. A qdisc may for example prioritize
-+certain kinds of traffic by trying to dequeue from certain classes
-+before others.
-+
-+.SH FILTERS
-+A
-+.B filter
-+is used by a classful qdisc to determine in which class a packet will
-+be enqueued. Whenever traffic arrives at a class with subclasses, it needs
-+to be classified. Various methods may be employed to do so, one of these
-+are the filters. All filters attached to the class are called, until one of
-+them returns with a verdict. If no verdict was made, other criteria may be
-+available. This differs per qdisc.
-+
-+It is important to notice that filters reside
-+.B within
-+qdiscs - they are not masters of what happens.
-+
-+.SH CLASSLESS QDISCS
-+The classless qdiscs are:
-+.TP
-+[p|b]fifo
-+Simplest usable qdisc, pure First In, First Out behaviour. Limited in
-+packets or in bytes.
-+.TP
-+pfifo_fast
-+Standard qdisc for 'Advanced Router' enabled kernels. Consists of a three-band
-+queue which honors Type of Service flags, as well as the priority that may be
-+assigned to a packet.
-+.TP
-+red
-+Random Early Detection simulates physical congestion by randomly dropping
-+packets when nearing configured bandwidth allocation. Well suited to very
-+large bandwidth applications.
-+.TP
-+sfq
-+Stochastic Fairness Queueing reorders queued traffic so each 'session'
-+gets to send a packet in turn.
-+.TP
-+tbf
-+The Token Bucket Filter is suited for slowing traffic down to a precisely
-+configured rate. Scales well to large bandwidths.
-+.SH CONFIGURING CLASSLESS QDISCS
-+In the absence of classful qdiscs, classless qdiscs can only be attached at
-+the root of a device. Full syntax:
-+.P
-+.B tc qdisc add dev
-+DEV
-+.B root
-+QDISC QDISC-PARAMETERS
-+
-+To remove, issue
-+.P
-+.B tc qdisc del dev
-+DEV
-+.B root
-+
-+The
-+.B pfifo_fast
-+qdisc is the automatic default in the absence of a configured qdisc.
-+
-+.SH CLASSFUL QDISCS
-+The classful qdiscs are:
-+.TP
-+CBQ
-+Class Based Queueing implements a rich linksharing hierarchy of classes.
-+It contains shaping elements as well as prioritizing capabilities. Shaping is
-+performed using link idle time calculations based on average packet size and
-+underlying link bandwidth. The latter may be ill-defined for some interfaces.
-+.TP
-+HTB
-+The Hierarchy Token Bucket implements a rich linksharing hierarchy of
-+classes with an emphasis on conforming to existing practices. HTB facilitates
-+guaranteeing bandwidth to classes, while also allowing specification of upper
-+limits to inter-class sharing. It contains shaping elements, based on TBF and
-+can prioritize classes.
-+.TP
-+PRIO
-+The PRIO qdisc is a non-shaping container for a configurable number of
-+classes which are dequeued in order. This allows for easy prioritization
-+of traffic, where lower classes are only able to send if higher ones have
-+no packets available. To facilitate configuration, Type Of Service bits are
-+honored by default.
-+.SH THEORY OF OPERATION
-+Classes form a tree, where each class has a single parent.
-+A class may have multiple children. Some qdiscs allow for runtime addition
-+of classes (CBQ, HTB) while others (PRIO) are created with a static number of
-+children.
-+
-+Qdiscs which allow dynamic addition of classes can have zero or more
-+subclasses to which traffic may be enqueued.
-+
-+Furthermore, each class contains a
-+.B leaf qdisc
-+which by default has
-+.B pfifo
-+behaviour though another qdisc can be attached in place. This qdisc may again
-+contain classes, but each class can have only one leaf qdisc.
-+
-+When a packet enters a classful qdisc it can be
-+.B classified
-+to one of the classes within. Three criteria are available, although not all
-+qdiscs will use all three:
-+.TP
-+tc filters
-+If tc filters are attached to a class, they are consulted first
-+for relevant instructions. Filters can match on all fields of a packet header,
-+as well as on the firewall mark applied by ipchains or iptables. See
-+.BR tc-filters (8).
-+.TP
-+Type of Service
-+Some qdiscs have built in rules for classifying packets based on the TOS field.
-+.TP
-+skb->priority
-+Userspace programs can encode a class-id in the 'skb->priority' field using
-+the SO_PRIORITY option.
-+.P
-+Each node within the tree can have its own filters but higher level filters
-+may also point directly to lower classes.
-+
-+If classification did not succeed, packets are enqueued to the leaf qdisc
-+attached to that class. Check qdisc specific manpages for details, however.
-+
-+.SH NAMING
-+All qdiscs, classes and filters have IDs, which can either be specified
-+or be automatically assigned.
-+
-+IDs consist of a major number and a minor number, separated by a colon.
-+
-+.TP
-+QDISCS
-+A qdisc, which potentially can have children,
-+gets assigned a major number, called a 'handle', leaving the minor
-+number namespace available for classes. The handle is expressed as '10:'.
-+It is customary to explicitly assign a handle to qdiscs expected to have
-+children.
-+
-+.TP
-+CLASSES
-+Classes residing under a qdisc share their qdisc major number, but each have
-+a separate minor number called a 'classid' that has no relation to their
-+parent classes, only to their parent qdisc. The same naming custom as for
-+qdiscs applies.
-+
-+.TP
-+FILTERS
-+Filters have a three part ID, which is only needed when using a hashed
-+filter hierarchy, for which see
-+.BR tc-filters (8).
-+.SH UNITS
-+All parameters accept a floating point number, possibly followed by a unit.
-+.P
-+Bandwidths or rates can be specified in:
-+.TP
-+kbps
-+Kilobytes per second
-+.TP
-+mbps
-+Megabytes per second
-+.TP
-+kbit
-+Kilobits per second
-+.TP
-+mbit
-+Megabits per second
-+.TP
-+bps or a bare number
-+Bytes per second
-+.P
-+Amounts of data can be specified in:
-+.TP
-+kb or k
-+Kilobytes
-+.TP
-+mb or m
-+Megabytes
-+.TP
-+mbit
-+Megabits
-+.TP
-+kbit
-+Kilobits
-+.TP
-+b or a bare number
-+Bytes.
-+.P
-+Lengths of time can be specified in:
-+.TP
-+s, sec or secs
-+Whole seconds
-+.TP
-+ms, msec or msecs
-+Milliseconds
-+.TP
-+us, usec, usecs or a bare number
-+Microseconds.
-+
-+.SH TC COMMANDS
-+The following commands are available for qdiscs, classes and filter:
-+.TP
-+add
-+Add a qdisc, class or filter to a node. For all entities, a
-+.B parent
-+must be passed, either by passing its ID or by attaching directly to the root of a device.
-+When creating a qdisc or a filter, it can be named with the
-+.B handle
-+parameter. A class is named with the
-+.B classid
-+parameter.
-+
-+.TP
-+remove
-+A qdisc can be removed by specifying its handle, which may also be 'root'. All subclasses and their leaf qdiscs
-+are automatically deleted, as well as any filters attached to them.
-+
-+.TP
-+change
-+Some entities can be modified 'in place'. Shares the syntax of 'add', with the exception
-+that the handle cannot be changed and neither can the parent. In other words,
-+.B
-+change
-+cannot move a node.
-+
-+.TP
-+replace
-+Performs a nearly atomic remove/add on an existing node id. If the node does not exist yet
-+it is created.
-+
-+.TP
-+link
-+Only available for qdiscs and performs a replace where the node
-+must exist already.
-+
-+
-+.SH HISTORY
-+.B tc
-+was written by Alexey N. Kuznetsov and added in Linux 2.2.
-+.SH SEE ALSO
-+.BR tc-cbq (8),
-+.BR tc-htb (8),
-+.BR tc-sfq (8),
-+.BR tc-red (8),
-+.BR tc-tbf (8),
-+.BR tc-pfifo (8),
-+.BR tc-bfifo (8),
-+.BR tc-pfifo_fast (8),
-+.BR tc-filters (8)
-+
-+.SH AUTHOR
-+Manpage maintained by bert hubert (ahu@ds9a.nl)
-+
-diff -Naur iproute2-orig/debian/postinst iproute2/debian/postinst
---- iproute2-orig/debian/postinst 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/postinst 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,6 @@
-+#!/bin/sh -e
-+
-+# FHS:
-+if [ "$1" = "configure" -a -d /usr/doc -a ! -e /usr/doc/iproute ]; then
-+ ln -sf ../share/doc/iproute /usr/doc/iproute
-+fi
-diff -Naur iproute2-orig/debian/postrm iproute2/debian/postrm
---- iproute2-orig/debian/postrm 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/postrm 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,6 @@
-+#!/bin/sh
-+
-+if [ "$1" = "purge" ]
-+then
-+ rm -rf /etc/iproute2
-+fi
-diff -Naur iproute2-orig/debian/prerm iproute2/debian/prerm
---- iproute2-orig/debian/prerm 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/prerm 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,5 @@
-+#!/bin/sh -e
-+
-+if [ \( "$1" = "upgrade" -o "$1" = "remove" \) -a -L /usr/doc/iproute ]; then
-+ rm -f /usr/doc/iproute
-+fi
-diff -Naur iproute2-orig/debian/rules iproute2/debian/rules
---- iproute2-orig/debian/rules 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/rules 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,85 @@
-+#!/usr/bin/make -f
-+#
-+# Copyright (C) 1999 Roberto Lumbreras <rover@debian.org>
-+# Copyright (C) 1999-2002 Juan Cespedes <cespedes@debian.org>
-+# Copying: GPL
-+
-+SHELL = bash
-+
-+PACKAGE = $(shell perl -e 'print <> =~ /^(.*) \(.*\)/' debian/changelog)
-+PKG_VER = $(shell perl -e 'print <> =~ /\((.*)\)/' debian/changelog)
-+PKG_UPVER= $(shell perl -e 'print <> =~ /\((.*)-[^-]*\)/' debian/changelog)
-+
-+BINS = ip/ip
-+SBINS = ip/rtmon ip/rtacct tc/tc
-+SHBINS = ip/routef ip/routel # ip/ifcfg ip/rtpr
-+DOCS = README* doc/Plan debian/README.Debian
-+MAN8 = debian/manpages/*.8
-+MANLINKS= rtmon rtacct routef routel
-+TEXDOCS = ip-cref ip-tunnels api-ip6-flowlabels
-+
-+build: stamp-build
-+
-+stamp-build:
-+ test -f include-glibc/netinet/in.h.orig || \
-+ mv include-glibc/netinet/in.h \
-+ include-glibc/netinet/in.h.orig
-+ $(MAKE) KERNEL_INCLUDE=/usr/include
-+ $(MAKE) -C doc
-+ touch stamp-build
-+
-+binary: binary-indep binary-arch
-+
-+binary-indep:
-+
-+binary-arch: checkroot stamp-build
-+ $(RM) -r debian/tmp
-+ install -d -m0755 debian/tmp/{DEBIAN,bin,sbin,usr/{bin,share/doc/$(PACKAGE),share/man/man{7,8}}}
-+ install -s -m0755 $(BINS) debian/tmp/bin/
-+ install -s -m0755 $(SBINS) debian/tmp/sbin/
-+ ln -s /bin/ip debian/tmp/sbin/ip
-+ install -m0755 $(SHBINS) debian/tmp/usr/bin/
-+ cp -p $(DOCS) debian/tmp/usr/share/doc/$(PACKAGE)/
-+ cp -rp examples debian/tmp/usr/share/doc/$(PACKAGE)/
-+ find debian/tmp/usr/share/doc/$(PACKAGE)/examples -type f -exec chmod -x {} \;
-+ install -m0644 debian/changelog debian/tmp/usr/share/doc/$(PACKAGE)/changelog.Debian
-+ cp -p RELNOTES debian/tmp/usr/share/doc/$(PACKAGE)/changelog
-+ for i in $(TEXDOCS); do \
-+ install -m0644 doc/$$i.tex debian/tmp/usr/share/doc/$(PACKAGE)/; \
-+ install -m0644 doc/$$i.dvi debian/tmp/usr/share/doc/$(PACKAGE)/; \
-+ install -m0644 doc/$$i.ps debian/tmp/usr/share/doc/$(PACKAGE)/; \
-+ done
-+ install -m0644 $(MAN8) debian/tmp/usr/share/man/man8/
-+ gzip -9fr debian/tmp/usr/share || true
-+ ln -s tc-pbfifo.8.gz debian/tmp/usr/share/man/man8/tc-pfifo.8.gz
-+ ln -s tc-pbfifo.8.gz debian/tmp/usr/share/man/man8/tc-bfifo.8.gz
-+ for i in $(MANLINKS); do \
-+ ln -s ../man7/undocumented.7.gz debian/tmp/usr/share/man/man8/$$i.8.gz; \
-+ done
-+ cp -p debian/copyright debian/tmp/usr/share/doc/$(PACKAGE)/
-+ cp -rp etc debian/tmp/
-+ install -m0644 debian/conffiles debian/tmp/DEBIAN/
-+
-+ dpkg-shlibdeps $(BINS) $(SBINS)
-+ dpkg-gencontrol -isp
-+ chown -R root.root debian/tmp
-+ chmod -R u=rwX,go=rX debian/tmp
-+ dpkg --build debian/tmp ..
-+
-+checkdir:
-+ @test -f debian/rules
-+
-+checkroot: checkdir
-+ @test 0 = `id -u` || { echo "Error: not super-user"; exit 1; }
-+
-+clean: checkdir debian/control
-+ $(RM) stamp-build debian/files debian/substvars
-+ $(MAKE) clean
-+ $(MAKE) -C doc clean
-+ $(RM) `find . -name "*~" -o -name core`
-+ $(RM) -r debian/tmp
-+ test -f include-glibc/netinet/in.h.orig && \
-+ mv include-glibc/netinet/in.h.orig \
-+ include-glibc/netinet/in.h || true
-+
-+.PHONY: build binary binary-arch binary-indep checkdir checkroot clean
-diff -Naur iproute2-orig/debian/tc-cbq.8 iproute2/debian/tc-cbq.8
---- iproute2-orig/debian/tc-cbq.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-cbq.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,353 @@
-+.TH CBQ 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+CBQ \- Class Based Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] cbq [ allot
-+bytes
-+.B ] avpkt
-+bytes
-+.B bandwidth
-+rate
-+.B [ cell
-+bytes
-+.B ] [ ewma
-+log
-+.B ] [ mpu
-+bytes
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] cbq allot
-+bytes
-+.B [ bandwidth
-+rate
-+.B ] [ rate
-+rate
-+.B ] prio
-+priority
-+.B [ weight
-+weight
-+.B ] [ minburst
-+packets
-+.B ] [ maxburst
-+packets
-+.B ] [ ewma
-+log
-+.B ] [ cell
-+bytes
-+.B ] avpkt
-+bytes
-+.B [ mpu
-+bytes
-+.B ] [ bounded isolated ] [ split
-+handle
-+.B & defmap
-+defmap
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+Class Based Queueing is a classful qdisc that implements a rich
-+linksharing hierarchy of classes. It contains shaping elements as
-+well as prioritizing capabilities. Shaping is performed using link
-+idle time calculations based on the timing of dequeue events and
-+underlying link bandwidth.
-+
-+.SH SHAPING ALGORITHM
-+When shaping a 10mbit/s connection to 1mbit/s, the link will
-+be idle 90% of the time. If it isn't, it needs to be throttled so that it
-+IS idle 90% of the time.
-+
-+During operations, the effective idletime is measured using an
-+exponential weighted moving average (EWMA), which considers recent
-+packets to be exponentially more important than past ones. The Unix
-+loadaverage is calculated in the same way.
-+
-+The calculated idle time is subtracted from the EWMA measured one,
-+the resulting number is called 'avgidle'. A perfectly loaded link has
-+an avgidle of zero: packets arrive exactly at the calculated
-+interval.
-+
-+An overloaded link has a negative avgidle and if it gets too negative,
-+CBQ throttles and is then 'overlimit'.
-+
-+Conversely, an idle link might amass a huge avgidle, which would then
-+allow infinite bandwidths after a few hours of silence. To prevent
-+this, avgidle is capped at
-+.B maxidle.
-+
-+If overlimit, in theory, the CBQ could throttle itself for exactly the
-+amount of time that was calculated to pass between packets, and then
-+pass one packet, and throttle again. Due to timer resolution constraints,
-+this may not be feasible, see the
-+.B minburst
-+parameter below.
-+
-+.SH CLASSIFICATION
-+Within the one CBQ instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, CBQ starts at the root and uses various methods to
-+determine which class should receive the data.
-+
-+In the absence of uncommon configuration options, the process is rather easy.
-+At each node we look for an instruction, and then go to the class the
-+instruction refers us to. If the class found is a barren leaf-node (without
-+children), we enqueue the packet there. If it is not yet a leaf node, we do
-+the whole thing over again starting from that node.
-+
-+The following actions are performed, in order at each node we visit, until one
-+sends us to another node, or terminates the process.
-+.TP
-+(i)
-+Consult filters attached to the class. If sent to a leafnode, we are done.
-+Otherwise, restart.
-+.TP
-+(ii)
-+Consult the defmap for the priority assigned to this packet, which depends
-+on the TOS bits. Check if the referral is leafless, otherwise restart.
-+.TP
-+(iii)
-+Ask the defmap for instructions for the 'best effort' priority. Check the
-+answer for leafness, otherwise restart.
-+.TP
-+(iv)
-+If none of the above returned with an instruction, enqueue at this node.
-+.P
-+This algorithm makes sure that a packet always ends up somewhere, even while
-+you are busy building your configuration.
-+
-+For more details, see
-+.BR tc-cbq-details(8).
-+
-+.SH LINK SHARING ALGORITHM
-+When dequeuing for sending to the network device, CBQ decides which of its
-+classes will be allowed to send. It does so with a Weighted Round Robin process
-+in which each class with packets gets a chance to send in turn. The WRR process
-+starts by asking the highest priority classes (lowest numerically -
-+highest semantically) for packets, and will continue to do so until they
-+have no more data to offer, in which case the process repeats for lower
-+priorities.
-+
-+Classes by default borrow bandwidth from their siblings. A class can be
-+prevented from doing so by declaring it 'bounded'. A class can also indicate
-+its unwillingness to lend out bandwidth by being 'isolated'.
-+
-+.SH QDISC
-+The root of a CBQ qdisc class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the CBQ instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional, but very useful if classes
-+will be generated within this qdisc.
-+.TP
-+allot bytes
-+This allotment is the 'chunkiness' of link sharing and is used for determining packet
-+transmission time tables. The qdisc allot differs slightly from the class allot discussed
-+below. Optional. Defaults to a reasonable value, related to avpkt.
-+.TP
-+avpkt bytes
-+The average size of a packet is needed for calculating maxidle, and is also used
-+for making sure 'allot' has a safe value. Mandatory.
-+.TP
-+bandwidth rate
-+To determine the idle time, CBQ must know the bandwidth of your underlying
-+physical interface, or parent qdisc. This is a vital parameter, more about it
-+later. Mandatory.
-+.TP
-+cell
-+The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
-+.TP
-+mpu
-+A zero sized packet may still take time to transmit. This value is the lower
-+cap for packet transmission time calculations - packets smaller than this value
-+are still deemed to have this size. Defaults to zero.
-+.TP
-+ewma log
-+When CBQ needs to measure the average idle time, it does so using an
-+Exponentially Weighted Moving Average which smoothes out measurements into
-+a moving average. The EWMA LOG determines how much smoothing occurs. Lower
-+values imply greater sensitivity. Must be between 0 and 31. Defaults
-+to 5.
-+.P
-+A CBQ qdisc does not shape out of its own accord. It only needs to know certain
-+parameters about the underlying link. Actual shaping is done in classes.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+weight weight
-+When dequeuing to the interface, classes are tried for traffic in a
-+round-robin fashion. Classes with a higher configured qdisc will generally
-+have more traffic to offer during each round, so it makes sense to allow
-+it to dequeue more traffic. All weights under a class are normalized, so
-+only the ratios matter. Defaults to the configured rate, unless the priority
-+of this class is maximal, in which case it is set to 1.
-+.TP
-+allot bytes
-+Allot specifies how many bytes a qdisc can dequeue
-+during each round of the process. This parameter is weighted using the
-+renormalized class weight described above. Silently capped at a minimum of
-+3/2 avpkt. Mandatory.
-+
-+.TP
-+prio priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+avpkt
-+See the QDISC section.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children combined can send at. Mandatory.
-+
-+.TP
-+bandwidth rate
-+This is different from the bandwidth specified when creating a CBQ disc! Only
-+used to determine maxidle and offtime, which are only calculated when
-+specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
-+
-+.TP
-+maxburst
-+This number of packets is used to calculate maxidle so that when
-+avgidle is at maxidle, this number of average packets can be burst
-+before avgidle drops to 0. Set it higher to be more tolerant of
-+bursts. You can't set maxidle directly, only via this parameter.
-+
-+.TP
-+minburst
-+As mentioned before, CBQ needs to throttle in case of
-+overlimit. The ideal solution is to do so for exactly the calculated
-+idle time, and pass 1 packet. However, Unix kernels generally have a
-+hard time scheduling events shorter than 10ms, so it is better to
-+throttle for a longer period, and then pass minburst packets in one
-+go, and then sleep minburst times longer.
-+
-+The time to wait is called the offtime. Higher values of minburst lead
-+to more accurate shaping in the long term, but to bigger bursts at
-+millisecond timescales. Optional.
-+
-+.TP
-+minidle
-+If avgidle is below 0, we are overlimits and need to wait until
-+avgidle will be big enough to send one packet. To prevent a sudden
-+burst from shutting down the link for a prolonged period of time,
-+avgidle is reset to minidle if it gets too low.
-+
-+Minidle is specified in negative microseconds, so 10 means that
-+avgidle is capped at -10us. Optional.
-+
-+.TP
-+bounded
-+Signifies that this class will not borrow bandwidth from its siblings.
-+.TP
-+isolated
-+Means that this class will not borrow bandwidth to its siblings
-+
-+.TP
-+split major:minor & defmap bitmap[/bitmap]
-+If consulting filters attached to a class did not give a verdict,
-+CBQ can also classify based on the packet's priority. There are 16
-+priorities available, numbered from 0 to 15.
-+
-+The defmap specifies which priorities this class wants to receive,
-+specified as a bitmap. The Least Significant Bit corresponds to priority
-+zero. The
-+.B split
-+parameter tells CBQ at which class the decision must be made, which should
-+be a (grand)parent of the class you are adding.
-+
-+As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
-+configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
-+
-+The complimentary configuration would then
-+be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
-+Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
-+.TP
-+estimator interval timeconstant
-+CBQ can measure how much bandwidth each class is using, which tc filters
-+can use to classify packets with. In order to determine the bandwidth
-+it uses a very simple estimator that measures once every
-+.B interval
-+microseconds how much traffic has passed. This again is a EWMA, for which
-+the time constant can be specified, also in microseconds. The
-+.B time constant
-+corresponds to the sluggishness of the measurement or, conversely, to the
-+sensitivity of the average to short bursts. Higher values mean less
-+sensitivity.
-+
-+.SH BUGS
-+The actual bandwidth of the underlying link may not be known, for example
-+in the case of PPoE or PPTP connections which in fact may send over a
-+pipe, instead of over a physical device. CBQ is quite resilient to major
-+errors in the configured bandwidth, probably a the cost of coarser shaping.
-+
-+Default kernels rely on coarse timing information for making decisions. These
-+may make shaping precise in the long term, but inaccurate on second long scales.
-+
-+See
-+.BR tc-cbq-details(8)
-+for hints on how to improve this.
-+
-+.SH SOURCES
-+.TP
-+o
-+Sally Floyd and Van Jacobson, "Link-sharing and Resource
-+Management Models for Packet Networks",
-+IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
-+
-+.TP
-+o
-+Sally Floyd, "Notes on Class-Based Queueing: Setting
-+Parameters", 1996
-+
-+.TP
-+o
-+Sally Floyd and Michael Speer, "Experimental Results
-+for Class-Based Queueing", 1998, not published.
-+
-+
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-htb.8 iproute2/debian/tc-htb.8
---- iproute2-orig/debian/tc-htb.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-htb.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,153 @@
-+.TH HTB 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+HTB \- Hierarchy Token Bucket
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] htb [ default
-+minor-id
-+.B ]
-+
-+.B tc class ... dev
-+dev
-+.B parent
-+major:[minor]
-+.B [ classid
-+major:minor
-+.B ] htb rate
-+rate
-+.B [ ceil
-+rate
-+.B ] burst
-+bytes
-+.B [ cburst
-+bytes
-+.B ] [ prio
-+priority
-+.B ]
-+
-+.SH DESCRIPTION
-+HTB is meant as a more understandable and intuitive replacement for
-+the CBQ qdisc in Linux. Both CBQ and HTB help you to control the use
-+of the outbound bandwidth on a given link. Both allow you to use one
-+physical link to simulate several slower links and to send different
-+kinds of traffic on different simulated links. In both cases, you have
-+to specify how to divide the physical link into simulated links and
-+how to decide which simulated link to use for a given packet to be sent.
-+
-+Unlike CBQ, HTB shapes traffic based on the Token Bucket Filter algorithm
-+which does not depend on interface characteristics and so does not need to
-+know the underlying bandwidth of the outgoing interface.
-+
-+.SH SHAPING ALGORITHM
-+Shaping works as documented in
-+.B tc-tbf (8).
-+
-+.SH CLASSIFICATION
-+Within the one HRB instance many classes may exist. Each of these classes
-+contains another qdisc, by default
-+.BR tc-pfifo (8).
-+
-+When enqueueing a packet, HTB starts at the root and uses various methods to
-+determine which class should receive the data.
-+
-+In the absence of uncommon configuration options, the process is rather easy.
-+At each node we look for an instruction, and then go to the class the
-+instruction refers us to. If the class found is a barren leaf-node (without
-+children), we enqueue the packet there. If it is not yet a leaf node, we do
-+the whole thing over again starting from that node.
-+
-+The following actions are performed, in order at each node we visit, until one
-+sends us to another node, or terminates the process.
-+.TP
-+(i)
-+Consult filters attached to the class. If sent to a leafnode, we are done.
-+Otherwise, restart.
-+.TP
-+(ii)
-+If none of the above returned with an instruction, enqueue at this node.
-+.P
-+This algorithm makes sure that a packet always ends up somewhere, even while
-+you are busy building your configuration.
-+
-+.SH LINK SHARING ALGORITHM
-+FIXME
-+
-+.SH QDISC
-+The root of a CBQ qdisc class tree has the following parameters:
-+
-+.TP
-+parent major:minor | root
-+This mandatory parameter determines the place of the CBQ instance, either at the
-+.B root
-+of an interface or within an existing class.
-+.TP
-+handle major:
-+Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
-+of a major number, followed by a colon. Optional, but very useful if classes
-+will be generated within this qdisc.
-+.TP
-+default minor-id
-+Unclassified traffic gets sent to the class with this minor-id.
-+
-+.SH CLASSES
-+Classes have a host of parameters to configure their operation.
-+
-+.TP
-+parent major:minor
-+Place of this class within the hierarchy. If attached directly to a qdisc
-+and not to another class, minor can be omitted. Mandatory.
-+.TP
-+classid major:minor
-+Like qdiscs, classes can be named. The major number must be equal to the
-+major number of the qdisc to which it belongs. Optional, but needed if this
-+class is going to have children.
-+.TP
-+prio priority
-+In the round-robin process, classes with the lowest priority field are tried
-+for packets first. Mandatory.
-+
-+.TP
-+rate rate
-+Maximum rate this class and all its children are guaranteed. Mandatory.
-+
-+.TP
-+ceil rate
-+Maximum rate at which a class can send, if its parent has bandwidth to spare.
-+Defaults to the configured rate, which implies no borrowing
-+
-+.TP
-+burst bytes
-+Amount of bytes that can be burst at
-+.B ceil
-+speed, in excess of the configured
-+.B rate.
-+Should be at least as high as the highest burst of all children.
-+
-+.TP
-+cburst bytes
-+Amount of bytes that can be burst at 'infinite' speed, in other words, as fast
-+as the interface can transmit them. For perfect evening out, should be equal to at most one average
-+packet. Should be at least as high as the highest cburst of all children.
-+
-+.SH NOTES
-+Due to Unix timing constraints, the maximum ceil rate is not infinite and may in fact be quite low. On Intel,
-+there are 100 timer events per second, the maximum rate is that rate at which 'burst' bytes are sent each timer tick.
-+From this, the mininum burst size for a specified rate can be calculated. For i386, a 10mbit rate requires a 12 kilobyte
-+burst as 100*12kb*8 equals 10mbit.
-+
-+.SH BUGS
-+Not in the stock kernel yet.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+.P
-+HTB website: http://luxik.cdi.cz/~devik/qos/htb/
-+.SH AUTHOR
-+Martin Devera <devik@cdi.cz>. This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-pbfifo.8 iproute2/debian/tc-pbfifo.8
---- iproute2-orig/debian/tc-pbfifo.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-pbfifo.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,72 @@
-+.TH PBFIFO 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+pfifo \- Packet limited First In, First Out queue
-+.P
-+bfifo \- Byte limited First In, First Out queue
-+
-+.SH SYNOPSIS
-+.B tc qdisc ... add pfifo
-+.B [ limit
-+packets
-+.B ]
-+.P
-+.B tc qdisc ... add bfifo
-+.B [ limit
-+bytes
-+.B ]
-+
-+.SH DESCRIPTION
-+The pfifo and bfifo qdiscs are unadorned First In, First Out queues. They are the
-+simplest queues possible and therefore have no overhead.
-+.B pfifo
-+constrains the queue size as measured in packets.
-+.B bfifo
-+does so as measured in bytes.
-+
-+Like all non-default qdiscs, they maintain statistics. This might be a reason to prefer
-+pfifo or bfifo over the default.
-+
-+.SH ALGORITHM
-+A list of packets is maintained, when a packet is enqueued it gets inserted at the tail of
-+a list. When a packet needs to be sent out to the network, it is taken from the head of the list.
-+
-+If the list is too long, no further packets are allowed on. This is called 'tail drop'.
-+
-+.SH PARAMETERS
-+.TP
-+limit
-+Maximum queue size. Specified in bytes for bfifo, in packets for pfifo. For pfifo, defaults
-+to the interface txqueuelen, as specified with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+
-+For bfifo, it defaults to the txqueuelen multiplied by the interface MTU.
-+
-+.SH OUTPUT
-+The output of
-+.B tc -s qdisc ls
-+contains the limit, either in packets or in bytes, and the number of bytes
-+and packets actually sent. An unsent and dropped packet only appears between braces
-+and is not counted as 'Sent'.
-+
-+In this example, the queue length is 100 packets, 45894 bytes were sent over 681 packets.
-+No packets were dropped, and as the pfifo queue does not slow down packets, there were also no
-+overlimits:
-+.P
-+.nf
-+# tc -s qdisc ls dev eth0
-+qdisc pfifo 8001: dev eth0 limit 100p
-+ Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)
-+.fi
-+
-+If a backlog occurs, this is displayed as well.
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-pfifo_fast.8 iproute2/debian/tc-pfifo_fast.8
---- iproute2-orig/debian/tc-pfifo_fast.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-pfifo_fast.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,59 @@
-+.TH PFIFO_FAST 8 "10 January 2002" "iproute2" "Linux"
-+.SH NAME
-+pfifo_fast \- three-band first in, first out queue
-+
-+.SH DESCRIPTION
-+pfifo_fast is the default qdisc of each interface.
-+
-+Whenever an interface is created, the pfifo_fast qdisc is automatically used
-+as a queue. If another qdisc is attached, it preempts the default
-+pfifo_fast, which automatically returns to function when an existing qdisc
-+is detached.
-+
-+In this sense this qdisc is magic, and unlike other qdiscs.
-+
-+.SH ALGORITHM
-+The algorithm is very similar to that of the classful
-+.BR tc-prio (8)
-+qdisc.
-+.B pfifo_fast
-+is like three
-+.BR tc-pfifo (8)
-+queues side by side, where packets can be enqueued in any of the three bands
-+based on their Type of Service bits or assigned priority.
-+
-+Not all three bands are dequeued simultaneously - as long as lower bands
-+have traffic, higher bands are never dequeued. This can be used to
-+prioritize interactive traffic or penalize 'lowest cost' traffic.
-+
-+Each band can be txqueuelen packets long, as configured with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+Additional packets coming in are not enqueued but are instead dropped.
-+
-+See
-+.BR tc-prio (8)
-+for complete details on how TOS bits are translated into bands.
-+.SH PARAMETERS
-+.TP
-+txqueuelen
-+The length of the three bands depends on the interface txqueuelen, as
-+specified with
-+.BR ifconfig (8)
-+or
-+.BR ip (8).
-+
-+.SH BUGS
-+Does not maintain statistics and does not show up in tc qdisc ls. This is because
-+it is the automatic default in the absence of a configured qdisc.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-prio.8 iproute2/debian/tc-prio.8
---- iproute2-orig/debian/tc-prio.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-prio.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,187 @@
-+.TH PRIO 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+PRIO \- Priority qdisc
-+.SH SYNOPSIS
-+.B tc qdisc ... dev
-+dev
-+.B ( parent
-+classid
-+.B | root) [ handle
-+major:
-+.B ] prio [ bands
-+bands
-+.B ] [ priomap
-+band,band,band...
-+.B ] [ estimator
-+interval timeconstant
-+.B ]
-+
-+.SH DESCRIPTION
-+The PRIO qdisc is a simple classful queueing discipline that contains
-+an arbitrary number of classes of differing priority. The classes are
-+dequeued in numerical descending order of priority. PRIO is a scheduler
-+and never delays packets - it is a work-conserving qdisc, though the qdiscs
-+contained in the classes may not be.
-+
-+Very useful for lowering latency when there is no need for slowing down
-+traffic.
-+
-+.SH ALGORITHM
-+On creation with 'tc qdisc add', a fixed number of bands is created. Each
-+band is a class, although is not possible to add classes with 'tc qdisc
-+add', the number of bands to be created must instead be specified on the
-+commandline attaching PRIO to its root.
-+
-+When dequeueing, band 0 is tried first and only if it did not deliver a
-+packet does PRIO try band 1, and so onwards. Maximum reliability packets
-+should therefore go to band 0, minimum delay to band 1 and the rest to band
-+2.
-+
-+As the PRIO qdisc itself will have minor number 0, band 0 is actually
-+major:1, band 1 is major:2, etc. For major, substitute the major number
-+assigned to the qdisc on 'tc qdisc add' with the
-+.B handle
-+parameter.
-+
-+.SH CLASSIFICATION
-+Three methods are available to PRIO to determine in which band a packet will
-+be enqueued.
-+.TP
-+From userspace
-+A process with sufficient privileges can encode the destination class
-+directly with SO_PRIORITY, see
-+.BR tc(7).
-+.TP
-+with a tc filter
-+A tc filter attached to the root qdisc can point traffic directly to a class
-+.TP
-+with the priomap
-+Based on the packet priority, which in turn is derived from the Type of
-+Service assigned to the packet.
-+.P
-+Only the priomap is specific to this qdisc.
-+.SH QDISC PARAMETERS
-+.TP
-+bands
-+Number of bands. If changed from the default of 3,
-+.B priomap
-+must be updated as well.
-+.TP
-+priomap
-+The priomap maps the priority of
-+a packet to a class. The priority can either be set directly from userspace,
-+or be derived from the Type of Service of the packet.
-+
-+Determines how packet priorities, as assigned by the kernel, map to
-+bands. Mapping occurs based on the TOS octet of the packet, which looks like
-+this:
-+
-+.nf
-+0 1 2 3 4 5 6 7
-++---+---+---+---+---+---+---+---+
-+| | | |
-+|PRECEDENCE | TOS |MBZ|
-+| | | |
-++---+---+---+---+---+---+---+---+
-+.fi
-+
-+The four TOS bits (the 'TOS field') are defined as:
-+
-+.nf
-+Binary Decimcal Meaning
-+-----------------------------------------
-+1000 8 Minimize delay (md)
-+0100 4 Maximize throughput (mt)
-+0010 2 Maximize reliability (mr)
-+0001 1 Minimize monetary cost (mmc)
-+0000 0 Normal Service
-+.fi
-+
-+As there is 1 bit to the right of these four bits, the actual value of the
-+TOS field is double the value of the TOS bits. Tcpdump -v -v shows you the
-+value of the entire TOS field, not just the four bits. It is the value you
-+see in the first column of this table:
-+
-+.nf
-+TOS Bits Means Linux Priority Band
-+------------------------------------------------------------
-+0x0 0 Normal Service 0 Best Effort 1
-+0x2 1 Minimize Monetary Cost 1 Filler 2
-+0x4 2 Maximize Reliability 0 Best Effort 1
-+0x6 3 mmc+mr 0 Best Effort 1
-+0x8 4 Maximize Throughput 2 Bulk 2
-+0xa 5 mmc+mt 2 Bulk 2
-+0xc 6 mr+mt 2 Bulk 2
-+0xe 7 mmc+mr+mt 2 Bulk 2
-+0x10 8 Minimize Delay 6 Interactive 0
-+0x12 9 mmc+md 6 Interactive 0
-+0x14 10 mr+md 6 Interactive 0
-+0x16 11 mmc+mr+md 6 Interactive 0
-+0x18 12 mt+md 4 Int. Bulk 1
-+0x1a 13 mmc+mt+md 4 Int. Bulk 1
-+0x1c 14 mr+mt+md 4 Int. Bulk 1
-+0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1
-+.fi
-+
-+The second column contains the value of the relevant
-+four TOS bits, followed by their translated meaning. For example, 15 stands
-+for a packet wanting Minimal Montetary Cost, Maximum Reliability, Maximum
-+Throughput AND Minimum Delay.
-+
-+The fourth column lists the way the Linux kernel interprets the TOS bits, by
-+showing to which Priority they are mapped.
-+
-+The last column shows the result of the default priomap. On the commandline,
-+the default priomap looks like this:
-+
-+ 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
-+
-+This means that priority 4, for example, gets mapped to band number 1.
-+The priomap also allows you to list higher priorities (> 7) which do not
-+correspond to TOS mappings, but which are set by other means.
-+
-+This table from RFC 1349 (read it for more details) explains how
-+applications might very well set their TOS bits:
-+
-+.nf
-+TELNET 1000 (minimize delay)
-+FTP
-+ Control 1000 (minimize delay)
-+ Data 0100 (maximize throughput)
-+
-+TFTP 1000 (minimize delay)
-+
-+SMTP
-+ Command phase 1000 (minimize delay)
-+ DATA phase 0100 (maximize throughput)
-+
-+Domain Name Service
-+ UDP Query 1000 (minimize delay)
-+ TCP Query 0000
-+ Zone Transfer 0100 (maximize throughput)
-+
-+NNTP 0001 (minimize monetary cost)
-+
-+ICMP
-+ Errors 0000
-+ Requests 0000 (mostly)
-+ Responses <same as request> (mostly)
-+.fi
-+
-+
-+.SH CLASSES
-+PRIO classes cannot be configured further - they are automatically created
-+when the PRIO qdisc is attached. Each class however can contain yet a
-+further qdisc.
-+
-+.SH BUGS
-+Large amounts of traffic in the lower bands can cause starvation of higher
-+bands. Can be prevented by attaching a shaper (for example,
-+.BR tc-tbf(8)
-+to these bands to make sure they cannot dominate the link.
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, J Hadi Salim
-+<hadi@cyberus.ca>. This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-red.8 iproute2/debian/tc-red.8
---- iproute2-orig/debian/tc-red.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-red.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,131 @@
-+.TH RED 8 "13 December 2001" "iproute2" "Linux"
-+.SH NAME
-+red \- Random Early Detection
-+.SH SYNOPSIS
-+.B tc qdisc ... red
-+.B limit
-+bytes
-+.B min
-+bytes
-+.B max
-+bytes
-+.B avpkt
-+bytes
-+.B burst
-+packets
-+.B [ ecn ] [ bandwidth
-+rate
-+.B ] probability
-+chance
-+
-+.SH DESCRIPTION
-+Random Early Detection is a classless qdisc which manages its queue size
-+smartly. Regular queues simply drop packets from the tail when they are
-+full, which may not be the optimal behaviour. RED also performs tail drop,
-+but does so in a more gradual way.
-+
-+Once the queue hits a certain average length, packets enqueued have a
-+configurable chance of being marked (which may mean dropped). This chance
-+increases linearly up to a point called the
-+.B max
-+average queue length, although the queue might get bigger.
-+
-+This has a host of benefits over simple taildrop, while not being processor
-+intensive. It prevents synchronous retransmits after a burst in traffic,
-+which cause further retransmits, etc.
-+
-+The goal is the have a small queue size, which is good for interactivity
-+while not disturbing TCP/IP traffic with too many sudden drops after a burst
-+of traffic.
-+
-+Depending on 08 ECN is configured, marking either means dropping or
-+purely marking a packet as overlimit.
-+.SH ALGORITHM
-+The average queue size is used for determining the marking
-+probability. This is calculated using an Exponential Weighted Moving
-+Average, which can be more or less sensitive to bursts.
-+
-+When the average queue size is below
-+.B min
-+bytes, no packet will ever be marked. When it exceeds
-+.B min,
-+the probability of doing so climbs linearly up
-+to
-+.B probability,
-+until the average queue size hits
-+.B max
-+bytes. Because
-+.B probability
-+is normally not set to 100%, the queue size might
-+conceivably rise above
-+.B max
-+bytes, so the
-+.B limit
-+parameter is provided to set a hard maximum for the size of the queue.
-+
-+.SH PARAMETERS
-+.TP
-+min
-+Average queue size at which marking becomes a possibility.
-+.TP
-+max
-+At this average queue size, the marking probability is maximal. Should be at
-+least twice
-+.B min
-+to prevent synchronous retransmits, higher for low
-+.B min.
-+.TP
-+probability
-+Maximum probability for marking, specified as a floating point
-+number from 0.0 to 1.0. Suggested values are 0.01 or 0.02 (1 or 2%,
-+respectively).
-+.TP
-+limit
-+Hard limit on the real (not average) queue size in bytes. Further packets
-+are dropped. Should be set higher than max+burst. It is advised to set this
-+a few times higher than
-+.B max.
-+.TP
-+burst
-+Used for determining how fast the average queue size is influenced by the
-+real queue size. Larger values make the calculation more sluggish, allowing
-+longer bursts of traffic before marking starts. Real life experiments
-+support the following guideline: (min+min+max)/(3*avpkt).
-+.TP
-+avpkt
-+Specified in bytes. Used with burst to determine the time constant for
-+average queue size calculations. 1000 is a good value.
-+.TP
-+bandwidth
-+This rate is used for calculating the average queue size after some
-+idle time. Should be set to the bandwidth of your interface. Does not mean
-+that RED will shape for you! Optional.
-+.TP
-+ecn
-+As mentioned before, RED can either 'mark' or 'drop'. Explicit Congestion
-+Notification allows RED to notify remote hosts that their rate exceeds the
-+amount of bandwidth available. Non-ECN capable hosts can only be notified by
-+dropping a packet. If this parameter is specified, packets which indicate
-+that their hosts honor ECN will only be marked and not dropped, unless the
-+queue size hits
-+.B limit
-+bytes. Needs a tc binary with RED support compiled in. Recommended.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH SOURCES
-+.TP
-+o
-+Floyd, S., and Jacobson, V., Random Early Detection gateways for
-+Congestion Avoidance. http://www.aciri.org/floyd/papers/red/red.html
-+.TP
-+o
-+Some changes to the algorithm by Alexey N. Kuznetsov.
-+
-+.SH AUTHORS
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, Alexey Makarenko
-+<makar@phoenix.kharkov.ua>, J Hadi Salim <hadi@nortelnetworks.com>.
-+This manpage maintained by bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-sfq.8 iproute2/debian/tc-sfq.8
---- iproute2-orig/debian/tc-sfq.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-sfq.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,107 @@
-+.TH TC 8 "8 December 2001" "iproute2" "Linux"
-+.SH NAME
-+sfq \- Stochastic Fairness Queueing
-+.SH SYNOPSIS
-+.B tc qdisc ... perturb
-+seconds
-+.B quantum
-+bytes
-+
-+.SH DESCRIPTION
-+
-+Stochastic Fairness Queueing is a classless queueing discipline available for
-+traffic control with the
-+.BR tc (8)
-+command.
-+
-+SFQ does not shape traffic but only schedules the transmission of packets, based on 'flows'.
-+The goal is to ensure fairness so that each flow is able to send data in turn, thus preventing
-+any single flow from drowning out the rest.
-+
-+This may in fact have some effect in mitigating a Denial of Service attempt.
-+
-+SFQ is work-conserving and therefore always delivers a packet if it has one available.
-+.SH ALGORITHM
-+On enqueueing, each packet is assigned to a hash bucket, based on
-+.TP
-+(i)
-+Source address
-+.TP
-+(ii)
-+Destination address
-+.TP
-+(iii)
-+Source port
-+.P
-+If these are available. SFQ knows about ipv4 and ipv6 and also UDP, TCP and ESP.
-+Packets with other protocols are hashed based on the 32bits representation of their
-+destination and the socket they belong to. A flow corresponds mostly to a TCP/IP
-+connection.
-+
-+Each of these buckets should represent a unique flow. Because multiple flows may
-+get hashed to the same bucket, the hashing algorithm is perturbed at configurable
-+intervals so that the unfairness lasts only for a short while. Perturbation may
-+however cause some inadvertent packet reordering to occur.
-+
-+When dequeuing, each hashbucket with data is queried in a round robin fashion.
-+
-+The compile time maximum length of the SFQ is 128 packets, which can be spread over
-+at most 128 buckets of 1024 available. In case of overflow, tail-drop is performed
-+on the fullest bucket, thus maintaining fairness.
-+
-+.SH PARAMETERS
-+.TP
-+perturb
-+Interval in seconds for queue algorithm perturbation. Defaults to 0, which means that
-+no perturbation occurs. Do not set too low for each perturbation may cause some packet
-+reordering. Advised value: 10
-+.TP
-+quantum
-+Amount of bytes a flow is allowed to dequeue during a round of the round robin process.
-+Defaults to the MTU of the interface which is also the advised value and the minimum value.
-+
-+.SH EXAMPLE & USAGE
-+
-+To attach to device ppp0:
-+.P
-+# tc qdisc add dev ppp0 root sfq perturb 10
-+.P
-+Please note that SFQ, like all non-shaping (work-conserving) qdiscs, is only useful
-+if it owns the queue.
-+This is the case when the link speed equals the actually available bandwidth. This holds
-+for regular phone modems, ISDN connections and direct non-switched ethernet links.
-+.P
-+Most often, cable modems and DSL devices do not fall into this category. The same holds
-+for when connected to a switch and trying to send data to a congested segment also
-+connected to the switch.
-+.P
-+In this case, the effective queue does not reside within Linux and is therefore not
-+available for scheduling.
-+.P
-+Embed SFQ in a classful qdisc to make sure it owns the queue.
-+
-+.SH SOURCE
-+.TP
-+o
-+Paul E. McKenney "Stochastic Fairness Queuing",
-+IEEE INFOCOMM'90 Proceedings, San Francisco, 1990.
-+
-+.TP
-+o
-+Paul E. McKenney "Stochastic Fairness Queuing",
-+"Interworking: Research and Experience", v.2, 1991, p.113-131.
-+
-+.TP
-+o
-+See also:
-+M. Shreedhar and George Varghese "Efficient Fair
-+Queuing using Deficit Round Robin", Proc. SIGCOMM 95.
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc-tbf.8 iproute2/debian/tc-tbf.8
---- iproute2-orig/debian/tc-tbf.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc-tbf.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,138 @@
-+.TH TC 8 "13 December 2001" "iproute2" "Linux"
-+.SH NAME
-+tbf \- Token Bucket Filter
-+.SH SYNOPSIS
-+.B tc qdisc ... tbf rate
-+rate
-+.B burst
-+bytes/cell
-+.B ( latency
-+ms
-+.B | limit
-+bytes
-+.B ) [ mpu
-+bytes
-+.B [ peakrate
-+rate
-+.B mtu
-+bytes/cell
-+.B ] ]
-+.P
-+burst is also known as buffer and maxburst. mtu is also known as minburst.
-+.SH DESCRIPTION
-+
-+The Token Bucket Filter is a classless queueing discipline available for
-+traffic control with the
-+.BR tc (8)
-+command.
-+
-+TBF is a pure shaper and never schedules traffic. It is non-work-conserving and may throttle
-+itself, although packets are available, to ensure that the configured rate is not exceeded.
-+On all platforms except for Alpha,
-+it is able to shape up to 1mbit/s of normal traffic with ideal minimal burstiness,
-+sending out data exactly at the configured rates.
-+
-+Much higher rates are possible but at the cost of losing the minimal burstiness. In that
-+case, data is on average dequeued at the configured rate but may be sent much faster at millisecond
-+timescales. Because of further queues living in network adaptors, this is often not a problem.
-+
-+Kernels with a higher 'HZ' can achieve higher rates with perfect burstiness. On Alpha, HZ is ten
-+times higher, leading to a 10mbit/s limit to perfection. These calculations hold for packets of on
-+average 1000 bytes.
-+
-+.SH ALGORITHM
-+As the name implies, traffic is filtered based on the expenditure of
-+.B tokens.
-+Tokens roughly correspond to bytes, with the additional constraint that each packet consumes
-+some tokens, no matter how small it is. This reflects the fact that even a zero-sized packet occupies
-+the link for some time.
-+
-+On creation, the TBF is stocked with tokens which correspond to the amount of traffic that can be burst
-+in one go. Tokens arrive at a steady rate, until the bucket is full.
-+
-+If no tokens are available, packets are queued, up to a configured limit. The TBF now
-+calculates the token deficit, and throttles until the first packet in the queue can be sent.
-+
-+If it is not acceptable to burst out packets at maximum speed, a peakrate can be configured
-+to limit the speed at which the bucket empties. This peakrate is implemented as a second TBF
-+with a very small bucket, so that it doesn't burst.
-+
-+To achieve perfection, the second bucket may contain only a single packet, which leads to
-+the earlier mentioned 1mbit/s limit.
-+
-+This limit is caused by the fact that the kernel can only throttle for at minimum 1 'jiffy', which depends
-+on HZ as 1/HZ. For perfect shaping, only a single packet can get sent per jiffy - for HZ=100, this means 100
-+packets of on average 1000 bytes each, which roughly corresponds to 1mbit/s.
-+
-+.SH PARAMETERS
-+See
-+.BR tc (8)
-+for how to specify the units of these values.
-+.TP
-+limit or latency
-+Limit is the number of bytes that can be queued waiting for tokens to become
-+available. You can also specify this the other way around by setting the
-+latency parameter, which specifies the maximum amount of time a packet can
-+sit in the TBF. The latter calculation takes into account the size of the
-+bucket, the rate and possibly the peakrate (if set). These two parameters
-+are mutually exclusive.
-+.TP
-+burst
-+Also known as buffer or maxburst.
-+Size of the bucket, in bytes. This is the maximum amount of bytes that tokens can be available for instantaneously.
-+In general, larger shaping rates require a larger buffer. For 10mbit/s on Intel, you need at least 10kbyte buffer
-+if you want to reach your configured rate!
-+
-+If your buffer is too small, packets may be dropped because more tokens arrive per timer tick than fit in your bucket.
-+The minimum buffer size can be calculated by dividing the rate by HZ.
-+
-+Token usage calculations are performed using a table which by default has a resolution of 8 packets.
-+This resolution can be changed by specifying the
-+.B cell
-+size with the burst. For example, to specify a 6000 byte buffer with a 16
-+byte cell size, set a burst of 6000/16. You will probably never have to set
-+this. Must be an integral power of 2.
-+.TP
-+mpu
-+A zero-sized packet does not use zero bandwidth. For ethernet, no packet uses less than 64 bytes. The Minimum Packet Unit
-+determines the minimal token usage (specified in bytes) for a packet. Defaults to zero.
-+.TP
-+rate
-+The speed knob. See remarks above about limits! See
-+.BR tc (8)
-+for units.
-+.PP
-+Furthermore, if a peakrate is desired, the following parameters are available:
-+
-+.TP
-+peakrate
-+Maximum depletion rate of the bucket. Limited to 1mbit/s on Intel, 10mbit/s on Alpha. The peakrate does
-+not need to be set, it is only necessary if perfect millisecond timescale shaping is required.
-+
-+.TP
-+mtu/minburst
-+Specifies the size of the peakrate bucket. For perfect accuracy, should be set to the MTU of the interface.
-+If a peakrate is needed, but some burstiness is acceptable, this size can be raised. A 3000 byte minburst
-+allows around 3mbit/s of peakrate, given 1000 byte packets.
-+
-+Like the regular burstsize you can also specify a
-+.B cell
-+size.
-+.SH EXAMPLE & USAGE
-+
-+To attach a TBF with a sustained maximum rate of 0.5mbit/s, a peakrate of 1.0mbit/s,
-+a 5kilobyte buffer, with a pre-bucket queue size limit calculated so the TBF causes
-+at most 70ms of latency, with perfect peakrate behaviour, issue:
-+.P
-+# tc qdisc add dev eth0 root tbf rate 0.5mbit \\
-+ burst 5kb latency 70ms peakrate 1mbit \\
-+ minburst 1540
-+
-+.SH SEE ALSO
-+.BR tc (8)
-+
-+.SH AUTHOR
-+Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
-+bert hubert <ahu@ds9a.nl>
-+
-+
-diff -Naur iproute2-orig/debian/tc.8 iproute2/debian/tc.8
---- iproute2-orig/debian/tc.8 1969-12-31 16:00:00.000000000 -0800
-+++ iproute2/debian/tc.8 2004-05-21 00:09:38.000000000 -0700
-@@ -0,0 +1,348 @@
-+.TH TC 8 "16 December 2001" "iproute2" "Linux"
-+.SH NAME
-+tc \- show / manipulate traffic control settings
-+.SH SYNOPSIS
-+.B tc qdisc [ add | change | replace | link ] dev
-+DEV
-+.B
-+[ parent
-+qdisc-id
-+.B | root ]
-+.B [ handle
-+qdisc-id ] qdisc
-+[ qdisc specific parameters ]
-+.P
-+
-+.B tc class [ add | change | replace ] dev
-+DEV
-+.B parent
-+qdisc-id
-+.B [ classid
-+class-id ] qdisc
-+[ qdisc specific parameters ]
-+.P
-+
-+.B tc filter [ add | change | replace ] dev
-+DEV
-+.B [ parent
-+qdisc-id
-+.B | root ] protocol
-+protocol
-+.B prio
-+priority filtertype
-+[ filtertype specific parameters ]
-+.B flowid
-+flow-id
-+
-+.B tc [-s | -d ] qdisc show [ dev
-+DEV
-+.B ]
-+.P
-+.B tc [-s | -d ] class show dev
-+DEV
-+.P
-+.B tc filter show dev
-+DEV
-+
-+.SH DESCRIPTION
-+.B Tc
-+is used to configure Traffic Control in the Linux kernel. Traffic Control consists
-+of the following:
-+
-+.TP
-+SHAPING
-+When traffic is shaped, its rate of transmission is under control. Shaping may
-+be more than lowering the available bandwidth - it is also used to smooth out
-+bursts in traffic for better network behaviour. Shaping occurs on egress.
-+
-+.TP
-+SCHEDULING
-+By scheduling the transmission of packets it is possible to improve interactivity
-+for traffic that needs it while still guaranteeing bandwidth to bulk transfers. Reordering
-+is also called prioritizing, and happens only on egress.
-+
-+.TP
-+POLICING
-+Where shaping deals with transmission of traffic, policing pertains to traffic
-+arriving. Policing thus occurs on ingress.
-+
-+.TP
-+DROPPING
-+Traffic exceeding a set bandwidth may also be dropped forthwith, both on
-+ingress and on egress.
-+
-+.P
-+Processing of traffic is controlled by three kinds of objects: qdiscs,
-+classes and filters.
-+
-+.SH QDISCS
-+.B qdisc
-+is short for 'queueing discipline' and it is elementary to
-+understanding traffic control. Whenever the kernel needs to send a
-+packet to an interface, it is
-+.B enqueued
-+to the qdisc configured for that interface. Immediately afterwards, the kernel
-+tries to get as many packets as possible from the qdisc, for giving them
-+to the network adaptor driver.
-+
-+A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure
-+First In, First Out queue. It does however store traffic when the network interface
-+can't handle it momentarily.
-+
-+.SH CLASSES
-+Some qdiscs can contain classes, which contain further qdiscs - traffic may
-+then be enqueued in any of the inner qdiscs, which are within the
-+.B classes.
-+When the kernel tries to dequeue a packet from such a
-+.B classful qdisc
-+it can come from any of the classes. A qdisc may for example prioritize
-+certain kinds of traffic by trying to dequeue from certain classes
-+before others.
-+
-+.SH FILTERS
-+A
-+.B filter
-+is used by a classful qdisc to determine in which class a packet will
-+be enqueued. Whenever traffic arrives at a class with subclasses, it needs
-+to be classified. Various methods may be employed to do so, one of these
-+are the filters. All filters attached to the class are called, until one of
-+them returns with a verdict. If no verdict was made, other criteria may be
-+available. This differs per qdisc.
-+
-+It is important to notice that filters reside
-+.B within
-+qdiscs - they are not masters of what happens.
-+
-+.SH CLASSLESS QDISCS
-+The classless qdiscs are:
-+.TP
-+[p|b]fifo
-+Simplest usable qdisc, pure First In, First Out behaviour. Limited in
-+packets or in bytes.
-+.TP
-+pfifo_fast
-+Standard qdisc for 'Advanced Router' enabled kernels. Consists of a three-band
-+queue which honors Type of Service flags, as well as the priority that may be
-+assigned to a packet.
-+.TP
-+red
-+Random Early Detection simulates physical congestion by randomly dropping
-+packets when nearing configured bandwidth allocation. Well suited to very
-+large bandwidth applications.
-+.TP
-+sfq
-+Stochastic Fairness Queueing reorders queued traffic so each 'session'
-+gets to send a packet in turn.
-+.TP
-+tbf
-+The Token Bucket Filter is suited for slowing traffic down to a precisely
-+configured rate. Scales well to large bandwidths.
-+.SH CONFIGURING CLASSLESS QDISCS
-+In the absence of classful qdiscs, classless qdiscs can only be attached at
-+the root of a device. Full syntax:
-+.P
-+.B tc qdisc add dev
-+DEV
-+.B root
-+QDISC QDISC-PARAMETERS
-+
-+To remove, issue
-+.P
-+.B tc qdisc del dev
-+DEV
-+.B root
-+
-+The
-+.B pfifo_fast
-+qdisc is the automatic default in the absence of a configured qdisc.
-+
-+.SH CLASSFUL QDISCS
-+The classful qdiscs are:
-+.TP
-+CBQ
-+Class Based Queueing implements a rich linksharing hierarchy of classes.
-+It contains shaping elements as well as prioritizing capabilities. Shaping is
-+performed using link idle time calculations based on average packet size and
-+underlying link bandwidth. The latter may be ill-defined for some interfaces.
-+.TP
-+HTB
-+The Hierarchy Token Bucket implements a rich linksharing hierarchy of
-+classes with an emphasis on conforming to existing practices. HTB facilitates
-+guaranteeing bandwidth to classes, while also allowing specification of upper
-+limits to inter-class sharing. It contains shaping elements, based on TBF and
-+can prioritize classes.
-+.TP
-+PRIO
-+The PRIO qdisc is a non-shaping container for a configurable number of
-+classes which are dequeued in order. This allows for easy prioritization
-+of traffic, where lower classes are only able to send if higher ones have
-+no packets available. To facilitate configuration, Type Of Service bits are
-+honored by default.
-+.SH THEORY OF OPERATION
-+Classes form a tree, where each class has a single parent.
-+A class may have multiple children. Some qdiscs allow for runtime addition
-+of classes (CBQ, HTB) while others (PRIO) are created with a static number of
-+children.
-+
-+Qdiscs which allow dynamic addition of classes can have zero or more
-+subclasses to which traffic may be enqueued.
-+
-+Furthermore, each class contains a
-+.B leaf qdisc
-+which by default has
-+.B pfifo
-+behaviour though another qdisc can be attached in place. This qdisc may again
-+contain classes, but each class can have only one leaf qdisc.
-+
-+When a packet enters a classful qdisc it can be
-+.B classified
-+to one of the classes within. Three criteria are available, although not all
-+qdiscs will use all three:
-+.TP
-+tc filters
-+If tc filters are attached to a class, they are consulted first
-+for relevant instructions. Filters can match on all fields of a packet header,
-+as well as on the firewall mark applied by ipchains or iptables. See
-+.BR tc-filters (8).
-+.TP
-+Type of Service
-+Some qdiscs have built in rules for classifying packets based on the TOS field.
-+.TP
-+skb->priority
-+Userspace programs can encode a class-id in the 'skb->priority' field using
-+the SO_PRIORITY option.
-+.P
-+Each node within the tree can have its own filters but higher level filters
-+may also point directly to lower classes.
-+
-+If classification did not succeed, packets are enqueued to the leaf qdisc
-+attached to that class. Check qdisc specific manpages for details, however.
-+
-+.SH NAMING
-+All qdiscs, classes and filters have IDs, which can either be specified
-+or be automatically assigned.
-+
-+IDs consist of a major number and a minor number, separated by a colon.
-+
-+.TP
-+QDISCS
-+A qdisc, which potentially can have children,
-+gets assigned a major number, called a 'handle', leaving the minor
-+number namespace available for classes. The handle is expressed as '10:'.
-+It is customary to explicitly assign a handle to qdiscs expected to have
-+children.
-+
-+.TP
-+CLASSES
-+Classes residing under a qdisc share their qdisc major number, but each have
-+a separate minor number called a 'classid' that has no relation to their
-+parent classes, only to their parent qdisc. The same naming custom as for
-+qdiscs applies.
-+
-+.TP
-+FILTERS
-+Filters have a three part ID, which is only needed when using a hashed
-+filter hierarchy, for which see
-+.BR tc-filters (8).
-+.SH UNITS
-+All parameters accept a floating point number, possibly followed by a unit.
-+.P
-+Bandwidths or rates can be specified in:
-+.TP
-+kbps
-+Kilobytes per second
-+.TP
-+mbps
-+Megabytes per second
-+.TP
-+kbit
-+Kilobits per second
-+.TP
-+mbit
-+Megabits per second
-+.TP
-+bps or a bare number
-+Bits per second
-+.P
-+Amounts of data can be specified in:
-+.TP
-+kb or k
-+Kilobytes
-+.TP
-+mb or m
-+Megabytes
-+.TP
-+mbit
-+Megabits
-+.TP
-+kbit
-+Kilobits
-+.TP
-+b or a bare number
-+Bytes.
-+.P
-+Lengths of time can be specified in:
-+.TP
-+s, sec or secs
-+Whole seconds
-+.TP
-+ms, msec or msecs
-+Milliseconds
-+.TP
-+us, usec, usecs or a bare number
-+Microseconds.
-+
-+.SH TC COMMANDS
-+The following commands are available for qdiscs, classes and filter:
-+.TP
-+add
-+Add a qdisc, class or filter to a node. For all entities, a
-+.B parent
-+must be passed, either by passing its ID or by attaching directly to the root of a device.
-+When creating a qdisc or a filter, it can be named with the
-+.B handle
-+parameter. A class is named with the
-+.B classid
-+parameter.
-+
-+.TP
-+remove
-+A qdisc can be removed by specifying its handle, which may also be 'root'. All subclasses and their leaf qdiscs
-+are automatically deleted, as well as any filters attached to them.
-+
-+.TP
-+change
-+Some entities can be modified 'in place'. Shares the syntax of 'add', with the exception
-+that the handle cannot be changed and neither can the parent. In other words,
-+.B
-+change
-+cannot move a node.
-+
-+.TP
-+replace
-+Performs a nearly atomic remove/add on an existing node id. If the node does not exist yet
-+it is created.
-+
-+.TP
-+link
-+Only available for qdiscs and performs a replace where the node
-+must exist already.
-+
-+
-+.SH HISTORY
-+.B tc
-+was written by Alexey N. Kuznetsov and added in Linux 2.2.
-+.SH SEE ALSO
-+.BR tc-cbq (8),
-+.BR tc-htb (8),
-+.BR tc-sfq (8),
-+.BR tc-red (8),
-+.BR tc-tbf (8),
-+.BR tc-pfifo (8),
-+.BR tc-bfifo (8),
-+.BR tc-pfifo_fast (8),
-+.BR tc-filters (8)
-+
-+.SH AUTHOR
-+Manpage maintained by bert hubert (ahu@ds9a.nl)
-+
-diff -Naur iproute2-orig/include/rt_names.h iproute2/include/rt_names.h
---- iproute2-orig/include/rt_names.h 2000-04-16 10:42:50.000000000 -0700
-+++ iproute2/include/rt_names.h 2004-05-21 00:16:36.000000000 -0700
-@@ -1,6 +1,8 @@
- #ifndef RT_NAMES_H_
- #define RT_NAMES_H_ 1
-
-+#include <asm/byteorder.h>
-+
- const char* rtnl_rtprot_n2a(int id, char *buf, int len);
- const char* rtnl_rtscope_n2a(int id, char *buf, int len);
- const char* rtnl_rttable_n2a(int id, char *buf, int len);
-diff -Naur iproute2-orig/lib/rt_names.c iproute2/lib/rt_names.c
---- iproute2-orig/lib/rt_names.c 2000-04-16 10:42:52.000000000 -0700
-+++ iproute2/lib/rt_names.c 2004-05-21 00:16:36.000000000 -0700
-@@ -16,6 +16,7 @@
- #include <fcntl.h>
- #include <string.h>
- #include <sys/time.h>
-+#include <asm/byteorder.h>
-
- static void rtnl_tab_initialize(char *file, char **tab, int size)
- {
-diff -Naur iproute2-orig/misc/arpd.c iproute2/misc/arpd.c
---- iproute2-orig/misc/arpd.c 2002-01-09 20:02:26.000000000 -0800
-+++ iproute2/misc/arpd.c 2004-05-21 00:16:36.000000000 -0700
-@@ -16,7 +16,7 @@
- #include <unistd.h>
- #include <stdlib.h>
- #include <netdb.h>
--#include <db.h>
-+#include <db_185.h>
- #include <sys/ioctl.h>
- #include <sys/poll.h>
- #include <errno.h>
-@@ -28,6 +28,7 @@
- #include <signal.h>
- #include <linux/if.h>
- #include <linux/if_arp.h>
-+#include <linux/if_ether.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <linux/if_packet.h>
diff --git a/abs/core/iproute2/libdir.patch b/abs/core/iproute2/libdir.patch
deleted file mode 100644
index 4e5671a..0000000
--- a/abs/core/iproute2/libdir.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-Submitted By: Joe Ciccone <jciccone@gmail.com>
-Date: 2008-09-31
-Upstream Status: Unknown
-Origin: Joe Ciccone
-Description: This patch gives the ability to change the libdir.
-
---- iproute2-2.6.26.orig/Config 1969-12-31 19:00:00.000000000 -0500
-+++ iproute2-2.6.26/Config 2008-09-13 15:07:31.000000000 -0400
-@@ -0,0 +1 @@
-+# Generated config based on /usr/src/clfs-tarballs/conglomeration/iproute2-2.6.26/include
-diff -Naur iproute2-2.6.26.orig/include/iptables.h iproute2-2.6.26/include/iptables.h
---- iproute2-2.6.26.orig/include/iptables.h 2008-07-25 16:46:07.000000000 -0400
-+++ iproute2-2.6.26/include/iptables.h 2008-09-13 15:43:33.000000000 -0400
-@@ -4,8 +4,12 @@
- #include "iptables_common.h"
- #include "libiptc/libiptc.h"
-
-+#ifndef LIBDIR
-+#define LIBDIR "/usr/lib"
-+#endif
-+
- #ifndef IPT_LIB_DIR
--#define IPT_LIB_DIR "/usr/local/lib/iptables"
-+#define IPT_LIB_DIR LIBDIR "/iptables"
- #endif
-
- #ifndef IPPROTO_SCTP
-diff -Naur iproute2-2.6.26.orig/ip/iplink.c iproute2-2.6.26/ip/iplink.c
---- iproute2-2.6.26.orig/ip/iplink.c 2008-07-25 16:46:07.000000000 -0400
-+++ iproute2-2.6.26/ip/iplink.c 2008-09-13 15:14:41.000000000 -0400
-@@ -34,7 +34,11 @@
-
- #define IPLINK_IOCTL_COMPAT 1
- #ifndef DESTDIR
--#define DESTDIR "/usr/"
-+#define DESTDIR "/usr"
-+#endif
-+
-+#ifndef LIBDIR
-+#define LIBDIR "/usr/lib"
- #endif
-
- static void usage(void) __attribute__((noreturn));
-@@ -81,7 +85,7 @@
- if (strcmp(l->id, id) == 0)
- return l;
-
-- snprintf(buf, sizeof(buf), DESTDIR "/lib/ip/link_%s.so", id);
-+ snprintf(buf, sizeof(buf), DESTDIR LIBDIR "/ip/link_%s.so", id);
- dlh = dlopen(buf, RTLD_LAZY);
- if (dlh == NULL) {
- /* look in current binary, only open once */
-diff -Naur iproute2-2.6.26.orig/Makefile iproute2-2.6.26/Makefile
---- iproute2-2.6.26.orig/Makefile 2008-07-25 16:46:07.000000000 -0400
-+++ iproute2-2.6.26/Makefile 2008-09-13 15:15:24.000000000 -0400
-@@ -1,13 +1,15 @@
--DESTDIR=/usr/
-+DESTDIR=/usr
- SBINDIR=/sbin
- CONFDIR=/etc/iproute2
- DOCDIR=/share/doc/iproute2
- MANDIR=/share/man
-
-+LIBDIR=/usr/lib
-+
- # Path to db_185.h include
- DBM_INCLUDE:=/usr/include
-
--DEFINES= -DRESOLVE_HOSTNAMES -DDESTDIR=\"$(DESTDIR)\"
-+DEFINES= -DRESOLVE_HOSTNAMES -DDESTDIR=\"$(DESTDIR)\" -DLIBDIR=\"$(LIBDIR)\"
-
- #options if you have a bind>=4.9.4 libresolv (or, maybe, glibc)
- LDLIBS=-lresolv
-diff -Naur iproute2-2.6.26.orig/netem/Makefile iproute2-2.6.26/netem/Makefile
---- iproute2-2.6.26.orig/netem/Makefile 2008-07-25 16:46:07.000000000 -0400
-+++ iproute2-2.6.26/netem/Makefile 2008-09-13 14:27:07.000000000 -0400
-@@ -20,9 +20,9 @@
- $(HOSTCC) $(CCOPTS) -I../include -o $@ $@.c -lm
-
- install: all
-- mkdir -p $(DESTDIR)/lib/tc
-+ mkdir -p $(DESTDIR)$(LIBDIR)/tc
- for i in $(DISTDATA); \
-- do install -m 755 $$i $(DESTDIR)/lib/tc; \
-+ do install -m 755 $$i $(DESTDIR)$(LIBDIR)/tc; \
- done
-
- clean:
-diff -Naur iproute2-2.6.26.orig/tc/Makefile iproute2-2.6.26/tc/Makefile
---- iproute2-2.6.26.orig/tc/Makefile 2008-07-25 16:46:07.000000000 -0400
-+++ iproute2-2.6.26/tc/Makefile 2008-09-13 14:30:37.000000000 -0400
-@@ -72,10 +72,10 @@
- $(AR) rcs $@ $(TCLIB)
-
- install: all
-- mkdir -p $(DESTDIR)/lib/tc
-+ mkdir -p $(DESTDIR)$(LIBDIR)/tc
- install -m 0755 tc $(DESTDIR)$(SBINDIR)
- for i in $(TCSO); \
-- do install -m 755 $$i $(DESTDIR)/lib/tc; \
-+ do install -m 755 $$i $(DESTDIR)$(LIBDIR)/tc; \
- done
-
- clean:
-diff -Naur iproute2-2.6.26.orig/tc/tc_util.c iproute2-2.6.26/tc/tc_util.c
---- iproute2-2.6.26.orig/tc/tc_util.c 2008-07-25 16:46:07.000000000 -0400
-+++ iproute2-2.6.26/tc/tc_util.c 2008-09-13 15:15:16.000000000 -0400
-@@ -25,7 +25,11 @@
- #include "tc_util.h"
-
- #ifndef DESTDIR
--#define DESTDIR "/usr/"
-+#define DESTDIR "/usr"
-+#endif
-+
-+#ifndef LIBDIR
-+#define LIBDIR "/usr/lib"
- #endif
-
- const char *get_tc_lib(void)
-@@ -34,7 +38,7 @@
-
- lib_dir = getenv("TC_LIB_DIR");
- if (!lib_dir)
-- lib_dir = DESTDIR "/lib/tc";
-+ lib_dir = DESTDIR LIBDIR "/tc";
-
- return lib_dir;
-
diff --git a/abs/core/iproute2/tc.patch b/abs/core/iproute2/tc.patch
deleted file mode 100644
index e6d6276..0000000
--- a/abs/core/iproute2/tc.patch
+++ /dev/null
@@ -1,26 +0,0 @@
---- tc/Makefile.old 2010-06-14 08:29:49.257421437 +0200
-+++ tc/Makefile 2010-06-14 08:30:07.157419977 +0200
-@@ -99,18 +99,11 @@
- $(AR) rcs $@ $(TCLIB)
-
- install: all
-- echo mkdir -p $(MODDESTDIR)
-- echo install -m 0755 tc $(DESTDIR)$(SBINDIR)
-- for i in $(TCSO); \
-- do echo install -m 755 $$i $(MODDESTDIR); \
-- done
-- if [ ! -f $(MODDESTDIR)/m_ipt.so ]; then \
-- if [ -f $(MODDESTDIR)/m_xt.so ]; \
-- then ln -s m_xt.so $(MODDESTDIR)/m_ipt.so ; \
-- elif [ -f $(MODDESTDIR)/m_xt_old.so ]; \
-- then ln -s m_xt_old.so $(MODDESTDIR)/m_ipt.so ; \
-- fi; \
-- fi
-+ mkdir -p $(DESTDIR)$(LIBDIR)/tc
-+ install -m 0755 tc $(DESTDIR)$(SBINDIR)
-+ for i in $(TCSO); \
-+ do install -m 755 $$i $(DESTDIR)$(LIBDIR)/tc; \
-+ done
-
- clean:
- rm -f $(TCOBJ) $(TCLIB) libtc.a tc *.so emp_ematch.yacc.h; \
diff --git a/abs/core/iptables/PKGBUILD.orig b/abs/core/iptables/PKGBUILD.orig
deleted file mode 100644
index b0182d8..0000000
--- a/abs/core/iptables/PKGBUILD.orig
+++ /dev/null
@@ -1,36 +0,0 @@
-# $Id: PKGBUILD 356 2008-04-18 22:56:27Z aaron $
-# Maintainer: Thomas Baechler <thomas@archlinux.org>
-pkgname=iptables
-pkgver=1.4.1
-pkgrel=1
-pkgdesc="A Linux kernel packet control tool"
-arch=('i686' 'x86_64')
-license=('GPL')
-url="http://www.netfilter.org/"
-depends=('glibc')
-source=(http://www.iptables.org/projects/iptables/files/iptables-$pkgver.tar.bz2 \
- iptables ip6tables empty.rules simple_firewall.rules iptables.conf.d)
-md5sums=('e628f033b95741266a315d54fe73db9c'
- '89401d6f0cf1de46a455b7be6720a58b'
- '6e0e88c2ed0c3715d1409ee3258a0046'
- '14186bbafe21bb0638c0cb8e0903c829'
- 'e53a83bb4d8ac8b7eadd7bd58294751d'
- 'c7cf6e4455c228e50d20ce3edd75ee59')
-
-build() {
- cd $startdir/src/$pkgname-$pkgver
- sed -i 's|/usr/local|/usr|' Makefile
- sed -i 's|MANDIR:=$(PREFIX)/man|MANDIR:=$(PREFIX)/share/man|' Makefile
- # this seems to cause more problems than help
- # sed -i "s:/usr/src/linux:/usr/src/linux\*:" Makefile
- make KERNEL_DIR=/usr/src/linux-$(uname -r) || return 1
- make KERNEL_DIR=/usr/src/linux-$(uname -r) experimental || return 1
- make PREFIX=$startdir/pkg/usr KERNEL_DIR=/usr/src/linux-$(uname -r) install || return 1
- make PREFIX=$startdir/pkg/usr KERNEL_DIR=/usr/src/linux-$(uname -r) install-devel || return 1
- make PREFIX=$startdir/pkg/usr KERNEL_DIR=/usr/src/linux-$(uname -r) install-experimental || return 1
- install -D -m755 ../iptables $startdir/pkg/etc/rc.d/iptables
- install -D -m755 ../ip6tables $startdir/pkg/etc/rc.d/ip6tables
- install -D -m644 ../empty.rules $startdir/pkg/etc/iptables/empty.rules
- install -D -m644 ../simple_firewall.rules $startdir/pkg/etc/iptables/simple_firewall.rules
- install -D -m644 ../iptables.conf.d $startdir/pkg/etc/conf.d/iptables
-}
diff --git a/abs/core/libcap/libcap-1.10-debian.patch b/abs/core/libcap/libcap-1.10-debian.patch
deleted file mode 100644
index 26d57ec..0000000
--- a/abs/core/libcap/libcap-1.10-debian.patch
+++ /dev/null
@@ -1,766 +0,0 @@
---- libcap-1.10.orig/doc/old/cap_set_fd.3
-+++ libcap-1.10/doc/old/cap_set_fd.3
-@@ -0,0 +1 @@
-+.so man3/cap_get_file.3
---- libcap-1.10.orig/doc/old/cap_set_file.3
-+++ libcap-1.10/doc/old/cap_set_file.3
-@@ -0,0 +1 @@
-+.so man3/cap_get_file.3
---- libcap-1.10.orig/doc/capset.2
-+++ libcap-1.10/doc/capset.2
-@@ -1 +1 @@
--.so man2/capget.2
-+#.so man2/capget.2
---- libcap-1.10.orig/doc/Makefile
-+++ libcap-1.10/doc/Makefile
-@@ -7,7 +7,7 @@
- topdir=$(shell pwd)/..
- include $(topdir)/Make.Rules
-
--MAN2S = capget.2 capset.2
-+#MAN2S = capget.2
- MAN3S = cap_init.3 cap_free.3 cap_dup.3 \
- cap_clear.3 cap_get_flag.3 cap_set_flag.3 \
- cap_get_proc.3 cap_set_proc.3 \
---- libcap-1.10.orig/Make.Rules
-+++ libcap-1.10/Make.Rules
-@@ -8,7 +8,7 @@
-
- # common 'packaging' directoty
-
--FAKEROOT=
-+FAKEROOT=$(DESTDIR)
-
- # Autoconf-style prefixes are activated when $(prefix) is defined.
- # Otherwise binaries and libraraies are installed in /{lib,sbin}/,
-@@ -18,13 +18,13 @@
- exec_prefix=$(prefix)
- lib_prefix=$(exec_prefix)
- inc_prefix=$(lib_prefix)
--man_prefix=$(prefix)
-+man_prefix=$(prefix)/share
- else
- prefix=/usr
- exec_prefix=
- lib_prefix=$(exec_prefix)
- inc_prefix=$(prefix)
--man_prefix=$(prefix)
-+man_prefix=$(prefix)/share
- endif
-
- # Target directories
-@@ -42,7 +42,7 @@
- # Compilation specifics
-
- CC=gcc
--COPTFLAGS=-O2
-+COPTFLAGS=-O2
- DEBUG=-g #-DDEBUG
- WARNINGS=-ansi -D_POSIX_SOURCE -Wall -Wwrite-strings \
- -Wpointer-arith -Wcast-qual -Wcast-align \
---- libcap-1.10.orig/Makefile
-+++ libcap-1.10/Makefile
-@@ -3,17 +3,20 @@
- #
- # Makefile for libcap
-
-+ifndef topdir
- topdir=$(shell pwd)
--include Make.Rules
-+endif
-+include $(topdir)/Make.Rules
-+DESTDIR=
-
- #
- # flags
- #
-
- all install clean: %: %-here
-- make -C libcap $(MAKE_DEFS) $@
-- make -C progs $(MAKE_DEFS) $@
-- make -C doc $(MAKE_DEFS) $@
-+ make -C $(topdir)/libcap $(MAKE_DEFS) $@
-+ make -C $(topdir)/progs $(MAKE_DEFS) $@
-+ make -C $(topdir)/doc $(MAKE_DEFS) $@
-
- all-here:
-
---- libcap-1.10.orig/libcap/include/sys/capability.h
-+++ libcap-1.10/libcap/include/sys/capability.h
-@@ -21,7 +21,288 @@
- */
-
- #include <sys/types.h>
--#include <linux/capability.h>
-+/*
-+ * This is <linux/capability.h>
-+ *
-+ * Andrew G. Morgan <morgan@transmeta.com>
-+ * Alexander Kjeldaas <astor@guardian.no>
-+ * with help from Aleph1, Roland Buresund and Andrew Main.
-+ *
-+ * See here for the libcap library ("POSIX draft" compliance):
-+ *
-+ * ftp://linux.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/
-+ */
-+
-+#ifndef _LINUX_CAPABILITY_H
-+#define _LINUX_CAPABILITY_H
-+
-+#include <linux/types.h>
-+/*#include <linux/fs.h>*/
-+
-+/* User-level do most of the mapping between kernel and user
-+ capabilities based on the version tag given by the kernel. The
-+ kernel might be somewhat backwards compatible, but don't bet on
-+ it. */
-+
-+/* XXX - Note, cap_t, is defined by POSIX to be an "opaque" pointer to
-+ a set of three capability sets. The transposition of 3*the
-+ following structure to such a composite is better handled in a user
-+ library since the draft standard requires the use of malloc/free
-+ etc.. */
-+
-+#define _LINUX_CAPABILITY_VERSION 0x19980330
-+
-+typedef struct __user_cap_header_struct {
-+ __u32 version;
-+ int pid;
-+} *cap_user_header_t;
-+
-+typedef struct __user_cap_data_struct {
-+ __u32 effective;
-+ __u32 permitted;
-+ __u32 inheritable;
-+} *cap_user_data_t;
-+
-+#ifdef __KERNEL__
-+
-+/* #define STRICT_CAP_T_TYPECHECKS */
-+
-+#ifdef STRICT_CAP_T_TYPECHECKS
-+
-+typedef struct kernel_cap_struct {
-+ __u32 cap;
-+} kernel_cap_t;
-+
-+#else
-+
-+typedef __u32 kernel_cap_t;
-+
-+#endif
-+
-+#define _USER_CAP_HEADER_SIZE (2*sizeof(__u32))
-+#define _KERNEL_CAP_T_SIZE (sizeof(kernel_cap_t))
-+
-+#endif
-+
-+
-+/**
-+ ** POSIX-draft defined capabilities.
-+ **/
-+
-+/* In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this
-+ overrides the restriction of changing file ownership and group
-+ ownership. */
-+
-+#define CAP_CHOWN 0
-+
-+/* Override all DAC access, including ACL execute access if
-+ [_POSIX_ACL] is defined. Excluding DAC access covered by
-+ CAP_LINUX_IMMUTABLE. */
-+
-+#define CAP_DAC_OVERRIDE 1
-+
-+/* Overrides all DAC restrictions regarding read and search on files
-+ and directories, including ACL restrictions if [_POSIX_ACL] is
-+ defined. Excluding DAC access covered by CAP_LINUX_IMMUTABLE. */
-+
-+#define CAP_DAC_READ_SEARCH 2
-+
-+/* Overrides all restrictions about allowed operations on files, where
-+ file owner ID must be equal to the user ID, except where CAP_FSETID
-+ is applicable. It doesn't override MAC and DAC restrictions. */
-+
-+#define CAP_FOWNER 3
-+
-+/* Overrides the following restrictions that the effective user ID
-+ shall match the file owner ID when setting the S_ISUID and S_ISGID
-+ bits on that file; that the effective group ID (or one of the
-+ supplementary group IDs) shall match the file owner ID when setting
-+ the S_ISGID bit on that file; that the S_ISUID and S_ISGID bits are
-+ cleared on successful return from chown(2) (not implemented). */
-+
-+#define CAP_FSETID 4
-+
-+/* Used to decide between falling back on the old suser() or fsuser(). */
-+
-+#define CAP_FS_MASK 0x1f
-+
-+/* Overrides the restriction that the real or effective user ID of a
-+ process sending a signal must match the real or effective user ID
-+ of the process receiving the signal. */
-+
-+#define CAP_KILL 5
-+
-+/* Allows setgid(2) manipulation */
-+/* Allows setgroups(2) */
-+/* Allows forged gids on socket credentials passing. */
-+
-+#define CAP_SETGID 6
-+
-+/* Allows set*uid(2) manipulation (including fsuid). */
-+/* Allows forged pids on socket credentials passing. */
-+
-+#define CAP_SETUID 7
-+
-+
-+/**
-+ ** Linux-specific capabilities
-+ **/
-+
-+/* Transfer any capability in your permitted set to any pid,
-+ remove any capability in your permitted set from any pid */
-+
-+#define CAP_SETPCAP 8
-+
-+/* Allow modification of S_IMMUTABLE and S_APPEND file attributes */
-+
-+#define CAP_LINUX_IMMUTABLE 9
-+
-+/* Allows binding to TCP/UDP sockets below 1024 */
-+/* Allows binding to ATM VCIs below 32 */
-+
-+#define CAP_NET_BIND_SERVICE 10
-+
-+/* Allow broadcasting, listen to multicast */
-+
-+#define CAP_NET_BROADCAST 11
-+
-+/* Allow interface configuration */
-+/* Allow administration of IP firewall, masquerading and accounting */
-+/* Allow setting debug option on sockets */
-+/* Allow modification of routing tables */
-+/* Allow setting arbitrary process / process group ownership on
-+ sockets */
-+/* Allow binding to any address for transparent proxying */
-+/* Allow setting TOS (type of service) */
-+/* Allow setting promiscuous mode */
-+/* Allow clearing driver statistics */
-+/* Allow multicasting */
-+/* Allow read/write of device-specific registers */
-+/* Allow activation of ATM control sockets */
-+
-+#define CAP_NET_ADMIN 12
-+
-+/* Allow use of RAW sockets */
-+/* Allow use of PACKET sockets */
-+
-+#define CAP_NET_RAW 13
-+
-+/* Allow locking of shared memory segments */
-+/* Allow mlock and mlockall (which doesn't really have anything to do
-+ with IPC) */
-+
-+#define CAP_IPC_LOCK 14
-+
-+/* Override IPC ownership checks */
-+
-+#define CAP_IPC_OWNER 15
-+
-+/* Insert and remove kernel modules - modify kernel without limit */
-+/* Modify cap_bset */
-+#define CAP_SYS_MODULE 16
-+
-+/* Allow ioperm/iopl access */
-+/* Allow sending USB messages to any device via /proc/bus/usb */
-+
-+#define CAP_SYS_RAWIO 17
-+
-+/* Allow use of chroot() */
-+
-+#define CAP_SYS_CHROOT 18
-+
-+/* Allow ptrace() of any process */
-+
-+#define CAP_SYS_PTRACE 19
-+
-+/* Allow configuration of process accounting */
-+
-+#define CAP_SYS_PACCT 20
-+
-+/* Allow configuration of the secure attention key */
-+/* Allow administration of the random device */
-+/* Allow examination and configuration of disk quotas */
-+/* Allow configuring the kernel's syslog (printk behaviour) */
-+/* Allow setting the domainname */
-+/* Allow setting the hostname */
-+/* Allow calling bdflush() */
-+/* Allow mount() and umount(), setting up new smb connection */
-+/* Allow some autofs root ioctls */
-+/* Allow nfsservctl */
-+/* Allow VM86_REQUEST_IRQ */
-+/* Allow to read/write pci config on alpha */
-+/* Allow irix_prctl on mips (setstacksize) */
-+/* Allow flushing all cache on m68k (sys_cacheflush) */
-+/* Allow removing semaphores */
-+/* Used instead of CAP_CHOWN to "chown" IPC message queues, semaphores
-+ and shared memory */
-+/* Allow locking/unlocking of shared memory segment */
-+/* Allow turning swap on/off */
-+/* Allow forged pids on socket credentials passing */
-+/* Allow setting readahead and flushing buffers on block devices */
-+/* Allow setting geometry in floppy driver */
-+/* Allow turning DMA on/off in xd driver */
-+/* Allow administration of md devices (mostly the above, but some
-+ extra ioctls) */
-+/* Allow tuning the ide driver */
-+/* Allow access to the nvram device */
-+/* Allow administration of apm_bios, serial and bttv (TV) device */
-+/* Allow manufacturer commands in isdn CAPI support driver */
-+/* Allow reading non-standardized portions of pci configuration space */
-+/* Allow DDI debug ioctl on sbpcd driver */
-+/* Allow setting up serial ports */
-+/* Allow sending raw qic-117 commands */
-+/* Allow enabling/disabling tagged queuing on SCSI controllers and sending
-+ arbitrary SCSI commands */
-+/* Allow setting encryption key on loopback filesystem */
-+
-+#define CAP_SYS_ADMIN 21
-+
-+/* Allow use of reboot() */
-+
-+#define CAP_SYS_BOOT 22
-+
-+/* Allow raising priority and setting priority on other (different
-+ UID) processes */
-+/* Allow use of FIFO and round-robin (realtime) scheduling on own
-+ processes and setting the scheduling algorithm used by another
-+ process. */
-+
-+#define CAP_SYS_NICE 23
-+
-+/* Override resource limits. Set resource limits. */
-+/* Override quota limits. */
-+/* Override reserved space on ext2 filesystem */
-+/* NOTE: ext2 honors fsuid when checking for resource overrides, so
-+ you can override using fsuid too */
-+/* Override size restrictions on IPC message queues */
-+/* Allow more than 64hz interrupts from the real-time clock */
-+/* Override max number of consoles on console allocation */
-+/* Override max number of keymaps */
-+
-+#define CAP_SYS_RESOURCE 24
-+
-+/* Allow manipulation of system clock */
-+/* Allow irix_stime on mips */
-+/* Allow setting the real-time clock */
-+
-+#define CAP_SYS_TIME 25
-+
-+/* Allow configuration of tty devices */
-+/* Allow vhangup() of tty */
-+
-+#define CAP_SYS_TTY_CONFIG 26
-+
-+/* Allow the privileged aspects of mknod() */
-+
-+#define CAP_MKNOD 27
-+
-+/* Allow taking of leases on files */
-+
-+#define CAP_LEASE 28
-+
-+#endif /* !_LINUX_CAPABILITY_H */
-+
-+
-
- /*
- * POSIX capability types
---- libcap-1.10.orig/libcap/Makefile
-+++ libcap-1.10/libcap/Makefile
-@@ -24,12 +24,15 @@
- #
- # defines
- #
-+ifndef $(topdir)
- topdir=$(shell pwd)/..
--include ../Make.Rules
-+endif
-+include $(topdir)/Make.Rules
-+
- #
- # Library version
- #
--LIBNAME=libcap.so
-+LIBNAME=libcap
- #
-
- FILES=cap_alloc cap_proc cap_extint cap_flag cap_text cap_sys
-@@ -39,10 +42,11 @@
-
- INCLS=libcap.h cap_names.h $(INCS)
- OBJS=$(addsuffix .o, $(FILES))
--MAJLIBNAME=$(LIBNAME).$(VERSION)
-+LOBJS=$(addsuffix .lo, $(FILES))
-+MAJLIBNAME=$(LIBNAME).so.$(VERSION)
- MINLIBNAME=$(MAJLIBNAME).$(MINOR)
-
--all: $(MINLIBNAME)
-+all: $(MINLIBNAME) $(LIBNAME).a
-
- _makenames: _makenames.c cap_names.sed
- $(CC) $(CFLAGS) $(LDFLAGS) $< -o $@
-@@ -50,31 +54,38 @@
- cap_names.h: _makenames
- ./_makenames > cap_names.h
-
--cap_names.sed: Makefile /usr/include/linux/capability.h
-- @echo "=> making cap_names.c from <linux/capability.h>"
-- @sed -ne '/^#define[ \t]CAP[_A-Z]\+[ \t]\+[0-9]\+/{s/^#define \([^ \t]*\)[ \t]*\([^ \t]*\)/ \{ \2, \"\1\" \},/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;p;}' < /usr/include/linux/capability.h | fgrep -v 0x > cap_names.sed
--# @sed -ne '/^#define[ \t]CAP[_A-Z]\+[ \t]\+[0-9]\+/{s/^#define CAP_\([^ \t]*\)[ \t]*\([^ \t]*\)/ \{ \2, \"\1\" \},/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;p;}' < /usr/include/linux/capability.h | fgrep -v 0x > cap_names.sed
-+cap_names.sed: Makefile include/sys/capability.h
-+ @echo "=> making cap_names.c from <sys/capability.h>"
-+ @sed -ne '/^#define[ \t]CAP[_A-Z]\+[ \t]\+[0-9]\+/{s/^#define \([^ \t]*\)[ \t]*\([^ \t]*\)/ \{ \2, \"\1\" \},/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;p;}' < include/sys/capability.h | fgrep -v 0x > cap_names.sed # @sed -ne '/^#define[ \t]CAP[_A-Z]\+[ \t]\+[0-9]\+/{s/^#define CAP_\([^ \t]*\)[ \t]*\([^ \t]*\)/ \{ \2, \"\1\" \},/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;p;}' < /usr/include/linux/capability.h | fgrep -v 0x > cap_names.sed
-+
-+$(LIBNAME).a: $(OBJS)
-+ ar cruv $(LIBNAME).a $(OBJS)
-
--$(MINLIBNAME): $(OBJS)
-- $(LD) -soname $(MAJLIBNAME) -x -shared -o $@ $(OBJS)
-+$(MINLIBNAME): $(LOBJS)
-+ $(CC) -shared -fPIC -Wl,-soname,$(MAJLIBNAME) -o $@ $(LOBJS)
- ln -sf $(MINLIBNAME) $(MAJLIBNAME)
-- ln -sf $(MAJLIBNAME) $(LIBNAME)
-+ ln -sf $(MAJLIBNAME) $(LIBNAME).so
-
- %.o: %.c $(INCLS)
- $(CC) $(CFLAGS) -c $< -o $@
-
-+%.lo: %.c $(INCLS)
-+ $(CC) $(CFLAGS) -fPIC -c $< -o $@
-+
-+
- install: all
- mkdir -p -m 0755 $(INCDIR)/sys
- install -m 0644 include/sys/capability.h $(INCDIR)/sys
- mkdir -p -m 0755 $(LIBDIR)
-+ install -m 0644 $(LIBNAME).a $(LIBDIR)
- install -m 0644 $(MINLIBNAME) $(LIBDIR)/$(MINLIBNAME)
- ln -sf $(MINLIBNAME) $(LIBDIR)/$(MAJLIBNAME)
-- ln -sf $(MAJLIBNAME) $(LIBDIR)/$(LIBNAME)
-+ ln -sf $(MAJLIBNAME) $(LIBDIR)/$(LIBNAME).so
- -/sbin/ldconfig
-
- clean:
- $(LOCALCLEAN)
-- rm -f $(OBJS) $(LIBNAME)*
-+ rm -f $(OBJS) $(LOBJS) $(LIBNAME).a $(LIBNAME).so*
- rm -f cap_names.h cap_names.sed _makenames
- cd include/sys && $(LOCALCLEAN)
-
---- libcap-1.10.orig/libcap/_makenames.c
-+++ libcap-1.10/libcap/_makenames.c
-@@ -9,7 +9,7 @@
-
- #include <stdio.h>
- #include <stdlib.h>
--#include <linux/capability.h>
-+#include <sys/capability.h>
-
- /*
- * #include 'sed' generated array
---- libcap-1.10.orig/libcap/cap_sys.c
-+++ libcap-1.10/libcap/cap_sys.c
-@@ -10,7 +10,8 @@
- #include "libcap.h"
- #define __LIBRARY__
- #include <linux/unistd.h>
--
-+/* glic >= 2.1 knows capset/capget. no need to define it here */
-+/*
- _syscall2(int, capget,
- cap_user_header_t, header,
- cap_user_data_t, data)
-@@ -18,7 +19,7 @@
- _syscall2(int, capset,
- cap_user_header_t, header,
- const cap_user_data_t, data)
--
-+*/
- /*
- * $Log: libcap-1.10-debian.patch,v $
- * Revision 1.1 2006/10/29 23:14:00 jgc
- * upgpkg: libcap 1.10-2
- * Remove amd64 patches that messed things up
- * Apply debian patch to make it build again
- * Remove empty man2 directory the right way
- *
- * Revision 1.1.1.1 1999/04/17 22:16:31 morgan
---- libcap-1.10.orig/capfaq-0.2.txt
-+++ libcap-1.10/capfaq-0.2.txt
-@@ -0,0 +1,264 @@
-+This is the Linux kernel capabilities FAQ
-+
-+Its history, to the extent that I am able to reconstruct it is that
-+v2.0 was posted to the Linux kernel list on 1999/04/02 by Boris
-+Tobotras. Thanks to Denis Ducamp for forwarding me a copy.
-+
-+Cheers
-+
-+Andrew
-+
-+Linux Capabilities FAQ 0.2
-+==========================
-+
-+1) What is a capability?
-+
-+The name "capabilities" as used in the Linux kernel can be confusing.
-+First there are Capabilities as defined in computer science. A
-+capability is a token used by a process to prove that it is allowed to
-+do an operation on an object. The capability identifies the object
-+and the operations allowed on that object. A file descriptor is a
-+capability. You create the file descriptor with the "open" call and
-+request read or write permissions. Later, when doing a read or write
-+operation, the kernel uses the file descriptor as an index into a
-+data structure that indicates what operations are allowed. This is an
-+efficient way to check permissions. The necessary data structures are
-+created once during the "open" call. Later read and write calls only
-+have to do a table lookup. Operations on capabilities include copying
-+capabilities, transferring capabilities between processes, modifying a
-+capability, and revoking a capability. Modifying a capability can be
-+something like taking a read-write filedescriptor and making it
-+read-only. A capability often has a notion of an "owner" which is
-+able to invalidate all copies and derived versions of a capability.
-+Entire OSes are based on this "capability" model, with varying degrees
-+of purity. There are other ways of implementing capabilities than the
-+file descriptor model - traditionally special hardware has been used,
-+but modern systems also use the memory management unit of the CPU.
-+
-+Then there is something quite different called "POSIX capabilities"
-+which is what Linux uses. These capabilities are a partitioning of
-+the all powerful root privilege into a set of distinct privileges (but
-+look at securelevel emulation to find out that this isn't necessary
-+the whole truth). Users familiar with VMS or "Trusted" versions of
-+other UNIX variants will know this under the name "privileges". The
-+name "capabilities" comes from the now defunct POSIX draft 1003.1e
-+which used this name.
-+
-+2) So what is a "POSIX capability"?
-+
-+A process has three sets of bitmaps called the inheritable(I),
-+permitted(P), and effective(E) capabilities. Each capability is
-+implemented as a bit in each of these bitmaps which is either set or
-+unset. When a process tries to do a privileged operation, the
-+operating system will check the appropriate bit in the effective set
-+of the process (instead of checking whether the effective uid of the
-+process i 0 as is normally done). For example, when a process tries
-+to set the clock, the Linux kernel will check that the process has the
-+CAP_SYS_TIME bit (which is currently bit 25) set in its effective set.
-+
-+The permitted set of the process indicates the capabilities the
-+process can use. The process can have capabilities set in the
-+permitted set that are not in the effective set. This indicates that
-+the process has temporarily disabled this capability. A process is
-+allowed to set a bit in its effective set only if it is available in
-+the permitted set. The distinction between effective and permitted
-+exists so that processes can "bracket" operations that need privilege.
-+
-+The inheritable capabilities are the capabilities of the current
-+process that should be inherited by a program executed by the current
-+process. The permitted set of a process is masked against the
-+inheritable set during exec(). Nothing special happens during fork()
-+or clone(). Child processes and threads are given an exact copy of
-+the capabilities of the parent process.
-+
-+3) What about other entities in the system? Users, Groups, Files?
-+
-+Files have capabilities. Conceptually they have the same three
-+bitmaps that processes have, but to avoid confusion we call them by
-+other names. Only executable files have capabilities, libraries don't
-+have capabilities (yet). The three sets are called the allowed set,
-+the forced set, and the effective set.
-+
-+The allowed set indicates what capabilities the executable is allowed
-+to receive from an execing process. This means that during exec(),
-+the capabilities of the old process are first masked against a set
-+which indicates what the process gives away (the inheritable set of
-+the process), and then they are masked against a set which indicates
-+what capabilities the new process image is allowed to receive (the
-+allowed set of the executable).
-+
-+The forced set is a set of capabilities created out of thin air and
-+given to the process after execing the executable. The forced set is
-+similar in nature to the setuid feature. In fact, the setuid bit from
-+the filesystem is "read" as a full forced set by the kernel.
-+
-+The effective set indicates which bits in the permitted set of the new
-+process should be transferred to the effective set of the new process.
-+The effective set is best thought of as a "capability aware" set. It
-+should consist of only 1s if the executable is capability-dumb, or
-+only 0s if the executable is capability-smart. Since the effective
-+set consists of only 0s or only 1s, the filesystem can implement this
-+set using a single bit.
-+
-+NOTE: Filesystem support for capabilities is not part of Linux 2.2.
-+
-+Users and Groups don't have associated capabilities from the kernel's
-+point of view, but it is entirely reasonable to associate users or
-+groups with capabilities. By letting the "login" program set some
-+capabilities it is possible to make role users such as a backup user
-+that will have the CAP_DAC_READ_SEARCH capability and be able to do
-+backups. This could also be implemented as a PAM module, but nobody
-+has implemented one yet.
-+
-+4) What capabilities exist?
-+
-+The capabilities available in Linux are listed and documented in the
-+file /usr/src/linux/include/linux/capability.h.
-+
-+5) Are Linux capabilities hierarchical?
-+
-+No, you cannot make a "subcapability" out of a Linux capability as in
-+capability-based OSes.
-+
-+6) How can I use capabilities to make sure Mr. Evil Luser (eluser)
-+can't exploit my "suid" programs?
-+
-+This is the general outline of how this works given filesystem
-+capability support exists. First, you have a PAM module that sets the
-+inheritable capabilities of the login-shell of eluser. Then for all
-+"suid" programs on the system, you decide what capabilities they need
-+and set the _allowed_ set of the executable to that set of
-+capabilities. The capability rules
-+
-+ new permitted = forced | (allowed & inheritable)
-+
-+means that you should be careful about setting forced capabilities on
-+executables. In a few cases, this can be useful though. For example
-+the login program needs to set the inheritable set of the new user and
-+therefore needs an almost full permitted set. So if you want eluser
-+to be able to run login and log in as a different user, you will have
-+to set some forced bits on that executable.
-+
-+7) What about passing capabilities between processes?
-+
-+Currently this is done by the system call "setcap" which can set the
-+capabilities of another process. This requires the CAP_SETPCAP
-+capability which you really only want to grant a _few_ processes.
-+CAP_SETPCAP was originally intended as a workaround to be able to
-+implement filesystem support for capabilities using a daemon outside
-+the kernel.
-+
-+There has been discussions about implementing socket-level capability
-+passing. This means that you can pass a capability over a socket. No
-+support for this exists in the official kernel yet.
-+
-+8) I see securelevel has been removed from 2.2 and are superceeded by
-+capabilities. How do I emulate securelevel using capabilities?
-+
-+The setcap system call can remove a capability from _all_ processes on
-+the system in one atomic operation. The setcap utility from the
-+libcap distribution will do this for you. The utility requires the
-+CAP_SETPCAP privilege to do this. The CAP_SETPCAP capability is not
-+enabled by default.
-+
-+libcap is available from
-+ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.2/
-+
-+9) I noticed that the capability.h file lacks some capabilities that
-+are needed to fully emulate 2.0 securelevel. Is there a patch for
-+this?
-+
-+Actually yes - funny you should ask :-). The problem with 2.0
-+securelevel is that they for example stop root from accessing block
-+devices. At the same time they restrict the use of iopl. These two
-+changes are fundamentally different. Blocking access to block devices
-+means restricting something that usually isn't restricted.
-+Restricting access to the use of iopl on the other hand means
-+restricting (blocking) access to something that is already blocked.
-+Emulating the parts of 2.0 securelevel that restricts things that are
-+normally not restricted means that the capabilites in the kernel has
-+to have a set of capabilities that are usually _on_ for a normal
-+process (note that this breaks the explanation that capabilities are a
-+partitioning of the root privileges). There is an experimental patch at
-+
-+ftp://ftp.guardian.no/pub/free/linux/capabilities/patch-cap-exp-1
-+
-+which implements a set of capabilities with the "CAP_USER" prefix:
-+
-+cap_user_sock - allowed to use socket()
-+cap_user_dev - allowed to open char/block devices
-+cap_user_fifo - allowed to use pipes
-+
-+These should be enough to emulate 2.0 securelevel (tell me if we need
-+something more).
-+
-+10) Seems I need a CAP_SETPCAP capability that I don't have to make use
-+of capabilities. How do I enable this capability?
-+
-+Change the definition of CAP_INIT_EFF_SET and CAP_INIT_INH_SET to the
-+following in include/linux/capability.h:
-+
-+#define CAP_INIT_EFF_SET { ~0 }
-+#define CAP_INIT_INH_SET { ~0 }
-+
-+This will start init with a full capability set and not with
-+CAP_SETPCAP removed.
-+
-+11) How do I start a process with a limited set of capabilities?
-+
-+Get the libcap library and use the execcap utility. The following
-+example starts the update daemon with only the CAP_SYS_ADMIN
-+capability.
-+
-+execcap 'cap_sys_admin=eip' update
-+
-+12) How do I start a process with a limited set of capabilities under
-+another uid?
-+
-+Use the sucap utility which changes uid from root without loosing any
-+capabilities. Normally all capabilities are cleared when changing uid
-+from root. The sucap utility requires the CAP_SETPCAP capability.
-+The following example starts updated under uid updated and gid updated
-+with CAP_SYS_ADMIN raised in the Effective set.
-+
-+sucap updated updated execcap 'cap_sys_admin=eip' update
-+
-+[ Sucap is currently available from
-+ftp://ftp.guardian.no/pub/free/linux/capabilities/sucap.c. Put it in
-+the progs directory of libcap to compile.]
-+
-+13) What are the "capability rules"
-+
-+The capability rules are the rules used to set the capabilities of the
-+new process image after an exec. They work like this:
-+
-+ pI' = pI
-+ (***) pP' = fP | (fI & pI)
-+ pE' = pP' & fE [NB. fE is 0 or ~0]
-+
-+ I=Inheritable, P=Permitted, E=Effective // p=process, f=file
-+ ' indicates post-exec().
-+
-+Now to make sense of the equations think of fP as the Forced set of
-+the executable, and fI as the Allowed set of the executable. Notice
-+how the Inheritable set isn't touched at all during exec().
-+
-+14) What are the laws for setting capability bits in the Inheritable,
-+Permitted, and Effective sets?
-+
-+Bits can be transferred from Permitted to either Effective or
-+Inheritable set.
-+
-+Bits can be removed from all sets.
-+
-+15) Where is the standard on which the Linux capabilities are based?
-+
-+There used to be a POSIX draft called POSIX.6 and later POSIX 1003.1e.
-+However after the committee had spent over 10 years, POSIX decided
-+that enough is enough and dropped the draft. There will therefore not
-+be a POSIX standard covering security anytime soon. This may lead to
-+that the POSIX draft is available for free, however.
-+
-+--
-+ Best regards, -- Boris.
-+
diff --git a/abs/core/libcap/libcap-1.10-fixcflags.patch b/abs/core/libcap/libcap-1.10-fixcflags.patch
deleted file mode 100644
index 3566d95..0000000
--- a/abs/core/libcap/libcap-1.10-fixcflags.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff -Naur libcap-1.10.orig/Make.Rules libcap-1.10/Make.Rules
---- libcap-1.10.orig/Make.Rules 2005-05-30 16:10:07.000000000 +0000
-+++ libcap-1.10/Make.Rules 2005-05-30 16:11:18.000000000 +0000
-@@ -42,8 +42,8 @@
- # Compilation specifics
-
- CC=gcc
--COPTFLAGS=-O2
--DEBUG=-g #-DDEBUG
-+COPTFLAGS=-O2 -fPIC
-+DEBUG=
- WARNINGS=-ansi -D_POSIX_SOURCE -Wall -Wwrite-strings \
- -Wpointer-arith -Wcast-qual -Wcast-align \
- -Wtraditional -Wstrict-prototypes -Wmissing-prototypes \
-@@ -54,7 +54,7 @@
- IPATH=-I$(topdir)/libcap/include
- INCS=$(topdir)/libcap/include/sys/capability.h
- LIBS=-L$(topdir)/libcap -lcap
--CFLAGS=-Dlinux $(WARNINGS) $(DEBUG) $(COPTFLAG) $(IPATH)
-+CFLAGS+=-Dlinux $(WARNINGS) $(DEBUG) $(COPTFLAG) $(IPATH)
-
- # Global cleanup stuff \ No newline at end of file
diff --git a/abs/core/libcap/libcap-1.10-shared.patch b/abs/core/libcap/libcap-1.10-shared.patch
deleted file mode 100644
index 54e5496..0000000
--- a/abs/core/libcap/libcap-1.10-shared.patch
+++ /dev/null
@@ -1,17 +0,0 @@
---- libcap-1.11/libcap/Makefile.shared 1999-04-17 18:16:31.000000000 -0400
-+++ libcap-1.11/libcap/Makefile 2002-07-19 06:24:23.000000000 -0400
-@@ -56,12 +56,12 @@ cap_names.sed: Makefile /usr/include/lin
- # @sed -ne '/^#define[ \t]CAP[_A-Z]\+[ \t]\+[0-9]\+/{s/^#define CAP_\([^ \t]*\)[ \t]*\([^ \t]*\)/ \{ \2, \"\1\" \},/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;p;}' < /usr/include/linux/capability.h | fgrep -v 0x > cap_names.sed
-
- $(MINLIBNAME): $(OBJS)
-- $(LD) -soname $(MAJLIBNAME) -x -shared -o $@ $(OBJS)
-+ $(CC) -Wl,-soname,$(MAJLIBNAME) -Wl,-x -shared -o $@ $(OBJS)
- ln -sf $(MINLIBNAME) $(MAJLIBNAME)
- ln -sf $(MAJLIBNAME) $(LIBNAME)
-
- %.o: %.c $(INCLS)
-- $(CC) $(CFLAGS) -c $< -o $@
-+ $(CC) $(CFLAGS) -fpic -c $< -o $@
-
- install: all
- mkdir -p -m 0755 $(INCDIR)/sys
diff --git a/abs/core/libpcap/libpcap-shared.patch b/abs/core/libpcap/libpcap-shared.patch
deleted file mode 100644
index a200836..0000000
--- a/abs/core/libpcap/libpcap-shared.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-diff -u -r libpcap-0.6.2/Makefile.in libpcap-shared/Makefile.in
---- libpcap-0.6.2/Makefile.in Thu Jan 18 05:06:24 2001
-+++ libpcap-shared/Makefile.in Fri Jul 20 16:26:05 2001
-@@ -22,6 +22,10 @@
- #
- # Various configurable paths (remember to edit Makefile.in, not Makefile)
- #
-+MAJOR = @MAJOR@
-+MINOR = @MINOR@
-+SUBMINOR = @SUBMINOR@
-+VERSION = @VERSION@
-
- # Top level hierarchy
- prefix = @prefix@
-@@ -47,7 +51,7 @@
- DEFS = @DEFS@
-
- # Standard CFLAGS
--CFLAGS = $(CCOPT) $(INCLS) $(DEFS)
-+CFLAGS = $(CCOPT) $(INCLS) $(DEFS) -fPIC -DPIC
-
- INSTALL = @INSTALL@
- INSTALL_PROGRAM = @INSTALL_PROGRAM@
-@@ -91,9 +95,14 @@
- TAGFILES = \
- $(SRC) $(HDR) $(TAGHDR)
-
--CLEANFILES = $(OBJ) libpcap.a $(GENSRC) $(GENHDR) lex.yy.c
-
--all: libpcap.a
-+
-+CLEANFILES = $(OBJ) libpcap.a $(GENSRC) $(GENHDR) lex.yy.c libpcap.so.$(VERSION)
-+
-+all: libpcap.a libpcap.so.$(VERSION)
-+
-+libpcap.so.$(VERSION):
-+ gcc -shared -Wl,-soname -Wl,libpcap.so.$(VERSION) -o libpcap.so.$(VERSION) $(OBJ) -lc
-
- libpcap.a: $(OBJ)
- @rm -f $@
-@@ -139,6 +148,10 @@
- [ -d $(DESTDIR)$(libdir) ] || \
- (mkdir -p $(DESTDIR)$(libdir); chmod 755 $(DESTDIR)$(libdir))
- $(INSTALL_DATA) libpcap.a $(DESTDIR)$(libdir)/libpcap.a
-+ $(INSTALL_DATA) libpcap.so.$(VERSION) $(DESTDIR)$(libdir)/libpcap.so.$(VERSION)
-+ ln -s libpcap.so.$(VERSION) $(DESTDIR)$(libdir)/libpcap.so
-+ ln -s libpcap.so.$(VERSION) $(DESTDIR)$(libdir)/libpcap.so.$(MAJOR)
-+ ln -s libpcap.so.$(VERSION) $(DESTDIR)$(libdir)/libpcap.so.$(MAJOR).$(MINOR)
- $(RANLIB) $(DESTDIR)$(libdir)/libpcap.a
- [ -d $(DESTDIR)$(includedir) ] || \
- (mkdir -p $(DESTDIR)$(includedir); chmod 755 $(DESTDIR)$(includedir))
diff --git a/abs/core/libpng/ChangeLog b/abs/core/libpng/ChangeLog
deleted file mode 100644
index 98aa66d..0000000
--- a/abs/core/libpng/ChangeLog
+++ /dev/null
@@ -1,55 +0,0 @@
-
-2008-10-06 Douglas Soares de Andrade <douglas@archlinux.org>
-
- * Updated for i686: 1.2.32
-
-2008-08-23 Douglas Soares de Andrade <douglas@archlinux.org>
-
- * Updated for i686: 1.2.31
- * Thanks to Hussam Al-Tayeb
-
-2008-08-17 Douglas Soares de Andrade <douglas@archlinux.org>
-
- * Had to return to 1.2.29 because xul depends on
- png with apng patch
-
-2008-08-17 Douglas Soares de Andrade <douglas@archlinux.org>
-
- * Updated for i686: 1.2.30
- * Fixes some security issues
- * Remove the apng patch as there was no compatible version
- for this version
-
-2008-07-04 Douglas Soares de Andrade <douglas@archlinux.org>
-
- * Updated for i686 - 1.2.29-1
- * Updated the apng patch for 1.2.29
-
-2008-05-06 Travis Willard <travis@archlinux.org>
-
- * 1.2.28-1
- Upstream update
- Uses same APNG patchset as 1.2.27
-
-2008-05-01 Jan de Groot <jgc@archlinux.org>
-
- * 1.2.27-1
- Upstream update (security update!)
- Fix APNG patchset to apply to 1.2.27
- Fix build with newer libtool versions
-
-2008-03-12 Travis Willard <travis@archlinux.org>
-
- * 1.2.25-1
- Upstream update
-
-2008-02-18 Travis Willard <travis@archlinux.org>
-
- * 1.2.24-3
- Corrected ChangeLog
-
-2008-02-18 Travis Willard <travis@archlinux.org>
-
- * 1.2.24-2
- Added ChangeLog
- Added APNG patchset from <http://littlesvr.ca/apng/>
diff --git a/abs/core/libpng/libpng-1.2.29-apng.patch b/abs/core/libpng/libpng-1.2.29-apng.patch
deleted file mode 100644
index cc27ca3..0000000
--- a/abs/core/libpng/libpng-1.2.29-apng.patch
+++ /dev/null
@@ -1,1671 +0,0 @@
-Submitted By: Jens Ornot <oj_webstar@t-online.de>
-Resubmitted by: Jens Ornot <oj_webstar@t-online.de> - Fix APNG patchset to apply to 1.2.27
-Date: 2008-05-24
-Initial Package Version: 1.2.10
-Upstream Status: Unknown
-Origin: Andrew Smith
-Description: APNG is an extension of the [PNG][pngspec] format, adding support for animated images.
- It is intended to be a replacement for simple animated images
- that have traditionally used the [GIF][gifspec] format,
- while adding support for 24-bit images and 8-bit transparency.
- APNG is a simpler alternative to MNG,
- providing a spec suitable for the most common usage of animated images on the Internet.
-
- APNG is backwards-compatible with PNG;
- any PNG decoder should be able to ignore the APNG-specific chunks and display a single image.
-
-diff -ruN libpng-1.2.27/png.c libpng-1.2.27.apng/png.c
---- libpng-1.2.27/png.c 2008-04-30 10:23:12.000000000 +0000
-+++ libpng-1.2.27.apng/png.c 2008-05-01 09:49:58.000000000 +0000
-@@ -51,6 +51,9 @@
- PNG_tIME;
- PNG_tRNS;
- PNG_zTXt;
-+PNG_acTL;
-+PNG_fcTL;
-+PNG_fdAT;
-
- #ifdef PNG_READ_SUPPORTED
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-diff -ruN libpng-1.2.27/png.h libpng-1.2.27.apng/png.h
---- libpng-1.2.27/png.h 2008-04-30 10:23:11.000000000 +0000
-+++ libpng-1.2.27.apng/png.h 2008-05-01 09:49:58.000000000 +0000
-@@ -958,6 +958,19 @@
- png_fixed_point int_y_blue;
- #endif
-
-+#if defined(PNG_APNG_SUPPORTED)
-+ png_uint_32 num_frames; /* including default image */
-+ png_uint_32 num_plays;
-+ png_uint_32 next_frame_width;
-+ png_uint_32 next_frame_height;
-+ png_uint_32 next_frame_x_offset;
-+ png_uint_32 next_frame_y_offset;
-+ png_uint_16 next_frame_delay_num;
-+ png_uint_16 next_frame_delay_den;
-+ png_byte next_frame_dispose_op;
-+ png_byte next_frame_blend_op;
-+#endif
-+
- } png_info;
-
- typedef png_info FAR * png_infop;
-@@ -1059,6 +1072,8 @@
- #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
- #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
- #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */
-+#define PNG_INFO_acTL 0x10000L
-+#define PNG_INFO_fcTL 0x20000L
-
- /* This is used for the transformation routines, as some of them
- * change these values for the row. It also should enable using
-@@ -1099,6 +1114,10 @@
- typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop));
- typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep,
- png_uint_32, int));
-+#if defined(PNG_APNG_SUPPORTED)
-+typedef void (PNGAPI *png_progressive_frame_ptr) PNGARG((png_structp,
-+ png_uint_32));
-+#endif
- #endif
-
- #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
-@@ -1430,6 +1449,39 @@
- png_uint_32 user_height_max;
- #endif
-
-+#if defined(PNG_APNG_SUPPORTED)
-+ png_uint_32 apng_flags;
-+ png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */
-+ png_uint_32 first_frame_width;
-+ png_uint_32 first_frame_height;
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_uint_32 num_frames_read; /* incremented after all image data of */
-+ /* a frame is read */
-+#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-+ png_progressive_frame_ptr frame_info_fn; /* frame info read callback */
-+ png_progressive_frame_ptr frame_end_fn; /* frame data read callback */
-+#endif
-+#endif
-+
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ png_uint_32 num_frames_to_write;
-+ png_uint_32 num_frames_written;
-+#endif
-+#endif
-+
-+/* For png_struct.apng_flags: */
-+#define PNG_FIRST_FRAME_HIDDEN 0x0001
-+
-+/* dispose_op flags from inside fcTL */
-+#define PNG_DISPOSE_OP_NONE 0x00
-+#define PNG_DISPOSE_OP_BACKGROUND 0x01
-+#define PNG_DISPOSE_OP_PREVIOUS 0x02
-+
-+/* blend_op flags from inside fcTL */
-+#define PNG_BLEND_OP_SOURCE 0x00
-+#define PNG_BLEND_OP_OVER 0x01
-+
- /* New member added in libpng-1.0.25 and 1.2.17 */
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* storage for unknown chunk that the library doesn't recognize. */
-@@ -1759,6 +1811,18 @@
- extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
- png_bytepp image));
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+extern PNG_EXPORT (void,png_write_frame_head) PNGARG((png_structp png_ptr,
-+ png_infop png_info, png_bytepp row_pointers,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op));
-+
-+extern PNG_EXPORT (void,png_write_frame_tail) PNGARG((png_structp png_ptr,
-+ png_infop png_info));
-+#endif
-+
- /* writes the end of the PNG file. */
- extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-@@ -2007,6 +2071,11 @@
- png_voidp progressive_ptr,
- png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
- png_progressive_end_ptr end_fn));
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+extern PNG_EXPORT(void,png_set_progressive_frame_fn) PNGARG((png_structp png_ptr,
-+ png_progressive_frame_ptr frame_info_fn,
-+ png_progressive_frame_ptr frame_end_fn));
-+#endif
-
- /* returns the user pointer associated with the push read functions */
- extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
-@@ -2444,6 +2513,59 @@
- #endif
- #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */
-
-+#if defined(PNG_APNG_SUPPORTED)
-+extern PNG_EXPORT(png_uint_32,png_get_acTL) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays));
-+extern PNG_EXPORT(png_uint_32,png_set_acTL) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays));
-+extern PNG_EXPORT(png_uint_32,png_get_num_frames) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_num_plays)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTL)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width,
-+ png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,
-+ png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op,
-+ png_byte *blend_op));
-+extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTL)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width,
-+ png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op));
-+extern PNG_EXPORT(void,png_ensure_fcTL_is_valid)
-+ PNGARG((png_structp png_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_width)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_height)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_x_offset)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_y_offset)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_num)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_den)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_byte,png_get_next_frame_dispose_op)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_byte,png_get_next_frame_blend_op)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_byte,png_get_first_frame_is_hidden)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_set_first_frame_is_hidden)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr, png_byte is_hidden));
-+#endif /* PNG_APNG_SUPPORTED */
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+extern PNG_EXPORT(void,png_read_frame_head) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr));
-+#endif
-+
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* provide a list of chunks and how they are to be handled, if the built-in
- handling or default unknown chunk handling is not desired. Any chunks not
-@@ -2750,6 +2872,8 @@
- #define PNG_BACKGROUND_IS_GRAY 0x800
- #define PNG_HAVE_PNG_SIGNATURE 0x1000
- #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
-+#define PNG_HAVE_acTL 0x4000
-+#define PNG_HAVE_fcTL 0x8000L
-
- /* flags for the transformations the PNG library does on the image data */
- #define PNG_BGR 0x0001
-@@ -2890,6 +3014,9 @@
- #define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'}
- #define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
- #define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
-+#define PNG_acTL png_byte png_acTL[5] = { 97, 99, 84, 76, '\0'}
-+#define PNG_fcTL png_byte png_fcTL[5] = {102, 99, 84, 76, '\0'}
-+#define PNG_fdAT png_byte png_fdAT[5] = {102, 100, 65, 84, '\0'}
-
- #ifdef PNG_USE_GLOBAL_ARRAYS
- PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5];
-@@ -2913,6 +3040,9 @@
- PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5];
- PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5];
- PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5];
-+PNG_EXPORT_VAR (png_byte FARDATA) png_acTL[5];
-+PNG_EXPORT_VAR (png_byte FARDATA) png_fcTL[5];
-+PNG_EXPORT_VAR (png_byte FARDATA) png_fdAT[5];
- #endif /* PNG_USE_GLOBAL_ARRAYS */
-
- #if defined(PNG_1_0_X) || defined (PNG_1_2_X)
-@@ -3187,6 +3317,17 @@
- #endif
- #endif
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+PNG_EXTERN void png_write_acTL PNGARG((png_structp png_ptr,
-+ png_uint_32 num_frames, png_uint_32 num_plays));
-+
-+PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op));
-+#endif
-+
- /* Called when finished processing a row of data */
- PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
-
-@@ -3238,6 +3379,20 @@
- PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+/* private, reset some things to become ready for reading next frame */
-+PNG_EXTERN void png_read_reset PNGARG((png_structp png_ptr));
-+PNG_EXTERN void png_read_reinit PNGARG((png_structp png_ptr,
-+ png_infop info_ptr));
-+PNG_EXTERN void png_progressive_read_reset PNGARG((png_structp png_ptr));
-+#endif
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+/* private, reset some things to become ready for writing next frame */
-+PNG_EXTERN void png_write_reset PNGARG((png_structp png_ptr));
-+PNG_EXTERN void png_write_reinit PNGARG((png_structp png_ptr,
-+ png_infop info_ptr, png_uint_32 width, png_uint_32 height));
-+#endif
-+
- /* these are the functions that do the transformations */
- #if defined(PNG_READ_FILLER_SUPPORTED)
- PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
-@@ -3453,6 +3608,18 @@
- png_uint_32 length));
- #endif
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+PNG_EXTERN void png_handle_acTL PNGARG((png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 length));
-+PNG_EXTERN void png_handle_fcTL PNGARG((png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 length));
-+PNG_EXTERN void png_have_info PNGARG((png_structp png_ptr, png_infop info_ptr));
-+PNG_EXTERN void png_handle_fdAT PNGARG((png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 length));
-+PNG_EXTERN void png_ensure_sequence_number PNGARG((png_structp png_ptr,
-+ png_uint_32 length));
-+#endif
-+
- PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-
-diff -ruN libpng-1.2.27/pngconf.h libpng-1.2.27.apng/pngconf.h
---- libpng-1.2.27/pngconf.h 2008-04-30 10:23:11.000000000 +0000
-+++ libpng-1.2.27.apng/pngconf.h 2008-05-01 09:49:58.000000000 +0000
-@@ -925,6 +925,10 @@
- # define PNG_READ_zTXt_SUPPORTED
- # define PNG_zTXt_SUPPORTED
- #endif
-+#ifndef PNG_NO_READ_APNG
-+# define PNG_READ_APNG_SUPPORTED
-+# define PNG_APNG_SUPPORTED
-+#endif
- #ifndef PNG_NO_READ_UNKNOWN_CHUNKS
- # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
- # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-@@ -1067,6 +1071,12 @@
- # define PNG_zTXt_SUPPORTED
- # endif
- #endif
-+#ifndef PNG_NO_WRITE_APNG
-+# define PNG_WRITE_APNG_SUPPORTED
-+# ifndef PNG_APNG_SUPPORTED
-+# define PNG_APNG_SUPPORTED
-+# endif
-+#endif
- #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS
- # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-diff -ruN libpng-1.2.27/pngget.c libpng-1.2.27.apng/pngget.c
---- libpng-1.2.27/pngget.c 2008-04-30 10:23:12.000000000 +0000
-+++ libpng-1.2.27.apng/pngget.c 2008-05-01 09:49:58.000000000 +0000
-@@ -797,6 +797,167 @@
- }
- #endif
-
-+#if defined(PNG_APNG_SUPPORTED)
-+png_uint_32 PNGAPI
-+png_get_acTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 *num_frames, png_uint_32 *num_plays)
-+{
-+ png_debug1(1, "in %s retrieval function\n", "acTL");
-+
-+ if (png_ptr != NULL && info_ptr != NULL &&
-+ (info_ptr->valid & PNG_INFO_acTL) &&
-+ num_frames != NULL && num_plays != NULL)
-+ {
-+ *num_frames = info_ptr->num_frames;
-+ *num_plays = info_ptr->num_plays;
-+ return (1);
-+ }
-+
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_num_frames(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_num_frames()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->num_frames);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_num_plays(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_num_plays()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->num_plays);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 *width, png_uint_32 *height,
-+ png_uint_32 *x_offset, png_uint_32 *y_offset,
-+ png_uint_16 *delay_num, png_uint_16 *delay_den,
-+ png_byte *dispose_op, png_byte *blend_op)
-+{
-+ png_debug1(1, "in %s retrieval function\n", "fcTL");
-+
-+ if (png_ptr != NULL && info_ptr != NULL &&
-+ (info_ptr->valid & PNG_INFO_fcTL) &&
-+ width != NULL && height != NULL &&
-+ x_offset != NULL && x_offset != NULL &&
-+ delay_num != NULL && delay_den != NULL &&
-+ dispose_op != NULL && blend_op != NULL)
-+ {
-+ *width = info_ptr->next_frame_width;
-+ *height = info_ptr->next_frame_height;
-+ *x_offset = info_ptr->next_frame_x_offset;
-+ *y_offset = info_ptr->next_frame_y_offset;
-+ *delay_num = info_ptr->next_frame_delay_num;
-+ *delay_den = info_ptr->next_frame_delay_den;
-+ *dispose_op = info_ptr->next_frame_dispose_op;
-+ *blend_op = info_ptr->next_frame_blend_op;
-+ return (1);
-+ }
-+
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_width()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_width);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_height()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_height);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_x_offset()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_x_offset);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_y_offset()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_y_offset);
-+ return (0);
-+}
-+
-+png_uint_16 PNGAPI
-+png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_delay_num()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_delay_num);
-+ return (0);
-+}
-+
-+png_uint_16 PNGAPI
-+png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_delay_den()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_delay_den);
-+ return (0);
-+}
-+
-+png_byte PNGAPI
-+png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_dispose_op()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_dispose_op);
-+ return (0);
-+}
-+
-+png_byte PNGAPI
-+png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_blend_op()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_blend_op);
-+ return (0);
-+}
-+
-+png_byte PNGAPI
-+png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_first_frame_is_hidden()\n");
-+
-+ if (png_ptr != NULL)
-+ return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN);
-+
-+ return 0;
-+}
-+#endif /* PNG_APNG_SUPPORTED */
-+
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- png_uint_32 PNGAPI
- png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,
-diff -ruN libpng-1.2.27/pngpread.c libpng-1.2.27.apng/pngpread.c
---- libpng-1.2.27/pngpread.c 2008-04-30 10:23:12.000000000 +0000
-+++ libpng-1.2.27.apng/pngpread.c 2008-05-01 09:49:58.000000000 +0000
-@@ -192,6 +192,11 @@
- #if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_CONST PNG_zTXt;
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_acTL;
-+ PNG_CONST PNG_fcTL;
-+ PNG_CONST PNG_fdAT;
-+#endif
- #endif /* PNG_USE_LOCAL_ARRAYS */
- /* First we make sure we have enough data for the 4 byte chunk name
- * and the 4 byte chunk length before proceeding with decoding the
-@@ -215,7 +220,104 @@
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
- }
--
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_ptr->num_frames_read > 0 &&
-+ png_ptr->num_frames_read < info_ptr->num_frames)
-+ {
-+ if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+ {
-+ /* discard trailing IDATs for the first frame */
-+ if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1)
-+ png_error(png_ptr, "out of place IDAT");
-+
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_push_crc_skip(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ if (png_ptr->buffer_size < 4)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_ensure_sequence_number(png_ptr, 4);
-+
-+ if (!(png_ptr->mode & PNG_HAVE_fcTL))
-+ {
-+ /* discard trailing fdATs for frames other than the first */
-+ if (png_ptr->num_frames_read < 2)
-+ png_error(png_ptr, "out of place fdAT");
-+
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_push_crc_skip(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+ else
-+ {
-+ /* frame data follows */
-+ png_ptr->idat_size = png_ptr->push_length - 4;
-+ png_ptr->mode |= PNG_HAVE_IDAT;
-+ png_ptr->process_mode = PNG_READ_IDAT_MODE;
-+
-+ return;
-+ }
-+ }
-+ else if(!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+
-+ png_read_reset(png_ptr);
-+ png_ptr->mode &= ~PNG_HAVE_fcTL;
-+
-+ png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
-+
-+ if (!(png_ptr->mode & PNG_HAVE_fcTL))
-+ png_error(png_ptr, "missing required fcTL chunk");
-+
-+ png_read_reinit(png_ptr, info_ptr);
-+ png_progressive_read_reset(png_ptr);
-+
-+ if (png_ptr->frame_info_fn != NULL)
-+ (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read);
-+
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+
-+ return;
-+ }
-+ else
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_warning(png_ptr, "Skipped (ignored) a chunk "
-+ "between APNG chunks");
-+ png_push_crc_skip(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+
-+ return;
-+ }
-+#endif /* PNG_READ_APNG_SUPPORTED */
-+
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- if(png_ptr->mode & PNG_AFTER_IDAT)
- png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
-@@ -297,6 +399,9 @@
- png_error(png_ptr, "Too many IDAT's found");
- }
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_have_info(png_ptr, info_ptr);
-+#endif
- png_ptr->idat_size = png_ptr->push_length;
- png_ptr->mode |= PNG_HAVE_IDAT;
- png_ptr->process_mode = PNG_READ_IDAT_MODE;
-@@ -492,6 +597,35 @@
- png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
- }
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length);
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_handle_fdAT(png_ptr, info_ptr, png_ptr->push_length);
-+ }
-+#endif /* PNG_READ_APNG_SUPPORTED */
- else
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-@@ -662,13 +796,17 @@
- png_push_read_IDAT(png_structp png_ptr)
- {
- #ifdef PNG_USE_LOCAL_ARRAYS
-- PNG_CONST PNG_IDAT;
-+ PNG_IDAT;
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_fdAT;
-+ PNG_IEND;
-+#endif
- #endif
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
- {
- png_byte chunk_length[4];
-
-- if (png_ptr->buffer_size < 8)
-+ if (png_ptr->buffer_size < 12)
- {
- png_push_save_buffer(png_ptr);
- return;
-@@ -680,15 +818,59 @@
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
-
-- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_fdAT, 4)
-+ && png_ptr->num_frames_read > 0)
-+ {
-+ if (png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)
-+ {
-+ png_ptr->process_mode = PNG_READ_CHUNK_MODE;
-+ if (png_ptr->frame_end_fn != NULL)
-+ (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read);
-+ png_ptr->num_frames_read++;
-+ return;
-+ }
-+ else
-+ {
-+ if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
-+ png_error(png_ptr, "Not enough image data");
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_warning(png_ptr, "Skipping (ignoring) a chunk between "
-+ "APNG chunks");
-+ png_crc_finish(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+ }
-+ else
-+#endif
-+ if ( png_memcmp(png_ptr->chunk_name, png_IDAT, 4)
-+ && (png_ptr->num_frames_read == 0) )
- {
- png_ptr->process_mode = PNG_READ_CHUNK_MODE;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
- png_error(png_ptr, "Not enough compressed data");
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_ptr->frame_end_fn != NULL)
-+ (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read);
-+ png_ptr->num_frames_read++;
-+#endif
- return;
- }
-
- png_ptr->idat_size = png_ptr->push_length;
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if(png_ptr->num_frames_read > 0)
-+ {
-+ png_ensure_sequence_number(png_ptr, 4);
-+ png_ptr->idat_size -= 4;
-+ }
-+#endif
- }
- if (png_ptr->idat_size && png_ptr->save_buffer_size)
- {
-@@ -1589,6 +1771,17 @@
- png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
- }
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+void PNGAPI
-+png_set_progressive_frame_fn(png_structp png_ptr,
-+ png_progressive_frame_ptr frame_info_fn,
-+ png_progressive_frame_ptr frame_end_fn)
-+{
-+ png_ptr->frame_info_fn = frame_info_fn;
-+ png_ptr->frame_end_fn = frame_end_fn;
-+}
-+#endif
-+
- png_voidp PNGAPI
- png_get_progressive_ptr(png_structp png_ptr)
- {
-diff -ruN libpng-1.2.27/pngread.c libpng-1.2.27.apng/pngread.c
---- libpng-1.2.27/pngread.c 2008-04-30 10:23:12.000000000 +0000
-+++ libpng-1.2.27.apng/pngread.c 2008-05-01 09:49:58.000000000 +0000
-@@ -405,6 +405,11 @@
- #if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_CONST PNG_zTXt;
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_acTL;
-+ PNG_CONST PNG_fcTL;
-+ PNG_CONST PNG_fdAT;
-+#endif
- #endif /* PNG_USE_LOCAL_ARRAYS */
- png_byte chunk_length[4];
- png_uint_32 length;
-@@ -458,6 +463,9 @@
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_have_info(png_ptr, info_ptr);
-+#endif
- png_ptr->idat_size = length;
- png_ptr->mode |= PNG_HAVE_IDAT;
- break;
-@@ -530,12 +538,97 @@
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
- png_handle_iTXt(png_ptr, info_ptr, length);
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
-+ png_handle_acTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ png_handle_fcTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ png_handle_fdAT(png_ptr, info_ptr, length);
-+#endif
- else
- png_handle_unknown(png_ptr, info_ptr, length);
- }
- }
- #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+void PNGAPI
-+png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */
-+
-+ png_debug(0, "Reading frame head\n");
-+
-+ if (!(png_ptr->mode & PNG_HAVE_acTL))
-+ png_error(png_ptr, "attempt to png_read_frame_head() but "
-+ "no acTL present");
-+
-+ /* do nothing for the main IDAT */
-+ if (png_ptr->num_frames_read == 0)
-+ return;
-+
-+ png_crc_finish(png_ptr, 0); /* CRC from last IDAT or fdAT chunk */
-+
-+ png_read_reset(png_ptr);
-+ png_ptr->mode &= ~PNG_HAVE_fcTL;
-+
-+ have_chunk_after_DAT = 0;
-+ for (;;)
-+ {
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ PNG_IDAT;
-+ PNG_fdAT;
-+ PNG_fcTL;
-+#endif
-+ png_byte chunk_length[4];
-+ png_uint_32 length;
-+
-+ png_read_data(png_ptr, chunk_length, 4);
-+ length = png_get_uint_31(png_ptr, chunk_length);
-+
-+ png_reset_crc(png_ptr);
-+ png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-+
-+ if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+ {
-+ /* discard trailing IDATs for the first frame */
-+ if (have_chunk_after_DAT || png_ptr->num_frames_read > 1)
-+ png_error(png_ptr, "png_read_frame_head(): out of place IDAT");
-+ png_crc_finish(png_ptr, length);
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ {
-+ png_handle_fcTL(png_ptr, info_ptr, length);
-+ have_chunk_after_DAT = 1;
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ png_ensure_sequence_number(png_ptr, length);
-+
-+ /* discard trailing fdATs for frames other than the first */
-+ if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1)
-+ png_crc_finish(png_ptr, length - 4);
-+ else if(png_ptr->mode & PNG_HAVE_fcTL)
-+ {
-+ png_ptr->idat_size = length - 4;
-+ png_ptr->mode |= PNG_HAVE_IDAT;
-+
-+ break;
-+ }
-+ else
-+ png_error(png_ptr, "png_read_frame_head(): out of place fdAT");
-+ }
-+ else
-+ {
-+ png_warning(png_ptr, "Skipped (ignored) a chunk "
-+ "between APNG chunks");
-+ png_crc_finish(png_ptr, length);
-+ }
-+ }
-+}
-+#endif /* PNG_READ_APNG_SUPPORTED */
-+
- /* optional call to update the users info_ptr structure */
- void PNGAPI
- png_read_update_info(png_structp png_ptr, png_infop info_ptr)
-@@ -572,6 +665,10 @@
- {
- #ifdef PNG_USE_LOCAL_ARRAYS
- PNG_CONST PNG_IDAT;
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_fdAT;
-+ PNG_CONST PNG_IEND;
-+#endif
- PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
- 0xff};
- PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
-@@ -701,19 +798,46 @@
- {
- if (!(png_ptr->zstream.avail_in))
- {
-- while (!png_ptr->idat_size)
-+ png_uint_32 bytes_to_skip = 0;
-+
-+ while (!png_ptr->idat_size || bytes_to_skip != 0)
- {
- png_byte chunk_length[4];
-
-- png_crc_finish(png_ptr, 0);
--
-+ png_crc_finish(png_ptr, bytes_to_skip);
-+ bytes_to_skip = 0;
-+
- png_read_data(png_ptr, chunk_length, 4);
- png_ptr->idat_size = png_get_uint_31(png_ptr,chunk_length);
--
-+
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-- png_error(png_ptr, "Not enough image data");
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_ptr->num_frames_read == 0)
-+ {
-+#endif
-+ if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+ png_error(png_ptr, "Not enough image data");
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ }
-+ else
-+ {
-+ if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
-+ png_error(png_ptr, "Not enough image data");
-+ if (png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ png_warning(png_ptr, "Skipped (ignored) a chunk "
-+ "between APNG chunks");
-+ bytes_to_skip = png_ptr->idat_size;
-+ continue;
-+ }
-+
-+ png_ensure_sequence_number(png_ptr, png_ptr->idat_size);
-+
-+ png_ptr->idat_size -= 4;
-+ }
-+#endif
- }
- png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_in = png_ptr->zbuf;
-@@ -731,6 +855,9 @@
- png_error(png_ptr, "Extra compressed data");
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_ptr->num_frames_read++;
-+#endif
- break;
- }
- if (ret != Z_OK)
-@@ -985,6 +1112,11 @@
- #if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_CONST PNG_zTXt;
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_acTL;
-+ PNG_CONST PNG_fcTL;
-+ PNG_CONST PNG_fdAT;
-+#endif
- #endif /* PNG_USE_LOCAL_ARRAYS */
-
- png_read_data(png_ptr, chunk_length, 4);
-@@ -1091,6 +1223,14 @@
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
- png_handle_iTXt(png_ptr, info_ptr, length);
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
-+ png_handle_acTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ png_handle_fcTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ png_handle_fdAT(png_ptr, info_ptr, length);
-+#endif
- else
- png_handle_unknown(png_ptr, info_ptr, length);
- } while (!(png_ptr->mode & PNG_HAVE_IEND));
-diff -ruN libpng-1.2.27/pngrtran.c libpng-1.2.27.apng/pngrtran.c
---- libpng-1.2.27/pngrtran.c 2008-04-30 10:23:13.000000000 +0000
-+++ libpng-1.2.27.apng/pngrtran.c 2008-05-01 09:49:58.000000000 +0000
-@@ -1286,7 +1286,7 @@
- * or png_read_update_info() after setting transforms that expand
- * pixels. This check added to libpng-1.2.19 */
- #if (PNG_WARN_UNINITIALIZED_ROW==1)
-- png_error(png_ptr, "Uninitialized row");
-+ png_warning(png_ptr, "Uninitialized row");
- #else
- png_warning(png_ptr, "Uninitialized row");
- #endif
-diff -ruN libpng-1.2.27/pngrutil.c libpng-1.2.27.apng/pngrutil.c
---- libpng-1.2.27/pngrutil.c 2008-04-30 10:23:13.000000000 +0000
-+++ libpng-1.2.27.apng/pngrutil.c 2008-05-01 09:49:58.000000000 +0000
-@@ -374,6 +374,11 @@
- filter_type = buf[11];
- interlace_type = buf[12];
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_ptr->first_frame_width = width;
-+ png_ptr->first_frame_height = height;
-+#endif
-+
- /* set internal variables */
- png_ptr->width = width;
- png_ptr->height = height;
-@@ -2169,6 +2174,168 @@
- }
- #endif
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+void /* PRIVATE */
-+png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-+{
-+ png_byte data[8];
-+ png_uint_32 num_frames;
-+ png_uint_32 num_plays;
-+ png_uint_32 didSet;
-+
-+ png_debug(1, "in png_handle_acTL\n");
-+
-+ if (!(png_ptr->mode & PNG_HAVE_IHDR))
-+ {
-+ png_error(png_ptr, "Missing IHDR before acTL");
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_IDAT)
-+ {
-+ png_warning(png_ptr, "Invalid acTL after IDAT skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_acTL)
-+ {
-+ png_warning(png_ptr, "Duplicate acTL skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (length != 8)
-+ {
-+ png_warning(png_ptr, "acTL with invalid length skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+
-+ png_crc_read(png_ptr, data, 8);
-+ png_crc_finish(png_ptr, 0);
-+
-+ num_frames = png_get_uint_31(png_ptr, data);
-+ num_plays = png_get_uint_31(png_ptr, data + 4);
-+
-+ /* the set function will do error checking on num_frames */
-+ didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays);
-+ if(didSet)
-+ png_ptr->mode |= PNG_HAVE_acTL;
-+}
-+
-+void /* PRIVATE */
-+png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-+{
-+ png_byte data[22];
-+ png_uint_32 width;
-+ png_uint_32 height;
-+ png_uint_32 x_offset;
-+ png_uint_32 y_offset;
-+ png_uint_16 delay_num;
-+ png_uint_16 delay_den;
-+ png_byte dispose_op;
-+ png_byte blend_op;
-+
-+ png_debug(1, "in png_handle_fcTL\n");
-+
-+ if (!(png_ptr->mode & PNG_HAVE_IHDR))
-+ {
-+ png_error(png_ptr, "Missing IHDR before fcTL");
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_IDAT)
-+ {
-+ /* for any frames other then the first this message may be misleading,
-+ * but correct. PNG_HAVE_IDAT is unset before the frame head is read
-+ * i can't think of a better message */
-+ png_warning(png_ptr, "Invalid fcTL after IDAT skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_fcTL)
-+ {
-+ png_warning(png_ptr, "Duplicate fcTL within one frame skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (length != 26)
-+ {
-+ png_warning(png_ptr, "fcTL with invalid length skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+
-+ png_ensure_sequence_number(png_ptr, length);
-+
-+ png_crc_read(png_ptr, data, 22);
-+ png_crc_finish(png_ptr, 0);
-+
-+ width = png_get_uint_31(png_ptr, data);
-+ height = png_get_uint_31(png_ptr, data + 4);
-+ x_offset = png_get_uint_31(png_ptr, data + 8);
-+ y_offset = png_get_uint_31(png_ptr, data + 12);
-+ delay_num = png_get_uint_16(data + 16);
-+ delay_den = png_get_uint_16(data + 18);
-+ dispose_op = data[20];
-+ blend_op = data[21];
-+
-+ if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0))
-+ png_error(png_ptr, "fcTL for the first frame must have zero offset");
-+ if (png_ptr->num_frames_read == 0 &&
-+ (width != info_ptr->width || height != info_ptr->height))
-+ png_error(png_ptr, "size in first frame's fcTL must match "
-+ "the size in IHDR");
-+
-+ /* the set function will do more error checking */
-+ png_set_next_frame_fcTL(png_ptr, info_ptr, width, height,
-+ x_offset, y_offset, delay_num, delay_den,
-+ dispose_op, blend_op);
-+
-+ png_read_reinit(png_ptr, info_ptr);
-+
-+ png_ptr->mode |= PNG_HAVE_fcTL;
-+}
-+
-+void /* PRIVATE */
-+png_have_info(png_structp png_ptr, png_infop info_ptr)
-+{
-+ if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL))
-+ {
-+ png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
-+ info_ptr->num_frames++;
-+ }
-+}
-+
-+void /* PRIVATE */
-+png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-+{
-+ png_ensure_sequence_number(png_ptr, length);
-+
-+ /* This function is only called from png_read_end(), png_read_info(),
-+ * and png_push_read_chunk() which means that:
-+ * - the user doesn't want to read this frame
-+ * - or this is an out-of-place fdAT
-+ * in either case it is safe to ignore the chunk with a warning */
-+ png_warning(png_ptr, "ignoring fdAT chunk");
-+ png_crc_finish(png_ptr, length - 4);
-+}
-+
-+void /* PRIVATE */
-+png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length)
-+{
-+ png_byte data[4];
-+ png_uint_32 sequence_number;
-+
-+ if (length < 4)
-+ png_error(png_ptr, "invalid fcTL or fdAT chunk found");
-+
-+ png_crc_read(png_ptr, data, 4);
-+ sequence_number = png_get_uint_31(png_ptr, data);
-+
-+ if (sequence_number != png_ptr->next_seq_num)
-+ png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence "
-+ "number found");
-+
-+ png_ptr->next_seq_num++;
-+}
-+#endif /* PNG_READ_APNG_SUPPORTED */
-+
- /* This function is called when we haven't found a handler for a
- chunk. If there isn't a problem with the chunk itself (ie bad
- chunk name, CRC, or a critical chunk), the chunk is silently ignored
-@@ -3180,4 +3347,82 @@
-
- png_ptr->flags |= PNG_FLAG_ROW_INIT;
- }
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+/* This function is to be called after the main IDAT set has been read and
-+ * before a new IDAT is read. It resets some parts of png_ptr
-+ * to make them usable by the read functions again */
-+void /* PRIVATE */
-+png_read_reset(png_structp png_ptr)
-+{
-+ png_ptr->mode &= ~PNG_HAVE_IDAT;
-+ png_ptr->mode &= ~PNG_AFTER_IDAT;
-+ png_ptr->row_number = 0;
-+ png_ptr->pass = 0;
-+ png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
-+}
-+
-+void /* PRIVATE */
-+png_read_reinit(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_ptr->width = info_ptr->next_frame_width;
-+ png_ptr->height = info_ptr->next_frame_height;
-+ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width);
-+}
-+
-+/* same as png_read_reset() but for the progressive reader */
-+void /* PRIVATE */
-+png_progressive_read_reset(png_structp png_ptr)
-+{
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ /* start of interlace block */
-+ const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
-+
-+ /* offset to next interlace block */
-+ const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
-+
-+ /* start of interlace block in the y direction */
-+ const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
-+
-+ /* offset to next interlace block in the y direction */
-+ const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
-+#endif
-+ png_uint_32 row_bytes;
-+
-+ if (png_ptr->interlaced)
-+ {
-+ if (!(png_ptr->transformations & PNG_INTERLACE))
-+ png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
-+ png_pass_ystart[0]) / png_pass_yinc[0];
-+ else
-+ png_ptr->num_rows = png_ptr->height;
-+
-+ png_ptr->iwidth = (png_ptr->width +
-+ png_pass_inc[png_ptr->pass] - 1 -
-+ png_pass_start[png_ptr->pass]) /
-+ png_pass_inc[png_ptr->pass];
-+
-+ row_bytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->iwidth) + 1;
-+
-+ png_ptr->irowbytes = (png_size_t)row_bytes;
-+ if((png_uint_32)png_ptr->irowbytes != row_bytes)
-+ png_error(png_ptr, "png_progressive_read_reset(): Rowbytes "
-+ "overflow");
-+ }
-+ else
-+ {
-+ png_ptr->num_rows = png_ptr->height;
-+ png_ptr->iwidth = png_ptr->width;
-+ png_ptr->irowbytes = png_ptr->rowbytes + 1;
-+ }
-+
-+ png_ptr->flags &= ~PNG_FLAG_ZLIB_FINISHED;
-+ if (inflateReset(&(png_ptr->zstream)) != Z_OK)
-+ png_error(png_ptr, "inflateReset failed");
-+ png_ptr->zstream.avail_in = 0;
-+ png_ptr->zstream.next_in = 0;
-+ png_ptr->zstream.next_out = png_ptr->row_buf;
-+ png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
-+}
-+#endif /* PNG_READ_APNG_SUPPORTED */
- #endif /* PNG_READ_SUPPORTED */
-diff -ruN libpng-1.2.27/pngset.c libpng-1.2.27.apng/pngset.c
---- libpng-1.2.27/pngset.c 2008-04-30 10:23:13.000000000 +0000
-+++ libpng-1.2.27.apng/pngset.c 2008-05-01 09:49:58.000000000 +0000
-@@ -364,6 +364,11 @@
- info_ptr->rowbytes = (png_size_t)0;
- else
- info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth,width);
-+
-+#if defined(PNG_APNG_SUPPORTED)
-+ /* for non-animated png. this may be overritten from an acTL chunk later */
-+ info_ptr->num_frames = 1;
-+#endif
- }
-
- #if defined(PNG_oFFs_SUPPORTED)
-@@ -1025,6 +1030,141 @@
- }
- #endif /* PNG_sPLT_SUPPORTED */
-
-+#if defined(PNG_APNG_SUPPORTED)
-+png_uint_32 PNGAPI
-+png_set_acTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 num_frames, png_uint_32 num_plays)
-+{
-+ png_debug1(1, "in %s storage function\n", "acTL");
-+
-+ if (png_ptr == NULL || info_ptr == NULL)
-+ {
-+ png_warning(png_ptr,
-+ "Call to png_set_acTL() with NULL png_ptr "
-+ "or info_ptr ignored");
-+ return (0);
-+ }
-+ if (num_frames == 0)
-+ {
-+ png_warning(png_ptr,
-+ "Ignoring attempt to set acTL with num_frames zero");
-+ return (0);
-+ }
-+ if (num_frames > PNG_UINT_31_MAX)
-+ {
-+ png_warning(png_ptr,
-+ "Ignoring attempt to set acTL with num_frames > 2^31-1");
-+ return (0);
-+ }
-+ if (num_plays > PNG_UINT_31_MAX)
-+ {
-+ png_warning(png_ptr,
-+ "Ignoring attempt to set acTL with num_plays "
-+ "> 2^31-1");
-+ return (0);
-+ }
-+
-+ info_ptr->num_frames = num_frames;
-+ info_ptr->num_plays = num_plays;
-+
-+ info_ptr->valid |= PNG_INFO_acTL;
-+
-+ return (1);
-+}
-+
-+/* delay_num and delay_den can hold any 16-bit values including zero */
-+png_uint_32 PNGAPI
-+png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op)
-+{
-+ png_debug1(1, "in %s storage function\n", "fcTL");
-+
-+ if (png_ptr == NULL || info_ptr == NULL)
-+ {
-+ png_warning(png_ptr,
-+ "Call to png_set_fcTL() with NULL png_ptr or info_ptr "
-+ "ignored");
-+ return (0);
-+ }
-+
-+ png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
-+ delay_num, delay_den, dispose_op, blend_op);
-+
-+ info_ptr->next_frame_width = width;
-+ info_ptr->next_frame_height = height;
-+ info_ptr->next_frame_x_offset = x_offset;
-+ info_ptr->next_frame_y_offset = y_offset;
-+ info_ptr->next_frame_delay_num = delay_num;
-+ info_ptr->next_frame_delay_den = delay_den;
-+ info_ptr->next_frame_dispose_op = dispose_op;
-+ info_ptr->next_frame_blend_op = blend_op;
-+
-+ info_ptr->valid |= PNG_INFO_fcTL;
-+
-+ return (1);
-+}
-+
-+void /* PRIVATE */
-+png_ensure_fcTL_is_valid(png_structp png_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op)
-+{
-+ if (width + x_offset > png_ptr->first_frame_width ||
-+ height + y_offset > png_ptr->first_frame_height)
-+ png_error(png_ptr, "dimensions of a frame are greater than"
-+ "the ones in IHDR");
-+ if (width > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid width in fcTL (> 2^31-1)");
-+ if (height > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid height in fcTL (> 2^31-1)");
-+ if (x_offset > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)");
-+ if (y_offset > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)");
-+
-+ if (dispose_op != PNG_DISPOSE_OP_NONE &&
-+ dispose_op != PNG_DISPOSE_OP_BACKGROUND &&
-+ dispose_op != PNG_DISPOSE_OP_PREVIOUS)
-+ png_error(png_ptr, "invalid dispose_op in fcTL");
-+
-+ if (blend_op != PNG_BLEND_OP_SOURCE &&
-+ blend_op != PNG_BLEND_OP_OVER)
-+ png_error(png_ptr, "invalid blend_op in fcTL");
-+
-+ if (blend_op == PNG_BLEND_OP_OVER) {
-+ if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
-+ png_error(png_ptr, "PNG_BLEND_OP_OVER is not valid for "
-+ "color type 'greyscale without alpha'");
-+ else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) &&
-+ !(png_ptr->color_type & PNG_COLOR_MASK_ALPHA))
-+ png_error(png_ptr, "PNG_BLEND_OP_OVER is not valid for "
-+ "color type 'truecolor without alpha'");
-+ }
-+}
-+
-+png_uint_32 PNGAPI
-+png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr,
-+ png_byte is_hidden)
-+{
-+ png_debug(1, "in png_first_frame_is_hidden()\n");
-+
-+ if (png_ptr == NULL)
-+ return 0;
-+
-+ if(is_hidden)
-+ png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
-+ else
-+ png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN;
-+
-+ return 1;
-+}
-+#endif /* PNG_APNG_SUPPORTED */
-+
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- void PNGAPI
- png_set_unknown_chunks(png_structp png_ptr,
-diff -ruN libpng-1.2.27/pngtrans.c libpng-1.2.27.apng/pngtrans.c
---- libpng-1.2.27/pngtrans.c 2008-04-30 10:23:14.000000000 +0000
-+++ libpng-1.2.27.apng/pngtrans.c 2008-05-01 09:49:58.000000000 +0000
-@@ -652,11 +652,10 @@
- png_voidp PNGAPI
- png_get_user_transform_ptr(png_structp png_ptr)
- {
--#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if (png_ptr == NULL) return (NULL);
-+#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- return ((png_voidp)png_ptr->user_transform_ptr);
--#else
-- return (NULL);
- #endif
-+ return (NULL);
- }
- #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */
-diff -ruN libpng-1.2.27/pngwrite.c libpng-1.2.27.apng/pngwrite.c
---- libpng-1.2.27/pngwrite.c 2008-04-30 10:23:14.000000000 +0000
-+++ libpng-1.2.27.apng/pngwrite.c 2008-05-01 09:49:58.000000000 +0000
-@@ -263,6 +263,10 @@
- }
- }
- #endif
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ if (info_ptr->valid & PNG_INFO_acTL)
-+ png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays);
-+#endif
- #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
- if (info_ptr->unknown_chunks_num)
- {
-@@ -301,6 +305,10 @@
- return;
- if (!(png_ptr->mode & PNG_HAVE_IDAT))
- png_error(png_ptr, "No IDATs written into file");
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ if (png_ptr->num_frames_written != png_ptr->num_frames_to_write)
-+ png_error(png_ptr, "Not enough frames written");
-+#endif
-
- /* see if user wants us to write information chunks */
- if (info_ptr != NULL)
-@@ -1529,4 +1537,39 @@
- params = params;
- }
- #endif
-+
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+void PNGAPI
-+png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
-+ png_bytepp row_pointers, png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op)
-+{
-+ png_debug(1, "in png_write_frame_head\n");
-+
-+ /* there is a chance this has been set after png_write_info was called,
-+ * so it would be set but not written. is there a way to be sure? */
-+ if (!(info_ptr->valid & PNG_INFO_acTL))
-+ png_error(png_ptr, "png_write_frame_head(): acTL not set");
-+
-+ png_write_reset(png_ptr);
-+
-+ png_write_reinit(png_ptr, info_ptr, width, height);
-+
-+ if ( !(png_ptr->num_frames_written == 0 &&
-+ (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) )
-+ png_write_fcTL(png_ptr, width, height, x_offset, y_offset,
-+ delay_num, delay_den, dispose_op, blend_op);
-+}
-+
-+void PNGAPI
-+png_write_frame_tail(png_structp png_ptr, png_infop png_info)
-+{
-+ png_debug(1, "in png_write_frame_tail\n");
-+
-+ png_ptr->num_frames_written++;
-+}
-+#endif /* PNG_WRITE_APNG_SUPPORTED */
-+
- #endif /* PNG_WRITE_SUPPORTED */
-diff -ruN libpng-1.2.27/pngwutil.c libpng-1.2.27.apng/pngwutil.c
---- libpng-1.2.27/pngwutil.c 2008-04-30 10:23:14.000000000 +0000
-+++ libpng-1.2.27.apng/pngwutil.c 2008-05-01 09:49:58.000000000 +0000
-@@ -498,6 +498,11 @@
- /* write the chunk */
- png_write_chunk(png_ptr, png_IHDR, buf, (png_size_t)13);
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ png_ptr->first_frame_width = width;
-+ png_ptr->first_frame_height = height;
-+#endif
-+
- /* initialize zlib with PNG info */
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
-@@ -619,6 +624,9 @@
- {
- #ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ PNG_fdAT;
-+#endif
- #endif
- png_debug(1, "in png_write_IDAT\n");
-
-@@ -661,7 +669,28 @@
- "Invalid zlib compression method or flags in IDAT");
- }
-
-- png_write_chunk(png_ptr, png_IDAT, data, length);
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ if(png_ptr->num_frames_written == 0)
-+#endif
-+ png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length);
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ else
-+ {
-+ png_byte buf[4];
-+
-+ png_write_chunk_start(png_ptr, (png_bytep)png_fdAT, 4 + length);
-+
-+ png_save_uint_32(buf, png_ptr->next_seq_num);
-+ png_write_chunk_data(png_ptr, buf, 4);
-+
-+ png_write_chunk_data(png_ptr, data, length);
-+
-+ png_write_chunk_end(png_ptr);
-+
-+ png_ptr->next_seq_num++;
-+ }
-+#endif
-+
- png_ptr->mode |= PNG_HAVE_IDAT;
- }
-
-@@ -673,7 +702,7 @@
- PNG_IEND;
- #endif
- png_debug(1, "in png_write_IEND\n");
-- png_write_chunk(png_ptr, png_IEND, png_bytep_NULL,
-+ png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL,
- (png_size_t)0);
- png_ptr->mode |= PNG_HAVE_IEND;
- }
-@@ -1732,6 +1761,70 @@
- }
- #endif
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+void /* PRIVATE */
-+png_write_acTL(png_structp png_ptr,
-+ png_uint_32 num_frames, png_uint_32 num_plays)
-+{
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ PNG_acTL;
-+#endif
-+ png_byte data[16];
-+
-+ png_debug(1, "in png_write_acTL\n");
-+
-+ png_ptr->num_frames_to_write = num_frames;
-+
-+ if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN)
-+ num_frames--;
-+
-+ png_save_uint_32(data, num_frames);
-+ png_save_uint_32(data + 4, num_plays);
-+
-+ png_write_chunk(png_ptr, (png_bytep)png_acTL, data, (png_size_t)8);
-+}
-+
-+void /* PRIVATE */
-+png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op)
-+{
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ PNG_fcTL;
-+#endif
-+ png_byte data[26];
-+
-+ png_debug(1, "in png_write_fcTL\n");
-+
-+ if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0))
-+ png_error(png_ptr, "x and/or y offset for the first frame aren't 0\n");
-+ if (png_ptr->num_frames_written == 0 &&
-+ (width != png_ptr->first_frame_width ||
-+ height != png_ptr->first_frame_height))
-+ png_error(png_ptr, "width and/or height in the first frame's fcTL "
-+ "don't match the ones in IHDR\n");
-+
-+ /* more error checking */
-+ png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
-+ delay_num, delay_den, dispose_op, blend_op);
-+
-+ png_save_uint_32(data, png_ptr->next_seq_num);
-+ png_save_uint_32(data + 4, width);
-+ png_save_uint_32(data + 8, height);
-+ png_save_uint_32(data + 12, x_offset);
-+ png_save_uint_32(data + 16, y_offset);
-+ png_save_uint_16(data + 20, delay_num);
-+ png_save_uint_16(data + 22, delay_den);
-+ data[24] = dispose_op;
-+ data[25] = blend_op;
-+
-+ png_write_chunk(png_ptr, (png_bytep)png_fcTL, data, (png_size_t)26);
-+
-+ png_ptr->next_seq_num++;
-+}
-+#endif /* PNG_WRITE_APNG_SUPPORTED */
-+
- /* initializes the row writing capability of libpng */
- void /* PRIVATE */
- png_write_start_row(png_structp png_ptr)
-@@ -2799,4 +2892,39 @@
- }
- #endif
- }
-+
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+void /* PRIVATE */
-+png_write_reset(png_structp png_ptr)
-+{
-+ png_ptr->row_number = 0;
-+ png_ptr->pass = 0;
-+ png_ptr->mode &= ~PNG_HAVE_IDAT;
-+}
-+
-+void /* PRIVATE */
-+png_write_reinit(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 width, png_uint_32 height)
-+{
-+ if (png_ptr->num_frames_written == 0 &&
-+ (width != png_ptr->first_frame_width ||
-+ height != png_ptr->first_frame_height))
-+ png_error(png_ptr, "width and/or height in the first frame's fcTL "
-+ "don't match the ones in IHDR\n");
-+ if (width > png_ptr->first_frame_width ||
-+ height > png_ptr->first_frame_height)
-+ png_error(png_ptr, "width and/or height for a frame greater than"
-+ "the ones in IHDR");
-+
-+ png_set_IHDR(png_ptr, info_ptr, width, height,
-+ info_ptr->bit_depth, info_ptr->color_type,
-+ info_ptr->interlace_type, info_ptr->compression_type,
-+ info_ptr->filter_type);
-+
-+ png_ptr->width = width;
-+ png_ptr->height = height;
-+ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width);
-+ png_ptr->usr_width = png_ptr->width;
-+}
-+#endif
- #endif /* PNG_WRITE_SUPPORTED */
diff --git a/abs/core/libpng/libpng-1.2.31-apng.patch b/abs/core/libpng/libpng-1.2.31-apng.patch
deleted file mode 100644
index 92bd20a..0000000
--- a/abs/core/libpng/libpng-1.2.31-apng.patch
+++ /dev/null
@@ -1,1644 +0,0 @@
-Index: pngread.c
-===================================================================
---- pngread.c (rvision 149)
-+++ pngread.c (copie de travail)
-@@ -407,6 +407,11 @@
- #if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_CONST PNG_zTXt;
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_acTL;
-+ PNG_CONST PNG_fcTL;
-+ PNG_CONST PNG_fdAT;
-+#endif
- #endif /* PNG_USE_LOCAL_ARRAYS */
- png_uint_32 length = png_read_chunk_header(png_ptr);
- PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
-@@ -451,6 +456,9 @@
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_have_info(png_ptr, info_ptr);
-+#endif
- png_ptr->idat_size = length;
- png_ptr->mode |= PNG_HAVE_IDAT;
- break;
-@@ -523,12 +531,97 @@
- else if (!png_memcmp(chunk_name, png_iTXt, 4))
- png_handle_iTXt(png_ptr, info_ptr, length);
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
-+ png_handle_acTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ png_handle_fcTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ png_handle_fdAT(png_ptr, info_ptr, length);
-+#endif
- else
- png_handle_unknown(png_ptr, info_ptr, length);
- }
- }
- #endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+void PNGAPI
-+png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */
-+
-+ png_debug(0, "Reading frame head\n");
-+
-+ if (!(png_ptr->mode & PNG_HAVE_acTL))
-+ png_error(png_ptr, "attempt to png_read_frame_head() but "
-+ "no acTL present");
-+
-+ /* do nothing for the main IDAT */
-+ if (png_ptr->num_frames_read == 0)
-+ return;
-+
-+ png_crc_finish(png_ptr, 0); /* CRC from last IDAT or fdAT chunk */
-+
-+ png_read_reset(png_ptr);
-+ png_ptr->mode &= ~PNG_HAVE_fcTL;
-+
-+ have_chunk_after_DAT = 0;
-+ for (;;)
-+ {
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ PNG_IDAT;
-+ PNG_fdAT;
-+ PNG_fcTL;
-+#endif
-+ png_byte chunk_length[4];
-+ png_uint_32 length;
-+
-+ png_read_data(png_ptr, chunk_length, 4);
-+ length = png_get_uint_31(png_ptr, chunk_length);
-+
-+ png_reset_crc(png_ptr);
-+ png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-+
-+ if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+ {
-+ /* discard trailing IDATs for the first frame */
-+ if (have_chunk_after_DAT || png_ptr->num_frames_read > 1)
-+ png_error(png_ptr, "png_read_frame_head(): out of place IDAT");
-+ png_crc_finish(png_ptr, length);
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ {
-+ png_handle_fcTL(png_ptr, info_ptr, length);
-+ have_chunk_after_DAT = 1;
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ png_ensure_sequence_number(png_ptr, length);
-+
-+ /* discard trailing fdATs for frames other than the first */
-+ if (!have_chunk_after_DAT && png_ptr->num_frames_read > 1)
-+ png_crc_finish(png_ptr, length - 4);
-+ else if(png_ptr->mode & PNG_HAVE_fcTL)
-+ {
-+ png_ptr->idat_size = length - 4;
-+ png_ptr->mode |= PNG_HAVE_IDAT;
-+
-+ break;
-+ }
-+ else
-+ png_error(png_ptr, "png_read_frame_head(): out of place fdAT");
-+ }
-+ else
-+ {
-+ png_warning(png_ptr, "Skipped (ignored) a chunk "
-+ "between APNG chunks");
-+ png_crc_finish(png_ptr, length);
-+ }
-+ }
-+}
-+#endif /* PNG_READ_APNG_SUPPORTED */
-+
- /* optional call to update the users info_ptr structure */
- void PNGAPI
- png_read_update_info(png_structp png_ptr, png_infop info_ptr)
-@@ -565,6 +658,10 @@
- {
- #ifdef PNG_USE_LOCAL_ARRAYS
- PNG_CONST PNG_IDAT;
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_fdAT;
-+ PNG_CONST PNG_IEND;
-+#endif
- PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
- 0xff};
- PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
-@@ -694,13 +791,40 @@
- {
- if (!(png_ptr->zstream.avail_in))
- {
-- while (!png_ptr->idat_size)
-+ png_uint_32 bytes_to_skip = 0;
-+
-+ while (!png_ptr->idat_size || bytes_to_skip != 0)
- {
-- png_crc_finish(png_ptr, 0);
-+ png_crc_finish(png_ptr, bytes_to_skip);
-+ bytes_to_skip = 0;
-
- png_ptr->idat_size = png_read_chunk_header(png_ptr);
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_ptr->num_frames_read == 0)
-+ {
-+#endif
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- png_error(png_ptr, "Not enough image data");
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ }
-+ else
-+ {
-+ if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
-+ png_error(png_ptr, "Not enough image data");
-+ if (png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ png_warning(png_ptr, "Skipped (ignored) a chunk "
-+ "between APNG chunks");
-+ bytes_to_skip = png_ptr->idat_size;
-+ continue;
-+ }
-+
-+ png_ensure_sequence_number(png_ptr, png_ptr->idat_size);
-+
-+ png_ptr->idat_size -= 4;
-+ }
-+#endif
- }
- png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_in = png_ptr->zbuf;
-@@ -718,6 +842,9 @@
- png_error(png_ptr, "Extra compressed data");
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_ptr->num_frames_read++;
-+#endif
- break;
- }
- if (ret != Z_OK)
-@@ -969,6 +1096,11 @@
- #if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_CONST PNG_zTXt;
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_acTL;
-+ PNG_CONST PNG_fcTL;
-+ PNG_CONST PNG_fdAT;
-+#endif
- #endif /* PNG_USE_LOCAL_ARRAYS */
- png_uint_32 length = png_read_chunk_header(png_ptr);
- PNG_CONST png_bytep chunk_name = png_ptr->chunk_name;
-@@ -1069,6 +1201,14 @@
- else if (!png_memcmp(chunk_name, png_iTXt, 4))
- png_handle_iTXt(png_ptr, info_ptr, length);
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
-+ png_handle_acTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ png_handle_fcTL(png_ptr, info_ptr, length);
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ png_handle_fdAT(png_ptr, info_ptr, length);
-+#endif
- else
- png_handle_unknown(png_ptr, info_ptr, length);
- } while (!(png_ptr->mode & PNG_HAVE_IEND));
-Index: pngget.c
-===================================================================
---- pngget.c (rvision 149)
-+++ pngget.c (copie de travail)
-@@ -797,6 +797,167 @@
- }
- #endif
-
-+#if defined(PNG_APNG_SUPPORTED)
-+png_uint_32 PNGAPI
-+png_get_acTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 *num_frames, png_uint_32 *num_plays)
-+{
-+ png_debug1(1, "in %s retrieval function\n", "acTL");
-+
-+ if (png_ptr != NULL && info_ptr != NULL &&
-+ (info_ptr->valid & PNG_INFO_acTL) &&
-+ num_frames != NULL && num_plays != NULL)
-+ {
-+ *num_frames = info_ptr->num_frames;
-+ *num_plays = info_ptr->num_plays;
-+ return (1);
-+ }
-+
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_num_frames(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_num_frames()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->num_frames);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_num_plays(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_num_plays()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->num_plays);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 *width, png_uint_32 *height,
-+ png_uint_32 *x_offset, png_uint_32 *y_offset,
-+ png_uint_16 *delay_num, png_uint_16 *delay_den,
-+ png_byte *dispose_op, png_byte *blend_op)
-+{
-+ png_debug1(1, "in %s retrieval function\n", "fcTL");
-+
-+ if (png_ptr != NULL && info_ptr != NULL &&
-+ (info_ptr->valid & PNG_INFO_fcTL) &&
-+ width != NULL && height != NULL &&
-+ x_offset != NULL && x_offset != NULL &&
-+ delay_num != NULL && delay_den != NULL &&
-+ dispose_op != NULL && blend_op != NULL)
-+ {
-+ *width = info_ptr->next_frame_width;
-+ *height = info_ptr->next_frame_height;
-+ *x_offset = info_ptr->next_frame_x_offset;
-+ *y_offset = info_ptr->next_frame_y_offset;
-+ *delay_num = info_ptr->next_frame_delay_num;
-+ *delay_den = info_ptr->next_frame_delay_den;
-+ *dispose_op = info_ptr->next_frame_dispose_op;
-+ *blend_op = info_ptr->next_frame_blend_op;
-+ return (1);
-+ }
-+
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_width()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_width);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_height()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_height);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_x_offset()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_x_offset);
-+ return (0);
-+}
-+
-+png_uint_32 PNGAPI
-+png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_y_offset()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_y_offset);
-+ return (0);
-+}
-+
-+png_uint_16 PNGAPI
-+png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_delay_num()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_delay_num);
-+ return (0);
-+}
-+
-+png_uint_16 PNGAPI
-+png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_delay_den()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_delay_den);
-+ return (0);
-+}
-+
-+png_byte PNGAPI
-+png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_dispose_op()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_dispose_op);
-+ return (0);
-+}
-+
-+png_byte PNGAPI
-+png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_get_next_frame_blend_op()\n");
-+
-+ if (png_ptr != NULL && info_ptr != NULL)
-+ return (info_ptr->next_frame_blend_op);
-+ return (0);
-+}
-+
-+png_byte PNGAPI
-+png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_debug(1, "in png_first_frame_is_hidden()\n");
-+
-+ if (png_ptr != NULL)
-+ return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN);
-+
-+ return 0;
-+}
-+#endif /* PNG_APNG_SUPPORTED */
-+
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- png_uint_32 PNGAPI
- png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,
-Index: png.c
-===================================================================
---- png.c (rvision 149)
-+++ png.c (copie de travail)
-@@ -51,6 +51,9 @@
- PNG_tIME;
- PNG_tRNS;
- PNG_zTXt;
-+PNG_acTL;
-+PNG_fcTL;
-+PNG_fdAT;
-
- #ifdef PNG_READ_SUPPORTED
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-Index: png.h
-===================================================================
---- png.h (rvision 149)
-+++ png.h (copie de travail)
-@@ -949,6 +949,19 @@
- png_fixed_point int_y_blue;
- #endif
-
-+#if defined(PNG_APNG_SUPPORTED)
-+ png_uint_32 num_frames; /* including default image */
-+ png_uint_32 num_plays;
-+ png_uint_32 next_frame_width;
-+ png_uint_32 next_frame_height;
-+ png_uint_32 next_frame_x_offset;
-+ png_uint_32 next_frame_y_offset;
-+ png_uint_16 next_frame_delay_num;
-+ png_uint_16 next_frame_delay_den;
-+ png_byte next_frame_dispose_op;
-+ png_byte next_frame_blend_op;
-+#endif
-+
- } png_info;
-
- typedef png_info FAR * png_infop;
-@@ -1050,6 +1063,8 @@
- #define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
- #define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
- #define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */
-+#define PNG_INFO_acTL 0x10000L
-+#define PNG_INFO_fcTL 0x20000L
-
- /* This is used for the transformation routines, as some of them
- * change these values for the row. It also should enable using
-@@ -1090,7 +1105,11 @@
- typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop));
- typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep,
- png_uint_32, int));
-+#if defined(PNG_APNG_SUPPORTED)
-+typedef void (PNGAPI *png_progressive_frame_ptr) PNGARG((png_structp,
-+ png_uint_32));
- #endif
-+#endif
-
- #if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
-@@ -1421,6 +1440,39 @@
- png_uint_32 user_height_max;
- #endif
-
-+#if defined(PNG_APNG_SUPPORTED)
-+ png_uint_32 apng_flags;
-+ png_uint_32 next_seq_num; /* next fcTL/fdAT chunk sequence number */
-+ png_uint_32 first_frame_width;
-+ png_uint_32 first_frame_height;
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_uint_32 num_frames_read; /* incremented after all image data of */
-+ /* a frame is read */
-+#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-+ png_progressive_frame_ptr frame_info_fn; /* frame info read callback */
-+ png_progressive_frame_ptr frame_end_fn; /* frame data read callback */
-+#endif
-+#endif
-+
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ png_uint_32 num_frames_to_write;
-+ png_uint_32 num_frames_written;
-+#endif
-+#endif
-+
-+/* For png_struct.apng_flags: */
-+#define PNG_FIRST_FRAME_HIDDEN 0x0001
-+
-+/* dispose_op flags from inside fcTL */
-+#define PNG_DISPOSE_OP_NONE 0x00
-+#define PNG_DISPOSE_OP_BACKGROUND 0x01
-+#define PNG_DISPOSE_OP_PREVIOUS 0x02
-+
-+/* blend_op flags from inside fcTL */
-+#define PNG_BLEND_OP_SOURCE 0x00
-+#define PNG_BLEND_OP_OVER 0x01
-+
- /* New member added in libpng-1.0.25 and 1.2.17 */
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* storage for unknown chunk that the library doesn't recognize. */
-@@ -1747,6 +1799,18 @@
- extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
- png_bytepp image));
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+extern PNG_EXPORT (void,png_write_frame_head) PNGARG((png_structp png_ptr,
-+ png_infop png_info, png_bytepp row_pointers,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op));
-+
-+extern PNG_EXPORT (void,png_write_frame_tail) PNGARG((png_structp png_ptr,
-+ png_infop png_info));
-+#endif
-+
- /* writes the end of the PNG file. */
- extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-@@ -1995,6 +2059,11 @@
- png_voidp progressive_ptr,
- png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
- png_progressive_end_ptr end_fn));
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+extern PNG_EXPORT(void,png_set_progressive_frame_fn) PNGARG((png_structp png_ptr,
-+ png_progressive_frame_ptr frame_info_fn,
-+ png_progressive_frame_ptr frame_end_fn));
-+#endif
-
- /* returns the user pointer associated with the push read functions */
- extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
-@@ -2432,6 +2501,59 @@
- #endif
- #endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */
-
-+#if defined(PNG_APNG_SUPPORTED)
-+extern PNG_EXPORT(png_uint_32,png_get_acTL) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr, png_uint_32 *num_frames, png_uint_32 *num_plays));
-+extern PNG_EXPORT(png_uint_32,png_set_acTL) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr, png_uint_32 num_frames, png_uint_32 num_plays));
-+extern PNG_EXPORT(png_uint_32,png_get_num_frames) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_num_plays)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_fcTL)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 *width,
-+ png_uint_32 *height, png_uint_32 *x_offset, png_uint_32 *y_offset,
-+ png_uint_16 *delay_num, png_uint_16 *delay_den, png_byte *dispose_op,
-+ png_byte *blend_op));
-+extern PNG_EXPORT(png_uint_32,png_set_next_frame_fcTL)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr, png_uint_32 width,
-+ png_uint_32 height, png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op));
-+extern PNG_EXPORT(void,png_ensure_fcTL_is_valid)
-+ PNGARG((png_structp png_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_width)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_height)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_x_offset)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_get_next_frame_y_offset)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_num)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_16,png_get_next_frame_delay_den)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_byte,png_get_next_frame_dispose_op)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_byte,png_get_next_frame_blend_op)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_byte,png_get_first_frame_is_hidden)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr));
-+extern PNG_EXPORT(png_uint_32,png_set_first_frame_is_hidden)
-+ PNGARG((png_structp png_ptr, png_infop info_ptr, png_byte is_hidden));
-+#endif /* PNG_APNG_SUPPORTED */
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+extern PNG_EXPORT(void,png_read_frame_head) PNGARG((png_structp png_ptr,
-+ png_infop info_ptr));
-+#endif
-+
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* provide a list of chunks and how they are to be handled, if the built-in
- handling or default unknown chunk handling is not desired. Any chunks not
-@@ -2738,6 +2860,8 @@
- #define PNG_BACKGROUND_IS_GRAY 0x800
- #define PNG_HAVE_PNG_SIGNATURE 0x1000
- #define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */
-+#define PNG_HAVE_acTL 0x4000
-+#define PNG_HAVE_fcTL 0x8000L
-
- /* flags for the transformations the PNG library does on the image data */
- #define PNG_BGR 0x0001
-@@ -2878,6 +3002,9 @@
- #define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'}
- #define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
- #define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
-+#define PNG_acTL png_byte png_acTL[5] = { 97, 99, 84, 76, '\0'}
-+#define PNG_fcTL png_byte png_fcTL[5] = {102, 99, 84, 76, '\0'}
-+#define PNG_fdAT png_byte png_fdAT[5] = {102, 100, 65, 84, '\0'}
-
- #ifdef PNG_USE_GLOBAL_ARRAYS
- PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5];
-@@ -2901,6 +3028,9 @@
- PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5];
- PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5];
- PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5];
-+PNG_EXPORT_VAR (png_byte FARDATA) png_acTL[5];
-+PNG_EXPORT_VAR (png_byte FARDATA) png_fcTL[5];
-+PNG_EXPORT_VAR (png_byte FARDATA) png_fdAT[5];
- #endif /* PNG_USE_GLOBAL_ARRAYS */
-
- #if defined(PNG_1_0_X) || defined (PNG_1_2_X)
-@@ -3175,6 +3305,17 @@
- #endif
- #endif
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+PNG_EXTERN void png_write_acTL PNGARG((png_structp png_ptr,
-+ png_uint_32 num_frames, png_uint_32 num_plays));
-+
-+PNG_EXTERN void png_write_fcTL PNGARG((png_structp png_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op));
-+#endif
-+
- /* Called when finished processing a row of data */
- PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
-
-@@ -3226,6 +3367,20 @@
- PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+/* private, reset some things to become ready for reading next frame */
-+PNG_EXTERN void png_read_reset PNGARG((png_structp png_ptr));
-+PNG_EXTERN void png_read_reinit PNGARG((png_structp png_ptr,
-+ png_infop info_ptr));
-+PNG_EXTERN void png_progressive_read_reset PNGARG((png_structp png_ptr));
-+#endif
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+/* private, reset some things to become ready for writing next frame */
-+PNG_EXTERN void png_write_reset PNGARG((png_structp png_ptr));
-+PNG_EXTERN void png_write_reinit PNGARG((png_structp png_ptr,
-+ png_infop info_ptr, png_uint_32 width, png_uint_32 height));
-+#endif
-+
- /* these are the functions that do the transformations */
- #if defined(PNG_READ_FILLER_SUPPORTED)
- PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
-@@ -3441,6 +3596,18 @@
- png_uint_32 length));
- #endif
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+PNG_EXTERN void png_handle_acTL PNGARG((png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 length));
-+PNG_EXTERN void png_handle_fcTL PNGARG((png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 length));
-+PNG_EXTERN void png_have_info PNGARG((png_structp png_ptr, png_infop info_ptr));
-+PNG_EXTERN void png_handle_fdAT PNGARG((png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 length));
-+PNG_EXTERN void png_ensure_sequence_number PNGARG((png_structp png_ptr,
-+ png_uint_32 length));
-+#endif
-+
- PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-
-Index: pngwrite.c
-===================================================================
---- pngwrite.c (rvision 149)
-+++ pngwrite.c (copie de travail)
-@@ -261,6 +261,10 @@
- }
- }
- #endif
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ if (info_ptr->valid & PNG_INFO_acTL)
-+ png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays);
-+#endif
- #if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
- if (info_ptr->unknown_chunks_num)
- {
-@@ -299,6 +303,10 @@
- return;
- if (!(png_ptr->mode & PNG_HAVE_IDAT))
- png_error(png_ptr, "No IDATs written into file");
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ if (png_ptr->num_frames_written != png_ptr->num_frames_to_write)
-+ png_error(png_ptr, "Not enough frames written");
-+#endif
-
- /* see if user wants us to write information chunks */
- if (info_ptr != NULL)
-@@ -1527,4 +1535,39 @@
- params = params;
- }
- #endif
-+
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+void PNGAPI
-+png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
-+ png_bytepp row_pointers, png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op)
-+{
-+ png_debug(1, "in png_write_frame_head\n");
-+
-+ /* there is a chance this has been set after png_write_info was called,
-+ * so it would be set but not written. is there a way to be sure? */
-+ if (!(info_ptr->valid & PNG_INFO_acTL))
-+ png_error(png_ptr, "png_write_frame_head(): acTL not set");
-+
-+ png_write_reset(png_ptr);
-+
-+ png_write_reinit(png_ptr, info_ptr, width, height);
-+
-+ if ( !(png_ptr->num_frames_written == 0 &&
-+ (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) )
-+ png_write_fcTL(png_ptr, width, height, x_offset, y_offset,
-+ delay_num, delay_den, dispose_op, blend_op);
-+}
-+
-+void PNGAPI
-+png_write_frame_tail(png_structp png_ptr, png_infop png_info)
-+{
-+ png_debug(1, "in png_write_frame_tail\n");
-+
-+ png_ptr->num_frames_written++;
-+}
-+#endif /* PNG_WRITE_APNG_SUPPORTED */
-+
- #endif /* PNG_WRITE_SUPPORTED */
-Index: pngconf.h
-===================================================================
---- pngconf.h (rvision 149)
-+++ pngconf.h (copie de travail)
-@@ -925,6 +925,10 @@
- # define PNG_READ_zTXt_SUPPORTED
- # define PNG_zTXt_SUPPORTED
- #endif
-+#ifndef PNG_NO_READ_APNG
-+# define PNG_READ_APNG_SUPPORTED
-+# define PNG_APNG_SUPPORTED
-+#endif
- #ifndef PNG_NO_READ_UNKNOWN_CHUNKS
- # define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
- # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-@@ -1067,6 +1071,12 @@
- # define PNG_zTXt_SUPPORTED
- # endif
- #endif
-+#ifndef PNG_NO_WRITE_APNG
-+# define PNG_WRITE_APNG_SUPPORTED
-+# ifndef PNG_APNG_SUPPORTED
-+# define PNG_APNG_SUPPORTED
-+# endif
-+#endif
- #ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS
- # define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
- # ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-Index: pngpread.c
-===================================================================
---- pngpread.c (rvision 149)
-+++ pngpread.c (copie de travail)
-@@ -192,6 +192,11 @@
- #if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_CONST PNG_zTXt;
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_CONST PNG_acTL;
-+ PNG_CONST PNG_fcTL;
-+ PNG_CONST PNG_fdAT;
-+#endif
- #endif /* PNG_USE_LOCAL_ARRAYS */
- /* First we make sure we have enough data for the 4 byte chunk name
- * and the 4 byte chunk length before proceeding with decoding the
-@@ -215,7 +220,104 @@
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
- }
--
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_ptr->num_frames_read > 0 &&
-+ png_ptr->num_frames_read < info_ptr->num_frames)
-+ {
-+ if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+ {
-+ /* discard trailing IDATs for the first frame */
-+ if (png_ptr->mode & PNG_HAVE_fcTL || png_ptr->num_frames_read > 1)
-+ png_error(png_ptr, "out of place IDAT");
-+
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_push_crc_skip(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ if (png_ptr->buffer_size < 4)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_ensure_sequence_number(png_ptr, 4);
-+
-+ if (!(png_ptr->mode & PNG_HAVE_fcTL))
-+ {
-+ /* discard trailing fdATs for frames other than the first */
-+ if (png_ptr->num_frames_read < 2)
-+ png_error(png_ptr, "out of place fdAT");
-+
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_push_crc_skip(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+ else
-+ {
-+ /* frame data follows */
-+ png_ptr->idat_size = png_ptr->push_length - 4;
-+ png_ptr->mode |= PNG_HAVE_IDAT;
-+ png_ptr->process_mode = PNG_READ_IDAT_MODE;
-+
-+ return;
-+ }
-+ }
-+ else if(!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+
-+ png_read_reset(png_ptr);
-+ png_ptr->mode &= ~PNG_HAVE_fcTL;
-+
-+ png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
-+
-+ if (!(png_ptr->mode & PNG_HAVE_fcTL))
-+ png_error(png_ptr, "missing required fcTL chunk");
-+
-+ png_read_reinit(png_ptr, info_ptr);
-+ png_progressive_read_reset(png_ptr);
-+
-+ if (png_ptr->frame_info_fn != NULL)
-+ (*(png_ptr->frame_info_fn))(png_ptr, png_ptr->num_frames_read);
-+
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+
-+ return;
-+ }
-+ else
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_warning(png_ptr, "Skipped (ignored) a chunk "
-+ "between APNG chunks");
-+ png_push_crc_skip(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+
-+ return;
-+ }
-+#endif /* PNG_READ_APNG_SUPPORTED */
-+
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- if(png_ptr->mode & PNG_AFTER_IDAT)
- png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT;
-@@ -295,6 +397,9 @@
- png_error(png_ptr, "Too many IDAT's found");
- }
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_have_info(png_ptr, info_ptr);
-+#endif
- png_ptr->idat_size = png_ptr->push_length;
- png_ptr->mode |= PNG_HAVE_IDAT;
- png_ptr->process_mode = PNG_READ_IDAT_MODE;
-@@ -490,6 +595,35 @@
- png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
- }
- #endif
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ else if (!png_memcmp(png_ptr->chunk_name, png_acTL, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_handle_acTL(png_ptr, info_ptr, png_ptr->push_length);
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fcTL, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_handle_fcTL(png_ptr, info_ptr, png_ptr->push_length);
-+ }
-+ else if (!png_memcmp(png_ptr->chunk_name, png_fdAT, 4))
-+ {
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_handle_fdAT(png_ptr, info_ptr, png_ptr->push_length);
-+ }
-+#endif /* PNG_READ_APNG_SUPPORTED */
- else
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-@@ -660,13 +794,17 @@
- png_push_read_IDAT(png_structp png_ptr)
- {
- #ifdef PNG_USE_LOCAL_ARRAYS
-- PNG_CONST PNG_IDAT;
-+ PNG_IDAT;
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ PNG_fdAT;
-+ PNG_IEND;
- #endif
-+#endif
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
- {
- png_byte chunk_length[4];
-
-- if (png_ptr->buffer_size < 8)
-+ if (png_ptr->buffer_size < 12)
- {
- png_push_save_buffer(png_ptr);
- return;
-@@ -678,15 +816,59 @@
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
-
-- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_fdAT, 4)
-+ && png_ptr->num_frames_read > 0)
- {
-+ if (png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)
-+ {
-+ png_ptr->process_mode = PNG_READ_CHUNK_MODE;
-+ if (png_ptr->frame_end_fn != NULL)
-+ (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read);
-+ png_ptr->num_frames_read++;
-+ return;
-+ }
-+ else
-+ {
-+ if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
-+ png_error(png_ptr, "Not enough image data");
-+ if (png_ptr->push_length + 4 > png_ptr->buffer_size)
-+ {
-+ png_push_save_buffer(png_ptr);
-+ return;
-+ }
-+ png_warning(png_ptr, "Skipping (ignoring) a chunk between "
-+ "APNG chunks");
-+ png_crc_finish(png_ptr, png_ptr->push_length);
-+ png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-+ return;
-+ }
-+ }
-+ else
-+#endif
-+ if ( png_memcmp(png_ptr->chunk_name, png_IDAT, 4)
-+ && (png_ptr->num_frames_read == 0) )
-+ {
- png_ptr->process_mode = PNG_READ_CHUNK_MODE;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
- png_error(png_ptr, "Not enough compressed data");
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if (png_ptr->frame_end_fn != NULL)
-+ (*(png_ptr->frame_end_fn))(png_ptr, png_ptr->num_frames_read);
-+ png_ptr->num_frames_read++;
-+#endif
- return;
- }
-
- png_ptr->idat_size = png_ptr->push_length;
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ if(png_ptr->num_frames_read > 0)
-+ {
-+ png_ensure_sequence_number(png_ptr, 4);
-+ png_ptr->idat_size -= 4;
-+ }
-+#endif
- }
- if (png_ptr->idat_size && png_ptr->save_buffer_size)
- {
-@@ -1582,6 +1764,17 @@
- png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
- }
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+void PNGAPI
-+png_set_progressive_frame_fn(png_structp png_ptr,
-+ png_progressive_frame_ptr frame_info_fn,
-+ png_progressive_frame_ptr frame_end_fn)
-+{
-+ png_ptr->frame_info_fn = frame_info_fn;
-+ png_ptr->frame_end_fn = frame_end_fn;
-+}
-+#endif
-+
- png_voidp PNGAPI
- png_get_progressive_ptr(png_structp png_ptr)
- {
-Index: pngset.c
-===================================================================
---- pngset.c (rvision 149)
-+++ pngset.c (copie de travail)
-@@ -363,6 +363,11 @@
- info_ptr->rowbytes = (png_size_t)0;
- else
- info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width);
-+
-+#if defined(PNG_APNG_SUPPORTED)
-+ /* for non-animated png. this may be overritten from an acTL chunk later */
-+ info_ptr->num_frames = 1;
-+#endif
- }
-
- #if defined(PNG_oFFs_SUPPORTED)
-@@ -1043,6 +1048,141 @@
- }
- #endif /* PNG_sPLT_SUPPORTED */
-
-+#if defined(PNG_APNG_SUPPORTED)
-+png_uint_32 PNGAPI
-+png_set_acTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 num_frames, png_uint_32 num_plays)
-+{
-+ png_debug1(1, "in %s storage function\n", "acTL");
-+
-+ if (png_ptr == NULL || info_ptr == NULL)
-+ {
-+ png_warning(png_ptr,
-+ "Call to png_set_acTL() with NULL png_ptr "
-+ "or info_ptr ignored");
-+ return (0);
-+ }
-+ if (num_frames == 0)
-+ {
-+ png_warning(png_ptr,
-+ "Ignoring attempt to set acTL with num_frames zero");
-+ return (0);
-+ }
-+ if (num_frames > PNG_UINT_31_MAX)
-+ {
-+ png_warning(png_ptr,
-+ "Ignoring attempt to set acTL with num_frames > 2^31-1");
-+ return (0);
-+ }
-+ if (num_plays > PNG_UINT_31_MAX)
-+ {
-+ png_warning(png_ptr,
-+ "Ignoring attempt to set acTL with num_plays "
-+ "> 2^31-1");
-+ return (0);
-+ }
-+
-+ info_ptr->num_frames = num_frames;
-+ info_ptr->num_plays = num_plays;
-+
-+ info_ptr->valid |= PNG_INFO_acTL;
-+
-+ return (1);
-+}
-+
-+/* delay_num and delay_den can hold any 16-bit values including zero */
-+png_uint_32 PNGAPI
-+png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op)
-+{
-+ png_debug1(1, "in %s storage function\n", "fcTL");
-+
-+ if (png_ptr == NULL || info_ptr == NULL)
-+ {
-+ png_warning(png_ptr,
-+ "Call to png_set_fcTL() with NULL png_ptr or info_ptr "
-+ "ignored");
-+ return (0);
-+ }
-+
-+ png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
-+ delay_num, delay_den, dispose_op, blend_op);
-+
-+ info_ptr->next_frame_width = width;
-+ info_ptr->next_frame_height = height;
-+ info_ptr->next_frame_x_offset = x_offset;
-+ info_ptr->next_frame_y_offset = y_offset;
-+ info_ptr->next_frame_delay_num = delay_num;
-+ info_ptr->next_frame_delay_den = delay_den;
-+ info_ptr->next_frame_dispose_op = dispose_op;
-+ info_ptr->next_frame_blend_op = blend_op;
-+
-+ info_ptr->valid |= PNG_INFO_fcTL;
-+
-+ return (1);
-+}
-+
-+void /* PRIVATE */
-+png_ensure_fcTL_is_valid(png_structp png_ptr,
-+ png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den,
-+ png_byte dispose_op, png_byte blend_op)
-+{
-+ if (width + x_offset > png_ptr->first_frame_width ||
-+ height + y_offset > png_ptr->first_frame_height)
-+ png_error(png_ptr, "dimensions of a frame are greater than"
-+ "the ones in IHDR");
-+ if (width > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid width in fcTL (> 2^31-1)");
-+ if (height > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid height in fcTL (> 2^31-1)");
-+ if (x_offset > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid x_offset in fcTL (> 2^31-1)");
-+ if (y_offset > PNG_UINT_31_MAX)
-+ png_error(png_ptr, "invalid y_offset in fcTL (> 2^31-1)");
-+
-+ if (dispose_op != PNG_DISPOSE_OP_NONE &&
-+ dispose_op != PNG_DISPOSE_OP_BACKGROUND &&
-+ dispose_op != PNG_DISPOSE_OP_PREVIOUS)
-+ png_error(png_ptr, "invalid dispose_op in fcTL");
-+
-+ if (blend_op != PNG_BLEND_OP_SOURCE &&
-+ blend_op != PNG_BLEND_OP_OVER)
-+ png_error(png_ptr, "invalid blend_op in fcTL");
-+
-+ if (blend_op == PNG_BLEND_OP_OVER) {
-+ if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
-+ png_error(png_ptr, "PNG_BLEND_OP_OVER is not valid for "
-+ "color type 'greyscale without alpha'");
-+ else if ((png_ptr->color_type & PNG_COLOR_MASK_COLOR) &&
-+ !(png_ptr->color_type & PNG_COLOR_MASK_ALPHA))
-+ png_error(png_ptr, "PNG_BLEND_OP_OVER is not valid for "
-+ "color type 'truecolor without alpha'");
-+ }
-+}
-+
-+png_uint_32 PNGAPI
-+png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr,
-+ png_byte is_hidden)
-+{
-+ png_debug(1, "in png_first_frame_is_hidden()\n");
-+
-+ if (png_ptr == NULL)
-+ return 0;
-+
-+ if(is_hidden)
-+ png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
-+ else
-+ png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN;
-+
-+ return 1;
-+}
-+#endif /* PNG_APNG_SUPPORTED */
-+
- #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- void PNGAPI
- png_set_unknown_chunks(png_structp png_ptr,
-Index: pngrutil.c
-===================================================================
---- pngrutil.c (rvision 149)
-+++ pngrutil.c (copie de travail)
-@@ -414,6 +414,11 @@
- filter_type = buf[11];
- interlace_type = buf[12];
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+ png_ptr->first_frame_width = width;
-+ png_ptr->first_frame_height = height;
-+#endif
-+
- /* set internal variables */
- png_ptr->width = width;
- png_ptr->height = height;
-@@ -2220,6 +2225,168 @@
- }
- #endif
-
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+void /* PRIVATE */
-+png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-+{
-+ png_byte data[8];
-+ png_uint_32 num_frames;
-+ png_uint_32 num_plays;
-+ png_uint_32 didSet;
-+
-+ png_debug(1, "in png_handle_acTL\n");
-+
-+ if (!(png_ptr->mode & PNG_HAVE_IHDR))
-+ {
-+ png_error(png_ptr, "Missing IHDR before acTL");
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_IDAT)
-+ {
-+ png_warning(png_ptr, "Invalid acTL after IDAT skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_acTL)
-+ {
-+ png_warning(png_ptr, "Duplicate acTL skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (length != 8)
-+ {
-+ png_warning(png_ptr, "acTL with invalid length skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+
-+ png_crc_read(png_ptr, data, 8);
-+ png_crc_finish(png_ptr, 0);
-+
-+ num_frames = png_get_uint_31(png_ptr, data);
-+ num_plays = png_get_uint_31(png_ptr, data + 4);
-+
-+ /* the set function will do error checking on num_frames */
-+ didSet = png_set_acTL(png_ptr, info_ptr, num_frames, num_plays);
-+ if(didSet)
-+ png_ptr->mode |= PNG_HAVE_acTL;
-+}
-+
-+void /* PRIVATE */
-+png_handle_fcTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-+{
-+ png_byte data[22];
-+ png_uint_32 width;
-+ png_uint_32 height;
-+ png_uint_32 x_offset;
-+ png_uint_32 y_offset;
-+ png_uint_16 delay_num;
-+ png_uint_16 delay_den;
-+ png_byte dispose_op;
-+ png_byte blend_op;
-+
-+ png_debug(1, "in png_handle_fcTL\n");
-+
-+ if (!(png_ptr->mode & PNG_HAVE_IHDR))
-+ {
-+ png_error(png_ptr, "Missing IHDR before fcTL");
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_IDAT)
-+ {
-+ /* for any frames other then the first this message may be misleading,
-+ * but correct. PNG_HAVE_IDAT is unset before the frame head is read
-+ * i can't think of a better message */
-+ png_warning(png_ptr, "Invalid fcTL after IDAT skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (png_ptr->mode & PNG_HAVE_fcTL)
-+ {
-+ png_warning(png_ptr, "Duplicate fcTL within one frame skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+ else if (length != 26)
-+ {
-+ png_warning(png_ptr, "fcTL with invalid length skipped");
-+ png_crc_finish(png_ptr, length);
-+ return;
-+ }
-+
-+ png_ensure_sequence_number(png_ptr, length);
-+
-+ png_crc_read(png_ptr, data, 22);
-+ png_crc_finish(png_ptr, 0);
-+
-+ width = png_get_uint_31(png_ptr, data);
-+ height = png_get_uint_31(png_ptr, data + 4);
-+ x_offset = png_get_uint_31(png_ptr, data + 8);
-+ y_offset = png_get_uint_31(png_ptr, data + 12);
-+ delay_num = png_get_uint_16(data + 16);
-+ delay_den = png_get_uint_16(data + 18);
-+ dispose_op = data[20];
-+ blend_op = data[21];
-+
-+ if (png_ptr->num_frames_read == 0 && (x_offset != 0 || y_offset != 0))
-+ png_error(png_ptr, "fcTL for the first frame must have zero offset");
-+ if (png_ptr->num_frames_read == 0 &&
-+ (width != info_ptr->width || height != info_ptr->height))
-+ png_error(png_ptr, "size in first frame's fcTL must match "
-+ "the size in IHDR");
-+
-+ /* the set function will do more error checking */
-+ png_set_next_frame_fcTL(png_ptr, info_ptr, width, height,
-+ x_offset, y_offset, delay_num, delay_den,
-+ dispose_op, blend_op);
-+
-+ png_read_reinit(png_ptr, info_ptr);
-+
-+ png_ptr->mode |= PNG_HAVE_fcTL;
-+}
-+
-+void /* PRIVATE */
-+png_have_info(png_structp png_ptr, png_infop info_ptr)
-+{
-+ if((info_ptr->valid & PNG_INFO_acTL) && !(info_ptr->valid & PNG_INFO_fcTL))
-+ {
-+ png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
-+ info_ptr->num_frames++;
-+ }
-+}
-+
-+void /* PRIVATE */
-+png_handle_fdAT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-+{
-+ png_ensure_sequence_number(png_ptr, length);
-+
-+ /* This function is only called from png_read_end(), png_read_info(),
-+ * and png_push_read_chunk() which means that:
-+ * - the user doesn't want to read this frame
-+ * - or this is an out-of-place fdAT
-+ * in either case it is safe to ignore the chunk with a warning */
-+ png_warning(png_ptr, "ignoring fdAT chunk");
-+ png_crc_finish(png_ptr, length - 4);
-+}
-+
-+void /* PRIVATE */
-+png_ensure_sequence_number(png_structp png_ptr, png_uint_32 length)
-+{
-+ png_byte data[4];
-+ png_uint_32 sequence_number;
-+
-+ if (length < 4)
-+ png_error(png_ptr, "invalid fcTL or fdAT chunk found");
-+
-+ png_crc_read(png_ptr, data, 4);
-+ sequence_number = png_get_uint_31(png_ptr, data);
-+
-+ if (sequence_number != png_ptr->next_seq_num)
-+ png_error(png_ptr, "fcTL or fdAT chunk with out-of-order sequence "
-+ "number found");
-+
-+ png_ptr->next_seq_num++;
-+}
-+#endif /* PNG_READ_APNG_SUPPORTED */
-+
- /* This function is called when we haven't found a handler for a
- chunk. If there isn't a problem with the chunk itself (ie bad
- chunk name, CRC, or a critical chunk), the chunk is silently ignored
-@@ -3195,8 +3362,10 @@
- if (row_bytes + 64 > png_ptr->old_big_row_buf_size)
- {
- png_free(png_ptr, png_ptr->big_row_buf);
-- png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64);
-- png_ptr->row_buf = png_ptr->big_row_buf+32;
-+ if (png_ptr->big_row_buf == NULL)
-+ png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64);
-+ if (png_ptr->row_buf == NULL)
-+ png_ptr->row_buf = png_ptr->big_row_buf+32;
- png_ptr->old_big_row_buf_size = row_bytes+64;
- }
-
-@@ -3226,4 +3395,82 @@
-
- png_ptr->flags |= PNG_FLAG_ROW_INIT;
- }
-+
-+#if defined(PNG_READ_APNG_SUPPORTED)
-+/* This function is to be called after the main IDAT set has been read and
-+ * before a new IDAT is read. It resets some parts of png_ptr
-+ * to make them usable by the read functions again */
-+void /* PRIVATE */
-+png_read_reset(png_structp png_ptr)
-+{
-+ png_ptr->mode &= ~PNG_HAVE_IDAT;
-+ png_ptr->mode &= ~PNG_AFTER_IDAT;
-+ png_ptr->row_number = 0;
-+ png_ptr->pass = 0;
-+ png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
-+}
-+
-+void /* PRIVATE */
-+png_read_reinit(png_structp png_ptr, png_infop info_ptr)
-+{
-+ png_ptr->width = info_ptr->next_frame_width;
-+ png_ptr->height = info_ptr->next_frame_height;
-+ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->width);
-+}
-+
-+/* same as png_read_reset() but for the progressive reader */
-+void /* PRIVATE */
-+png_progressive_read_reset(png_structp png_ptr)
-+{
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ /* start of interlace block */
-+ const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
-+
-+ /* offset to next interlace block */
-+ const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
-+
-+ /* start of interlace block in the y direction */
-+ const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
-+
-+ /* offset to next interlace block in the y direction */
-+ const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
-+#endif
-+ png_uint_32 row_bytes;
-+
-+ if (png_ptr->interlaced)
-+ {
-+ if (!(png_ptr->transformations & PNG_INTERLACE))
-+ png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
-+ png_pass_ystart[0]) / png_pass_yinc[0];
-+ else
-+ png_ptr->num_rows = png_ptr->height;
-+
-+ png_ptr->iwidth = (png_ptr->width +
-+ png_pass_inc[png_ptr->pass] - 1 -
-+ png_pass_start[png_ptr->pass]) /
-+ png_pass_inc[png_ptr->pass];
-+
-+ row_bytes = PNG_ROWBYTES(png_ptr->pixel_depth,png_ptr->iwidth) + 1;
-+
-+ png_ptr->irowbytes = (png_size_t)row_bytes;
-+ if((png_uint_32)png_ptr->irowbytes != row_bytes)
-+ png_error(png_ptr, "png_progressive_read_reset(): Rowbytes "
-+ "overflow");
-+ }
-+ else
-+ {
-+ png_ptr->num_rows = png_ptr->height;
-+ png_ptr->iwidth = png_ptr->width;
-+ png_ptr->irowbytes = png_ptr->rowbytes + 1;
-+ }
-+
-+ png_ptr->flags &= ~PNG_FLAG_ZLIB_FINISHED;
-+ if (inflateReset(&(png_ptr->zstream)) != Z_OK)
-+ png_error(png_ptr, "inflateReset failed");
-+ png_ptr->zstream.avail_in = 0;
-+ png_ptr->zstream.next_in = 0;
-+ png_ptr->zstream.next_out = png_ptr->row_buf;
-+ png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
-+}
-+#endif /* PNG_READ_APNG_SUPPORTED */
- #endif /* PNG_READ_SUPPORTED */
-Index: pngwutil.c
-===================================================================
---- pngwutil.c (rvision 149)
-+++ pngwutil.c (copie de travail)
-@@ -506,6 +506,11 @@
- /* write the chunk */
- png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13);
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ png_ptr->first_frame_width = width;
-+ png_ptr->first_frame_height = height;
-+#endif
-+
- /* initialize zlib with PNG info */
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
-@@ -628,6 +633,9 @@
- {
- #ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ PNG_fdAT;
-+#endif
- #endif
- png_debug(1, "in png_write_IDAT\n");
-
-@@ -670,7 +678,28 @@
- "Invalid zlib compression method or flags in IDAT");
- }
-
-- png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length);
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ if(png_ptr->num_frames_written == 0)
-+#endif
-+ png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length);
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+ else
-+ {
-+ png_byte buf[4];
-+
-+ png_write_chunk_start(png_ptr, (png_bytep)png_fdAT, 4 + length);
-+
-+ png_save_uint_32(buf, png_ptr->next_seq_num);
-+ png_write_chunk_data(png_ptr, buf, 4);
-+
-+ png_write_chunk_data(png_ptr, data, length);
-+
-+ png_write_chunk_end(png_ptr);
-+
-+ png_ptr->next_seq_num++;
-+ }
-+#endif
-+
- png_ptr->mode |= PNG_HAVE_IDAT;
- }
-
-@@ -1755,6 +1784,70 @@
- }
- #endif
-
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+void /* PRIVATE */
-+png_write_acTL(png_structp png_ptr,
-+ png_uint_32 num_frames, png_uint_32 num_plays)
-+{
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ PNG_acTL;
-+#endif
-+ png_byte data[16];
-+
-+ png_debug(1, "in png_write_acTL\n");
-+
-+ png_ptr->num_frames_to_write = num_frames;
-+
-+ if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN)
-+ num_frames--;
-+
-+ png_save_uint_32(data, num_frames);
-+ png_save_uint_32(data + 4, num_plays);
-+
-+ png_write_chunk(png_ptr, (png_bytep)png_acTL, data, (png_size_t)8);
-+}
-+
-+void /* PRIVATE */
-+png_write_fcTL(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
-+ png_uint_32 x_offset, png_uint_32 y_offset,
-+ png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
-+ png_byte blend_op)
-+{
-+#ifdef PNG_USE_LOCAL_ARRAYS
-+ PNG_fcTL;
-+#endif
-+ png_byte data[26];
-+
-+ png_debug(1, "in png_write_fcTL\n");
-+
-+ if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0))
-+ png_error(png_ptr, "x and/or y offset for the first frame aren't 0\n");
-+ if (png_ptr->num_frames_written == 0 &&
-+ (width != png_ptr->first_frame_width ||
-+ height != png_ptr->first_frame_height))
-+ png_error(png_ptr, "width and/or height in the first frame's fcTL "
-+ "don't match the ones in IHDR\n");
-+
-+ /* more error checking */
-+ png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
-+ delay_num, delay_den, dispose_op, blend_op);
-+
-+ png_save_uint_32(data, png_ptr->next_seq_num);
-+ png_save_uint_32(data + 4, width);
-+ png_save_uint_32(data + 8, height);
-+ png_save_uint_32(data + 12, x_offset);
-+ png_save_uint_32(data + 16, y_offset);
-+ png_save_uint_16(data + 20, delay_num);
-+ png_save_uint_16(data + 22, delay_den);
-+ data[24] = dispose_op;
-+ data[25] = blend_op;
-+
-+ png_write_chunk(png_ptr, (png_bytep)png_fcTL, data, (png_size_t)26);
-+
-+ png_ptr->next_seq_num++;
-+}
-+#endif /* PNG_WRITE_APNG_SUPPORTED */
-+
- /* initializes the row writing capability of libpng */
- void /* PRIVATE */
- png_write_start_row(png_structp png_ptr)
-@@ -2824,4 +2917,39 @@
- }
- #endif
- }
-+
-+#if defined(PNG_WRITE_APNG_SUPPORTED)
-+void /* PRIVATE */
-+png_write_reset(png_structp png_ptr)
-+{
-+ png_ptr->row_number = 0;
-+ png_ptr->pass = 0;
-+ png_ptr->mode &= ~PNG_HAVE_IDAT;
-+}
-+
-+void /* PRIVATE */
-+png_write_reinit(png_structp png_ptr, png_infop info_ptr,
-+ png_uint_32 width, png_uint_32 height)
-+{
-+ if (png_ptr->num_frames_written == 0 &&
-+ (width != png_ptr->first_frame_width ||
-+ height != png_ptr->first_frame_height))
-+ png_error(png_ptr, "width and/or height in the first frame's fcTL "
-+ "don't match the ones in IHDR\n");
-+ if (width > png_ptr->first_frame_width ||
-+ height > png_ptr->first_frame_height)
-+ png_error(png_ptr, "width and/or height for a frame greater than"
-+ "the ones in IHDR");
-+
-+ png_set_IHDR(png_ptr, info_ptr, width, height,
-+ info_ptr->bit_depth, info_ptr->color_type,
-+ info_ptr->interlace_type, info_ptr->compression_type,
-+ info_ptr->filter_type);
-+
-+ png_ptr->width = width;
-+ png_ptr->height = height;
-+ png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width);
-+ png_ptr->usr_width = png_ptr->width;
-+}
-+#endif
- #endif /* PNG_WRITE_SUPPORTED */
-Index: pngrtran.c
-===================================================================
---- pngrtran.c (rvision 149)
-+++ pngrtran.c (copie de travail)
-@@ -1293,7 +1293,7 @@
- * or png_read_update_info() after setting transforms that expand
- * pixels. This check added to libpng-1.2.19 */
- #if (PNG_WARN_UNINITIALIZED_ROW==1)
-- png_error(png_ptr, "Uninitialized row");
-+ png_warning(png_ptr, "Uninitialized row");
- #else
- png_warning(png_ptr, "Uninitialized row");
- #endif
diff --git a/abs/core/libtool/libtool-2.2.10-3-i686.pkg.tar.gz b/abs/core/libtool/libtool-2.2.10-3-i686.pkg.tar.gz
deleted file mode 120000
index 76cb8a4..0000000
--- a/abs/core/libtool/libtool-2.2.10-3-i686.pkg.tar.gz
+++ /dev/null
@@ -1 +0,0 @@
-/data/pkg_repo/packages/libtool-2.2.10-3-i686.pkg.tar.gz \ No newline at end of file
diff --git a/abs/core/libx86/lrmi.patch b/abs/core/libx86/lrmi.patch
deleted file mode 100644
index 10530f9..0000000
--- a/abs/core/libx86/lrmi.patch
+++ /dev/null
@@ -1,16 +0,0 @@
---- old/lrmi.c 2006-10-30 21:10:16.000000000 +0100
-+++ new/lrmi.c 2008-08-27 11:32:40.000000000 +0200
-@@ -64,6 +64,13 @@
- #define DEFAULT_STACK_SIZE 0x1000
- #define RETURN_TO_32_INT 255
-
-+#ifndef IF_MASK
-+#define IF_MASK X86_EFLAGS_VIF
-+#define IOPL_MASK X86_EFLAGS_IOPL
-+#define VIF_MASK X86_EFLAGS_VIF
-+#define TF_MASK X86_EFLAGS_TF
-+#endif
-+
- #if defined(__linux__)
- #define CONTEXT_REGS context.vm.regs
- #define REG(x) x
diff --git a/abs/core/linux-atm/linux-atm-2.5.0-glibc28.patch b/abs/core/linux-atm/linux-atm-2.5.0-glibc28.patch
deleted file mode 100644
index 692f316..0000000
--- a/abs/core/linux-atm/linux-atm-2.5.0-glibc28.patch
+++ /dev/null
@@ -1,11 +0,0 @@
-diff -up linux-atm-2.5.0/src/led/main.c.path_max linux-atm-2.5.0/src/led/main.c
---- linux-atm-2.5.0/src/led/main.c.path_max 2008-05-19 02:47:40.000000000 +0900
-+++ linux-atm-2.5.0/src/led/main.c 2008-05-19 02:47:52.000000000 +0900
-@@ -41,6 +41,7 @@
- #include <getopt.h>
- #include <errno.h>
- #include <fcntl.h>
-+#include <linux/limits.h>
-
- #include <atm.h>
- #include <atmd.h>
diff --git a/abs/core/mdadm/raid-partitions_hook b/abs/core/mdadm/raid-partitions_hook
deleted file mode 100644
index bed1cb2..0000000
--- a/abs/core/mdadm/raid-partitions_hook
+++ /dev/null
@@ -1,21 +0,0 @@
-# vim: set ft=sh:
-run_hook ()
-{
- #TODO scan for these somehow...
- /sbin/modprobe -aq linear multipath raid0 raid1 raid456 raid10>/dev/null 2>&1
- # md= can be specified multiple times. The simplistic commandline
- # parsing does not handle this, so we will let mdassemble parse it
- for i in $(replace $(echo $md) ',' ' '); do
- case $i in d[0-9])
- for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
- /sbin/mdadm --create -a mdp /dev/md_d$i >/dev/null 2>&1
- done
- mdadm --assemble --auto=mdp /dev/md_$(replace $(echo $md) ',' ' ')
- export USE_RAID_ARRAY=1
- ;;
- esac
- done
- if ! [ "$USE_RAID_ARRAY" = "1" ] ; then
- /bin/mdassemble ${CMDLINE}
- fi
-}
diff --git a/abs/core/mdadm/raid-partitions_install b/abs/core/mdadm/raid-partitions_install
deleted file mode 100644
index 8fe5184..0000000
--- a/abs/core/mdadm/raid-partitions_install
+++ /dev/null
@@ -1,32 +0,0 @@
-# vim: set ft=sh:
-
-install ()
-{
- MODULES=" $(checked_modules "drivers/md/*" | grep -v "dm-") "
- BINARIES="mdadm"
- FILES=""
- SCRIPT="raid-partitions"
- add_file "/usr/lib/klibc/bin/mdassemble" "/bin/mdassemble"
-}
-
-help ()
-{
-cat<<HELPEOF
- This hook loads the necessary modules for an raid mdp/partitionable root device,
- and assemble the raid device when run.
-
- Kernel Parameters:
- Specify all your md arrays with md= parameter:
- ::: Example ::: md=d0,/dev/sda3,/dev/sda4 md=d1,/dev/hda1,/dev/hdb1
- This will setup 2 md partitionable arrays
-
- Setup:
- - to assemble a partitionable array:
- md=d<md device no.>,dev0,dev1,...,devn
-
- Parameters:
- - <md device no.> = the number of the md device:
- 0 means md0, 1 means md1, ...
- - <dev0-devn>: e.g. /dev/hda1,/dev/hdc1,/dev/sda1,/dev/sdb1
-HELPEOF
-}
diff --git a/abs/core/php/db-configure.patch b/abs/core/php/db-configure.patch
deleted file mode 100644
index fdc82b9..0000000
--- a/abs/core/php/db-configure.patch
+++ /dev/null
@@ -1,51 +0,0 @@
---- configure.orig 2008-07-03 10:27:06.000000000 +0000
-+++ configure 2008-07-03 10:30:56.000000000 +0000
-@@ -28399,43 +28399,15 @@
-
- unset THIS_INCLUDE THIS_LIBS THIS_LFLAGS THIS_PREFIX THIS_RESULT
-
-- dbdp="/usr/local/BerkeleyDB.4."
-- for i in $PHP_DB4 ${dbdp}6 ${dbdp}5 ${dbdp}4 ${dbdp}3 ${dbdp}2 ${dbdp}1 ${dbdp}0 /usr/local /usr; do
-- if test -f "$i/db4/db.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/db4/db.h
-- break
-- elif test -f "$i/include/db4.6/db.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/include/db4.6/db.h
-- break
-- elif test -f "$i/include/db4.5/db.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/include/db4.5/db.h
-- break
-- elif test -f "$i/include/db4/db.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/include/db4/db.h
-- break
-- elif test -f "$i/include/db/db4.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/include/db/db4.h
-- break
-- elif test -f "$i/include/db4.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/include/db4.h
-- break
-- elif test -f "$i/include/db.h"; then
-- THIS_PREFIX=$i
-- THIS_INCLUDE=$i/include/db.h
-- break
-- fi
-- done
-+ if test -f "/usr/include/db.h"; then
-+ THIS_PREFIX=/usr
-+ THIS_INCLUDE=/usr/include/db.h
-+ fi
-
- if test -z "$THIS_INCLUDE"; then
- { echo "configure: error: DBA: Could not find necessary header file(s)." 1>&2; exit 1; }
- fi
-- for LIB in db-4.6 db-4.5 db-4.4 db-4.3 db-4.2 db-4.1 db-4.0 db-4 db4 db; do
-+ for LIB in db; do
- if test -f $THIS_PREFIX/$PHP_LIBDIR/lib$LIB.a || test -f $THIS_PREFIX/$PHP_LIBDIR/lib$LIB.$SHLIB_SUFFIX_NAME; then
- lib_found="";
-
diff --git a/abs/core/pm-utils/pm-utils.install b/abs/core/pm-utils/pm-utils.install
deleted file mode 100644
index 5e8232d..0000000
--- a/abs/core/pm-utils/pm-utils.install
+++ /dev/null
@@ -1,15 +0,0 @@
-# arg 1: the new package version
-post_install() {
- cat << _EOF
-
-Powersave has been deprecated as suspend/resume framework and has been replaced
-by pm-utils. Pm-utils provides everything you need for suspend/resume, but does
-not load your cpufreq modules like powersaved does. You have to load these
-modules by hand if you want to use them.
-
-_EOF
-}
-
-op=$1
-shift
-$op $*
diff --git a/abs/core/pm-utils/service.patch b/abs/core/pm-utils/service.patch
deleted file mode 100644
index 422b3f5..0000000
--- a/abs/core/pm-utils/service.patch
+++ /dev/null
@@ -1,15 +0,0 @@
---- pm/functions.in~ 2008-04-10 17:39:48.000000000 +0000
-+++ pm/functions.in 2008-04-10 17:39:58.000000000 +0000
-@@ -138,10 +138,10 @@
- if ! command_exists service; then
- service()
- {
-- if [ -x "/etc/init.d/$1" ]; then
-+ if [ -x "/etc/rc.d/$1" ]; then
- svc="$1"
- shift
-- "/etc/init.d/$svc" "$@"
-+ "/etc/rc.d/$svc" "$@"
- else
- log "$1" $": unrecognized service" 1>&2
- return 1
diff --git a/abs/core/projectm/projectm.install b/abs/core/projectm/projectm.install
deleted file mode 100644
index a1e44dc..0000000
--- a/abs/core/projectm/projectm.install
+++ /dev/null
@@ -1,13 +0,0 @@
-post_install() {
- echo ">> projectm has been split so that you additionally need to install:"
- echo ">> xmms-projectm for xmms"
- echo ">> libvisual-project for libvisual (like for amarok)"
-}
-
-post_upgrade() {
- post_install
-}
-
-op=$1
-shift
-$op $*
diff --git a/abs/core/shadow/shadow-4.0.18.2-useradd-fix-1.patch b/abs/core/shadow/shadow-4.0.18.2-useradd-fix-1.patch
deleted file mode 100644
index d35580d..0000000
--- a/abs/core/shadow/shadow-4.0.18.2-useradd-fix-1.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-# DIY Linux Patch
-Date: 2007-11-08
-Author: Greg Schafer <gschafer@zip.com.au>
-Origin: Modelled on the same upstream fix for usermod.
-Maker: Greg Schafer <gschafer@zip.com.au>
-Upstream Status: Submitted, applied.
-Description: Fix -g problems in useradd.
-
-diff -Naur shadow-4.0.18.2.orig/src/useradd.c shadow-4.0.18.2/src/useradd.c
---- shadow-4.0.18.2.orig/src/useradd.c 2007-10-07 14:36:51.000000000 +0000
-+++ shadow-4.0.18.2/src/useradd.c 2007-11-08 06:33:32.433004367 +0000
-@@ -204,12 +204,8 @@
- char *errptr;
-
- gid = strtol (grname, &errptr, 10);
-- if (*errptr || errno == ERANGE || gid < 0) {
-- fprintf (stderr,
-- _("%s: invalid numeric argument '%s'\n"), Prog,
-- grname);
-- exit (E_BAD_ARG);
-- }
-+ if (*grname != '\0' && *errptr == '\0' && errno != ERANGE && gid >= 0)
-+ return getgrgid (gid);
- return getgrnam (grname);
- }
-
diff --git a/abs/core/shadow/shadow-UID_GID.patch b/abs/core/shadow/shadow-UID_GID.patch
deleted file mode 100644
index 759b73e..0000000
--- a/abs/core/shadow/shadow-UID_GID.patch
+++ /dev/null
@@ -1,34 +0,0 @@
---- shadow-4.0.18.1.orig/src/useradd.c 2006-08-25 11:57:00.202525241 +0200
-+++ shadow-4.0.18.1/src/useradd.c 2006-08-25 11:57:26.106735752 +0200
-@@ -206,11 +206,8 @@
- char *errptr;
-
- gid = strtol (grname, &errptr, 10);
-- if (*errptr || errno == ERANGE || gid < 0) {
-- fprintf (stderr,
-- _("%s: invalid numeric argument '%s'\n"), Prog, grname);
-- exit (E_BAD_ARG);
-- }
-+ if (*grname != '\0' && *errptr == '\0' && errno != ERANGE && gid >= 0)
-+ return getgrgid (gid);
- return getgrnam (grname);
- }
-
-Index: shadow-4.0.18.1/src/usermod.c
-===================================================================
---- shadow-4.0.18.1.orig/src/usermod.c 2006-08-25 11:57:18.938677504 +0200
-+++ shadow-4.0.18.1/src/usermod.c 2006-08-25 11:57:26.114735817 +0200
-@@ -167,11 +167,8 @@
- char *errptr;
-
- val = strtol (grname, &errptr, 10);
-- if (*errptr || errno == ERANGE || val < 0) {
-- fprintf (stderr, _("%s: invalid numeric argument '%s'\n"), Prog,
-- grname);
-- exit (E_BAD_ARG);
-- }
-+ if (*grname != '\0' && *errptr == '\0' && errno != ERANGE && val >= 0)
-+ return getgrgid (val);
- return getgrnam (grname);
- }
- \ No newline at end of file
diff --git a/abs/core/shadow/useradd b/abs/core/shadow/useradd
deleted file mode 100644
index a7bf8a4..0000000
--- a/abs/core/shadow/useradd
+++ /dev/null
@@ -1,6 +0,0 @@
-#%PAM-1.0
-auth sufficient pam_rootok.so
-auth required pam_unix.so
-account required pam_unix.so
-session required pam_unix.so
-password required pam_permit.so
diff --git a/abs/core/shadow/useradd-default.patch b/abs/core/shadow/useradd-default.patch
deleted file mode 100644
index 9b5a08e..0000000
--- a/abs/core/shadow/useradd-default.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- shadow-4.0.18.1/etc/useradd 2003-05-07 15:04:53.000000000 +0100
-+++ shadow-4.0.18.1/etc/useradd.default 2007-11-27 22:06:56.000000000 +0000
-@@ -1,8 +1,8 @@
- # useradd defaults file
--GROUP=1000
--HOME=/home/users
-+# Modified for Arch Linux
-+GROUP=100
-+HOME=/home
- INACTIVE=-1
- EXPIRE=
- SHELL=/bin/bash
- SKEL=/etc/skel
--CREATE_MAIL_SPOOL=yes
diff --git a/abs/core/sqlite3/build_fts_as_part_of_libsqlite.patch b/abs/core/sqlite3/build_fts_as_part_of_libsqlite.patch
deleted file mode 100644
index 54b04f0..0000000
--- a/abs/core/sqlite3/build_fts_as_part_of_libsqlite.patch
+++ /dev/null
@@ -1,139 +0,0 @@
-Index: Makefile.in
-===================================================================
-RCS file: /sqlite/sqlite/Makefile.in,v
-retrieving revision 1.186
-diff -u -3 -p -r1.186 Makefile.in
---- Makefile.in 23 Nov 2007 15:12:44 -0000 1.186
-+++ Makefile.in 23 Nov 2007 19:27:56 -0000
-@@ -114,6 +114,23 @@ LTINSTALL = $(LIBTOOL) --mode=install $(
- # nawk compatible awk.
- NAWK = @AWK@
-
-+# Need these defined unconditionally, as non-fts builds with
-+# fts object files without using -DSQLITE_ENABLE_FTS[123]
-+# will not work without it.
-+#
-+TCC += -DSQLITE_CORE
-+TCC += -DSQLITE_ENABLE_BROKEN_FTS1
-+TCC += -DSQLITE_ENABLE_BROKEN_FTS2
-+
-+# uncomment to build fts1 as part of library
-+# TCC += -DSQLITE_ENABLE_FTS1=1
-+
-+# uncomment to build fts2 as part of library
-+# TCC += -DSQLITE_ENABLE_FTS2=1
-+
-+# uncomment to build fts3 as part of library
-+# TCC += -DSQLITE_ENABLE_FTS3=1
-+
- # You should not have to change anything below this line
- ###############################################################################
- TCC += -DSQLITE_OMIT_LOAD_EXTENSION=1
-@@ -132,6 +149,17 @@ LIBOBJ = alter.lo analyze.lo attach.lo a
- vdbe.lo vdbeapi.lo vdbeaux.lo vdbeblob.lo vdbefifo.lo vdbemem.lo \
- where.lo utf.lo legacy.lo vtab.lo
-
-+# Object files for FTS
-+#
-+LIBOBJ += \
-+ fts1.lo fts1_hash.lo fts1_porter.lo fts1_tokenizer1.lo
-+
-+LIBOBJ += \
-+ fts2.lo fts2_hash.lo fts2_porter.lo fts2_tokenizer.lo fts2_tokenizer1.lo
-+
-+LIBOBJ += \
-+ fts3.lo fts3_hash.lo fts3_porter.lo fts3_tokenizer.lo fts3_tokenizer1.lo
-+
- # All of the source code files.
- #
- SRC = \
-@@ -209,6 +237,23 @@ SRC += \
- $(TOP)/ext/fts1/fts1_tokenizer.h \
- $(TOP)/ext/fts1/fts1_tokenizer1.c
-
-+SRC += \
-+ $(TOP)/ext/fts2/fts2.c \
-+ $(TOP)/ext/fts2/fts2.h \
-+ $(TOP)/ext/fts2/fts2_hash.c \
-+ $(TOP)/ext/fts2/fts2_hash.h \
-+ $(TOP)/ext/fts2/fts2_porter.c \
-+ $(TOP)/ext/fts2/fts2_tokenizer.h \
-+ $(TOP)/ext/fts2/fts2_tokenizer1.c
-+
-+SRC += \
-+ $(TOP)/ext/fts3/fts3.c \
-+ $(TOP)/ext/fts3/fts3.h \
-+ $(TOP)/ext/fts3/fts3_hash.c \
-+ $(TOP)/ext/fts3/fts3_hash.h \
-+ $(TOP)/ext/fts3/fts3_porter.c \
-+ $(TOP)/ext/fts3/fts3_tokenizer.h \
-+ $(TOP)/ext/fts3/fts3_tokenizer1.c
-
- # Source code to the test files.
- #
-@@ -285,6 +330,16 @@ HDR += \
- $(TOP)/ext/fts1/fts1_hash.h \
- $(TOP)/ext/fts1/fts1_tokenizer.h
-
-+HDR += \
-+ $(TOP)/ext/fts2/fts2.h \
-+ $(TOP)/ext/fts2/fts2_hash.h \
-+ $(TOP)/ext/fts2/fts2_tokenizer.h
-+
-+HDR += \
-+ $(TOP)/ext/fts3/fts3.h \
-+ $(TOP)/ext/fts3/fts3_hash.h \
-+ $(TOP)/ext/fts3/fts3_tokenizer.h
-+
- # Header files used by the VDBE submodule
- #
- VDBEHDR = \
-@@ -616,3 +671,48 @@ sqlite3.def: $(REAL_LIBOBJ)
- sqlite3.dll: $(REAL_LIBOBJ) sqlite3.def
- $(TCC) -shared -o sqlite3.dll sqlite3.def \
- -Wl,"--strip-all" $(REAL_LIBOBJ)
-+
-+#
-+# FTS
-+#
-+fts1.lo: $(TOP)/ext/fts1/fts1.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts1/fts1.c
-+
-+fts1_hash.lo: $(TOP)/ext/fts1/fts1_hash.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts1/fts1_hash.c
-+
-+fts1_porter.lo: $(TOP)/ext/fts1/fts1_porter.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts1/fts1_porter.c
-+
-+fts1_tokenizer1.lo: $(TOP)/ext/fts1/fts1_tokenizer1.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts1/fts1_tokenizer1.c
-+
-+fts2.lo: $(TOP)/ext/fts2/fts2.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts2/fts2.c
-+
-+fts2_hash.lo: $(TOP)/ext/fts2/fts2_hash.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts2/fts2_hash.c
-+
-+fts2_porter.lo: $(TOP)/ext/fts2/fts2_porter.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts2/fts2_porter.c
-+
-+fts2_tokenizer.lo: $(TOP)/ext/fts2/fts2_tokenizer.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts2/fts2_tokenizer.c
-+
-+fts2_tokenizer1.lo: $(TOP)/ext/fts2/fts2_tokenizer1.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts2/fts2_tokenizer1.c
-+
-+fts3.lo: $(TOP)/ext/fts3/fts3.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts3/fts3.c
-+
-+fts3_hash.lo: $(TOP)/ext/fts3/fts3_hash.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts3/fts3_hash.c
-+
-+fts3_porter.lo: $(TOP)/ext/fts3/fts3_porter.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts3/fts3_porter.c
-+
-+fts3_tokenizer.lo: $(TOP)/ext/fts3/fts3_tokenizer.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts3/fts3_tokenizer.c
-+
-+fts3_tokenizer1.lo: $(TOP)/ext/fts3/fts3_tokenizer1.c $(HDR)
-+ $(LTCOMPILE) -c $(TOP)/ext/fts3/fts3_tokenizer1.c
diff --git a/abs/core/sqlite3/sqlite-3.5.8-pkgconfig-version.patch b/abs/core/sqlite3/sqlite-3.5.8-pkgconfig-version.patch
deleted file mode 100644
index cb5b5ef..0000000
--- a/abs/core/sqlite3/sqlite-3.5.8-pkgconfig-version.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up sqlite-3.5.8/sqlite3.pc.in.release sqlite-3.5.8/sqlite3.pc.in
---- sqlite-3.5.8/sqlite3.pc.in.release 2008-04-23 09:11:38.000000000 +0300
-+++ sqlite-3.5.8/sqlite3.pc.in 2008-04-23 09:11:48.000000000 +0300
-@@ -7,7 +7,7 @@ includedir=@includedir@
-
- Name: SQLite
- Description: SQL database engine
--Version: @VERSION@
-+Version: @RELEASE@
- Libs: -L${libdir} -lsqlite3
- Libs.private: @LIBS@
- Cflags: -I${includedir}
diff --git a/abs/core/squashfs-tools/mksquashfs-fix-race.patch b/abs/core/squashfs-tools/mksquashfs-fix-race.patch
deleted file mode 100644
index e483c93..0000000
--- a/abs/core/squashfs-tools/mksquashfs-fix-race.patch
+++ /dev/null
@@ -1,23 +0,0 @@
---- squashfs-tools/mksquashfs.c 2009-04-05 18:22:48.000000000 -0300
-+++ squashfs-tools/mksquashfs.c 2010-02-10 17:04:29.303757175 -0300
-@@ -1733,9 +1733,7 @@
- entry->buffer->block = bytes;
- bytes += compressed_size;
- fragments_outstanding --;
-- pthread_mutex_unlock(&fragment_mutex);
- queue_put(to_writer, entry->buffer);
-- pthread_mutex_lock(&fragment_mutex);
- TRACE("fragment_locked writing fragment %d, compressed size %d"
- "\n", entry->fragment, compressed_size);
- free(entry);
-@@ -2426,8 +2424,8 @@
- write_buffer->block = bytes;
- bytes += compressed_size;
- fragments_outstanding --;
-- pthread_mutex_unlock(&fragment_mutex);
- queue_put(to_writer, write_buffer);
-+ pthread_mutex_unlock(&fragment_mutex);
- TRACE("Writing fragment %lld, uncompressed size %d, "
- "compressed size %d\n", file_buffer->block,
- file_buffer->size, compressed_size);
-
diff --git a/abs/core/sysvinit/halt-init.patch b/abs/core/sysvinit/halt-init.patch
deleted file mode 100644
index 88eb0ce..0000000
--- a/abs/core/sysvinit/halt-init.patch
+++ /dev/null
@@ -1,17 +0,0 @@
---- src/halt.c.orig 2008-08-30 17:25:02.000000000 +0000
-+++ src/halt.c 2008-08-30 18:10:29.000000000 +0000
-@@ -186,6 +186,14 @@
- if (!strcmp(progname, "reboot")) do_reboot = 1;
- if (!strcmp(progname, "poweroff")) do_poweroff = 1;
-
-+ if (!strcmp(progname, "reboot.init")) do_reboot = 1;
-+ if (!strcmp(progname, "poweroff.init")) do_poweroff = 1;
-+
-+ //fprintf(stderr, "%d: do_reboot \n ", do_reboot);
-+ //fprintf(stderr, "%d: do_poweroff \n ", do_poweroff);
-+ //fprintf(stderr, "%s: \n", progname);
-+ //do_nothing = 1;
-+
- /*
- * Get flags
- */
diff --git a/abs/core/udev/arch-udev-rules.patch b/abs/core/udev/arch-udev-rules.patch
deleted file mode 100644
index ce00c85..0000000
--- a/abs/core/udev/arch-udev-rules.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-diff -Nur rules.d/50-udev-default.rules rules.d.arch/50-udev-default.rules
---- rules.d/50-udev-default.rules 2009-03-07 22:22:48.200242883 +0100
-+++ rules.d.arch/50-udev-default.rules 2009-03-07 22:23:26.134434516 +0100
-@@ -59,15 +59,15 @@
- KERNEL=="fd[0-9]", ACTION=="add", ATTRS{cmos}=="?*", RUN+="create_floppy_devices -c -t $attr{cmos} -m %M -M 0640 -G floppy $root/%k"
-
- # cdrom
--SUBSYSTEM=="block", KERNEL=="sr[0-9]*", SYMLINK+="scd%n", GROUP="cdrom"
--SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="4|5", GROUP="cdrom"
--KERNEL=="pktcdvd[0-9]*", GROUP="cdrom"
--KERNEL=="pktcdvd", GROUP="cdrom"
-+SUBSYSTEM=="block", KERNEL=="sr[0-9]*", SYMLINK+="scd%n", GROUP="optical", MODE="0660"
-+SUBSYSTEM=="scsi_generic", SUBSYSTEMS=="scsi", ATTRS{type}=="4|5", GROUP="optical", MODE="0660"
-+KERNEL=="pktcdvd[0-9]*", GROUP="optical", MODE="0660"
-+KERNEL=="pktcdvd", GROUP="optical", MODE="0660"
-
- # tape
--KERNEL=="ht[0-9]*|nht[0-9]*", GROUP="tape"
--KERNEL=="pt[0-9]*|npt[0-9]*|pht[0-9]*", GROUP="tape"
--SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="tape"
-+KERNEL=="ht[0-9]*|nht[0-9]*", GROUP="storage", MODE="0660"
-+KERNEL=="pt[0-9]*|npt[0-9]*|pht[0-9]*", GROUP="storage", MODE="0660"
-+SUBSYSTEM=="scsi_generic|scsi_tape", SUBSYSTEMS=="scsi", ATTRS{type}=="1|8", GROUP="storage", MODE="0660"
-
- # block-related
- KERNEL=="sch[0-9]*", GROUP="disk"
-diff -Nur rules.d/80-drivers.rules rules.d.arch/80-drivers.rules
---- rules.d/80-drivers.rules 2010-06-03 11:55:08.978720002 +0200
-+++ rules.d.arch/80-drivers.rules 2010-06-03 11:58:41.207865142 +0200
-@@ -2,12 +2,13 @@
-
- ACTION=="remove", GOTO="drivers_end"
-
--DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/sbin/modprobe -bv $env{MODALIAS}"
--SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/sbin/modprobe -bv tifm_sd"
--SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN+="/sbin/modprobe -bv tifm_ms"
--SUBSYSTEM=="memstick", RUN+="/sbin/modprobe -bv --all ms_block mspro_block"
--SUBSYSTEM=="i2o", RUN+="/sbin/modprobe -bv i2o_block"
--SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST!="[module/sg]", RUN+="/sbin/modprobe -bv sg"
--SUBSYSTEM=="module", KERNEL=="parport_pc", RUN+="/sbin/modprobe -bv ppdev"
-+DRIVER!="?*", ENV{MODALIAS}=="?*", RUN+="/lib/udev/load-modules.sh $env{MODALIAS}"
-+SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="SD", RUN+="/lib/udev/load-modules.sh tifm_sd"
-+SUBSYSTEM=="tifm", ENV{TIFM_CARD_TYPE}=="MS", RUN+="/lib/udev/load-modules.sh tifm_ms"
-+SUBSYSTEM=="memstick", RUN+="/lib/udev/load-modules.sh ms_block"
-+SUBSYSTEM=="memstick", RUN+="/lib/udev/load-modules.sh mspro_block"
-+SUBSYSTEM=="i2o", RUN+="/lib/udev/load-modules.sh i2o_block"
-+SUBSYSTEM=="scsi", ENV{DEVTYPE}=="scsi_device", TEST!="[module/sg]", RUN+="/lib/udev/load-modules.sh sg"
-+SUBSYSTEM=="module", KERNEL=="parport_pc", RUN+="/lib/udev/load-modules.sh ppdev"
-
- LABEL="drivers_end"
diff --git a/abs/core/udev/logitech-rules.patch b/abs/core/udev/logitech-rules.patch
deleted file mode 100644
index fd0aea4..0000000
--- a/abs/core/udev/logitech-rules.patch
+++ /dev/null
@@ -1,14 +0,0 @@
---- - 2010-07-04 14:50:15.979139552 +0200
-+++ extras/hid2hci/70-hid2hci.rules 2010-07-03 21:03:40.685341704 +0200
-@@ -11,9 +11,9 @@
- RUN+="hid2hci --method=dell --devpath=%p", ENV{HID2HCI_SWITCH}="1"
-
- # Logitech devices (hidraw)
--KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345bce]|c71[34bc]", \
-+KERNEL=="hiddev*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[345e]|c71[34]", \
- RUN+="hid2hci --method=logitech-hid --devpath=%p"
--KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70a", \
-+KERNEL=="hidraw*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c70[abc]|c71[bc]", \
- RUN+="hid2hci --method=logitech-hid --devpath=%p"
-
- ENV{DEVTYPE}!="usb_device", GOTO="hid2hci_end"
diff --git a/abs/core/udev/root-link.sh b/abs/core/udev/root-link.sh
deleted file mode 100755
index 05273fe..0000000
--- a/abs/core/udev/root-link.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#! /bin/sh
-# Creates root symlink in /dev
-# for Arch Linux by Roman Kyrylych <Roman.Kyrylych@gmail.com>
-
-if ! [ -L /dev/root ]; then
-ln -s $(cat /proc/cmdline | sed "s: :\n:g" | grep root= | sed "s:root=::") /dev/root
-fi \ No newline at end of file
diff --git a/abs/extra/community/lua/lua-5.1.3-official-patch3.diff b/abs/extra/community/lua/lua-5.1.3-official-patch3.diff
deleted file mode 100644
index 8126ff5..0000000
--- a/abs/extra/community/lua/lua-5.1.3-official-patch3.diff
+++ /dev/null
@@ -1,21 +0,0 @@
---- src/lapi.c (old)
-+++ src/lapi.c (new)
-@@ -93,15 +93,14 @@
-
-
- LUA_API int lua_checkstack (lua_State *L, int size) {
-- int res;
-+ int res = 1;
- lua_lock(L);
-- if ((L->top - L->base + size) > LUAI_MAXCSTACK)
-+ if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)
- res = 0; /* stack overflow */
-- else {
-+ else if (size > 0) {
- luaD_checkstack(L, size);
- if (L->ci->top < L->top + size)
- L->ci->top = L->top + size;
-- res = 1;
- }
- lua_unlock(L);
- return res;
diff --git a/abs/extra/community/lua/lua-5.1.3-official-patch4.diff b/abs/extra/community/lua/lua-5.1.3-official-patch4.diff
deleted file mode 100644
index 1d03f37..0000000
--- a/abs/extra/community/lua/lua-5.1.3-official-patch4.diff
+++ /dev/null
@@ -1,18 +0,0 @@
---- src/lbaselib.c (old)
-+++ src/lbaselib.c (new)
-@@ -344,10 +344,12 @@
- luaL_checktype(L, 1, LUA_TTABLE);
- i = luaL_optint(L, 2, 1);
- e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));
-+ if (i > e) return 0; /* empty range */
- n = e - i + 1; /* number of elements */
-- if (n <= 0) return 0; /* empty range */
-- luaL_checkstack(L, n, "table too big to unpack");
-- for (; i<=e; i++) /* push arg[i...e] */
-+ if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */
-+ return luaL_error(L, "too many results to unpack");
-+ lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */
-+ while (i++ < e) /* push arg[i + 1...e] */
- lua_rawgeti(L, 1, i);
- return n;
- }
diff --git a/abs/extra/miro/ChangeLog b/abs/extra/miro/ChangeLog
deleted file mode 100644
index 223b1de..0000000
--- a/abs/extra/miro/ChangeLog
+++ /dev/null
@@ -1,34 +0,0 @@
-2008-01-30 Eric Belanger <eric@archlinux.org>
- * miro-1.1-2
- * rebuilt against xulrunner 1.8.1.11
-
-2008-01-16 Varun Acharya <varun@archlinux.org>
-
- * upgpkg miro-1.1
-
-2008-01-03 Varun Acharya <varun@archlinux.org>
-
- * Adopted and moved to extra, miro-1.0-2
-
-2007-11-26 Alessio 'mOLOk' Bolognino <themolok@gmail.com>
-
- * miro-1.0-2
- * changed url
- * added sqlite3 as dep (fix FS#8636)
-
-2007-11-13 Alessio 'mOLOk' Bolognino <themolok@gmail.com>
-
- * miro-1.0-1
- * version bump
-
-2007-09-09 Alessio 'mOLOk' Bolognino <themolok@gmail.com>
-
- * miro-0.9.9-1
- * version bump
-
-2007-08-08 Alessio 'mOLOk' Bolognino <themolok@gmail.com>
-
- * miro-0.9.8.1-1
- * initial commit
-
-
diff --git a/abs/extra/miro/Changelog b/abs/extra/miro/Changelog
deleted file mode 100644
index 40505f2..0000000
--- a/abs/extra/miro/Changelog
+++ /dev/null
@@ -1,2 +0,0 @@
-Miro 2.0.4-3 4/30/09
-Upgrade miro.install to add remove miro from is.xml.
diff --git a/abs/extra/miro/Miro-xulrunner.patch b/abs/extra/miro/Miro-xulrunner.patch
deleted file mode 100644
index b8f4db3..0000000
--- a/abs/extra/miro/Miro-xulrunner.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-diff -up Miro-1.2.3/platform/gtk-x11/platform/mozsetup.py.old Miro-1.2.3/platform/gtk-x11/platform/mozsetup.py
---- Miro-1.2.3/platform/gtk-x11/platform/mozsetup.py.old 2008-04-22 17:17:01.000000000 +0200
-+++ Miro-1.2.3/platform/gtk-x11/platform/mozsetup.py 2008-04-28 12:51:46.000000000 +0200
-@@ -106,8 +106,8 @@ def setupMozillaEnvironment():
- set_profile_path = gtkmozembed.gtk_moz_embed_set_profile_path
-
- set_profile_path(config.get(prefs.SUPPORT_DIRECTORY), 'mozilla')
-- if hasattr(gtkmozembed, 'set_comp_path'):
-- set_comp_path = gtkmozembed.set_comp_path
-+ if hasattr(gtkmozembed, 'set_path'):
-+ set_comp_path = gtkmozembed.set_path
- elif hasattr(gtkmozembed, 'set_path'):
- set_comp_path = gtkmozembed.set_path
- else:
-diff -up Miro-1.2.3/platform/gtk-x11/setup.py.old Miro-1.2.3/platform/gtk-x11/setup.py
---- Miro-1.2.3/platform/gtk-x11/setup.py.old 2008-04-22 17:17:01.000000000 +0200
-+++ Miro-1.2.3/platform/gtk-x11/setup.py 2008-04-28 13:14:27.000000000 +0200
-@@ -209,6 +209,7 @@ def parsePkgConfig(command, components,
- options_dict = {
- 'include_dirs' : [],
- 'library_dirs' : [],
-+ 'runtime_dirs' : [],
- 'libraries' : [],
- 'extra_compile_args' : []
- }
-@@ -224,6 +225,11 @@ def parsePkgConfig(command, components,
- options_dict['libraries'].append(rest)
- else:
- options_dict['extra_compile_args'].append(comp)
-+
-+ commandLine = "%s --variable=libdir %s" % (command, components)
-+ output = getCommandOutput(commandLine).strip()
-+ options_dict['runtime_dirs'].append(output)
-+
- return options_dict
-
- #### The fasttypes extension ####
-@@ -279,6 +285,8 @@ mozilla_browser_options = parsePkgConfig
- "gtk+-2.0 glib-2.0 pygtk-2.0 --define-variable=includetype=unstable %s %s" % (gtkmozembed, xpcom))
- mozilla_lib_path = parsePkgConfig('pkg-config',
- '%s' % gtkmozembed)['library_dirs']
-+runtime_lib_path = parsePkgConfig('pkg-config',
-+ '%s' % gtkmozembed)['runtime_dirs']
- # Find the base mozilla directory, and add the subdirs we need.
- def allInDir(directory, subdirs):
- for subdir in subdirs:
-@@ -334,7 +342,7 @@ mozilla_browser_ext = Extension("miro.pl
- os.path.join(platform_html_frontend_dir,'DragAndDrop.cc'),
- os.path.join(platform_html_frontend_dir,'XPCOMUtil.cc'),
- ],
-- runtime_library_dirs=mozilla_lib_path,
-+ runtime_library_dirs=runtime_lib_path,
- **mozilla_browser_options)
- #### Xlib Extension ####
- xlib_ext = \
-@@ -434,7 +442,7 @@ class install_data (distutils.command.in
- BUILD_MACHINE="%s@%s" % (getlogin(),
- os.uname()[1]),
- BUILD_TIME=str(time.time()),
-- MOZILLA_LIB_PATH=mozilla_lib_path[0])
-+ MOZILLA_LIB_PATH=runtime_lib_path[0])
- self.outfiles.append(dest)
-
- locale_dir = os.path.join (resource_dir, "locale")
diff --git a/abs/extra/miro/boost_1.36.0_fix.patch b/abs/extra/miro/boost_1.36.0_fix.patch
deleted file mode 100644
index b3b5a48..0000000
--- a/abs/extra/miro/boost_1.36.0_fix.patch
+++ /dev/null
@@ -1,32 +0,0 @@
---- Miro-1.2.7/portable/libtorrent/src/torrent_info.cpp.old 2008-09-21 13:47:00.122974031 +0200
-+++ Miro-1.2.7/portable/libtorrent/src/torrent_info.cpp 2008-09-21 13:48:54.812965713 +0200
-@@ -352,7 +352,7 @@
- fs::path tmp = m_name;
- if (tmp.is_complete()) throw std::runtime_error("torrent contains "
- "a file with an absolute path: '" + m_name + "'");
-- if (tmp.has_branch_path()) throw std::runtime_error(
-+ if (!tmp.branch_path().empty()) throw std::runtime_error(
- "torrent contains name with directories: '" + m_name + "'");
-
- // extract file list
-@@ -556,7 +556,7 @@
- {
- // TORRENT_ASSERT(file.begin() != file.end());
-
-- if (!file.has_branch_path())
-+ if (file.branch_path().empty())
- {
- // you have already added at least one file with a
- // path to the file (branch_path), which means that
-
---- Miro-1.2.7/portable/libtorrent/include/libtorrent/disk_io_thread.hpp.old 2008-09-21 13:57:05.433330334 +0200
-+++ Miro-1.2.7/portable/libtorrent/include/libtorrent/disk_io_thread.hpp 2008-09-21 13:57:29.060304305 +0200
-@@ -41,6 +41,7 @@
- #include <boost/bind.hpp>
- #include <boost/pool/pool.hpp>
- #include <boost/noncopyable.hpp>
-+#include <boost/thread/condition.hpp>
- #include "libtorrent/config.hpp"
-
- namespace libtorrent
-
diff --git a/abs/extra/miro/miro-xine.patch b/abs/extra/miro/miro-xine.patch
deleted file mode 100644
index 5abf5f1..0000000
--- a/abs/extra/miro/miro-xine.patch
+++ /dev/null
@@ -1,12 +0,0 @@
---- usr/bin/miro.old 2009-02-22 21:49:26.332356738 +0100
-+++ usr/bin/miro 2009-02-22 21:50:39.169010435 +0100
-@@ -21,7 +21,7 @@
- exit;
- fi
-
-- LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 $GDB -ex 'set breakpoint pending on' -ex 'break gdk_x_error' -ex 'run' --args $PYTHON ./miro.real --sync "$@"
-+ LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 $GDB -ex 'set breakpoint pending on' -ex 'break gdk_x_error' -ex 'run' --args $PYTHON ./miro.real --set xine-driver=opengl --sync "$@"
- else
-- LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 miro.real "$@"
-+ LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 miro.real --set xine-driver=opengl "$@"
- fi
diff --git a/abs/extra/miro/miro.exec.patch b/abs/extra/miro/miro.exec.patch
deleted file mode 100644
index 4b012af..0000000
--- a/abs/extra/miro/miro.exec.patch
+++ /dev/null
@@ -1,9 +0,0 @@
---- usr/bin/miro.old 2009-04-14 19:40:09.578785938 +0200
-+++ usr/bin/miro 2009-04-14 19:40:34.445435006 +0200
-@@ -23,5 +23,5 @@
-
- LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 $GDB -ex 'set breakpoint pending on' -ex 'run' --args $PYTHON ./miro.real --sync "$@"
- else
-- LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 miro.real "$@"
-+ MOZILLA_FIVE_HOME="/usr/lib/xulrunner-1.9/" LD_LIBRARY_PATH=/usr/lib/xulrunner-1.9 miro.real "$@"
- fi
diff --git a/abs/extra/miro/miro_python26.patch b/abs/extra/miro/miro_python26.patch
deleted file mode 100644
index f404a4e..0000000
--- a/abs/extra/miro/miro_python26.patch
+++ /dev/null
@@ -1,16 +0,0 @@
---- miro.real 2008-10-24 19:49:17.000000000 +0200
-+++ miro.real.new 2008-11-12 08:51:17.649458321 +0100
-@@ -6,8 +6,12 @@
- if xlibhelper.XInitThreads() == 0:
- print "WARNING: XInitThreads() failed!"
-
--import os.path
-+import miro.feedparser
-+import miro.storedatabase
- import sys
-+sys.modules['feedparser'] = miro.feedparser
-+sys.modules['storedatabase'] = miro.storedatabase
-+import os.path
- import optparse
-
- import pygtk
diff --git a/abs/extra/miro/missing-headers.patch b/abs/extra/miro/missing-headers.patch
deleted file mode 100644
index 7dc42b8..0000000
--- a/abs/extra/miro/missing-headers.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-diff -ur a/portable/libtorrent/include/libtorrent/peer_id.hpp b/portable/libtorrent/include/libtorrent/peer_id.hpp
---- a/portable/libtorrent/include/libtorrent/peer_id.hpp 2008-04-22 10:17:04.000000000 -0500
-+++ b/portable/libtorrent/include/libtorrent/peer_id.hpp 2008-05-07 01:51:09.000000000 -0500
-@@ -38,6 +38,7 @@
- #include <cctype>
- #include <algorithm>
- #include <string>
-+#include <cstring>
-
- #include "libtorrent/config.hpp"
- #include "libtorrent/assert.hpp"
-diff -ur a/portable/libtorrent/src/entry.cpp b/portable/libtorrent/src/entry.cpp
---- a/portable/libtorrent/src/entry.cpp 2008-04-22 10:17:04.000000000 -0500
-+++ b/portable/libtorrent/src/entry.cpp 2008-05-07 02:16:14.000000000 -0500
-@@ -33,6 +33,7 @@
- #include "libtorrent/pch.hpp"
-
- #include <algorithm>
-+#include <iostream>
- #include <iomanip>
- #include "libtorrent/entry.hpp"
- #include "libtorrent/config.hpp"
-diff -ur a/portable/libtorrent/src/file.cpp b/portable/libtorrent/src/file.cpp
---- a/portable/libtorrent/src/file.cpp 2008-04-22 10:17:04.000000000 -0500
-+++ b/portable/libtorrent/src/file.cpp 2008-05-07 01:53:04.000000000 -0500
-@@ -68,6 +68,7 @@
- #include <boost/filesystem/operations.hpp>
- #include "libtorrent/file.hpp"
- #include <sstream>
-+#include <cstring>
-
- #ifndef O_BINARY
- #define O_BINARY 0
diff --git a/abs/extra/monitorix-linhes.tar.gz b/abs/extra/monitorix-linhes.tar.gz
deleted file mode 100644
index 02ea6e2..0000000
--- a/abs/extra/monitorix-linhes.tar.gz
+++ /dev/null
Binary files differ
diff --git a/abs/extra/xine-lib/xine-header.patch b/abs/extra/xine-lib/xine-header.patch
deleted file mode 100644
index a37bfb9..0000000
--- a/abs/extra/xine-lib/xine-header.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- src/xine-engine/buffer.h 2008-07-16 23:01:56.000000000 +0200
-+++ src/xine-engine/buffer.h 2008-08-24 21:14:39.000000000 +0200
-@@ -676,7 +676,7 @@
- /* convert xine_waveformatex struct from little endian */
- void _x_waveformatex_le2me( xine_waveformatex *wavex ) XINE_PROTECTED;
-
--static inline _x_is_fourcc(void *ptr, void *tag) {
-+static __inline _x_is_fourcc(void *ptr, void *tag) {
- return memcmp(ptr, tag, 4) == 0;
- }
-
diff --git a/abs/extra/xine-lib/xine-imagemagick.patch b/abs/extra/xine-lib/xine-imagemagick.patch
deleted file mode 100644
index 9faa4ab..0000000
--- a/abs/extra/xine-lib/xine-imagemagick.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- xine-lib-1.1.15.orig/src/libxinevdec/image.c
-+++ xine-lib-1.1.15/src/libxinevdec/image.c
-@@ -110,7 +110,7 @@
- width = MagickGetImageWidth(wand) & ~1; /* must be even for init_yuv_planes */
- height = MagickGetImageHeight(wand);
- img_buf = malloc(width * height * 3);
-- MagickGetImagePixels(wand, 0, 0, width, height, "RGB", CharPixel, img_buf);
-+ MagickGetAuthenticPixels(wand, 0, 0, width, height, "RGB", CharPixel, img_buf);
- DestroyMagickWand(wand);
-
- _x_stream_info_set(this->stream, XINE_STREAM_INFO_VIDEO_WIDTH, width);