diff options
author | Michael Hanson <hansonorders@verizon.net> | 2010-11-30 23:52:49 (GMT) |
---|---|---|
committer | Michael Hanson <hansonorders@verizon.net> | 2010-11-30 23:52:49 (GMT) |
commit | ef974fb08972483d6852c9d5b2f23e1d33343b76 (patch) | |
tree | fa5aad1563681bf14a0fed3cdf8f599f7e8e853c /abs/core | |
parent | ba6da4b6e7eab74dd3dcac947a11361b1b9f1eed (diff) | |
download | linhes_pkgbuild-ef974fb08972483d6852c9d5b2f23e1d33343b76.zip linhes_pkgbuild-ef974fb08972483d6852c9d5b2f23e1d33343b76.tar.gz linhes_pkgbuild-ef974fb08972483d6852c9d5b2f23e1d33343b76.tar.bz2 |
Housekeeping
Diffstat (limited to 'abs/core')
70 files changed, 0 insertions, 18181 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 |