nbd's makefile/menuconfig rewrite
nbd's makefile/menuconfig rewrite


git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@307 3c298f89-4303-0410-b956-a3cf2f4a3e73

file:a/Config.in -> file:b/Config.in
--- a/Config.in
+++ b/Config.in
@@ -1,6 +1,10 @@
 #
 
 mainmenu "OpenWRT Configuration"
+
+config MODULES
+	bool
+	default y
 
 config BR2_HAVE_DOT_CONFIG
 	bool
@@ -102,9 +106,6 @@
 endmenu
 
 source "toolchain/Config.in"
-
 source "package/Config.in"
-
 source "target/Config.in"
 
-

file:a/Makefile -> file:b/Makefile
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,6 @@
-# Makefile for buildroot2
+# Makefile for OpenWRT
 #
+# Copyright (C) 2005 by Felix Fietkau <nbd@vd-s.ath.cx>
 # Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
 #
 # This program is free software; you can redistribute it and/or modify
@@ -21,7 +22,8 @@
 # Just run 'make menuconfig', configure stuff, then run 'make'.
 # You shouldn't need to mess with anything beyond this point...
 #--------------------------------------------------------------
-TOPDIR=./
+TOPDIR=${shell pwd}
+export TOPDIR
 CONFIG_CONFIG_IN = Config.in
 CONFIG_DEFCONFIG = .defconfig
 CONFIG = package/config
@@ -31,27 +33,30 @@
 
 # Pull in the user's configuration file
 ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),)
--include $(TOPDIR).config
-endif
-
-ifeq ($(BR2_TAR_VERBOSITY),y)
-TAR_OPTIONS=-xvf
-else
-TAR_OPTIONS=-xf
+-include $(TOPDIR)/.config
 endif
 
 ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
+include $(TOPDIR)/rules.mk
 
-#############################################################
+all: world
+
+##############################################################
 #
-# The list of stuff to build for the target toolchain
-# along with the packages to build for the target.
+# Build the toolchain
 #
 ##############################################################
-TARGETS:=host-sed kernel-headers uclibc-configured binutils gcc uclibc-target-utils linux openwrt
+toolchain_install:
+	$(MAKE) -C toolchain install
 
-include toolchain/Makefile.in
-include package/Makefile.in
+##############################################################
+#
+# Make all packages
+#
+##############################################################
+
+package_install: toolchain
+	$(MAKE) -C package compile install
 
 #############################################################
 #
@@ -61,32 +66,12 @@
 #############################################################
 
 
-
-all:   world
-
 # In this section, we need .config
 include .config.cmd
 
-# We also need the various per-package makefiles, which also add
-# each selected package to TARGETS if that package was selected
-# in the .config file.
-include toolchain/*/*.mk
-include package/*/*.mk
-include target/*/*.mk
+world: $(DL_DIR) $(BUILD_DIR) target_prepare $(TARGET_DIR) toolchain_install package_install target_install
 
-# target stuff is last so it can override anything else
-include target/Makefile.in
-
-TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))
-TARGETS_SOURCE:=$(patsubst %,%-source,$(TARGETS))
-TARGETS_DIRCLEAN:=$(patsubst %,%-dirclean,$(TARGETS))
-
-world: $(DL_DIR) $(BUILD_DIR) $(STAGING_DIR) $(TARGET_DIR) $(TARGETS)
-	@echo DONE.
-
-.PHONY: all world clean dirclean distclean source $(TARGETS) \
-	$(TARGETS_CLEAN) $(TARGETS_DIRCLEAN) $(TARGETS_SOURCE) \
-	$(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) $(STAGING_DIR)
+.PHONY: all world clean dirclean distclean image_clean target_clean source target_prepare target_install toolchain_install package_install
 
 #############################################################
 #
@@ -94,32 +79,17 @@
 # dependancies anywhere else
 #
 #############################################################
+target_prepare:
+	$(MAKE) -C target prepare
+
+target_install:
+	$(MAKE) -C target install
+
 $(DL_DIR):
 	@mkdir -p $(DL_DIR)
 
 $(BUILD_DIR):
 	@mkdir -p $(BUILD_DIR)
-
-$(TOOL_BUILD_DIR):
-	@mkdir -p $(TOOL_BUILD_DIR)
-
-$(STAGING_DIR):
-	@mkdir -p $(STAGING_DIR)/lib
-	@mkdir -p $(STAGING_DIR)/include
-	@mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)
-	@ln -sf ../lib $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib
-
-$(TARGET_DIR):
-	if [ -f "$(TARGET_SKELETON)" ] ; then \
-		zcat $(TARGET_SKELETON) | tar -C $(BUILD_DIR) -xf -; \
-	fi;
-	if [ -d "$(TARGET_SKEL_DIR)" ] ; then \
-		cp -a $(TARGET_SKEL_DIR)/* $(TARGET_DIR)/; \
-	fi;
-	-find $(TARGET_DIR) -type d -name CVS | xargs rm -rf
-	-find $(TARGET_DIR) -type d -name .svn | xargs rm -rf
-	-ln -sf /tmp/resolv.conf $(TARGET_DIR)/etc
-	-mkdir -p $(TARGET_DIR)/jffs
 
 source: $(TARGETS_SOURCE)
 
@@ -128,26 +98,33 @@
 # Cleanup and misc junk
 #
 #############################################################
-clean: 
-	rm -rf $(TARGET_DIR) $(IMAGE).*
-	$(MAKE) openwrt-image-clean
+image_clean:
+	rm -f $(STAMP_DIR)/.*-compile
+	rm -f $(STAMP_DIR)/.*-install
+	rm -rf $(BIN_DIR)
+	
+target_clean: image_clean
+	rm -rf $(TARGET_DIR)
 
-dirclean: $(TARGETS_DIRCLEAN)
-	rm -rf $(TARGET_DIR) $(IMAGE).*
-	$(MAKE) openwrt-image-dirclean
+clean: target_clean
+	@$(MAKE) -C $(CONFIG) clean
+
+dirclean: clean
+	rm -rf $(STAMP_DIR)
+	$(MAKE) -C package clean
+	$(MAKE) -C target clean
+	rm -rf $(BUILD_DIR)
 
 distclean: clean
-	rm -rf $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR) 
-	rm .config* .tmpconfig.h
+	rm -rf $(STAMP_DIR) $(DL_DIR) $(BUILD_DIR) $(TOOL_BUILD_DIR)
+	rm -f .config* .tmpconfig.h
 
-sourceball:
-	rm -rf $(BUILD_DIR)
+sourceball: distclean
 	set -e; \
 	cd ..; \
 	rm -f buildroot.tar.bz2; \
 	tar -cvf buildroot.tar buildroot; \
 	bzip2 -9 buildroot.tar; \
-
 
 else # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
 
@@ -162,7 +139,7 @@
 		cp $(CONFIG_DEFCONFIG) .config; \
 	fi
 $(CONFIG)/mconf:
-	$(MAKE) -C $(CONFIG) ncurses conf mconf
+	$(MAKE) -C $(CONFIG) 
 	-@if [ ! -f .config ] ; then \
 		cp $(CONFIG_DEFCONFIG) .config; \
 	fi
@@ -171,21 +148,25 @@
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
+	-./scripts/configtest.pl
 
 config: $(CONFIG)/conf
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/conf $(CONFIG_CONFIG_IN)
+	-./scripts/configtest.pl
 
 oldconfig: $(CONFIG)/conf
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/conf -o $(CONFIG_CONFIG_IN)
+	-./scripts/configtest.pl
 
 randconfig: $(CONFIG)/conf
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/conf -r $(CONFIG_CONFIG_IN)
+	-./scripts/configtest.pl
 
 allyesconfig: $(CONFIG)/conf
 	#@$(CONFIG)/conf -y $(CONFIG_CONFIG_IN)
@@ -193,32 +174,23 @@
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/conf -o $(CONFIG_CONFIG_IN)
+	-./scripts/configtest.pl
 
 allnoconfig: $(CONFIG)/conf
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/conf -n $(CONFIG_CONFIG_IN)
+	-./scripts/configtest.pl
 
 defconfig: $(CONFIG)/conf
 	-touch .config
 	-cp .config .config.test
 	@$(CONFIG)/conf -d $(CONFIG_CONFIG_IN)
-
-#############################################################
-#
-# Cleanup and misc junk
-#
-#############################################################
-clean:
-	@$(MAKE) -C $(CONFIG) clean
-
-distclean: clean
+	-./scripts/configtest.pl
 
 endif # ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y)
 
 .PHONY: dummy subdirs release distclean clean config oldconfig \
 	menuconfig tags check test depend
 
-targets:
-	@echo $(TARGETS)
 

--- a/docs/CHANGES
+++ b/docs/CHANGES
@@ -5,6 +5,13 @@
  Changes between official and experimental
 
   *) new buildroot (based on uClib buildroot2)
+     *) makefiles are no longer included but executed instead 
+        => easier to create packages
+
+  *) enhanced configuration system
+     *) busybox fully configurable from menuconfig
+     *) enabled tristate for some packages
+        => < > disabled, <M> compile as .ipk, <*> compile as .ipk and embed
 
   *) new kernel (updated to 2.4.29)
 
@@ -18,5 +25,5 @@
 
   *) better support for Asus WL-500g 
 	(kernel modules for usb,scsi,vfat build)
+  
 
-

--- a/package/Config.in
+++ b/package/Config.in
@@ -2,21 +2,34 @@
 
 menu "OpenWrt Package Selection"
 
-comment "The absolute minimum"
-source "package/linux/Config.in"
+comment "The default set"
 source "package/busybox/Config.in"
-
-comment "The default set"
 source "package/dnsmasq/Config.in"
 source "package/iptables/Config.in"
 source "package/bridge/Config.in"
 
-comment "libraries"
+comment "Networking"
+source "package/linksys-utils/Config.in"
+source "package/ppp/Config.in"
+source "package/dropbear/Config.in"
+source "package/ebtables/Config.in"
+source "package/arptables/Config.in"
+source "package/iproute2/Config.in"
+source "package/openvpn/Config.in"
+
+comment "Libraries"
 source "package/zlib/Config.in"
-
-comment "Suggested Extras"
-source "package/ebtables/Config.in"
-source "package/dropbear_sshd/Config.in"
+source "package/lzo/Config.in"
+source "package/openssl/Config.in"
 
 endmenu
 
+menu "Kernel Configuration"
+
+source "package/linux/Config.in"
+
+endmenu
+
+source "package/Sysconf.in"
+
+

file:b/package/Makefile (new)
--- /dev/null
+++ b/package/Makefile
@@ -1,1 +1,45 @@
+# Main makefile for the packages
+include $(TOPDIR)/rules.mk
 
+package-y:=openwrt
+package-$(BR2_PACKAGE_BRIDGE) += bridge
+package-$(BR2_PACKAGE_BUSYBOX) += busybox
+package-$(BR2_PACKAGE_DROPBEAR) += dropbear
+package-$(BR2_PACKAGE_DNSMASQ) += dnsmasq
+package-$(BR2_PACKAGE_EBTABLES) += ebtables
+package-$(BR2_PACKAGE_ARPTABLES) += arptables
+package-$(BR2_PACKAGE_IPTABLES) += iptables
+package-$(BR2_PACKAGE_PPP) += ppp
+package-$(BR2_PACKAGE_LZO) += lzo
+package-$(BR2_PACKAGE_ZLIB) += zlib
+package-$(BR2_PACKAGE_OPENSSL) += openssl
+package-$(BR2_PACKAGE_OPENVPN) += openvpn
+package-$(BR2_PACKAGE_IPROUTE2) += iproute2
+package-$(BR2_PACKAGE_LINKSYS_UTILS) += linksys-utils
+
+all: compile install
+clean: $(patsubst %,%-clean,$(package-) $(package-y) $(package-m)) linux-clean
+compile: $(patsubst %,%-compile,$(package-y) $(package-m))
+install: $(patsubst %,%-install,$(package-y))
+
+dropbear-compile: zlib-compile
+openssl-compile: zlib-compile
+$(patsubst %,%-prepare,$(package-y) $(package-m)): linux-install
+
+%-prepare:
+	@[ -f $(STAMP_DIR)/.$@ ] || $(MAKE) -C $(patsubst %-prepare,%,$@) prepare
+	@touch $(STAMP_DIR)/.$@
+
+%-compile: %-prepare 
+	@[ -f $(STAMP_DIR)/.$@ ] || $(MAKE) -C $(patsubst %-compile,%,$@) compile
+	@touch $(STAMP_DIR)/.$@
+
+%-install: %-compile
+	@[ -f $(STAMP_DIR)/.$@ ] || $(MAKE) -C $(patsubst %-install,%,$@) install
+	@touch $(STAMP_DIR)/.$@
+
+%-clean:
+	@$(MAKE) -C $(patsubst %-clean,%,$@) clean
+	@rm -f $(STAMP_DIR)/.$(patsubst %-clean,%,$@)-*
+
+

file:a/package/Makefile.in (deleted)
--- a/package/Makefile.in
+++ /dev/null
@@ -1,66 +1,1 @@
-MAKE1=make
-MAKE=make -j$(BR2_JLEVEL)
 
-# Strip off the annoying quoting
-ARCH:=$(strip $(subst ",, $(BR2_ARCH)))
-#"
-WGET:=$(strip $(subst ",, $(BR2_WGET)))
-#"
-
-ifneq ($(BR2_LARGEFILE),y)
-DISABLE_LARGEFILE= --disable-largefile
-endif
-TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
-
-HOSTCC:=gcc
-BASE_DIR:=${shell pwd}
-DL_DIR:=$(BASE_DIR)/dl
-BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX)
-PACKAGE_DIR:=$(BASE_DIR)/package
-TARGET_DIR:=$(BUILD_DIR)/root
-TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)
-# Strip off the annoying quoting
-STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR)))
-#"
-TARGET_PATH=$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin
-IMAGE:=$(BASE_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX)
-REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc
-GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux
-KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
-TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
-TARGET_CC=$(TARGET_CROSS)gcc
-STRIP=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note
-PATCH=toolchain/patch-kernel.sh
-
-
-HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \
-	-e 's/sparc.*/sparc/' \
-	-e 's/arm.*/arm/g' \
-	-e 's/m68k.*/m68k/' \
-	-e 's/ppc/powerpc/g' \
-	-e 's/v850.*/v850/g' \
-	-e 's/sh[234]/sh/' \
-	-e 's/mips-.*/mips/' \
-	-e 's/mipsel-.*/mipsel/' \
-	-e 's/cris.*/cris/' \
-	-e 's/i[3-9]86/i386/' \
-	)
-GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu
-TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
-		AR=$(TARGET_CROSS)ar \
-		AS=$(TARGET_CROSS)as \
-		LD=$(TARGET_CROSS)ld \
-		NM=$(TARGET_CROSS)nm \
-		CC=$(TARGET_CROSS)gcc \
-		GCC=$(TARGET_CROSS)gcc \
-		CXX=$(TARGET_CROSS)g++ \
-		RANLIB=$(TARGET_CROSS)ranlib
-
-ifeq ($(ENABLE_LOCALE),true)
-DISABLE_NLS:=
-else
-DISABLE_NLS:=--disable-nls
-endif
-
-
-

--- /dev/null
+++ b/package/Sysconf.in
@@ -1,1 +1,32 @@
+#
 
+menu "Runtime Configuration"
+	choice
+		bool "Telnet access"
+		default BR2_SYSCONF_TELNET_OPEN
+		
+		config BR2_SYSCONF_TELNET_FAILSAFE_ONLY
+			bool "open, failsafe only"
+
+		config BR2_SYSCONF_TELNET_OPEN
+			bool "open"
+
+	endchoice
+	
+	menu "Failsafe configuration"
+	
+		config BR2_SYSCONF_FAILSAFE_IP
+			string "IP Address"
+			default "192.168.1.1"
+		
+		config BR2_SYSCONF_FAILSAFE_NETMASK
+			string "Netmask"
+			default "255.255.255.0"
+
+		config BR2_SYSCONF_FAILSAFE_MAC
+			string "MAC Address"
+			default "00:00:BA:DC:0D:ED"
+
+	endmenu
+endmenu
+

--- /dev/null
+++ b/package/arptables/Config.in
@@ -1,1 +1,7 @@
+config BR2_PACKAGE_ARPTABLES
+	tristate "ARP Firewalling"
+	default m
+	help
+		ARP Firewalling (arptables)
+		http://ebtables.sourceforge.net/
 

--- /dev/null
+++ b/package/arptables/Makefile
@@ -1,1 +1,44 @@
+#############################################################
+#
+# arptables
+#
+#############################################################
+include $(TOPDIR)/rules.mk
 
+PKG_NAME:=arptables
+PKG_VERSION:=0.0.3
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=http://umn.dl.sourceforge.net/sourceforge/ebtables/
+PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-v$(PKG_VERSION)
+PKG_CAT:=zcat
+PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg
+
+$(DL_DIR)/$(PKG_SOURCE):
+	 $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE)
+
+$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE)
+	$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	touch $(PKG_BUILD_DIR)/.unpacked
+
+$(PKG_BUILD_DIR)/arptables: $(PKG_BUILD_DIR)/.unpacked
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+		CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld \
+		CFLAGS="$(TARGET_CFLAGS) -Wall -I$(PKG_BUILD_DIR)/include/linux/include -I$(PKG_BUILD_DIR)/include -DARPTABLES_VERSION=\\\"$(PKG_VERSION)\\\" "
+
+$(PKG_IPK): $(PKG_BUILD_DIR)/arptables
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_IPK_DIR)/usr/sbin
+	cp $(PKG_BUILD_DIR)/arptables $(PKG_IPK_DIR)/usr/sbin/
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE)
+prepare: $(PKG_BUILD_DIR)/.unpacked
+compile: $(PKG_IPK)
+install:
+	$(IPKG) install $(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+

--- /dev/null
+++ b/package/arptables/arptables.control
@@ -1,1 +1,9 @@
+Package: arptables
+Priority: optional
+Section: net
+Version: 1.2.11-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: ARP firewalling software
 

--- a/package/bridge/Config.in
+++ b/package/bridge/Config.in
@@ -1,5 +1,5 @@
 config BR2_PACKAGE_BRIDGE
-	bool "bridge"
+	tristate "Ethernet bridging support"
 	default y
 	help
 	  Manage ethernet bridging; a way to connect networks together to 

--- /dev/null
+++ b/package/bridge/Makefile
@@ -1,1 +1,70 @@
+#############################################################
+#
+# ebtables
+#
+#############################################################
+include $(TOPDIR)/rules.mk
 
+PKG_NAME:=bridge
+PKG_VERSION:=1.0.4
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=http://umn.dl.sourceforge.net/sourceforge/bridge
+PKG_SOURCE:=bridge-utils-$(PKG_VERSION).tar.gz
+PKG_BUILD_DIR:=$(BUILD_DIR)/bridge-utils-$(PKG_VERSION)
+PKG_CAT:=zcat
+PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg
+
+$(DL_DIR)/$(PKG_SOURCE):
+	 $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE)
+
+$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE)
+	$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	touch $(PKG_BUILD_DIR)/.unpacked
+
+$(PKG_BUILD_DIR)/.patched: $(PKG_BUILD_DIR)/.unpacked
+	$(PATCH) $(PKG_BUILD_DIR) ./patches
+	touch $(PKG_BUILD_DIR)/.patched
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched
+	(cd $(PKG_BUILD_DIR); rm -rf config.cache; \
+		$(TARGET_CONFIGURE_OPTS) \
+		CFLAGS="$(TARGET_CFLAGS)" \
+		./configure \
+		--target=$(GNU_TARGET_NAME) \
+		--host=$(GNU_TARGET_NAME) \
+		--build=$(GNU_HOST_NAME) \
+		--prefix=/usr \
+		--exec-prefix=/usr \
+		--bindir=/usr/bin \
+		--sbindir=/usr/sbin \
+		--libexecdir=/usr/lib \
+		--sysconfdir=/etc \
+		--datadir=/usr/share \
+		--localstatedir=/var \
+		--mandir=/usr/man \
+		--infodir=/usr/info \
+		$(DISABLE_NLS) \
+		--with-linux-headers=$(LINUX_DIR) \
+	);
+	touch $(PKG_BUILD_DIR)/.configured
+
+$(PKG_BUILD_DIR)/brctl/brctl: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) -C $(PKG_BUILD_DIR)
+
+$(PKG_IPK): $(PKG_BUILD_DIR)/brctl/brctl
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_IPK_DIR)/usr/sbin
+	cp $(PKG_BUILD_DIR)/brctl/brctl $(PKG_IPK_DIR)/usr/sbin/
+	$(STRIP) $(PKG_IPK_DIR)/usr/sbin/brctl
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE)
+prepare: $(PKG_BUILD_DIR)/.patched
+compile: $(PKG_IPK)
+install:
+	$(IPKG) install $(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+

--- /dev/null
+++ b/package/bridge/bridge.control
@@ -1,1 +1,9 @@
+Package: bridge
+Priority: essential
+Section: net
+Version: 1.0.4-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Ethernet bridging tools
 

--- a/package/bridge/bridge.mk
+++ /dev/null
@@ -1,74 +1,1 @@
-#############################################################
-#
-# bridgeutils - User Space Program For Controling Bridging
-#
-#############################################################
-#
-BRIDGE_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/bridge/
-BRIDGE_SOURCE=bridge-utils-1.0.4.tar.gz
-BRIDGE_BUILD_DIR=$(BUILD_DIR)/bridge-utils-1.0.4
-BRIDGE_PATCHES=$(PACKAGE_DIR)/bridge/patches
-BRIDGE_TARGET_BINARY:=usr/sbin/brctl
 
-$(DL_DIR)/$(BRIDGE_SOURCE):
-	 $(WGET) -P $(DL_DIR) $(BRIDGE_SOURCE_URL)/$(BRIDGE_SOURCE)
-
-$(BRIDGE_BUILD_DIR)/.unpacked: $(DL_DIR)/$(BRIDGE_SOURCE)
-	zcat $(DL_DIR)/$(BRIDGE_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-	touch $(BRIDGE_BUILD_DIR)/.unpacked
-
-$(BRIDGE_BUILD_DIR)/.patched: $(BRIDGE_BUILD_DIR)/.unpacked
-	$(PATCH) $(BRIDGE_BUILD_DIR) $(BRIDGE_PATCHES)
-	touch $(BRIDGE_BUILD_DIR)/.patched
-
-$(BRIDGE_BUILD_DIR)/.configured: $(BRIDGE_BUILD_DIR)/.patched
-	(cd $(BRIDGE_BUILD_DIR); rm -rf config.cache; \
-		$(TARGET_CONFIGURE_OPTS) \
-		CFLAGS="$(TARGET_CFLAGS)" \
-		./configure \
-		--target=$(GNU_TARGET_NAME) \
-		--host=$(GNU_TARGET_NAME) \
-		--build=$(GNU_HOST_NAME) \
-		--prefix=/usr \
-		--exec-prefix=/usr \
-		--bindir=/usr/bin \
-		--sbindir=/usr/sbin \
-		--libexecdir=/usr/lib \
-		--sysconfdir=/etc \
-		--datadir=/usr/share \
-		--localstatedir=/var \
-		--mandir=/usr/man \
-		--infodir=/usr/info \
-		$(DISABLE_NLS) \
-		--with-linux-headers=$(LINUX_DIR) \
-	);
-	touch  $(BRIDGE_BUILD_DIR)/.configured
-
-$(BRIDGE_BUILD_DIR)/brctl/brctl: $(BRIDGE_BUILD_DIR)/.configured
-	$(MAKE) -C $(BRIDGE_BUILD_DIR)
-
-$(TARGET_DIR)/$(BRIDGE_TARGET_BINARY): $(BRIDGE_BUILD_DIR)/brctl/brctl
-	mkdir -p $(TARGET_DIR)/usr/sbin
-	cp -af $(BRIDGE_BUILD_DIR)/brctl/brctl $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
-	$(STRIP) $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
-
-bridge: uclibc $(TARGET_DIR)/$(BRIDGE_TARGET_BINARY)
-
-bridge-source: $(DL_DIR)/$(BRIDGE_SOURCE)
-
-bridge-clean:
-	#$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(BRIDGE_BUILD_DIR) uninstall
-	-$(MAKE) -C $(BRIDGE_BUILD_DIR) clean
-
-bridge-dirclean:
-	rm -rf $(BRIDGE_BUILD_DIR)
-
-#############################################################
-#
-# Toplevel Makefile options
-#
-#############################################################
-ifeq ($(strip $(BR2_PACKAGE_BRIDGE)),y)
-TARGETS+=bridge
-endif
-

--- a/package/busybox/Config.in
+++ b/package/busybox/Config.in
@@ -17,4 +17,11 @@
 	  Use the latest busybox CVS snapshot instead of release.
 
 	  For fun, you should say Y.
+	  
+menu "Busybox Configuration"
+	depends BR2_PACKAGE_BUSYBOX
 
+source package/busybox/config/Config.in
+
+endmenu
+

--- /dev/null
+++ b/package/busybox/Makefile
@@ -1,1 +1,10 @@
+include $(TOPDIR)/rules.mk
 
+include ./busybox.mk
+
+source: busybox-source
+prepare: $(BUSYBOX_DIR)/.unpacked
+compile: $(BUSYBOX_DIR)/busybox
+install: busybox
+clean: busybox-dirclean
+

--- a/package/busybox/busybox.config
+++ b/package/busybox/busybox.config
@@ -26,7 +26,7 @@
 CONFIG_LFS=y
 USING_CROSS_COMPILER=y
 CROSS_COMPILER_PREFIX="mipsel-uclibc-"
-EXTRA_CFLAGS_OPTIONS="-Os "
+EXTRA_CFLAGS_OPTIONS="-Os -pipe -mips2"
 
 #
 # Installation Options
@@ -189,7 +189,7 @@
 # CONFIG_PIPE_PROGRESS is not set
 # CONFIG_READLINK is not set
 CONFIG_RUN_PARTS=y
-# CONFIG_START_STOP_DAEMON is not set
+CONFIG_START_STOP_DAEMON=y
 CONFIG_WHICH=y
 
 #

--- a/package/busybox/busybox.mk
+++ b/package/busybox/busybox.mk
@@ -16,7 +16,7 @@
 BUSYBOX_SITE:=http://www.busybox.net/downloads
 endif
 BUSYBOX_UNZIP=bzcat
-BUSYBOX_CONFIG:=package/busybox/busybox.config
+BUSYBOX_CONFIG:=./busybox.config
 
 $(DL_DIR)/$(BUSYBOX_SOURCE):
 	 $(WGET) -P $(DL_DIR) $(BUSYBOX_SITE)/$(BUSYBOX_SOURCE)
@@ -26,19 +26,20 @@
 $(BUSYBOX_DIR)/.unpacked: $(DL_DIR)/$(BUSYBOX_SOURCE)
 	$(BUSYBOX_UNZIP) $(DL_DIR)/$(BUSYBOX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
 	# Allow busybox patches.
-	toolchain/patch-kernel.sh $(BUSYBOX_DIR) package/busybox/patches
+	$(PATCH) $(BUSYBOX_DIR) ./patches
 	touch $(BUSYBOX_DIR)/.unpacked
 
 $(BUSYBOX_DIR)/.configured: $(BUSYBOX_DIR)/.unpacked $(BUSYBOX_CONFIG)
-	cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config
-	$(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\
-		PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak
-ifeq ($(BR2_LARGEFILE),y)
-	$(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config
-else
-	$(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config
-	$(SED) "s/^.*FDISK_SUPPORT_LARGE_DISKS.*/FDISK_SUPPORT_LARGE_DISKS=n/;" $(BUSYBOX_DIR)/.config
-endif
+	$(SCRIPT_DIR)/gen_busybox_config.pl $(TOPDIR)/.config > $(BUSYBOX_DIR)/.config
+#	cp $(BUSYBOX_CONFIG) $(BUSYBOX_DIR)/.config
+#	$(SED) "s,^CROSS.*,CROSS=$(TARGET_CROSS)\n\
+#		PREFIX=$(TARGET_DIR),;" $(BUSYBOX_DIR)/Rules.mak
+#ifeq ($(BR2_LARGEFILE),y)
+#	$(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=y/;" $(BUSYBOX_DIR)/.config
+#else
+#	$(SED) "s/^.*CONFIG_LFS.*/CONFIG_LFS=n/;" $(BUSYBOX_DIR)/.config
+#	$(SED) "s/^.*FDISK_SUPPORT_LARGE_DISKS.*/FDISK_SUPPORT_LARGE_DISKS=n/;" $(BUSYBOX_DIR)/.config
+#endif
 	$(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" -C $(BUSYBOX_DIR) oldconfig
 	touch $(BUSYBOX_DIR)/.configured
 
@@ -49,10 +50,11 @@
 $(TARGET_DIR)/bin/busybox: $(BUSYBOX_DIR)/busybox
 	$(MAKE) CC=$(TARGET_CC) CROSS="$(TARGET_CROSS)" PREFIX="$(TARGET_DIR)" \
 		EXTRA_CFLAGS="$(TARGET_CFLAGS)" -C $(BUSYBOX_DIR) install
+	$(STRIP) $(TARGET_DIR)/bin/busybox
 	# Just in case
 	-chmod a+x $(TARGET_DIR)/usr/share/udhcpc/default.script
 
-busybox: uclibc $(TARGET_DIR)/bin/busybox
+busybox: $(TARGET_DIR)/bin/busybox
 
 busybox-clean:
 	rm -f $(TARGET_DIR)/bin/busybox
@@ -61,12 +63,3 @@
 busybox-dirclean:
 	rm -rf $(BUSYBOX_DIR)
 
-#############################################################
-#
-# Toplevel Makefile options
-#
-#############################################################
-ifeq ($(strip $(BR2_PACKAGE_BUSYBOX)),y)
-TARGETS+=busybox
-endif
-

--- /dev/null
+++ b/package/busybox/config/Config.in
@@ -1,1 +1,294 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+
+config BUSYBOX_HAVE_DOT_CONFIG
+	bool
+	default y
+
+menu "General Configuration"
+
+choice
+	prompt "Buffer allocation policy"
+	default BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_ON_STACK
+	help
+	  There are 3 ways BusyBox can handle buffer allocations:
+	  - Use malloc. This costs code size for the call to xmalloc.
+	  - Put them on stack. For some very small machines with limited stack
+	    space, this can be deadly.  For most folks, this works just fine.
+	  - Put them in BSS. This works beautifully for computers with a real
+	    MMU (and OS support), but wastes runtime RAM for uCLinux. This
+	    behavior was the only one available for BusyBox versions 0.48 and
+	    earlier.
+
+config BUSYBOX_CONFIG_FEATURE_BUFFERS_USE_MALLOC
+	bool "Allocate with Malloc"
+
+config BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_ON_STACK
+	bool "Allocate on the Stack"
+
+config BUSYBOX_CONFIG_FEATURE_BUFFERS_GO_IN_BSS
+	bool "Allocate in the .bss section"
+
+endchoice
+
+config BUSYBOX_CONFIG_FEATURE_VERBOSE_USAGE
+	bool "Show verbose applet usage messages"
+	default y
+	help
+	  All BusyBox applets will show more verbose help messages when
+	  busybox is invoked with --help.  This will add a lot of text to the
+	  busybox binary.  In the default configuration, this will add about
+	  13k, but it can add much more depending on your configuration.
+
+config BUSYBOX_CONFIG_FEATURE_INSTALLER
+	bool "Support --install [-s] to install applet links at runtime"
+	default n
+	help
+	  Enable 'busybox --install [-s]' support.  This will allow you to use
+	  busybox at runtime to create hard links or symlinks for all the
+	  applets that are compiled into busybox.  This feature requires the
+	  /proc filesystem.
+
+config BUSYBOX_CONFIG_LOCALE_SUPPORT
+	bool "Enable locale support (system needs locale for this to work)"
+	default n
+	help
+	  Enable this if your system has locale support and you would like
+	  busybox to support locale settings.
+
+config BUSYBOX_CONFIG_FEATURE_DEVFS
+	bool "Support for devfs"
+	default y
+	help
+	  Enable if you want BusyBox to work with devfs.
+
+config BUSYBOX_CONFIG_FEATURE_DEVPTS
+	bool "Use the devpts filesystem for Unix98 PTYs"
+	default y if BUSYBOX_CONFIG_FEATURE_DEVFS
+	help
+	  Enable if you want BusyBox to use Unix98 PTY support. If enabled,
+	  busybox will use /dev/ptmx for the master side of the pseudoterminal
+	  and /dev/pts/<number> for the slave side.  Otherwise, BSD style
+	  /dev/ttyp<number> will be used. To use this option, you should have
+	  devpts or devfs mounted.
+
+config BUSYBOX_CONFIG_FEATURE_CLEAN_UP
+	bool "Clean up all memory before exiting (usually not needed)"
+	default n
+	help
+	  As a size optimization, busybox by default does not cleanup memory
+	  that is dynamically allocated or close files before exiting. This
+	  saves space and is usually not needed since the OS will clean up for
+	  us.  Don't enable this unless you have a really good reason to clean
+	  things up manually.
+
+config BUSYBOX_CONFIG_FEATURE_SUID
+	bool "Support for SUID/SGID handling"
+	default y
+	help
+	  Support SUID and SGID binaries.
+
+config BUSYBOX_CONFIG_FEATURE_SUID_CONFIG
+	bool "Runtime SUID/SGID configuration via /etc/busybox.conf"
+	default n if BUSYBOX_CONFIG_FEATURE_SUID
+	depends on BUSYBOX_CONFIG_FEATURE_SUID
+	help
+	  Allow the SUID / SGID state of an applet to be determined runtime by
+	  checking /etc/busybox.conf.  The format of this file is as follows:
+
+	  <applet> = [Ssx-][Ssx-][x-] (<username>|<uid>).(<groupname>|<gid>)
+	
+	  An example might help:
+
+	  [SUID]
+	  su = ssx root.0 # applet su can be run by anyone and runs with euid=0/egid=0
+	  su = ssx        # exactly the same
+
+	  mount = sx- root.disk # applet mount can be run by root and members of group disk
+	                        # and runs with euid=0
+
+	  cp = --- # disable applet cp for everyone
+
+	  Robert 'sandman' Griebl has more information here:
+	  <url: http://www.softforge.de/bb/suid.html >.
+
+config BUSYBOX_CONFIG_FEATURE_SUID_CONFIG_QUIET
+	bool "Suppress warning message if /etc/busybox.conf is not readable"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_SUID_CONFIG
+	help
+	  /etc/busybox.conf should be readable by the user needing the SUID, check
+	  this option to avoid users to be notified about missing permissions.
+
+config BUSYBOX_CONFIG_SELINUX
+	bool "Support NSA Security Enhanced Linux"
+	default n
+	help
+	  Enable support for SE Linux in applets ls, ps, and id.  Also provide
+	  the option of compiling in SE Linux applets.
+
+	  If you do not have a complete SE Linux Full Userland installed, this
+	  stuff will not compile.  Go visit
+		http://www.nsa.gov/selinux/index.html
+	  to download the necessary stuff to allow busybox to compile with this
+	  option enabled.
+
+	  Most people will leave this set to 'N'.
+
+endmenu
+
+menu 'Build Options'
+
+config BUSYBOX_CONFIG_STATIC
+	bool "Build BusyBox as a static binary (no shared libs)"
+	default n
+	help
+	  If you want to build a static BusyBox binary, which does not
+	  use or require any shared libraries, then enable this option.
+	  This can cause BusyBox to be considerably larger, so you should
+	  leave this option false unless you have a good reason (i.e.
+	  your target platform does not support shared libraries, or
+	  you are building an initrd which doesn't need anything but
+	  BusyBox, etc).
+
+	  Most people will leave this set to 'N'.
+
+config BUSYBOX_CONFIG_LFS
+	bool
+	default y
+	select BUSYBOX_FDISK_SUPPORT_LARGE_DISKS
+	help
+	  If you want to build BusyBox with large file support, then enable
+	  this option.  This will have no effect if your kernel or your C
+	  library lacks large file support for large files.  Some of the
+	  programs that can benefit from large file support include dd, gzip,
+	  cp, mount, tar, and many others.  If you want to access files larger
+	  than 2 Gigabytes, enable this option.  Otherwise, leave it set to 'N'.
+
+config BUSYBOX_USING_CROSS_COMPILER
+	bool
+	default y
+	help
+	  Do you want to build BusyBox with a Cross Compiler?  If so,
+	  then enable this option.  Otherwise leave it set to 'N'.
+
+config BUSYBOX_CROSS_COMPILER_PREFIX
+	string
+	default "mipsel-uclibc-"
+	depends on BUSYBOX_USING_CROSS_COMPILER
+	help
+	  If you want to build BusyBox with a cross compiler, then you
+	  will need to set this to the cross-compiler prefix.  For example,
+	  if my cross-compiler is /usr/i386-linux-uclibc/bin/i386-uclibc-gcc
+	  then I would enter '/usr/i386-linux-uclibc/bin/i386-uclibc-' here,
+	  which will ensure the correct compiler is used.
+
+config BUSYBOX_EXTRA_CFLAGS_OPTIONS
+	string
+	default "-Os "
+	help
+	  Do you want to pass any extra CFLAGS options to the compiler as
+	  you build BusyBox? If so, this is the option for you...  For example,
+	  if you want to add some simple compiler switches (like -march=i686),
+	  or check for warnings using -Werror, just those options here.
+
+endmenu
+
+menu 'Installation Options'
+
+config BUSYBOX_CONFIG_INSTALL_NO_USR
+	bool "Don't use /usr"
+	default n
+	help
+	  Disable use of /usr. Don't activate this option if you don't know
+	  that you really want this behaviour.
+
+config BUSYBOX_PREFIX
+	string
+	default "./_install"
+	help
+	  Define your directory to install BusyBox files/subdirs in.
+
+
+
+endmenu
+
+source package/busybox/config/archival/Config.in
+source package/busybox/config/coreutils/Config.in
+source package/busybox/config/console-tools/Config.in
+source package/busybox/config/debianutils/Config.in
+source package/busybox/config/editors/Config.in
+source package/busybox/config/findutils/Config.in
+source package/busybox/config/init/Config.in
+source package/busybox/config/loginutils/Config.in
+source package/busybox/config/miscutils/Config.in
+source package/busybox/config/modutils/Config.in
+source package/busybox/config/networking/Config.in
+source package/busybox/config/procps/Config.in
+source package/busybox/config/shell/Config.in
+source package/busybox/config/sysklogd/Config.in
+source package/busybox/config/util-linux/Config.in
+
+menu 'Debugging Options'
+
+config BUSYBOX_CONFIG_DEBUG
+	bool "Build BusyBox with Debugging symbols"
+	default n
+	help
+	  Say Y here if you wish to compile BusyBox with debugging symbols.
+	  This will allow you to use a debugger to examine BusyBox internals
+	  while applets are running.  This increases the size of the binary
+	  considerably and should only be used when doing development.
+	  If you are doing development and want to debug BusyBox, answer Y.
+
+	  Most people should answer N.
+
+choice
+	prompt "Additional debugging library"
+	default BUSYBOX_CONFIG_NO_DEBUG_LIB
+	depends on BUSYBOX_CONFIG_DEBUG
+	help
+	  Using an additional debugging library will make BusyBox become
+	  considerable larger and will cause it to run more slowly.  You
+	  should always leave this option disabled for production use.
+
+	  dmalloc support:
+	  ----------------
+	  This enables compiling with dmalloc ( http://dmalloc.com/ )
+	  which is an excellent public domain mem leak and malloc problem
+	  detector.  To enable dmalloc, before running busybox you will
+	  want to properly set your environment, for example:
+	    export DMALLOC_OPTIONS=debug=0x34f47d83,inter=100,log=logfile
+	  The 'debug=' value is generated using the following command
+	    dmalloc -p log-stats -p log-non-free -p log-bad-space -p log-elapsed-time \
+	       -p check-fence -p check-heap -p check-lists -p check-blank \
+	       -p check-funcs -p realloc-copy -p allow-free-null
+
+	  Electric-fence support:
+	  -----------------------
+	  This enables compiling with Electric-fence support.  Electric
+	  fence is another very useful malloc debugging library which uses
+	  your computer's virtual memory hardware to detect illegal memory
+	  accesses.  This support will make BusyBox be considerable larger
+	  and run slower, so you should leave this option disabled unless
+	  you are hunting a hard to find memory problem.
+
+
+config BUSYBOX_CONFIG_NO_DEBUG_LIB
+	bool "None"
+
+config BUSYBOX_CONFIG_DMALLOC
+	bool "Dmalloc"
+
+config BUSYBOX_CONFIG_EFENCE
+	bool "Electric-fence"
+
+endchoice
+
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/archival/Config.in
@@ -1,1 +1,259 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Archival Utilities"
+
+config BUSYBOX_CONFIG_AR
+	bool "ar"
+	default n
+	help
+	  ar is an archival utility program used to create, modify, and
+	  extract contents from archives.  An archive is a single file holding
+	  a collection of other files in a structure that makes it possible to
+	  retrieve the original individual files (called archive members).
+	  The original files' contents, mode (permissions), timestamp, owner,
+	  and group are preserved in the archive, and can be restored on
+	  extraction.
+
+	  The stored filename is limited to 15 characters. (for more information
+	  see long filename support).
+	  ar has 60 bytes of overheads for every stored file.
+
+	  This implementation of ar can extract archives, it cannot create or
+	  modify them.
+	  On an x86 system, the ar applet adds about 1K.
+
+	  Unless you have a specific application which requires ar, you should
+	  probably say N here.
+
+config BUSYBOX_CONFIG_FEATURE_AR_LONG_FILENAMES
+	bool "  Enable support for long filenames (not need for debs)"
+	default n
+	depends on BUSYBOX_CONFIG_AR
+	help
+	  By default the ar format can only store the first 15 characters of the
+	  filename, this option removes that limitation.
+	  It supports the GNU ar long filename method which moves multiple long
+	  filenames into a the data section of a new ar entry.
+
+config BUSYBOX_CONFIG_BUNZIP2
+	bool "bunzip2"
+	default y
+	help
+	  bunzip2 is a compression utility using the Burrows-Wheeler block
+	  sorting text compression algorithm, and Huffman coding.  Compression
+	  is generally considerably better than that achieved by more
+	  conventional LZ77/LZ78-based compressors, and approaches the
+	  performance of the PPM family of statistical compressors.
+	
+	  The BusyBox bunzip2 applet is limited to de-compression only.
+	  On an x86 system, this applet adds about 11K.
+	
+	  Unless you have a specific application which requires bunzip2, you
+	  should probably say N here.
+
+config BUSYBOX_CONFIG_CPIO
+	bool "cpio"
+	default n
+	help
+	  cpio is an archival utility program used to create, modify, and extract
+	  contents from archives.
+	  cpio has 110 bytes of overheads for every stored file.
+
+	  This implementation of cpio can extract cpio archives created in the
+	  "newc" or "crc" format, it cannot create or modify them.
+
+	  Unless you have a specific application which requires cpio, you should
+	  probably say N here.
+
+config BUSYBOX_CONFIG_DPKG
+	bool "dpkg"
+	default n
+	help
+	  dpkg is a medium-level tool to install, build, remove and manage Debian packages.
+	
+	  This implementation of dpkg has a number of limitations, you should use the
+	  official dpkg if possible.
+
+config BUSYBOX_CONFIG_DPKG_DEB
+	bool "dpkg_deb"
+	default n
+	help
+	  dpkg-deb packs, unpacks and provides information about Debian archives.
+	
+	  This implementation of dpkg-deb cannot pack archives.
+	
+	  Unless you have a specific application which requires dpkg-deb, you should
+	  probably say N here.
+
+config BUSYBOX_CONFIG_FEATURE_DPKG_DEB_EXTRACT_ONLY
+	bool "  extract only (-x)"
+	default n
+	depends on BUSYBOX_CONFIG_DPKG_DEB
+	help
+	  This reduces dpkg-deb to the equivalent of "ar -p <deb> data.tar.gz | tar -zx".
+	  However it saves space as none of the extra dpkg-deb, ar or tar options are
+	  needed, they are linked to internally.
+
+config BUSYBOX_CONFIG_GUNZIP
+	bool "gunzip"
+	default y
+	help
+	  gunzip is used to decompress archives created by gzip.
+	  You can use the `-t' option to test the integrity of
+	  an archive, without decompressing it.
+
+config BUSYBOX_CONFIG_FEATURE_GUNZIP_UNCOMPRESS
+	bool "  Uncompress support"
+	default y
+	depends on BUSYBOX_CONFIG_GUNZIP
+	help
+	  Enable if you want gunzip to have the ability to decompress
+	  archives created by the program compress (not much
+	  used anymore).
+
+config BUSYBOX_CONFIG_GZIP
+	bool "gzip"
+	default y
+	help
+	  gzip is used to compress files.
+	  It's probably the most widely used UNIX compression program.
+
+config BUSYBOX_CONFIG_RPM2CPIO
+	bool "rpm2cpio"
+	default n
+	help
+	  Converts an RPM file into a CPIO archive.
+
+config BUSYBOX_CONFIG_RPM
+	bool "rpm"
+	default n
+	help
+	  Mini RPM applet - queries and extracts
+
+config BUSYBOX_CONFIG_TAR
+	bool "tar"
+	default y
+	help
+	  tar is an archiving program. It's commonly used with gzip to
+	  create compressed archives. It's probably the most widely used
+	  UNIX archive program.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_CREATE
+	bool "  Enable archive creation"
+	default y
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  If you enable this option you'll be able to create
+	  tar archives using the `-c' option.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_BZIP2
+	bool "  Enable -j option to handle .tar.bz2 files"
+	default y
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  If you enable this option you'll be able to extract
+	  archives compressed with bzip2.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_FROM
+	bool "  Enable -X (exclude from) and -T (include from) options)"
+	default n
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  If you enable this option you'll be able to specify
+	  a list of files to include or exclude from an archive.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_GZIP
+	bool "  Enable -z option"
+	default y
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  If you enable this option tar will be able to call gzip,
+	  when creating or extracting tar gziped archives.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_COMPRESS
+	bool "  Enable -Z option"
+	default n
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  If you enable this option tar will be able to call uncompress,
+	  when extracting .tar.Z archives.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_OLDGNU_COMPATABILITY
+	bool "  Enable support for old tar header format"
+	default n
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  This option is required to unpack archives created in
+	  the old GNU format; help to kill this old format by
+	  repacking your ancient archives with the new format.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_GNU_EXTENSIONS
+	bool "  Enable support for some GNU tar extensions"
+	default y
+	depends on BUSYBOX_CONFIG_TAR
+	help
+	  With this option busybox supports GNU long filenames and
+	  linknames.
+
+config BUSYBOX_CONFIG_FEATURE_TAR_LONG_OPTIONS
+	bool "  Enable long options"
+	default n
+	depends on BUSYBOX_CONFIG_TAR
+	help
+		Enable use of long options, increases size by about 400 Bytes
+
+config BUSYBOX_CONFIG_UNCOMPRESS
+	bool "uncompress"
+	default n
+	help
+	  uncompress is used to decompress archives created by compress.
+	  Not much used anymore, replaced by gzip/gunzip.
+
+config BUSYBOX_CONFIG_UNZIP
+	bool "unzip"
+	default n
+	help
+	  unzip will list or extract files from a ZIP archive,
+	  commonly found on DOS/WIN systems. The default behavior
+	  (with no options) is to extract the archive into the
+	  current directory. Use the `-d' option to extract to a
+	  directory of your choice.
+
+comment "Common options for cpio and tar"
+	depends on BUSYBOX_CONFIG_CPIO || BUSYBOX_CONFIG_TAR
+
+config BUSYBOX_CONFIG_FEATURE_UNARCHIVE_TAPE
+	bool "  Enable tape drive support"
+	default n
+	depends on BUSYBOX_CONFIG_CPIO || BUSYBOX_CONFIG_TAR
+	help
+	  I don't think this is needed anymore.
+
+comment "Common options for dpkg and dpkg_deb"
+	depends on BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB
+
+config BUSYBOX_CONFIG_FEATURE_DEB_TAR_GZ
+	bool "  gzip debian packages (normal)"
+	default n if BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB
+	depends on BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB
+	help
+	  This is the default compression method inside the debian ar file.
+	
+	  If you want compatibility with standard .deb's you should say yes here.
+
+config BUSYBOX_CONFIG_FEATURE_DEB_TAR_BZ2
+	bool "  bzip2 debian packages"
+	default n
+	depends on BUSYBOX_CONFIG_DPKG || BUSYBOX_CONFIG_DPKG_DEB
+	help
+	  This allows dpkg and dpkg-deb to extract deb's that are compressed internally
+	  with bzip2 instead of gzip.
+	
+	  You only want this if you are creating your own custom debian packages that
+	  use an internal control.tar.bz2 or data.tar.bz2.
+
+endmenu
+

--- /dev/null
+++ b/package/busybox/config/console-tools/Config.in
@@ -1,1 +1,69 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Console Utilities"
+
+config BUSYBOX_CONFIG_CHVT
+	bool "chvt"
+	default n
+	help
+	  This program is used to change to another terminal.
+	  Example: chvt 4 (change to terminal /dev/tty4)
+
+config BUSYBOX_CONFIG_CLEAR
+	bool "clear"
+	default y
+	help
+	  This program clears the terminal screen.
+
+config BUSYBOX_CONFIG_DEALLOCVT
+	bool "deallocvt"
+	default n
+	help
+	  This program deallocates unused virtual consoles.
+
+config BUSYBOX_CONFIG_DUMPKMAP
+	bool "dumpkmap"
+	default n
+	help
+	  This program dumps the kernel's keyboard translation table to
+	  stdout, in binary format. You can then use loadkmap to load it.
+
+config BUSYBOX_CONFIG_LOADFONT
+	bool "loadfont"
+	default n
+	help
+	  This program loads a console font from standard input.
+
+config BUSYBOX_CONFIG_LOADKMAP
+	bool "loadkmap"
+	default n
+	help
+	  This program loads a keyboard translation table from
+	  standard input.
+
+config BUSYBOX_CONFIG_OPENVT
+	bool "openvt"
+	default n
+	help
+	  This program is used to start a command on an unused
+	  virtual terminal.
+
+config BUSYBOX_CONFIG_RESET
+	bool "reset"
+	default y
+	help
+	  This program is used to reset the terminal screen, if it
+	  gets messed up.
+
+config BUSYBOX_CONFIG_SETKEYCODES
+	bool "setkeycodes"
+	default n
+	help
+	  This program loads entries into the kernel's scancode-to-keycode
+	  map, allowing unusual keyboards to generate usable keycodes.
+
+endmenu
+

--- /dev/null
+++ b/package/busybox/config/coreutils/Config.in
@@ -1,1 +1,614 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Coreutils"
+
+config BUSYBOX_CONFIG_BASENAME
+	bool "basename"
+	default y
+	help
+	  basename is used to strip the directory and suffix from filenames,
+	  leaving just the filename itself.  Enable this option if you wish
+	  to enable the 'basename' utility.
+
+config BUSYBOX_CONFIG_CAL
+	bool "cal"
+	default n
+	help
+	  cal is used to display a monthly calender.
+
+config BUSYBOX_CONFIG_CAT
+	bool "cat"
+	default y
+	help
+	  cat is used to concatenate files and print them to the standard
+	  output.  Enable this option if you wish to enable the 'cat' utility.
+
+config BUSYBOX_CONFIG_CHGRP
+	bool "chgrp"
+	default y
+	help
+	  chgrp is used to change the group ownership of files.
+
+config BUSYBOX_CONFIG_CHMOD
+	bool "chmod"
+	default y
+	help
+	  chmod is used to change the access permission of files.
+
+config BUSYBOX_CONFIG_CHOWN
+	bool "chown"
+	default y
+	help
+	  chown is used to change the user and/or group ownership
+	  of files.
+
+config BUSYBOX_CONFIG_CHROOT
+	bool "chroot"
+	default y
+	help
+	  chroot is used to change the root directory and run a command.
+	  The default command is `/bin/sh'.
+
+config BUSYBOX_CONFIG_CMP
+	bool "cmp"
+	default n
+	help
+	  cmp is used to compare two files and returns the result
+	  to standard output.
+
+config BUSYBOX_CONFIG_CP
+	bool "cp"
+	default y
+	help
+	  cp is used to copy files and directories.
+
+config BUSYBOX_CONFIG_CUT
+	bool "cut"
+	default y
+	help
+	  cut is used to print selected parts of lines from
+	  each file to stdout.
+
+if BUSYBOX_CONFIG_WATCH
+	config BUSYBOX_CONFIG_DATE
+		default y
+	comment "date (forced enabled for use with watch)"
+endif
+
+if !CONFIG_WATCH
+    config BUSYBOX_CONFIG_DATE
+	    bool "date"
+	    default y
+	    help
+	      date is used to set the system date or display the
+	      current time in the given format.
+endif
+
+config BUSYBOX_CONFIG_FEATURE_DATE_ISOFMT
+	bool "  Enable ISO date format output (-I)"
+	default y
+	depends on BUSYBOX_CONFIG_DATE
+	help
+	  Enable option (-I) to output an ISO-8601 compliant
+	  date/time string.
+
+config BUSYBOX_CONFIG_DD
+	bool "dd"
+	default y
+	help
+	  dd copies a file (from standard input to standard output,
+	  by default) using specific input and output blocksizes,
+	  while optionally performing conversions on it.
+
+config BUSYBOX_CONFIG_DF
+	bool "df"
+	default y
+	help
+	  df reports the amount of disk space used and available
+	  on filesystems.
+
+config BUSYBOX_CONFIG_DIRNAME
+	bool "dirname"
+	default n
+	help
+	  dirname is used to strip a non-directory suffix from
+	  a file name.
+
+config BUSYBOX_CONFIG_DOS2UNIX
+	bool "dos2unix/unix2dos"
+	default n
+	help
+	  dos2unix is used to convert a text file from DOS format to
+	  UNIX format, and vice versa.
+
+config BUSYBOX_CONFIG_UNIX2DOS
+	bool
+	default n
+	depends on BUSYBOX_CONFIG_DOS2UNIX
+
+config BUSYBOX_CONFIG_DU
+	bool "du (default blocksize of 512 bytes)"
+	default n
+	help
+	  du is used to report the amount of disk space used
+	  for specified files.
+
+config BUSYBOX_CONFIG_FEATURE_DU_DEFALT_BLOCKSIZE_1K
+	bool "  Use a default blocksize of 1024 bytes (1K)"
+	default n
+	depends on BUSYBOX_CONFIG_DU
+	help
+	  Use a blocksize of (1K) instead of the default 512b.
+
+config BUSYBOX_CONFIG_ECHO
+	bool "echo (basic SUSv3 version taking no options)"
+	default y
+	help
+	  echo is used to print a specified string to stdout.
+
+config BUSYBOX_CONFIG_FEATURE_FANCY_ECHO
+	bool "  Enable echo options (-n and -e)"
+	default y
+	depends on BUSYBOX_CONFIG_ECHO
+	help
+	  This adds options (-n and -e) to echo.
+
+config BUSYBOX_CONFIG_ENV
+	bool "env"
+	default y
+	help
+	  env is used to set an environment variable and run
+	  a command; without options it displays the current
+	  environment.
+
+config BUSYBOX_CONFIG_EXPR
+	bool "expr"
+	default y
+	help
+	  expr is used to calculate numbers and print the result
+	  to standard output.
+
+if BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_MSH
+	config BUSYBOX_CONFIG_FALSE
+		default y
+	comment "false (forced enabled for use with shell)"
+endif
+
+if !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH
+    config BUSYBOX_CONFIG_FALSE
+	    bool "false"
+	    default y
+	    help
+	      false returns an exit code of FALSE (1).
+endif
+
+config BUSYBOX_CONFIG_FOLD
+	bool "fold"
+	default n
+	help
+	  Wrap text to fit a specific width.
+
+config BUSYBOX_CONFIG_HEAD
+	bool "head"
+	default y
+	help
+	  head is used to print the first specified number of lines
+	  from files.
+
+config BUSYBOX_CONFIG_FEATURE_FANCY_HEAD
+	bool "  Enable head options (-c, -q, and -v)"
+	default n
+	depends on BUSYBOX_CONFIG_HEAD
+	help
+	  This enables the head options (-c, -q, and -v).
+
+config BUSYBOX_CONFIG_HOSTID
+	bool "hostid"
+	default y
+	help
+	  hostid prints the numeric identifier (in hexadecimal) for
+	  the current host.
+
+config BUSYBOX_CONFIG_ID
+	bool "id"
+	default n
+	help
+	  id displays the current user and group ID names.
+
+config BUSYBOX_CONFIG_INSTALL
+	bool "install"
+	default y
+	help
+	  Copy files and set attributes.
+
+config BUSYBOX_CONFIG_LENGTH
+	bool "length"
+	default y
+	help
+	  length is used to print out the length of a specified string.
+
+config BUSYBOX_CONFIG_LN
+	bool "ln"
+	default y
+	help
+	  ln is used to create hard or soft links between files.
+
+config BUSYBOX_CONFIG_LOGNAME
+	bool "logname"
+	default n
+	help
+	  logname is used to print the current user's login name.
+
+config BUSYBOX_CONFIG_LS
+	bool "ls"
+	default y
+	help
+	  ls is used to list the contents of directories.
+
+config BUSYBOX_CONFIG_FEATURE_LS_FILETYPES
+	bool "  Enable filetyping options (-p and -F)"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Enable the ls options (-p and -F).
+
+config BUSYBOX_CONFIG_FEATURE_LS_FOLLOWLINKS
+	bool "  Enable symlinks dereferencing (-L)"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Enable the ls option (-L).
+
+config BUSYBOX_CONFIG_FEATURE_LS_RECURSIVE
+	bool "  Enable recursion (-R)"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Enable the ls option (-R).
+
+config BUSYBOX_CONFIG_FEATURE_LS_SORTFILES
+	bool "  Sort the file names"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Allow ls to sort file names alphabetically.
+
+config BUSYBOX_CONFIG_FEATURE_LS_TIMESTAMPS
+	bool "  Show file timestamps"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Allow ls to display timestamps for files.
+
+config BUSYBOX_CONFIG_FEATURE_LS_USERNAME
+	bool "  Show username/groupnames"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Allow ls to display username/groupname for files.
+
+config BUSYBOX_CONFIG_FEATURE_LS_COLOR
+	bool "  Use color to identify file types"
+	default y
+	depends on BUSYBOX_CONFIG_LS
+	help
+	  Allow ls to use color when displaying files.
+
+config BUSYBOX_CONFIG_MD5SUM
+	bool "md5sum"
+	default y
+	help
+	  md5sum is used to print or check MD5 checksums.
+
+config BUSYBOX_CONFIG_MKDIR
+	bool "mkdir"
+	default y
+	help
+	  mkdir is used to create directories with the specified names.
+
+config BUSYBOX_CONFIG_MKFIFO
+	bool "mkfifo"
+	default y
+	help
+	  mkfifo is used to create FIFOs (named pipes).
+	  The `mknod' program can also create FIFOs.
+
+config BUSYBOX_CONFIG_MKNOD
+	bool "mknod"
+	default n
+	help
+	  mknod is used to create FIFOs or block/character special
+	  files with the specified names.
+
+config BUSYBOX_CONFIG_MV
+	bool "mv"
+	default y
+	help
+	  mv is used to move or rename files or directories.
+
+config BUSYBOX_CONFIG_OD
+	bool "od"
+	default n
+	help
+	  od is used to dump binary files in octal and other formats.
+
+config BUSYBOX_CONFIG_PRINTF
+	bool "printf"
+	default n
+	help
+	  printf is used to format and print specified strings.
+	  It's similar to `echo' except it has more options.
+
+config BUSYBOX_CONFIG_PWD
+	bool "pwd"
+	default y
+	help
+	  pwd is used to print the current directory.
+
+config BUSYBOX_CONFIG_REALPATH
+	bool "realpath"
+	default n
+	help
+	  Return the canonicalized absolute pathname.
+	  This isn't provided by GNU shellutils, but where else does it belong.
+
+config BUSYBOX_CONFIG_RM
+	bool "rm"
+	default y
+	help
+	  rm is used to remove files or directories.
+
+config BUSYBOX_CONFIG_RMDIR
+	bool "rmdir"
+	default y
+	help
+	  rmdir is used to remove empty directories.
+
+config BUSYBOX_CONFIG_SEQ
+	bool "seq"
+	default n
+	help
+	  print a sequence of numbers
+
+config BUSYBOX_CONFIG_SHA1SUM
+	bool "sha1sum"
+	default n
+	help
+	  Compute and check SHA1 message digest
+
+config BUSYBOX_CONFIG_SLEEP
+	bool "sleep (single integer arg with no suffix)"
+	default y
+	help
+	  sleep is used to pause for a specified number of seconds,
+
+config BUSYBOX_CONFIG_FEATURE_FANCY_SLEEP
+	bool "  Enable multiple integer args and optional time suffixes"
+	default y
+	depends on BUSYBOX_CONFIG_SLEEP
+	help
+	  Allow sleep to pause for specified minutes, hours, and days.
+
+config BUSYBOX_CONFIG_SORT
+	bool "sort"
+	default y
+	help
+	  sort is used to sort lines of text in specified files.
+
+config BUSYBOX_CONFIG_STTY
+	bool "stty"
+	default n
+	help
+	  stty is used to change and print terminal line settings.
+
+config BUSYBOX_CONFIG_SYNC
+	bool "sync"
+	default y
+	help
+	  sync is used to flush filesystem buffers.
+
+config BUSYBOX_CONFIG_TAIL
+	bool "tail"
+	default y
+	help
+	  tail is used to print the last specified number of lines
+	  from files.
+
+config BUSYBOX_CONFIG_FEATURE_FANCY_TAIL
+	bool "  Enable extra tail options (-q, -s, and -v)"
+	default y
+	depends on BUSYBOX_CONFIG_TAIL
+	help
+	  The options (-q, -s, and -v) are provided by GNU tail, but
+	  are not specific in the SUSv3 standard.
+
+config BUSYBOX_CONFIG_TEE
+	bool "tee"
+	default y
+	help
+	  tee is used to read from standard input and write
+	  to standard output and files.
+
+config BUSYBOX_CONFIG_FEATURE_TEE_USE_BLOCK_IO
+	bool "  Enable block i/o (larger/faster) instead of byte i/o."
+	default y
+	depends on BUSYBOX_CONFIG_TEE
+	help
+	  Enable this option for a faster tee, at expense of size.
+
+if BUSYBOX_CONFIG_ASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_MSH
+	config BUSYBOX_CONFIG_TEST
+		default y
+	comment "test (forced enabled for use with shell)"
+endif
+
+if !CONFIG_ASH && !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH
+    config BUSYBOX_CONFIG_TEST
+	    bool "test"
+	    default y
+	    help
+	      test is used to check file types and compare values,
+	      returning an appropriate exit code. The shells (ash
+	      and bash) have test builtin.
+endif
+
+config BUSYBOX_CONFIG_FEATURE_TEST_64
+	bool "  Extend test to 64 bit"
+	default n
+	depends on BUSYBOX_CONFIG_TEST
+	help
+	  Enable 64-bit support in test.
+
+config BUSYBOX_CONFIG_TOUCH
+	bool "touch"
+	default y
+	help
+	  touch is used to create or change the access and/or
+	  modification timestamp of specified files.
+
+config BUSYBOX_CONFIG_TR
+	bool "tr"
+	default n
+	help
+	  tr is used to squeeze, and/or delete characters from standard
+	  input, writing to standard output.
+
+if BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_MSH
+	config BUSYBOX_CONFIG_TRUE
+		default y
+	comment "true (forced enabled for use with shell)"
+endif
+
+if !CONFIG_HUSH && !CONFIG_LASH && !CONFIG_MSH
+    config BUSYBOX_CONFIG_TRUE
+	    bool "true"
+	    default y
+	    help
+	      true returns an exit code of TRUE (0).
+
+endif
+
+config BUSYBOX_CONFIG_TTY
+	bool "tty"
+	default n
+	help
+	  tty is used to print the name of the current terminal to
+	  standard output.
+
+config BUSYBOX_CONFIG_UNAME
+	bool "uname"
+	default y
+	help
+	  uname is used to print system information.
+
+config BUSYBOX_CONFIG_UNIQ
+	bool "uniq"
+	default y
+	help
+	  uniq is used to remove duplicate lines from a sorted file.
+
+config BUSYBOX_CONFIG_USLEEP
+	bool "usleep"
+	default n
+	help
+	  usleep is used to pause for a specified number of microseconds.
+
+config BUSYBOX_CONFIG_UUDECODE
+	bool "uudecode"
+	default n
+	help
+	  uudecode is used to decode a uuencoded file.
+
+config BUSYBOX_CONFIG_UUENCODE
+	bool "uuencode"
+	default n
+	help
+	  uuencode is used to uuencode a file.
+
+config BUSYBOX_CONFIG_WATCH
+	bool "watch"
+	default n
+	help
+	  watch is used to execute a program periodically, showing
+	  output to the screen.
+
+config BUSYBOX_CONFIG_WC
+	bool "wc"
+	default y
+	help
+	  wc is used to print the number of bytes, words, and lines,
+	  in specified files.
+
+config BUSYBOX_CONFIG_WHO
+	bool "who"
+	default n
+	select BUSYBOX_CONFIG_FEATURE_U_W_TMP
+	help
+	  who is used to show who is logged on.
+
+config BUSYBOX_CONFIG_WHOAMI
+	bool "whoami"
+	default n
+	help
+	  whoami is used to print the username of the current
+	  user id (same as id -un).
+
+config BUSYBOX_CONFIG_YES
+	bool "yes"
+	default y
+	help
+	  yes is used to repeatedly output a specific string, or
+	  the default string `y'.
+
+comment "Common options for cp and mv"
+    depends on BUSYBOX_CONFIG_CP || BUSYBOX_CONFIG_MV
+
+config BUSYBOX_CONFIG_FEATURE_PRESERVE_HARDLINKS
+	bool "  Preserve hard links"
+	default y
+	depends on BUSYBOX_CONFIG_CP || BUSYBOX_CONFIG_MV
+	help
+	  Allow cp and mv to preserve hard links.
+
+comment "Common options for ls and more"
+	depends on BUSYBOX_CONFIG_LS || BUSYBOX_CONFIG_MORE
+
+config BUSYBOX_CONFIG_FEATURE_AUTOWIDTH
+	bool "  Calculate terminal & column widths"
+	default y
+	depends on BUSYBOX_CONFIG_LS || BUSYBOX_CONFIG_MORE
+	help
+	  This option allows utilities such as 'ls' and 'more' to determine the
+	  width of the screen, which can allow them to display additional text
+	  or avoid wrapping text onto the next line.  If you leave this
+	  disabled, your utilities will be especially primitive and will be
+	  unable to determine the current screen width.
+
+comment "Common options for df, du, ls"
+    depends on BUSYBOX_CONFIG_DF || BUSYBOX_CONFIG_DU || BUSYBOX_CONFIG_LS
+
+config BUSYBOX_CONFIG_FEATURE_HUMAN_READABLE
+	bool "  Support for human readable output (example 13k, 23M, 235G)"
+	default y
+	depends on BUSYBOX_CONFIG_DF || BUSYBOX_CONFIG_DU || BUSYBOX_CONFIG_LS
+	help
+	  Allow df, du, and ls to have human readable output.
+
+comment "Common options for md5sum, sha1sum"
+    depends on BUSYBOX_CONFIG_MD5SUM || BUSYBOX_CONFIG_SHA1SUM
+
+config BUSYBOX_CONFIG_FEATURE_MD5_SHA1_SUM_CHECK
+	bool "  Enable -c, -s and -w options"
+	default y
+	depends on BUSYBOX_CONFIG_MD5SUM || BUSYBOX_CONFIG_SHA1SUM
+	help
+	  Enabling the -c options allows files to be checked
+	  against pre-calculated hash values.
+
+	  -s and -w are useful options when verifying checksums.
+
+endmenu
+

--- /dev/null
+++ b/package/busybox/config/debianutils/Config.in
@@ -1,1 +1,59 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Debian Utilities"
+
+config BUSYBOX_CONFIG_MKTEMP
+	bool "mktemp"
+	default y
+	help
+	  mktemp is used to create unique temporary files
+
+config BUSYBOX_CONFIG_PIPE_PROGRESS
+	bool "pipe_progress"
+	default n
+	help
+	  Display a dot to indicate pipe activity.
+
+config BUSYBOX_CONFIG_READLINK
+	bool "readlink"
+	default n
+	help
+	  This program reads a symbolic link and returns the name
+	  of the file it points to
+
+config BUSYBOX_CONFIG_RUN_PARTS
+	bool "run-parts"
+	default y
+	help
+	  run-parts is a utility designed to run all the scripts in a directory.
+
+	  It is useful to set up a directory like cron.daily, where you need to
+	  execute all the scripts in that directory.
+
+	  In this implementation of run-parts some features (such as report mode)
+	  are not implemented.
+
+	  Unless you know that run-parts is used in some of your scripts
+	  you can safely say N here.
+
+config BUSYBOX_CONFIG_START_STOP_DAEMON
+	bool "start-stop-daemon"
+	default y
+	help
+	  start-stop-daemon is used to control the creation and
+	  termination of system-level processes, usually the ones
+	  started during the startup of the system.
+
+config BUSYBOX_CONFIG_WHICH
+	bool "which"
+	default y
+	help
+	  which is used to find programs in your PATH and
+	  print out their pathnames.
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/editors/Config.in
@@ -1,1 +1,124 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Editors"
+
+config BUSYBOX_CONFIG_AWK
+	bool "awk"
+	default y
+	help
+	  Awk is used as a pattern scanning and processing language.  This is
+	  the BusyBox implementation of that programming language.
+
+config BUSYBOX_CONFIG_FEATURE_AWK_MATH
+	bool "  Enable math functions (requires libm)"
+	default y
+	depends on BUSYBOX_CONFIG_AWK
+	help
+	  Enable math functions of the Awk programming language.
+	  NOTE: This will require libm to be present for linking.
+
+config BUSYBOX_CONFIG_PATCH
+	bool "patch"
+	default n
+	help
+	  Apply a unified diff formatted patch.
+
+config BUSYBOX_CONFIG_SED
+	bool "sed"
+	default y
+	help
+	  sed is used to perform text transformations on a file
+	  or input from a pipeline.
+
+config BUSYBOX_CONFIG_VI
+	bool "vi"
+	default y
+	help
+	  'vi' is a text editor.  More specifically, it is the One True
+	  text editor <grin>.  It does, however, have a rather steep
+	  learning curve.  If you are not already comfortable with 'vi'
+	  you may wish to use something else.
+
+config BUSYBOX_CONFIG_FEATURE_VI_COLON
+	bool "  Enable \":\" colon commands (no \"ex\" mode)"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Enable a limited set of colon commands for vi.  This does not
+	  provide an "ex" mode.
+
+config BUSYBOX_CONFIG_FEATURE_VI_YANKMARK
+	bool "  Enable yank/put commands and mark cmds"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  This will enable you to use yank and put, as well as mark in
+	  busybox vi.
+
+config BUSYBOX_CONFIG_FEATURE_VI_SEARCH
+	bool "  Enable search and replace cmds"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Select this if you wish to be able to do search and replace in
+	  busybox vi.
+
+config BUSYBOX_CONFIG_FEATURE_VI_USE_SIGNALS
+	bool "  Catch signals"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Selecting this option will make busybox vi signal aware.  This will
+	  make busybox vi support SIGWINCH to deal with Window Changes, catch
+	  Ctrl-Z and Ctrl-C and alarms.
+
+config BUSYBOX_CONFIG_FEATURE_VI_DOT_CMD
+	bool "  Remember previous cmd and \".\" cmd"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Make busybox vi remember the last command and be able to repeat it.
+
+config BUSYBOX_CONFIG_FEATURE_VI_READONLY
+	bool "  Enable -R option and \"view\" mode"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Enable the read-only command line option, which allows the user to
+	  open a file in read-only mode.
+
+config BUSYBOX_CONFIG_FEATURE_VI_SETOPTS
+	bool "  Enable set-able options, ai ic showmatch"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Enable the editor to set some (ai, ic, showmatch) options.
+
+config BUSYBOX_CONFIG_FEATURE_VI_SET
+	bool "  Support for :set"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Support for ":set".
+
+config BUSYBOX_CONFIG_FEATURE_VI_WIN_RESIZE
+	bool "  Handle window resize"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  Make busybox vi behave nicely with terminals that get resized.
+
+config BUSYBOX_CONFIG_FEATURE_VI_OPTIMIZE_CURSOR
+	bool "  Optimize cursor movement"
+	default y
+	depends on BUSYBOX_CONFIG_VI
+	help
+	  This will make the cursor movement faster, but requires more memory
+	  and it makes the applet a tiny bit larger.
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/findutils/Config.in
@@ -1,1 +1,134 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Finding Utilities"
+
+config BUSYBOX_CONFIG_FIND
+	bool "find"
+	default y
+	help
+	  find is used to search your system to find specified files.
+
+config BUSYBOX_CONFIG_FEATURE_FIND_MTIME
+	bool "  Enable modified time matching (-mtime) option"
+	default n
+	depends on BUSYBOX_CONFIG_FIND
+	help
+	  Allow searching based on the modification time of
+	  files.
+
+config BUSYBOX_CONFIG_FEATURE_FIND_PERM
+	bool "  Enable permissions matching (-perm) option"
+	default y
+	depends on BUSYBOX_CONFIG_FIND
+	help
+	  Enable searching based on file permissions.
+
+config BUSYBOX_CONFIG_FEATURE_FIND_TYPE
+	bool "  Enable filetype matching (-type) option"
+	default y
+	depends on BUSYBOX_CONFIG_FIND
+	help
+	  Enable searching based on file type (file,
+	  directory, socket, device, etc.).
+
+config BUSYBOX_CONFIG_FEATURE_FIND_XDEV
+	bool "  Enable stay in filesystem (-xdev) option"
+	default y
+	depends on BUSYBOX_CONFIG_FIND
+	help
+	  This option will allow find to restrict searches to a single
+	  filesystem.
+
+config BUSYBOX_CONFIG_FEATURE_FIND_NEWER
+	bool "  Enable -newer option for comparing file mtimes"
+	default n
+	depends on BUSYBOX_CONFIG_FIND
+	help
+	  Support the 'find -newer' option for finding any files which have
+	  a modified time that is more recent than the specified FILE.
+
+config BUSYBOX_CONFIG_FEATURE_FIND_INUM
+	bool "  Enable inode number matching (-inum) option"
+	default n
+	depends on BUSYBOX_CONFIG_FIND
+	help
+	  Support the 'find -inum' option for searching by inode number.
+
+config BUSYBOX_CONFIG_GREP
+	bool "grep"
+	default y
+	help
+	  grep is used to search files for a specified pattern.
+
+config BUSYBOX_CONFIG_FEATURE_GREP_EGREP_ALIAS
+	bool "  Support extended regular expressions (egrep & grep -E)"
+	default y
+	depends on BUSYBOX_CONFIG_GREP
+	help
+	  Enabled support for extended regular expressions.  Extended
+	  regular expressions allow for alternation (foo|bar), grouping,
+	  and various repetition operators.
+
+config BUSYBOX_CONFIG_FEATURE_GREP_FGREP_ALIAS
+	bool "  Alias fgrep to grep -f"
+	default y
+	depends on BUSYBOX_CONFIG_GREP
+	help
+          fgrep sees the search pattern as a normal string rather than
+	  regular expressions.
+	  grep -f is always builtin, this just creates the fgrep alias.
+
+config BUSYBOX_CONFIG_FEATURE_GREP_CONTEXT
+	bool "  Enable before and after context flags (-A, -B and -C)"
+	default y
+	depends on BUSYBOX_CONFIG_GREP
+	help
+	  Print the specified number of leading (-B) and/or trailing (-A)
+	  context surrounding our matching lines.
+	  Print the specified number of context lines (-C).
+
+config BUSYBOX_CONFIG_XARGS
+	bool "xargs"
+	default y
+	help
+	  xargs is used to execute a specified command on
+	  every item from standard input.
+
+config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_CONFIRMATION
+	bool "  Enable prompt and confirmation option -p"
+	default y
+	depends on BUSYBOX_CONFIG_XARGS
+	help
+	  Support prompt the user about whether to run each command
+	  line and read a line from the terminal.
+
+config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_QUOTES
+	bool "  Enable support single and double quotes and backslash"
+	default y
+	depends on BUSYBOX_CONFIG_XARGS
+	help
+	  Default xargs unsupport single and double quotes
+	  and backslash for can use aruments with spaces.
+
+config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_TERMOPT
+	bool "  Enable support options -x"
+	default y
+	depends on BUSYBOX_CONFIG_XARGS
+	help
+	  Enable support exit if the size (see the -s or -n option)
+	  is exceeded.
+
+config BUSYBOX_CONFIG_FEATURE_XARGS_SUPPORT_ZERO_TERM
+	bool "  Enable options -0"
+	default y
+	depends on BUSYBOX_CONFIG_XARGS
+	help
+	  Enable input filenames are terminated by a null character
+	  instead of by whitespace, and the quotes and backslash
+	  are not special.
+
+endmenu
+

--- /dev/null
+++ b/package/busybox/config/init/Config.in
@@ -1,1 +1,73 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Init Utilities"
+
+config BUSYBOX_CONFIG_INIT
+	bool "init"
+	default y
+	help
+	  init is the first program run when the system boots.
+
+config BUSYBOX_CONFIG_FEATURE_USE_INITTAB
+	bool "  Support reading an inittab file?"
+	default y
+	depends on BUSYBOX_CONFIG_INIT
+	help
+	  Allow init to read an inittab file when the system boot.
+
+config BUSYBOX_CONFIG_FEATURE_INITRD
+	bool "  Support running init from within an initrd?"
+	default n
+	depends on BUSYBOX_CONFIG_INIT
+	help
+	  Allow init to be called from an initrd as linuxrc.
+
+config BUSYBOX_CONFIG_FEATURE_INIT_COREDUMPS
+	bool "  Support dumping core for child processes (debugging only)?"
+	default n
+	depends on BUSYBOX_CONFIG_INIT
+	help
+	  If this option is enabled and the file /.init_enable_core
+	  exists, then init will call setrlimit() to allow unlimited
+	  core file sizes.  If this option is disabled, processes
+	  will not generate any core files.
+
+config BUSYBOX_CONFIG_FEATURE_EXTRA_QUIET
+	bool "  Should init be _extra_ quiet on boot?"
+	default n
+	depends on BUSYBOX_CONFIG_INIT
+	help
+	  Prevent init from logging some messages to the console
+	  during boot.
+
+config BUSYBOX_CONFIG_HALT
+	bool "halt"
+	default n
+	help
+	  Stop all processes and halt the system.
+
+config BUSYBOX_CONFIG_POWEROFF
+	bool "poweroff"
+	default n
+	help
+	  Stop all processes and (try to) power off the system.
+
+config BUSYBOX_CONFIG_REBOOT
+	bool "reboot"
+	default y
+	help
+	  Stop all processes and reboot the system.
+
+config BUSYBOX_CONFIG_MESG
+	bool "mesg"
+	default y
+	help
+	  Mesg controls access to your terminal by others.  It is typically
+	  used to allow or disallow other users to write to your terminal
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/loginutils/Config.in
@@ -1,1 +1,162 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Login/Password Management Utilities"
+
+config BUSYBOX_CONFIG_USE_BB_PWD_GRP
+	bool "Use internal password and group functions rather than system functions"
+	default n
+	help
+	    If you leave this disabled, busybox will use the system's password
+	    and group functions.  And if you are using the GNU C library
+	    (glibc), you will then need to install the /etc/nsswitch.conf
+	    configuration file and the required /lib/libnss_* libraries in
+	    order for the password and group functions to work.  This generally
+	    makes your embedded system quite a bit larger.
+
+	    Enabling this option will cause busybox to directly access the
+	    system's /etc/password, /etc/group files (and your system will be
+	    smaller, and I will get fewer emails asking about how glibc NSS
+	    works).  When this option is enabled, you will not be able to use
+	    PAM to access remote LDAP password servers and whatnot.  And if you
+	    want hostname resolution to work with glibc, you still need the
+	    /lib/libnss_* libraries.
+
+	    If you enable this option, it will add about 1.5k to busybox.
+
+
+config BUSYBOX_CONFIG_ADDGROUP
+	bool "addgroup"
+	default n
+	help
+	  Utility for creating a new group account.
+
+config BUSYBOX_CONFIG_DELGROUP
+	bool "delgroup"
+	default n
+	help
+	  Utility for deleting a group account.
+
+config BUSYBOX_CONFIG_ADDUSER
+	bool "adduser"
+	default n
+	help
+	  Utility for creating a new user account.
+
+config BUSYBOX_CONFIG_DELUSER
+	bool "deluser"
+	default n
+	help
+	  Utility for deleting a user account.
+
+config BUSYBOX_CONFIG_GETTY
+	bool "getty"
+	default n
+	help
+	  getty lets you log in on a tty, it is normally invoked by init.
+
+config BUSYBOX_CONFIG_FEATURE_U_W_TMP
+	bool "  Support utmp and wtmp files"
+	depends on BUSYBOX_CONFIG_GETTY || BUSYBOX_CONFIG_LOGIN || BUSYBOX_CONFIG_SU || BUSYBOX_CONFIG_WHO || BUSYBOX_CONFIG_LAST
+	default n
+	help
+	  The files /var/run/utmp and /var/run/wtmp can be used to track when
+	  user's have logged into and logged out of the system, allowing programs
+	  such as 'who' and 'last' to list who is currently logged in.
+
+config BUSYBOX_CONFIG_LOGIN
+	bool "login"
+	default n
+	select BUSYBOX_CONFIG_FEATURE_SUID
+	help
+	  login is used when signing onto a system.
+
+	  Note that Busybox binary must be setuid root for this applet to
+	  work properly.
+
+config BUSYBOX_CONFIG_FEATURE_SECURETTY
+	bool "  Support for /etc/securetty"
+	default n
+	depends on BUSYBOX_CONFIG_LOGIN
+	help
+	  The file  /etc/securetty  is used by (some versions of) login(1).
+	  The file contains the device names of tty lines (one per line,
+	  without leading /dev/) on which root is allowed to login.
+
+config BUSYBOX_CONFIG_PASSWD
+	bool "passwd"
+	default n
+	select BUSYBOX_CONFIG_FEATURE_SUID
+	help
+	  passwd changes passwords for user and group accounts.  A normal user
+	  may only change the password for his/her own account, the super user
+	  may change the password for any account.  The administrator of a group
+	  may change the password for the group.
+
+	  Note that Busybox binary must be setuid root for this applet to
+	  work properly.
+
+config BUSYBOX_CONFIG_SU
+	bool "su"
+	default n
+	select BUSYBOX_CONFIG_FEATURE_SUID
+	help
+	  su is used to become another user during a login session.
+	  Invoked without a username, su defaults to becoming the super user.
+
+	  Note that Busybox binary must be setuid root for this applet to
+	  work properly.
+
+config BUSYBOX_CONFIG_SULOGIN
+	bool "sulogin"
+	default n
+	help
+	  sulogin is invoked when the system goes into single user
+	  mode (this is done through an entry in inittab).
+
+config BUSYBOX_CONFIG_VLOCK
+	bool "vlock"
+	default n
+	select BUSYBOX_CONFIG_FEATURE_SUID
+	help
+	  Build the "vlock" applet which allows you to lock (virtual) terminals.
+
+	  Note that Busybox binary must be setuid root for this applet to
+	  work properly.
+
+comment "Common options for adduser, deluser, login, su"
+	depends on BUSYBOX_CONFIG_ADDUSER || BUSYBOX_CONFIG_DELUSER || BUSYBOX_CONFIG_LOGIN || BUSYBOX_CONFIG_SU
+
+config BUSYBOX_CONFIG_FEATURE_SHADOWPASSWDS
+	bool "Support for shadow passwords"
+	default n
+	depends on BUSYBOX_CONFIG_ADDUSER || BUSYBOX_CONFIG_DELUSER || BUSYBOX_CONFIG_LOGIN || BUSYBOX_CONFIG_SU
+	help
+	  Build support for shadow password in /etc/shadow.  This file is only
+	  readable by root and thus the encrypted passwords are no longer
+	  publicly readable.
+
+config BUSYBOX_CONFIG_USE_BB_SHADOW
+	bool "  Use busybox shadow password functions"
+	default n
+	depends on BUSYBOX_CONFIG_USE_BB_PWD_GRP && BUSYBOX_CONFIG_FEATURE_SHADOWPASSWDS
+	help
+	    If you leave this disabled, busybox will use the system's shadow
+	    password handling functions.  And if you are using the GNU C library
+	    (glibc), you will then need to install the /etc/nsswitch.conf
+	    configuration file and the required /lib/libnss_* libraries in
+	    order for the shadow password functions to work.  This generally
+	    makes your embedded system quite a bit larger.
+
+	    Enabling this option will cause busybox to directly access the
+	    system's /etc/shadow file when handling shadow passwords.  This
+	    makes your system smaller and I will get fewer emails asking about
+	    how glibc NSS works).  When this option is enabled, you will not be
+	    able to use PAM to access shadow passwords from remote LDAP
+	    password servers and whatnot.
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/miscutils/Config.in
@@ -1,1 +1,202 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Miscellaneous Utilities"
+
+config BUSYBOX_CONFIG_ADJTIMEX
+	bool "adjtimex"
+	default n
+	help
+	  Adjtimex reads and optionally sets adjustment parameters for
+	  the Linux clock adjustment algorithm.
+
+config BUSYBOX_CONFIG_CROND
+	bool "crond"
+	default y
+	select BUSYBOX_CONFIG_FEATURE_SUID
+	help
+	  Crond is a background daemon that parses individual crontab
+	  files and executes commands on behalf of the users in question.
+	  This is a port of dcron from slackware.  It uses files of the
+	  format /var/spool/cron/crontabs/<username> files, for example:
+	      $ cat /var/spool/cron/crontabs/root
+	      # Run daily cron jobs at 4:40 every day:
+	      40 4 * * * /etc/cron/daily > /dev/null 2>&1
+	  Note that Busybox binary must be setuid root for this applet to
+	  work properly.
+
+config BUSYBOX_CONFIG_FEATURE_CROND_CALL_SENDMAIL
+	bool "  Using /usr/sbin/sendmail?"
+	default n
+	depends on BUSYBOX_CONFIG_CROND
+	help
+	  Support calling /usr/sbin/sendmail for send cmd outputs.
+
+config BUSYBOX_CONFIG_CRONTAB
+	bool "crontab"
+	default y
+	help
+	  Crontab manipulates the crontab for a particular user.  Only
+	  the superuser may specify a different user and/or crontab directory.
+
+config BUSYBOX_CONFIG_DC
+	bool "dc"
+	default n
+	help
+	  Dc is a reverse-polish desk calculator which supports unlimited
+	  precision arithmetic.
+
+config BUSYBOX_CONFIG_DEVFSD
+	bool "devfsd"
+	default n
+	help
+	  Provides compatibility with old device names on a devfs systems.
+	  You should set it to true if you have devfs enabled.
+	  The following keywords in devsfd.conf are supported:
+	  "CLEAR_CONFIG", "INCLUDE", "OPTIONAL_INCLUDE", "RESTORE",
+	  "PERMISSIONS", "EXECUTE", "COPY", "IGNORE",
+	  "MKOLDCOMPAT", "MKNEWCOMPAT","RMOLDCOMPAT", "RMNEWCOMPAT".
+
+	   But only if they are written UPPERCASE!!!!!!!!
+
+config BUSYBOX_CONFIG_DEVFSD_MODLOAD
+	bool "Adds support for MODLOAD keyword in devsfd.conf"
+	default n
+	depends on BUSYBOX_CONFIG_DEVFSD
+	help
+	  This actually doesn't work with busybox  modutils but needs the real modutils.
+
+config BUSYBOX_CONFIG_DEVFSD_FG_NP
+	bool "Enables the -fg and -np options"
+	default n
+	depends on BUSYBOX_CONFIG_DEVFSD
+	help
+		-fg	Run the daemon in the foreground.
+		-np	Exit  after  parsing  the configuration file. Do not poll for events.
+
+config BUSYBOX_CONFIG_DEVFSD_VERBOSE
+	bool "Increases logging (and size)"
+	default n
+	depends on BUSYBOX_CONFIG_DEVFSD
+	help
+	  Increases logging to stderr or syslog.
+
+config BUSYBOX_CONFIG_LAST
+	bool "last"
+	default n
+	select BUSYBOX_CONFIG_FEATURE_U_W_TMP
+	help
+	  'last' displays a list of the last users that logged into the system.
+
+config BUSYBOX_CONFIG_HDPARM
+	bool "hdparm"
+	default n
+	help
+	  Get/Set hard drive parameters.  Primarily intended for ATA
+	  drives.  Adds about 13k (or around 30k if you enable the
+	  BUSYBOX_CONFIG_FEATURE_HDPARM_GET_IDENTITY option)....
+
+config BUSYBOX_CONFIG_FEATURE_HDPARM_GET_IDENTITY
+	bool "  Support obtaining detailed information directly from drives"
+	default n
+	depends on BUSYBOX_CONFIG_HDPARM
+	help
+	  Enables the -I and -Istdin options to obtain detailed information
+	  directly from drives about their capabilities and supported ATA
+	  feature set.  Enabling this option will add about 16k...
+
+config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_SCAN_HWIF
+	bool "  Register an IDE interface (DANGEROUS)"
+	default n
+	depends on BUSYBOX_CONFIG_HDPARM
+	help
+	  Enables the 'hdparm -R' option to register an IDE interface.
+	  This is dangerous stuff, so you should probably say N.
+
+config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_UNREGISTER_HWIF
+	bool "  Un-register an IDE interface (DANGEROUS)"
+	default n
+	depends on BUSYBOX_CONFIG_HDPARM
+	help
+	  Enables the 'hdparm -U' option to un-register an IDE interface.
+	  This is dangerous stuff, so you should probably say N.
+
+config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_DRIVE_RESET
+	bool "  perform device reset (DANGEROUS)"
+	default n
+	depends on BUSYBOX_CONFIG_HDPARM
+	help
+	  Enables the 'hdparm -w' option to perform a device reset.
+	  This is dangerous stuff, so you should probably say N.
+
+config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_TRISTATE_HWIF
+	bool "  tristate device for hotswap (DANGEROUS)"
+	default n
+	depends on BUSYBOX_CONFIG_HDPARM
+	help
+	  Enables the 'hdparm -x' option to tristate device for hotswap,
+	  and the '-b' option to get/set bus state.  This is dangerous
+	  stuff, so you should probably say N.
+
+config BUSYBOX_CONFIG_FEATURE_HDPARM_HDIO_GETSET_DMA
+	bool "  get/set using_dma flag (DANGEROUS)"
+	default n
+	depends on BUSYBOX_CONFIG_HDPARM
+	help
+	  Enables the 'hdparm -d' option to get/set using_dma flag.
+	  This is dangerous stuff, so you should probably say N.
+
+config BUSYBOX_CONFIG_MAKEDEVS
+	bool "makedevs"
+	default n
+	help
+	  'makedevs' is a utility used and created by the Linux Router Project.
+	  It creates a large number of device special files (/dev devices)
+	  rather quickly, and can be considerably faster then running mknod a
+	  zillion times.
+
+config BUSYBOX_CONFIG_MT
+	bool "mt"
+	default n
+	help
+	  mt is used to control tape devices.  You can use the mt utility
+	  to advance or rewind a tape past a specified number of archive
+	  files on the tape.
+
+config BUSYBOX_CONFIG_RX
+        bool "rx"
+	default n
+	help
+ 	  Receive files using the Xmodem protocol.
+
+config BUSYBOX_CONFIG_STRINGS
+	bool "strings"
+	default y
+	help
+	  strings prints the printable character sequences for each file
+	  specified.
+
+config BUSYBOX_CONFIG_TIME
+	bool "time"
+	default y
+	help
+	  The time command runs the specified program with the given arguments.
+	  When the command finishes, time writes a message to standard output
+	  giving timing statistics about this program run.
+
+config BUSYBOX_CONFIG_WATCHDOG
+	bool "watchdog"
+	default n
+	help
+	  The watchdog utility is used with hardware or software watchdog
+	  device drivers.  It opens the specified watchdog device special file
+	  and periodically writes a magic character to the device.  If the
+	  watchdog applet ever fails to write the magic character within a
+	  certain amount of time, the watchdog device assumes the system has
+	  hung, and will cause the hardware to reboot.
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/modutils/Config.in
@@ -1,1 +1,114 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Linux Module Utilities"
+
+config BUSYBOX_CONFIG_INSMOD
+	bool "insmod"
+	default y
+	help
+	  insmod is used to load specified modules in the running kernel.
+
+config BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	bool "  Support version 2.2.x to 2.4.x Linux kernels"
+	default y
+	depends on BUSYBOX_CONFIG_INSMOD
+	help
+	  Support module loading for 2.2.x and 2.4.x Linux kernels.
+
+config BUSYBOX_CONFIG_FEATURE_2_6_MODULES
+	bool "  Support version 2.6.x Linux kernels"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD
+	help
+	  Support module loading for newer 2.6.x Linux kernels.
+
+config BUSYBOX_CONFIG_FEATURE_INSMOD_VERSION_CHECKING
+	bool "  Module version checking"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	help
+	  Support checking of versions for modules.  This is used to
+	  ensure that the kernel and module are made for each other.
+
+config BUSYBOX_CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
+	bool "  Add module symbols to kernel symbol table"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	help
+	  By adding module symbols to the kernel symbol table, Oops messages
+	  occuring within kernel modules can be properly debugged.  By enabling
+	  this feature, module symbols will always be added to the kernel symbol
+	  table for properly debugging support.  If you are not interested in
+	  Oops messages from kernel modules, say N.
+
+config BUSYBOX_CONFIG_FEATURE_INSMOD_LOADINKMEM
+	bool "  In kernel memory optimization (uClinux only)"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	help
+	  This is a special uClinux only memory optimization that lets insmod
+	  load the specified kernel module directly into kernel space, reducing
+	  memory usage by preventing the need for two copies of the module
+	  being loaded into memory.
+
+config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP
+	bool "  Enable load map (-m) option"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD && BUSYBOX_CONFIG_FEATURE_2_4_MODULES
+	help
+	  Enabling this, one would be able to get a load map
+	  output on stdout. This makes kernel module debugging
+	  easier.
+	  If you don't plan to debug kernel modules, you
+	  don't need this option.
+
+config BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL
+	bool "  Symbols in load map"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_INSMOD_LOAD_MAP
+	help
+	  Without this option, -m will only output section
+	  load map.  With this option, -m will also output
+	  symbols load map.
+
+config BUSYBOX_CONFIG_LSMOD
+	bool "lsmod"
+	default y
+	help
+	  lsmod is used to display a list of loaded modules.
+
+config BUSYBOX_CONFIG_FEATURE_QUERY_MODULE_INTERFACE
+	bool
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_2_4_MODULES && !CONFIG_FEATURE_2_6_MODULES
+
+config BUSYBOX_CONFIG_MODPROBE
+	bool "modprobe"
+	default n
+	help
+	  Handle the loading of modules, and their dependancies on a high
+	  level.
+
+config BUSYBOX_CONFIG_RMMOD
+	bool "rmmod"
+	default y
+	help
+	  rmmod is used to unload specified modules from the kernel.
+
+config BUSYBOX_CONFIG_FEATURE_CHECK_TAINTED_MODULE
+	bool "Support tainted module checking with new kernels"
+	default n
+	depends on BUSYBOX_CONFIG_INSMOD || BUSYBOX_CONFIG_LSMOD
+	help
+	  Support checking for tainted modules.  These are usually binary
+	  only modules that will make the linux-kernel list ignore your
+	  support request.
+	  This option is required to support GPLONLY modules.
+
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/networking/Config.in
@@ -1,1 +1,635 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Networking Utilities"
+
+config BUSYBOX_CONFIG_FEATURE_IPV6
+	bool "Enable IPv6 support"
+	default y
+	help
+	  Enable IPv6 support to busybox. This makes applets that talk IP
+	  able to work with IPv6.
+
+config BUSYBOX_CONFIG_ARPING
+	bool "arping"
+	default y
+	help
+	  Ping hosts by ARP packets
+
+config BUSYBOX_CONFIG_FTPGET
+	bool "ftpget"
+	default n
+	help
+	  Retrieve a remote file via FTP.
+
+config BUSYBOX_CONFIG_FTPPUT
+	bool "ftpput"
+	default n
+	help
+	  Store a remote file via FTP.
+
+config BUSYBOX_CONFIG_HOSTNAME
+	bool "hostname"
+	default n
+	help
+	  Show or set the system's host name
+
+config BUSYBOX_CONFIG_HTTPD
+	bool "httpd"
+	default y
+	help
+	  Serve web pages via an HTTP server.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
+	bool "  Support using httpd only from inetd"
+	default n
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  This option disables uid and port options for the httpd applet
+	  but requires inetd server daemon.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_BASIC_AUTH
+	bool "  Enable Basic http Authentication"
+	default y
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  Utilizes password settings from /etc/httpd.conf for basic
+	  authentication on a per url basis.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_AUTH_MD5
+	bool "  Support MD5 crypted passwords for http Authentication"
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_HTTPD_BASIC_AUTH
+	help
+	  Enables basic per url authentication from /etc/httpd.conf
+	  using md5 passwords.
+
+
+if !CONFIG_FEATURE_HTTPD_USAGE_FROM_INETD_ONLY
+config BUSYBOX_CONFIG_FEATURE_HTTPD_RELOAD_CONFIG_SIGHUP
+	bool "  Support reloading the global config file using hup signal"
+	default y
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  This option enables processing of SIGHUP to reload cached
+	  configuration settings.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_SETUID
+	bool "  Enable support -u <user> option"
+	default n
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  This option allows the server to run as a specific user
+	  rather than defaulting to the user that starts the server.
+	  Use of this option requires special privileges to change to a
+	  different user.
+endif
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_CONFIG_WITH_MIME_TYPES
+	bool "  Support loading additional MIME types at run-time"
+	default y
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  This option enables support for additional MIME types at
+	  run-time to be specified in the configuration file.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_CGI
+	bool "  Support Common Gateway Interface (CGI)"
+	default y
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  This option allows scripts and executables to be invoked
+  	  when specific urls are requested.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_SET_REMOTE_PORT_TO_ENV
+	bool "  Support the REMOTE_PORT environment variable for CGI"
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_HTTPD_CGI
+	help
+	  Use of this option can assist scripts in generating
+	  references that contain a unique port number.
+
+config BUSYBOX_CONFIG_FEATURE_HTTPD_ENCODE_URL_STR
+	bool "  Enable the -e option for shell script CGI simplification."
+	default y
+	depends on BUSYBOX_CONFIG_HTTPD
+	help
+	  After set, this option allows html encoding arbitrary
+	  strings for display of the browser.  Output goes to stdout.
+	  For example, httpd -e "<Hello World>" as
+	  "&#60Hello&#32World&#62".
+
+config BUSYBOX_CONFIG_IFCONFIG
+	bool "ifconfig"
+	default y
+	help
+	  Ifconfig is used to configure the kernel-resident network interfaces.
+
+config BUSYBOX_CONFIG_FEATURE_IFCONFIG_STATUS
+	bool "  Enable status reporting output (+7k)"
+	default y
+	depends on BUSYBOX_CONFIG_IFCONFIG
+	help
+	  If ifconfig is called with no arguments it will display the status
+	  of the currently active interfaces.
+
+config BUSYBOX_CONFIG_FEATURE_IFCONFIG_SLIP
+	bool "  Enable slip-specific options \"keepalive\" and \"outfill\""
+	default n
+	depends on BUSYBOX_CONFIG_IFCONFIG
+	help
+	  Allow "keepalive" and "outfill" support for SLIP.  If you're not
+	  planning on using serial lines, leave this unchecked.
+
+config BUSYBOX_CONFIG_FEATURE_IFCONFIG_MEMSTART_IOADDR_IRQ
+	bool "  Enable options \"mem_start\", \"io_addr\", and \"irq\""
+	default n
+	depends on BUSYBOX_CONFIG_IFCONFIG
+	help
+	  Allow the start address for shared memory, start address for I/O,
+	  and/or the interrupt line used by the specified device.
+
+config BUSYBOX_CONFIG_FEATURE_IFCONFIG_HW
+	bool "  Enable option \"hw\" (ether only)"
+	default y
+	depends on BUSYBOX_CONFIG_IFCONFIG
+	help
+	  Set the hardware address of this interface, if the device driver
+	  supports  this  operation.  Currently, we only support the 'ether'
+	  class.
+
+config BUSYBOX_CONFIG_FEATURE_IFCONFIG_BROADCAST_PLUS
+	bool "  Set the broadcast automatically"
+	default y
+	depends on BUSYBOX_CONFIG_IFCONFIG
+	help
+	  Setting this will make ifconfig attempt to find the broadcast
+	  automatically if the value '+' is used.
+
+config BUSYBOX_CONFIG_IFUPDOWN
+	bool "ifupdown"
+	default n
+	help
+	  Activate or deactivate the specified interfaces.  This applet makes
+	  use of either "ifconfig" and "route" or the "ip" command to actually
+	  configure network interfaces.  Therefore, you will probably also want
+	  to enable either BUSYBOX_CONFIG_IFCONFIG and BUSYBOX_CONFIG_ROUTE, or enable
+	  BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP and the various BUSYBOX_CONFIG_IP options.  Of
+	  course you could use non-busybox versions of these programs, so
+	  against my better judgement (since this will surely result in plenty
+	  of support questions on the mailing list), I do not force you to
+	  enable these additional options.  It is up to you to supply either
+	  "ifconfig" and "route" or the "ip" command, either via busybox or via
+	  standalone utilities.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP
+	bool "  Use ip applet"
+	default n
+	depends on BUSYBOX_CONFIG_IFUPDOWN
+	help
+	  Use the iproute "ip" command to implement "ifup" and "ifdown", rather
+	  than the default of using the older 'ifconfig' and 'route' utilities.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN
+	bool "  Use busybox ip applet"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP
+	select BUSYBOX_CONFIG_IP
+	select BUSYBOX_CONFIG_FEATURE_IP_ADDRESS
+	select BUSYBOX_CONFIG_FEATURE_IP_LINK
+	select BUSYBOX_CONFIG_FEATURE_IP_ROUTE
+	help
+	  Use the busybox iproute "ip" applet to implement "ifupdown".
+
+	  If leave this disabled, you must install the full-blown iproute2
+	  utility or the  "ifup" and "ifdown" applets will not work.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IP_BUILTIN
+	bool "  Use busybox ifconfig and route applets"
+	default n
+	depends on BUSYBOX_CONFIG_IFUPDOWN && !CONFIG_FEATURE_IFUPDOWN_IP
+	select BUSYBOX_CONFIG_IFCONFIG
+	select BUSYBOX_CONFIG_ROUTE
+	help
+	  Use the busybox iproute "ifconfig" and "route" applets to
+	  implement the "ifup" and "ifdown" utilities.
+
+	  If leave this disabled, you must install the full-blown ifconfig
+	  and route utilities, or the  "ifup" and "ifdown" applets will not
+	  work.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IPV4
+	bool "  Enable support for IPv4"
+	default n
+	depends on BUSYBOX_CONFIG_IFUPDOWN
+	help
+	  If you want busybox to talk IPv4, leave this on.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IPV6
+	bool "  Enable support for IPv6"
+	default n
+	depends on BUSYBOX_CONFIG_IFUPDOWN
+	help
+	  If you need support for IPv6, turn this option on.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_IPX
+	bool "  Enable support for IPX"
+	default n
+	depends on BUSYBOX_CONFIG_IFUPDOWN
+	help
+	  If this option is selected you can use busybox to work with IPX
+	  networks.
+
+config BUSYBOX_CONFIG_FEATURE_IFUPDOWN_MAPPING
+	bool "  Enable mapping support"
+	default n
+	depends on BUSYBOX_CONFIG_IFUPDOWN
+	help
+	  This enables support for the "mapping" stanza, unless you have
+	  a weird network setup you don't need it.
+
+config BUSYBOX_CONFIG_INETD
+	bool "inetd"
+	default n
+	help
+	  Internet superserver daemon
+
+config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_ECHO
+	bool "  Support echo service"
+	default n
+	depends on BUSYBOX_CONFIG_INETD
+	help
+	  Echo received data internal inetd service
+
+config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DISCARD
+	bool "  Support discard service"
+	default n
+	depends on BUSYBOX_CONFIG_INETD
+	help
+	  Internet /dev/null internal inetd service
+
+config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_TIME
+	bool "  Support time service"
+	default n
+	depends on BUSYBOX_CONFIG_INETD
+	help
+	  Return 32 bit time since 1900 internal inetd service
+
+config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_DAYTIME
+	bool "  Support daytime service"
+	default n
+	depends on BUSYBOX_CONFIG_INETD
+	help
+	  Return human-readable time internal inetd service
+
+config BUSYBOX_CONFIG_FEATURE_INETD_SUPPORT_BILTIN_CHARGEN
+	bool "  Support chargen service"
+	default n
+	depends on BUSYBOX_CONFIG_INETD
+	help
+	  Familiar character generator internal inetd service
+
+
+config BUSYBOX_CONFIG_IP
+	bool "ip"
+	default n
+	help
+	  The "ip" applet is a TCP/IP interface configuration and routing
+	  utility.  You generally don't need "ip" to use busybox with
+	  TCP/IP.
+
+if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPADDR
+	config BUSYBOX_CONFIG_FEATURE_IP_ADDRESS
+		default n
+	comment "  address (forced enabled for ipaddr)"
+endif
+if ! (CONFIG_IP && BUSYBOX_CONFIG_IPADDR)
+	config BUSYBOX_CONFIG_FEATURE_IP_ADDRESS
+		bool "  address"
+		default n
+		depends on BUSYBOX_CONFIG_IP
+		help
+		  Address manipulation support for the "ip" applet.
+endif
+
+if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPLINK
+	config BUSYBOX_CONFIG_FEATURE_IP_LINK
+		default n
+	comment "  link (forced enabled for iplink)"
+endif
+if !(CONFIG_IP && BUSYBOX_CONFIG_IPLINK)
+	config BUSYBOX_CONFIG_FEATURE_IP_LINK
+		bool "  link"
+		default n
+		depends on BUSYBOX_CONFIG_IP
+		help
+		  Configure network devices with "ip".
+endif
+
+if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPROUTE
+	config BUSYBOX_CONFIG_FEATURE_IP_ROUTE
+		default n
+	comment "  route (forced enabled for iproute)"
+endif
+if !(CONFIG_IP && BUSYBOX_CONFIG_IPROUTE)
+	config BUSYBOX_CONFIG_FEATURE_IP_ROUTE
+		bool "  route"
+		default n
+		depends on BUSYBOX_CONFIG_IP
+		help
+		  Add support for routing table management to "ip".
+endif
+
+if BUSYBOX_CONFIG_IP && BUSYBOX_CONFIG_IPTUNNEL
+	config BUSYBOX_CONFIG_FEATURE_IP_TUNNEL
+		default n
+	comment "  tunnel (forced enabled for iptunnel)"
+endif
+if !(CONFIG_IP && BUSYBOX_CONFIG_IPTUNNEL)
+	config BUSYBOX_CONFIG_FEATURE_IP_TUNNEL
+		bool "  tunnel"
+		default n
+		depends on BUSYBOX_CONFIG_IP
+		help
+		  Add support for tunneling commands to "ip".
+endif
+
+config BUSYBOX_CONFIG_IPCALC
+	bool "ipcalc"
+	default y
+	help
+	  ipcalc takes an IP address and netmask and calculates the
+	  resulting broadcast, network, and host range.
+
+config BUSYBOX_CONFIG_FEATURE_IPCALC_FANCY
+	bool "  Fancy IPCALC, more options, adds 1 kbyte"
+	default y
+	depends on BUSYBOX_CONFIG_IPCALC
+	help
+	  Adds the options hostname, prefix and silent to the output of "ipcalc".
+
+config BUSYBOX_CONFIG_IPADDR
+	bool "ipaddr"
+	default n
+	help
+	  Equivalent to selecting address support to "ip", above.
+
+config BUSYBOX_CONFIG_IPLINK
+	bool "iplink"
+	default n
+	help
+	  Equivalent to selecting link support to "ip", above.
+
+config BUSYBOX_CONFIG_IPROUTE
+	bool "iproute"
+	default n
+	help
+	  Equivalent to selecting route support to "ip", above.
+
+config BUSYBOX_CONFIG_IPTUNNEL
+	bool "iptunnel"
+	default n
+	help
+	  Equivalent to selecting tunnel support to "ip", above.
+
+config BUSYBOX_CONFIG_NAMEIF
+	bool "nameif"
+	default n
+	help
+	  nameif is used to rename network interface by its MAC address.
+	  Renamed interfaces MUST be in the down state.
+	  It is possible to use a file (default: /etc/mactab)
+	  with list of new interface names and MACs.
+	  Maximum interface name length: IF_NAMESIZE = 16
+	  File fields are separated by space or tab.
+	  File format:
+	  # Comment
+	  new_interface_name	XX:XX:XX:XX:XX:XX
+
+config BUSYBOX_CONFIG_NC
+	bool "nc"
+	default y
+	help
+	  A simple Unix utility which reads and writes data across network
+	  connections.
+
+config BUSYBOX_CONFIG_NETSTAT
+	bool "netstat"
+	default y
+	help
+	  netstat prints information about the Linux networking subsystem.
+
+config BUSYBOX_CONFIG_NSLOOKUP
+	bool "nslookup"
+	default y
+	help
+	  nslookup is a tool to query Internet name servers.
+
+config BUSYBOX_CONFIG_PING
+	bool "ping"
+	default y
+	help
+	  ping uses the ICMP protocol's mandatory ECHO_REQUEST datagram to
+	  elicit an ICMP ECHO_RESPONSE from a host or gateway.
+
+config BUSYBOX_CONFIG_FEATURE_FANCY_PING
+	bool "  Enable fancy ping output"
+	default y
+	depends on BUSYBOX_CONFIG_PING
+	help
+	  Make the output from the ping applet include statistics, and at the
+	  same time provide full support for ICMP packets.
+
+config BUSYBOX_CONFIG_PING6
+	bool "ping6"
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_IPV6
+	help
+	  This will give you a ping that can talk IPv6.
+
+config BUSYBOX_CONFIG_FEATURE_FANCY_PING6
+	bool "  Enable fancy ping6 output"
+	default y
+	depends on BUSYBOX_CONFIG_PING6
+	help
+	  Make the output from the ping6 applet include statistics, and at the
+	  same time provide full support for ICMP packets.
+
+config BUSYBOX_CONFIG_ROUTE
+	bool "route"
+	default y
+	help
+	  Route displays or manipulates the kernel's IP routing tables.
+
+config BUSYBOX_CONFIG_TELNET
+	bool "telnet"
+	default n
+	help
+	  Telnet is an interface to the TELNET protocol, but is also commonly
+	  used to test other simple protocols.
+
+config BUSYBOX_CONFIG_FEATURE_TELNET_TTYPE
+	bool "  Pass TERM type to remote host"
+	default n
+	depends on BUSYBOX_CONFIG_TELNET
+	help
+	  Setting this option will forward the TERM environment variable to the
+	  remote host you are connecting to.  This is useful to make sure that
+	  things like ANSI colors and other control sequences behave.
+
+config BUSYBOX_CONFIG_FEATURE_TELNET_AUTOLOGIN
+	bool "  Pass USER type to remote host"
+	default n
+	depends on BUSYBOX_CONFIG_TELNET
+	help
+	  Setting this option will forward the USER environment variable to the
+	  remote host you are connecting to. This is useful when you need to
+	  log into a machine without telling the username (autologin). This
+	  option enables `-a' and `-l USER' arguments.
+
+config BUSYBOX_CONFIG_TELNETD
+	bool "telnetd"
+	default y
+	#select BUSYBOX_CONFIG_LOGIN
+	help
+	  A daemon for the TELNET protocol, allowing you to log onto the host
+	  running the daemon.  Please keep in mind that the TELNET protocol
+	  sends passwords in plain text.  If you can't afford the space for an
+	  SSH daemon and you trust your network, you may say 'y' here.  As a
+	  more secure alternative, you should seriously consider installing the
+	  very small Dropbear SSH daemon instead:
+		http://matt.ucc.asn.au/dropbear/dropbear.html
+
+	  Note that for busybox telnetd to work you need several things:
+	  First of all, your kernel needs:
+		  BUSYBOX_CONFIG_UNIX98_PTYS=y
+		  BUSYBOX_CONFIG_DEVPTS_FS=y
+
+	  Next, you need a /dev/pts directory on your root filesystem:
+
+		  $ ls -ld /dev/pts
+		  drwxr-xr-x  2 root root 0 Sep 23 13:21 /dev/pts/
+
+	  Next you need the pseudo terminal master multiplexer /dev/ptmx:
+
+		  $ ls -la /dev/ptmx
+		  crw-rw-rw-  1 root tty 5, 2 Sep 23 13:55 /dev/ptmx
+
+	  Any /dev/ttyp[0-9]* files you may have can be removed.
+	  Next, you need to mount the devpts filesystem on /dev/pts using:
+
+		  mount -t devpts devpts /dev/pts
+
+	  You need to be sure that Busybox has BUSYBOX_CONFIG_LOGIN and
+	  BUSYBOX_CONFIG_FEATURE_SUID enabled.  And finally, you should make
+	  certain that Busybox has been installed setuid root:
+
+		chown root.root /bin/busybox
+		chmod 4755 /bin/busybox
+
+	  with all that done, telnetd _should_ work....
+
+
+config BUSYBOX_CONFIG_FEATURE_TELNETD_INETD
+	bool "  Support call from inetd only"
+	default n
+	depends on BUSYBOX_CONFIG_TELNETD
+	help
+	  Selecting this will make telnetd only callable from inetd,
+	  removing the standalone support.
+
+config BUSYBOX_CONFIG_TFTP
+	bool "tftp"
+	default n
+	help
+	  This enables the Trivial File Transfer Protocol client program.  TFTP
+	  is usually used for simple, small transfers such as a root image
+	  for a network-enabled bootloader.
+
+config BUSYBOX_CONFIG_FEATURE_TFTP_GET
+	bool "  Enable \"get\" command"
+	default n
+	depends on BUSYBOX_CONFIG_TFTP
+	help
+	  Add support for the GET command within the TFTP client.  This allows
+	  a client to retrieve a file from a TFTP server.
+
+config BUSYBOX_CONFIG_FEATURE_TFTP_PUT
+	bool "  Enable \"put\" command"
+	default n
+	depends on BUSYBOX_CONFIG_TFTP
+	help
+	  Add support for the PUT command within the TFTP client.  This allows
+	  a client to transfer a file to a TFTP server.
+
+config BUSYBOX_CONFIG_FEATURE_TFTP_BLOCKSIZE
+	bool "  Enable \"blocksize\" command"
+	default n
+	depends on BUSYBOX_CONFIG_TFTP
+	help
+	  Allow the client to specify the desired block size for transfers.
+
+config BUSYBOX_CONFIG_FEATURE_TFTP_DEBUG
+	bool "  Enable debug"
+	default n
+	depends on BUSYBOX_CONFIG_TFTP
+	help
+	  Enable debug settings for tftp.  This is useful if you're running
+	  into problems with tftp as the protocol doesn't help you much when
+	  you run into problems.
+
+config BUSYBOX_CONFIG_TRACEROUTE
+	bool "traceroute"
+	default y
+	help
+	  Utility to trace the route of IP packets
+
+config BUSYBOX_CONFIG_FEATURE_TRACEROUTE_VERBOSE
+	bool "  Enable verbose output"
+	default y
+	depends on BUSYBOX_CONFIG_TRACEROUTE
+	help
+	  Add some verbosity to traceroute.  This includes amongst other things
+	  hostnames and ICMP response types.
+
+config BUSYBOX_CONFIG_VCONFIG
+	bool "vconfig"
+	default y
+	help
+	  Creates, removes, and configures VLAN interfaces
+
+config BUSYBOX_CONFIG_WGET
+	bool "wget"
+	default y
+	help
+	  wget is a utility for non-interactive download of files from HTTP,
+	  HTTPS, and FTP servers.
+
+config BUSYBOX_CONFIG_FEATURE_WGET_STATUSBAR
+	bool "  Enable a nifty process meter (+2k)"
+	default y
+	depends on BUSYBOX_CONFIG_WGET
+	help
+	  Enable the transfer progress bar for wget transfers.
+
+config BUSYBOX_CONFIG_FEATURE_WGET_AUTHENTICATION
+	bool "  Enable HTTP authentication"
+	default y
+	depends on BUSYBOX_CONFIG_WGET
+	help
+	  Support authenticated HTTP transfers.
+
+config BUSYBOX_CONFIG_FEATURE_WGET_IP6_LITERAL
+	bool "  Enable IPv6 literal addresses"
+	default y
+	depends on BUSYBOX_CONFIG_WGET
+	help
+	  Support IPv6 address literal notation in URLs.
+
+source package/busybox/config/networking/udhcp/Config.in
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/networking/udhcp/Config.in
@@ -1,1 +1,63 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "udhcp Server/Client"
+
+config BUSYBOX_CONFIG_UDHCPD
+	bool "udhcp Server (udhcpd)"
+	default n
+	help
+	  uDHCPd is a DHCP server geared primarily toward embedded systems,
+	  while striving to be fully functional and RFC compliant.
+
+	  See http://udhcp.busybox.net for further details.
+
+config BUSYBOX_CONFIG_UDHCPC
+	bool "udhcp Client (udhcpc)"
+	default y
+	help
+	  uDHCPc is a DHCP client geared primarily toward embedded systems,
+	  while striving to be fully functional and RFC compliant.
+
+	  The udhcp client negotiates a lease with the DHCP server and
+	  notifies a set of scripts when a lease is obtained or lost.
+
+	  See http://udhcp.busybox.net for further details.
+
+config BUSYBOX_CONFIG_DUMPLEASES
+	bool "Lease display utility (dumpleases)"
+	default n
+	depends on BUSYBOX_CONFIG_UDHCPD
+	help
+	  dumpleases displays the leases written out by the udhcpd server.
+	  Lease times are stored in the file by time remaining in lease, or
+	  by the absolute time that it expires in seconds from epoch.
+
+	  See http://udhcp.busybox.net for further details.
+
+config BUSYBOX_CONFIG_FEATURE_UDHCP_SYSLOG
+	bool "  Log udhcp messages to syslog (instead of stdout)"
+	default n
+	depends on BUSYBOX_CONFIG_UDHCPD || BUSYBOX_CONFIG_UDHCPC
+	help
+	  If selected, udhcpd will log all its messages to syslog, otherwise,
+	  it will attempt to log them to stdout.
+
+	  See http://udhcp.busybox.net for further details.
+
+config BUSYBOX_CONFIG_FEATURE_UDHCP_DEBUG
+	bool "  Compile udhcp with noisy debugging messages"
+	default n
+	depends on BUSYBOX_CONFIG_UDHCPD || BUSYBOX_CONFIG_UDHCPC
+	help
+	  If selected, udhcpd will output extra debugging output.  If using
+	  this option, compile uDHCP with "-g", and do not fork the daemon to
+	  the background.
+
+	  See http://udhcp.busybox.net for further details.
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/procps/Config.in
@@ -1,1 +1,88 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "Process Utilities"
+
+config BUSYBOX_CONFIG_FREE
+	bool "free"
+	default y
+	help
+	  free displays the total amount of free and used physical and swap
+	  memory in the system, as well as the buffers used by the kernel.
+	  The shared memory column should be ignored; it is obsolete.
+
+config BUSYBOX_CONFIG_KILL
+	bool "kill"
+	default y
+	help
+	  The command kill sends the specified signal to the specified
+	  process or process group.  If no signal is specified, the TERM
+	  signal is sent.
+
+config BUSYBOX_CONFIG_KILLALL
+	bool "killall"
+	default y
+	depends on BUSYBOX_CONFIG_KILL
+	help
+	  killall sends a signal to all processes running any of the
+	  specified commands.  If no signal name is specified, SIGTERM is
+	  sent.
+
+config BUSYBOX_CONFIG_KILLALL5
+	bool "killall5"
+	default y
+	depends on BUSYBOX_CONFIG_KILL
+	
+config BUSYBOX_CONFIG_PIDOF
+	bool "pidof"
+	default y
+	help
+	  Pidof finds the process id's (pids) of the named programs. It prints
+	  those id's on the standard output.
+
+config BUSYBOX_CONFIG_PS
+	bool "ps"
+	default y
+	help
+	  ps gives a snapshot of the current processes.
+
+config BUSYBOX_CONFIG_RENICE
+	bool "renice"
+	default n
+	help
+	  Renice alters the scheduling priority of one or more running
+	  processes.
+
+config BUSYBOX_CONFIG_TOP
+	bool "top"
+	default y
+	help
+	  The top program provides a dynamic real-time view of a running
+	  system.
+
+config BUSYBOX_FEATURE_CPU_USAGE_PERCENTAGE
+	bool
+	default y
+	depends on BUSYBOX_CONFIG_TOP
+	help
+	  Make top display CPU usage.
+
+config BUSYBOX_CONFIG_UPTIME
+	bool "uptime"
+	default y
+	help
+	  uptime gives a one line display of the current time, how long
+	  the system has been running, how many users are currently logged
+	  on, and the system load averages for the past 1, 5, and 15 minutes.
+
+config BUSYBOX_CONFIG_SYSCTL
+	bool "sysctl"
+	default y
+	help
+	  sysctl - configure kernel parameters at runtime
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/shell/Config.in
@@ -1,1 +1,230 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Another Bourne-like Shell"
+
+choice
+	prompt "Choose your default shell"
+	default BUSYBOX_CONFIG_FEATURE_SH_IS_ASH
+	help
+	  Choose a shell. The ash shell is the most bash compatible
+	  and full featured one.
+
+config BUSYBOX_CONFIG_FEATURE_SH_IS_ASH
+	select BUSYBOX_CONFIG_ASH
+	bool "ash"
+
+config BUSYBOX_CONFIG_FEATURE_SH_IS_HUSH
+	select BUSYBOX_CONFIG_HUSH
+	bool "hush"
+
+config BUSYBOX_CONFIG_FEATURE_SH_IS_LASH
+	select BUSYBOX_CONFIG_LASH
+	bool "lash"
+
+config BUSYBOX_CONFIG_FEATURE_SH_IS_MSH
+	select BUSYBOX_CONFIG_MSH
+	bool "msh"
+
+config BUSYBOX_CONFIG_FEATURE_SH_IS_NONE
+	bool "none"
+
+endchoice
+
+config BUSYBOX_CONFIG_ASH
+	bool "ash"
+	default y
+	help
+	  Tha 'ash' shell adds about 60k in the default configuration and is
+	  the most complete and most pedantically correct shell included with
+	  busybox.  This shell is actually a derivative of the Debian 'dash'
+	  shell (by Herbert Xu), which was created by porting the 'ash' shell
+	  (written by Kenneth Almquist) from NetBSD.
+
+comment "Ash Shell Options"
+	depends on BUSYBOX_CONFIG_ASH
+
+config BUSYBOX_CONFIG_ASH_JOB_CONTROL
+	bool "  Enable Job control"
+	default y
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable job control in the ash shell.
+
+config BUSYBOX_CONFIG_ASH_ALIAS
+	bool "  Enable alias support"
+	default y
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable alias support in the ash shell.
+
+config BUSYBOX_CONFIG_ASH_MATH_SUPPORT
+	bool "  Enable Posix math support"
+	default y
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable math support in the ash shell.
+
+config BUSYBOX_CONFIG_ASH_MATH_SUPPORT_64
+	bool "    Extend Posix math support to 64 bit"
+	default n
+	depends on BUSYBOX_CONFIG_ASH_MATH_SUPPORT
+	help
+	  Enable 64-bit math support in the ash shell.  This will make
+	  the shell slightly larger, but will allow computation with very
+	  large numbers.
+
+config BUSYBOX_CONFIG_ASH_GETOPTS
+	bool "  Enable getopts builtin to parse positional parameters"
+	default y
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable getopts builtin in the ash shell.
+
+config BUSYBOX_CONFIG_ASH_CMDCMD
+	bool "  Enable cmdcmd to override shell builtins"
+	default y
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable support for the ash 'command' builtin, which allows
+	  you to run the specified command with the specified arguments,
+	  even when there is an ash builtin command with the same name.
+
+config BUSYBOX_CONFIG_ASH_MAIL
+	bool "  Check for new mail on interactive shells"
+	default n
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable "check for new mail" in the ash shell.
+
+config BUSYBOX_CONFIG_ASH_OPTIMIZE_FOR_SIZE
+	bool "  Optimize for size instead of speed"
+	default y
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Compile ash for reduced size at price of speed.
+
+config BUSYBOX_CONFIG_ASH_RANDOM_SUPPORT
+	bool "  Enable pseudorandom generator and variable $RANDOM"
+	default n
+	depends on BUSYBOX_CONFIG_ASH
+	help
+	  Enable pseudorandom generator and dynamic variable "$RANDOM".
+	  Each read of "$RANDOM" will generate a new pseudorandom value.
+	  You can reset the generator by using a specified start value.
+	  After "unset RANDOM" then generator will switch off and this
+	  variable will no longer have special treatment.
+
+config BUSYBOX_CONFIG_HUSH
+	bool "hush"
+	default n
+	help
+	  hush is a very small shell (just 18k) and it has fairly complete
+	  Bourne shell grammar.  It even handles all the normal flow control
+	  options such as if/then/elif/else/fi, for/in/do/done, while loops,
+	  etc.
+
+	  It does not handle case/esac, select, function, here documents ( <<
+	  word ), arithmetic expansion, aliases, brace expansion, tilde
+	  expansion, &> and >& redirection of stdout+stderr, etc.
+
+
+config BUSYBOX_CONFIG_LASH
+	bool "lash"
+	default n
+	help
+	  lash is the very smallest shell (adds just 10k) and it is quite
+	  usable as a command prompt, but it is not suitable for any but the
+	  most trivial scripting (such as an initrd that calls insmod a few
+	  times) since it does not understand any Bourne shell grammar.  It
+	  does handle pipes, redirects, and job control though.  Adding in
+	  command editing makes it a very nice lightweight command prompt.
+
+
+config BUSYBOX_CONFIG_MSH
+	bool "msh"
+	default n
+	help
+	  The minix shell (adds just 30k) is quite complete and handles things
+	  like for/do/done, case/esac and all the things you expect a Bourne
+	  shell to do.  It is not always pedantically correct about Bourne
+	  shell grammar (try running the shell testscript "tests/sh.testcases"
+	  on it and compare vs bash) but for most things it works quite well.
+	  It also uses only vfork, so it can be used on uClinux systems.
+
+comment "Bourne Shell Options"
+	depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH
+
+config BUSYBOX_CONFIG_FEATURE_SH_EXTRA_QUIET
+	bool "Hide message on interactive shell startup"
+	default n
+	depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH
+	help
+	  Remove the busybox introduction when starting a shell.
+
+config BUSYBOX_CONFIG_FEATURE_SH_STANDALONE_SHELL
+	bool "Standalone shell"
+	default n
+	depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH
+	help
+	  This option causes the selected busybox shell to use busybox applets
+	  in preference to executables in the PATH whenever possible.  For
+	  example, entering the command 'ifconfig' into the shell would cause
+	  busybox to use the ifconfig busybox applet.  Specifying the fully
+	  qualified executable name, such as '/sbin/ifconfig' will still
+	  execute the /sbin/ifconfig executable on the filesystem.  This option
+	  is generally used when creating a staticly linked version of busybox
+	  for use as a rescue shell, in the event that you screw up your system.
+
+	  Note that when using this option, the shell will attempt to directly
+	  run '/bin/busybox'.  If you do not have the busybox binary sitting in
+	  that exact location with that exact name, this option will not work at
+	  all.
+
+config BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING
+	bool "command line editing"
+	default y
+	depends on BUSYBOX_CONFIG_MSH || BUSYBOX_CONFIG_LASH || BUSYBOX_CONFIG_HUSH || BUSYBOX_CONFIG_ASH
+	help
+	  Enable command editing in shell.
+
+config BUSYBOX_CONFIG_FEATURE_COMMAND_HISTORY
+	int "history size"
+	default 15
+	depends on BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING
+	help
+	  Specify command history size in shell.
+
+config BUSYBOX_CONFIG_FEATURE_COMMAND_SAVEHISTORY
+	bool "history saving"
+	default n
+	depends on BUSYBOX_CONFIG_ASH && BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING
+	help
+	  Enable history saving in ash shell.
+
+config BUSYBOX_CONFIG_FEATURE_COMMAND_TAB_COMPLETION
+	bool "tab completion"
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING
+	help
+	  Enable tab completion in shell.
+
+config BUSYBOX_CONFIG_FEATURE_COMMAND_USERNAME_COMPLETION
+	bool "username completion"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_COMMAND_TAB_COMPLETION
+	help
+	  Enable username completion in shell.
+
+config BUSYBOX_CONFIG_FEATURE_SH_FANCY_PROMPT
+	bool "Fancy shell prompts"
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_COMMAND_EDITING
+	help
+	  Setting this option allows for prompts to use things like \w and
+	  \$ and also using escape codes.
+
+endmenu
+

--- /dev/null
+++ b/package/busybox/config/sysklogd/Config.in
@@ -1,1 +1,110 @@
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
 
+menu "System Logging Utilities"
+
+config BUSYBOX_CONFIG_SYSLOGD
+	bool "syslogd"
+	default y
+	help
+	  The syslogd utility is used to record logs of all the
+	  significant events that occur on a system.  Every
+	  message that is logged records the date and time of the
+	  event, and will generally also record the name of the
+	  application that generated the message.  When used in
+	  conjunction with klogd, messages from the Linux kernel
+	  can also be recorded.  This is terribly useful,
+	  especially for finding what happened when something goes
+	  wrong.  And something almost always will go wrong if
+	  you wait long enough....
+
+config BUSYBOX_CONFIG_FEATURE_ROTATE_LOGFILE
+	bool "  Rotate message files"
+	default y
+	depends on BUSYBOX_CONFIG_SYSLOGD
+	help
+	  This enables syslogd to rotate the message files
+	  on his own. No need to use an external rotatescript.
+
+config BUSYBOX_CONFIG_FEATURE_REMOTE_LOG
+	bool "  Remote Log support"
+	default y
+	depends on BUSYBOX_CONFIG_SYSLOGD
+	help
+	  When you enable this feature, the syslogd utility can
+	  be used to send system log messages to another system
+	  connected via a network.  This allows the remote
+	  machine to log all the system messages, which can be
+	  terribly useful for reducing the number of serial
+	  cables you use.  It can also be a very good security
+	  measure to prevent system logs from being tampered with
+	  by an intruder.
+
+config BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG
+	bool "  Circular Buffer support"
+	default y
+	depends on BUSYBOX_CONFIG_SYSLOGD
+	help
+	  When you enable this feature, the syslogd utility will
+	  use a circular buffer to record system log messages.
+	  When the buffer is filled it will continue to overwrite
+	  the oldest messages.  This can be very useful for
+	  systems with little or no permanent storage, since
+	  otherwise system logs can eventually fill up your
+	  entire filesystem, which may cause your system to
+	  break badly.
+
+config BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE
+	int "    Circular buffer size in Kbytes (minimum 4KB)"
+	default 16
+	depends on BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG
+	help
+	  This option sets the size of the circular buffer
+	  used to record system log messages.
+
+config BUSYBOX_CONFIG_LOGREAD
+	bool "  logread"
+	default y
+	depends on BUSYBOX_CONFIG_FEATURE_IPC_SYSLOG
+	help
+	  If you enabled Circular Buffer support, you almost
+	  certainly want to enable this feature as well.  This
+	  utility will allow you to read the messages that are
+	  stored in the syslogd circular buffer.
+
+config BUSYBOX_CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING
+	bool "    logread double buffering"
+	default n
+	depends on BUSYBOX_CONFIG_LOGREAD
+	help
+	  'logread' ouput to slow serial terminals can have
+	  side effects on syslog because of the semaphore.
+	  This option make logread to double buffer copy
+	  from circular buffer, minimizing semaphore
+	  contention at some minor memory expense.
+
+config BUSYBOX_CONFIG_KLOGD
+	bool "klogd"
+	default y
+	depends on BUSYBOX_CONFIG_SYSLOGD
+	help
+	  klogd is a utility which intercepts and logs all
+	  messages from the Linux kernel and sends the messages
+	  out to the 'syslogd' utility so they can be logged.  If
+	  you wish to record the messages produced by the kernel,
+	  you should enable this option.
+
+config BUSYBOX_CONFIG_LOGGER
+	bool "logger"
+	default y
+	help
+	    The logger utility allows you to send arbitrary text
+	    messages to the system log (i.e. the 'syslogd' utility) so
+	    they can be logged.  This is generally used to help locate
+	    problems that occur within programs and scripts.
+
+endmenu
+
+

--- /dev/null
+++ b/package/busybox/config/util-linux/Config.in
@@ -1,1 +1,358 @@
-
+#
+# For a description of the syntax of this configuration file,
+# see scripts/kbuild/config-language.txt.
+#
+
+menu "Linux System Utilities"
+
+
+config BUSYBOX_CONFIG_DMESG
+	bool "dmesg"
+	default y
+	help
+	  dmesg is used to examine or control the kernel ring buffer.  When the
+	  Linux kernel prints messages to the system log, they are stored in
+	  the kernel ring buffer.  You can use dmesg to print the kernel's ring
+	  buffer, clear the kernel ring buffer, change the size of the kernel
+	  ring buffer, and change the priority level at which kernel messages
+	  are also logged to the system console.  Enable this option if you
+	  wish to enable the 'dmesg' utility.
+
+config BUSYBOX_CONFIG_FBSET
+	bool "fbset"
+	default n
+	help
+	  fbset is used to show or change the settings of a Linux frame buffer
+	  device.  The frame buffer device provides a simple and unique
+	  interface to access a graphics display.  Enable this option
+	  if you wish to enable the 'fbset' utility.
+
+
+config BUSYBOX_CONFIG_FEATURE_FBSET_FANCY
+	bool "  Turn on extra fbset options"
+	default n
+	depends on BUSYBOX_CONFIG_FBSET
+	help
+	  This option enables extended fbset options, allowing one to set the
+	  framebuffer size, color depth, etc.  interface to access a graphics
+	  display.  Enable this option if you wish to enable extended fbset
+	  options.
+
+config BUSYBOX_CONFIG_FEATURE_FBSET_READMODE
+	bool "  Turn on fbset readmode support"
+	default n
+	depends on BUSYBOX_CONFIG_FBSET
+	help
+	  This option allows fbset to read the video mode database stored by
+	  default n /etc/fb.modes, which can be used to set frame buffer
+	  device to pre-defined video modes.
+
+config BUSYBOX_CONFIG_FDFLUSH
+	bool "fdflush"
+	default n
+	help
+	  fdflush is only needed when changing media on slightly-broken
+	  removable media drives.  It is used to make Linux believe that a
+	  hardware disk-change switch has been actuated, which causes Linux to
+	  forget anything it has cached from the previous media.  If you have
+	  such a slightly-broken drive, you will need to run fdflush every time
+	  you change a disk.  Most people have working hardware and can safely
+	  leave this disabled.
+
+config BUSYBOX_CONFIG_FDFORMAT
+	bool "fdformat"
+	default n
+	help
+	  fdformat is used to low-level format a floppy disk.
+
+config BUSYBOX_CONFIG_FDISK
+	bool "fdisk"
+	default n
+	help
+	  The fdisk utility is used to divide hard disks into one or more
+	  logical disks, which are generally called partitions.  This utility
+	  can be used to list and edit the set of partitions or BSD style
+	  'disk slices' that are defined on a hard drive.
+
+config BUSYBOX_FDISK_SUPPORT_LARGE_DISKS
+	bool
+	default y
+	depends on BUSYBOX_CONFIG_FDISK
+	help
+	  Enable this option to support large disks > 4GB.
+
+config BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE
+	bool "  Write support"
+	default n
+	depends on BUSYBOX_CONFIG_FDISK
+	help
+	  Enabling this option allows you to create or change a partition table
+	  and write those changes out to disk.  If you leave this option
+	  disabled, you will only be able to view the partition table.
+
+config BUSYBOX_CONFIG_FEATURE_AIX_LABEL
+	bool "  Support AIX disklabels"
+	default n
+	depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE
+	help
+	  Enabling this option allows you to create or change AIX disklabels.
+	  Most people can safely leave this option disabled.
+
+config BUSYBOX_CONFIG_FEATURE_SGI_LABEL
+	bool "  Support SGI disklabels"
+	default n
+	depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE
+	help
+	  Enabling this option allows you to create or change SGI disklabels.
+	  Most people can safely leave this option disabled.
+
+config BUSYBOX_CONFIG_FEATURE_SUN_LABEL
+	bool "  Support SUN disklabels"
+	default n
+ 	depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE
+	help
+	  Enabling this option allows you to create or change SUN disklabels.
+	  Most people can safely leave this option disabled.
+
+config BUSYBOX_CONFIG_FEATURE_OSF_LABEL
+	bool "  Support BSD disklabels"
+	default n
+	depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE
+	help
+	  Enabling this option allows you to create or change BSD disklabels
+	  and define and edit BSD disk slices.
+
+config BUSYBOX_CONFIG_FEATURE_FDISK_ADVANCED
+	bool "  Support expert mode"
+	default n
+	depends on BUSYBOX_CONFIG_FDISK && BUSYBOX_CONFIG_FEATURE_FDISK_WRITABLE
+	help
+	  Enabling this option allows you to do terribly unsafe things like
+	  define arbitrary drive geometry, move the beginning of data in a
+	  partition, and similarly evil things.  Unless you have a very good
+	  reason you would be wise to leave this disabled.
+
+config BUSYBOX_CONFIG_FREERAMDISK
+	bool "freeramdisk"
+	default n
+	help
+	  Linux allows you to create ramdisks.  This utility allows you to
+	  delete them and completely free all memory that was used for the
+	  ramdisk.  For example, if you boot Linux into a ramdisk and later
+	  pivot_root, you may want to free the memory that is allocated to the
+	  ramdisk.  If you have no use for freeing memory from a ramdisk, leave
+	  this disabled.
+
+config BUSYBOX_CONFIG_FSCK_MINIX
+	bool "fsck_minix"
+	default n
+	help
+	  The minix filesystem is a nice, small, compact, read-write filesystem
+	  with little overhead.  It is not a journaling filesystem however and
+	  can experience corruption if it is not properly unmounted or if the
+	  power goes off in the middle of a write.  This utility allows you to
+	  check for and attempt to repair any corruption that occurs to a minix
+	  filesystem.
+
+config BUSYBOX_CONFIG_MKFS_MINIX
+	bool "mkfs_minix"
+	default n
+	help
+	  The minix filesystem is a nice, small, compact, read-write filesystem
+	  with little overhead.  If you wish to be able to create minix filesystems
+	  this utility will do the job for you.
+
+comment "Minix filesystem support"
+    depends on BUSYBOX_CONFIG_FSCK_MINIX || BUSYBOX_CONFIG_MKFS_MINIX
+
+config BUSYBOX_CONFIG_FEATURE_MINIX2
+	bool "  Support Minix fs v2 (fsck_minix/mkfs_minix)"
+	default n
+	depends on BUSYBOX_CONFIG_FSCK_MINIX || BUSYBOX_CONFIG_MKFS_MINIX
+	help
+	  If you wish to be able to create version 2 minix filesystems, enable this.
+	  If you enabled 'mkfs_minix' then you almost certainly want to be using the
+	  version 2 filesystem support.
+
+config BUSYBOX_CONFIG_GETOPT
+	bool "getopt"
+	default n
+	help
+	  The getopt utility is used to break up (parse) options in command
+	  lines to make it easy to write complex shell scripts that also check
+	  for legal (and illegal) options.  If you want to write horribly
+	  complex shell scripts, or use some horribly complex shell script
+	  written by others, this utility may be for you.  Most people will
+	  wisely leave this disabled.
+
+config BUSYBOX_CONFIG_HEXDUMP
+	bool "hexdump"
+	default y
+	help
+	  The hexdump utility is used to display binary data in a readable
+	  way that is comparable to the output from most hex editors.
+
+config BUSYBOX_CONFIG_HWCLOCK
+	bool "hwclock"
+	default n
+	help
+	  The hwclock utility is used to read and set the hardware clock
+	  on a system.  This is primarily used to set the current time on
+	  shutdown in the hardware clock, so the hardware will keep the
+	  correct time when Linux is _not_ running.
+
+config BUSYBOX_CONFIG_FEATURE_HWCLOCK_LONGOPTIONS
+	bool "  Support long options (--hctosys,...)"
+	default n
+	depends on BUSYBOX_CONFIG_HWCLOCK
+	help
+	  By default, the hwclock utility only uses short options.  If you
+	  are overly fond of its long options, such as --hctosys, --utc, etc)
+	  then enable this option.
+
+config BUSYBOX_CONFIG_LOSETUP
+	bool "losetup"
+	default n
+	help
+	  losetup is used to associate or detach a loop device with a regular
+	  file or block device, and to query the status of a loop device.  This
+	  version does not currently support enabling data encryption.
+
+config BUSYBOX_CONFIG_MKSWAP
+	bool "mkswap"
+	default n
+	help
+	  The mkswap utility is used to configure a file or disk partition as
+	  Linux swap space.  This allows Linux to use the entire file or
+	  partition as if it were additional RAM, which can greatly increase
+	  the capability of low-memory machines.  This additional memory is
+	  much slower than real RAM, but can be very helpful at preventing your
+	  applications being killed by the Linux out of memory (OOM) killer.
+	  Once you have created swap space using 'mkswap' you need to enable
+	  the swap space using the 'swapon' utility.
+
+config BUSYBOX_CONFIG_MORE
+	bool "more"
+	default y
+	help
+	  more is a simple utility which allows you to read text one screen
+	  sized page at a time.  If you want to read text that is larger than
+	  the screen, and you are using anything faster than a 300 baud modem,
+	  you will probably find this utility very helpful.  If you don't have
+	  any need to reading text files, you can leave this disabled.
+
+config BUSYBOX_CONFIG_FEATURE_USE_TERMIOS
+	bool "  Use termios to manipulate the screen"
+	default y
+	depends on BUSYBOX_CONFIG_MORE
+	help
+	  This option allows utilities such as 'more' and 'top' to determine
+	  the size of the screen.  If you leave this disabled, your utilities
+	  that display things on the screen will be especially primitive and
+	  will be unable to determine the current screen size, and will be
+	  unable to move the cursor.
+
+config BUSYBOX_CONFIG_PIVOT_ROOT
+	bool "pivot_root"
+	default y
+	help
+	  The pivot_root utility swaps the mount points for the root filesystem
+	  with some other mounted filesystem.  This allows you to do all sorts
+	  of wild and crazy things with your Linux system and is far more
+	  powerful than 'chroot'.
+
+config BUSYBOX_CONFIG_RDATE
+	bool "rdate"
+	default y
+	help
+	  The rdate utility allows you to synchronize the date and time of your
+	  system clock with the date and time of a remote networked system using
+	  the RFC868 protocol, which is built into the inetd daemon on most
+	  systems.
+
+config BUSYBOX_CONFIG_SWAPONOFF
+	bool "swaponoff"
+	default n
+	help
+	  This option enables both the 'swapon' and the 'swapoff' utilities.
+	  Once you have created some swap space using 'mkswap', you also need
+	  to enable your swap space with the 'swapon' utility.  The 'swapoff'
+	  utility is used, typically at system shutdown, to disable any swap
+	  space.  If you are not using any swap space, you can leave this
+	  option disabled.
+
+config BUSYBOX_CONFIG_MOUNT
+	bool "mount"
+	default y
+	help
+	  All files and filesystems in Unix are arranged into one big directory
+	  tree.  The 'mount' utility is used to graft a filesystem onto a
+	  particular part of the tree.  A filesystem can either live on a block
+	  device, or it can be accessible over the network, as is the case with
+	  NFS filesystems.  Most people using BusyBox will also want to enable
+	  the 'mount' utility.
+
+config BUSYBOX_CONFIG_NFSMOUNT
+	bool "  Support mounting NFS file systems"
+	default y
+	depends on BUSYBOX_CONFIG_MOUNT
+	help
+	 Enable mounting of NFS file systems.
+
+config BUSYBOX_CONFIG_UMOUNT
+	bool "umount"
+	default y
+	help
+	  When you want to remove a mounted filesystem from its current mount point,
+	  for example when you are shutting down the system, the 'umount' utility is
+	  the tool to use.  If you enabled the 'mount' utility, you almost certainly
+	  also want to enable 'umount'.
+
+config BUSYBOX_CONFIG_FEATURE_MOUNT_FORCE
+	bool "  Support forced filesystem unmounting"
+	default y
+	depends on BUSYBOX_CONFIG_UMOUNT
+	help
+	  This allows you to _force_ a filesystem to be umounted.  This is generally
+	  only useful when you want to get rid of an unreachable NFS system.
+
+comment "Common options for mount/umount"
+	depends on BUSYBOX_CONFIG_MOUNT || BUSYBOX_CONFIG_UMOUNT
+
+config BUSYBOX_CONFIG_FEATURE_MOUNT_LOOP
+	bool "  Support for loop devices"
+	default y
+	depends on BUSYBOX_CONFIG_MOUNT || BUSYBOX_CONFIG_UMOUNT
+	help
+	  Enabling this feature allows mount to use the '-o' loop options,
+	  which lets you loop mount files.  Mount will automagically setup and
+	  free the necessary loop devices so you do not need to mess with the
+	  'losetup' utility unless you really want to.  This is really
+	  only useful if you plan to loop mount files.
+
+config BUSYBOX_CONFIG_FEATURE_MTAB_SUPPORT
+	bool "  Support for a real /etc/mtab (instead of /proc/mounts)"
+	default n
+	depends on BUSYBOX_CONFIG_MOUNT || BUSYBOX_CONFIG_UMOUNT
+	help
+	  If your root filesystem is writable and you wish to have the 'mount'
+	  utility create an mtab file listing the filesystems which have been
+	  mounted then you should enable this option.  Most people that use
+	  BusyBox have a read-only root filesystem, so they will leave this
+	  option disabled and BusyBox will use the /proc/mounts file.
+
+config BUSYBOX_CONFIG_FEATURE_MTAB_FILENAME
+	string "  mtab file location"
+	default n
+	depends on BUSYBOX_CONFIG_FEATURE_MTAB_SUPPORT
+	help
+	  Some people have a read only root filesystem, but they also wish to
+	  have the 'mount' utility create an mtab file listing the filesystems
+	  which have been mounted.  This option allows you to specify an alternative
+	  location for the mtab file, such as /var/mtab, or /tmp/mtab.  The default
+	  value is /etc/mtab, which is where this file is located on most desktop
+	  Linux systems.
+
+endmenu
+
+

--- a/package/config/confdata.c
+++ b/package/config/confdata.c
@@ -356,8 +356,8 @@
 						fprintf(out_h, "#undef %s\n", sym->name);
 					break;
 				case mod:
+					fprintf(out, "%s=m\n", sym->name);
 #if 0
-					fprintf(out, "%s=m\n", sym->name);
 					if (out_h)
 						fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
 #endif

--- /dev/null
+++ b/package/dnsmasq/Makefile
@@ -1,1 +1,10 @@
+include $(TOPDIR)/rules.mk
 
+include ./dnsmasq.mk
+
+source: dnsmasq-source
+prepare: $(DNSMASQ_DIR)/.unpacked
+compile: $(DNSMASQ_DIR)/src/dnsmasq
+install: dnsmasq
+clean: dnsmasq-dirclean
+

--- a/package/dnsmasq/dnsmasq.mk
+++ b/package/dnsmasq/dnsmasq.mk
@@ -20,13 +20,12 @@
 $(DL_DIR)/$(DNSMASQ_SOURCE):
 	$(WGET) -P $(DL_DIR) $(DNSMASQ_SITE)/$(DNSMASQ_SOURCE)
 
-$(DNSMASQ_DIR)/.source: $(DL_DIR)/$(DNSMASQ_SOURCE)
+$(DNSMASQ_DIR)/.unpacked: $(DL_DIR)/$(DNSMASQ_SOURCE)
 	zcat $(DL_DIR)/$(DNSMASQ_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-	toolchain/patch-kernel.sh $(DNSMASQ_DIR) package/dnsmasq/ \
-		$(DNSMASQ_VER)-\*.patch
-	touch $(DNSMASQ_DIR)/.source
+	$(PATCH) $(DNSMASQ_DIR) ./ $(DNSMASQ_VER)-\*.patch
+	touch $(DNSMASQ_DIR)/.unpacked
 
-$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.source
+$(DNSMASQ_DIR)/src/$(DNSMASQ_BINARY): $(DNSMASQ_DIR)/.unpacked
 	$(MAKE) CC=$(TARGET_CC) CFLAGS="$(TARGET_CFLAGS)" \
 		BINDIR=/usr/sbin MANDIR=/usr/man -C $(DNSMASQ_DIR)
 
@@ -36,9 +35,9 @@
 	$(STRIP) $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
 	rm -rf $(TARGET_DIR)/usr/man
 
-dnsmasq: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
+dnsmasq: $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
 
-dnsmasq1: uclibc $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
+dnsmasq1: $(TARGET_DIR)/$(DNSMASQ_TARGET_BINARY)
 
 dnsmasq-source: $(DL_DIR)/$(DNSMASQ_SOURCE)
 

--- a/package/dropbear_sshd/Config.in
+++ /dev/null
@@ -1,9 +1,1 @@
-config BR2_PACKAGE_DROPBEAR_SSHD
-	bool "dropbear_sshd"
-	select BR2_PACKAGE_ZLIB
-	default n
-	help
-	  A small SSH 2 server designed for small memory environments.
 
-	  http://matt.ucc.asn.au/dropbear/
-

--- a/package/dropbear_sshd/dropbear-init.patch
+++ /dev/null
@@ -1,60 +1,1 @@
---- dropbear-0.42/S50dropbear
-+++ dropbear-0.42/S50dropbear
-@@ -0,0 +1,56 @@
-+#!/bin/sh
-+#
-+# Starts dropbear sshd.
-+#
-+
-+# Make sure the dropbearkey progam exists
-+[ -f /usr/bin/dropbearkey ] || exit 0
-+
-+# Check for the Dropbear RSA key
-+if [ ! -f /etc/dropbear/dropbear_rsa_host_key ] ; then
-+	echo Generating RSA Key...
-+	mkdir -p /etc/dropbear
-+	/usr/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
-+fi
-+
-+# Check for the Dropbear DSS key
-+if [ ! -f /etc/dropbear/dropbear_dss_host_key ] ; then
-+	echo Generating DSS Key...
-+	mkdir -p /etc/dropbear
-+	/usr/bin/dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
-+fi
-+
-+umask 077
-+
-+start() {
-+ 	echo -n "Starting dropbear sshd: "
-+	start-stop-daemon --start --quiet --pidfile /var/run/dropbear.pid --exec /usr/sbin/dropbear
-+	echo "OK"
-+}
-+stop() {
-+	echo -n "Stopping sshd: "
-+	start-stop-daemon --stop --quiet --pidfile /var/run/dropbear.pid
-+	echo "OK"
-+}
-+restart() {
-+	stop
-+	start
-+}
-+
-+case "$1" in
-+  start)
-+  	start
-+	;;
-+  stop)
-+  	stop
-+	;;
-+  restart|reload)
-+  	restart
-+	;;
-+  *)
-+	echo $"Usage: $0 {start|stop|restart}"
-+	exit 1
-+esac
-+
-+exit $?
-+
 

--- a/package/dropbear_sshd/dropbear_sshd.mk
+++ /dev/null
@@ -1,83 +1,1 @@
-#############################################################
-#
-# dropbear_sshd
-#
-#############################################################
-DROPBEAR_SSHD_SOURCE:=dropbear-0.44.tar.bz2
-DROPBEAR_SSHD_SITE:=http://matt.ucc.asn.au/dropbear/releases/
-DROPBEAR_SSHD_DIR:=$(BUILD_DIR)/dropbear-0.44
-DROPBEAR_SSHD_CAT:=bzcat
-DROPBEAR_SSHD_BINARY:=dropbearmulti
-DROPBEAR_SSHD_TARGET_BINARY:=usr/sbin/dropbear
 
-
-$(DL_DIR)/$(DROPBEAR_SSHD_SOURCE):
-	 $(WGET) -P $(DL_DIR) $(DROPBEAR_SSHD_SITE)/$(DROPBEAR_SSHD_SOURCE)
-
-dropbear_sshd-source: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE)
-
-$(DROPBEAR_SSHD_DIR)/.unpacked: $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE)
-	$(DROPBEAR_SSHD_CAT) $(DL_DIR)/$(DROPBEAR_SSHD_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-	toolchain/patch-kernel.sh $(DROPBEAR_SSHD_DIR) package/dropbear_sshd/ dropbear-\*.patch
-	$(SED) 's,^/\* #define DROPBEAR_MULTI.*,#define DROPBEAR_MULTI,g' $(DROPBEAR_SSHD_DIR)/options.h
-	touch $(DROPBEAR_SSHD_DIR)/.unpacked
-
-$(DROPBEAR_SSHD_DIR)/.configured: $(DROPBEAR_SSHD_DIR)/.unpacked
-	(cd $(DROPBEAR_SSHD_DIR); rm -rf config.cache; \
-		autoconf; \
-		$(TARGET_CONFIGURE_OPTS) \
-		CFLAGS="$(TARGET_CFLAGS)" \
-		./configure \
-		--target=$(GNU_TARGET_NAME) \
-		--host=$(GNU_TARGET_NAME) \
-		--build=$(GNU_HOST_NAME) \
-		--prefix=/usr \
-		--exec-prefix=/usr \
-		--bindir=/usr/bin \
-		--sbindir=/usr/sbin \
-		--libexecdir=/usr/lib \
-		--sysconfdir=/etc \
-		--datadir=/usr/share \
-		--localstatedir=/var \
-		--mandir=/usr/man \
-		--infodir=/usr/info \
-		$(DISABLE_NLS) \
-		--with-shared \
-	);
-	touch  $(DROPBEAR_SSHD_DIR)/.configured
-
-$(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY): $(DROPBEAR_SSHD_DIR)/.configured
-	$(MAKE) $(TARGET_CONFIGURE_OPTS) LD=$(TARGET_CC) \
-		PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" \
-		MULTI=1 SCPPROGRESS=1 -C $(DROPBEAR_SSHD_DIR)
-
-$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY): $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY)
-	#$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \
-	#	LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) install
-	#rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \
-	#	$(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc
-	install -d -m 755 $(TARGET_DIR)/usr/sbin
-	install -d -m 755 $(TARGET_DIR)/usr/bin
-	install -m 755 $(DROPBEAR_SSHD_DIR)/$(DROPBEAR_SSHD_BINARY) \
-		$(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY)
-	ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/scp
-	ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/ssh
-	ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearkey
-	ln -sf ../sbin/dropbear $(TARGET_DIR)/usr/bin/dropbearconvert
-	cp $(DROPBEAR_SSHD_DIR)/S50dropbear $(TARGET_DIR)/etc/init.d/
-	chmod a+x $(TARGET_DIR)/etc/init.d/S50dropbear
-
-dropbear_sshd: uclibc zlib $(TARGET_DIR)/$(DROPBEAR_SSHD_TARGET_BINARY)
-
-dropbear_sshd-clean:
-	$(MAKE) DESTDIR=$(TARGET_DIR) $(TARGET_CONFIGURE_OPTS) \
-		LD=$(TARGET_CC) -C $(DROPBEAR_SSHD_DIR) uninstall
-	-$(MAKE) -C $(DROPBEAR_SSHD_DIR) clean
-
-dropbear_sshd-dirclean:
-	rm -rf $(DROPBEAR_SSHD_DIR)
-
-ifeq ($(strip $(BR2_PACKAGE_DROPBEAR_SSHD)),y)
-TARGETS+=dropbear_sshd
-endif
-

--- a/package/ebtables/Config.in
+++ b/package/ebtables/Config.in
@@ -1,7 +1,7 @@
 config BR2_PACKAGE_EBTABLES
-	bool "ebtables"
-	default n
+	tristate "Ethernet Bridge Firewalling"
+	default m
 	help
-		ethernet bridging firewalling
+		Ethernet Bridge Firewalling (ebtables)
 		http://ebtables.sourceforge.net/
 

--- /dev/null
+++ b/package/ebtables/Makefile
@@ -1,1 +1,44 @@
+#############################################################
+#
+# ebtables
+#
+#############################################################
+include $(TOPDIR)/rules.mk
 
+PKG_NAME:=ebtables
+PKG_VERSION:=2.0.6
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=http://umn.dl.sourceforge.net/sourceforge/ebtables/
+PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION).tar.gz
+PKG_BUILD_DIR:=$(BUILD_DIR)/ebtables-v$(PKG_VERSION)
+PKG_CAT:=zcat
+PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg
+
+$(DL_DIR)/$(PKG_SOURCE):
+	 $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE)
+
+$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE)
+	$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	touch $(PKG_BUILD_DIR)/.unpacked
+
+$(PKG_BUILD_DIR)/ebtables: $(PKG_BUILD_DIR)/.unpacked
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+		CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld \
+		CFLAGS="$(TARGET_CFLAGS) -Wall"
+
+$(PKG_IPK): $(PKG_BUILD_DIR)/ebtables
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_IPK_DIR)/usr/sbin
+	cp $(PKG_BUILD_DIR)/ebtables $(PKG_IPK_DIR)/usr/sbin/
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE)
+prepare: $(PKG_BUILD_DIR)/.unpacked
+compile: $(PKG_IPK)
+install:
+	$(IPKG) install $(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+

--- /dev/null
+++ b/package/ebtables/ebtables.control
@@ -1,1 +1,10 @@
+Package: ebtables
+Priority: optional
+Section: net
+Version: 1.2.11-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Ethernet bridge firewalling software
+Depends: kmod-ebtables
 

--- a/package/ebtables/ebtables.mk
+++ /dev/null
@@ -1,42 +1,1 @@
-#############################################################
-#
-# ebtables
-#
-#############################################################
 
-EBTABLES_SOURCE_URL=http://umn.dl.sourceforge.net/sourceforge/ebtables/
-EBTABLES_SOURCE=ebtables-v2.0.6.tar.gz
-EBTABLES_BUILD_DIR=$(BUILD_DIR)/ebtables-v2.0.6
-EBTABLES_TARGET_BINARY:=usr/sbin/ebtables
-
-$(DL_DIR)/$(EBTABLES_SOURCE):
-	 $(WGET) -P $(DL_DIR) $(EBTABLES_SOURCE_URL)/$(EBTABLES_SOURCE)
-
-$(EBTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(EBTABLES_SOURCE)
-	zcat $(DL_DIR)/$(EBTABLES_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-	touch $(EBTABLES_BUILD_DIR)/.unpacked
-
-$(EBTABLES_BUILD_DIR)/ebtables: $(EBTABLES_BUILD_DIR)/.unpacked
-	$(MAKE) -C $(EBTABLES_BUILD_DIR) \
-		CC=$(TARGET_CC) LD=$(TARGET_CROSS)ld \
-		CFLAGS="$(TARGET_CFLAGS) -Wall"
-
-$(TARGET_DIR)/$(EBTABLES_TARGET_BINARY): $(EBTABLES_BUILD_DIR)/ebtables
-	cp -af $(EBTABLES_BUILD_DIR)/ebtables $(TARGET_DIR)/$(EBTABLES_TARGET_BINARY)
-	$(STRIP) $(TARGET_DIR)/$(EBTABLES_TARGET_BINARY)
-
-ebtables: $(TARGET_DIR)/$(EBTABLES_TARGET_BINARY)
-
-ebtables-source: $(DL_DIR)/$(EBTABLES_SOURCE)
-
-ebtables-clean:
-	#$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(EBTABLES_BUILD_DIR) uninstall
-	-$(MAKE) -C $(EBTABLES_BUILD_DIR) clean
-
-ebtables-dirclean:
-	rm -rf $(EBTABLES_BUILD_DIR)
-
-ifeq ($(strip $(BR2_PACKAGE_EBTABLES)),y)
-TARGETS+=ebtables
-endif
-

--- /dev/null
+++ b/package/iproute2/Config.in
@@ -1,1 +1,18 @@
+config BR2_PACKAGE_IPROUTE2
+	bool
+	depends BR2_PACKAGE_IPROUTE2_IP || BR2_PACKAGE_IPROUTE2_TC
+	default n
 
+config BR2_PACKAGE_IPROUTE2_IP
+	tristate "iproute2 routing control (ip)"
+	default m
+	select BR2_PACKAGE_IPROUTE2
+
+config BR2_PACKAGE_IPROUTE2_TC
+	tristate "iproute2 traffic control (tc)"
+	default m
+	select BR2_PACKAGE_IPROUTE2
+	select BR2_PACKAGE_KMOD_SCHED
+
+	
+

--- /dev/null
+++ b/package/iproute2/Makefile
@@ -1,1 +1,88 @@
+#############################################################
+#
+# ebtables
+#
+#############################################################
+include $(TOPDIR)/rules.mk
 
+PKG_NAME:=iproute2
+PKG_VERSION:=2.6.9
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=http://developer.osdl.org/dev/iproute2/download/
+PKG_SOURCE:=$(PKG_NAME)-2.6.9-041019.tar.gz
+PKG_BUILD_DIR:=$(BUILD_DIR)/iproute2-2.6.9
+PKG_CAT:=zcat
+
+PKG_IP:=$(PACKAGE_DIR)/ip_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IP_DIR:=$(PKG_BUILD_DIR)/ipkg/ip
+
+PKG_TC:=$(PACKAGE_DIR)/tc_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_TC_DIR:=$(PKG_BUILD_DIR)/ipkg/tc
+
+$(DL_DIR)/$(PKG_SOURCE):
+	 $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE)
+
+$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE)
+	$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	$(PATCH) $(PKG_BUILD_DIR) ./patches
+	$(SED) "s:-O2:${TARGET_CFLAGS}:g" $(PKG_BUILD_DIR)/Makefile
+	touch $(PKG_BUILD_DIR)/.patched
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched
+	$(SED) "s,-I/usr/include/db3,," $(PKG_BUILD_DIR)/Makefile
+	$(SED) "s,^KERNEL_INCLUDE.*,KERNEL_INCLUDE=$(LINUX_DIR)/include," \
+		$(PKG_BUILD_DIR)/Makefile
+	$(SED) "s,^LIBC_INCLUDE.*,LIBC_INCLUDE=$(STAGING_DIR)/include," \
+		$(PKG_BUILD_DIR)/Makefile
+	# For now disable compiling of the misc directory because it seems to fail
+	rm -rf $(PKG_BUILD_DIR)/misc 
+	$(SED) "s, misc,," $(PKG_BUILD_DIR)/Makefile
+	touch $(PKG_BUILD_DIR)/.configured
+
+$(PKG_BUILD_DIR)/tc/tc: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) KERNEL_INCLUDE=$(LINUX_DIR)/include all tc/tc
+
+$(PKG_BUILD_DIR)/ip/ip: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) KERNEL_INCLUDE=$(LINUX_DIR)/include all ip/ip
+
+
+$(PKG_IP): $(PKG_BUILD_DIR)/ip/ip $(PACKAGE_DIR)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IP_DIR) ip.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_IP_DIR)/usr/sbin
+	cp $< $(PKG_IP_DIR)/usr/sbin/
+	$(STRIP) $(PKG_IP_DIR)/usr/sbin/*
+	$(IPKG_BUILD) $(PKG_IP_DIR) $(PACKAGE_DIR)
+
+$(PKG_TC): $(PKG_BUILD_DIR)/tc/tc $(PACKAGE_DIR)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_TC_DIR) tc.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_TC_DIR)/usr/sbin
+	cp $< $(PKG_TC_DIR)/usr/sbin/
+	$(STRIP) $(PKG_TC_DIR)/usr/sbin/*
+	$(IPKG_BUILD) $(PKG_TC_DIR) $(PACKAGE_DIR)
+
+$(PACKAGE_DIR):
+	mkdir -p $(PACKAGE_DIR)
+
+TARGETS:=
+ifneq ($(BR2_PACKAGE_IPROUTE2_IP),)
+TARGETS += $(PKG_IP)
+endif
+ifneq ($(BR2_PACKAGE_IPROUTE2_TC),)
+TARGETS += $(PKG_TC)
+endif
+
+source: $(DL_DIR)/$(PKG_SOURCE)
+prepare: $(PKG_BUILD_DIR)/.patched
+compile: $(TARGETS)
+install:
+ifeq ($(BR2_PACKAGE_IPROUTE2_IP),y)
+	$(IPKG) install $(PKG_IP)
+endif
+ifeq ($(BR2_PACKAGE_IPROUTE2_TC),y)
+	$(IPKG) install $(PKG_TC)
+endif
+
+
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+

--- /dev/null
+++ b/package/iproute2/ip.control
@@ -1,1 +1,9 @@
+Package: ip
+Architecture: mipsel
+Version: 2.6.9-1
+Section: net
+Priority: optional
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: iproute2 routing control utility
 

--- /dev/null
+++ b/package/iproute2/patches/debian-patches-3.patch
@@ -1,1 +1,1498 @@
+--- iproute-20041019.orig/ip/Makefile
++++ iproute-20041019/ip/Makefile
+@@ -6,7 +6,7 @@
+ RTMONOBJ=rtmon.o
+ 
+ ALLOBJ=$(IPOBJ) $(RTMONOBJ)
+-TARGETS=ip rtmon ifcfg rtpr
++TARGETS=ip rtmon
+ 
+ all: $(TARGETS)
+ 
+--- iproute-20041019.orig/tc/q_htb.c
++++ iproute-20041019/tc/q_htb.c
+@@ -1,3 +1,311 @@
++#if 0
++/*
++ * q_htb.c		HTB.
++ *
++ *		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 of the License, or (at your option) any later version.
++ *
++ * Authors:	Martin Devera, devik@cdi.cz
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <syslog.h>
++#include <fcntl.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <string.h>
++
++#include "utils.h"
++#include "tc_util.h"
++
++#define HTB_TC_VER 0x30003
++#if HTB_TC_VER >> 16 != TC_HTB_PROTOVER
++#error "Different kernel and TC HTB versions"
++#endif
++
++static void explain(void)
++{
++	fprintf(stderr, "Usage: ... qdisc add ... htb [default N] [r2q N]\n"
++		" default  minor id of class to which unclassified packets are sent {0}\n"
++		" r2q      DRR quantums are computed as rate in Bps/r2q {10}\n"
++		" debug    string of 16 numbers each 0-3 {0}\n\n"
++		"... class add ... htb rate R1 burst B1 [prio P] [slot S] [pslot PS]\n"
++		"                      [ceil R2] [cburst B2] [mtu MTU] [quantum Q]\n"
++		" rate     rate allocated to this class (class can still borrow)\n"
++		" burst    max bytes burst which can be accumulated during idle period {computed}\n"
++		" ceil     definite upper class rate (no borrows) {rate}\n"
++		" cburst   burst but for ceil {computed}\n"
++		" mtu      max packet size we create rate map for {1600}\n"
++		" prio     priority of leaf; lower are served first {0}\n"
++		" quantum  how much bytes to serve from leaf at once {use r2q}\n"
++		"\nTC HTB version %d.%d\n",HTB_TC_VER>>16,HTB_TC_VER&0xffff
++		);
++}
++
++static void explain1(char *arg)
++{
++    fprintf(stderr, "Illegal \"%s\"\n", arg);
++    explain();
++}
++
++
++#define usage() return(-1)
++
++static int htb_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++	struct tc_htb_glob opt;
++	struct rtattr *tail;
++	unsigned i; char *p;
++	memset(&opt,0,sizeof(opt));
++	opt.rate2quantum = 10;
++	opt.version = 3;
++
++	while (argc > 0) {
++		if (matches(*argv, "r2q") == 0) {
++		    NEXT_ARG();
++		    if (get_u32(&opt.rate2quantum, *argv, 10)) {
++			explain1("r2q"); return -1;
++		    }
++		} else if (matches(*argv, "default") == 0) {
++		    NEXT_ARG();
++		    if (get_u32(&opt.defcls, *argv, 16)) {
++			explain1("default"); return -1;
++		    }
++		} else if (matches(*argv, "debug") == 0) {
++		    NEXT_ARG(); p = *argv;
++		    for (i=0; i<16; i++,p++) {
++			if (*p<'0' || *p>'3') break;
++			opt.debug |= (*p-'0')<<(2*i);
++		    }
++		} else {
++			fprintf(stderr, "What is \"%s\"?\n", *argv);
++			explain();
++			return -1;
++		}
++		argc--; argv++;
++	}
++	tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len));
++	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
++	addattr_l(n, 2024, TCA_HTB_INIT, &opt, NLMSG_ALIGN(sizeof(opt)));
++	tail->rta_len = (((void*)n)+NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail;
++	return 0;
++}
++
++static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++	int ok=0;
++	struct tc_htb_opt opt;
++	__u32 rtab[256],ctab[256];
++	unsigned buffer=0,cbuffer=0;
++	int cell_log=-1,ccell_log = -1,mtu;
++	struct rtattr *tail;
++
++	memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */
++
++	while (argc > 0) {
++		if (matches(*argv, "prio") == 0) {
++			NEXT_ARG();
++			if (get_u32(&opt.prio, *argv, 10)) {
++				explain1("prio"); return -1;
++			}
++			ok++;
++		} else if (matches(*argv, "mtu") == 0) {
++			NEXT_ARG();
++			if (get_u32(&mtu, *argv, 10)) {
++				explain1("mtu"); return -1;
++			}
++		} else if (matches(*argv, "quantum") == 0) {
++			NEXT_ARG();
++			if (get_u32(&opt.quantum, *argv, 10)) {
++				explain1("quantum"); return -1;
++			}
++		} else if (matches(*argv, "burst") == 0 ||
++			strcmp(*argv, "buffer") == 0 ||
++			strcmp(*argv, "maxburst") == 0) {
++			NEXT_ARG();
++			if (get_size_and_cell(&buffer, &cell_log, *argv) < 0) {
++				explain1("buffer");
++				return -1;
++			}
++			ok++;
++		} else if (matches(*argv, "cburst") == 0 ||
++			strcmp(*argv, "cbuffer") == 0 ||
++			strcmp(*argv, "cmaxburst") == 0) {
++			NEXT_ARG();
++			if (get_size_and_cell(&cbuffer, &ccell_log, *argv) < 0) {
++				explain1("cbuffer");
++				return -1;
++			}
++			ok++;
++		} else if (strcmp(*argv, "ceil") == 0) {
++			NEXT_ARG();
++			if (opt.ceil.rate) {
++				fprintf(stderr, "Double \"ceil\" spec\n");
++				return -1;
++			}
++			if (get_rate(&opt.ceil.rate, *argv)) {
++				explain1("ceil");
++				return -1;
++			}
++			ok++;
++		} else if (strcmp(*argv, "rate") == 0) {
++			NEXT_ARG();
++			if (opt.rate.rate) {
++				fprintf(stderr, "Double \"rate\" spec\n");
++				return -1;
++			}
++			if (get_rate(&opt.rate.rate, *argv)) {
++				explain1("rate");
++				return -1;
++			}
++			ok++;
++		} else if (strcmp(*argv, "help") == 0) {
++			explain();
++			return -1;
++		} else {
++			fprintf(stderr, "What is \"%s\"?\n", *argv);
++			explain();
++			return -1;
++		}
++		argc--; argv++;
++	}
++
++/*	if (!ok)
++		return 0;*/
++
++	if (opt.rate.rate == 0) {
++		fprintf(stderr, "\"rate\" is required.\n");
++		return -1;
++	}
++	/* if ceil params are missing, use the same as rate */
++	if (!opt.ceil.rate) opt.ceil = opt.rate;
++
++	/* compute minimal allowed burst from rate; mtu is added here to make
++	   sute that buffer is larger than mtu and to have some safeguard space */
++	if (!buffer) buffer = opt.rate.rate / HZ + mtu;
++	if (!cbuffer) cbuffer = opt.ceil.rate / HZ + mtu;
++
++	if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, 0)) < 0) {
++		fprintf(stderr, "htb: failed to calculate rate table.\n");
++		return -1;
++	}
++	opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer);
++	opt.rate.cell_log = cell_log;
++	
++	if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, 0)) < 0) {
++		fprintf(stderr, "htb: failed to calculate ceil rate table.\n");
++		return -1;
++	}
++	opt.cbuffer = tc_calc_xmittime(opt.ceil.rate, cbuffer);
++	opt.ceil.cell_log = ccell_log;
++
++	tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len));
++	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
++	addattr_l(n, 2024, TCA_HTB_PARMS, &opt, sizeof(opt));
++	addattr_l(n, 3024, TCA_HTB_RTAB, rtab, 1024);
++	addattr_l(n, 4024, TCA_HTB_CTAB, ctab, 1024);
++	tail->rta_len = (((void*)n)+NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail;
++	return 0;
++}
++
++static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++	struct rtattr *tb[TCA_HTB_RTAB+1];
++	struct tc_htb_opt *hopt;
++	struct tc_htb_glob *gopt;
++	double buffer,cbuffer;
++	SPRINT_BUF(b1);
++	SPRINT_BUF(b2);
++
++	if (opt == NULL)
++		return 0;
++
++	memset(tb, 0, sizeof(tb));
++	parse_rtattr(tb, TCA_HTB_RTAB, RTA_DATA(opt), RTA_PAYLOAD(opt));
++
++	if (tb[TCA_HTB_PARMS]) {
++
++	    hopt = RTA_DATA(tb[TCA_HTB_PARMS]);
++	    if (RTA_PAYLOAD(tb[TCA_HTB_PARMS])  < sizeof(*hopt)) return -1;
++
++		if (!hopt->level) {
++			fprintf(f, "prio %d ", (int)hopt->prio);
++			if (show_details)
++				fprintf(f, "quantum %d ", (int)hopt->quantum);
++		}
++	    fprintf(f, "rate %s ", sprint_rate(hopt->rate.rate, b1));
++	    buffer = ((double)hopt->rate.rate*tc_core_tick2usec(hopt->buffer))/1000000;
++	    fprintf(f, "ceil %s ", sprint_rate(hopt->ceil.rate, b1));
++	    cbuffer = ((double)hopt->ceil.rate*tc_core_tick2usec(hopt->cbuffer))/1000000;
++	    if (show_details) {
++		fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1),
++			1<<hopt->rate.cell_log, sprint_size(hopt->rate.mpu, b2));
++		fprintf(f, "cburst %s/%u mpu %s ", sprint_size(cbuffer, b1),
++			1<<hopt->ceil.cell_log, sprint_size(hopt->ceil.mpu, b2));
++		fprintf(f, "level %d ", (int)hopt->level);
++	    } else {
++		fprintf(f, "burst %s ", sprint_size(buffer, b1));
++		fprintf(f, "cburst %s ", sprint_size(cbuffer, b1));
++	    }
++	    if (show_raw)
++		fprintf(f, "buffer [%08x] cbuffer [%08x] ", 
++			hopt->buffer,hopt->cbuffer);
++	}
++	if (tb[TCA_HTB_INIT]) {
++	    gopt = RTA_DATA(tb[TCA_HTB_INIT]);
++	    if (RTA_PAYLOAD(tb[TCA_HTB_INIT])  < sizeof(*gopt)) return -1;
++
++	    fprintf(f, "r2q %d default %x direct_packets_stat %u", 
++		    gopt->rate2quantum,gopt->defcls,gopt->direct_pkts);
++		if (show_details)
++			fprintf(f," ver %d.%d",gopt->version >> 16,gopt->version & 0xffff);
++	}
++	return 0;
++}
++
++static int htb_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++{
++	struct tc_htb_xstats *st;
++	if (xstats == NULL)
++		return 0;
++
++	if (RTA_PAYLOAD(xstats) < sizeof(*st))
++		return -1;
++
++	st = RTA_DATA(xstats);
++	fprintf(f, " lended: %u borrowed: %u giants: %u\n", 
++		st->lends,st->borrows,st->giants);
++	fprintf(f, " tokens: %d ctokens: %d\n", st->tokens,st->ctokens);
++	return 0;
++}
++
++struct qdisc_util htb_util = {
++	NULL,
++	"htb",
++	htb_parse_opt,
++	htb_print_opt,
++	htb_print_xstats,
++	htb_parse_class_opt,
++	htb_print_opt,
++};
++
++/* for testing of old one */
++struct qdisc_util htb2_util = {
++	NULL,
++	"htb2",
++	htb_parse_opt,
++	htb_print_opt,
++	htb_print_xstats,
++	htb_parse_class_opt,
++	htb_print_opt,
++};
++#endif
+ /*
+  * q_htb.c		HTB.
+  *
+--- iproute-20041019.orig/doc/Makefile
++++ iproute-20041019/doc/Makefile
+@@ -14,6 +14,7 @@
+ PAGESPERPAGE=2
+ 
+ HTMLFILES=$(subst .sgml,.html,$(shell echo *.sgml))
++TXTFILES=$(subst .sgml,.txt,$(shell echo *.sgml))
+ DVIFILES=$(subst .ps,.dvi,$(PSFILES))
+ 
+ 
+@@ -23,6 +24,8 @@
+ 
+ html: $(HTMLFILES)
+ 
++txt: $(TXTFILES)
++
+ dvi: $(DVIFILES)
+ 
+ print: $(PSFILES)
+@@ -42,16 +45,17 @@
+ 	done
+ 
+ %.ps: %.dvi
+-	$(DVIPS) $< -o $@.tmp
+-	./do-psnup $@.tmp $@ $(PAGESIZE) $(PAGESPERPAGE)
+-	rm -f $@.tmp
++	$(DVIPS) $< -o $@
+ 
+ %.html: %.sgml
+ 	$(SGML2HTML) $<
+ 
++%.txt: %.html
++	lynx -nolist -dump $< > $@
++
+ install:
+ 	install -m 0644 $(shell echo *.tex) $(DESTDIR)$(DOCDIR)
+ 	install -m 0644 $(shell echo *.sgml) $(DESTDIR)$(DOCDIR)
+ 
+ clean:
+-	rm -f *.aux *.log *.toc $(PSFILES) $(DVIFILES) *.html
++	rm -f *.aux *.log *.toc $(PSFILES) $(DVIFILES) *.html $(TXTFILES)
+--- iproute-20041019.orig/misc/Makefile
++++ iproute-20041019/misc/Makefile
+@@ -1,7 +1,8 @@
+ SSOBJ=ss.o ssfilter.o
+ LNSTATOBJ=lnstat.o lnstat_util.o
+ 
+-TARGETS=ss nstat ifstat rtacct arpd lnstat
++#TARGETS=ss nstat ifstat rtacct arpd lnstat
++TARGETS=ss nstat rtacct lnstat
+ 
+ include ../Config
+ 
+--- iproute-20041019.orig/misc/netbug
++++ iproute-20041019/misc/netbug
+@@ -1,23 +1,16 @@
+ #! /bin/bash
+ 
++set -e
++
+ echo -n "Send network configuration summary to [ENTER means kuznet@ms2.inr.ac.ru] "
+ IFS="" read mail || exit 1
+ [ -z "$mail" ] && mail=kuznet@ms2.inr.ac.ru
+ 
++netbug=`mktemp -d -t netbug.XXXXXX` || {echo "$0: Cannot create temporary directory" >&2; exit 1;  }
++netbugtar=`tempfile -d $netbug --suffix=tar.gz` || {echo "$0: Cannot create temporary file" >&2; exit 1;  }
++tmppath=$netbug
++trap "/bin/rm -rf $netbug $netbugtar" 0 1 2 3 13 15
+ 
+-netbug=""
+-while [ "$netbug" = "" ]; do
+-	netbug=`echo netbug.$$.$RANDOM`
+-	if [ -e /tmp/$netbug ]; then
+-		netbug=""
+-	fi
+-done
+-
+-tmppath=/tmp/$netbug
+-
+-trap "rm -rf $tmppath $tmppath.tar.gz" 0 SIGINT
+-
+-mkdir $tmppath
+ mkdir $tmppath/net
+ 
+ cat /proc/slabinfo > $tmppath/slabinfo
+@@ -44,9 +37,8 @@
+ fi
+ 
+ cd /tmp
+-tar c $netbug | gzip -9c > $netbug.tar.gz
+-
+-uuencode $netbug.tar.gz $netbug.tar.gz | mail -s $netbug "$mail"
++tar c $tmppath | gzip -9c > $netbugtar
++uuencode $netbugtar $netbugtar | mail -s $netbug "$mail"
+ 
+ echo "Sending to <$mail>; subject is $netbug"
+ 
+--- iproute-20041019.orig/Makefile
++++ iproute-20041019/Makefile
+@@ -30,7 +30,7 @@
+ LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
+ 
+ all: Config
+-	@for i in $(SUBDIRS); \
++	@set -e; for i in $(SUBDIRS); \
+ 	do $(MAKE) $(MFLAGS) -C $$i; done
+ 
+ Config:
+@@ -45,7 +45,7 @@
+ 		$(DESTDIR)$(DOCDIR)/examples
+ 	install -m 0644 $(shell find examples/diffserv -type f -maxdepth 1) \
+ 		$(DESTDIR)$(DOCDIR)/examples/diffserv
+-	@for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done
++	@set -e; for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done
+ 	install -m 0644 $(shell find etc/iproute2 -type f -maxdepth 1) $(DESTDIR)$(CONFDIR)
+ 	install -m 0755 -d $(DESTDIR)$(MANDIR)/man8
+ 	install -m 0644 $(shell find man/man8 -type f -maxdepth 1) $(DESTDIR)$(MANDIR)/man8
+@@ -53,7 +53,7 @@
+ 	ln -sf $(MANDIR)/man8/tc-pbfifo.8  $(DESTDIR)$(MANDIR)/man8/tc-pfifo.8
+ 
+ clean:
+-	@for i in $(SUBDIRS) doc; \
++	@set -e; for i in $(SUBDIRS) doc; \
+ 	do $(MAKE) $(MFLAGS) -C $$i clean; done
+ 
+ clobber: clean
+--- iproute-20041019.orig/include/linux/pkt_sched.h
++++ iproute-20041019/include/linux/pkt_sched.h
+@@ -1,3 +1,409 @@
++#if 0
++#ifndef __LINUX_PKT_SCHED_H
++#define __LINUX_PKT_SCHED_H
++
++/* Logical priority bands not depending on specific packet scheduler.
++   Every scheduler will map them to real traffic classes, if it has
++   no more precise mechanism to classify packets.
++
++   These numbers have no special meaning, though their coincidence
++   with obsolete IPv6 values is not occasional :-). New IPv6 drafts
++   preferred full anarchy inspired by diffserv group.
++
++   Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
++   class, actually, as rule it will be handled with more care than
++   filler or even bulk.
++ */
++
++#define TC_PRIO_BESTEFFORT		0
++#define TC_PRIO_FILLER			1
++#define TC_PRIO_BULK			2
++#define TC_PRIO_INTERACTIVE_BULK	4
++#define TC_PRIO_INTERACTIVE		6
++#define TC_PRIO_CONTROL			7
++
++#define TC_PRIO_MAX			15
++
++/* Generic queue statistics, available for all the elements.
++   Particular schedulers may have also their private records.
++ */
++
++struct tc_stats
++{
++	__u64	bytes;			/* NUmber of enqueues bytes */
++	__u32	packets;		/* Number of enqueued packets	*/
++	__u32	drops;			/* Packets dropped because of lack of resources */
++	__u32	overlimits;		/* Number of throttle events when this
++					 * flow goes out of allocated bandwidth */
++	__u32	bps;			/* Current flow byte rate */
++	__u32	pps;			/* Current flow packet rate */
++	__u32	qlen;
++	__u32	backlog;
++#ifdef __KERNEL__
++	spinlock_t *lock;
++#endif
++};
++
++struct tc_estimator
++{
++	char		interval;
++	unsigned char	ewma_log;
++};
++
++/* "Handles"
++   ---------
++
++    All the traffic control objects have 32bit identifiers, or "handles".
++
++    They can be considered as opaque numbers from user API viewpoint,
++    but actually they always consist of two fields: major and
++    minor numbers, which are interpreted by kernel specially,
++    that may be used by applications, though not recommended.
++
++    F.e. qdisc handles always have minor number equal to zero,
++    classes (or flows) have major equal to parent qdisc major, and
++    minor uniquely identifying class inside qdisc.
++
++    Macros to manipulate handles:
++ */
++
++#define TC_H_MAJ_MASK (0xFFFF0000U)
++#define TC_H_MIN_MASK (0x0000FFFFU)
++#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
++#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
++#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
++
++#define TC_H_UNSPEC	(0U)
++#define TC_H_ROOT	(0xFFFFFFFFU)
++#define TC_H_INGRESS    (0xFFFFFFF1U)
++
++struct tc_ratespec
++{
++	unsigned char	cell_log;
++	unsigned char	__reserved;
++	unsigned short	feature;
++	short		addend;
++	unsigned short	mpu;
++	__u32		rate;
++};
++
++/* FIFO section */
++
++struct tc_fifo_qopt
++{
++	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
++};
++
++/* PRIO section */
++
++#define TCQ_PRIO_BANDS	16
++
++struct tc_prio_qopt
++{
++	int	bands;			/* Number of bands */
++	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
++};
++
++/* CSZ section */
++
++struct tc_csz_qopt
++{
++	int		flows;		/* Maximal number of guaranteed flows */
++	unsigned char	R_log;		/* Fixed point position for round number */
++	unsigned char	delta_log;	/* Log of maximal managed time interval */
++	__u8		priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> CSZ band */
++};
++
++struct tc_csz_copt
++{
++	struct tc_ratespec slice;
++	struct tc_ratespec rate;
++	struct tc_ratespec peakrate;
++	__u32		limit;
++	__u32		buffer;
++	__u32		mtu;
++};
++
++enum
++{
++	TCA_CSZ_UNSPEC,
++	TCA_CSZ_PARMS,
++	TCA_CSZ_RTAB,
++	TCA_CSZ_PTAB,
++};
++
++/* TBF section */
++
++struct tc_tbf_qopt
++{
++	struct tc_ratespec rate;
++	struct tc_ratespec peakrate;
++	__u32		limit;
++	__u32		buffer;
++	__u32		mtu;
++};
++
++enum
++{
++	TCA_TBF_UNSPEC,
++	TCA_TBF_PARMS,
++	TCA_TBF_RTAB,
++	TCA_TBF_PTAB,
++};
++
++
++/* TEQL section */
++
++/* TEQL does not require any parameters */
++
++/* SFQ section */
++
++struct tc_sfq_qopt
++{
++	unsigned	quantum;	/* Bytes per round allocated to flow */
++	int		perturb_period;	/* Period of hash perturbation */
++	__u32		limit;		/* Maximal packets in queue */
++	unsigned	divisor;	/* Hash divisor  */
++	unsigned	flows;		/* Maximal number of flows  */
++};
++
++/*
++ *  NOTE: limit, divisor and flows are hardwired to code at the moment.
++ *
++ *	limit=flows=128, divisor=1024;
++ *
++ *	The only reason for this is efficiency, it is possible
++ *	to change these parameters in compile time.
++ */
++
++/* RED section */
++
++enum
++{
++	TCA_RED_UNSPEC,
++	TCA_RED_PARMS,
++	TCA_RED_STAB,
++};
++
++struct tc_red_qopt
++{
++	__u32		limit;		/* HARD maximal queue length (bytes)	*/
++	__u32		qth_min;	/* Min average length threshold (bytes) */
++	__u32		qth_max;	/* Max average length threshold (bytes) */
++	unsigned char   Wlog;		/* log(W)		*/
++	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
++	unsigned char   Scell_log;	/* cell size for idle damping */
++	unsigned char	flags;
++#define TC_RED_ECN	1
++};
++
++struct tc_red_xstats
++{
++	__u32           early;          /* Early drops */
++	__u32           pdrop;          /* Drops due to queue limits */
++	__u32           other;          /* Drops due to drop() calls */
++	__u32           marked;         /* Marked packets */
++};
++
++/* GRED section */
++
++#define MAX_DPs 16
++
++enum
++{
++       TCA_GRED_UNSPEC,
++       TCA_GRED_PARMS,
++       TCA_GRED_STAB,
++       TCA_GRED_DPS,
++};
++
++#define TCA_SET_OFF TCA_GRED_PARMS
++struct tc_gred_qopt
++{
++       __u32           limit;          /* HARD maximal queue length (bytes)    
++*/
++       __u32           qth_min;        /* Min average length threshold (bytes) 
++*/
++       __u32           qth_max;        /* Max average length threshold (bytes) 
++*/
++       __u32           DP;             /* upto 2^32 DPs */
++       __u32           backlog;        
++       __u32           qave;   
++       __u32           forced; 
++       __u32           early;  
++       __u32           other;  
++       __u32           pdrop;  
++
++       unsigned char   Wlog;           /* log(W)               */
++       unsigned char   Plog;           /* log(P_max/(qth_max-qth_min)) */
++       unsigned char   Scell_log;      /* cell size for idle damping */
++       __u8            prio;		/* prio of this VQ */
++       __u32	packets;
++       __u32	bytesin;
++};
++/* gred setup */
++struct tc_gred_sopt
++{
++       __u32           DPs;
++       __u32           def_DP;
++       __u8            grio;
++};
++
++/* HTB section */
++#define TC_HTB_NUMPRIO		8
++#define TC_HTB_MAXDEPTH		8
++#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
++
++struct tc_htb_opt
++{
++	struct tc_ratespec 	rate;
++	struct tc_ratespec 	ceil;
++	__u32	buffer;
++	__u32	cbuffer;
++	__u32	quantum;
++	__u32	level;		/* out only */
++	__u32	prio;
++};
++struct tc_htb_glob
++{
++	__u32 version;		/* to match HTB/TC */
++    	__u32 rate2quantum;	/* bps->quantum divisor */
++    	__u32 defcls;		/* default class number */
++	__u32 debug;		/* debug flags */
++
++	/* stats */
++	__u32 direct_pkts; /* count of non shapped packets */
++};
++enum
++{
++	TCA_HTB_UNSPEC,
++	TCA_HTB_PARMS,
++	TCA_HTB_INIT,
++	TCA_HTB_CTAB,
++	TCA_HTB_RTAB,
++};
++struct tc_htb_xstats
++{
++	__u32 lends;
++	__u32 borrows;
++	__u32 giants;	/* too big packets (rate will not be accurate) */
++	__u32 tokens;
++	__u32 ctokens;
++};
++
++/* CBQ section */
++
++#define TC_CBQ_MAXPRIO		8
++#define TC_CBQ_MAXLEVEL		8
++#define TC_CBQ_DEF_EWMA		5
++
++struct tc_cbq_lssopt
++{
++	unsigned char	change;
++	unsigned char	flags;
++#define TCF_CBQ_LSS_BOUNDED	1
++#define TCF_CBQ_LSS_ISOLATED	2
++	unsigned char  	ewma_log;
++	unsigned char  	level;
++#define TCF_CBQ_LSS_FLAGS	1
++#define TCF_CBQ_LSS_EWMA	2
++#define TCF_CBQ_LSS_MAXIDLE	4
++#define TCF_CBQ_LSS_MINIDLE	8
++#define TCF_CBQ_LSS_OFFTIME	0x10
++#define TCF_CBQ_LSS_AVPKT	0x20
++	__u32		maxidle;
++	__u32		minidle;
++	__u32		offtime;
++	__u32		avpkt;
++};
++
++struct tc_cbq_wrropt
++{
++	unsigned char	flags;
++	unsigned char	priority;
++	unsigned char	cpriority;
++	unsigned char	__reserved;
++	__u32		allot;
++	__u32		weight;
++};
++
++struct tc_cbq_ovl
++{
++	unsigned char	strategy;
++#define	TC_CBQ_OVL_CLASSIC	0
++#define	TC_CBQ_OVL_DELAY	1
++#define	TC_CBQ_OVL_LOWPRIO	2
++#define	TC_CBQ_OVL_DROP		3
++#define	TC_CBQ_OVL_RCLASSIC	4
++	unsigned char	priority2;
++	__u32		penalty;
++};
++
++struct tc_cbq_police
++{
++	unsigned char	police;
++	unsigned char	__res1;
++	unsigned short	__res2;
++};
++
++struct tc_cbq_fopt
++{
++	__u32		split;
++	__u32		defmap;
++	__u32		defchange;
++};
++
++struct tc_cbq_xstats
++{
++	__u32		borrows;
++	__u32		overactions;
++	__s32		avgidle;
++	__s32		undertime;
++};
++
++enum
++{
++	TCA_CBQ_UNSPEC,
++	TCA_CBQ_LSSOPT,
++	TCA_CBQ_WRROPT,
++	TCA_CBQ_FOPT,
++	TCA_CBQ_OVL_STRATEGY,
++	TCA_CBQ_RATE,
++	TCA_CBQ_RTAB,
++	TCA_CBQ_POLICE,
++};
++
++#define TCA_CBQ_MAX	TCA_CBQ_POLICE
++
++/* dsmark section */
++
++enum {
++	TCA_DSMARK_UNSPEC,
++	TCA_DSMARK_INDICES,
++	TCA_DSMARK_DEFAULT_INDEX,
++	TCA_DSMARK_SET_TC_INDEX,
++	TCA_DSMARK_MASK,
++	TCA_DSMARK_VALUE
++};
++
++#define TCA_DSMARK_MAX TCA_DSMARK_VALUE
++
++/* ATM  section */
++
++enum {
++	TCA_ATM_UNSPEC,
++	TCA_ATM_FD,		/* file/socket descriptor */
++	TCA_ATM_PTR,		/* pointer to descriptor - later */
++	TCA_ATM_HDR,		/* LL header */
++	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
++	TCA_ATM_ADDR,		/* PVC address (for output only) */
++	TCA_ATM_STATE		/* VC state (ATM_VS_*; for output only) */
++};
++
++#define TCA_ATM_MAX	TCA_ATM_STATE
++
++#endif
++#endif
+ #ifndef __LINUX_PKT_SCHED_H
+ #define __LINUX_PKT_SCHED_H
+ 
+--- iproute-20010824/ip/iproute.c
++++ iproute-20010824/ip/iproute.c
+@@ -57,7 +57,7 @@
+ 	fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n");
+ 	fprintf(stderr, "           [ rtt NUMBER ] [ rttvar NUMBER ]\n");
+ 	fprintf(stderr, "           [ window NUMBER] [ cwnd NUMBER ] [ ssthresh REALM ]\n");
+-	fprintf(stderr, "           [ realms REALM ]\n");
++	fprintf(stderr, "           [ realms REALM ] [ hoplimit NUMBER ] [ initcwnd NUMBER ]\n");
+ 	fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n");
+ 	fprintf(stderr, "          unreachable | prohibit | blackhole | nat ]\n");
+ 	fprintf(stderr, "TABLE_ID := [ local | main | default | all | NUMBER ]\n");
+@@ -481,6 +481,8 @@
+ 				"cwnd",
+ 				"advmss",
+ 				"reordering",
++				"hoplimit",
++				"initcwnd",
+ 			};
+ 			static int hz;
+ 			if (mxrta[i] == NULL)
+@@ -750,6 +752,30 @@
+ 				invarg("\"reordering\" value is invalid\n", *argv);
+ 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_REORDERING, reord);
+ #endif
++#ifdef RTAX_HOPLIMIT
++		} else if (strcmp(*argv, "hoplimit") == 0) {
++			unsigned hoplim;
++			NEXT_ARG();
++			if (strcmp(*argv, "lock") == 0) {
++				mxlock |= (1<<RTAX_HOPLIMIT);
++				NEXT_ARG();
++			}
++			if (get_unsigned(&hoplim, *argv, 0))
++				invarg("\"hoplimit\" value is invalid\n", *argv);
++			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_HOPLIMIT, hoplim);
++#endif
++#ifdef RTAX_INITCWND
++		} else if (strcmp(*argv, "initcwnd") == 0) {
++			unsigned initcwnd;
++			NEXT_ARG();
++			if (strcmp(*argv, "lock") == 0) {
++				mxlock |= (1<<RTAX_HOPLIMIT);
++				NEXT_ARG();
++			}
++			if (get_unsigned(&initcwnd, *argv, 0))
++				invarg("\"initcwnd\" value is invalid\n", *argv);
++			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_INITCWND, initcwnd);
++#endif
+ 		} else if (strcmp(*argv, "rtt") == 0) {
+ 			unsigned rtt;
+ 			NEXT_ARG();
+--- iproute-20010824.orig/doc/ip-cref.tex
++++ iproute-20010824/doc/ip-cref.tex
+@@ -1324,2 +1324,15 @@
+ 
++\item \verb|hoplimit NUMBER|
++
++--- [2.5.74+ only] Hop limit on the path to this destination. If it is not
++    given, Linux uses the value selected with \verb|sysctl| variable
++    \verb|net/ipv4/ip_default_ttl|.
++
++\item \verb|initcwnd NUMBER|
++
++--- [2.5.70+ only] Initial congestion window size when establishing
++    connections to this destination. This value is multiplied with the
++    MSS (``Maximal Segment Size'') for the connection to get the actual
++    window size. If it is not given (or set to zero), Linux uses the
++    values specified in~\cite{RFC2414}.
+ 
+@@ -2653,2 +2666,5 @@
+ 
++\bibitem{RFC2414}  M.~Allman, S.~Floyd, C.~Partridge.
++``Increasing TCP's Initial Window'', RFC-2414.
++
+ \end{thebibliography}
+#! /bin/sh -e
+## 
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: add references to lartc
+## DP: also drop bogus reference to tc-filters
 
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+@DPATCH@
+diff -Nur old/man/man8/ip.8 new/man/man8/ip.8
+--- old/man/man8/ip.8	2005-01-05 22:40:29.000000000 +0000
++++ new/man/man8/ip.8	2005-01-05 22:47:03.000000000 +0000
+@@ -1803,6 +1803,8 @@
+ .RB "IP Command reference " ip-cref.ps
+ .br
+ .RB "IP tunnels " ip-cref.ps
++.br
++.RB http://lartc.org/
+ 
+ .SH AUTHOR
+ 
+diff -Nur old/man/man8/tc.8 new/man/man8/tc.8
+--- old/man/man8/tc.8	2004-10-19 20:49:02.000000000 +0000
++++ new/man/man8/tc.8	2005-01-05 22:46:15.000000000 +0000
+@@ -341,7 +341,7 @@
+ .BR tc-pfifo (8),
+ .BR tc-bfifo (8),
+ .BR tc-pfifo_fast (8),
+-.BR tc-filters (8)
++.BR http://lartc.org/
+ 
+ .SH AUTHOR
+ Manpage maintained by bert hubert (ahu@ds9a.nl)
+#! /bin/sh -e
+## 
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: fixes typo
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+@DPATCH@
+--- iproute/ip/iptunnel.c.orig  2003-07-10 11:47:06.000000000 +1000
++++ iproute/ip/iptunnel.c       2003-07-10 11:47:11.000000000 +1000
+@@ -221,7 +221,7 @@
+			NEXT_ARG();
+			p->i_flags |= GRE_KEY;
+			if (strchr(*argv, '.'))
+-				p->o_key = get_addr32(*argv);
++				p->i_key = get_addr32(*argv);
+			else {
+				if (get_unsigned(&uval, *argv, 0)<0) {
+					fprintf(stderr, "invalid value of \"ikey\"\n");
+#! /bin/sh -e
+## 
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: add the wrr qdisc scheduler, see #198414
+
+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
+
+if [ $# -ne 1 ]; then
+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+    exit 1
+fi
+case "$1" in
+       -patch) patch $patch_opts -p1 < $0;;
+       -unpatch) patch $patch_opts -p1 -R < $0;;
+        *)
+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
+                exit 1;;
+esac
+
+exit 0
+@DPATCH@
+diff -urN iproute-20041019.orig/include/linux/pkt_sched.h iproute-20041019/include/linux/pkt_sched.h
+--- iproute-20041019.orig/include/linux/pkt_sched.h	2005-01-06 00:42:42.000000000 +0100
++++ iproute-20041019/include/linux/pkt_sched.h	2005-01-06 00:38:06.000000000 +0100
+@@ -837,4 +837,116 @@
+ 
+ #define NETEM_DIST_SCALE	8192
+ 
++/* WRR section */
++
++/* Other includes */
++#include <linux/if_ether.h>
++
++// A sub weight and of a class
++// All numbers are represented as parts of (2^64-1).
++struct tc_wrr_class_weight {
++	__u64 val;	// Current value			(0 is not valid)
++	__u64 decr;	// Value pr bytes			(2^64-1 is not valid)
++	__u64 incr;	// Value pr seconds			(2^64-1 is not valid)
++	__u64 min;	// Minimal value			(0 is not valid)
++	__u64 max;	// Minimal value			(0 is not valid)
++
++// The time where the above information was correct:
++	time_t tim;
++};
++
++// Packet send when modifying a class:
++struct tc_wrr_class_modf {
++	// Not-valid values are ignored.
++	struct tc_wrr_class_weight weight1;
++	struct tc_wrr_class_weight weight2;
++};
++
++// Packet returned when quering a class:
++struct tc_wrr_class_stats {
++	char used;	// If this is false the information below is invalid
++
++	struct tc_wrr_class_modf class_modf;
++
++	unsigned char addr[ETH_ALEN];
++	char usemac;    // True if addr is a MAC address, else it is an IP address
++			// (this value is only for convience, it is always the same
++			//  value as in the qdisc)
++	int heappos;	// Current heap position or 0 if not in heap
++	__u64 penal_ls;	// Penalty value in heap (ls)
++	__u64 penal_ms;	// Penalty value in heap (ms)
++};
++
++// Qdisc-wide penalty information (boolean values - 2 not valid)
++struct tc_wrr_qdisc_weight {
++	char weight_mode;	// 0=No automatic change to weight
++				// 1=Decrease normally
++				// 2=Also multiply with number of machines
++				// 3=Instead multiply with priority divided
++				//   with priority of the other.
++				// -1=no change
++};
++
++// Packet send when modifing a qdisc:
++struct tc_wrr_qdisc_modf {
++	// Not-valid values are ignored:
++	struct tc_wrr_qdisc_weight weight1;
++	struct tc_wrr_qdisc_weight weight2;
++};
++
++// Packet send when creating a qdisc:
++struct tc_wrr_qdisc_crt {
++	struct tc_wrr_qdisc_modf qdisc_modf;
++
++	char srcaddr;	// 1=lookup source, 0=lookup destination
++	char usemac;	// 1=Classify on MAC addresses, 0=classify on IP
++	char usemasq;	// 1=Classify based on masqgrading - only valid
++			//   if usemac is zero
++	int bands_max;	// Maximal number of bands (i.e.: classes)
++	int proxy_maxconn;// If differnt from 0 then we support proxy remapping
++			// of packets. And this is the number of maximal
++			// concurrent proxy connections.
++};
++
++// Packet returned when quering a qdisc:
++struct tc_wrr_qdisc_stats {
++	struct tc_wrr_qdisc_crt qdisc_crt;
++	int proxy_curconn;
++	int nodes_in_heap;	// Current number of bands wanting to send something
++	int bands_cur;		// Current number of bands used (i.e.: MAC/IP addresses seen)
++	int bands_reused;	// Number of times this band has been reused.
++	int packets_requed;	// Number of times packets have been requeued.
++	__u64 priosum;		// Sum of priorities in heap where 1 is 2^32
++};
++
++struct tc_wrr_qdisc_modf_std {
++	// This indicates which of the tc_wrr_qdisc_modf structers this is:
++	char proxy; // 0=This struct
++
++	// Should we also change a class?
++	char change_class;
++
++	// Only valid if change_class is false
++	struct tc_wrr_qdisc_modf qdisc_modf;
++
++	// Only valid if change_class is true:
++	unsigned char addr[ETH_ALEN]; // Class to change (non-used bytes should be 0)
++	struct tc_wrr_class_modf class_modf; // The change
++};
++
++// Used for proxyrempping:
++struct tc_wrr_qdisc_modf_proxy {
++	// This indicates which of the tc_wrr_qdisc_modf structers this is:
++	char proxy;     // 1=This struct
++
++	// This is 1 if the proxyremap information should be reset
++	char reset;
++
++	// changec is the number of elements in changes.
++	int changec;
++
++	// This is an array of type ProxyRemapBlock:
++	long changes[0];
++};
++
+ #endif
+diff -urN iproute-20041019.orig/tc/Makefile iproute-20041019/tc/Makefile
+--- iproute-20041019.orig/tc/Makefile	2004-10-19 22:49:02.000000000 +0200
++++ iproute-20041019/tc/Makefile	2005-01-06 00:33:47.000000000 +0100
+@@ -10,6 +10,7 @@
+ TCMODULES += q_prio.o
+ TCMODULES += q_tbf.o
+ TCMODULES += q_cbq.o
++TCMODULES += q_wrr.o
+ TCMODULES += f_rsvp.o
+ TCMODULES += f_u32.o
+ TCMODULES += f_route.o
+diff -urN iproute-20041019.orig/tc/q_wrr.c iproute-20041019/tc/q_wrr.c
+--- iproute-20041019.orig/tc/q_wrr.c	1970-01-01 01:00:00.000000000 +0100
++++ iproute-20041019/tc/q_wrr.c	2005-01-06 00:34:06.000000000 +0100
+@@ -0,0 +1,322 @@
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <syslog.h>
++#include <fcntl.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <string.h>
++#include <math.h>
++
++#include "utils.h"
++#include "tc_util.h"
++
++#define usage() return(-1)
++
++// Returns -1 on error
++static int wrr_parse_qdisc_weight(int argc, char** argv, 
++                              struct tc_wrr_qdisc_modf* opt) {
++  int i;
++  
++  opt->weight1.weight_mode=-1;
++  opt->weight2.weight_mode=-1;
++  
++  for(i=0; i<argc; i++) {  
++    if(!memcmp(argv[i],"wmode1=",7)) {
++      opt->weight1.weight_mode=atoi(argv[i]+7);            
++    } else if(!memcmp(argv[i],"wmode2=",7)) {
++      opt->weight2.weight_mode=atoi(argv[i]+7);
++    } else {
++      printf("Usage: ... [wmode1=0|1|2|3] [wmode2=0|1|2|3]\n");
++      return -1;
++    }
++  }
++  return 0;
++}
++
++static int wrr_parse_class_modf(int argc, char** argv, 
++                                struct tc_wrr_class_modf* modf) {
++  int i;
++  
++  if(argc<1) {
++    fprintf(stderr, "Usage: ... [weight1=val] [decr1=val] [incr1=val] [min1=val] [max1=val] [val2=val] ...\n");
++    fprintf(stderr, "  The values can be floating point like 0.42 or divisions like 42/100\n");
++    return -1;
++  }
++  
++  // Set meaningless values:
++  modf->weight1.val=0;
++  modf->weight1.decr=(__u64)-1;
++  modf->weight1.incr=(__u64)-1;
++  modf->weight1.min=0;
++  modf->weight1.max=0;
++  modf->weight2.val=0;
++  modf->weight2.decr=(__u64)-1;
++  modf->weight2.incr=(__u64)-1;
++  modf->weight2.min=0;
++  modf->weight2.max=0;
++  
++  // And read values:
++  for(i=0; i<argc; i++) {
++    char arg[80];
++    char* name,*value1=0,*value2=0;
++    long double f_val1,f_val2=1,value;
++    if(strlen(argv[i])>=sizeof(arg)) {
++      fprintf(stderr,"Argument too long: %s\n",argv[i]);
++      return -1;
++    }
++    strcpy(arg,argv[i]);
++    
++    name=strtok(arg,"=");
++    if(name) value1=strtok(0,"/");
++    if(value1) value2=strtok(0,"");
++    
++    if(!value1) {
++      fprintf(stderr,"No = found in argument: %s\n",argv[i]);
++      return -1;
++    }
++    
++    f_val1=atof(value1);
++    if(value2) f_val2=atof(value2);    
++    
++    if(f_val2==0)  {
++      fprintf(stderr,"Division by 0\n");
++      return -1;
++    }
++        
++    value=f_val1/f_val2;    
++    if(value>1) value=1;
++    if(value<0) value=0;            
++    value*=((__u64)-1);
++    
++    // And find the value set
++    if(!strcmp(name,"weight1"))    modf->weight1.val=value;
++    else if(!strcmp(name,"decr1")) modf->weight1.decr=value;
++    else if(!strcmp(name,"incr1")) modf->weight1.incr=value;
++    else if(!strcmp(name,"min1"))  modf->weight1.min=value;
++    else if(!strcmp(name,"max1"))  modf->weight1.max=value;
++    else if(!strcmp(name,"weight2")) modf->weight2.val=value;
++    else if(!strcmp(name,"decr2")) modf->weight2.decr=value;
++    else if(!strcmp(name,"incr2")) modf->weight2.incr=value;
++    else if(!strcmp(name,"min2"))  modf->weight2.min=value;
++    else if(!strcmp(name,"max2"))  modf->weight2.max=value;
++    else {
++      fprintf(stderr,"illegal value: %s\n",name);
++      return -1;
++    }
++  }    
++
++  return 0;
++}
++
++static int wrr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++  if(n->nlmsg_flags & NLM_F_CREATE) {
++    // This is a create request:
++    struct tc_wrr_qdisc_crt opt;
++	
++    int sour,dest,ip,mac,masq;
++
++    if(argc<4) {
++      fprintf(stderr, "Usage: ... wrr sour|dest ip|masq|mac maxclasses proxymaxcon [penalty-setup]\n");
++      return -1;
++    }	  
++  
++    // Read sour/dest:
++    memset(&opt,0,sizeof(opt));
++    sour=!strcmp(argv[0],"sour");
++    dest=!strcmp(argv[0],"dest");	
++	
++    if(!sour && !dest) {
++      fprintf(stderr,"sour or dest must be specified\n");
++      return -1;
++    }	
++
++    // Read ip/mac
++    ip=!strcmp(argv[1],"ip");
++    mac=!strcmp(argv[1],"mac");	
++    masq=!strcmp(argv[1],"masq");	
++
++    if(!ip && !mac && !masq) {
++      fprintf(stderr,"ip, masq or mac must be specified\n");
++      return -1;
++    }	
++
++    opt.srcaddr=sour;		
++    opt.usemac=mac;
++    opt.usemasq=masq;		
++    opt.bands_max=atoi(argv[2]);
++    
++    opt.proxy_maxconn=atoi(argv[3]);
++    
++    // Read weights:
++    if(wrr_parse_qdisc_weight(argc-4,argv+4,&opt.qdisc_modf)<0) return -1;
++    if(opt.qdisc_modf.weight1.weight_mode==-1) opt.qdisc_modf.weight1.weight_mode=0;
++    if(opt.qdisc_modf.weight2.weight_mode==-1) opt.qdisc_modf.weight2.weight_mode=0;
++		
++    addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++  } else {
++    struct tc_wrr_qdisc_modf_std opt;
++    char qdisc,class;
++    
++    // This is a modify request:
++    if(argc<1) {
++      fprintf(stderr,"... qdisc ... or ... class ...\n");
++      return -1;
++    }
++            
++    qdisc=!strcmp(argv[0],"qdisc");
++    class=!strcmp(argv[0],"class");
++
++    if(!qdisc && !class) {
++      fprintf(stderr,"qdisc or class must be specified\n");
++      return -1;
++    }
++      
++    argc--;
++    argv++;
++      
++    opt.proxy=0;
++    
++    if(qdisc) {
++      opt.change_class=0;
++      if(wrr_parse_qdisc_weight(argc, argv, &opt.qdisc_modf)<0) return -1;
++    } else {
++      int a0,a1,a2,a3,a4=0,a5=0;      
++
++      opt.change_class=1;
++      
++      if(argc<1) {
++        fprintf(stderr,"... <mac>|<ip>|<masq> ...\n");
++        return -1;
++      }
++      memset(opt.addr,0,sizeof(opt.addr));
++
++      if((sscanf(argv[0],"%i.%i.%i.%i",&a0,&a1,&a2,&a3)!=4) &&
++         (sscanf(argv[0],"%x:%x:%x:%x:%x:%x",&a0,&a1,&a2,&a3,&a4,&a5)!=6)) {
++	fprintf(stderr,"Wrong format of mac or ip address\n");
++	return -1;
++      }
++      
++      opt.addr[0]=a0; opt.addr[1]=a1; opt.addr[2]=a2;
++      opt.addr[3]=a3; opt.addr[4]=a4; opt.addr[5]=a5;
++
++      if(wrr_parse_class_modf(argc-1, argv+1, &opt.class_modf)<0) return -1;
++    }  
++  
++    addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++  }
++  return 0;
++}
++
++static int wrr_parse_copt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) {
++  struct tc_wrr_class_modf opt;
++  
++  memset(&opt,0,sizeof(opt));
++  if(wrr_parse_class_modf(argc,argv,&opt)<0) return -1;
++  
++  addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++  return 0;  
++}  
++
++static int wrr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++	struct tc_wrr_qdisc_stats *qopt;
++
++	if (opt == NULL)
++		return 0;
++
++	if (RTA_PAYLOAD(opt)  < sizeof(*qopt))
++		return -1;
++	qopt = RTA_DATA(opt);
++	
++	fprintf(f,"\n  (%s/%s) (maxclasses %i) (usedclasses %i) (reused classes %i)\n",
++	  qopt->qdisc_crt.srcaddr ? "sour" : "dest",
++	  qopt->qdisc_crt.usemac  ? "mac"  : (qopt->qdisc_crt.usemasq ? "masq" : "ip"),	  
++	  qopt->qdisc_crt.bands_max,	  	  	  
++	  qopt->bands_cur,
++	  qopt->bands_reused
++	  );
++	  
++	if(qopt->qdisc_crt.proxy_maxconn) {
++	  fprintf(f,"  (proxy maxcon %i) (proxy curcon %i)\n",
++	    qopt->qdisc_crt.proxy_maxconn,qopt->proxy_curconn);
++	}
++	
++	fprintf(f,"  (waiting classes %i) (packets requeued %i) (priosum: %Lg)\n",
++	  qopt->nodes_in_heap,
++	  qopt->packets_requed,
++	  qopt->priosum/((long double)((__u32)-1))
++	  );
++
++	fprintf(f,"  (wmode1 %i) (wmode2 %i) \n",
++	  qopt->qdisc_crt.qdisc_modf.weight1.weight_mode,
++	  qopt->qdisc_crt.qdisc_modf.weight2.weight_mode);
++	  
++	return 0;
++}
++
++static int wrr_print_copt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) {
++  struct tc_wrr_class_stats *copt;
++  long double d=(__u64)-1;
++
++  if (opt == NULL) return 0;
++
++  if (RTA_PAYLOAD(opt)  < sizeof(*copt))
++    return -1;
++  copt = RTA_DATA(opt);
++
++  if(!copt->used) {
++    fprintf(f,"(unused)");
++    return 0;
++  }
++  
++  if(copt->usemac) {
++    fprintf(f,"\n  (address: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X)\n",
++      copt->addr[0],copt->addr[1],copt->addr[2],
++      copt->addr[3],copt->addr[4],copt->addr[5]);
++  } else {     
++    fprintf(f,"\n  (address: %i.%i.%i.%i)\n",copt->addr[0],copt->addr[1],copt->addr[2],copt->addr[3]);
++  }    
++  
++  fprintf(f,"  (total weight: %Lg) (current position: %i) (counters: %u %u : %u %u)\n",
++    (copt->class_modf.weight1.val/d)*(copt->class_modf.weight2.val/d),
++    copt->heappos,
++    (unsigned)(copt->penal_ms>>32),
++    (unsigned)(copt->penal_ms & 0xffffffffU),
++    (unsigned)(copt->penal_ls>>32),
++    (unsigned)(copt->penal_ls & 0xffffffffU)
++    );
++    
++  fprintf(f,"  Pars 1: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)\n",
++    copt->class_modf.weight1.val/d,
++    copt->class_modf.weight1.decr/d,
++    copt->class_modf.weight1.incr/d,
++    copt->class_modf.weight1.min/d,
++    copt->class_modf.weight1.max/d);
++
++  fprintf(f,"  Pars 2: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)",
++    copt->class_modf.weight2.val/d,
++    copt->class_modf.weight2.decr/d,
++    copt->class_modf.weight2.incr/d,
++    copt->class_modf.weight2.min/d,
++    copt->class_modf.weight2.max/d);
++  
++  return 0;
++}
++
++static int wrr_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++{
++	return 0;
++}
++
++
++struct qdisc_util wrr_qdisc_util = {
++	.id = "wrr",
++	.parse_qopt = wrr_parse_opt,
++	.print_qopt = wrr_print_opt,
++	.print_xstats = wrr_print_xstats,
++	.parse_copt = wrr_parse_copt,
++	.print_copt = wrr_print_copt
++};
+

--- /dev/null
+++ b/package/iproute2/patches/iproute2-ipxfrm_no_sctp.patch
@@ -1,1 +1,19 @@
+--- iproute2-2.6.9.old/ip/ipxfrm.c	2005-01-30 19:09:32.000000000 +0100
++++ iproute2-2.6.9/ip/ipxfrm.c	2005-01-30 19:10:31.000000000 +0100
+@@ -392,7 +392,6 @@
+ 	switch (sel->proto) {
+ 	case IPPROTO_TCP:
+ 	case IPPROTO_UDP:
+-	case IPPROTO_SCTP:
+ 	default: /* XXX */
+ 		if (sel->sport_mask)
+ 			fprintf(fp, "sport %u ", ntohs(sel->sport));
+@@ -787,7 +786,6 @@
+ 		switch (sel->proto) {
+ 		case IPPROTO_TCP:
+ 		case IPPROTO_UDP:
+-		case IPPROTO_SCTP:
+ 			break;
+ 		default:
+ 			fprintf(stderr, "\"sport\" and \"dport\" are invalid with proto=%s\n", strxf_proto(sel->proto));
 

--- /dev/null
+++ b/package/iproute2/patches/iproute2-tc-make-fix.patch
@@ -1,1 +1,12 @@
+--- iproute-2.6.9.old/tc/Makefile	2005-01-30 18:53:59.000000000 +0100
++++ iproute-2.6.9/tc/Makefile	2005-01-30 18:54:07.000000000 +0100
+@@ -52,7 +52,7 @@
+ 	./$* >$@
+ 	rm $*
+ 
+-all: libtc.a tc $(TCSO) $(NETEM_DIST)
++all: libtc.a tc $(TCSO)
+ 
+ tc: $(TCOBJ) $(LIBNETLINK) $(LIBUTIL) $(TCLIB)
+ 
 

--- /dev/null
+++ b/package/iproute2/tc.control
@@ -1,1 +1,10 @@
+Package: tc
+Architecture: mipsel
+Version: 2.6.9
+Section: net
+Priority: optional
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: iproute2 traffic control utility
+Depends: kmod-sched
 

--- a/package/iptables/Config.in
+++ b/package/iptables/Config.in
@@ -1,8 +1,25 @@
 config BR2_PACKAGE_IPTABLES
-	bool "iptables"
+	tristate "iptables"
 	default y
 	help
 	  Linux kernel (2.4+) firewall, NAT, and packet mangling tools.
 
 	  http://www.iptables.org/
 
+config BR2_PACKAGE_IPTABLES_EXTRA
+	tristate "extra modules"
+	default m
+	depends BR2_PACKAGE_IPTABLES
+	help
+	  Extra modules for iptables (kernel and user space)
+
+config BR2_PACKAGE_IP6TABLES
+	tristate "ip6tables"
+	default m
+	depends BR2_PACKAGE_IPTABLES
+	select BR2_PACKAGE_KMOD_IPV6
+	help
+	  IPv6 firewalling
+
+
+

--- /dev/null
+++ b/package/iptables/Makefile
@@ -1,1 +1,98 @@
+include $(TOPDIR)/rules.mk
+include kernelconfig.mk
 
+PKG_NAME := iptables
+PKG_VERSION := 1.2.11
+PKG_RELEASE := 1
+
+PKG_SOURCE_SITE := http://www.netfilter.org/files
+PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE_CAT := bzcat
+PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION)
+
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR)
+
+PKG_IPT := $(PACKAGE_DIR)/iptables_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IPT_EXTRA := $(PACKAGE_DIR)/iptables-extra_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IP6T := $(PACKAGE_DIR)/ip6tables_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+
+I_IPT := $(PKG_BUILD_DIR)/ipkg/iptables
+I_IPT_EXTRA := $(PKG_BUILD_DIR)/ipkg/iptables-extra
+I_IP6T := $(PKG_BUILD_DIR)/ipkg/ip6tables
+
+TARGETS := $(PKG_IPT)
+ifneq ($(BR2_PACKAGE_IPTABLES_EXTRA),)
+TARGETS += $(PKG_IPT_EXTRA)
+endif
+ifneq ($(BR2_PACKAGE_IP6TABLES),)
+TARGETS += $(PKG_IP6T)
+endif
+
+$(DL_DIR)/$(PKG_SOURCE_FILE):
+	mkdir -p $(DL_DIR)
+	$(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE)
+
+$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE)
+	mkdir -p $(PKG_BUILD_DIR)/modules
+	$(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	$(PATCH) $(PKG_BUILD_DIR) ./patches
+	touch $(PKG_BUILD_DIR)/.patched
+
+$(PKG_BUILD_DIR)/iptables: $(PKG_BUILD_DIR)/.patched
+	$(TARGET_CONFIGURE_OPTS) \
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+		KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \
+		CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)"
+
+$(PKG_IPT): $(PKG_BUILD_DIR)/iptables
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(I_IPT) control/iptables.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) 
+	mkdir -p $(I_IPT)/usr/sbin
+	cp -af $(PKG_BUILD_DIR)/iptables $(I_IPT)/usr/sbin/
+	$(STRIP) $(I_IPT)/usr/sbin/iptables
+	mkdir -p $(I_IPT)/usr/lib/iptables
+	(cd $(PKG_BUILD_DIR)/extensions; \
+	 cp $(patsubst %,libipt_%.so,$(ext-y)) $(I_IPT)/usr/lib/iptables)
+	-$(STRIP) $(I_IPT)/usr/lib/iptables/*.so
+	mkdir -p $(I_IPT_EXTRA)/$(MODULES_SUBDIR)
+	cp $(MODULES_DIR)/kernel/net/ipv6/netfilter/*.o $(I_IPT_EXTRA)/$(MODULES_SUBDIR)
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(I_IPT) $(PACKAGE_DIR)
+
+$(PKG_IPT_EXTRA): $(PKG_BUILD_DIR)/iptables
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(I_IPT_EXTRA) control/iptables-extra.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) 
+	mkdir -p $(I_IPT_EXTRA)/usr/lib/iptables
+	(cd $(PKG_BUILD_DIR)/extensions; \
+	 cp $(patsubst %,libipt_%.so,$(ext-m)) $(I_IPT_EXTRA)/usr/lib/iptables)
+	-$(STRIP) $(I_IPT_EXTRA)/usr/lib/iptables/*.so
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(I_IPT_EXTRA) $(PACKAGE_DIR)
+
+$(PKG_IP6T): $(PKG_BUILD_DIR)/iptables
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(I_IP6T) control/ip6tables.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH) 
+	mkdir -p $(I_IP6T)/usr/sbin
+	cp -af $(PKG_BUILD_DIR)/ip6tables $(I_IP6T)/usr/sbin/
+	$(STRIP) $(I_IP6T)/usr/sbin/ip6tables
+	mkdir -p $(I_IP6T)/usr/lib/iptables
+	(cd $(PKG_BUILD_DIR)/extensions; \
+	 cp libip6t_*.so $(I_IP6T)/usr/lib/iptables)
+	-$(STRIP) $(I_IP6T)/usr/lib/iptables/*.so
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(I_IP6T) $(PACKAGE_DIR)
+
+
+source: $(DL_DIR)/$(PKG_SOURCE_FILE)
+prepare: $(PKG_BUILD_DIR)/.patched
+compile: $(TARGETS)
+install: compile
+	$(IPKG) install $(PKG_IPT)
+ifeq ($(BR2_PACKAGE_IPTABLES_EXTRA),y)
+	$(IPKG) install $(PKG_IPT_EXTRA)
+endif
+ifeq ($(BR2_PACKAGE_IP6TABLES),y)
+	$(IPKG) install $(PKG_IP6T)
+endif
+
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+	rm -f $(PKG_IPT) 
+

--- /dev/null
+++ b/package/iptables/control/ip6tables.control
@@ -1,1 +1,10 @@
+Package: ip6tables
+Priority: optional
+Depends: kmod-ipv6
+Section: net
+Version: 1.2.11-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: The netfilter firewalling software for IPv6
 

--- /dev/null
+++ b/package/iptables/control/iptables-extra.control
@@ -1,1 +1,10 @@
+Package: iptables-extra
+Priority: optional
+Section: net
+Version: 1.2.11-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Extra plugins for iptables
+Depends: kmod-iptables-extra
 

--- /dev/null
+++ b/package/iptables/control/iptables.control
@@ -1,1 +1,9 @@
+Package: iptables
+Priority: optional
+Section: net
+Version: 1.2.11-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: The netfilter firewalling software for IPv4
 

--- a/package/iptables/iptables.mk
+++ /dev/null
@@ -1,56 +1,1 @@
-#############################################################
-#
-# iptables
-#
-#############################################################
-IPTABLES_VER:=1.2.11
-IPTABLES_SOURCE_URL:=http://www.netfilter.org/files
-IPTABLES_SOURCE:=iptables-$(IPTABLES_VER).tar.bz2
-IPTABLES_BUILD_DIR:=$(BUILD_DIR)/iptables-$(IPTABLES_VER)
 
-$(DL_DIR)/$(IPTABLES_SOURCE):
-	 $(WGET) -P $(DL_DIR) $(IPTABLES_SOURCE_URL)/$(IPTABLES_SOURCE) 
-
-$(IPTABLES_BUILD_DIR)/.unpacked: $(DL_DIR)/$(IPTABLES_SOURCE)
-	bzcat $(DL_DIR)/$(IPTABLES_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-	touch $(IPTABLES_BUILD_DIR)/.unpacked
-
-$(IPTABLES_BUILD_DIR)/.configured: $(IPTABLES_BUILD_DIR)/.unpacked
-	# Allow patches.  Needed for openwrt for instance.
-	toolchain/patch-kernel.sh $(IPTABLES_BUILD_DIR) package/iptables/ iptables-\*.patch
-	#
-	# $(SED) "s;\[ -f /usr/include/netinet/ip6.h \];grep -q '__UCLIBC_HAS_IPV6__ 1' \
-	# 	$(BUILD_DIR)/uClibc/include/bits/uClibc_config.h;" $(IPTABLES_BUILD_DIR)/Makefile
-	touch  $(IPTABLES_BUILD_DIR)/.configured
-
-$(IPTABLES_BUILD_DIR)/iptables: $(IPTABLES_BUILD_DIR)/.configured
-	$(TARGET_CONFIGURE_OPTS) \
-	$(MAKE) -C $(IPTABLES_BUILD_DIR) \
-		KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \
-		CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)"
-
-$(TARGET_DIR)/usr/sbin/iptables: $(IPTABLES_BUILD_DIR)/iptables
-	$(TARGET_CONFIGURE_OPTS) \
-	$(MAKE) -C $(IPTABLES_BUILD_DIR) \
-		KERNEL_DIR=$(LINUX_DIR) PREFIX=/usr \
-		CC=$(TARGET_CC) COPT_FLAGS="$(TARGET_CFLAGS)" \
-		DESTDIR=$(TARGET_DIR) install
-	$(STRIP) $(TARGET_DIR)/usr/sbin/iptables*
-	$(STRIP) $(TARGET_DIR)/usr/lib/iptables/*.so
-	rm -rf $(TARGET_DIR)/usr/man
-
-iptables: kernel-headers $(TARGET_DIR)/usr/sbin/iptables
-
-iptables-source: $(DL_DIR)/$(IPTABLES_SOURCE)
-
-iptables-clean:
-	$(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(IPTABLES_BUILD_DIR) uninstall
-	-$(MAKE) -C $(IPTABLES_BUILD_DIR) clean
-
-iptables-dirclean:
-	rm -rf $(IPTABLES_BUILD_DIR)
-
-ifeq ($(strip $(BR2_PACKAGE_IPTABLES)),y)
-TARGETS+=iptables
-endif
-

--- /dev/null
+++ b/package/iptables/kernelconfig.mk
@@ -1,1 +1,36 @@
+include $(LINUX_DIR)/.config
 
+# translate linux kernel config to filenames
+ext-$(CONFIG_IP_NF_MATCH_LIMIT) += limit
+ext-$(CONFIG_IP_NF_MATCH_MAC) += mac
+ext-$(CONFIG_IP_NF_MATCH_PKTTYPE) += pkttype
+ext-$(CONFIG_IP_NF_MATCH_MARK) += mark
+ext-$(CONFIG_IP_NF_MATCH_MULTIPORT) += multiport
+ext-$(CONFIG_IP_NF_MATCH_TOS) += tos
+ext-$(CONFIG_IP_NF_MATCH_RECENT) += recent
+ext-$(CONFIG_IP_NF_MATCH_ECN) += ecn
+ext-$(CONFIG_IP_NF_MATCH_IPP2P) += ipp2p
+ext-$(CONFIG_IP_NF_MATCH_DSCP) += dscp
+ext-$(CONFIG_IP_NF_MATCH_AH_ESP) += ah esp
+ext-$(CONFIG_IP_NF_MATCH_LENGTH) += length
+ext-$(CONFIG_IP_NF_MATCH_TTL) += ttl
+ext-$(CONFIG_IP_NF_MATCH_TCPMSS) += tcpmss
+ext-$(CONFIG_IP_NF_MATCH_HELPER) += helper
+ext-$(CONFIG_IP_NF_MATCH_STATE) += state
+ext-$(CONFIG_IP_NF_MATCH_CONNTRACK) += conntrack
+ext-$(CONFIG_IP_NF_MATCH_UNCLEAN) += unclean
+ext-$(CONFIG_IP_NF_MATCH_OWNER) += owner
+ext-$(CONFIG_IP_NF_MATCH_PHYSDEV) += physdev
+ext-$(CONFIG_IP_NF_TARGET_MASQUERADE) += MASQUERADE
+ext-$(CONFIG_IP_NF_TARGET_REDIRECT) += REDIRECT
+ext-$(CONFIG_IP_NF_TARGET_TOS) += TOS
+ext-$(CONFIG_IP_NF_TARGET_ECN) += ECN
+ext-$(CONFIG_IP_NF_TARGET_DSCP) += DSCP
+ext-$(CONFIG_IP_NF_TARGET_MARK) += MARK
+ext-$(CONFIG_IP_NF_TARGET_LOG) += LOG
+ext-$(CONFIG_IP_NF_TARGET_ULOG) += ULOG
+ext-$(CONFIG_IP_NF_TARGET_TCPMSS) += TCPMSS
+
+
+
+

--- /dev/null
+++ b/package/iptables/patches/ipp2p-0.7.1.patch
@@ -1,1 +1,539 @@
+diff -urN iptables-1.2.11.old/extensions/libipt_ipp2p.c iptables-1.2.11/extensions/libipt_ipp2p.c
+--- iptables-1.2.11.old/extensions/libipt_ipp2p.c	1970-01-01 01:00:00.000000000 +0100
++++ iptables-1.2.11/extensions/libipt_ipp2p.c	2005-03-01 17:49:59.000000000 +0100
+@@ -0,0 +1,482 @@
++
++#include <stdio.h>
++#include <netdb.h>
++#include <string.h>
++#include <stdlib.h>
++#include <getopt.h>
++#include <ctype.h>
++
++#include <iptables.h>
++
++#include <linux/netfilter_ipv4/ipt_ipp2p.h>
++
++
++
++
++static void
++help(void)
++{
++    printf(
++    "IPP2P v%s options:\n"
++    " --ipp2p	Grab all known p2p packets\n"
++    " --ipp2p-data	Identify all known p2p download commands (obsolete)\n\n"
++    " --edk		[TCP&UDP]	All known eDonkey/eMule/Overnet packets\n"
++    " --dc		[TCP] 		All known Direct Connect packets\n"
++    " --kazaa	[TCP&UDP] 	All known KaZaA packets\n"
++    " --gnu		[TCP&UDP]	All known Gnutella packets\n"
++    " --bit		[TCP&UDP]	All known BitTorrent packets\n"
++    " --apple	[TCP] 		All known AppleJuice packets (beta - just a few tests until now)\n"
++    " --winmx	[TCP] 		All known WinMX (beta - need feedback)\n"
++    " --soul		[TCP] 		All known SoulSeek (beta - need feedback!)\n"
++    " --ares		[TCP] 		All known Ares - use with DROP only (beta - need feedback!)\n\n"
++    " --edk-data	[TCP] 		eDonkey/eMule/Overnet download commands (obsolete)\n"
++    " --dc-data	[TCP] 		Direct Connect download command (obsolete)\n"
++    " --kazaa-data	[TCP] 		KaZaA download command (obsolete)\n"
++    " --gnu-data	[TCP] 		Gnutella download command (obsolete)\n"
++    "\nNote that the follwing options will have the same meaning:\n"
++    " '--ipp2p' is equal to '--edk --dc --kazaa --gnu'\n"
++    " '--ipp2p-data' is equal to '--edk-data --dc-data --kazaa-data --gnu-data'\n"
++    "\nIPP2P was intended for TCP only. Due to increasing usage of UDP we needed to change this:\n"
++    " --udp		search UDP packets only\n"
++    " --tcp		search TCP packets only\n"
++    " --udp --tcp	search UDP and TCP packets\n"
++    "\nSee README included with this package for more details or visit http://www.ipp2p.org\n"
++    "\nExamples:\n"
++    " iptables -A FORWARD -m ipp2p --ipp2p -j MARK --set-mark 0x01\n"
++    " iptables -A FORWARD -m ipp2p --udp --kazaa --bit -j DROP\n"
++    " iptables -A FORWARD -m ipp2p --tcp --edk --soul -j DROP\n\n"
++    , IPP2P_VERSION);
++}
++
++							    
++
++static struct option opts[] = {
++        { "ipp2p", 0, 0, '1' },
++        { "edk", 0, 0, '2' },	
++        { "ipp2p-data", 0, 0, '3' },		
++        { "kazaa-data", 0, 0, '4' },
++        { "edk-data", 0, 0, '5' },	
++        { "dc-data", 0, 0, '6' },
++	{ "dc", 0, 0, '7' },
++	{ "gnu-data", 0, 0, '8' },	
++	{ "gnu", 0, 0, '9' },
++	{ "kazaa", 0, 0, 'a' },
++	{ "bit", 0, 0, 'b' },
++	{ "apple", 0, 0, 'c' },	
++	{ "soul", 0, 0, 'd' },	
++	{ "winmx", 0, 0, 'e' },	
++	{ "ares", 0, 0, 'f' },
++	{ "debug", 0, 0, 'g' },
++	{ "udp", 0, 0, 'h' },
++	{ "tcp", 0, 0, 'i' },
++        {0}
++};
++
++	
++
++static void
++init(struct ipt_entry_match *m, unsigned int *nfcache)
++{
++    struct ipt_p2p_info *info = (struct ipt_p2p_info *)m->data;
++
++    *nfcache |= NFC_UNKNOWN;
++
++    /*init the module with default values*/
++    info->cmd = 0;
++    info->debug = 0;
++    info->proto = IPP2P_PROTO_DEFAULT;
++
++}
++	
++
++static int
++parse(int c, char **argv, int invert, unsigned int *flags,
++	const struct ipt_entry *entry,
++	unsigned int *nfcache,
++	struct ipt_entry_match **match)
++{
++    struct ipt_p2p_info *info = (struct ipt_p2p_info *)(*match)->data;
++    
++    switch (c) {
++	case '1':		/*cmd: ipp2p*/
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified once!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++	    if ((*flags) != 0)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++	    *flags += SHORT_HAND_IPP2P;
++	    info->cmd = *flags;
++	    break;
++	    
++	case '2':		/*cmd: edk*/
++	    if ((*flags & IPP2P_EDK) == IPP2P_EDK)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--edk' may only be "
++				"specified once");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_DATA_EDK) == IPP2P_DATA_EDK)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--edk' OR `--edk-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++	    *flags += IPP2P_EDK;
++	    info->cmd = *flags;	    
++	    break;
++
++	case '3':		/*cmd: ipp2p-data*/
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified once!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if ((*flags) != 0)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++	    *flags += SHORT_HAND_DATA;
++	    info->cmd = *flags;	    
++	    break;
++
++        case '4':		/*cmd: kazaa-data*/
++            if ((*flags & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--kazaa-data' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_KAZAA) == IPP2P_KAZAA)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--kazaa' OR `--kazaa-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_DATA_KAZAA;
++	    info->cmd = *flags;
++	    break;
++
++	case '5':		/*cmd: edk-data*/
++            if ((*flags & IPP2P_DATA_EDK) == IPP2P_DATA_EDK)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--edk-data' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_EDK) == IPP2P_EDK)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--edk' OR `--edk-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_DATA_EDK;
++	    info->cmd = *flags;
++	    break;																											
++
++	case '6':		/*cmd: dc-data*/
++            if ((*flags & IPP2P_DATA_DC) == IPP2P_DATA_DC)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--dc-data' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_DC) == IPP2P_DC)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--dc' OR `--dc-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_DATA_DC;
++	    info->cmd = *flags;
++	    break;																											
++
++	case '7':		/*cmd: dc*/
++            if ((*flags & IPP2P_DC) == IPP2P_DC)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--dc' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_DATA_DC) == IPP2P_DATA_DC)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--dc' OR `--dc-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_DC;
++	    info->cmd = *flags;
++	    break;																											
++
++
++	case '8':		/*cmd: gnu-data*/
++            if ((*flags & IPP2P_DATA_GNU) == IPP2P_DATA_GNU)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--gnu-data' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_GNU) == IPP2P_GNU)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--gnu' OR `--gnu-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_DATA_GNU;
++	    info->cmd = *flags;
++	    break;																											
++
++	case '9':		/*cmd: gnu*/
++            if ((*flags & IPP2P_GNU) == IPP2P_GNU)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--gnu' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_DATA_GNU) == IPP2P_DATA_GNU)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--gnu' OR `--gnu-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_GNU;
++	    info->cmd = *flags;
++	    break;																											
++
++	case 'a':		/*cmd: kazaa*/
++            if ((*flags & IPP2P_KAZAA) == IPP2P_KAZAA)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--kazaa' may only be "
++                                "specified once!");
++	    if ((*flags & SHORT_HAND_DATA) == SHORT_HAND_DATA)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p-data' may only be "
++				"specified alone!");
++	    if ((*flags & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P)
++		    exit_error(PARAMETER_PROBLEM,
++				"ipp2p: `--ipp2p' may only be "
++				"specified alone!");
++            if ((*flags & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: use `--kazaa' OR `--kazaa-data' but not both of them!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_KAZAA;
++	    info->cmd = *flags;
++	    break;																											
++
++	case 'b':		/*cmd: bit*/
++            if ((*flags & IPP2P_BIT) == IPP2P_BIT)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--bit' may only be "
++                                "specified once!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_BIT;
++	    info->cmd = *flags;
++	    break;																											
++
++	case 'c':		/*cmd: apple*/
++            if ((*flags & IPP2P_APPLE) == IPP2P_APPLE)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--apple' may only be "
++                                "specified once!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_APPLE;
++	    info->cmd = *flags;
++	    break;																											
++
++
++	case 'd':		/*cmd: soul*/
++            if ((*flags & IPP2P_SOUL) == IPP2P_SOUL)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--soul' may only be "
++                                "specified once!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_SOUL;
++	    info->cmd = *flags;
++	    break;																											
++
++
++	case 'e':		/*cmd: winmx*/
++            if ((*flags & IPP2P_WINMX) == IPP2P_WINMX)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--winmx' may only be "
++                                "specified once!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_WINMX;
++	    info->cmd = *flags;
++	    break;																											
++
++	case 'f':		/*cmd: ares*/
++            if ((*flags & IPP2P_ARES) == IPP2P_ARES)
++            exit_error(PARAMETER_PROBLEM,
++                                "ipp2p: `--ares' may only be "
++                                "specified once!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++            *flags += IPP2P_ARES;
++	    info->cmd = *flags;
++	    break;																											
++
++	case 'g':		/*cmd: debug*/
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++	    info->debug = 1;
++	    break;																											
++
++	case 'h':		/*cmd: udp*/
++	    if ((info->proto & IPP2P_PROTO_UDP) == IPP2P_PROTO_UDP)
++		exit_error(PARAMETER_PROBLEM,
++                    "ipp2p: --udp may only be specified once!");
++
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++	    info->proto += IPP2P_PROTO_UDP;
++	    break;																											
++
++
++	case 'i':		/*cmd: tcp*/
++	    if ((info->proto & IPP2P_PROTO_TCP) == IPP2P_PROTO_TCP)
++		exit_error(PARAMETER_PROBLEM,
++                    "ipp2p: --tcp may only be specified once!");
++	    if (invert) exit_error(PARAMETER_PROBLEM, "ipp2p: invert [!] is not allowed!");
++	    info->proto += IPP2P_PROTO_TCP;
++	    break;																											
++
++
++	default:
++            exit_error(PARAMETER_PROBLEM,
++	    "\nipp2p-parameter problem: for ipp2p usage type: iptables -m ipp2p --help\n");
++	    return 0;
++    }
++    return 1;
++}
++
++
++static void
++final_check(unsigned int flags)
++{
++    if (!flags)
++            exit_error(PARAMETER_PROBLEM,
++	    "\nipp2p-parameter problem: for ipp2p usage type: iptables -m ipp2p --help\n");
++}
++
++
++
++static void
++print(const struct ipt_ip *ip,
++        const struct ipt_entry_match *match,
++	int numeric)
++{
++    struct ipt_p2p_info *info = (struct ipt_p2p_info *)match->data;
++    
++    printf("ipp2p v%s", IPP2P_VERSION);
++    if ((info->cmd & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) printf(" --ipp2p");
++    if ((info->cmd & SHORT_HAND_DATA) == SHORT_HAND_DATA) printf(" --ipp2p-data");
++    if ((info->cmd & IPP2P_KAZAA) == IPP2P_KAZAA) printf(" --kazaa");
++    if ((info->cmd & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA) printf(" --kazaa-data");
++    if ((info->cmd & IPP2P_DATA_GNU) == IPP2P_DATA_GNU) printf(" --gnu-data");
++    if ((info->cmd & IPP2P_GNU) == IPP2P_GNU) printf(" --gnu");
++    if ((info->cmd & IPP2P_EDK) == IPP2P_EDK) printf(" --edk");
++    if ((info->cmd & IPP2P_DATA_EDK) == IPP2P_DATA_EDK) printf(" --edk-data");
++    if ((info->cmd & IPP2P_DATA_DC) == IPP2P_DATA_DC) printf(" --dc-data");
++    if ((info->cmd & IPP2P_DC) == IPP2P_DC) printf(" --dc");
++    if ((info->cmd & IPP2P_BIT) == IPP2P_BIT) printf(" --bit");
++    if ((info->cmd & IPP2P_APPLE) == IPP2P_APPLE) printf(" --apple");
++    if ((info->cmd & IPP2P_SOUL) == IPP2P_SOUL) printf(" --soul");
++    if ((info->cmd & IPP2P_WINMX) == IPP2P_WINMX) printf(" --winmx");
++    if ((info->cmd & IPP2P_ARES) == IPP2P_ARES) printf(" --ares");
++    if ((info->proto & IPP2P_PROTO_UDP) == IPP2P_PROTO_UDP) printf(" --udp");
++    if ((info->proto & IPP2P_PROTO_TCP) == IPP2P_PROTO_TCP) printf(" --tcp");
++    if (info->debug != 0) printf(" --debug");
++    printf(" ");
++}
++			    						   
++
++
++static void
++save(const struct ipt_ip *ip, const struct ipt_entry_match *match)
++{
++    struct ipt_p2p_info *info = (struct ipt_p2p_info *)match->data;
++    
++    if ((info->cmd & SHORT_HAND_IPP2P) == SHORT_HAND_IPP2P) printf("--ipp2p ");
++    if ((info->cmd & SHORT_HAND_DATA) == SHORT_HAND_DATA) printf("--ipp2p-data ");
++    if ((info->cmd & IPP2P_KAZAA) == IPP2P_KAZAA) printf("--kazaa ");
++    if ((info->cmd & IPP2P_DATA_KAZAA) == IPP2P_DATA_KAZAA) printf("--kazaa-data ");
++    if ((info->cmd & IPP2P_DATA_GNU) == IPP2P_DATA_GNU) printf("--gnu-data ");
++    if ((info->cmd & IPP2P_GNU) == IPP2P_GNU) printf("--gnu ");
++    if ((info->cmd & IPP2P_EDK) == IPP2P_EDK) printf("--edk ");
++    if ((info->cmd & IPP2P_DATA_EDK) == IPP2P_DATA_EDK) printf("--edk-data ");
++    if ((info->cmd & IPP2P_DATA_DC) == IPP2P_DATA_DC) printf("--dc-data ");
++    if ((info->cmd & IPP2P_DC) == IPP2P_DC) printf("--dc ");
++    if ((info->cmd & IPP2P_BIT) == IPP2P_BIT) printf("--bit ");
++    if ((info->cmd & IPP2P_APPLE) == IPP2P_APPLE) printf("--apple ");
++    if ((info->cmd & IPP2P_SOUL) == IPP2P_SOUL) printf("--soul ");
++    if ((info->cmd & IPP2P_WINMX) == IPP2P_WINMX) printf("--winmx ");
++    if ((info->cmd & IPP2P_ARES) == IPP2P_ARES) printf("--ares ");
++    if ((info->proto & IPP2P_PROTO_UDP) == IPP2P_PROTO_UDP) printf("--udp ");
++    if ((info->proto & IPP2P_PROTO_TCP) == IPP2P_PROTO_TCP) printf("--tcp ");
++    if (info->debug != 0) printf("--debug ");
++}
++
++		
++
++
++static
++struct iptables_match ipp2p
++= { NULL,
++    "ipp2p",
++    IPTABLES_VERSION, 
++    IPT_ALIGN(sizeof(struct ipt_p2p_info)),
++    IPT_ALIGN(sizeof(struct ipt_p2p_info)),
++    &help,
++    &init,
++    &parse,
++    &final_check,
++    &print,
++    &save,
++    opts
++};
++					    
++
++
++void _init(void)
++{
++    register_match(&ipp2p);
++}
++
+diff -urN iptables-1.2.11.old/extensions/Makefile iptables-1.2.11/extensions/Makefile
+--- iptables-1.2.11.old/extensions/Makefile	2004-06-17 12:22:54.000000000 +0200
++++ iptables-1.2.11/extensions/Makefile	2005-03-01 17:51:19.000000000 +0100
+@@ -8,6 +8,10 @@
+ PF_EXT_SLIB:=ah connlimit connmark conntrack dscp ecn esp helper icmp iprange length limit mac mark multiport owner physdev pkttype realm rpc sctp standard state tcp tcpmss tos ttl udp unclean CLASSIFY CONNMARK DNAT DSCP ECN LOG MARK MASQUERADE MIRROR NETMAP NOTRACK REDIRECT REJECT SAME SNAT TARPIT TCPMSS TOS TRACE TTL ULOG
+ PF6_EXT_SLIB:=eui64 hl icmpv6 length limit mac mark multiport owner standard tcp udp HL LOG MARK TRACE
+ 
++
++# ipp2p
++PF_EXT_SLIB += ipp2p
++
+ # Optionals
+ PF_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T)))
+ PF6_EXT_SLIB_OPTS:=$(foreach T,$(wildcard extensions/.*-test6),$(shell KERNEL_DIR=$(KERNEL_DIR) $(T)))
+diff -urN iptables-1.2.11.old/include/linux/netfilter_ipv4/ipt_ipp2p.h iptables-1.2.11/include/linux/netfilter_ipv4/ipt_ipp2p.h
+--- iptables-1.2.11.old/include/linux/netfilter_ipv4/ipt_ipp2p.h	1970-01-01 01:00:00.000000000 +0100
++++ iptables-1.2.11/include/linux/netfilter_ipv4/ipt_ipp2p.h	2005-03-01 17:48:03.000000000 +0100
+@@ -0,0 +1,34 @@
++#ifndef __IPT_IPP2P_H
++#define __IPT_IPP2P_H
++#define IPP2P_VERSION "0.7.1"
++
++struct ipt_p2p_info {
++    int cmd;
++    int debug;
++    int proto;
++};
++
++#endif //__IPT_IPP2P_H
++
++#define SHORT_HAND_IPP2P	1 /* --ipp2p switch*/
++#define SHORT_HAND_DATA		4 /* --ipp2p-data switch*/
++#define SHORT_HAND_NONE		5 /* no short hand*/
++
++#define IPP2P_EDK		2
++#define IPP2P_DATA_KAZAA	8
++#define IPP2P_DATA_EDK		16
++#define IPP2P_DATA_DC		32
++#define IPP2P_DC		64
++#define IPP2P_DATA_GNU		128
++#define IPP2P_GNU		256
++#define IPP2P_KAZAA		512
++#define IPP2P_BIT		1024
++#define IPP2P_APPLE		2048
++#define IPP2P_SOUL		4096
++#define IPP2P_WINMX		8192
++#define IPP2P_ARES		16384
++
++#define IPP2P_PROTO_DEFAULT	1
++#define IPP2P_PROTO_UDP		2
++#define IPP2P_PROTO_TCP		4
++
 

--- /dev/null
+++ b/package/linksys-utils/Config.in
@@ -1,1 +1,6 @@
+config BR2_PACKAGE_LINKSYS_UTILS
+	tristate "Linksys binary utilites"
+	default y
+	help
+	  Binary-only utilities from Linksys (et, wl, nas)
 

--- /dev/null
+++ b/package/linksys-utils/Makefile
@@ -1,1 +1,44 @@
+#############################################################
+#
+# ebtables
+#
+#############################################################
+include $(TOPDIR)/rules.mk
 
+PKG_NAME:=linksys-utils
+PKG_VERSION:=3.37.6
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=http://mywrt.sourceforge.net/files
+PKG_SOURCE:=linksys-utils-$(PKG_VERSION).tar.gz
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_CAT:=zcat
+PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg
+
+$(DL_DIR)/$(PKG_SOURCE):
+	 $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE)
+
+$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE)
+	$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	touch $(PKG_BUILD_DIR)/.unpacked
+
+$(PKG_IPK): $(PKG_BUILD_DIR)/.unpacked $(PACKAGE_DIR)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_IPK_DIR)/usr/sbin
+	cp $(PKG_BUILD_DIR)/et $(PKG_IPK_DIR)/usr/sbin/
+	cp $(PKG_BUILD_DIR)/nas $(PKG_IPK_DIR)/usr/sbin/
+	cp $(PKG_BUILD_DIR)/wl $(PKG_IPK_DIR)/usr/sbin/
+	$(STRIP) $(PKG_IPK_DIR)/usr/sbin/*
+	$(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
+	
+$(PACKAGE_DIR):
+	mkdir -p $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE)
+prepare: $(PKG_BUILD_DIR)/.unpacked
+compile: $(PKG_IPK)
+install:
+	$(IPKG) install $(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+

--- /dev/null
+++ b/package/linksys-utils/linksys-utils.control
@@ -1,1 +1,9 @@
+Package: linksys-utils
+Priority: optional
+Section: libs
+Version: 3.37.6-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Linksys binary utils (et, wl, nas)
 

--- a/package/linux/Config.in
+++ b/package/linux/Config.in
@@ -1,8 +1,64 @@
-config BR2_PACKAGE_LINUX
-	bool "linux"
-	default y
+config BR2_PACKAGE_KMOD_ARPT
+	tristate "ARP firewalling support"
+	default m
 	help
-	  The Linux kernel.
+	  Kernel modules for ARP firewalling
 
-	  http://www.kernel.org/
+config BR2_PACKAGE_KMOD_EBT
+	tristate "Ethernet Bridge firewalling support"
+	default m
+	help
+	  Kernel modules for bridge firewalling
 
+config BR2_PACKAGE_KMOD_IPT4
+	tristate "Extra modules for iptables"
+	default m
+	help
+	  Extra kernel modules for IPv4 firewalling
+
+config BR2_PACKAGE_KMOD_IPV6
+	tristate "IPv6 support"
+	default m
+	help
+	  Kernel modules for IPv6 protocol support
+	  
+config BR2_PACKAGE_KMOD_IPT6
+	tristate "Kernel modules for ip6tables"
+	default m
+	depends BR2_PACKAGE_KMOD_IPV6
+	help
+	  IPv6 firewalling support
+
+config BR2_PACKAGE_KMOD_USB
+	tristate "USB/SCSI support"
+	default m
+	help
+	  Kernel modules for USB/SCSI support
+	  Includes usb-storage and printer
+
+config BR2_PACKAGE_KMOD_CRYPTO
+	tristate "CryptoAPI modules"
+	default m
+	help
+	  Kernel modules for cryptographic algorithms
+
+config BR2_PACKAGE_KMOD_MPPE
+	tristate "PPP MPPE/MPPC module"
+	default m
+	select BR2_PACKAGE_KMOD_CRYPTO
+	help
+	  Support for Microsoft PPP Encryption/Compression
+
+config BR2_PACKAGE_KMOD_TUN
+	tristate "Universal TUN/TAP driver"
+	default m
+	help
+	  Kernel support for the TUN/TAP tunneling device
+	  
+config BR2_PACKAGE_KMOD_SCHED
+	tristate "Traffic schedulers"
+	default m
+	help
+	  Kernel schedulers for IP traffic
+
+

--- /dev/null
+++ b/package/linux/Makefile
@@ -1,1 +1,75 @@
+include $(TOPDIR)/rules.mk
+include ./linux.mk
 
+PKG_BUILD_DIR := $(BUILD_DIR)/linux-modules
+PKG_RELEASE := 1
+
+TARGETS := 
+INSTALL_TARGETS := 
+
+define KMOD_template
+PKG_$(1) := $(PACKAGE_DIR)/kmod-$(2)_$(LINUX_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+I_$(1) := $(PKG_BUILD_DIR)/ipkg/$(2)
+ifneq ($(BR2_PACKAGE_KMOD_$(1)),)
+TARGETS += $$(PKG_$(1))
+endif
+ifeq ($(BR2_PACLAGE_KMOD_$(1)),y)
+INSTALL_TARGETS += $$(PKG_$(1))
+endif
+
+$$(PKG_$(1)): $(LINUX_DIR)/.modules_done
+	mkdir -p $$(I_$(1))/lib/modules/$(LINUX_VERSION)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $$(I_$(1)) control/kmod-$(2).control $(LINUX_VERSION)-$(PKG_RELEASE) $(ARCH)
+	cp $(3) $$(I_$(1))/lib/modules/$(LINUX_VERSION)
+	$(IPKG_BUILD) $$(I_$(1)) $(PACKAGE_DIR)
+
+endef
+
+$(eval $(call KMOD_template,ARPT,arptables,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/arp*.o \
+))
+$(eval $(call KMOD_template,EBT,ebtables,\
+	$(MODULES_DIR)/kernel/net/bridge/netfilter/*.o \
+))
+$(eval $(call KMOD_template,IPT4,iptables-extra,\
+	$(MODULES_DIR)/kernel/net/ipv4/netfilter/ip*.o \
+))
+$(eval $(call KMOD_template,IPT6,ip6tables,\
+	$(MODULES_DIR)/kernel/net/ipv6/netfilter/ip*.o \
+))
+$(eval $(call KMOD_template,IPV6,ipv6,\
+	$(MODULES_DIR)/kernel/net/ipv6/ipv6.o \
+))
+$(eval $(call KMOD_template,USB,usb,\
+	$(MODULES_DIR)/kernel/drivers/scsi/*.o \
+	$(MODULES_DIR)/kernel/drivers/usb/*.o \
+	$(MODULES_DIR)/kernel/drivers/usb/*/*.o \
+))
+$(eval $(call KMOD_template,CRYPTO,crypto,\
+	$(MODULES_DIR)/kernel/crypto/*.o \
+))
+$(eval $(call KMOD_template,MPPE,mppe,\
+	$(MODULES_DIR)/kernel/drivers/net/ppp_mppe_mppc.o \
+))
+$(eval $(call KMOD_template,TUN,tun,\
+	$(MODULES_DIR)/kernel/drivers/net/tun.o \
+))
+$(eval $(call KMOD_template,SCHED,sched,\
+	$(MODULES_DIR)/kernel/net/sched/*.o \
+))
+
+$(TARGETS): $(PACKAGE_DIR)
+
+$(PACKAGE_DIR):
+	mkdir -p $(PACKAGE_DIR)
+
+source: linux-source
+prepare: $(LINUX_DIR)/.configured
+compile: $(LINUX_DIR)/.modules_done $(TARGETS)
+
+install: compile $(TARGET_MODULES_DIR)
+	@[ "$(INSTALL_TARGETS)" != "" ] && $(IPKG) install $(INSTALL_TARGETS) || true
+
+clean: linux-dirclean
+	rm -f $(TARGETS)
+

--- /dev/null
+++ b/package/linux/control/kmod-arptables.control
@@ -1,1 +1,9 @@
+Package: kmod-arptables
+Priority: optional
+Section: net
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: ARP firewalling kernel modules
 

--- /dev/null
+++ b/package/linux/control/kmod-crypto.control
@@ -1,1 +1,9 @@
+Package: kmod-crypto
+Priority: optional
+Section: sys
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: CryptoAPI kernel modules
 

--- /dev/null
+++ b/package/linux/control/kmod-ebtables.control
@@ -1,1 +1,9 @@
+Package: kmod-ebtables
+Priority: optional
+Section: net
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Ethernet bridge firewalling kernel modules
 

--- /dev/null
+++ b/package/linux/control/kmod-ip6tables.control
@@ -1,1 +1,10 @@
+Package: kmod-ip6tables
+Priority: optional
+Section: net
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Kernel modules for ip6tables
+Depends: kmod-ipv6
 

--- /dev/null
+++ b/package/linux/control/kmod-iptables-extra.control
@@ -1,1 +1,9 @@
+Package: kmod-iptables-extra
+Priority: optional
+Section: net
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Extra kernel modules for iptables
 

--- /dev/null
+++ b/package/linux/control/kmod-ipv6.control
@@ -1,1 +1,9 @@
+Package: kmod-ipv6
+Priority: optional
+Section: net
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Kernel modules for the IPv6 protocol
 

--- /dev/null
+++ b/package/linux/control/kmod-mppe.control
@@ -1,1 +1,9 @@
+Package: kmod-mppe
+Priority: optional
+Section: net
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Microsoft PPP Encryption/Compression support
 

--- /dev/null
+++ b/package/linux/control/kmod-sched.control
@@ -1,1 +1,9 @@
+Package: kmod-sched
+Priority: optional
+Section: sys
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Kernel schedulers for IP traffic
 

--- /dev/null
+++ b/package/linux/control/kmod-tun.control
@@ -1,1 +1,9 @@
+Package: kmod-tun
+Priority: optional
+Section: sys
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Kernel TUN/TAP extension
 

--- /dev/null
+++ b/package/linux/control/kmod-usb.control
@@ -1,1 +1,9 @@
+Package: kmod-usb
+Priority: optional
+Section: sys
+Version: 2.4.29-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: Kernel modules for USB/SCSI support
 

 Binary files /dev/null and b/package/linux/kernel-patches/105-makefile-mkdep-fix.bz2 differ
 Binary files /dev/null and b/package/linux/kernel-patches/304-netfilter-ipp2p-0.7.1.bz2 differ
--- a/package/linux/linux.config
+++ b/package/linux/linux.config
@@ -324,6 +324,7 @@
 CONFIG_IP_NF_IPTABLES=y
 CONFIG_IP_NF_MATCH_LIMIT=m
 CONFIG_IP_NF_MATCH_MAC=m
+CONFIG_IP_NF_MATCH_IPP2P=m
 CONFIG_IP_NF_MATCH_PKTTYPE=m
 CONFIG_IP_NF_MATCH_MARK=y
 CONFIG_IP_NF_MATCH_MULTIPORT=y
@@ -829,7 +830,7 @@
 CONFIG_DEVFS_FS=y
 CONFIG_DEVFS_MOUNT=y
 # CONFIG_DEVFS_DEBUG is not set
-# CONFIG_DEVPTS_FS is not set
+CONFIG_DEVPTS_FS=y
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_QNX4FS_RW is not set
 # CONFIG_ROMFS_FS is not set

--- a/package/linux/linux.mk
+++ b/package/linux/linux.mk
@@ -11,7 +11,6 @@
 # 4xx	patches needed to integrate feature patches
 #
 #############################################################
-ifneq ($(filter $(TARGETS),linux),)
 
 LINUX_FORMAT=zImage
 LINUX_KARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \
@@ -20,16 +19,13 @@
 	-e 's/sh[234]/sh/' \
 	)
 
-LINUX_VERSION=2.4.29
-LINUX_DIR=$(BUILD_DIR)/linux-$(LINUX_VERSION)
 LINUX_SITE=http://www.kernel.org/pub/linux/kernel/v2.4
 LINUX_SOURCE=linux-$(LINUX_VERSION).tar.bz2
-LINUX_KCONFIG=package/linux/linux.config
-LINUX_KERNEL=$(BUILD_DIR)/buildroot-kernel
-LINUX_PATCHES=$(PACKAGE_DIR)/linux/kernel-patches
+LINUX_KCONFIG=./linux.config
+LINUX_PATCHES=./kernel-patches
 LINUX_BINLOC=arch/$(LINUX_KARCH)/brcm-boards/bcm947xx/compressed/vmlinuz
 # Used by pcmcia-cs and others
-LINUX_SOURCE_DIR=$(LINUX_DIR)
+LINUX_SOURCE_DIR=$(LINUX_DIR)-$(LINUX_VERSION)
 
 # kernel stuff extracted from linksys firmware GPL sourcetree
 # WRT54GS_3_37_2_1109_US (shared,include,wl,et)
@@ -46,17 +42,24 @@
 	bzcat $(DL_DIR)/$(LINUX_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
 	# extract linksys binary kernel stuff and include/shared files
 	zcat $(DL_DIR)/$(LINKSYS_KERNEL_TGZ) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	ln -sf $(LINUX_DIR)-$(LINUX_VERSION) $(LINUX_DIR)
 	touch $(LINUX_DIR)/.unpacked
 
 $(LINUX_DIR)/.patched: $(LINUX_DIR)/.unpacked
 	$(PATCH) $(LINUX_DIR) $(LINUX_PATCHES)
 	touch $(LINUX_DIR)/.patched
 
-$(LINUX_DIR)/.configured:  $(LINUX_DIR)/.patched
+$(LINUX_DIR)/.configured: $(LINUX_DIR)/.patched
 	-cp $(LINUX_KCONFIG) $(LINUX_DIR)/.config
+#ifeq ($(BR2_TARGET_ROOTFS_SQUASHFS_LZMA),y)
+#	$(SED) "s,rootfstype=jffs2,rootfstype=squashfs," $(LINUX_DIR)/.config
+#endif
+#ifeq ($(BR2_TARGET_ROOTFS_SQUASHFS),y)
+#	$(SED) "s,rootfstype=jffs2,rootfstype=squashfs," $(LINUX_DIR)/.config
+#endif
 	$(SED) "s,^CROSS_COMPILE.*,CROSS_COMPILE=$(KERNEL_CROSS),g;" \
-		$(LINUX_DIR)/Makefile \
-		$(LINUX_DIR)/arch/mips/Makefile
+	  $(LINUX_DIR)/Makefile  \
+	  $(LINUX_DIR)/arch/mips/Makefile
 	$(SED) "s,\-mcpu=,\-mtune=,g;" $(LINUX_DIR)/arch/mips/Makefile
 	$(MAKE) -C $(LINUX_DIR) ARCH=$(LINUX_KARCH) oldconfig include/linux/version.h
 	touch $(LINUX_DIR)/.configured
@@ -76,7 +79,6 @@
 $(LINUX_DIR)/.modules_done: $(LINUX_KERNEL)
 	rm -rf $(BUILD_DIR)/modules
 	$(MAKE) -C $(LINUX_DIR) DEPMOD=true INSTALL_MOD_PATH=$(BUILD_DIR)/modules modules_install
-	tar -C $(BUILD_DIR)/modules/lib -cjf openwrt-kmodules.tar.bz2 modules
 	touch $(LINUX_DIR)/.modules_done
 
 $(STAGING_DIR)/include/linux/version.h: $(LINUX_DIR)/.configured
@@ -100,16 +102,10 @@
 	-$(MAKE) -C $(LINUX_DIR) clean
 
 linux-dirclean:
+	rm -f $(BUILD_DIR)/openwrt-kmodules.tar.bz2
+	rm -rf $(LINUX_DIR)-$(LINUX_VERSION)
 	rm -rf $(LINUX_DIR)
+	rm -rf $(BUILD_DIR)/modules
+	rm -rf $(BUILD_DIR)/linksys-kernel
 
-endif
 
-#############################################################
-#
-# Toplevel Makefile options
-#
-##############################################################
-ifeq ($(strip $(BR2_PACKAGE_LINUX)),y)
-TARGETS+=linux
-endif
-

--- /dev/null
+++ b/package/lzo/Config.in
@@ -1,1 +1,8 @@
+config BR2_PACKAGE_LZO
+	tristate "lzo"
+	default m
+	help
+	  A library implementing transparent compression/decompression
+	 
+	  http://www.oberhumer.com/opensource/lzo/
 

--- /dev/null
+++ b/package/lzo/Makefile
@@ -1,1 +1,70 @@
+include $(TOPDIR)/rules.mk
 
+PKG_NAME := lzo
+PKG_VERSION := 1.08
+PKG_RELEASE := 1
+
+PKG_SOURCE_SITE := http://www.oberhumer.com/opensource/lzo/download/
+PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_CAT := zcat
+PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR)
+PKG_IPK := $(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+
+
+$(DL_DIR)/$(PKG_SOURCE_FILE):
+	mkdir -p $(DL_DIR)
+	$(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE)
+
+$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE)
+	mkdir -p $(TOOL_BUILD_DIR)
+	$(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	$(PATCH) $(PKG_BUILD_DIR) . ./patches
+	touch $(PKG_BUILD_DIR)/.patched
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched
+	(cd $(PKG_BUILD_DIR); rm -rf config.cache; \
+		$(TARGET_CONFIGURE_OPTS) \
+		./configure \
+		--target=$(GNU_TARGET_NAME) \
+		--host=$(GNU_TARGET_NAME) \
+		--build=$(GNU_HOST_NAME) \
+		--prefix=/ \
+		--exec-prefix=/ \
+		--bindir=/bin \
+		--sbindir=/sbin \
+		--libexecdir=/lib \
+		--sysconfdir=/etc \
+		--localstatedir=/var \
+		--enable-shared \
+	);
+	touch $(PKG_BUILD_DIR)/.configured
+
+$(PKG_BUILD_DIR)/src/liblzo.la: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) -C $(PKG_BUILD_DIR)
+
+$(STAGING_DIR)/lib/liblzo.a: $(PKG_BUILD_DIR)/src/liblzo.la
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+	  CC=$(TARGET_CC) \
+	  DESTDIR="$(STAGING_DIR)" \
+	  install
+
+$(PACKAGE_DIR)/$(PKG_IPK): $(STAGING_DIR)/lib/liblzo.a
+	mkdir -p $(PACKAGE_DIR)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_BUILD_DIR)/ipkg/lzo lzo.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_BUILD_DIR)/ipkg/lzo/usr/lib
+	cp -a $(STAGING_DIR)/lib/liblzo.so* $(PKG_BUILD_DIR)/ipkg/lzo/usr/lib
+	$(STRIP) $(PKG_BUILD_DIR)/ipkg/lzo/usr/lib/*
+	$(IPKG_BUILD) $(PKG_BUILD_DIR)/ipkg/lzo $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE_FILE)
+prepare: $(PKG_BUILD_DIR)/.patched
+compile: $(STAGING_DIR)/lib/liblzo.a $(PACKAGE_DIR)/$(PKG_IPK)
+install: $(PKG_ZLIB)
+	$(IPKG) install $(PACKAGE_DIR)/$(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+	rm -f $(STAGING_DIR)/lib/liblzo*
+	rm -f $(PACKAGE_DIR)/lzo\*.ipk
+
+

--- /dev/null
+++ b/package/lzo/lzo.control
@@ -1,1 +1,9 @@
+Package: lzo
+Priority: optional
+Section: libs
+Version: 1.0.8-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: an implementation of the deflate compression method (library)
 

--- /dev/null
+++ b/package/lzo/patches/lzo-cross-compile.patch
@@ -1,1 +1,44 @@
+For some reason the lzo autoconf script uses a local macro that does
+a test for cross-compiles, and assumes that if the build target name
+and the host target name are the same that --host was not specified to
+the configure script. In the uClibc buildroot, this is not the case.
 
+--- lzo-1.08/aclocal.m4	2002-07-12 18:31:52.000000000 -0700
++++ lzo-1.08/aclocal.m4.new	2004-03-10 15:32:42.000000000 -0700
+@@ -205,12 +205,6 @@
+ [
+ AC_REQUIRE([AC_PROG_CC])
+ 
+-if test "X$cross_compiling" = Xyes; then
+-  if test "X$build" = "X$host"; then
+-    AC_MSG_ERROR([you are cross compiling - please use the \`--host=' option])
+-  fi
+-fi
+-
+ ])
+ 
+ 
+--- lzo-1.08/configure-dist	2004-03-11 02:18:28.000000000 -0600
++++ lzo-1.08/configure	2004-03-11 02:19:16.000000000 -0600
+@@ -2282,13 +2282,13 @@
+ 
+ 
+ 
+-if test "X$cross_compiling" = Xyes; then
+-  if test "X$build" = "X$host"; then
+-    { { echo "$as_me:$LINENO: error: you are cross compiling - please use the \`--host=' option" >&5
+-echo "$as_me: error: you are cross compiling - please use the \`--host=' option" >&2;}
+-   { (exit 1); exit 1; }; }
+-  fi
+-fi
++#if test "X$cross_compiling" = Xyes; then
++#  if test "X$build" = "X$host"; then
++#    { { echo "$as_me:$LINENO: error: you are cross compiling - please use the \`--host=' option" >&5
++#echo "$as_me: error: you are cross compiling - please use the \`--host=' option" >&2;}
++#   { (exit 1); exit 1; }; }
++#  fi
++#fi
+ 
+ 
+ 
+

--- /dev/null
+++ b/package/openssl/Config.in
@@ -1,1 +1,8 @@
+config BR2_PACKAGE_OPENSSL
+	tristate "openssl"
+	default m
+	help
+	  A library implementing the SSL and TLS protocols 
+	  
+	  http://www.openssl.org/
 

--- /dev/null
+++ b/package/openssl/Makefile
@@ -1,1 +1,74 @@
+include $(TOPDIR)/rules.mk
 
+PKG_NAME := openssl
+PKG_VERSION := 0.9.7e
+PKG_RELEASE := 1
+
+PKG_SOURCE_SITE := http://www.openssl.org/source
+PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_CAT := zcat
+PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR)
+PKG_IPK := $(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+
+OPENSSL_NO_CIPHERS:=no-idea no-mdc2 no-rc5 no-rc2 no-md2 no-md4
+
+$(DL_DIR)/$(PKG_SOURCE_FILE):
+	mkdir -p $(DL_DIR)
+	$(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE)
+
+$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE)
+	mkdir -p $(TOOL_BUILD_DIR)
+	$(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	$(PATCH) $(PKG_BUILD_DIR) ./patches
+	$(SED) 's,/CFLAG=,/CFLAG= $(TARGET_SOFT_FLOAT) ,g' \
+		$(PKG_BUILD_DIR)/Configure
+	touch $(PKG_BUILD_DIR)/.patched
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched
+	(cd $(PKG_BUILD_DIR); \
+		CFLAGS="-DOPENSSL_NO_KRB5 -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5" \
+        PATH=$(TARGET_PATH) ./Configure linux-$(ARCH) --prefix=/ \
+		--openssldir=/usr/lib/ssl -L$(STAGING_DIR)/lib -ldl \
+		-I$(STAGING_DIR)/include $(OPENSSL_NO_CIPHERS) \
+		shared no-krb5 no-ec no-engine zlib-dynamic no-hw no-threads )
+	touch $(PKG_BUILD_DIR)/.configured
+
+$(PKG_BUILD_DIR)/apps/openssl: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) CC=$(TARGET_CC) -C $(PKG_BUILD_DIR) all build-shared
+	# Work around openssl build bug to link libssl.so with libcrypto.so.
+	-rm $(PKG_BUILD_DIR)/libssl.so.*.*.*
+	$(MAKE) CC=$(TARGET_CC) -C $(PKG_BUILD_DIR) do_linux-shared
+
+$(STAGING_DIR)/lib/libssl.so: $(PKG_BUILD_DIR)/apps/openssl
+	$(MAKE) CC=$(TARGET_CC) INSTALL_PREFIX=$(STAGING_DIR) -C $(PKG_BUILD_DIR) install_sw
+	cp -fa $(PKG_BUILD_DIR)/libcrypto.so* $(STAGING_DIR)/lib/
+	chmod a-x $(STAGING_DIR)/lib/libcrypto.so.0.9.7
+	(cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so)
+	(cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so.0)
+	cp -fa $(PKG_BUILD_DIR)/libssl.so* $(STAGING_DIR)/lib/
+	chmod a-x $(STAGING_DIR)/lib/libssl.so.0.9.7
+	(cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so)
+	(cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so.0)
+
+$(PACKAGE_DIR)/$(PKG_IPK): $(STAGING_DIR)/lib/libssl.so
+	mkdir -p $(PACKAGE_DIR)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib
+	cp -a $(STAGING_DIR)/lib/libssl.so* $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib
+	cp -a $(STAGING_DIR)/lib/libcrypto.so* $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib
+	$(STRIP) $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME)/usr/lib/*
+	$(IPKG_BUILD) $(PKG_BUILD_DIR)/ipkg/$(PKG_NAME) $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE_FILE)
+prepare: $(PKG_BUILD_DIR)/.patched
+compile: $(STAGING_DIR)/lib/libssl.so $(PACKAGE_DIR)/$(PKG_IPK)
+install: $(PKG_ZLIB)
+	$(IPKG) install $(PACKAGE_DIR)/$(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+	rm -f $(STAGING_DIR)/lib/libssl*
+	rm -f $(STAGING_DIR)/lib/libcrypto*
+	rm -f $(PACKAGE_DIR)/$(PKG_NAME)\*.ipk
+
+

--- /dev/null
+++ b/package/openssl/openssl.control
@@ -1,1 +1,9 @@
+Package: openssl
+Priority: optional
+Section: libs
+Version: 0.9.7e-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: OpenSSL Secure Socket Layer library
 

--- /dev/null
+++ b/package/openssl/openssl.mk
@@ -1,1 +1,96 @@
+#############################################################
+#
+# openssl
+#
+#############################################################
 
+# TARGETS
+OPENSSL_SITE:=http://www.openssl.org/source
+OPENSSL_SOURCE:=openssl-0.9.7d.tar.gz
+OPENSSL_DIR:=$(BUILD_DIR)/openssl-0.9.7d
+OPENSSL_IPK_DIR=$(OPENWRT_IPK_DIR)/openssl
+OPENSSL_PATCH=$(OPENSSL_IPK_DIR)/openssl.patch
+
+OPENSSL_IPK_BUILD_DIR=$(BUILD_DIR)/openssl-0.9.7d-ipk
+LIBSSL_IPK=$(BUILD_DIR)/libssl_0.9.7d_mipsel.ipk
+
+$(DL_DIR)/$(OPENSSL_SOURCE):
+	$(WGET) -P $(DL_DIR) $(OPENSSL_SITE)/$(OPENSSL_SOURCE)
+
+$(OPENSSL_DIR)/.unpacked: $(DL_DIR)/$(OPENSSL_SOURCE) $(OPENSSL_PATCH)
+	gunzip -c $(DL_DIR)/$(OPENSSL_SOURCE) | tar -C $(BUILD_DIR) -xvf -
+	cat $(OPENSSL_PATCH) | patch -p1 -d $(OPENSSL_DIR)
+	# sigh... we have to resort to this just to set a gcc flag.
+	$(SED) 's,/CFLAG=,/CFLAG= $(TARGET_SOFT_FLOAT) ,g' \
+		$(OPENSSL_DIR)/Configure
+	touch  $(OPENSSL_DIR)/.unpacked
+
+$(OPENSSL_DIR)/Makefile: $(OPENSSL_DIR)/.unpacked
+	(cd $(OPENSSL_DIR); \
+	CFLAGS="-DOPENSSL_NO_KRB5 -DOPENSSL_NO_IDEA -DOPENSSL_NO_MDC2 -DOPENSSL_NO_RC5" \
+	PATH=$(TARGET_PATH) ./Configure linux-$(ARCH) --prefix=/ \
+		--openssldir=/usr/lib/ssl -L$(STAGING_DIR)/lib -ldl \
+		-I$(STAGING_DIR)/include $(OPENSSL_OPTS) no-threads \
+		shared no-idea no-mdc2 no-rc5)
+
+$(OPENSSL_DIR)/apps/openssl: $(OPENSSL_DIR)/Makefile
+	$(MAKE) CC=$(TARGET_CC) -C $(OPENSSL_DIR) all build-shared
+	# Work around openssl build bug to link libssl.so with libcrypto.so.
+	-rm $(OPENSSL_DIR)/libssl.so.*.*.*
+	$(MAKE) CC=$(TARGET_CC) -C $(OPENSSL_DIR) do_linux-shared
+
+$(STAGING_DIR)/lib/libcrypto.a: $(OPENSSL_DIR)/apps/openssl
+	$(MAKE) CC=$(TARGET_CC) INSTALL_PREFIX=$(STAGING_DIR) -C $(OPENSSL_DIR) install
+	cp -fa $(OPENSSL_DIR)/libcrypto.so* $(STAGING_DIR)/lib/
+	chmod a-x $(STAGING_DIR)/lib/libcrypto.so.0.9.7
+	(cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so)
+	(cd $(STAGING_DIR)/lib; ln -fs libcrypto.so.0.9.7 libcrypto.so.0)
+	cp -fa $(OPENSSL_DIR)/libssl.so* $(STAGING_DIR)/lib/
+	chmod a-x $(STAGING_DIR)/lib/libssl.so.0.9.7
+	(cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so)
+	(cd $(STAGING_DIR)/lib; ln -fs libssl.so.0.9.7 libssl.so.0)
+
+$(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7: $(STAGING_DIR)/lib/libcrypto.a
+	mkdir -p $(TARGET_DIR)/usr/lib
+	cp -fa $(STAGING_DIR)/lib/libcrypto.so* $(TARGET_DIR)/usr/lib/
+	cp -fa $(STAGING_DIR)/lib/libssl.so* $(TARGET_DIR)/usr/lib/
+	#cp -fa $(STAGING_DIR)/bin/openssl  $(TARGET_DIR)/bin/
+	-$(STRIP)  $(TARGET_DIR)/usr/lib/libssl.so.0.9.7
+	-$(STRIP)  $(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7
+
+$(TARGET_DIR)/usr/lib/libssl.a: $(STAGING_DIR)/lib/libcrypto.a
+	mkdir -p $(TARGET_DIR)/usr/include 
+	cp -a $(STAGING_DIR)/include/openssl $(TARGET_DIR)/usr/include/
+	cp -dpf $(STAGING_DIR)/lib/libssl.a $(TARGET_DIR)/usr/lib/
+	cp -dpf $(STAGING_DIR)/lib/libcrypto.a $(TARGET_DIR)/usr/lib/
+	touch -c $(TARGET_DIR)/usr/lib/libssl.a
+
+openssl-headers: $(TARGET_DIR)/usr/lib/libssl.a
+
+openssl: uclibc $(TARGET_DIR)/usr/lib/libcrypto.so.0.9.7
+
+$(LIBSSL_IPK): uclibc $(STAGING_DIR)/lib/libcrypto.a
+	mkdir -p $(OPENSSL_IPK_BUILD_DIR)/CONTROL
+	cp $(OPENSSL_IPK_DIR)/control $(OPENSSL_IPK_BUILD_DIR)/CONTROL/control
+	mkdir -p $(OPENSSL_IPK_BUILD_DIR)/usr/lib
+	cp -fa $(STAGING_DIR)/lib/libcrypto.so* $(OPENSSL_IPK_BUILD_DIR)/usr/lib/
+	cp -fa $(STAGING_DIR)/lib/libssl.so* $(OPENSSL_IPK_BUILD_DIR)/usr/lib/
+	-$(STRIP)  $(OPENSSL_IPK_BUILD_DIR)/usr/lib/libssl.so.0.9.7
+	-$(STRIP)  $(OPENSSL_IPK_BUILD_DIR)/usr/lib/libcrypto.so.0.9.7
+	cd $(BUILD_DIR); $(IPKG_BUILD) $(OPENSSL_IPK_BUILD_DIR)
+
+openssl-ipk: $(LIBSSL_IPK)
+
+openssl-source: $(DL_DIR)/$(OPENSSL_SOURCE)
+
+openssl-clean: 
+	rm -f $(STAGING_DIR)/bin/openssl  $(TARGET_DIR)/bin/openssl
+	rm -f $(STAGING_DIR)/lib/libcrypto.so* $(TARGET_DIR)/lib/libcrypto.so*
+	rm -f $(STAGING_DIR)/lib/libssl.so* $(TARGET_DIR)/lib/libssl.so*
+	rm -rf $(OPENSSL_IPK_BUILD_DIR)
+	$(MAKE) -C $(OPENSSL_DIR) clean
+
+openssl-dirclean: 
+	rm -rf $(OPENSSL_DIR) 
+
+

--- /dev/null
+++ b/package/openssl/patches/openssl.patch
@@ -1,1 +1,239 @@
+--- openssl-0.9.7.orig/Configure
++++ openssl-0.9.7/Configure
+@@ -1,4 +1,4 @@
+-:
++#!/usr/bin/perl
+ eval 'exec perl -S $0 ${1+"$@"}'
+     if $running_under_some_shell;
+ ##
+@@ -373,6 +373,40 @@
+ # assembler versions -- currently defunct:
+ ##"OpenBSD-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer:::(unknown):SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2:${alpha_asm}",
+ 
++# Sane Linux configuration values, stolen from the Debian package....
++"linux-alpha","gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-alpha-ev4","gcc:-DTERMIO -O3 -mcpu=ev4 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-alpha-ev5","gcc:-DTERMIO -O3 -mcpu=ev5 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_RISC1 DES_UNROLL:${alpha_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-arm","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_RISC1::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-freebsd-alpha","gcc:-DTERMIOS -O -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-freebsd-i386",  "gcc:-DTERMIOS -DL_ENDIAN -fomit-frame-pointer -O3 -m486 -Wall::-pthread -D_REENTRANT -D_THREAD_SAFE -D_THREADSAFE:::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-hppa","gcc:-DB_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-hurd-i386","gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-ia64","gcc:-DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK RC4_CHAR:asm/ia64.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++#"linux-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC",
++"linux-i386","gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-i386-i486","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i486 -mcpu=i486 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-i386-i586","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i586 -mcpu=i586 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-i386-i686/cmov","gcc:-DL_ENDIAN -DTERMIO -O3 -march=i686 -mcpu=i686 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-m68k","gcc:-DB_ENDIAN -DTERMIO -O2 -Wall::-D_REENTRANT::-ldl:BN_LLONG MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-mips",   "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-mipsel",   "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-netbsd-i386",	"gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486 -Wall::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-netbsd-m68k",	"gcc:-DB_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-netbsd-sparc",	"gcc:-DB_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -mv8 -Wall::(unknown):::BN_LLONG MD2_CHAR RC4_INDEX DES_UNROLL::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-openbsd-alpha","gcc:-DTERMIOS -O3 -fomit-frame-pointer::(unknown):::SIXTY_FOUR_BIT_LONG DES_INT DES_PTR DES_RISC2::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-openbsd-i386",  "gcc:-DL_ENDIAN -DTERMIOS -O3 -fomit-frame-pointer -m486::(unknown):::BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_out_asm}:dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-openbsd-mips","gcc:-O2 -DL_ENDIAN::(unknown)::BN_LLONG MD2_CHAR RC4_INDEX RC4_CHAR DES_UNROLL DES_RISC2 DES_PTR BF_PTR:::::::::::dlfcn:bsd-gcc-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-powerpc","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG DES_UNROLL DES_RISC2 DES_PTR MD2_CHAR RC4_INDEX::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-s390","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)", 
++"linux-sh3",   "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-sh4",   "gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-sh3eb",   "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-sh4eb",   "gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-sparc","gcc:-DB_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR::::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-sparc-v8","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v8 -fomit-frame-pointer -Wall -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8.o:::::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-sparc-v9","gcc:-DB_ENDIAN -DTERMIO -O3 -mcpu=v9 -Wa,-Av8plus -fomit-frame-pointer -Wall -DULTRASPARC -DBN_DIV2W::-D_REENTRANT::-ldl:BN_LLONG RC4_CHAR RC4_CHUNK DES_UNROLL BF_PTR:asm/sparcv8plus.o:::asm/md5-sparcv8plus.o::::::dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
++"linux-cris",	"gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -Wall::-D_REENTRANT::-ldl:BN_LLONG::::::::::dlfcn:linux-shared:-fpic::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+ # The intel boxes :-), It would be worth seeing if bsdi-gcc can use the
+ # bn86-elf.o file file since it is hand tweaked assembler.
+ "linux-elf",	"gcc:-DL_ENDIAN -DTERMIO -O3 -fomit-frame-pointer -m486 -Wall::-D_REENTRANT::-ldl:BN_LLONG ${x86_gcc_des} ${x86_gcc_opts}:${x86_elf_asm}:dlfcn:linux-shared:-fPIC::.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR)",
+--- openssl-0.9.7.orig/crypto/md5/asm/md5-sparcv9.S
++++ openssl-0.9.7/crypto/md5/asm/md5-sparcv9.S
+@@ -72,14 +72,14 @@
+ #define Dval	R8
+ 
+ #if defined(MD5_BLOCK_DATA_ORDER)
+-# if defined(OPENSSL_SYSNAME_ULTRASPARC)
++/*# if defined(OPENSSL_SYSNAME_ULTRASPARC)*/
+ #  define	LOAD			lda
+ #  define	X(i)			[%i1+i*4]%asi
+ #  define	md5_block		md5_block_asm_data_order_aligned
+ #  define	ASI_PRIMARY_LITTLE	0x88
+-# else
++/*# else
+ #  error "MD5_BLOCK_DATA_ORDER is supported only on UltraSPARC!"
+-# endif
++# endif*/
+ #else
+ # define	LOAD			ld
+ # define	X(i)			[%i1+i*4]
+--- openssl-0.9.7.orig/crypto/opensslconf.h
++++ openssl-0.9.7/crypto/opensslconf.h
+@@ -4,17 +4,38 @@
+ /* OpenSSL was configured with the following options: */
+ #ifndef OPENSSL_DOING_MAKEDEPEND
+ 
++#ifndef OPENSSL_NO_IDEA
++# define OPENSSL_NO_IDEA
++#endif
++#ifndef OPENSSL_NO_MDC2
++# define OPENSSL_NO_MDC2
++#endif
++#ifndef OPENSSL_NO_RC5
++# define OPENSSL_NO_RC5
++#endif
+ #ifndef OPENSSL_NO_KRB5
+ # define OPENSSL_NO_KRB5
+ #endif
+ 
+ #endif /* OPENSSL_DOING_MAKEDEPEND */
++#ifndef OPENSSL_THREADS
++# define OPENSSL_THREADS
++#endif
+ 
+ /* The OPENSSL_NO_* macros are also defined as NO_* if the application
+    asks for it.  This is a transient feature that is provided for those
+    who haven't had the time to do the appropriate changes in their
+    applications.  */
+ #ifdef OPENSSL_ALGORITHM_DEFINES
++# if defined(OPENSSL_NO_IDEA) && !defined(NO_IDEA)
++#  define NO_IDEA
++# endif
++# if defined(OPENSSL_NO_MDC2) && !defined(NO_MDC2)
++#  define NO_MDC2
++# endif
++# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5)
++#  define NO_RC5
++# endif
+ # if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5)
+ #  define NO_KRB5
+ # endif
+@@ -27,7 +48,7 @@
+ 
+ #if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
+ #if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
+-#define OPENSSLDIR "/usr/local/ssl"
++#define OPENSSLDIR "/usr/lib/ssl"
+ #endif
+ #endif
+ 
+@@ -79,7 +100,7 @@
+ 
+ #if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
+ #define CONFIG_HEADER_BN_H
+-#undef BN_LLONG
++#define BN_LLONG
+ 
+ /* Should we define BN_DIV2W here? */
+ 
+@@ -98,7 +119,7 @@
+ #define CONFIG_HEADER_RC4_LOCL_H
+ /* if this is defined data[i] is used instead of *data, this is a %20
+  * speedup on x86 */
+-#undef RC4_INDEX
++#define RC4_INDEX
+ #endif
+ 
+ #if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
+@@ -112,14 +133,14 @@
+ /* the following is tweaked from a config script, that is why it is a
+  * protected undef/define */
+ #ifndef DES_PTR
+-#undef DES_PTR
++#define DES_PTR
+ #endif
+ 
+ /* This helps C compiler generate the correct code for multiple functional
+  * units.  It reduces register dependancies at the expense of 2 more
+  * registers */
+ #ifndef DES_RISC1
+-#undef DES_RISC1
++#define DES_RISC1
+ #endif
+ 
+ #ifndef DES_RISC2
+@@ -133,7 +154,7 @@
+ /* Unroll the inner loop, this sometimes helps, sometimes hinders.
+  * Very mucy CPU dependant */
+ #ifndef DES_UNROLL
+-#undef DES_UNROLL
++#define DES_UNROLL
+ #endif
+ 
+ /* These default values were supplied by
+--- openssl-0.9.7.orig/ssl/ssl_algs.c
++++ openssl-0.9.7/ssl/ssl_algs.c
+@@ -109,3 +109,8 @@
+ 	return(1);
+ 	}
+ 
++#undef SSLeay_add_ssl_algorithms
++int SSLeay_add_ssl_algorithms(void)
++    {
++         return SSL_library_init();
++    }
+--- openssl-0.9.7.orig/tools/c_rehash.in
++++ openssl-0.9.7/tools/c_rehash.in
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl
++#!/usr/bin/perl
+ 
+ 
+ # Perl c_rehash script, scan all files in a directory
+--- openssl-0.9.7.orig/util/clean-depend.pl
++++ openssl-0.9.7/util/clean-depend.pl
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl -w
++#!/usr/bin/perl
+ # Clean the dependency list in a makefile of standard includes...
+ # Written by Ben Laurie <ben@algroup.co.uk> 19 Jan 1999
+ 
+--- openssl-0.9.7.orig/util/extract-names.pl
++++ openssl-0.9.7/util/extract-names.pl
+@@ -1,4 +1,4 @@
+-#!/usr/bin/perl
++#!/usr/bin/perl
+ 
+ $/ = "";			# Eat a paragraph at once.
+ while(<STDIN>) {
+--- openssl-0.9.7.orig/util/mkdef.pl
++++ openssl-0.9.7/util/mkdef.pl
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl -w
++#!/usr/bin/perl
+ #
+ # generate a .def file
+ #
+--- openssl-0.9.7.orig/util/mkerr.pl
++++ openssl-0.9.7/util/mkerr.pl
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl -w
++#!/usr/bin/perl
+ 
+ my $config = "crypto/err/openssl.ec";
+ my $debug = 0;
+--- openssl-0.9.7.orig/util/mkstack.pl
++++ openssl-0.9.7/util/mkstack.pl
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl -w
++#!/usr/bin/perl
+ 
+ # This is a utility that searches out "DECLARE_STACK_OF()"
+ # declarations in .h and .c files, and updates/creates/replaces
+--- openssl-0.9.7.orig/util/pod2man.pl
++++ openssl-0.9.7/util/pod2man.pl
+@@ -1,4 +1,4 @@
+-: #!/usr/bin/perl-5.005
++#!/usr/bin/perl
+     eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
+ 	if $running_under_some_shell;
+ 
+--- openssl-0.9.7.orig/util/selftest.pl
++++ openssl-0.9.7/util/selftest.pl
+@@ -1,4 +1,4 @@
+-#!/usr/local/bin/perl -w
++#!/usr/bin/perl
+ #
+ # Run the test suite and generate a report
+ #
 

--- /dev/null
+++ b/package/openssl/patches/remove_fips.patch
@@ -1,1 +1,36 @@
+diff -urN openssl-0.9.7e.old/Makefile.org openssl-0.9.7e/Makefile.org
+--- openssl-0.9.7e.old/Makefile.org	2004-09-28 22:52:14.000000000 +0200
++++ openssl-0.9.7e/Makefile.org	2005-03-03 15:55:11.000000000 +0100
+@@ -175,8 +175,8 @@
+ # we might set SHLIB_MARK to '$(SHARED_LIBS)'.
+ SHLIB_MARK=
+ 
+-DIRS=   crypto fips ssl $(SHLIB_MARK) sigs apps test tools
+-SHLIBDIRS= fips crypto ssl
++DIRS=   crypto ssl $(SHLIB_MARK) sigs apps test tools
++SHLIBDIRS= crypto ssl
+ 
+ # dirs in crypto to build
+ SDIRS=  objects \
+@@ -229,7 +229,6 @@
+ libcrypto.a.sha1: libcrypto.a
+ 	if egrep 'define OPENSSL_FIPS' $(TOP)/include/openssl/opensslconf.h > /dev/null; then \
+ 		$(RANLIB) libcrypto.a; \
+-		fips/sha1/fips_standalone_sha1 libcrypto.a > libcrypto.a.sha1; \
+ 	fi
+ 
+ sub_all:
+--- openssl-0.9.7e/crypto/rand/rand_lib.c 2004-07-30 16:38:00.000000000 +0200
++++ openssl-0.9.7e.patched/crypto/rand/rand_lib.c 2005-02-18 15:46:22.000000000 +0100
+@@ -63,8 +63,10 @@
+ #ifndef OPENSSL_NO_ENGINE
+ #include <openssl/engine.h>
+ #endif
++#ifdef OPENSSL_FIPS
+ #include <openssl/fips.h>
+ #include <openssl/fips_rand.h>
++#endif
 
+ #ifndef OPENSSL_NO_ENGINE
+ /* non-NULL if default_RAND_meth is ENGINE-provided */
+

--- /dev/null
+++ b/package/openvpn/Config.in
@@ -1,1 +1,11 @@
+config BR2_PACKAGE_OPENVPN
+	tristate "OpenVPN"
+	default m
+	select BR2_PACKAGE_KMOD_TUN
+	select BR2_PACKAGE_OPENSSL
+	select BR2_PACKAGE_LZO
+	help
+	  Open Source VPN solution using SSL
 
+	  http://openvpn.net/
+

--- /dev/null
+++ b/package/openvpn/Makefile
@@ -1,1 +1,70 @@
+#############################################################
+#
+# ebtables
+#
+#############################################################
+include $(TOPDIR)/rules.mk
 
+PKG_NAME:=openvpn
+PKG_VERSION:=2.0_rc16
+PKG_RELEASE:=1
+PKG_SOURCE_URL:=http://puzzle.dl.sourceforge.net/sourceforge/openvpn
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
+PKG_CAT:=zcat
+PKG_IPK:=$(PACKAGE_DIR)/$(PKG_NAME)_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+PKG_IPK_DIR:=$(PKG_BUILD_DIR)/ipkg
+
+$(DL_DIR)/$(PKG_SOURCE):
+	 $(WGET) -P $(DL_DIR) $(PKG_SOURCE_URL)/$(PKG_SOURCE)
+
+$(PKG_BUILD_DIR)/.unpacked: $(DL_DIR)/$(PKG_SOURCE)
+	$(PKG_CAT) $(DL_DIR)/$(PKG_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	touch $(PKG_BUILD_DIR)/.unpacked
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.unpacked
+	(cd $(PKG_BUILD_DIR); rm -rf config.cache; \
+		$(TARGET_CONFIGURE_OPTS) \
+		CFLAGS="$(TARGET_CFLAGS)" \
+		./configure \
+		--target=$(GNU_TARGET_NAME) \
+		--host=$(GNU_TARGET_NAME) \
+		--build=$(GNU_HOST_NAME) \
+		--prefix=/usr \
+		--exec-prefix=/usr \
+		--bindir=/usr/bin \
+		--sbindir=/usr/sbin \
+		--libexecdir=/usr/lib \
+		--sysconfdir=/etc \
+		--datadir=/usr/share \
+		--localstatedir=/var \
+		--mandir=/usr/man \
+		--infodir=/usr/info \
+		--program-prefix="" \
+		--disable-pthread \
+		--disable-debug \
+		--disable-plugins \
+		--disable-management \
+		--disable-socks \
+		--disable-http \
+	);
+	touch $(PKG_BUILD_DIR)/.configured
+
+$(PKG_BUILD_DIR)/usr/sbin/openvpn: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) -C $(PKG_BUILD_DIR)
+
+$(PKG_IPK): $(PKG_BUILD_DIR)/usr/sbin/openvpn
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_IPK_DIR) $(PKG_NAME).control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_IPK_DIR)/usr/sbin
+	cp $(PKG_BUILD_DIR)/openvpn $(PKG_IPK_DIR)/usr/sbin/
+	mkdir -p $(PACKAGE_DIR)
+	$(IPKG_BUILD) $(PKG_IPK_DIR) $(PACKAGE_DIR)
+
+source: $(DL_DIR)/$(PKG_SOURCE)
+prepare: $(PKG_BUILD_DIR)/.unpacked
+compile: $(PKG_IPK)
+install:
+	$(IPKG) install $(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+

--- /dev/null
+++ b/package/openvpn/openvpn.control
@@ -1,1 +1,10 @@
+Package: openvpn
+Priority: optional
+Section: net
+Version: 2.0_rc16-1
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Depends: lzo, openssl, kmod-tun
+Source: buildroot internal
+Description: Open Source VPN solution using SSL
 

--- /dev/null
+++ b/package/openwrt/Makefile
@@ -1,1 +1,10 @@
+include $(TOPDIR)/rules.mk
 
+include ./openwrt.mk
+
+source: openwrt-source
+prepare: $(LINKSYS_SHARED_DIR)/.source
+compile: $(TARGET_DIR)/$(LINKSYS_SHARED_TARGET_BINARY)
+install: compile openwrt
+clean: openwrt-dirclean
+

--- a/package/openwrt/addpattern.c
+++ /dev/null
@@ -1,222 +1,1 @@
-/*
- * Copyright (C) 2004  Manuel Novoa III  <mjn3@codepoet.org>
- *
- * 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 of the License, 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
 
-/* July 29, 2004
- *
- * This is a hacked replacement for the 'addpattern' utility used to
- * create wrt54g .bin firmware files.  It isn't pretty, but it does
- * the job for me.
- *
- * Extensions:
- *  -v allows setting the version string on the command line.
- *  -{0|1} sets the (currently ignored) hw_ver flag in the header
- *      to 0 or 1 respectively.
- */
-
-/* January 12, 2005
- * 
- * Modified by rodent at rodent dot za dot net
- * Support added for the new WRT54G v2.2 and WRT54GS v1.1 "flags"
- * Without the flags set to 0x7, the above units will refuse to flash.
- * 
- * Extensions:
- *  -{0|1|2} sets {0|1} sets hw_ver flag to 0/1. {2} sets hw_ver to 1
- *     and adds the new hardware "flags" for the v2.2/v1.1 units
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
-/**********************************************************************/
-
-#define CODE_ID		"U2ND"		/* from code_pattern.h */
-#define CODE_PATTERN   "W54S"	/* from code_pattern.h */
-
-#define CYBERTAN_VERSION	"v3.37.2" /* from cyutils.h */
-
-/* WRT54G v2.2 and WRT54GS v1.1 "flags" (from 3.37.32 firmware cyutils.h) */
-#define SUPPORT_4712_CHIP      0x0001
-#define SUPPORT_INTEL_FLASH    0x0002
-#define SUPPORT_5325E_SWITCH   0x0004
-
-struct code_header {			/* from cyutils.h */
-	char magic[4];
-	char res1[4];				/* for extra magic */
-	char fwdate[3];
-	char fwvern[3];
-	char id[4];					/* U2ND */
-	char hw_ver;    			/* 0: for 4702, 1: for 4712 -- new in 2.04.3 */
-	unsigned short flags;       /* SUPPORT_ flags new for 3.37.2 (WRT54G v2.2 and WRT54GS v1.1) */
-	unsigned char res2[10];
-} ;
-
-/**********************************************************************/
-
-void usage(void) __attribute__ (( __noreturn__ ));
-
-void usage(void)
-{
-	fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-p pattern] [-g] [-v v#.#.#] [-{0|1|2}]\n");
-	exit(EXIT_FAILURE);
-}
-
-int main(int argc, char **argv)
-{
-	char buf[1024];	/* keep this at 1k or adjust garbage calc below */
-	struct code_header *hdr;
-	FILE *in = stdin;
-	FILE *out = stdout;
-	char *ifn = NULL;
-	char *ofn = NULL;
-	char *pattern = CODE_PATTERN;
-	char *version = CYBERTAN_VERSION;
-	int gflag = 0;
-	int c;
-	int v0, v1, v2;
-	size_t off, n;
-	time_t t;
-	struct tm *ptm;
-
-	fprintf(stderr, "mjn3's addpattern replacement - v0.81\n");
-
-	hdr = (struct code_header *) buf;
-	memset(hdr, 0, sizeof(struct code_header));
-
-	while ((c = getopt(argc, argv, "i:o:p:gv:012")) != -1) {
-		switch (c) {
-			case 'i':
-				ifn = optarg;
-				break;
-			case 'o':
-				ofn = optarg;
-				break;
-			case 'p':
-				pattern = optarg;
-				break;
-			case 'g':
-				gflag = 1;
-				break;
-			case 'v':			/* extension to allow setting version */
-				version = optarg;
-				break;
-			case '0':
-				hdr->hw_ver = 0;
-				break;
-			case '1':
-				hdr->hw_ver = 1;
-				break;
-			case '2': 			/* new 54G v2.2 and 54GS v1.1 flags */
-				hdr->hw_ver = 1;
-				hdr->flags |= SUPPORT_4712_CHIP;
-				hdr->flags |= SUPPORT_INTEL_FLASH;
-				hdr->flags |= SUPPORT_5325E_SWITCH;
-				break;
-
-			default:
-				usage();
-		}
-	}
-
-	if (optind != argc) {
-		fprintf(stderr, "illegal arg \"%s\"\n", argv[optind]);
-		usage();
-	}
-
-	if (strlen(pattern) != 4) {
-		fprintf(stderr, "illegal pattern \"%s\": length != 4\n", pattern);
-		usage();
-	}
-
-	if (ifn && !(in = fopen(ifn, "r"))) {
-		fprintf(stderr, "can not open \"%s\" for reading\n", ifn);
-		usage();
-	}
-
-	if (ofn && !(out = fopen(ofn, "w"))) {
-		fprintf(stderr, "can not open \"%s\" for writing\n", ofn);
-		usage();
-	}
-
-	if (time(&t) == (time_t)(-1)) {
-		fprintf(stderr, "time call failed\n");
-		return EXIT_FAILURE;
-	}
-
-	ptm = localtime(&t);
-
-	if (3 != sscanf(version, "v%d.%d.%d", &v0, &v1, &v2)) {
-		fprintf(stderr, "bad version string \"%s\"\n", version);
-		return EXIT_FAILURE;
-	}
-
-	memcpy(&hdr->magic, pattern, 4);
-	hdr->fwdate[0] = ptm->tm_year % 100;
-	hdr->fwdate[1] = ptm->tm_mon + 1;
-	hdr->fwdate[2] = ptm->tm_mday;
-	hdr->fwvern[0] = v0;
-	hdr->fwvern[1] = v1;
-	hdr->fwvern[2] = v2;
-	memcpy(&hdr->id, CODE_ID, strlen(CODE_ID));
-
-	off = sizeof(struct code_header);
-
-	fprintf(stderr, "writing firmware v%d.%d.%d on %d/%d/%d (y/m/d)\n",
-			v0, v1, v2,
-			hdr->fwdate[0], hdr->fwdate[1], hdr->fwdate[2]);
-
-
-	while ((n = fread(buf + off, 1, sizeof(buf)-off, in) + off) > 0) {
-		off = 0;
-		if (n < sizeof(buf)) {
-			if (ferror(in)) {
-			FREAD_ERROR:
-				fprintf(stderr, "fread error\n");
-				return EXIT_FAILURE;
-			}
-			if (gflag) {
-				gflag = sizeof(buf) - n;
-				memset(buf + n, 0xff, gflag);
-				fprintf(stderr, "adding %d bytes of garbage\n", gflag);
-				n = sizeof(buf);
-			}
-		}
-		if (!fwrite(buf, n, 1, out)) {
-		FWRITE_ERROR:
-			fprintf(stderr, "fwrite error\n");
-			return EXIT_FAILURE;
-		}
-	}
-	
-	if (ferror(in)) {
-		goto FREAD_ERROR;
-	}
-
-	if (fflush(out)) {
-		goto FWRITE_ERROR;
-	}
-
-	fclose(in);
-	fclose(out);
-
-	return EXIT_SUCCESS;
-}
-

--- a/package/openwrt/openwrt.mk
+++ b/package/openwrt/openwrt.mk
@@ -97,11 +97,13 @@
 	rm -rf $(LINKSYS_WLCONF_DIR)
 
 # mtd tool
-OPENWRT_MTD_SOURCE=package/openwrt/mtd.c
+OPENWRT_MTD_SOURCE=./mtd.c
 OPENWRT_MTD_TARGET_BINARY:=sbin/mtd
 
 $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY): 
-		$(TARGET_CC) -o $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY) $(OPENWRT_MTD_SOURCE)
+	$(TARGET_CC) -o $@ $(OPENWRT_MTD_SOURCE)
+	$(STRIP) $@
+
 
 openwrt-mtd: $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY)
 
@@ -109,58 +111,22 @@
 	rm $(TARGET_DIR)/$(OPENWRT_MTD_TARGET_BINARY)
 
 # jffs2root tool
-OPENWRT_JFFS2ROOT_SOURCE=package/openwrt/jffs2root.c
+OPENWRT_JFFS2ROOT_SOURCE=./jffs2root.c
 OPENWRT_JFFS2ROOT_TARGET_BINARY:=sbin/jffs2root
 
-$(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY): openwrt
-		$(TARGET_CC) -o $(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY) $(OPENWRT_JFFS2ROOT_SOURCE)
+$(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY): 
+	$(TARGET_CC) -o $@ $(OPENWRT_JFFS2ROOT_SOURCE)
+	$(STRIP) $@
 
 openwrt-jffs2root: $(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY)
 
 openwrt-jffs2root-clean:
 	rm $(TARGET_DIR)/$(OPENWRT_JFFS2ROOT_TARGET_BINARY)
 
-# trx tool
-OPENWRT_TRX_SOURCE=package/openwrt/trx.c
-OPENWRT_TRX_TARGET=$(STAGING_DIR)/bin/trx
-
-$(OPENWRT_TRX_TARGET): 
-		$(CC) -o $(OPENWRT_TRX_TARGET) $(OPENWRT_TRX_SOURCE)
-
-openwrt-trx: $(OPENWRT_TRX_TARGET)
-
-openwrt-trx-clean: 
-	rm $(OPENWRT_TRX_TARGET)
-
-# addpattern tool
-OPENWRT_ADDPATTERN_SOURCE=package/openwrt/addpattern.c
-OPENWRT_ADDPATTERN_TARGET=$(STAGING_DIR)/bin/addpattern
-
-$(OPENWRT_ADDPATTERN_TARGET): 
-		$(CC) -o $(OPENWRT_ADDPATTERN_TARGET) $(OPENWRT_ADDPATTERN_SOURCE)
-
-openwrt-addpattern: $(OPENWRT_ADDPATTERN_TARGET)
-
-openwrt-addpattern-clean: 
-	rm $(OPENWRT_ADDPATTERN_TARGET)
-
-# sstrip tool
-OPENWRT_SSTRIP_SOURCE=package/openwrt/sstrip.c
-OPENWRT_SSTRIP_TARGET=$(STAGING_DIR)/bin/sstrip
-
-$(OPENWRT_SSTRIP_TARGET):
-		$(CC) -o $(OPENWRT_SSTRIP_TARGET) $(OPENWRT_SSTRIP_SOURCE)
-
-openwrt-sstrip: $(OPENWRT_SSTRIP_TARGET)
-
-openwrt-sstrip-clean:
-	rm $(OPENWRT_SSTRIP_TARGET)
-
-SSTRIP=$(OPENWRT_SSTRIP_TARGET)
 
 linksys:	linksys-shared linksys-nvram linksys-wlconf
 
-openwrt:	linksys openwrt-mtd openwrt-trx openwrt-addpattern openwrt-sstrip
+openwrt:	linksys openwrt-mtd openwrt-jffs2root
 
 openwrt-dirclean: linksys-shared-dirclean linksys-nvram-dirclean linksys-wlconf-dirclean
 

--- a/package/openwrt/sstrip.c
+++ /dev/null
@@ -1,484 +1,1 @@
-/* http://www.muppetlabs.com/~breadbox/software/elfkickers.html */
 
-/* sstrip: Copyright (C) 1999-2001 by Brian Raiter, under the GNU
- * General Public License. No warranty. See COPYING for details.
- *
- * Aug 23, 2004 Hacked by Manuel Novoa III <mjn3@codepoet.org> to
- * handle targets of different endianness and/or elf class, making
- * it more useful in a cross-devel environment.
- */
-
-/* ============== original README ===================
- *
- * sstrip is a small utility that removes the contents at the end of an
- * ELF file that are not part of the program's memory image.
- * 
- * Most ELF executables are built with both a program header table and a
- * section header table. However, only the former is required in order
- * for the OS to load, link and execute a program. sstrip attempts to
- * extract the ELF header, the program header table, and its contents,
- * leaving everything else in the bit bucket. It can only remove parts of
- * the file that occur at the end, after the parts to be saved. However,
- * this almost always includes the section header table, and occasionally
- * a few random sections that are not used when running a program.
- * 
- * It should be noted that the GNU bfd library is (understandably)
- * dependent on the section header table as an index to the file's
- * contents. Thus, an executable file that has no section header table
- * cannot be used with gdb, objdump, or any other program based upon the
- * bfd library, at all. In fact, the program will not even recognize the
- * file as a valid executable. (This limitation is noted in the source
- * code comments for bfd, and is marked "FIXME", so this may change at
- * some future date. However, I would imagine that it is a pretty
- * low-priority item, as executables without a section header table are
- * rare in the extreme.) This probably also explains why strip doesn't
- * offer the option to do this.
- * 
- * Shared library files may also have their section header table removed.
- * Such a library will still function; however, it will no longer be
- * possible for a compiler to link a new program against it.
- * 
- * As an added bonus, sstrip also tries to removes trailing zero bytes
- * from the end of the file. (This normally cannot be done with an
- * executable that has a section header table.)
- * 
- * sstrip is a very simplistic program. It depends upon the common
- * practice of putting the parts of the file that contribute to the
- * memory image at the front, and the remaining material at the end. This
- * permits it to discard the latter material without affecting file
- * offsets and memory addresses in what remains. Of course, the ELF
- * standard permits files to be organized in almost any order, so if a
- * pathological linker decided to put its section headers at the top,
- * sstrip would be useless on such executables.
- */
-
-#include	<stdio.h>
-#include	<stdlib.h>
-#include	<string.h>
-#include	<errno.h>
-#include	<unistd.h>
-#include	<fcntl.h>
-#include	<elf.h>
-#ifdef __FreeBSD__
-/**
- * This seems to work on FreeBSD 5.3, should
- * work on all newer versions as well. I have
- * no idea if it will work on versions < 5.3
- *
- * Joe Estock (guru) <jestock at nutextonline.com>
- */
-#include <sys/endian.h>
-#define bswap_64 __bswap64
-#define bswap_32 __bswap32
-#define bswap_16 __bswap16
-#else
-#include	<endian.h>
-#include	<byteswap.h>
-#endif /* defined(__FreeBSD__) */
-
-
-#ifndef TRUE
-#define	TRUE		1
-#define	FALSE		0
-#endif
-
-/* The name of the program.
- */
-static char const	*progname;
-
-/* The name of the current file.
- */
-static char const	*filename;
-
-
-/* A simple error-handling function. FALSE is always returned for the
- * convenience of the caller.
- */
-static int err(char const *errmsg)
-{
-	fprintf(stderr, "%s: %s: %s\n", progname, filename, errmsg);
-	return FALSE;
-}
-
-/* A flag to signal the need for endian reversal.
- */
-static int do_reverse_endian;
-
-/* Get a value from the elf header, compensating for endianness.
- */
-#define EGET(X) \
-	(__extension__ ({ \
-		uint64_t __res; \
-		if (!do_reverse_endian) { \
-			__res = (X); \
-		} else if (sizeof(X) == 1) { \
-			__res = (X); \
-		} else if (sizeof(X) == 2) { \
-			__res = bswap_16((X)); \
-		} else if (sizeof(X) == 4) { \
-			__res = bswap_32((X)); \
-		} else if (sizeof(X) == 8) { \
-			__res = bswap_64((X)); \
-		} else { \
-			fprintf(stderr, "%s: %s: EGET failed for size %d\n", \
-					progname, filename, sizeof(X)); \
-			exit(EXIT_FAILURE); \
-		} \
-		__res; \
-	}))
-
-/* Set a value 'Y' in the elf header to 'X', compensating for endianness.
- */
-#define ESET(Y,X) \
-		do if (!do_reverse_endian) { \
-			Y = (X); \
-		} else if (sizeof(Y) == 1) { \
-			Y = (X); \
-		} else if (sizeof(Y) == 2) { \
-			Y = bswap_16((uint16_t)(X)); \
-		} else if (sizeof(Y) == 4) { \
-			Y = bswap_32((uint32_t)(X)); \
-		} else if (sizeof(Y) == 8) { \
-			Y = bswap_64((uint64_t)(X)); \
-		} else { \
-			fprintf(stderr, "%s: %s: ESET failed for size %d\n", \
-					progname, filename, sizeof(Y)); \
-			exit(EXIT_FAILURE); \
-		} while (0)
-
-
-/* A macro for I/O errors: The given error message is used only when
- * errno is not set.
- */
-#define	ferr(msg)	(err(errno ? strerror(errno) : (msg)))
-
-
-
-#define HEADER_FUNCTIONS(CLASS) \
- \
-/* readelfheader() reads the ELF header into our global variable, and \
- * checks to make sure that this is in fact a file that we should be \
- * munging. \
- */ \
-static int readelfheader ## CLASS (int fd, Elf ## CLASS ## _Ehdr *ehdr) \
-{ \
-	 if (read(fd, ((char *)ehdr)+EI_NIDENT, sizeof(*ehdr) - EI_NIDENT) \
-		!= sizeof(*ehdr) - EI_NIDENT) \
-		return ferr("missing or incomplete ELF header."); \
- \
-	/* Verify the sizes of the ELF header and the program segment \
-	 * header table entries. \
-	 */ \
-	if (EGET(ehdr->e_ehsize) != sizeof(Elf ## CLASS ## _Ehdr)) \
-		return err("unrecognized ELF header size."); \
-	if (EGET(ehdr->e_phentsize) != sizeof(Elf ## CLASS ## _Phdr)) \
-		return err("unrecognized program segment header size."); \
- \
-	/* Finally, check the file type. \
-	 */ \
-	if (EGET(ehdr->e_type) != ET_EXEC && EGET(ehdr->e_type) != ET_DYN) \
-		return err("not an executable or shared-object library."); \
- \
-	return TRUE; \
-} \
- \
-/* readphdrtable() loads the program segment header table into memory. \
- */ \
-static int readphdrtable ## CLASS (int fd, Elf ## CLASS ## _Ehdr const *ehdr, \
-								   Elf ## CLASS ## _Phdr **phdrs) \
-{ \
-	size_t	size; \
- \
-	if (!EGET(ehdr->e_phoff) || !EGET(ehdr->e_phnum) \
-)		return err("ELF file has no program header table."); \
- \
-	size = EGET(ehdr->e_phnum) * sizeof **phdrs; \
-	if (!(*phdrs = malloc(size))) \
-		return err("Out of memory!"); \
- \
-	errno = 0; \
-	if (read(fd, *phdrs, size) != (ssize_t)size) \
-		return ferr("missing or incomplete program segment header table."); \
- \
-	return TRUE; \
-} \
- \
-/* getmemorysize() determines the offset of the last byte of the file \
- * that is referenced by an entry in the program segment header table. \
- * (Anything in the file after that point is not used when the program \
- * is executing, and thus can be safely discarded.) \
- */ \
-static int getmemorysize ## CLASS (Elf ## CLASS ## _Ehdr const *ehdr, \
-								   Elf ## CLASS ## _Phdr const *phdrs, \
-						 unsigned long *newsize) \
-{ \
-	Elf ## CLASS ## _Phdr const   *phdr; \
-	unsigned long	size, n; \
-	int			i; \
- \
-	/* Start by setting the size to include the ELF header and the \
-	 * complete program segment header table. \
-	 */ \
-	size = EGET(ehdr->e_phoff) + EGET(ehdr->e_phnum) * sizeof *phdrs; \
-	if (size < sizeof *ehdr) \
-		size = sizeof *ehdr; \
- \
-	/* Then keep extending the size to include whatever data the \
-	 * program segment header table references. \
-	 */ \
-	for (i = 0, phdr = phdrs ; i < EGET(ehdr->e_phnum) ; ++i, ++phdr) { \
-		if (EGET(phdr->p_type) != PT_NULL) { \
-			n = EGET(phdr->p_offset) + EGET(phdr->p_filesz); \
-			if (n > size) \
-				size = n; \
-		} \
-	} \
- \
-	*newsize = size; \
-	return TRUE; \
-} \
- \
-/* modifyheaders() removes references to the section header table if \
- * it was stripped, and reduces program header table entries that \
- * included truncated bytes at the end of the file. \
- */ \
-static int modifyheaders ## CLASS (Elf ## CLASS ## _Ehdr *ehdr, \
-								   Elf ## CLASS ## _Phdr *phdrs, \
-								   unsigned long newsize) \
-{ \
-	Elf ## CLASS ## _Phdr *phdr; \
-	int		i; \
- \
-	/* If the section header table is gone, then remove all references \
-	 * to it in the ELF header. \
-	 */ \
-	if (EGET(ehdr->e_shoff) >= newsize) { \
-		ESET(ehdr->e_shoff,0); \
-		ESET(ehdr->e_shnum,0); \
-		ESET(ehdr->e_shentsize,0); \
-		ESET(ehdr->e_shstrndx,0); \
-	} \
- \
-	/* The program adjusts the file size of any segment that was \
-	 * truncated. The case of a segment being completely stripped out \
-	 * is handled separately. \
-	 */ \
-	for (i = 0, phdr = phdrs ; i < EGET(ehdr->e_phnum) ; ++i, ++phdr) { \
-		if (EGET(phdr->p_offset) >= newsize) { \
-			ESET(phdr->p_offset,newsize); \
-			ESET(phdr->p_filesz,0); \
-		} else if (EGET(phdr->p_offset) + EGET(phdr->p_filesz) > newsize) { \
-			newsize -= EGET(phdr->p_offset); \
-			ESET(phdr->p_filesz, newsize); \
-		} \
-	} \
- \
-	return TRUE; \
-} \
- \
-/* commitchanges() writes the new headers back to the original file \
- * and sets the file to its new size. \
- */ \
-static int commitchanges ## CLASS (int fd, Elf ## CLASS ## _Ehdr const *ehdr, \
-								   Elf ## CLASS ## _Phdr *phdrs, \
-								   unsigned long newsize) \
-{ \
-	size_t	n; \
- \
-	/* Save the changes to the ELF header, if any. \
-	 */ \
-	if (lseek(fd, 0, SEEK_SET)) \
-		return ferr("could not rewind file"); \
-	errno = 0; \
-	if (write(fd, ehdr, sizeof *ehdr) != sizeof *ehdr) \
-		return err("could not modify file"); \
- \
-	/* Save the changes to the program segment header table, if any. \
-	 */ \
-	if (lseek(fd, EGET(ehdr->e_phoff), SEEK_SET) == (off_t)-1) { \
-		err("could not seek in file."); \
-		goto warning; \
-	} \
-	n = EGET(ehdr->e_phnum) * sizeof *phdrs; \
-	if (write(fd, phdrs, n) != (ssize_t)n) { \
-		err("could not write to file"); \
-		goto warning; \
-	} \
- \
-	/* Eleventh-hour sanity check: don't truncate before the end of \
-	 * the program segment header table. \
-	 */ \
-	if (newsize < EGET(ehdr->e_phoff) + n) \
-		newsize = EGET(ehdr->e_phoff) + n; \
- \
-	/* Chop off the end of the file. \
-	 */ \
-	if (ftruncate(fd, newsize)) { \
-		err("could not resize file"); \
-		goto warning; \
-	} \
- \
-	return TRUE; \
- \
- warning: \
-	return err("ELF file may have been corrupted!"); \
-}
-
-
-/* First elements of Elf32_Ehdr and Elf64_Ehdr are common.
- */
-static int readelfheaderident(int fd, Elf32_Ehdr *ehdr)
-{
-	errno = 0;
-	if (read(fd, ehdr, EI_NIDENT) != EI_NIDENT)
-		return ferr("missing or incomplete ELF header.");
-
-	/* Check the ELF signature.
-	 */
-	if (!(ehdr->e_ident[EI_MAG0] == ELFMAG0 &&
-		  ehdr->e_ident[EI_MAG1] == ELFMAG1 &&
-		  ehdr->e_ident[EI_MAG2] == ELFMAG2 &&
-		  ehdr->e_ident[EI_MAG3] == ELFMAG3))
-	{
-		err("missing ELF signature.");
-		return -1;
-	}
-
-	/* Compare the file's class and endianness with the program's.
-	 */
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-	if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
-		do_reverse_endian = 0;
-	} else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
-/* 		fprintf(stderr, "ELF file has different endianness.\n"); */
-		do_reverse_endian = 1;
-	}
-#elif __BYTE_ORDER == __BIG_ENDIAN
-	if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
-/* 		fprintf(stderr, "ELF file has different endianness.\n"); */
-		do_reverse_endian = 1;
-	} else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
-		do_reverse_endian = 0;
-	}
-#else
-#error unkown endianness
-#endif
-	else {
-		err("Unsupported endianness");
-		return -1;
-	}
-
-	/* Check the target architecture.
-	 */
-/*	 if (EGET(ehdr->e_machine) != ELF_ARCH) { */
-/* 		/\* return err("ELF file created for different architecture."); *\/ */
-/* 		fprintf(stderr, "ELF file created for different architecture.\n"); */
-/* 	} */
-	return ehdr->e_ident[EI_CLASS];
-}
-
-
-HEADER_FUNCTIONS(32)
-
-HEADER_FUNCTIONS(64)
-
-/* truncatezeros() examines the bytes at the end of the file's
- * size-to-be, and reduces the size to exclude any trailing zero
- * bytes.
- */
-static int truncatezeros(int fd, unsigned long *newsize)
-{
-	unsigned char	contents[1024];
-	unsigned long	size, n;
-
-	size = *newsize;
-	do {
-		n = sizeof contents;
-		if (n > size)
-			n = size;
-		if (lseek(fd, size - n, SEEK_SET) == (off_t)-1)
-			return ferr("cannot seek in file.");
-		if (read(fd, contents, n) != (ssize_t)n)
-			return ferr("cannot read file contents");
-		while (n && !contents[--n])
-			--size;
-	} while (size && !n);
-
-	/* Sanity check.
-	 */
-	if (!size)
-		return err("ELF file is completely blank!");
-
-	*newsize = size;
-	return TRUE;
-}
-
-/* main() loops over the cmdline arguments, leaving all the real work
- * to the other functions.
- */
-int main(int argc, char *argv[])
-{
-	int				fd;
-	union {
-		Elf32_Ehdr	ehdr32;
-		Elf64_Ehdr	ehdr64;
-	} e;
-	union {
-		Elf32_Phdr	*phdrs32;
-		Elf64_Phdr	*phdrs64;
-	} p;
-	unsigned long	newsize;
-	char			**arg;
-	int				failures = 0;
-
-	if (argc < 2 || argv[1][0] == '-') {
-		printf("Usage: sstrip FILE...\n"
-			   "sstrip discards all nonessential bytes from an executable.\n\n"
-			   "Version 2.0-X Copyright (C) 2000,2001 Brian Raiter.\n"
-			   "Cross-devel hacks Copyright (C) 2004 Manuel Novoa III.\n"
-			   "This program is free software, licensed under the GNU\n"
-			   "General Public License. There is absolutely no warranty.\n");
-		return EXIT_SUCCESS;
-	}
-
-	progname = argv[0];
-
-	for (arg = argv + 1 ; *arg != NULL ; ++arg) {
-		filename = *arg;
-
-		fd = open(*arg, O_RDWR);
-		if (fd < 0) {
-			ferr("can't open");
-			++failures;
-			continue;
-		}
-
-		switch (readelfheaderident(fd, &e.ehdr32)) {
-			case ELFCLASS32:
-				if (!(readelfheader32(fd, &e.ehdr32)					&&
-					  readphdrtable32(fd, &e.ehdr32, &p.phdrs32)		&&
-					  getmemorysize32(&e.ehdr32, p.phdrs32, &newsize)	&&
-					  truncatezeros(fd, &newsize)						&&
-					  modifyheaders32(&e.ehdr32, p.phdrs32, newsize)	&&
-					  commitchanges32(fd, &e.ehdr32, p.phdrs32, newsize)))
-					++failures;
-				break;
-			case ELFCLASS64:
-				if (!(readelfheader64(fd, &e.ehdr64)					&&
-					  readphdrtable64(fd, &e.ehdr64, &p.phdrs64)		&&
-					  getmemorysize64(&e.ehdr64, p.phdrs64, &newsize)	&&
-					  truncatezeros(fd, &newsize)						&&
-					  modifyheaders64(&e.ehdr64, p.phdrs64, newsize)	&&
-					  commitchanges64(fd, &e.ehdr64, p.phdrs64, newsize)))
-					++failures;
-				break;
-			default:
-				++failures;
-				break;
-		}
-		close(fd);
-	}
-
-	return failures ? EXIT_FAILURE : EXIT_SUCCESS;
-}
-

file:a/package/openwrt/trx.c (deleted)
--- a/package/openwrt/trx.c
+++ /dev/null
@@ -1,356 +1,1 @@
-/*
- * Copyright (C) 2004  Manuel Novoa III  <mjn3@codepoet.org>
- *
- * 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 of the License, 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.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
 
-/* July 29, 2004
- *
- * This is a hacked replacement for the 'trx' utility used to create
- * wrt54g .trx firmware files.  It isn't pretty, but it does the job
- * for me.
- *
- * As an extension, you can specify a larger maximum length for the
- * .trx file using '-m'.  It will be rounded up to be a multiple of 4K.
- * NOTE: This space will be malloc()'d.
- *
- * August 16, 2004
- *
- * Sigh... Make it endian-neutral.
- *
- * TODO: Support '-b' option to specify offsets for each file.
- *
- * February 19, 2005 - mbm
- *
- * Add -a (align offset) and -b (absolute offset)
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <endian.h>
-#include <byteswap.h>
-
-#if __BYTE_ORDER == __BIG_ENDIAN
-#define STORE32_LE(X)		bswap_32(X)
-#elif __BYTE_ORDER == __LITTLE_ENDIAN
-#define STORE32_LE(X)		(X)
-#else
-#error unkown endianness!
-#endif
-
-uint32_t crc32buf(char *buf, size_t len);
-
-/**********************************************************************/
-/* from trxhdr.h */
-
-#define TRX_MAGIC	0x30524448	/* "HDR0" */
-#define TRX_VERSION	1
-#define TRX_MAX_LEN	0x3A0000
-#define TRX_NO_HEADER	1		/* Do not write TRX header */	
-
-struct trx_header {
-	uint32_t magic;			/* "HDR0" */
-	uint32_t len;			/* Length of file including header */
-	uint32_t crc32;			/* 32-bit CRC from flag_version to end of file */
-	uint32_t flag_version;	/* 0:15 flags, 16:31 version */
-	uint32_t offsets[3];	/* Offsets of partitions from start of header */
-};
-
-/**********************************************************************/
-
-void usage(void) __attribute__ (( __noreturn__ ));
-
-void usage(void)
-{
-	fprintf(stderr, "Usage: trx [-o outfile] [-m maxlen] [-a align] [-b offset] file [file [file]]\n");
-	exit(EXIT_FAILURE);
-}
-
-int main(int argc, char **argv)
-{
-	FILE *out = stdout;
-	FILE *in;
-	char *ofn = NULL;
-	char *buf;
-	char *e;
-	int c, i;
-	size_t n;
-	uint32_t cur_len;
-	unsigned long maxlen = TRX_MAX_LEN;
-	struct trx_header *p;
-
-	fprintf(stderr, "mjn3's trx replacement - v0.81.1\n");
-
-	if (!(buf = malloc(maxlen))) {
-		fprintf(stderr, "malloc failed\n");
-		return EXIT_FAILURE;
-	}
-
-	p = (struct trx_header *) buf;
-
-	p->magic = STORE32_LE(TRX_MAGIC);
-	cur_len = sizeof(struct trx_header);
-	p->flag_version = STORE32_LE((TRX_VERSION << 16));
-
-	in = NULL;
-	i = 0;
-
-	while ((c = getopt(argc, argv, "-:o:m:a:b:")) != -1) {
-		switch (c) {
-			case 1:
-				p->offsets[i++] = STORE32_LE(cur_len);
-
-				if (!(in = fopen(optarg, "r"))) {
-					fprintf(stderr, "can not open \"%s\" for reading\n", optarg);
-					usage();
-				}
-				n = fread(buf + cur_len, 1, maxlen - cur_len, in);
-				if (!feof(in)) {
-					fprintf(stderr, "fread failure or file \"%s\" too large\n",optarg);
-					fclose(in);
-					return EXIT_FAILURE;
-				}
-				fclose(in);
-#undef  ROUND
-#define ROUND 4
-				if (n & (ROUND-1)) {
-					memset(buf + cur_len + n, 0, ROUND - (n & (ROUND-1)));
-					n += ROUND - (n & (ROUND-1));
-				}
-				cur_len += n;
-
-				break;
-			case 'o':
-				ofn = optarg;
-				if (ofn && !(out = fopen(ofn, "w"))) {
-					fprintf(stderr, "can not open \"%s\" for writing\n", ofn);
-					usage();
-				}
-
-				break;
-			case 'm':
-				errno = 0;
-				maxlen = strtoul(optarg, &e, 0);
-				if (errno || (e == optarg) || *e) {
-					fprintf(stderr, "illegal numeric string\n");
-					usage();
-				}
-#undef  ROUND
-#define ROUND 0x1000
-				if (maxlen & (ROUND-1)) {
-					maxlen += (ROUND - (maxlen & (ROUND-1)));
-				}
-				if (maxlen < ROUND) {
-					fprintf(stderr, "maxlen too small (or wrapped)\n");
-					usage();
-				}
-				if (maxlen > TRX_MAX_LEN) {
-					fprintf(stderr, "WARNING: maxlen exceeds default maximum!  Beware of overwriting nvram!\n");
-				}
-				if (!(buf = realloc(buf,maxlen))) {
-					fprintf(stderr, "realloc failed");
-					return EXIT_FAILURE;
-				}
-				break;
-			case 'a':
-				errno = 0;
-				n = strtoul(optarg, &e, 0);
-				if (errno || (e == optarg) || *e) {
-					fprintf(stderr, "illegal numeric string\n");
-					usage();
-				}
-				if (cur_len & (n-1)) {
-					n = n - (cur_len & (n-1));
-					memset(buf + cur_len, 0, n);
-					cur_len += n;
-				}
-				break;
-			case 'b':
-				errno = 0;
-				n = strtoul(optarg, &e, 0);
-				if (errno || (e == optarg) || *e) {
-					fprintf(stderr, "illegal numeric string\n");
-					usage();
-				}
-				if (n < cur_len) {
-					fprintf(stderr, "WARNING: current length exceeds -b %d offset\n",n);
-				} else {
-					memset(buf + cur_len, 0, n - cur_len);
-					cur_len = n;
-				}
-				break;
-			default:
-				usage();
-		}
-	}
-
-	if (!in) {
-		fprintf(stderr, "we require atleast one filename\n");
-		usage();
-	}
-
-#undef  ROUND
-#define ROUND 0x1000
-	n = cur_len & (ROUND-1);
-	if (n) {
-		memset(buf + cur_len, 0, ROUND - n);
-		cur_len += ROUND - n;
-	}
-
-	p->crc32 = crc32buf((char *) &p->flag_version,
-						cur_len - offsetof(struct trx_header, flag_version));
-	p->crc32 = STORE32_LE(p->crc32);
-
-	p->len = STORE32_LE(cur_len);
-
-	if (!fwrite(buf, cur_len, 1, out) || fflush(out)) {
-		fprintf(stderr, "fwrite failed\n");
-		return EXIT_FAILURE;
-	}
-
-	fclose(out);
-
-	return EXIT_SUCCESS;
-}
-
-/**********************************************************************/
-/* The following was grabbed and tweaked from the old snippets collection
- * of public domain C code. */
-
-/**********************************************************************\
-|* Demonstration program to compute the 32-bit CRC used as the frame  *|
-|* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|
-|* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|
-|* protocol).  The 32-bit FCS was added via the Federal Register,     *|
-|* 1 June 1982, p.23798.  I presume but don't know for certain that   *|
-|* this polynomial is or will be included in CCITT V.41, which        *|
-|* defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|
-|* PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|
-|* errors by a factor of 10^-5 over 16-bit FCS.                       *|
-\**********************************************************************/
-
-/* Copyright (C) 1986 Gary S. Brown.  You may use this program, or
-   code or tables extracted from it, as desired without restriction.*/
-
-/* First, the polynomial itself and its table of feedback terms.  The  */
-/* polynomial is                                                       */
-/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
-/* Note that we take it "backwards" and put the highest-order term in  */
-/* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
-/* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
-/* the MSB being 1.                                                    */
-
-/* Note that the usual hardware shift register implementation, which   */
-/* is what we're using (we're merely optimizing it by doing eight-bit  */
-/* chunks at a time) shifts bits into the lowest-order term.  In our   */
-/* implementation, that means shifting towards the right.  Why do we   */
-/* do it this way?  Because the calculated CRC must be transmitted in  */
-/* order from highest-order term to lowest-order term.  UARTs transmit */
-/* characters in order from LSB to MSB.  By storing the CRC this way,  */
-/* we hand it to the UART in the order low-byte to high-byte; the UART */
-/* sends each low-bit to hight-bit; and the result is transmission bit */
-/* by bit from highest- to lowest-order term without requiring any bit */
-/* shuffling on our part.  Reception works similarly.                  */
-
-/* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
-/*                                                                     */
-/*  1. The table can be generated at runtime if desired; code to do so */
-/*     is shown later.  It might not be obvious, but the feedback      */
-/*     terms simply represent the results of eight shift/xor opera-    */
-/*     tions for all combinations of data and CRC register values.     */
-/*                                                                     */
-/*  2. The CRC accumulation logic is the same for all CRC polynomials, */
-/*     be they sixteen or thirty-two bits wide.  You simply choose the */
-/*     appropriate table.  Alternatively, because the table can be     */
-/*     generated at runtime, you can start by generating the table for */
-/*     the polynomial in question and use exactly the same "updcrc",   */
-/*     if your application needn't simultaneously handle two CRC       */
-/*     polynomials.  (Note, however, that XMODEM is strange.)          */
-/*                                                                     */
-/*  3. For 16-bit CRCs, the table entries need be only 16 bits wide;   */
-/*     of course, 32-bit entries work OK if the high 16 bits are zero. */
-/*                                                                     */
-/*  4. The values must be right-shifted by eight bits by the "updcrc"  */
-/*     logic; the shift must be unsigned (bring in zeroes).  On some   */
-/*     hardware you could probably optimize the shift in assembler by  */
-/*     using byte-swap instructions.                                   */
-
-static const uint32_t crc_32_tab[] = { /* CRC polynomial 0xedb88320 */
-0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
-0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
-0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
-0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
-0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
-0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
-0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
-0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
-0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
-0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
-0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
-0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
-0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
-0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
-0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
-0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
-0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
-0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
-0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
-0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
-0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
-0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
-0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
-0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
-0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
-0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
-0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
-0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
-0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
-0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
-0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
-0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
-0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
-0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
-0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
-0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
-0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
-0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
-0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
-0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
-0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
-0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
-0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
-};
-
-#define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
-
-uint32_t crc32buf(char *buf, size_t len)
-{
-      uint32_t crc;
-
-      crc = 0xFFFFFFFF;
-
-      for ( ; len; --len, ++buf)
-      {
-            crc = UPDC32(*buf, crc);
-      }
-
-      return crc;
-}
-

file:a/package/sed/Config.in (deleted)
--- a/package/sed/Config.in
+++ /dev/null
@@ -1,10 +1,1 @@
-config BR2_PACKAGE_SED
-	bool "sed"
-	default n
-	help
-	  Super-useful stream editor.
 
-	  http://sed.sourceforge.net/
-
-	  Most people will answer Y.
-

file:a/package/sed/sed.mk (deleted)
--- a/package/sed/sed.mk
+++ /dev/null
@@ -1,137 +1,1 @@
-#############################################################
-#
-# sed
-#
-#############################################################
-SED_VER:=4.1.2
-SED_SOURCE:=sed-$(SED_VER).tar.gz
-SED_SITE:=ftp://ftp.gnu.org/gnu/sed
-SED_CAT:=zcat
-SED_DIR1:=$(TOOL_BUILD_DIR)/sed-$(SED_VER)
-SED_DIR2:=$(BUILD_DIR)/sed-$(SED_VER)
-SED_BINARY:=sed/sed
-SED_TARGET_BINARY:=bin/sed
-ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true)
-SED_CPPFLAGS=-D_FILE_OFFSET_BITS=64
-endif
-SED:=$(STAGING_DIR)/bin/sed -i -e
-HOST_SED_TARGET=$(shell package/sed/sedcheck.sh)
 
-$(DL_DIR)/$(SED_SOURCE):
-	mkdir -p $(DL_DIR)
-	$(WGET) -P $(DL_DIR) $(SED_SITE)/$(SED_SOURCE)
-
-sed-source: $(DL_DIR)/$(SED_SOURCE)
-
-
-#############################################################
-#
-# build sed for use on the host system
-#
-#############################################################
-$(SED_DIR1)/.unpacked: $(DL_DIR)/$(SED_SOURCE)
-	mkdir -p $(TOOL_BUILD_DIR)
-	mkdir -p $(STAGING_DIR)/bin;
-	$(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) -
-	touch $(SED_DIR1)/.unpacked
-
-$(SED_DIR1)/.configured: $(SED_DIR1)/.unpacked
-	(cd $(SED_DIR1); rm -rf config.cache; \
-		./configure \
-		--prefix=$(STAGING_DIR) \
-		--prefix=/usr \
-	);
-	touch  $(SED_DIR1)/.configured
-
-$(SED_DIR1)/$(SED_BINARY): $(SED_DIR1)/.configured
-	$(MAKE) -C $(SED_DIR1)
-
-# This stuff is needed to work around GNU make deficiencies
-build-sed-host-binary: $(SED_DIR1)/$(SED_BINARY)
-	@if [ -L $(STAGING_DIR)/$(SED_TARGET_BINARY) ] ; then \
-		rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); fi;
-	@if [ ! -f $(STAGING_DIR)/$(SED_TARGET_BINARY) -o $(STAGING_DIR)/$(SED_TARGET_BINARY) \
-	-ot $(SED_DIR1)/$(SED_BINARY) ] ; then \
-	    set -x; \
-	    mkdir -p $(STAGING_DIR)/bin; \
-	    $(MAKE) DESTDIR=$(STAGING_DIR) -C $(SED_DIR1) install; \
-	    mv $(STAGING_DIR)/usr/bin/sed $(STAGING_DIR)/bin/; \
-	    rm -rf $(STAGING_DIR)/share/locale $(STAGING_DIR)/usr/info \
-		    $(STAGING_DIR)/usr/man $(STAGING_DIR)/usr/share/doc; fi
-
-use-sed-host-binary:
-	@if [ -x /usr/bin/sed ]; then SED="/usr/bin/sed"; else \
-	    if [ -x /bin/sed ]; then SED="/bin/sed"; fi; fi; \
-	    mkdir -p $(STAGING_DIR)/bin; \
-	    rm -f $(STAGING_DIR)/$(SED_TARGET_BINARY); \
-	    ln -s $$SED $(STAGING_DIR)/$(SED_TARGET_BINARY)
-
-host-sed: $(HOST_SED_TARGET)
-
-host-sed-clean:
-	-$(MAKE) -C $(SED_DIR1) clean
-
-host-sed-toolclean:
-	rm -rf $(SED_DIR1)
-
-
-#############################################################
-#
-# build sed for use on the target system
-#
-#############################################################
-$(SED_DIR2)/.unpacked: $(DL_DIR)/$(SED_SOURCE)
-	$(SED_CAT) $(DL_DIR)/$(SED_SOURCE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
-	touch $(SED_DIR2)/.unpacked
-
-$(SED_DIR2)/.configured: $(SED_DIR2)/.unpacked
-	(cd $(SED_DIR2); rm -rf config.cache; \
-		$(TARGET_CONFIGURE_OPTS) \
-		CFLAGS="$(TARGET_CFLAGS)" \
-		CPPFLAGS="$(SED_CFLAGS)" \
-		./configure \
-		--target=$(GNU_TARGET_NAME) \
-		--host=$(GNU_TARGET_NAME) \
-		--build=$(GNU_HOST_NAME) \
-		--prefix=/usr \
-		--exec-prefix=/usr \
-		--bindir=/usr/bin \
-		--sbindir=/usr/sbin \
-		--libexecdir=/usr/lib \
-		--sysconfdir=/etc \
-		--datadir=/usr/share \
-		--localstatedir=/var \
-		--mandir=/usr/man \
-		--infodir=/usr/info \
-		$(DISABLE_NLS) \
-	);
-	touch  $(SED_DIR2)/.configured
-
-$(SED_DIR2)/$(SED_BINARY): $(SED_DIR2)/.configured
-	$(MAKE) CC=$(TARGET_CC) -C $(SED_DIR2)
-
-# This stuff is needed to work around GNU make deficiencies
-sed-target_binary: $(SED_DIR2)/$(SED_BINARY)
-	@if [ -L $(TARGET_DIR)/$(SED_TARGET_BINARY) ] ; then \
-		rm -f $(TARGET_DIR)/$(SED_TARGET_BINARY); fi;
-
-	@if [ ! -f $(SED_DIR2)/$(SED_BINARY) -o $(TARGET_DIR)/$(SED_TARGET_BINARY) \
-	-ot $(SED_DIR2)/$(SED_BINARY) ] ; then \
-	    set -x; \
-	    $(MAKE) DESTDIR=$(TARGET_DIR) CC=$(TARGET_CC) -C $(SED_DIR2) install; \
-	    mv $(TARGET_DIR)/usr/bin/sed $(TARGET_DIR)/bin/; \
-	    rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \
-		    $(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc; fi
-
-sed: uclibc sed-target_binary
-
-sed-clean:
-	-$(MAKE) -C $(SED_DIR2) clean
-
-sed-dirclean:
-	rm -rf $(SED_DIR2)
-
-ifeq ($(strip $(BR2_PACKAGE_SED)),y)
-TARGETS+=sed
-endif
-

file:a/package/sed/sedcheck.sh (deleted)
--- a/package/sed/sedcheck.sh
+++ /dev/null
@@ -1,22 +1,1 @@
-#!/bin/sh
 
-if [ -x /usr/bin/sed ]; then 
-    SED="/usr/bin/sed";
-else
-    if [ -x /bin/sed ]; then 
-	SED="/bin/sed";
-    fi;
-fi;
-
-echo "HELLO" > .sedtest
-$SED -i -e "s/HELLO/GOODBYE/" .sedtest >/dev/null 2>&1
-
-if [ $? != 0 ] ; then
-	echo build-sed-host-binary
-else
-	echo use-sed-host-binary
-fi;
-rm -f .sedtest
-
-
-

--- a/package/zlib/Config.in
+++ b/package/zlib/Config.in
@@ -1,6 +1,8 @@
 config BR2_PACKAGE_ZLIB
-	bool "zlib"
-	default n
+	tristate "zlib"
+	default y
 	help
-		zlib library
+	  A library implementing the 'deflate' compression method
+	  
+	  http://www.zlib.net/
 

--- /dev/null
+++ b/package/zlib/Makefile
@@ -1,1 +1,63 @@
+include $(TOPDIR)/rules.mk
 
+PKG_NAME := zlib
+PKG_VERSION := 1.2.2
+PKG_RELEASE := 1
+
+PKG_SOURCE_SITE := http://www.zlib.net/
+PKG_SOURCE_FILE := $(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_CAT := zcat
+PKG_SOURCE_DIR := $(PKG_NAME)-$(PKG_VERSION)
+PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_SOURCE_DIR)
+PKG_IPK := zlib_$(PKG_VERSION)-$(PKG_RELEASE)_$(ARCH).ipk
+
+
+$(DL_DIR)/$(PKG_SOURCE_FILE):
+	mkdir -p $(DL_DIR)
+	$(WGET) -P $(DL_DIR) $(PKG_SOURCE_SITE)/$(PKG_SOURCE_FILE)
+
+$(PKG_BUILD_DIR)/.patched: $(DL_DIR)/$(PKG_SOURCE_FILE)
+	mkdir -p $(TOOL_BUILD_DIR)
+	$(PKG_SOURCE_CAT) $(DL_DIR)/$(PKG_SOURCE_FILE) | tar -C $(BUILD_DIR) $(TAR_OPTIONS) -
+	$(PATCH) $(PKG_BUILD_DIR) . $(PKG_NAME).patch
+	touch $(PKG_BUILD_DIR)/.patched
+
+$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.patched
+	(cd $(PKG_BUILD_DIR); \
+	$(TARGET_CONFIGURE_OPTS) \
+	./configure \
+	  --prefix=/ \
+	  --shared)	
+	touch $(PKG_BUILD_DIR)/.configured
+
+$(PKG_BUILD_DIR)/libz.so: $(PKG_BUILD_DIR)/.configured
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+	  $(TARGET_CONFIGURE_OPTS) \
+	  CFLAGS="$(TARGET_CFLAGS) $(CFLAGS_LARGEFILE)" \
+	 libz.a libz.so
+
+$(STAGING_DIR)/lib/libz.so: $(PKG_BUILD_DIR)/libz.so
+	$(MAKE) -C $(PKG_BUILD_DIR) \
+	  DESTDIR="$(STAGING_DIR)" \
+	  install
+
+$(PACKAGE_DIR)/$(PKG_IPK): $(STAGING_DIR)/lib/libz.so
+	mkdir -p $(PACKAGE_DIR)
+	$(SCRIPT_DIR)/make-ipkg-dir.sh $(PKG_BUILD_DIR)/ipkg/zlib zlib.control $(PKG_VERSION)-$(PKG_RELEASE) $(ARCH)
+	mkdir -p $(PKG_BUILD_DIR)/ipkg/zlib/usr/lib
+	cp -a $(PKG_BUILD_DIR)/libz.so* $(PKG_BUILD_DIR)/ipkg/zlib/usr/lib
+	$(STRIP) $(PKG_BUILD_DIR)/ipkg/zlib/usr/lib/*
+	$(IPKG_BUILD) $(PKG_BUILD_DIR)/ipkg/zlib $(PACKAGE_DIR)
+
+
+source: $(DL_DIR)/$(PKG_SOURCE_FILE)
+prepare: $(PKG_BUILD_DIR)/.patched
+compile: $(STAGING_DIR)/lib/libz.so $(PACKAGE_DIR)/$(PKG_IPK)
+install: $(PKG_ZLIB)
+	$(IPKG) install $(PACKAGE_DIR)/$(PKG_IPK)
+clean:
+	rm -rf $(PKG_BUILD_DIR)
+	rm -f $(STAGING_DIR)/lib/libz* $(STAGING_DIR)/include/zlib*
+	rm -f $(PACKAGE_DIR)/zlib\*.ipk
+
+

--- /dev/null
+++ b/package/zlib/zlib.control
@@ -1,1 +1,9 @@
+Package: zlib
+Priority: optional
+Section: libs
+Version: 1.2.2-3
+Architecture: mipsel
+Maintainer: Felix Fietkau <nbd@vd-s.ath.cx>
+Source: buildroot internal
+Description: an implementation of the deflate compression method (library)
 

file:a/package/zlib/zlib.mk (deleted)
--- a/package/zlib/zlib.mk
+++ /dev/null
@@ -1,76 +1,1 @@
-#############################################################
-#
-# zlib
-#
-#############################################################
-ZLIB_SOURCE=zlib-1.1.4.tar.bz2
-ZLIB_SITE=http://aleron.dl.sourceforge.net/sourceforge/libpng
-ZLIB_DIR=$(BUILD_DIR)/zlib-1.1.4
-ZLIB_CFLAGS= $(TARGET_CFLAGS) -fPIC
-ifeq ($(strip $(BUILD_WITH_LARGEFILE)),true)
-ZLIB_CFLAGS+= -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
-endif
 
-$(DL_DIR)/$(ZLIB_SOURCE):
-	$(WGET) -P $(DL_DIR) $(ZLIB_SITE)/$(ZLIB_SOURCE)
-
-$(ZLIB_DIR)/.source: $(DL_DIR)/$(ZLIB_SOURCE)
-	bzcat $(DL_DIR)/$(ZLIB_SOURCE) | tar -C $(BUILD_DIR) -xvf -
-	touch $(ZLIB_DIR)/.source
-
-$(ZLIB_DIR)/.configured: $(ZLIB_DIR)/.source
-	(cd $(ZLIB_DIR); \
-		./configure \
-		--shared \
-		--prefix=/usr \
-		--exec-prefix=$(STAGING_DIR)/usr/bin \
-		--libdir=$(STAGING_DIR)/lib \
-		--includedir=$(STAGING_DIR)/include \
-	);
-	touch $(ZLIB_DIR)/.configured;
-
-$(ZLIB_DIR)/libz.so.1.1.4: $(ZLIB_DIR)/.configured
-	$(MAKE) LDSHARED="$(TARGET_CROSS)ld -shared -soname,libz.so.1" \
-		CFLAGS="$(ZLIB_CFLAGS)" CC=$(TARGET_CC) -C $(ZLIB_DIR) all libz.a;
-	touch -c $(ZLIB_DIR)/libz.so.1.1.4
-
-$(STAGING_DIR)/lib/libz.so.1.1.4: $(ZLIB_DIR)/libz.so.1.1.4
-	cp -dpf $(ZLIB_DIR)/libz.a $(STAGING_DIR)/lib;
-	cp -dpf $(ZLIB_DIR)/zlib.h $(STAGING_DIR)/include;
-	cp -dpf $(ZLIB_DIR)/zconf.h $(STAGING_DIR)/include;
-	cp -dpf $(ZLIB_DIR)/libz.so* $(STAGING_DIR)/lib;
-	(cd $(STAGING_DIR)/lib; ln -fs libz.so.1.1.4 libz.so.1);
-	chmod a-x $(STAGING_DIR)/lib/libz.so.1.1.4
-	touch -c $(STAGING_DIR)/lib/libz.so.1.1.4
-
-$(TARGET_DIR)/lib/libz.so.1.1.4: $(STAGING_DIR)/lib/libz.so.1.1.4
-	cp -dpf $(STAGING_DIR)/lib/libz.so* $(TARGET_DIR)/lib;
-	-$(STRIP)  $(TARGET_DIR)/lib/libz.so*
-	touch -c $(TARGET_DIR)/lib/libz.so.1.1.4
-
-$(TARGET_DIR)/usr/lib/libz.a: $(STAGING_DIR)/lib/libz.so.1.1.4
-	mkdir -p $(TARGET_DIR)/usr/include
-	cp -dpf $(STAGING_DIR)/include/zlib.h $(TARGET_DIR)/usr/include/
-	cp -dpf $(STAGING_DIR)/include/zconf.h $(TARGET_DIR)/usr/include/
-	cp -dpf $(STAGING_DIR)/lib/libz.a $(TARGET_DIR)/usr/lib/
-	rm -f $(TARGET_DIR)/lib/libz.so
-	(cd $(TARGET_DIR)/usr/lib; ln -fs /lib/libz.so.1.1.4 libz.so)
-	touch -c $(TARGET_DIR)/usr/lib/libz.a
-
-zlib-headers: $(TARGET_DIR)/usr/lib/libz.a
-
-zlib: uclibc $(TARGET_DIR)/lib/libz.so.1.1.4
-
-zlib-source: $(DL_DIR)/$(ZLIB_SOURCE)
-
-zlib-clean:
-	rm -f $(TARGET_DIR)/lib/libz.so*
-	-$(MAKE) -C $(ZLIB_DIR) clean
-
-zlib-dirclean:
-	rm -rf $(ZLIB_DIR)
-
-ifeq ($(strip $(BR2_PACKAGE_ZLIB)),y)
-TARGETS+=zlib
-endif
-

--- /dev/null
+++ b/package/zlib/zlib.patch
@@ -1,1 +1,207 @@
+diff -ruN zlib-1.2.2-orig/Makefile.in zlib-1.2.2-2/Makefile.in
+--- zlib-1.2.2-orig/Makefile.in	2004-09-15 16:27:20.000000000 +0200
++++ zlib-1.2.2-2/Makefile.in	2004-11-13 13:38:12.000000000 +0100
+@@ -25,20 +25,23 @@
+ #           -Wstrict-prototypes -Wmissing-prototypes
+ 
+ LDFLAGS=libz.a
+-LDSHARED=$(CC)
++LDSHARED=$(CC) -shared -Wl,-soname,$(SHAREDLIBM)
+ CPP=$(CC) -E
+ 
+-LIBS=libz.a
++LIBS=
++STATICLIB=libz.a
+ SHAREDLIB=libz.so
+ SHAREDLIBV=libz.so.1.2.2
+ SHAREDLIBM=libz.so.1
+ 
+-AR=ar rc
++AR=ar 
+ RANLIB=ranlib
+ TAR=tar
+ SHELL=/bin/sh
+ EXE=
+ 
++DESTDIR =
++
+ prefix = /usr/local
+ exec_prefix = ${prefix}
+ libdir = ${exec_prefix}/lib
+@@ -67,8 +70,8 @@
+ 	  echo '		*** zlib test FAILED ***'; \
+ 	fi
+ 
+-libz.a: $(OBJS) $(OBJA)
+-	$(AR) $@ $(OBJS) $(OBJA)
++$(STATICLIB): $(OBJS) $(OBJA)
++	$(AR) rc $@ $(OBJS) $(OBJA)
+ 	-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
+ 
+ match.o: match.S
+@@ -77,8 +80,10 @@
+ 	mv _match.o match.o
+ 	rm -f _match.s
+ 
++$(SHAREDLIB): $(SHAREDLIBV)
++
+ $(SHAREDLIBV): $(OBJS)
+-	$(LDSHARED) -o $@ $(OBJS)
++	$(LDSHARED) -lc -o $@ $(OBJS)
+ 	rm -f $(SHAREDLIB) $(SHAREDLIBM)
+ 	ln -s $@ $(SHAREDLIB)
+ 	ln -s $@ $(SHAREDLIBM)
+@@ -90,23 +95,23 @@
+ 	$(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
+ 
+ install: $(LIBS)
+-	-@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi
+-	-@if [ ! -d $(includedir)  ]; then mkdir -p $(includedir); fi
+-	-@if [ ! -d $(libdir)      ]; then mkdir -p $(libdir); fi
+-	-@if [ ! -d $(man3dir)     ]; then mkdir -p $(man3dir); fi
+-	cp zlib.h zconf.h $(includedir)
+-	chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
+-	cp $(LIBS) $(libdir)
+-	cd $(libdir); chmod 755 $(LIBS)
+-	-@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
+-	cd $(libdir); if test -f $(SHAREDLIBV); then \
++	-@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi
++	-@if [ ! -d $(DESTDIR)$(includedir)  ]; then mkdir -p $(DESTDIR)$(includedir); fi
++	-@if [ ! -d $(DESTDIR)$(libdir)      ]; then mkdir -p $(DESTDIR)$(libdir); fi
++	-@if [ ! -d $(DESTDIR)$(man3dir)     ]; then mkdir -p $(DESTDIR)$(man3dir); fi
++	cp zlib.h zconf.h $(DESTDIR)$(includedir)
++	chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
++	cp $(STATICLIB) $(SHAREDLIBV) $(DESTDIR)$(libdir)
++	cd $(DESTDIR)$(libdir); chmod 755 $(LIBS)
++	-@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
++	cd $(DESTDIR)$(libdir); if test -f $(SHAREDLIBV); then \
+ 	  rm -f $(SHAREDLIB) $(SHAREDLIBM); \
+ 	  ln -s $(SHAREDLIBV) $(SHAREDLIB); \
+ 	  ln -s $(SHAREDLIBV) $(SHAREDLIBM); \
+ 	  (ldconfig || true)  >/dev/null 2>&1; \
+ 	fi
+-	cp zlib.3 $(man3dir)
+-	chmod 644 $(man3dir)/zlib.3
++	cp zlib.3 $(DESTDIR)$(man3dir)
++	chmod 644 $(DESTDIR)$(man3dir)/zlib.3
+ # The ranlib in install is needed on NeXTSTEP which checks file times
+ # ldconfig is for Linux
+ 
+diff -ruN zlib-1.2.2-orig/configure zlib-1.2.2-2/configure
+--- zlib-1.2.2-orig/configure	2004-09-07 07:50:06.000000000 +0200
++++ zlib-1.2.2-2/configure	2004-11-13 12:37:43.000000000 +0100
+@@ -23,7 +23,7 @@
+ VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
+ VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h`
+ VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h`
+-AR=${AR-"ar rc"}
++AR=${AR-"ar"}
+ RANLIB=${RANLIB-"ranlib"}
+ prefix=${prefix-/usr/local}
+ exec_prefix=${exec_prefix-'${prefix}'}
+@@ -73,7 +73,7 @@
+ 
+ if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then
+   CC="$cc"
+-  SFLAGS=${CFLAGS-"-fPIC -O3"}
++  SFLAGS=${CFLAGS-"-D_REENTRANT -fPIC -O3"}
+   CFLAGS="$cflags"
+   case `(uname -s || echo unknown) 2>/dev/null` in
+   Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};;
+@@ -408,6 +408,29 @@
+   echo Checking for mmap support... No.
+ fi
+ 
++cat > $test.c <<EOF
++#include <stdio.h>
++int main() { char buf[10]; snprintf(buf, sizeof(buf), "%s", "F"); return 0; }
++EOF
++if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
++  echo "Checking for snprintf...	 Yes."
++  CFLAGS="$CFLAGS -DHAS_snprintf"
++else
++  echo "Checking for snprintf..	 No."
++fi
++
++cat > $test.c <<EOF
++#include <stdio.h>
++#include <stdarg.h>
++int main(void) { va_list a; vsnprintf(0, 0, "", a); return 0; }
++EOF
++if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
++  echo "Checking for vsnprintf...	 Yes."
++  CFLAGS="$CFLAGS -DHAS_vsnprintf"
++else
++  echo "Checking for vsnprintf..	 No."
++fi
++
+ CPP=${CPP-"$CC -E"}
+ case $CFLAGS in
+   *ASMV*)
+@@ -424,20 +447,21 @@
+ # udpate Makefile
+ sed < Makefile.in "
+ /^CC *=/s#=.*#=$CC#
+-/^CFLAGS *=/s#=.*#=$CFLAGS#
+-/^CPP *=/s#=.*#=$CPP#
+-/^LDSHARED *=/s#=.*#=$LDSHARED#
+-/^LIBS *=/s#=.*#=$LIBS#
+-/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
+-/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
+-/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
+-/^AR *=/s#=.*#=$AR#
+-/^RANLIB *=/s#=.*#=$RANLIB#
+-/^EXE *=/s#=.*#=$EXE#
+-/^prefix *=/s#=.*#=$prefix#
+-/^exec_prefix *=/s#=.*#=$exec_prefix#
+-/^libdir *=/s#=.*#=$libdir#
+-/^includedir *=/s#=.*#=$includedir#
+-/^mandir *=/s#=.*#=$mandir#
+-/^LDFLAGS *=/s#=.*#=$LDFLAGS#
++/^CC *=/s%=.*%= $CC%
++/^CFLAGS *=/s%=.*%= $CFLAGS%
++/^CPP *=/s%=.*%= $CPP%
++/^LDSHARED *=/s%=.*%= $LDSHARED%
++/^LIBS *=/s%=.*%= $LIBS%
++/^SHAREDLIB *=/s%=.*%= $SHAREDLIB%
++/^SHAREDLIBV *=/s%=.*%= $SHAREDLIBV%
++/^SHAREDLIBM *=/s%=.*%= $SHAREDLIBM%
++/^AR *=/s%=.*%= $AR%
++/^RANLIB *=/s%=.*%= $RANLIB%
++/^EXE *=/s%=.*%= $EXE%
++/^prefix *=/s%=.*%= $prefix%
++/^exec_prefix *=/s%=.*%= $exec_prefix%
++/^libdir *=/s%=.*%= $libdir%
++/^includedir *=/s%=.*%= $includedir%
++/^mandir *=/s%=.*%= $mandir%
++/^LDFLAGS *=/s%=.*%= $LDFLAGS%
+ " > Makefile
+diff -ruN zlib-1.2.2-orig/contrib/minizip/Makefile zlib-1.2.2-2/contrib/minizip/Makefile
+--- zlib-1.2.2-orig/contrib/minizip/Makefile	2003-09-10 20:00:16.000000000 +0200
++++ zlib-1.2.2-2/contrib/minizip/Makefile	2004-11-13 12:37:43.000000000 +0100
+@@ -1,8 +1,8 @@
+ CC=cc
+-CFLAGS=-O -I../..
++CFLAGS=-O2 -g -I../.. -Dunix
+ 
+-UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
+-ZIP_OBJS = minizip.o zip.o   ioapi.o ../../libz.a
++UNZ_OBJS = miniunz.o unzip.o ioapi.o
++ZIP_OBJS = minizip.o zip.o   ioapi.o
+ 
+ .c.o:
+ 	$(CC) -c $(CFLAGS) $*.c
+@@ -10,10 +10,10 @@
+ all: miniunz minizip
+ 
+ miniunz:  $(UNZ_OBJS)
+-	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
++	$(CC) $(CFLAGS) -o $@ $(UNZ_OBJS) -L ../.. -lz
+ 
+ minizip:  $(ZIP_OBJS)
+-	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
++	$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS) -L ../.. -lz
+ 
+ test:	miniunz minizip
+ 	./minizip test readme.txt
 

file:b/rules.mk (new)
--- /dev/null
+++ b/rules.mk
@@ -1,1 +1,123 @@
+include $(TOPDIR)/.config
+MAKE1=make
+MAKE=make -j$(BR2_JLEVEL)
 
+# Strip off the annoying quoting
+ARCH:=$(strip $(subst ",, $(BR2_ARCH)))
+#"
+WGET:=$(strip $(subst ",, $(BR2_WGET)))
+#"
+
+GCC_VERSION:=$(strip $(subst ",, $(BR2_GCC_VERSION)))
+#"
+GCC_USE_SJLJ_EXCEPTIONS:=$(strip $(subst ",, $(BR2_GCC_USE_SJLJ_EXCEPTIONS)))
+#"
+TARGET_OPTIMIZATION:=$(strip $(subst ",, $(BR2_TARGET_OPTIMIZATION)))
+#""
+
+
+ifeq ($(BR2_SOFT_FLOAT),y)
+# gcc 3.4.x soft float configuration is different than previous versions.
+ifeq ($(findstring 3.4.,$(GCC_VERSION)),3.4.)
+SOFT_FLOAT_CONFIG_OPTION:=--with-float=soft
+else
+SOFT_FLOAT_CONFIG_OPTION:=--without-float
+endif
+TARGET_SOFT_FLOAT:=-msoft-float
+ARCH_FPU_SUFFIX:=_nofpu
+else
+SOFT_FLOAT_CONFIG_OPTION:=
+TARGET_SOFT_FLOAT:=
+ARCH_FPU_SUFFIX:=
+endif
+
+
+ifeq ($(BR2_TAR_VERBOSITY),y)
+TAR_OPTIONS=-xvf
+else
+TAR_OPTIONS=-xf
+endif
+
+ifneq ($(BR2_LARGEFILE),y)
+DISABLE_LARGEFILE= --disable-largefile
+endif
+TARGET_CFLAGS:=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING)
+
+OPTIMIZE_FOR_CPU=$(ARCH)
+HOSTCC:=gcc
+BASE_DIR:=$(TOPDIR)
+DL_DIR:=$(BASE_DIR)/dl
+BUILD_DIR:=$(BASE_DIR)/build_$(ARCH)$(ARCH_FPU_SUFFIX)
+SCRIPT_DIR:=$(BASE_DIR)/scripts
+BIN_DIR:=$(BASE_DIR)/bin
+STAMP_DIR:=$(BUILD_DIR)/stamp
+PACKAGE_DIR:=$(BIN_DIR)/packages
+TARGET_DIR:=$(BUILD_DIR)/root
+STAMP_DIR:=$(BUILD_DIR)/stamp
+TOOL_BUILD_DIR=$(BASE_DIR)/toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)
+# Strip off the annoying quoting
+STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR)))
+#"
+TARGET_PATH=$(STAGING_DIR)/usr/bin:$(STAGING_DIR)/bin:/bin:/sbin:/usr/bin:/usr/sbin
+IMAGE:=$(BUILD_DIR)/root_fs_$(ARCH)$(ARCH_FPU_SUFFIX)
+REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux-uclibc
+GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux
+KERNEL_CROSS:=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
+TARGET_CROSS:=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)-linux-uclibc-
+TARGET_CC:=$(TARGET_CROSS)gcc
+#STRIP:=$(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note
+STRIP:=$(STAGING_DIR)/bin/sstrip
+PATCH=$(SCRIPT_DIR)/patch-kernel.sh
+SED:=$(STAGING_DIR)/bin/sed -i -e
+LINUX_VERSION=2.4.29
+LINUX_DIR:=$(BUILD_DIR)/linux
+LINUX_HEADERS_DIR:=$(TOOL_BUILD_DIR)/linux
+LINUX_KERNEL:=$(BUILD_DIR)/buildroot-kernel
+MODULES_SUBDIR := lib/modules/$(LINUX_VERSION)
+MODULES_DIR := $(BUILD_DIR)/modules/$(MODULES_SUBDIR)
+
+
+HOST_ARCH:=$(shell $(HOSTCC) -dumpmachine | sed -e s'/-.*//' \
+	-e 's/sparc.*/sparc/' \
+	-e 's/arm.*/arm/g' \
+	-e 's/m68k.*/m68k/' \
+	-e 's/ppc/powerpc/g' \
+	-e 's/v850.*/v850/g' \
+	-e 's/sh[234]/sh/' \
+	-e 's/mips-.*/mips/' \
+	-e 's/mipsel-.*/mipsel/' \
+	-e 's/cris.*/cris/' \
+	-e 's/i[3-9]86/i386/' \
+	)
+GNU_HOST_NAME:=$(HOST_ARCH)-pc-linux-gnu
+TARGET_CONFIGURE_OPTS=PATH=$(TARGET_PATH) \
+		AR=$(TARGET_CROSS)ar \
+		AS=$(TARGET_CROSS)as \
+		LD=$(TARGET_CROSS)ld \
+		NM=$(TARGET_CROSS)nm \
+		CC=$(TARGET_CROSS)gcc \
+		GCC=$(TARGET_CROSS)gcc \
+		CXX=$(TARGET_CROSS)g++ \
+		RANLIB=$(TARGET_CROSS)ranlib
+
+ifeq ($(ENABLE_LOCALE),true)
+DISABLE_NLS:=
+else
+DISABLE_NLS:=--disable-nls
+endif
+
+ifeq ($(BR2_ENABLE_MULTILIB),y)
+MULTILIB:=--enable-multilib
+endif
+
+
+# invoke ipkg with configuration in $(STAGING_DIR)/etc/ipkg.conf 
+IPKG := PATH="$(TARGET_PATH)" IPKG_CONF_DIR=$(STAGING_DIR)/etc ipkg -force-depends
+
+# invoke ipkg-build with some default options
+IPKG_BUILD := PATH="$(TARGET_PATH)" ipkg-build -c -o root -g root
+
+# where to build (and put) .ipk packages
+IPKG_TARGET_DIR := $(BUILD_DIR)
+
+

--- /dev/null
+++ b/scripts/configtest.pl
@@ -1,1 +1,13 @@
+#!/usr/bin/perl
 
+my %change = (
+	'BUSYBOX' => 'make -C package busybox-clean',
+	'' => 'make target_clean'
+);
+
+foreach my $change (keys %change) {
+	my $v1 = `grep '$change' .config.test`;
+	my $v2 = `grep '$change' .config`;
+	$v1 eq $v2 or system($change{$change});
+}
+

--- /dev/null
+++ b/scripts/gen_busybox_config.pl
@@ -1,1 +1,23 @@
+#!/usr/bin/perl
+use strict;
 
+my $line;
+my $l1 = '';
+my $l2 = '=y';
+while (<>) {
+	chomp;
+	/^(# )BR2_LARGEFILE(.+)$/ and do {
+		$l1 = $1;
+		$l2 = $2;
+	};
+	/^(# )?BUSYBOX_(.+)/ and do {
+		my $p1 = $1;
+		my $p2 = $2;
+		$p2 =~ /(CONFIG_LFS|FDISK_SUPPORT_LARGE_DISKS)/ and do {
+			$p1 = $l1;
+			$p2 = "$1$l2";
+		};
+		print "$p1$p2\n";
+	}
+}
+

--- /dev/null
+++ b/scripts/gen_busybox_menuconfig.pl
@@ -1,1 +1,70 @@
+#!/usr/bin/perl
+use strict;
+my $PATH = $ARGV[0];
+($PATH and -d $PATH) or die 'invalid path';
+my $DEFCONFIG = $ARGV[1];
+($DEFCONFIG and -f $DEFCONFIG) or die 'invalid config file';
 
+my %config;
+
+open CONFIG, $DEFCONFIG or die 'cannot open config file';
+while (<CONFIG>) {
+	/^([\w_]+)=([ym])/ and $config{$1} = $2;
+	/^([\w_]+)=(\d+)/ and $config{$1} = $2;
+	/^([\w_]+)=(".+")/ and $config{$1} = $2;
+}
+close CONFIG;
+
+open FIND, "find \"$PATH\" -name Config.in |";
+while (<FIND>) {
+	chomp;
+	my $input = $_;
+	s/^$PATH\///g;
+	s/sysdeps\/linux\///g;
+	my $output = $_;
+	print STDERR "$input => $output\n";
+	$output =~ /^(.+)\/[^\/]+$/ and system("mkdir -p $1");
+	
+	open INPUT, $input;
+	open OUTPUT, ">$output";
+	my ($cur, $default_set, $line);
+	while ($line = <INPUT>) {
+		next if $line =~ /^\s*mainmenu/;
+
+		# FIXME: make this dynamic
+		$line =~ s/default CONFIG_FEATURE_BUFFERS_USE_MALLOC/default CONFIG_FEATURE_BUFFERS_GO_ON_STACK/;
+		$line =~ s/default BUSYBOX_CONFIG_FEATURE_SH_IS_NONE/default BUSYBOX_CONFIG_FEATURE_SH_IS_ASH/;
+
+		if ($line =~ /^\s*config\s*([\w_]+)/) {
+			$cur = $1;
+			undef $default_set;
+		}
+		if ($line =~ /^\s*(menu|choice|end|source)/) {
+			undef $cur;
+			undef $default_set;
+		}
+		$line =~ s/^(\s*source\s+)/$1package\/busybox\/config\//;
+		
+		$line =~ s/(\s+)((CONFIG|FDISK|USING|CROSS|EXTRA|PREFIX|FEATURE|HAVE|BUSYBOX)[\w_]*)/$1BUSYBOX_$2/g;
+		
+		if ($cur) {
+			($cur !~ /^CONFIG/ or $cur eq 'CONFIG_LFS') and do {
+				$line =~ s/^(\s*(bool|tristate|string))\s*".+"$/$1/;
+			};
+			if ($line =~ /^\s*default/) {
+				my $c;
+				$default_set = 1;
+				$c = $config{$cur} or $c = 'n';
+
+				$line =~ s/^(\s*default\s*)(\w+|"[^"]*")(.*)/$1$c$3/;
+			}
+		}
+		
+		print OUTPUT $line;
+	}
+	close OUTPUT;
+	close INPUT;
+	
+}
+close FIND;
+

--- /dev/null
+++ b/scripts/make-ipkg-dir.sh
@@ -1,1 +1,12 @@
+#!/bin/bash
+TARGET=$1
+CONTROL=$2
+VERSION=$3
+ARCH=$4
 
+mkdir -p "$TARGET/CONTROL"
+grep '^[^(Version|Architecture)]' "$CONTROL" > "$TARGET/CONTROL/control"
+echo "Version: $VERSION" >> "$TARGET/CONTROL/control"
+echo "Architecture: $ARCH" >> "$TARGET/CONTROL/control"
+chmod 644 "$TARGET/CONTROL/control"
+

--- /dev/null
+++ b/scripts/patch-kernel.sh
@@ -1,1 +1,54 @@
+#! /bin/sh
+# A little script I whipped up to make it easy to
+# patch source trees and have sane error handling
+# -Erik
+#
+# (c) 2002 Erik Andersen <andersen@codepoet.org>
 
+# Set directories from arguments, or use defaults.
+targetdir=${1-.}
+patchdir=${2-../kernel-patches}
+patchpattern=${3-*}
+
+if [ ! -d "${targetdir}" ] ; then
+    echo "Aborting.  '${targetdir}' is not a directory."
+    exit 1
+fi
+if [ ! -d "${patchdir}" ] ; then
+    echo "Aborting.  '${patchdir}' is not a directory."
+    exit 1
+fi
+    
+for i in ${patchdir}/${patchpattern} ; do 
+    case "$i" in
+	*.gz)
+	type="gzip"; uncomp="gunzip -dc"; ;; 
+	*.bz)
+	type="bzip"; uncomp="bunzip -dc"; ;; 
+	*.bz2)
+	type="bzip2"; uncomp="bunzip2 -dc"; ;; 
+	*.zip)
+	type="zip"; uncomp="unzip -d"; ;; 
+	*.Z)
+	type="compress"; uncomp="uncompress -c"; ;; 
+	*)
+	type="plaintext"; uncomp="cat"; ;; 
+    esac
+    echo ""
+    echo "Applying ${i} using ${type}: " 
+    ${uncomp} ${i} | patch -p1 -E -d ${targetdir} 
+    if [ $? != 0 ] ; then
+        echo "Patch failed!  Please fix $i!"
+	exit 1
+    fi
+done
+
+# Check for rejects...
+if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
+    echo "Aborting.  Reject files found."
+    exit 1
+fi
+
+# Remove backup files
+find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
+

--- a/target/Config.in
+++ b/target/Config.in
@@ -1,7 +1,39 @@
-choice
-	prompt "Target Root Filesystem"
-	source "target/jffs2/Config.in"
-	source "target/squashfs-lzma/Config.in"
-endchoice
+menu "Target Root Filesystem"
 
+	config BR2_TARGET_ROOTFS_JFFS2
+		bool "jffs2"
+		default y
+		help
+		  Build a jffs2 root filesystem
 
+	config BR2_TARGET_ROOTFS_SQUASHFS_LZMA
+		bool "squashfs-lzma"
+		default y
+		help
+		  Build a squashfs-lzma root filesystem
+
+endmenu
+
+menu "Device Support"
+
+	config BR2_TARGET_DEFAULT
+		default y
+		bool "Generic"
+
+	config BR2_TARGET_WRT54G
+		default y
+		select BR2_TARGET_DEFAULT
+		bool "Linksys WRT54G"
+
+	config BR2_TARGET_WRT54GS
+		default y
+		select BR2_TARGET_DEFAULT
+		bool "Linksys WRT54GS"
+	
+	config BR2_TARGET_MOTOROLA
+		default n
+		select BR2_TARGET_DEFAULT
+		bool "Motorola"
+
+endmenu
+

file:a/target/Makefile.in (deleted)
--- a/target/Makefile.in
+++ /dev/null
@@ -1,21 +1,1 @@
-# Default target skeleton stuff, may be overridden
-EXTRAVERSION:=
-TARGET_SKELETON=target/default/skel.tar.gz
-TARGET_SKEL_DIR=target/default/target_skeleton
 
-include target/device/Makefile.in
-
-openwrt-linux.trx: openwrt-trx
-	PATH=$(TARGET_PATH) trx -o openwrt-linux$(EXTRAVERSION).trx \
-	 $(LINUX_DIR)/$(LINUX_BINLOC) $(JFFS2FLAGS) $(IMAGE).$(ROOTFS)
-
-openwrt-code.bin: openwrt-addpattern openwrt-linux.trx
-	PATH=$(TARGET_PATH) addpattern -2 -i  openwrt-linux$(EXTRAVERSION).trx \
-	-o openwrt-$(TAG)-code$(EXTRAVERSION).bin -g
-	@$(SED) "1s,^W54S,$(TAG)," openwrt-$(TAG)-code$(EXTRAVERSION).bin
-
-openwrt-image-clean: 
-	@-rm openwrt-* 2>/dev/null
-
-openwrt-image-dirclean: openwrt-dirclean
-

--- a/target/default/Makefile.in
+++ /dev/null

 Binary files a/target/default/skel.tar.gz and /dev/null differ
--- a/target/default/target_skeleton/bin/login
+++ b/target/default/target_skeleton/bin/login
@@ -1,3 +1,12 @@
 #!/bin/sh
-exec ash --login
+[ "$FAILSAFE" = "true" ] && exec /bin/ash --login
 
+[ -f /etc/sysconf ] && . /etc/sysconf
+
+if [ "$BR2_SYSCONF_TELNET_FAILSAFE_ONLY" = "y" ]; then
+	echo "Login failed."
+	exit 0
+fi
+
+exec /bin/ash --login
+

--- a/target/default/target_skeleton/etc/init.d/S10boot
+++ b/target/default/target_skeleton/etc/init.d/S10boot
@@ -4,7 +4,12 @@
 sysctl -p
 echo "S" > /proc/jffs2_bbc
 
+rm -rf /var
+ln -sf /tmp /var
 mkdir -p /var/run
+mkdir -p /var/log
+touch /var/log/wtmp
+touch /var/log/lastlog
 
 [ "$(nvram get il0macaddr)" = "00:90:4c:5f:00:2a" ] && {
   # if default wifi mac, set two higher than the lan mac

--- a/target/default/target_skeleton/etc/nvram.overrides
+++ b/target/default/target_skeleton/etc/nvram.overrides
@@ -2,6 +2,9 @@
 #
 # This file handles the NVRAM quirks of various hardware.
 # THIS FILE IS NOT A REPLACEMENT FOR NVRAM
+
+# Load sysconf defaults
+[ -f /etc/sysconf ] && . /etc/sysconf
 
 [ "$(nvram get boardnum)"  = "asusX" ] && \
   [ "$(nvram get boardtype)"  = "bcm94710dev" ] && {
@@ -67,9 +70,9 @@
   echo "### YOU ARE IN FAILSAFE MODE ####"
   NVRAM_lan_ifname="br0"
   NVRAM_lan_ifnames=${FAILSAFE_ifnames:-"vlan0 vlan1 eth1"}
-  NVRAM_lan_ipaddr="192.168.1.1"
-  NVRAM_lan_netmask="255.255.255.0"
-  NVRAM_lan_hwaddr="00:0B:AD:0A:DD:00"
+  NVRAM_lan_ipaddr=${BR2_SYSCONF_FAILSAFE_IP:-"192.168.1.1"}
+  NVRAM_lan_netmask=${BR2_SYSCONF_FAILSAFE_NETMASK:-"255.255.255.0"}
+  NVRAM_lan_hwaddr=${BR2_SYSCONF_FAILSAFE_MAC:-"00:0B:AD:0A:DD:00"}
   NVRAM_wan_ifname="none"
   NVRAM_wifi_ifname="none"
 }

--- a/target/default/target_skeleton/etc/preinit
+++ b/target/default/target_skeleton/etc/preinit
@@ -8,7 +8,7 @@
   while :; do { echo $(((X=(X+1)%8)%2)) > /proc/sys/diag; sleep $((X==0)); } done &
 else
   mount | grep jffs2 >&-
-  if [ $? = 0 ] ; then 
+  if [ $? = 0 ] ; then
     mtd unlock rootfs
     [ $(cat /proc/mtd | wc -l) = 6 ] && {
       echo 5 > /proc/sys/diag
@@ -27,5 +27,7 @@
   fi
 fi
 mount none /tmp -t ramfs
+mkdir -p /dev/pts
+mount none /dev/pts -t devpts
 exec /sbin/init
 

--- /dev/null
+++ b/target/default/target_skeleton/etc/shells
@@ -1,1 +1,2 @@
+/bin/ash
 

file:a/target/device/Config.in (deleted)
--- a/target/device/Config.in
+++ /dev/null
@@ -1,18 +1,1 @@
-choice
-	prompt "Device Support"
-	default BR2_TARGET_ALL
 
-config BR2_TARGET_ALL
-	bool "Support for all devices"
-
-config BR2_TARGET_LINKSYS_WRT54G
-    bool "Linksys WRT54G Support"
-
-config BR2_TARGET_LINKSYS_WRT54GS
-    bool "Linksys WRT54GS Support"
-
-config BR2_TARGET_ASUS_WL500G
-	bool "Asus WL-500g Support"
-
-endchoice
-

--- a/target/device/Makefile.in
+++ /dev/null
@@ -1,3 +1,1 @@
--include target/device/*/*/Makefile.in
--include target/device/all/Makefile.in
 

file:a/target/jffs2/Config.in (deleted)
--- a/target/jffs2/Config.in
+++ /dev/null
@@ -1,6 +1,1 @@
-config BR2_TARGET_ROOTFS_JFFS2
-	bool "jffs2"
-	help
-	  Build a jffs2 root filesystem
 
-

--- /dev/null
+++ b/target/jffs2/Makefile
@@ -1,1 +1,37 @@
+include $(TOPDIR)/rules.mk
 
+include ./jffs2root.mk
+
+TARGETS:= $(BIN_DIR)/openwrt-generic-jffs2-4MB.trx $(BIN_DIR)/openwrt-generic-jffs2-8MB.trx
+
+prepare: $(MTD_DIR)/.unpacked
+compile: mtd
+install: compile $(TARGETS)
+clean: jffs2root-dirclean
+
+$(BIN_DIR)/openwrt-generic-jffs2-4MB.trx:
+	$(MKFS_JFFS2) --pad --little-endian --squash -e 0x10000 \
+		-d $(TARGET_DIR) -o $(IMAGE)-4MB.jffs2
+	PATH=$(TARGET_PATH) trx -o $@ \
+	 $(LINUX_KERNEL) -a 0x10000 $(IMAGE)-4MB.jffs2
+
+$(BIN_DIR)/openwrt-generic-jffs2-8MB.trx:
+	$(MKFS_JFFS2) --pad --little-endian --squash -e 0x20000 \
+		-d $(TARGET_DIR) -o $(IMAGE)-8MB.jffs2
+	PATH=$(TARGET_PATH) trx -o $@ \
+	 $(LINUX_KERNEL) -a 0x20000 $(IMAGE)-8MB.jffs2
+	 
+$(BIN_DIR)/openwrt-wrt54g-jffs2.bin: $(BIN_DIR)/openwrt-generic-jffs2-4MB.trx
+	PATH=$(TARGET_PATH) addpattern -2 -i $< -o $@ -g
+	$(SED) "1s,^W54S,W54G," $@
+	
+$(BIN_DIR)/openwrt-wrt54gs-jffs2.bin: $(BIN_DIR)/openwrt-generic-jffs2-8MB.trx
+	PATH=$(TARGET_PATH) addpattern -2 -i $< -o $@ -g
+
+$(BIN_DIR)/openwrt-motorola-jffs2-4MB.bin: $(BIN_DIR)/openwrt-generic-jffs2-4MB.trx
+	PATH=$(TARGET_PATH) motorola-bin $< $@
+
+$(BIN_DIR)/openwrt-motorola-jffs2-8MB.bin: $(BIN_DIR)/openwrt-generic-jffs2-8MB.trx
+	PATH=$(TARGET_PATH) motorola-bin $< $@
+
+

--- a/target/jffs2/jffs2root.mk
+++ b/target/jffs2/jffs2root.mk
@@ -28,13 +28,6 @@
 #
 #############################################################
 
-jffs2root: mtd
-	-@find $(TARGET_DIR) -type f -perm +111 | xargs $(SSTRIP) 2>/dev/null || true;
-	@rm -rf $(TARGET_DIR)/usr/man
-	@rm -rf $(TARGET_DIR)/usr/info
-	$(MKFS_JFFS2) --pad --little-endian --squash -e $(JFFS2_BLOCK_SIZE) \
-		-d $(TARGET_DIR) -o $(IMAGE).jffs2
-
 jffs2root-source: $(DL_DIR)/$(MTD_SOURCE)
 
 jffs2root-clean:
@@ -43,15 +36,3 @@
 jffs2root-dirclean:
 	rm -rf $(MTD_DIR)
 
-ifeq ($(strip $(BR2_TARGET_ROOTFS_JFFS2)),y)
-TARGETS+=openwrt-jffs2root openwrt-image
-ROOTFS=jffs2
-JFFS2FLAGS=-a $(JFFS2_BLOCK_SIZE)
-
-openwrt-image: openwrt
-	@make jffs2root openwrt-code.bin TAG=W54G \
-	EXTRAVERSION=$(EXTRAVERSION)-JFFS2-4M JFFS2_BLOCK_SIZE=0x10000
-	@make jffs2root openwrt-code.bin TAG=W54S \
-	EXTRAVERSION=$(EXTRAVERSION)-JFFS2-8M JFFS2_BLOCK_SIZE=0x20000
-endif
-

--- a/target/squashfs-lzma/Config.in
+++ /dev/null
@@ -1,6 +1,1 @@
-config BR2_TARGET_ROOTFS_SQUASHFS_LZMA
-	bool "squashfs-lzma"
-	help
-	  Build a squashfs-lzma root filesystem
 
-

--- /dev/null
+++ b/target/squashfs-lzma/Makefile
@@ -1,1 +1,17 @@
+include $(TOPDIR)/rules.mk
+include ./squashfslzmaroot.mk
 
+TARGETS:=$(BIN_DIR)/openwrt-generic-squashfs.trx
+
+prepare: $(SQUASHFSLZMA_DIR)/.unpacked
+compile: squashfslzma
+install: $(TARGETS)
+clean: squashfslzmaroot-dirclean
+
+$(BIN_DIR)/openwrt-generic-squashfs.trx:
+	@mkdir -p $(TARGET_DIR)/jffs
+	$(SQUASHFSLZMA_DIR)/squashfs-tools/mksquashfs-lzma $(TARGET_DIR) $(IMAGE).squashfslzma -noappend -root-owned -le
+	PATH=$(TARGET_PATH) trx -o $@ \
+	 $(LINUX_KERNEL) $(IMAGE).squashfslzma
+	 
+

--- a/target/squashfs-lzma/squashfslzmaroot.mk
+++ b/target/squashfs-lzma/squashfslzmaroot.mk
@@ -36,28 +36,8 @@
 #
 #############################################################
 
-squashfslzmaroot: squashfslzma
-	@rm -rf $(TARGET_DIR)/usr/man
-	@rm -rf $(TARGET_DIR)/usr/info
-	$(SQUASHFSLZMA_DIR)/squashfs-tools/mksquashfs-lzma \
-	$(TARGET_DIR) $(IMAGE).squashfslzma -noappend -root-owned -le
-
 squashfslzmaroot-source: squashfslzma-source
-
-squashfslzmaroot-clean:
-	-$(MAKE) -C $(SQUASHFSLZMA_DIR) clean
 
 squashfslzmaroot-dirclean:
 	rm -rf $(SQUASHFSLZMA_DIR)
 
-ifeq ($(strip $(BR2_TARGET_ROOTFS_SQUASHFS_LZMA)),y)
-TARGETS+=squashfslzmaroot openwrt-image
-ROOTFS=squashfslzma
-
-openwrt-image:  openwrt
-	@make openwrt-code.bin TAG=W54G \
-	EXTRAVERSION=$(EXTRAVERSION)-SQUASHFSLZMA
-	@make openwrt-code.bin TAG=W54S \
-	EXTRAVERSION=$(EXTRAVERSION)-SQUASHFSLZMA
-endif
-

--- /dev/null
+++ b/target/utils/Makefile
@@ -1,1 +1,29 @@
+include $(TOPDIR)/rules.mk
 
+TARGETS := addpattern trx
+ifeq ($(BR2_TARGET_BELKIN),y)
+TARGETS += belkin-bin
+endif
+ifeq ($(BR2_TARGET_MOTOROLA),y)
+TARGETS += motorola-bin
+endif
+
+UTILS_BUILD_DIR:=$(BUILD_DIR)/target-utils
+
+prepare: $(UTILS_BUILD_DIR)
+compile: prepare $(patsubst %,$(UTILS_BUILD_DIR)/%,$(TARGETS))
+install: compile
+	mkdir -p $(STAGING_DIR)/bin
+	cp -a $(UTILS_BUILD_DIR)/* $(STAGING_DIR)/bin/
+package:
+clean:
+	rm -rf $(UTILS_BUILD_DIR)
+
+$(UTILS_BUILD_DIR):
+	mkdir -p $(UTILS_BUILD_DIR)
+	
+$(UTILS_BUILD_DIR)/%: src/%.c
+	$(CC) -o $@ $(patsubst $(UTILS_BUILD_DIR)/%,src/%.c,$@)
+	chmod 755 $@
+
+

--- /dev/null
+++ b/target/utils/src/addpattern.c
@@ -1,1 +1,222 @@
-
+/*
+ * Copyright (C) 2004  Manuel Novoa III  <mjn3@codepoet.org>
+ *
+ * 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 of the License, 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* July 29, 2004
+ *
+ * This is a hacked replacement for the 'addpattern' utility used to
+ * create wrt54g .bin firmware files.  It isn't pretty, but it does
+ * the job for me.
+ *
+ * Extensions:
+ *  -v allows setting the version string on the command line.
+ *  -{0|1} sets the (currently ignored) hw_ver flag in the header
+ *      to 0 or 1 respectively.
+ */
+
+/* January 12, 2005
+ * 
+ * Modified by rodent at rodent dot za dot net
+ * Support added for the new WRT54G v2.2 and WRT54GS v1.1 "flags"
+ * Without the flags set to 0x7, the above units will refuse to flash.
+ * 
+ * Extensions:
+ *  -{0|1|2} sets {0|1} sets hw_ver flag to 0/1. {2} sets hw_ver to 1
+ *     and adds the new hardware "flags" for the v2.2/v1.1 units
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+/**********************************************************************/
+
+#define CODE_ID		"U2ND"		/* from code_pattern.h */
+#define CODE_PATTERN   "W54S"	/* from code_pattern.h */
+
+#define CYBERTAN_VERSION	"v3.37.2" /* from cyutils.h */
+
+/* WRT54G v2.2 and WRT54GS v1.1 "flags" (from 3.37.32 firmware cyutils.h) */
+#define SUPPORT_4712_CHIP      0x0001
+#define SUPPORT_INTEL_FLASH    0x0002
+#define SUPPORT_5325E_SWITCH   0x0004
+
+struct code_header {			/* from cyutils.h */
+	char magic[4];
+	char res1[4];				/* for extra magic */
+	char fwdate[3];
+	char fwvern[3];
+	char id[4];					/* U2ND */
+	char hw_ver;    			/* 0: for 4702, 1: for 4712 -- new in 2.04.3 */
+	unsigned short flags;       /* SUPPORT_ flags new for 3.37.2 (WRT54G v2.2 and WRT54GS v1.1) */
+	unsigned char res2[10];
+} ;
+
+/**********************************************************************/
+
+void usage(void) __attribute__ (( __noreturn__ ));
+
+void usage(void)
+{
+	fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-p pattern] [-g] [-v v#.#.#] [-{0|1|2}]\n");
+	exit(EXIT_FAILURE);
+}
+
+int main(int argc, char **argv)
+{
+	char buf[1024];	/* keep this at 1k or adjust garbage calc below */
+	struct code_header *hdr;
+	FILE *in = stdin;
+	FILE *out = stdout;
+	char *ifn = NULL;
+	char *ofn = NULL;
+	char *pattern = CODE_PATTERN;
+	char *version = CYBERTAN_VERSION;
+	int gflag = 0;
+	int c;
+	int v0, v1, v2;
+	size_t off, n;
+	time_t t;
+	struct tm *ptm;
+
+	fprintf(stderr, "mjn3's addpattern replacement - v0.81\n");
+
+	hdr = (struct code_header *) buf;
+	memset(hdr, 0, sizeof(struct code_header));
+
+	while ((c = getopt(argc, argv, "i:o:p:gv:012")) != -1) {
+		switch (c) {
+			case 'i':
+				ifn = optarg;
+				break;
+			case 'o':
+				ofn = optarg;
+				break;
+			case 'p':
+				pattern = optarg;
+				break;
+			case 'g':
+				gflag = 1;
+				break;
+			case 'v':			/* extension to allow setting version */
+				version = optarg;
+				break;
+			case '0':
+				hdr->hw_ver = 0;
+				break;
+			case '1':
+				hdr->hw_ver = 1;
+				break;
+			case '2': 			/* new 54G v2.2 and 54GS v1.1 flags */
+				hdr->hw_ver = 1;
+				hdr->flags |= SUPPORT_4712_CHIP;
+				hdr->flags |= SUPPORT_INTEL_FLASH;
+				hdr->flags |= SUPPORT_5325E_SWITCH;
+				break;
+
+			default:
+				usage();
+		}
+	}
+
+	if (optind != argc) {
+		fprintf(stderr, "illegal arg \"%s\"\n", argv[optind]);
+		usage();
+	}
+
+	if (strlen(pattern) != 4) {
+		fprintf(stderr, "illegal pattern \"%s\": length != 4\n", pattern);
+		usage();
+	}
+
+	if (ifn && !(in = fopen(ifn, "r"))) {
+		fprintf(stderr, "can not open \"%s\" for reading\n", ifn);
+		usage();
+	}
+
+	if (ofn && !(out = fopen(ofn, "w"))) {
+		fprintf(stderr, "can not open \"%s\" for writing\n", ofn);
+		usage();
+	}
+
+	if (time(&t) == (time_t)(-1)) {
+		fprintf(stderr, "time call failed\n");
+		return EXIT_FAILURE;
+	}
+
+	ptm = localtime(&t);
+
+	if (3 != sscanf(version, "v%d.%d.%d", &v0, &v1, &v2)) {
+		fprintf(stderr, "bad version string \"%s\"\n", version);
+		return EXIT_FAILURE;
+	}
+
+	memcpy(&hdr->magic, pattern, 4);
+	hdr->fwdate[0] = ptm->tm_year % 100;
+	hdr->fwdate[1] = ptm->tm_mon + 1;
+	hdr->fwdate[2] = ptm->tm_mday;
+	hdr->fwvern[0] = v0;
+	hdr->fwvern[1] = v1;
+	hdr->fwvern[2] = v2;
+	memcpy(&hdr->id, CODE_ID, strlen(CODE_ID));
+
+	off = sizeof(struct code_header);
+
+	fprintf(stderr, "writing firmware v%d.%d.%d on %d/%d/%d (y/m/d)\n",
+			v0, v1, v2,
+			hdr->fwdate[0], hdr->fwdate[1], hdr->fwdate[2]);
+
+
+	while ((n = fread(buf + off, 1, sizeof(buf)-off, in) + off) > 0) {
+		off = 0;
+		if (n < sizeof(buf)) {
+			if (ferror(in)) {
+			FREAD_ERROR:
+				fprintf(stderr, "fread error\n");
+				return EXIT_FAILURE;
+			}
+			if (gflag) {
+				gflag = sizeof(buf) - n;
+				memset(buf + n, 0xff, gflag);
+				fprintf(stderr, "adding %d bytes of garbage\n", gflag);
+				n = sizeof(buf);
+			}
+		}
+		if (!fwrite(buf, n, 1, out)) {
+		FWRITE_ERROR:
+			fprintf(stderr, "fwrite error\n");
+			return EXIT_FAILURE;
+		}
+	}
+	
+	if (ferror(in)) {
+		goto FREAD_ERROR;
+	}
+
+	if (fflush(out)) {
+		goto FWRITE_ERROR;
+	}
+
+	fclose(in);
+	fclose(out);
+
+	return EXIT_SUCCESS;
+}
+

--- /dev/null
+++ b/target/utils/src/motorola-bin.c
@@ -1,1 +1,110 @@
+/*
+ * motorola-bin.c
+ *
+ * Copyright (C) 2005 Mike Baker 
+ *                    Openwrt.org
+ *
+ * $Id$
+ *
+ * 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
+ * of the License, 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ */
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <string.h>
+#include <netinet/in.h>
+
+unsigned long *crc32;
+
+void init_crc32()
+{
+    unsigned long crc;
+    unsigned long poly = ntohl(0x2083b8ed);
+    int n, bit;
+    if ((crc32 = (unsigned long *) malloc(256 * sizeof(unsigned long))) == (void *)-1) {
+       perror("malloc");
+       exit(1);
+    }
+    for (n = 0; n < 256; n++) {
+        crc = (unsigned long) n;
+        for (bit = 0; bit < 8; bit++)
+            crc = (crc & 1) ? (poly ^ (crc >> 1)) : (crc >> 1);
+        crc32[n] = crc;
+    }
+}
+
+unsigned int crc32buf(char *buf, size_t len)
+{
+    unsigned int crc = 0xFFFFFFFF;
+    for (; len; len--, buf++)
+        crc = crc32[(crc ^ *buf) & 0xff] ^ (crc >> 8);
+    return crc;
+}
+
+struct motorola {
+	unsigned int crc;	// crc32 of the remainder
+	unsigned int flags;	// unknown, 10577050
+	char *trx;		// standard trx
+};
+
+int main(int argc, char **argv)
+{
+	unsigned int len;
+	int fd;
+	void *trx;
+	struct motorola *firmware;
+
+	if (argc<3) {
+		printf("%s <trx> <motorola.bin>\n",argv[0]);
+		exit(0);
+	}
+
+	// mmap trx file
+	if (((fd = open(argv[1], O_RDONLY))  < 0)
+	|| ((len = lseek(fd, 0, SEEK_END)) < 0)
+	|| ((trx = mmap(0, len, PROT_READ, MAP_SHARED, fd, 0)) == (void *) (-1))
+	|| (close(fd) < 0)) {
+		perror("open/malloc");
+		exit(-1);
+	}
+	
+	// create a firmware image in memory
+	// and copy the trx to it
+	firmware = malloc(len+8);
+	memcpy(&firmware->trx,trx,len);
+	munmap(trx,len);
+
+	// setup the motorola headers
+	init_crc32();
+	firmware->flags = ntohl(0x10577050);
+	firmware->crc   = htonl(crc32buf((char *)&firmware->flags,len+4));
+
+	// write the firmware
+	if (((fd = open(argv[2], O_CREAT|O_WRONLY,0644)) < 0)
+	|| (write(fd,firmware,len+8) != len+8)
+	|| (close(fd) < 0)) {
+		perror("write");
+		exit(-1);
+	}
+
+	free(firmware);
+
+	return 0;
+}
+

--- /dev/null
+++ b/target/utils/src/trx.c
@@ -1,1 +1,356 @@
-
+/*
+ * Copyright (C) 2004  Manuel Novoa III  <mjn3@codepoet.org>
+ *
+ * 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 of the License, 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.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/* July 29, 2004
+ *
+ * This is a hacked replacement for the 'trx' utility used to create
+ * wrt54g .trx firmware files.  It isn't pretty, but it does the job
+ * for me.
+ *
+ * As an extension, you can specify a larger maximum length for the
+ * .trx file using '-m'.  It will be rounded up to be a multiple of 4K.
+ * NOTE: This space will be malloc()'d.
+ *
+ * August 16, 2004
+ *
+ * Sigh... Make it endian-neutral.
+ *
+ * TODO: Support '-b' option to specify offsets for each file.
+ *
+ * February 19, 2005 - mbm
+ *
+ * Add -a (align offset) and -b (absolute offset)
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <endian.h>
+#include <byteswap.h>
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define STORE32_LE(X)		bswap_32(X)
+#elif __BYTE_ORDER == __LITTLE_ENDIAN
+#define STORE32_LE(X)		(X)
+#else
+#error unkown endianness!
+#endif
+
+uint32_t crc32buf(char *buf, size_t len);
+
+/**********************************************************************/
+/* from trxhdr.h */
+
+#define TRX_MAGIC	0x30524448	/* "HDR0" */
+#define TRX_VERSION	1
+#define TRX_MAX_LEN	0x3A0000
+#define TRX_NO_HEADER	1		/* Do not write TRX header */	
+
+struct trx_header {
+	uint32_t magic;			/* "HDR0" */
+	uint32_t len;			/* Length of file including header */
+	uint32_t crc32;			/* 32-bit CRC from flag_version to end of file */
+	uint32_t flag_version;	/* 0:15 flags, 16:31 version */
+	uint32_t offsets[3];	/* Offsets of partitions from start of header */
+};
+
+/**********************************************************************/
+
+void usage(void) __attribute__ (( __noreturn__ ));
+
+void usage(void)
+{
+	fprintf(stderr, "Usage: trx [-o outfile] [-m maxlen] [-a align] [-b offset] file [file [file]]\n");
+	exit(EXIT_FAILURE);
+}
+
+int main(int argc, char **argv)
+{
+	FILE *out = stdout;
+	FILE *in;
+	char *ofn = NULL;
+	char *buf;
+	char *e;
+	int c, i;
+	size_t n;
+	uint32_t cur_len;
+	unsigned long maxlen = TRX_MAX_LEN;
+	struct trx_header *p;
+
+	fprintf(stderr, "mjn3's trx replacement - v0.81.1\n");
+
+	if (!(buf = malloc(maxlen))) {
+		fprintf(stderr, "malloc failed\n");
+		return EXIT_FAILURE;
+	}
+
+	p = (struct trx_header *) buf;
+
+	p->magic = STORE32_LE(TRX_MAGIC);
+	cur_len = sizeof(struct trx_header);
+	p->flag_version = STORE32_LE((TRX_VERSION << 16));
+
+	in = NULL;
+	i = 0;
+
+	while ((c = getopt(argc, argv, "-:o:m:a:b:")) != -1) {
+		switch (c) {
+			case 1:
+				p->offsets[i++] = STORE32_LE(cur_len);
+
+				if (!(in = fopen(optarg, "r"))) {
+					fprintf(stderr, "can not open \"%s\" for reading\n", optarg);
+					usage();
+				}
+				n = fread(buf + cur_len, 1, maxlen - cur_len, in);
+				if (!feof(in)) {
+					fprintf(stderr, "fread failure or file \"%s\" too large\n",optarg);
+					fclose(in);
+					return EXIT_FAILURE;
+				}
+				fclose(in);
+#undef  ROUND
+#define ROUND 4
+				if (n & (ROUND-1)) {
+					memset(buf + cur_len + n, 0, ROUND - (n & (ROUND-1)));
+					n += ROUND - (n & (ROUND-1));
+				}
+				cur_len += n;
+
+				break;
+			case 'o':
+				ofn = optarg;
+				if (ofn && !(out = fopen(ofn, "w"))) {
+					fprintf(stderr, "can not open \"%s\" for writing\n", ofn);
+					usage();
+				}
+
+				break;
+			case 'm':
+				errno = 0;
+				maxlen = strtoul(optarg, &e, 0);
+				if (errno || (e == optarg) || *e) {
+					fprintf(stderr, "illegal numeric string\n");
+					usage();
+				}
+#undef  ROUND
+#define ROUND 0x1000
+				if (maxlen & (ROUND-1)) {
+					maxlen += (ROUND - (maxlen & (ROUND-1)));
+				}
+				if (maxlen < ROUND) {
+					fprintf(stderr, "maxlen too small (or wrapped)\n");
+					usage();
+				}
+				if (maxlen > TRX_MAX_LEN) {
+					fprintf(stderr, "WARNING: maxlen exceeds default maximum!  Beware of overwriting nvram!\n");
+				}
+				if (!(buf = realloc(buf,maxlen))) {
+					fprintf(stderr, "realloc failed");
+					return EXIT_FAILURE;
+				}
+				break;
+			case 'a':
+				errno = 0;
+				n = strtoul(optarg, &e, 0);
+				if (errno || (e == optarg) || *e) {
+					fprintf(stderr, "illegal numeric string\n");
+					usage();
+				}
+				if (cur_len & (n-1)) {
+					n = n - (cur_len & (n-1));
+					memset(buf + cur_len, 0, n);
+					cur_len += n;
+				}
+				break;
+			case 'b':
+				errno = 0;
+				n = strtoul(optarg, &e, 0);
+				if (errno || (e == optarg) || *e) {
+					fprintf(stderr, "illegal numeric string\n");
+					usage();
+				}
+				if (n < cur_len) {
+					fprintf(stderr, "WARNING: current length exceeds -b %d offset\n",n);
+				} else {
+					memset(buf + cur_len, 0, n - cur_len);
+					cur_len = n;
+				}
+				break;
+			default:
+				usage();
+		}
+	}
+
+	if (!in) {
+		fprintf(stderr, "we require atleast one filename\n");
+		usage();
+	}
+
+#undef  ROUND
+#define ROUND 0x1000
+	n = cur_len & (ROUND-1);
+	if (n) {
+		memset(buf + cur_len, 0, ROUND - n);
+		cur_len += ROUND - n;
+	}
+
+	p->crc32 = crc32buf((char *) &p->flag_version,
+						cur_len - offsetof(struct trx_header, flag_version));
+	p->crc32 = STORE32_LE(p->crc32);
+
+	p->len = STORE32_LE(cur_len);
+
+	if (!fwrite(buf, cur_len, 1, out) || fflush(out)) {
+		fprintf(stderr, "fwrite failed\n");
+		return EXIT_FAILURE;
+	}
+
+	fclose(out);
+
+	return EXIT_SUCCESS;
+}
+
+/**********************************************************************/
+/* The following was grabbed and tweaked from the old snippets collection
+ * of public domain C code. */
+
+/**********************************************************************\
+|* Demonstration program to compute the 32-bit CRC used as the frame  *|
+|* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|
+|* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|
+|* protocol).  The 32-bit FCS was added via the Federal Register,     *|
+|* 1 June 1982, p.23798.  I presume but don't know for certain that   *|
+|* this polynomial is or will be included in CCITT V.41, which        *|
+|* defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|
+|* PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|
+|* errors by a factor of 10^-5 over 16-bit FCS.                       *|
+\**********************************************************************/
+
+/* Copyright (C) 1986 Gary S. Brown.  You may use this program, or
+   code or tables extracted from it, as desired without restriction.*/
+
+/* First, the polynomial itself and its table of feedback terms.  The  */
+/* polynomial is                                                       */
+/* X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0 */
+/* Note that we take it "backwards" and put the highest-order term in  */
+/* the lowest-order bit.  The X^32 term is "implied"; the LSB is the   */
+/* X^31 term, etc.  The X^0 term (usually shown as "+1") results in    */
+/* the MSB being 1.                                                    */
+
+/* Note that the usual hardware shift register implementation, which   */
+/* is what we're using (we're merely optimizing it by doing eight-bit  */
+/* chunks at a time) shifts bits into the lowest-order term.  In our   */
+/* implementation, that means shifting towards the right.  Why do we   */
+/* do it this way?  Because the calculated CRC must be transmitted in  */
+/* order from highest-order term to lowest-order term.  UARTs transmit */
+/* characters in order from LSB to MSB.  By storing the CRC this way,  */
+/* we hand it to the UART in the order low-byte to high-byte; the UART */
+/* sends each low-bit to hight-bit; and the result is transmission bit */
+/* by bit from highest- to lowest-order term without requiring any bit */
+/* shuffling on our part.  Reception works similarly.                  */
+
+/* The feedback terms table consists of 256, 32-bit entries.  Notes:   */
+/*                                                                     */
+/*  1. The table can be generated at runtime if desired; code to do so */
+/*     is shown later.  It might not be obvious, but the feedback      */
+/*     terms simply represent the results of eight shift/xor opera-    */
+/*     tions for all combinations of data and CRC register values.     */
+/*                                                                     */
+/*  2. The CRC accumulation logic is the same for all CRC polynomials, */
+/*     be they sixteen or thirty-two bits wide.  You simply choose the */
+/*     appropriate table.  Alternatively, because the table can be     */
+/*     generated at runtime, you can start by generating the table for */
+/*     the polynomial in question and use exactly the same "updcrc",   */
+/*     if your application needn't simultaneously handle two CRC       */
+/*     polynomials.  (Note, however, that XMODEM is strange.)          */
+/*                                                                     */
+/*  3. For 16-bit CRCs, the table entries need be only 16 bits wide;   */
+/*     of course, 32-bit entries work OK if the high 16 bits are zero. */
+/*                                                                     */
+/*  4. The values must be right-shifted by eight bits by the "updcrc"  */
+/*     logic; the shift must be unsigned (bring in zeroes).  On some   */
+/*     hardware you could probably optimize the shift in assembler by  */
+/*     using byte-swap instructions.                                   */
+
+static const uint32_t crc_32_tab[] = { /* CRC polynomial 0xedb88320 */
+0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+#define UPDC32(octet,crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
+
+uint32_t crc32buf(char *buf, size_t len)
+{
+      uint32_t crc;
+
+      crc = 0xFFFFFFFF;
+
+      for ( ; len; --len, ++buf)
+      {
+            crc = UPDC32(*buf, crc);
+      }
+
+      return crc;
+}
+

--- a/toolchain/Config.in
+++ b/toolchain/Config.in
@@ -38,7 +38,7 @@
 
 config BR2_TARGET_OPTIMIZATION
 	string "Target Optimizations"
-	default "-Os -pipe -mips2"
+	default "-Os -pipe -mips32 -mtune=mips32"
 	help
 	  Optimizations to use when building for the target host.
 

--- /dev/null
+++ b/toolchain/Makefile
@@ -1,1 +1,46 @@
+# Main makefile for the toolchain
+include $(TOPDIR)/rules.mk
+TARGETS:=sed utils binutils gcc uClibc ipkg-utils
 
+TARGETS_INSTALL:=$(patsubst %,%-install,$(TARGETS))
+TARGETS_CLEAN:=$(patsubst %,%-clean,$(TARGETS))
+
+all: install
+install: $(TARGETS_INSTALL)
+clean: $(TARGETS_CLEAN)
+
+uClibc-prepare: kernel-headers-prepare sed-install utils-install
+binutils-prepare: uClibc-prepare
+gcc-prepare: binutils-install
+uClibc-compile: gcc-prepare
+gcc-install: uClibc-install
+
+$(STAMP_DIR):
+	mkdir -p $(STAMP_DIR)
+
+$(STAGING_DIR):
+	@mkdir -p $(STAGING_DIR)/lib
+	@mkdir -p $(STAGING_DIR)/include
+	@mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)
+	@ln -sf ../lib $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib
+
+$(TOOL_BUILD_DIR):
+	@mkdir -p $(TOOL_BUILD_DIR)
+
+%-prepare: $(STAMP_DIR) $(STAGING_DIR) $(TOOL_BUILD_DIR)
+	@[ -f $(STAMP_DIR)/.toolchain_$@ ] || $(MAKE) -C $(patsubst %-prepare,%,$@) prepare
+	@touch $(STAMP_DIR)/.toolchain_$@
+
+%-compile: %-prepare 
+	@[ -f $(STAMP_DIR)/.toolchain_$@ ] || $(MAKE) -C $(patsubst %-compile,%,$@) compile
+	@touch $(STAMP_DIR)/.toolchain_$@
+
+%-install: %-compile
+	@[ -f $(STAMP_DIR)/.toolchain_$@ ] || $(MAKE) -C $(patsubst %-install,%,$@) install
+	@touch $(STAMP_DIR)/.toolchain_$@
+
+%-clean:
+	@$(MAKE) -C $(patsubst %-clean,%,$@) clean
+	@rm -f $(STAMP_DIR)/.toolchain_$(patsubst %-clean,%,$@)-*
+
+

file:a/toolchain/Makefile.in (deleted)
--- a/toolchain/Makefile.in
+++ /dev/null
@@ -1,11 +1,1 @@
-ifeq ($(BR2_ENABLE_MULTILIB),y)
-MULTILIB:=--enable-multilib
-endif
 
-
-# FIXME -- this is temporary
-OPTIMIZE_FOR_CPU=$(ARCH)
-
-# gcc has a bunch of needed stuff....
-include toolchain/gcc/Makefile.in
-

--- /dev/null
+++ b/toolchain/binutils/2.14.90.0.6/002-max-pagesize.patch
@@ -1,1 +1,13 @@
+diff -urN binutils-2.14.90.0.8.test/bfd/elf32-mips.c binutils-2.14.90.0.8/bfd/elf32-mips.c
+--- binutils-2.14.90.0.8.test/bfd/elf32-mips.c	2004-01-14 22:07:43.000000000 +0100
++++ binutils-2.14.90.0.8/bfd/elf32-mips.c	2005-03-03 23:44:00.000000000 +0100
+@@ -1611,7 +1611,7 @@
+ 
+ /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
+    page sizes of up to that limit, so we need to respect it.  */
+-#define ELF_MAXPAGESIZE			0x10000
++#define ELF_MAXPAGESIZE			0x1000
+ #define elf32_bed			elf32_tradbed
+ 
+ /* Include the target file again for this target.  */
 

--- /dev/null
+++ b/toolchain/binutils/2.14.90.0.7/002-max-pagesize.patch
@@ -1,1 +1,13 @@
+diff -urN binutils-2.14.90.0.8.test/bfd/elf32-mips.c binutils-2.14.90.0.8/bfd/elf32-mips.c
+--- binutils-2.14.90.0.8.test/bfd/elf32-mips.c	2004-01-14 22:07:43.000000000 +0100
++++ binutils-2.14.90.0.8/bfd/elf32-mips.c	2005-03-03 23:44:00.000000000 +0100
+@@ -1611,7 +1611,7 @@
+ 
+ /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
+    page sizes of up to that limit, so we need to respect it.  */
+-#define ELF_MAXPAGESIZE			0x10000
++#define ELF_MAXPAGESIZE			0x1000
+ #define elf32_bed			elf32_tradbed
+ 
+ /* Include the target file again for this target.  */
 

--- /dev/null
+++ b/toolchain/binutils/2.15/002-max-pagesize.patch
@@ -1,1 +1,13 @@
+diff -urN binutils-2.14.90.0.8.test/bfd/elf32-mips.c binutils-2.14.90.0.8/bfd/elf32-mips.c
+--- binutils-2.14.90.0.8.test/bfd/elf32-mips.c	2004-01-14 22:07:43.000000000 +0100
++++ binutils-2.14.90.0.8/bfd/elf32-mips.c	2005-03-03 23:44:00.000000000 +0100
+@@ -1611,7 +1611,7 @@
+ 
+ /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
+    page sizes of up to that limit, so we need to respect it.  */
+-#define ELF_MAXPAGESIZE			0x10000
++#define ELF_MAXPAGESIZE			0x1000
+ #define elf32_bed			elf32_tradbed
+ 
+ /* Include the target file again for this target.  */
 

--- /dev/null
+++ b/toolchain/binutils/Makefile
@@ -1,1 +1,10 @@
+include $(TOPDIR)/rules.mk
 
+include ./binutils.mk
+
+source: binutils-source
+prepare: $(BINUTILS_DIR)/.patched
+compile: $(BINUTILS_DIR1)/binutils/objdump
+install: binutils
+clean: binutils-distclean binutils-toolclean
+

--- a/toolchain/binutils/Makefile.in
+++ /dev/null
@@ -1,2 +1,1 @@
-BINUTILS_VERSION:=$(strip $(subst ",, $(BR2_BINUTILS_VERSION)))
 

--- a/toolchain/binutils/binutils.mk
+++ b/toolchain/binutils/binutils.mk
@@ -33,7 +33,7 @@
 
 $(BINUTILS_DIR)/.patched: $(BINUTILS_DIR)/.unpacked
 	# Apply appropriate binutils patches.
-	toolchain/patch-kernel.sh $(BINUTILS_DIR) toolchain/binutils/$(BINUTILS_VERSION) \*.patch
+	$(SCRIPT_DIR)/patch-kernel.sh $(BINUTILS_DIR) ./$(BINUTILS_VERSION) \*.patch
 	touch $(BINUTILS_DIR)/.patched
 
 $(BINUTILS_DIR1)/.configured: $(BINUTILS_DIR)/.patched
@@ -54,10 +54,10 @@
 
 # Make install will put gettext data in staging_dir/share/locale.
 # Unfortunatey, it isn't configureable.
-$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld: $(BINUTILS_DIR1)/binutils/objdump
+$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-ld: $(BINUTILS_DIR1)/binutils/objdump
 	$(MAKE) -C $(BINUTILS_DIR1) install
 
-binutils-dependancies:
+binutils-dependencies:
 	@if ! which bison > /dev/null ; then \
 		echo -e "\n\nYou must install 'bison' on your build machine\n"; \
 		exit 1; \
@@ -71,7 +71,7 @@
 		exit 1; \
 	fi;
 
-binutils: binutils-dependancies $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/bin/ld
+binutils: binutils-dependencies $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-ld
 
 binutils-source: $(DL_DIR)/$(BINUTILS_SOURCE)
 
@@ -82,6 +82,8 @@
 binutils-toolclean:
 	rm -rf $(BINUTILS_DIR1)
 
+binutils-distclean:
+	rm -rf $(BINUTILS_DIR)
 
 
 #############################################################

 Binary files a/toolchain/gcc/2.95/050-debian-subset.patch.bz2 and /dev/null differ
--- a/toolchain/gcc/2.95/100-uclibc-conf.patch
+++ /dev/null
@@ -1,292 +1,1 @@
-Warning!  The powerpc patch (rs6000/linux.h) is hack-ish and would
-definitely need to be improved to be acceptable upstream.  Also,
-this patch isn't complete as it only supports i386, arm, mips, and
-powerpc (rs6000).
-diff -urN gcc-20011006/config.sub gcc-20011006-new/config.sub
---- gcc-20011006/config.sub	2004-01-13 06:15:28.000000000 -0600
-+++ gcc-20011006-new/config.sub	2004-01-10 11:09:35.000000000 -0600
-@@ -68,7 +68,7 @@
- # Here we must recognize all the valid KERNEL-OS combinations.
- maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
- case $maybe_os in
--  linux-gnu*)
-+  linux-gnu* | linux-uclibc*)
-     os=-$maybe_os
-     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-     ;;
-@@ -936,7 +936,8 @@
- 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
--	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
-+	      | -mingw32* | -linux-gnu* | -linux-uclibc* \
-+	      | -uxpv* | -beos* | -mpeix* | -udk* \
- 	      | -interix* | -uwin* )
- 	# Remember, each alternative MUST END IN *, to match a version number.
- 		;;
-diff -urN gcc-20011006/gcc/config/arm/linux-elf.h gcc-20011006-new/gcc/config/arm/linux-elf.h
---- gcc-20011006/gcc/config/arm/linux-elf.h	2004-01-13 06:15:28.000000000 -0600
-+++ gcc-20011006-new/gcc/config/arm/linux-elf.h	2004-01-10 11:12:11.000000000 -0600
-@@ -90,6 +90,18 @@
- #define ENDFILE_SPEC \
-   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
- 
-+#ifdef USE_UCLIBC
-+#define LINK_SPEC "%{h*} %{version:-v} \
-+   %{b} %{Wl,*:%*} \
-+   %{static:-Bstatic} \
-+   %{shared:-shared} \
-+   %{symbolic:-Bsymbolic} \
-+   %{rdynamic:-export-dynamic} \
-+   %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \
-+   -X \
-+   %{mbig-endian:-EB}" \
-+   SUBTARGET_EXTRA_LINK_SPEC
-+#else
- #define LINK_SPEC "%{h*} %{version:-v} \
-    %{b} %{Wl,*:%*} \
-    %{static:-Bstatic} \
-@@ -100,6 +112,7 @@
-    -X \
-    %{mbig-endian:-EB}" \
-    SUBTARGET_EXTRA_LINK_SPEC
-+#endif
- 
- #undef  CPP_PREDEFINES
- #define CPP_PREDEFINES \
-diff -urN gcc-20011006/gcc/config/i386/linux.h gcc-20011006-new/gcc/config/i386/linux.h
---- gcc-20011006/gcc/config/i386/linux.h	2001-04-03 17:38:59.000000000 -0500
-+++ gcc-20011006-new/gcc/config/i386/linux.h	2004-01-10 11:15:38.000000000 -0600
-@@ -199,6 +199,15 @@
- 	%{static:-static}}}"
- #endif
- #else
-+#if defined USE_UCLIBC
-+#define LINK_SPEC "-m elf_i386 %{shared:-shared} \
-+  %{!shared: \
-+    %{!ibcs: \
-+      %{!static: \
-+	%{rdynamic:-export-dynamic} \
-+	%{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
-+	%{static:-static}}}"
-+#else
- #define LINK_SPEC "-m elf_i386 %{shared:-shared} \
-   %{!shared: \
-     %{!ibcs: \
-@@ -207,6 +216,7 @@
- 	%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
- 	%{static:-static}}}"
- #endif
-+#endif
- 
- /* Get perform_* macros to build libgcc.a.  */
- #include "i386/perform.h"
-diff -urN gcc-20011006/gcc/config/mips/linux.h gcc-20011006-new/gcc/config/mips/linux.h
---- gcc-20011006/gcc/config/mips/linux.h	2004-01-13 06:15:28.000000000 -0600
-+++ gcc-20011006-new/gcc/config/mips/linux.h	2004-01-10 11:16:39.000000000 -0600
-@@ -154,6 +154,17 @@
- 
- /* Borrowed from sparc/linux.h */
- #undef LINK_SPEC
-+#ifdef USE_UCLIBC
-+#define LINK_SPEC \
-+ "%(endian_spec) \
-+  %{shared:-shared} \
-+  %{!shared: \
-+    %{!ibcs: \
-+      %{!static: \
-+        %{rdynamic:-export-dynamic} \
-+        %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
-+        %{static:-static}}}"
-+#else
- #define LINK_SPEC \
-  "%(endian_spec) \
-   %{shared:-shared} \
-@@ -163,6 +174,7 @@
-         %{rdynamic:-export-dynamic} \
-         %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
-         %{static:-static}}}"
-+#endif
- 
- 
- #undef SUBTARGET_ASM_SPEC
-diff -urN old/gcc-20011006/gcc/config/mips/t-linux-uclibc gcc-20011006/gcc/config/mips/t-linux-uclibc
---- old/gcc-20011006/gcc/config/mips/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600
-+++ gcc-20011006/gcc/config/mips/t-linux-uclibc	2004-01-14 02:51:10.000000000 -0600
-@@ -0,0 +1 @@
-+T_CFLAGS = -DUSE_UCLIBC
-diff -urN gcc-20011006/gcc/config/rs6000/linux.h gcc-20011006-new/gcc/config/rs6000/linux.h
---- gcc-20011006/gcc/config/rs6000/linux.h	2001-04-03 17:38:59.000000000 -0500
-+++ gcc-20011006-new/gcc/config/rs6000/linux.h	2004-01-10 11:15:38.000000000 -0600
-@@ -36,12 +36,21 @@
- #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
- 
- #undef LINK_SPEC
-+#ifdef USE_UCLIBC
-+#define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \
-+  %{!shared: \
-+    %{!static: \
-+      %{rdynamic:-export-dynamic} \
-+      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
-+    %{static:-static}}"
-+#else
- #define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \
-   %{!shared: \
-     %{!static: \
-       %{rdynamic:-export-dynamic} \
-       %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
-     %{static:-static}}"
-+#endif
- 
- #undef	LIB_DEFAULT_SPEC
- #define LIB_DEFAULT_SPEC "%(lib_linux)"
-diff -urN gcc-20011006/gcc/config/t-linux-uclibc gcc-20011006-new/gcc/config/t-linux-uclibc
---- gcc-20011006/gcc/config/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600
-+++ gcc-20011006-new/gcc/config/t-linux-uclibc	2004-01-10 11:18:46.000000000 -0600
-@@ -0,0 +1,18 @@
-+T_CFLAGS = -DUSE_UCLIBC
-+
-+# Don't run fixproto
-+STMP_FIXPROTO =
-+
-+# Don't install "assert.h" in gcc. We use the one in glibc.
-+INSTALL_ASSERT_H =
-+
-+# Compile crtbeginS.o and crtendS.o with pic.
-+CRTSTUFF_T_CFLAGS_S = -fPIC
-+# Compile libgcc2.a with pic.
-+TARGET_LIBGCC2_CFLAGS = -fPIC
-+
-+# Do not build libgcc1. Let gcc generate those functions. The GNU/Linux
-+# C library can handle them.
-+LIBGCC1 = 
-+CROSS_LIBGCC1 =
-+LIBGCC1_TEST =
-diff -urN gcc-20011006/gcc/configure gcc-20011006-new/gcc/configure
---- gcc-20011006/gcc/configure	2004-01-13 06:15:28.000000000 -0600
-+++ gcc-20011006-new/gcc/configure	2004-01-10 11:28:54.000000000 -0600
-@@ -3219,6 +3219,24 @@
- 			;;
- 		esac
- 		;;
-+	arm*-*-linux-uclibc*)		# ARM GNU/Linux with ELF - uClibc
-+		xm_file=arm/xm-linux.h
-+		xmake_file=x-linux
-+		tm_file="arm/linux-elf.h"
-+		case $machine in
-+		armv2*-*-*)
-+			tm_file="arm/linux-elf26.h $tm_file"
-+			;;
-+		esac
-+		tmake_file="t-linux-uclibc arm/t-linux"
-+		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+		gnu_ld=yes
-+		case x${enable_threads} in
-+		x | xyes | xpthreads | xposix)
-+			thread_file='posix'
-+			;;
-+		esac
-+		;;
- 	arm*-*-aout)
- 		tm_file=arm/aout.h
- 		tmake_file=arm/t-bare
-@@ -3631,6 +3649,18 @@
-  			thread_file='single'
-  		fi
- 		;;
-+	i[34567]86-*-linux*uclibc*)	# Intel 80386's running GNU/Linux
-+					# with ELF format using uClibc
-+		xmake_file=x-linux
-+		tm_file=i386/linux.h
-+		tmake_file="t-linux-uclibc i386/t-crtstuff"
-+		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+		gnu_ld=yes
-+		float_format=i386
-+ 		if test x$enable_threads = xyes; then
-+ 			thread_file='posix'
-+ 		fi
-+		;;
- 	i[34567]86-*-linux-gnu*)	# Intel 80386's running GNU/Linux
- 					# aka GNU/Linux C library 6
- 		xmake_file=x-linux
-@@ -4696,7 +4726,19 @@
- 		# On NetBSD, the headers are already okay, except for math.h.
- 		tmake_file=t-netbsd
- 		;;
--       mips*-*-linux*)                         # Linux MIPS, either endian.
-+	mips*-*-linux-uclibc*)          # Linux (uclibc) MIPS, either endian.
-+		tmake_file=mips/t-linux-uclibc
-+		xmake_file=x-linux
-+		xm_file="xm-siglist.h ${xm_file}"
-+               case $machine in
-+                       mipsel-*)  tm_file="mips/elfl.h mips/linux.h" ;;
-+                       *)         tm_file="mips/elf.h mips/linux.h" ;;
-+               esac
-+		extra_parts="crtbegin.o crtend.o"
-+		gnu_ld=yes
-+		gas=yes
-+		;;
-+	mips*-*-linux*)                         # Linux MIPS, either endian.
- 		xmake_file=x-linux
- 		xm_file="xm-siglist.h ${xm_file}"
-                case $machine in
-@@ -5159,6 +5201,24 @@
- 			thread_file='posix'
- 		fi
- 		;;
-+	powerpc-*-linux-uclibc*)
-+		tm_file=rs6000/linux.h
-+		xm_file="xm-siglist.h rs6000/xm-sysv4.h"
-+		xm_defines="USG ${xm_defines}"
-+		out_file=rs6000/rs6000.c
-+		if test x$gas = xyes
-+		then
-+			tmake_file="rs6000/t-ppcos t-linux-uclibc rs6000/t-ppccomm"
-+		else
-+			tmake_file="rs6000/t-ppc t-linux-uclibc rs6000/t-ppccomm"
-+		fi
-+		xmake_file=x-linux
-+		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
-+		extra_headers=ppc-asm.h
-+		if test x$enable_threads = xyes; then
-+			thread_file='posix'
-+		fi
-+		;;
-         powerpc-wrs-vxworks*)
-                 cpu_type=rs6000
- 		xm_file="xm-siglist.h rs6000/xm-sysv4.h"
-diff -urN gcc-20011006/ltconfig gcc-20011006-new/ltconfig
---- gcc-20011006/ltconfig	1999-06-21 21:35:12.000000000 -0500
-+++ gcc-20011006-new/ltconfig	2004-01-10 11:34:23.000000000 -0600
-@@ -436,6 +436,7 @@
- # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
- case "$host_os" in
- linux-gnu*) ;;
-+linux-uclibc*) ;;
- linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
- esac
- 
-@@ -1773,6 +1774,22 @@
-   fi
-   ;;
- 
-+linux-uclibc*)
-+  version_type=linux
-+  need_lib_prefix=no
-+  need_version=no
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-+  soname_spec='${libname}${release}.so$major'
-+  finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir'
-+  shlibpath_var=LD_LIBRARY_PATH
-+  shlibpath_overrides_runpath=no
-+  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
-+  file_magic_cmd=/usr/bin/file
-+  file_magic_test_file=`echo /lib/libuClibc-*.so`
-+  # Assume using the uClibc dynamic linker.
-+  dynamic_linker="uClibc ld.so"
-+  ;;
-+
- netbsd*)
-   version_type=sunos
-   if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
 

--- a/toolchain/gcc/2.95/STLport-4.5.3.patch
+++ /dev/null
@@ -1,408 +1,1 @@
-diff -urN STLport-4.5.3/Makefile STLport-4.5.3-devel/Makefile
---- STLport-4.5.3/Makefile	Wed Dec 31 17:00:00 1969
-+++ STLport-4.5.3-devel/Makefile	Tue Jan  7 15:28:08 2003
-@@ -0,0 +1,44 @@
-+# Makefile to compile stlport with uClibc
-+#
-+# Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
-+#
-+# 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 of the License, 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.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with this program; if not, write to the Free Software
-+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+
-+ARCH:=i386
-+PREFIX:=/usr/$(ARCH)-linux-uclibc
-+CROSS:= $(PREFIX)/../bin/$(ARCH)-linux-uclibc-
-+CC=$(CROSS)gcc
-+CXX=$(CROSS)g++
-+AR = $(CROSS)ar
-+STRIP = $(CROSS)strip --remove-section=.comment --remove-section=.note --strip-unneeded
-+.EXPORT_ALL_VARIABLES:
-+
-+all:
-+	rm -f lib/lib*
-+	make -C src -f gcc-uClibc.mak all
-+	(cd lib; rm -f libstdc++_debug.so; \
-+	ln -fs libstdc++.so.4.5 libstdc++.so; \
-+	ln -fs libstdc++.so.4.5 libstdc++.so.0;)
-+	$(STRIP) lib/libstdc++.so.4.5; 
-+
-+clean:
-+	make -C src -f gcc-uClibc.mak clean
-+	rm -rf lib/*
-+
-+install:
-+	(cd lib; \
-+	cp -a libstdc++.a $(PREFIX)/lib; \
-+	cp -a libstdc++.so libstdc++.so.0 libstdc++.so.4.5 $(PREFIX)/lib;)
-+	cp -a stlport $(PREFIX)/include/c++
-diff -urN STLport-4.5.3/src/dll_main.cpp STLport-4.5.3-devel/src/dll_main.cpp
---- STLport-4.5.3/src/dll_main.cpp	Sat Feb  2 16:11:56 2002
-+++ STLport-4.5.3-devel/src/dll_main.cpp	Tue Jan  7 15:28:08 2003
-@@ -52,7 +52,7 @@
- #  include <locale>
- # endif
- 
--# if defined (_STLP_UNIX)
-+# if defined (_STLP_UNIX) && defined (_STLP_PTHREADS) && ! defined (_STLP_USE_UCLIBC)
- #  define _STLP_HAS_PERTHREAD_ALLOCATOR
- # include <stl/_pthread_alloc.h>
- # endif
-diff -urN STLport-4.5.3/src/gcc-uClibc.mak STLport-4.5.3-devel/src/gcc-uClibc.mak
---- STLport-4.5.3/src/gcc-uClibc.mak	Wed Dec 31 17:00:00 1969
-+++ STLport-4.5.3-devel/src/gcc-uClibc.mak	Tue Jan  7 15:28:08 2003
-@@ -0,0 +1,61 @@
-+#
-+# Basename for libraries
-+#
-+LIB_BASENAME:=libstdc++
-+LIB_SHAREDNAME:=$(LIB_BASENAME).so
-+LIB_SHAREDNAME_FULL:=$(LIB_SHAREDNAME).0
-+
-+#
-+# guts for common stuff
-+#
-+#
-+LINK:=$(AR) -cr
-+#DYN_LINK:=$(CC) -fno-exceptions -lpthread -lm -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o
-+DYN_LINK:=$(CC) -fno-exceptions -shared -Wl,-soname=$(LIB_SHAREDNAME_FULL) -o
-+
-+OBJEXT=o
-+DYNEXT=so
-+STEXT=a
-+RM=rm -rf
-+PATH_SEP=/
-+MKDIR=mkdir -p
-+COMP=GCC$(ARCH)
-+INSTALL_STEP = install_unix 
-+
-+all: release_dynamic release_static
-+#all: all_dynamic all_static symbolic_links 
-+
-+include common_macros.mak
-+STLDEBUG_NAME:=$(LIB_BASENAME).debug
-+
-+# Lets disable exception support, since this saves over 200k...
-+DEFINE_FLAGS:= -fno-exceptions
-+#DEFINE_FLAGS:= -D_STLP_NO_EXCEPTIONS -fno-exceptions -DSTL_NO_EXCEPTIONS
-+
-+#DEFINE_FLAGS+= -D_STLP_USE_UCLIBC -D_STLP_NO_WCHAR_T \
-+#	-DUSE_SPRINTF_INSTEAD -D_ISOC99_SOURCE
-+
-+WARNING_FLAGS:= -W -Wno-sign-compare -Wno-unused -Wno-uninitialized
-+INCLUDE_FLAGS = -I${STLPORT_DIR}
-+CXXFLAGS_COMMON = $(WARNING_FLAGS)  $(DEFINE_FLAGS) $(INCLUDE_FLAGS)
-+
-+CXXFLAGS_RELEASE_static = $(CXXFLAGS_COMMON) -Os
-+CXXFLAGS_RELEASE_dynamic = $(CXXFLAGS_COMMON) -Os -fPIC
-+
-+CXXFLAGS_DEBUG_static = $(CXXFLAGS_COMMON) -O -g
-+CXXFLAGS_DEBUG_dynamic = $(CXXFLAGS_COMMON) -O -g -fPIC
-+
-+CXXFLAGS_STLDEBUG_static = $(CXXFLAGS_DEBUG_static) -D_STLP_DEBUG
-+CXXFLAGS_STLDEBUG_dynamic = $(CXXFLAGS_DEBUG_dynamic) -D_STLP_DEBUG -fPIC
-+
-+include common_percent_rules.mak
-+include common_rules.mak
-+
-+
-+#install: all
-+#	cp -p $(LIB_TARGET) ${D_LIB_TARGET} ../lib
-+
-+#%.s: %.cpp
-+#	$(CXX) $(CXXFLAGS) -O4 -S -pto $<  -o $@
-+
-+
-diff -urN STLport-4.5.3/src/num_put_float.cpp STLport-4.5.3-devel/src/num_put_float.cpp
---- STLport-4.5.3/src/num_put_float.cpp	Fri Jan 18 15:06:52 2002
-+++ STLport-4.5.3-devel/src/num_put_float.cpp	Tue Jan  7 15:28:08 2003
-@@ -65,6 +65,12 @@
- 
- # endif
- 
-+#  if defined(_STLP_USE_UCLIBC)
-+#    define __USE_ISOC99 1
-+#    include <math.h>
-+#    include <float.h>
-+#  endif
-+
- # include <cstdlib>
- 
- #if defined (_MSC_VER) || defined (__MINGW32__) || defined (__BORLANDC__) || defined (__DJGPP)  || defined (_STLP_SCO_OPENSERVER) || defined (__NCR_SVR)
-@@ -209,7 +215,7 @@
- 
- #ifdef USE_SPRINTF_INSTEAD
- 
--#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) )
-+#elif defined (__hpux) || defined (__DJGPP) || ( defined(_STLP_USE_GLIBC) && ! defined (__MSL__) ) || defined (_STLP_USE_UCLIBC)
- #  if defined (isfinite) 
- inline bool _Stl_is_nan_or_inf(double x) { return !isfinite(x); }
- #  else
-@@ -238,7 +244,7 @@
- }
- inline bool _Stl_is_neg_inf(double x)    { return _fpclass(x) == _FPCLASS_NINF; }
- inline bool _Stl_is_neg_nan(double x)    { return _isnan(x) && _copysign(1., x) < 0 ; } 
--#elif defined(__MRC__) || defined(__SC__)		//*TY 02/24/2000 - added support for MPW
-+#elif defined(__MRC__) || defined(__SC__)
- bool _Stl_is_nan_or_inf(double x) { return isnan(x) || !isfinite(x); }
- bool _Stl_is_inf(double x)        { return !isfinite(x); }
- bool _Stl_is_neg_inf(double x)    { return !isfinite(x) && signbit(x); }
-@@ -280,7 +286,7 @@
-   inline char* _Stl_qfcvtR(long double x, int n, int* pt, int* sign, char* buf)
-     { return fcvtbuf(x, n, pt, sign, buf); }
- # endif
--#elif defined (_STLP_USE_GLIBC)
-+#elif defined (_STLP_USE_GLIBC) || defined(_STLP_USE_UCLIBC)
-   inline char* _Stl_ecvtR(double x, int n, int* pt, int* sign, char* buf)
-     { return buf + ecvt_r(x, n, pt, sign, buf, NDIG+2); }
-   inline char* _Stl_fcvtR(double x, int n, int* pt, int* sign, char* buf)
-diff -urN STLport-4.5.3/src/stdio_streambuf.cpp STLport-4.5.3-devel/src/stdio_streambuf.cpp
---- STLport-4.5.3/src/stdio_streambuf.cpp	Thu Jan 10 11:41:52 2002
-+++ STLport-4.5.3-devel/src/stdio_streambuf.cpp	Tue Jan  7 15:28:08 2003
-@@ -82,7 +82,7 @@
-     _STLP_VENDOR_CSTD::fgetpos(_M_file, &pos);
-     // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead
-     // of a primitive type
--#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) )
-+#if defined(_STLP_USE_UCLIBC) || (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) )
-     return pos_type((streamoff)pos.__pos);
- #elif defined(__ISCPP__) || defined(__MVS__) || (__OS400__)
-      return pos_type(pos.__fpos_elem[ 0 ]);
-@@ -101,13 +101,16 @@
- 
-   // added 21 june 00 mdb,rjf,wjs: glibc 2.2 changed fpos_t to be a struct instead
-   // of a primitive type
--#if (defined(__GLIBC__) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) )
-+#if (defined(__GLIBC__) && defined(_STLP_USE_GLIBC) && ( (__GLIBC__ > 2) || ( (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 2) ) ) )
-   fpos_t p;
-   p.__pos = pos;
-   memset( &(p.__state), 0, sizeof(p.__state) );
- #elif defined(__MVS__) || (__OS400__)
-   fpos_t p;
-   p.__fpos_elem[0] = pos;
-+#elif defined(_STLP_USE_UCLIBC)
-+  fpos_t p;
-+  p.__pos = pos;
- #else
-   fpos_t p(pos);
- #endif
-diff -urN STLport-4.5.3/stlport/config/_prolog.h STLport-4.5.3-devel/stlport/config/_prolog.h
---- STLport-4.5.3/stlport/config/_prolog.h	Sun Oct 28 13:26:44 2001
-+++ STLport-4.5.3-devel/stlport/config/_prolog.h	Tue Jan  7 15:28:08 2003
-@@ -1,3 +1,8 @@
-+/* Evil hack to make sure everything behaves itself */
-+#define _STLP_USE_UCLIBC
-+//#define _STLP_NO_WCHAR_T
-+//#define _ISOC99_SOURCE
-+//#define USE_SPRINTF_INSTEAD
- 
- #if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
- 
-diff -urN STLport-4.5.3/stlport/config/stl_gcc.h STLport-4.5.3-devel/stlport/config/stl_gcc.h
---- STLport-4.5.3/stlport/config/stl_gcc.h	Thu Jan 10 11:41:58 2002
-+++ STLport-4.5.3-devel/stlport/config/stl_gcc.h	Tue Jan  7 15:28:08 2003
-@@ -3,7 +3,7 @@
-  */
- 
- /* Systems having GLIBC installed have different traits */
--#if ! defined (_STLP_USE_GLIBC) && ( defined (__linux__) || defined (__CYGWIN__) )
-+#if ! defined (_STLP_USE_GLIBC)  && ! defined (_STLP_USE_UCLIBC) && ( defined (__linux__) || defined (__CYGWIN__) )
- # define _STLP_USE_GLIBC
- #endif
- 
-diff -urN STLport-4.5.3/stlport/cstdlib STLport-4.5.3-devel/stlport/cstdlib
---- STLport-4.5.3/stlport/cstdlib	Thu Aug 23 15:51:54 2001
-+++ STLport-4.5.3-devel/stlport/cstdlib	Tue Jan  7 15:28:08 2003
-@@ -55,9 +55,11 @@
- using _STLP_VENDOR_CSTD::atof;
- using _STLP_VENDOR_CSTD::atoi;
- using _STLP_VENDOR_CSTD::atol;
-+# ifndef _STLP_USE_UCLIBC
- using _STLP_VENDOR_CSTD::mblen;
- using _STLP_VENDOR_CSTD::mbstowcs;
- using _STLP_VENDOR_CSTD::mbtowc;
-+# endif
- using _STLP_VENDOR_CSTD::strtod;
- using _STLP_VENDOR_CSTD::strtol;
- using _STLP_VENDOR_CSTD::strtoul;
-diff -urN STLport-4.5.3/stlport/stl/_config.h STLport-4.5.3-devel/stlport/stl/_config.h
---- STLport-4.5.3/stlport/stl/_config.h	Fri Jan 18 15:08:36 2002
-+++ STLport-4.5.3-devel/stlport/stl/_config.h	Tue Jan  7 15:28:08 2003
-@@ -26,6 +26,16 @@
- #ifndef _STLP_CONFIG_H
- # define _STLP_CONFIG_H
- 
-+/* Make the STLport headers provide uClibc support by default */
-+#define _STLP_NO_EXCEPTIONS		1
-+#define STL_NO_EXCEPTIONS		1
-+#define _STLP_USE_UCLIBC		1
-+//#define _STLP_NO_WCHAR_T		1
-+#define _STLP_NO_LONG_DOUBLE		1
-+#define USE_SPRINTF_INSTEAD		1
-+#define _ISOC99_SOURCE			1
-+#define _STLP_NO_ANACHRONISMS		1
-+
- /*
-  * Purpose of this file :
-  *
-@@ -164,7 +174,7 @@
- /* Operating system recognition (basic) */
- # if defined (__unix) || defined (__linux__) || defined (__QNX__) || defined (_AIX)  || defined (__NetBSD__) || defined (__Lynx__)
- #  define _STLP_UNIX 1
--#  if defined (__linux__) && ! defined (_STLP_USE_GLIBC)
-+#  if defined (__linux__) && ! defined (_STLP_USE_GLIBC) && ! defined (_STLP_USE_UCLIBC)
- #   define _STLP_USE_GLIBC 1
- #  endif
- # elif defined(macintosh) || defined (_MAC)
-diff -urN STLport-4.5.3/stlport/stl/_stdio_file.h STLport-4.5.3-devel/stlport/stl/_stdio_file.h
---- STLport-4.5.3/stlport/stl/_stdio_file.h	Fri Jan 18 15:07:00 2002
-+++ STLport-4.5.3-devel/stlport/stl/_stdio_file.h	Tue Jan  7 15:28:08 2003
-@@ -634,6 +634,112 @@
- }
- # define _STLP_FILE_I_O_IDENTICAL
- 
-+#elif defined(_STLP_USE_UCLIBC)
-+
-+#if defined(__MASK_READING)
-+
-+inline int   _FILE_fd(const FILE *__f) { return __f->__filedes; }
-+
-+//       Returns a pointer to the beginning of the buffer.
-+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__bufstart; }
-+
-+//       Returns the current read/write position within the buffer.
-+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__bufpos; }
-+
-+//       Returns a pointer immediately past the end of the buffer.
-+inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->__bufend; }
-+
-+//       Returns the number of characters remaining in the buffer, i.e.
-+//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
-+inline ptrdiff_t _FILE_I_avail(const FILE *__f) 
-+  { return __f->__bufgetc_u - __f->__bufpos; }
-+
-+//       Increments the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_preincr(FILE *__f)  { return *(char*)(++__f->__bufpos); }
-+
-+//       Increments the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_postincr(FILE *__f)  { return *(char*)(__f->__bufpos++); }
-+
-+//       Decrements the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_predecr(FILE *__f)  { return *(char*)(--__f->__bufpos); }
-+
-+//       Decrements the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_postdecr(FILE *__f)  { return *(char*)(__f->__bufpos--); }
-+
-+//       Increments the current read/write position by __n.
-+inline void  _FILE_I_bump(FILE *__f, int __n) { __f->__bufpos += __n; }
-+
-+//       Sets the beginning of the bufer to __begin, the current read/write
-+//       position to __next, and the buffer's past-the-end pointer to __end.
-+//       If any of those pointers is null, then all of them must be null.
-+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
-+{
-+	__f->__bufstart = (unsigned char*)__begin;
-+	__f->__bufpos  =  (unsigned char*)__next;
-+	__f->__bufend  =  (unsigned char*)__end;
-+	__f->__bufgetc_u = (unsigned char*)__begin;
-+	__f->__bufputc_u = (unsigned char*)__end;
-+}
-+
-+# define _STLP_FILE_I_O_IDENTICAL
-+
-+#else    // Support old stdio for a little while.
-+
-+inline int   _FILE_fd(const FILE *__f) { return __f->filedes; }
-+
-+//       Returns a pointer to the beginning of the buffer.
-+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->bufstart; }
-+
-+//       Returns the current read/write position within the buffer.
-+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->bufpos; }
-+
-+//       Returns a pointer immediately past the end of the buffer.
-+inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->bufend; }
-+
-+//       Returns the number of characters remaining in the buffer, i.e.
-+//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
-+inline ptrdiff_t _FILE_I_avail(const FILE *__f) 
-+  { return __f->bufgetc - __f->bufpos; }
-+
-+//       Increments the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_preincr(FILE *__f)  { return *(char*)(++__f->bufpos); }
-+
-+//       Increments the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_postincr(FILE *__f)  { return *(char*)(__f->bufpos++); }
-+
-+//       Decrements the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_predecr(FILE *__f)  { return *(char*)(--__f->bufpos); }
-+
-+//       Decrements the current read/write position by 1, returning the 
-+//       character at the old position.
-+inline char& _FILE_I_postdecr(FILE *__f)  { return *(char*)(__f->bufpos--); }
-+
-+//       Increments the current read/write position by __n.
-+inline void  _FILE_I_bump(FILE *__f, int __n) { __f->bufpos += __n; }
-+
-+//       Sets the beginning of the bufer to __begin, the current read/write
-+//       position to __next, and the buffer's past-the-end pointer to __end.
-+//       If any of those pointers is null, then all of them must be null.
-+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
-+{
-+	__f->bufstart = (unsigned char*)__begin;
-+	__f->bufpos  =  (unsigned char*)__next;
-+	__f->bufend  =  (unsigned char*)__end;
-+	__f->bufgetc = (unsigned char*)__begin;
-+	__f->bufputc = (unsigned char*)__end;
-+}
-+
-+# define _STLP_FILE_I_O_IDENTICAL
-+
-+#endif
-+
- #else  /* A C library that we don't have an implementation for. */
- 
- # error The C++ I/O library is not configured for this compiler
-diff -urN STLport-4.5.3/stlport/stl/c_locale.h STLport-4.5.3-devel/stlport/stl/c_locale.h
---- STLport-4.5.3/stlport/stl/c_locale.h	Fri Jan 18 15:07:00 2002
-+++ STLport-4.5.3-devel/stlport/stl/c_locale.h	Wed Jan  8 10:58:10 2003
-@@ -401,6 +401,21 @@
- #  define _Locale_SPACE _S
- #  define _Locale_PRINT (_P | _U | _L | _N | _B)
- #  define _Locale_ALPHA (_U | _L)
-+
-+# elif defined(_STLP_USE_UCLIBC) /* linux, using the gnu compiler */
-+
-+#  define _Locale_CNTRL  _IScntrl
-+#  define _Locale_UPPER  _ISupper
-+#  define _Locale_LOWER  _ISlower
-+#  define _Locale_DIGIT  _ISdigit
-+#  define _Locale_XDIGIT _ISxdigit
-+#  define _Locale_PUNCT  _ISpunct
-+#  define _Locale_SPACE  _ISspace
-+#  define _Locale_PRINT  _ISprint
-+#  define _Locale_ALPHA  _ISalpha
-+
-+#else
-+#  error Unknown Locale
- #endif
- 
- # endif /* _STLP_C_LOCALE_H */
 

--- a/toolchain/gcc/Config.in
+++ b/toolchain/gcc/Config.in
@@ -9,10 +9,6 @@
 	default BR2_GCC_VERSION_3_3_5
 	help
 	  Select the version of gcc you wish to use.
-
-	config BR2_GCC_VERSION_2_95
-		bool "gcc 2.95"
-		depends on BR2_arm || BR2_i386 || BR2_mips || BR2_powerpc
 
 	config BR2_GCC_VERSION_3_3_3
 		bool "gcc 3.3.3"

--- /dev/null
+++ b/toolchain/gcc/Makefile
@@ -1,1 +1,10 @@
+include $(TOPDIR)/rules.mk
 
+include ./gcc-uclibc-3.x.mk
+
+source: gcc-source
+prepare: gcc_initial
+compile: $(GCC_BUILD_DIR2)/.compiled
+install: gcc-install
+clean: gcc_initial-clean gcc-clean
+

--- a/toolchain/gcc/gcc-uclibc-2.95.mk
+++ /dev/null
@@ -1,278 +1,1 @@
-# Makefile for to build a gcc/uClibc toolchain
-#
-# Copyright (C) 2002-2003 Erik Andersen <andersen@uclibc.org>
-# Copyright (C) 2004 Manuel Novoa III <mjn3@uclibc.org>
-#
-# 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 of the License, 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.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
-ifeq ($(findstring 2.95,$(GCC_VERSION)),2.95)
-GCC_VERSION:=$(strip $(GCC_VERSION))
-
-GCC_SITE:=http://www.uclibc.org/downloads/toolchain
-GCC_SOURCE:=gcc-20011006.tar.bz2
-GCC_DIR:=$(TOOL_BUILD_DIR)/gcc-20011006
-GCC_CAT:=bzcat
-
-STLPORT_SITE=http://www.stlport.org/archive
-STLPORT_SOURCE=STLport-4.5.3.tar.gz
-STLPORT_DIR=$(TOOL_BUILD_DIR)/STLport-4.5.3
-GCC_STRIP_HOST_BINARIES:=true
-
-#############################################################
-#
-# Setup some initial stuff
-#
-#############################################################
-
-ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
-TARGET_LANGUAGES:=c,c++
-STLPORT_TARGET=stlport
-else
-TARGET_LANGUAGES:=c
-STLPORT_TARGET=
-endif
-
-#############################################################
-#
-# build the first pass gcc compiler
-#
-#############################################################
-GCC_BUILD_DIR1:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-initial
-
-$(DL_DIR)/$(GCC_SOURCE):
-	mkdir -p $(DL_DIR)
-	$(WGET) -P $(DL_DIR) $(GCC_SITE)/$(GCC_SOURCE)
-
-$(GCC_DIR)/.unpacked: $(DL_DIR)/$(GCC_SOURCE)
-	mkdir -p $(TOOL_BUILD_DIR)
-	$(GCC_CAT) $(DL_DIR)/$(GCC_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) -
-	touch $(GCC_DIR)/.unpacked
-
-$(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked
-	# Apply any files named gcc-*.patch from the source directory to gcc
-	toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) \*.patch\*
-	#
-	# We do not wish to build the libstdc++ library provided with gcc,
-	# since it doesn't seem to work at all with uClibc plus gcc 2.95...
-	#
-	mv $(GCC_DIR)/libstdc++ $(GCC_DIR)/libstdc++.orig
-	mv $(GCC_DIR)/libio $(GCC_DIR)/libio.orig
-	#
-	touch $(GCC_DIR)/.patched
-
-# The --without-headers option stopped working with gcc 3.0 and has never been
-# # fixed, so we need to actually have working C library header files prior to
-# # the step or libgcc will not build...
-$(GCC_BUILD_DIR1)/.configured: $(GCC_DIR)/.patched
-	mkdir -p $(GCC_BUILD_DIR1)
-	-mkdir -p $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include
-	# Important!  Required for limits.h to be fixed.
-	ln -sf include $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/sys-include
-	(cd $(GCC_BUILD_DIR1); PATH=$(TARGET_PATH) \
-		$(GCC_DIR)/configure \
-		--prefix=$(STAGING_DIR) \
-		--build=$(GNU_HOST_NAME) \
-		--host=$(GNU_HOST_NAME) \
-		--target=$(REAL_GNU_TARGET_NAME) \
-		--enable-languages=c \
-		--disable-shared \
-		--includedir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include \
-		--with-headers=$(TOOL_BUILD_DIR)/uClibc_dev/usr/include \
-		--disable-__cxa_atexit \
-		--enable-target-optspace \
-		--with-gnu-ld \
-		$(DISABLE_NLS) \
-		$(MULTILIB) \
-		$(SOFT_FLOAT_CONFIG_OPTION) \
-		$(EXTRA_GCC_CONFIG_OPTIONS));
-	touch $(GCC_BUILD_DIR1)/.configured
-
-$(GCC_BUILD_DIR1)/.compiled: $(GCC_BUILD_DIR1)/.configured
-	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) all-gcc
-	touch $(GCC_BUILD_DIR1)/.compiled
-
-$(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc: $(GCC_BUILD_DIR1)/.compiled
-	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR1) install-gcc
-	#rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov
-	#rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale
-
-gcc_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc
-
-gcc_initial-clean:
-	rm -rf $(GCC_BUILD_DIR1)
-	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)*
-
-gcc_initial-dirclean:
-	rm -rf $(GCC_BUILD_DIR1)
-
-#############################################################
-#
-# STLport -- an alternative C++ library
-#
-#############################################################
-STLPORT_PATCH=toolchain/gcc/2.95/STLport-4.5.3.patch
-
-$(DL_DIR)/$(STLPORT_SOURCE):
-	$(WGET) -P $(DL_DIR) $(STLPORT_SITE)/$(STLPORT_SOURCE)
-
-$(STLPORT_DIR)/Makefile: $(DL_DIR)/$(STLPORT_SOURCE) $(STLPORT_PATCH)
-	zcat $(DL_DIR)/$(STLPORT_SOURCE) | tar -C $(TOOL_BUILD_DIR) $(TAR_OPTIONS) - 
-	cat $(STLPORT_PATCH) | patch -d $(STLPORT_DIR) -p1
-
-$(STLPORT_DIR)/lib/libstdc++.a: $(STLPORT_DIR)/Makefile
-	$(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR)
-
-$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a: $(STLPORT_DIR)/lib/libstdc++.a
-	$(MAKE) ARCH=$(OPTIMIZE_FOR_CPU) PREFIX=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME) -C $(STLPORT_DIR) install
-
-stlport: $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++.a
-
-stlport-source: $(DL_DIR)/$(STLPORT_SOURCE)
-
-stlport-clean:
-	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++*
-	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++*
-	-$(MAKE) -C $(STLPORT_DIR) clean
-
-stlport-dirclean:
-	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libstdc++*
-	rm -f $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/g++-v3*
-	rm -rf $(STLPORT_DIR)
-
-#############################################################
-#
-# second pass compiler build.  Build the compiler targeting 
-# the newly built shared uClibc library.
-#
-#############################################################
-GCC_BUILD_DIR2:=$(TOOL_BUILD_DIR)/gcc-$(GCC_VERSION)-final
-
-$(GCC_BUILD_DIR2)/.configured: $(GCC_DIR)/.patched $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libc.a
-	mkdir -p $(GCC_BUILD_DIR2)
-	(cd $(GCC_BUILD_DIR2); PATH=$(TARGET_PATH) \
-		$(GCC_DIR)/configure \
-		--prefix=$(STAGING_DIR) \
-		--build=$(GNU_HOST_NAME) \
-		--host=$(GNU_HOST_NAME) \
-		--target=$(REAL_GNU_TARGET_NAME) \
-		--enable-languages=$(TARGET_LANGUAGES) \
-		--enable-shared \
-		--with-gxx-include-dir=$(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/include/c++ \
-		--disable-__cxa_atexit \
-		--enable-target-optspace \
-		--with-gnu-ld \
-		$(DISABLE_NLS) \
-		$(MULTILIB) \
-		$(SOFT_FLOAT_CONFIG_OPTION) \
-		$(EXTRA_GCC_CONFIG_OPTIONS));
-	touch $(GCC_BUILD_DIR2)/.configured
-
-$(GCC_BUILD_DIR2)/.compiled: $(GCC_BUILD_DIR2)/.configured
-	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all
-	touch $(GCC_BUILD_DIR2)/.compiled
-
-$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled
-	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install
-	# Strip the host binaries
-ifeq ($(GCC_STRIP_HOST_BINARIES),true)
-	-strip --strip-all -R .note -R .comment $(STAGING_DIR)/bin/*
-endif
-	# Set up the symlinks to enable lying about target name.
-	set -e; \
-	(cd $(STAGING_DIR); \
-		ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \
-		cd bin; \
-		for app in $(REAL_GNU_TARGET_NAME)-* ; do \
-			ln -sf $${app} \
-		   	$(GNU_TARGET_NAME)$${app##$(REAL_GNU_TARGET_NAME)}; \
-		done; \
-	);
-	touch $(GCC_BUILD_DIR2)/.installed
-
-gcc: uclibc-configured binutils gcc_initial $(LIBFLOAT_TARGET) uclibc \
-	$(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS) $(STLPORT_TARGET)
-
-gcc-source: $(DL_DIR)/$(GCC_SOURCE)
-
-gcc-clean:
-	rm -rf $(GCC_BUILD_DIR2)
-	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)*
-
-gcc-dirclean:
-	rm -rf $(GCC_BUILD_DIR2)
-
-#############################################################
-#
-# Next build target gcc compiler
-#
-#############################################################
-GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target
-
-$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed
-	mkdir -p $(GCC_BUILD_DIR3)
-	(cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \
-		$(GCC_DIR)/configure \
-		--prefix=/usr \
-		--build=$(GNU_HOST_NAME) \
-		--host=$(REAL_GNU_TARGET_NAME) \
-		--target=$(REAL_GNU_TARGET_NAME) \
-		--enable-languages=$(TARGET_LANGUAGES) \
-		--enable-shared \
-		--with-gxx-include-dir=/usr/include/c++ \
-		--disable-__cxa_atexit \
-		--enable-target-optspace \
-		--with-gnu-ld \
-		$(DISABLE_NLS) \
-		$(MULTILIB) \
-		$(SOFT_FLOAT_CONFIG_OPTION) \
-		$(EXTRA_GCC_CONFIG_OPTIONS));
-	touch $(GCC_BUILD_DIR3)/.configured
-
-$(GCC_BUILD_DIR3)/.compiled: $(GCC_BUILD_DIR3)/.configured
-	PATH=$(TARGET_PATH) \
-	$(MAKE) $(TARGET_GCC_ARGS) -C $(GCC_BUILD_DIR3) all
-	touch $(GCC_BUILD_DIR3)/.compiled
-
-$(TARGET_DIR)/usr/bin/gcc: $(GCC_BUILD_DIR3)/.compiled
-	PATH=$(TARGET_PATH) \
-	$(MAKE) DESTDIR=$(TARGET_DIR) -C $(GCC_BUILD_DIR3) install
-	# Remove broken specs file (cross compile flag is set).
-	rm -f $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs
-	-(cd $(TARGET_DIR)/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1)
-	-(cd $(TARGET_DIR)/usr/bin; find -type f | xargs $(STRIP) > /dev/null 2>&1)
-	-(cd $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION); $(STRIP) cc1 cc1plus collect2 > /dev/null 2>&1)
-	-(cd $(TARGET_DIR)/usr/lib; $(STRIP) libstdc++.so.*.*.* > /dev/null 2>&1)
-	-(cd $(TARGET_DIR)/lib; $(STRIP) libgcc_s.so.*.*.* > /dev/null 2>&1)
-	#
-	rm -f $(TARGET_DIR)/usr/lib/*.la*
-	#rm -rf $(TARGET_DIR)/share/locale $(TARGET_DIR)/usr/info \
-	#	$(TARGET_DIR)/usr/man $(TARGET_DIR)/usr/share/doc
-	# Work around problem of missing syslimits.h
-	cp -f $(STAGING_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/syslimits.h $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/include/
-	# These are in /lib, so...
-	#rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so*
-	#touch -c $(TARGET_DIR)/usr/bin/gcc
-
-gcc_target: uclibc_target binutils_target $(TARGET_DIR)/usr/bin/gcc
-
-gcc_target-clean:
-	rm -rf $(GCC_BUILD_DIR3)
-	rm -f $(TARGET_DIR)/bin/$(REAL_GNU_TARGET_NAME)*
-
-gcc_target-dirclean:
-	rm -rf $(GCC_BUILD_DIR3)
-
-endif
-

--- a/toolchain/gcc/gcc-uclibc-3.x.mk
+++ b/toolchain/gcc/gcc-uclibc-3.x.mk
@@ -17,7 +17,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
-ifneq ($(findstring 2.95,$(GCC_VERSION)),2.95)
 GCC_VERSION:=$(strip $(GCC_VERSION))
 
 #GCC_SITE:=ftp://ftp.gnu.org/gnu/gcc/releases/gcc-$(GCC_VERSION)
@@ -67,7 +66,7 @@
 
 $(GCC_DIR)/.patched: $(GCC_DIR)/.unpacked
 	# Apply any files named gcc-*.patch from the source directory to gcc
-	toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) \*.patch
+	$(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(GCC_VERSION) \*.patch
 	# Note: The soft float situation has improved considerably with gcc 3.4.x.
 	# We can dispense with the custom spec files, as well as libfloat for the arm case.
 	# However, we still need a patch for arm.  There's a similar patch for gcc 3.3.x
@@ -75,10 +74,10 @@
 	# anyone (?) who might still be using gcc 2.95.  mjn3
 ifeq ($(BR2_SOFT_FLOAT),y)
 ifeq ("$(strip $(ARCH))","arm")
-	toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) arm-softfloat.patch.conditional
+	$(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(GCC_VERSION) arm-softfloat.patch.conditional
 endif
 ifeq ("$(strip $(ARCH))","armeb")
-	toolchain/patch-kernel.sh $(GCC_DIR) toolchain/gcc/$(GCC_VERSION) arm-softfloat.patch.conditional
+	$(SCRIPT_DIR)/patch-kernel.sh $(GCC_DIR) ./$(GCC_VERSION) arm-softfloat.patch.conditional
 endif
 	# Not yet updated to 3.4.1.
 	#ifeq ("$(strip $(ARCH))","i386")
@@ -121,11 +120,10 @@
 	#rm -f $(STAGING_DIR)/bin/gccbug $(STAGING_DIR)/bin/gcov
 	#rm -rf $(STAGING_DIR)/info $(STAGING_DIR)/man $(STAGING_DIR)/share/doc $(STAGING_DIR)/share/locale
 
-gcc_initial: uclibc-configured binutils $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc
+gcc_initial: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc
 
 gcc_initial-clean:
 	rm -rf $(GCC_BUILD_DIR1)
-	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)*
 
 gcc_initial-toolclean:
 	rm -rf $(GCC_BUILD_DIR1)
@@ -171,7 +169,7 @@
 	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) all
 	touch $(GCC_BUILD_DIR2)/.compiled
 
-$(GCC_BUILD_DIR2)/.installed: $(GCC_BUILD_DIR2)/.compiled
+gcc-install: $(GCC_BUILD_DIR2)/.compiled
 	PATH=$(TARGET_PATH) $(MAKE) -C $(GCC_BUILD_DIR2) install
 	# Strip the host binaries
 ifeq ($(GCC_STRIP_HOST_BINARIES),true)
@@ -193,7 +191,7 @@
 ifeq ($(BR2_SOFT_FLOAT),y)
 ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.)
 	# Make sure we have a soft float specs file for this arch
-	if [ ! -f toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float ] ; then \
+	if [ ! -f ./$(GCC_VERSION)/specs-$(ARCH)-soft-float ] ; then \
 		echo soft float configured but no specs file for this arch ; \
 		/bin/false ; \
 	fi;
@@ -202,28 +200,24 @@
 		echo staging dir specs file is missing ; \
 		/bin/false ; \
 	fi;
-	cp toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float $(STAGING_DIR)/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs
-endif
-endif
-	#
-	# Ok... that's enough of that.
-	#
-	touch $(GCC_BUILD_DIR2)/.installed
-
-$(TARGET_DIR)/lib/libgcc_s.so.1: $(GCC_BUILD_DIR2)/.installed
+	cp ./$(GCC_VERSION)/specs-$(ARCH)-soft-float $(STAGING_DIR)/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs
+endif
+endif
 	# These are in /lib, so...
 	rm -rf $(TARGET_DIR)/usr/lib/libgcc_s.so*
 	-$(STRIP) $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libgcc_s.so.1
 	-cp -a $(STAGING_DIR)/$(REAL_GNU_TARGET_NAME)/lib/libgcc_s* $(TARGET_DIR)/lib/
 
-gcc: uclibc-configured binutils gcc_initial $(LIBFLOAT_TARGET) uclibc \
-	$(TARGET_DIR)/lib/libgcc_s.so.1 $(GCC_BUILD_DIR2)/.installed $(GCC_TARGETS)
+gcc: gcc_initial $(LIBFLOAT_TARGET) \
+	gcc-install $(GCC_TARGETS)
 
 gcc-source: $(DL_DIR)/$(GCC_SOURCE)
 
 gcc-clean:
+	rm -rf $(GCC_DIR)
 	rm -rf $(GCC_BUILD_DIR2)
-	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)*
+	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gc*
+	rm -f $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-c*
 
 gcc-toolclean:
 	rm -rf $(GCC_BUILD_DIR2)
@@ -235,7 +229,7 @@
 #############################################################
 GCC_BUILD_DIR3:=$(BUILD_DIR)/gcc-$(GCC_VERSION)-target
 
-$(GCC_BUILD_DIR3)/.configured: $(GCC_BUILD_DIR2)/.installed
+$(GCC_BUILD_DIR3)/.configured: gcc-install
 	mkdir -p $(GCC_BUILD_DIR3)
 	(cd $(GCC_BUILD_DIR3); PATH=$(TARGET_PATH) \
 		$(GCC_DIR)/configure \
@@ -282,7 +276,7 @@
 ifeq ($(BR2_SOFT_FLOAT),y)
 ifeq ($(findstring 3.3.,$(GCC_VERSION)),3.3.)
 	# Add a specs file that defaults to soft float mode.
-	cp toolchain/gcc/$(GCC_VERSION)/specs-$(ARCH)-soft-float $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs
+	cp ./$(GCC_VERSION)/specs-$(ARCH)-soft-float $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs
 	# Make sure gcc does not think we are cross compiling
 	$(SED) "s/^1/0/;" $(TARGET_DIR)/usr/lib/gcc-lib/$(REAL_GNU_TARGET_NAME)/$(GCC_VERSION)/specs
 endif
@@ -318,5 +312,4 @@
 gcc_target-toolclean:
 	rm -rf $(GCC_BUILD_DIR3)
 
-endif
-
+

--- /dev/null
+++ b/toolchain/kernel-headers/Makefile
@@ -1,1 +1,11 @@
+include $(TOPDIR)/rules.mk
 
+include ./kernel-headers.mk
+
+source: kernel-headers-source
+prepare: kernel-headers
+compile:
+install:
+clean: kernel-headers-toolclean
+
+

--- a/toolchain/kernel-headers/kernel-headers.mk
+++ b/toolchain/kernel-headers/kernel-headers.mk
@@ -3,8 +3,7 @@
 LINUX_HEADERS_VERSION=2.4.29
 LINUX_HEADERS_SITE=http://www.kernel.org/pub/linux/kernel/v2.4
 LINUX_HEADERS_SOURCE=linux-$(LINUX_HEADERS_VERSION).tar.bz2
-LINUX_HEADERS_CONFIG=toolchain/kernel-headers/linux.config
-LINUX_HEADERS_DIR=$(TOOL_BUILD_DIR)/linux-$(LINUX_HEADERS_VERSION)
+LINUX_HEADERS_CONFIG=./linux.config
 LINUX_HEADERS_ARCH:=$(shell echo $(ARCH) | sed -e 's/i[3-9]86/i386/' \
 	-e 's/mipsel/mips/' \
 	-e 's/powerpc/ppc/' \
@@ -26,6 +25,7 @@
 		linux-$(LINUX_HEADERS_VERSION)/arch/$(LINUX_HEADERS_ARCH)/config*.in \
 		linux-$(LINUX_HEADERS_VERSION)/*/*/Config.in \
 		linux-$(LINUX_HEADERS_VERSION)/*/Config.in
+	ln -sf $(LINUX_HEADERS_DIR)-$(LINUX_HEADERS_VERSION) $(LINUX_HEADERS_DIR)
 	touch $(LINUX_HEADERS_DIR)/.unpacked
 
 $(LINUX_HEADERS_DIR)/.configured: $(LINUX_HEADERS_DIR)/.unpacked

--- a/toolchain/patch-kernel.sh
+++ /dev/null
@@ -1,54 +1,1 @@
-#! /bin/sh
-# A little script I whipped up to make it easy to
-# patch source trees and have sane error handling
-# -Erik
-#
-# (c) 2002 Erik Andersen <andersen@codepoet.org>
 
-# Set directories from arguments, or use defaults.
-targetdir=${1-.}
-patchdir=${2-../kernel-patches}
-patchpattern=${3-*}
-
-if [ ! -d "${targetdir}" ] ; then
-    echo "Aborting.  '${targetdir}' is not a directory."
-    exit 1
-fi
-if [ ! -d "${patchdir}" ] ; then
-    echo "Aborting.  '${patchdir}' is not a directory."
-    exit 1
-fi
-    
-for i in ${patchdir}/${patchpattern} ; do 
-    case "$i" in
-	*.gz)
-	type="gzip"; uncomp="gunzip -dc"; ;; 
-	*.bz)
-	type="bzip"; uncomp="bunzip -dc"; ;; 
-	*.bz2)
-	type="bzip2"; uncomp="bunzip2 -dc"; ;; 
-	*.zip)
-	type="zip"; uncomp="unzip -d"; ;; 
-	*.Z)
-	type="compress"; uncomp="uncompress -c"; ;; 
-	*)
-	type="plaintext"; uncomp="cat"; ;; 
-    esac
-    echo ""
-    echo "Applying ${i} using ${type}: " 
-    ${uncomp} ${i} | patch -p1 -E -d ${targetdir} 
-    if [ $? != 0 ] ; then
-        echo "Patch failed!  Please fix $i!"
-	exit 1
-    fi
-done
-
-# Check for rejects...
-if [ "`find $targetdir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ] ; then
-    echo "Aborting.  Reject files found."
-    exit 1
-fi
-
-# Remove backup files
-find $targetdir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} \;
-

--- /dev/null
+++ b/toolchain/uClibc/Makefile
@@ -1,1 +1,11 @@
+include $(TOPDIR)/rules.mk
 
+include ./uclibc.mk
+
+source: uclibc-source
+prepare: uclibc-configured
+compile: $(UCLIBC_DIR)/lib/libc.a
+install: uclibc
+	$(STRIP) $(TARGET_DIR)/lib/*.so
+clean: uclibc-clean
+

--- a/toolchain/uClibc/uclibc.mk
+++ b/toolchain/uClibc/uclibc.mk
@@ -11,8 +11,6 @@
 #"
 UCLIBC_SITE:=http://www.uclibc.org/downloads/snapshots
 else
-# Note: 0.9.26 has known problems.  So best use a snapshot until .27 is out.
-# Anticipate the change.
 UCLIBC_DIR:=$(TOOL_BUILD_DIR)/uClibc-0.9.27
 UCLIBC_SOURCE:=uClibc-0.9.27.tar.bz2
 UCLIBC_SITE:=http://www.uclibc.org/downloads
@@ -45,9 +43,9 @@
 $(UCLIBC_DIR)/.configured: $(UCLIBC_DIR)/.unpacked
 	$(SED) 's,^CROSS=.*,CROSS=$(TARGET_CROSS),g' $(UCLIBC_DIR)/Rules.mak
 ifeq ($(BR2_ENABLE_LOCALE),y)
-	cp toolchain/uClibc/uClibc.config-locale $(UCLIBC_DIR)/.config
+	cp ./uClibc.config-locale $(UCLIBC_DIR)/.config
 else
-	cp toolchain/uClibc/uClibc.config $(UCLIBC_DIR)/.config
+	cp ./uClibc.config $(UCLIBC_DIR)/.config
 endif
 	$(SED) 's,^.*TARGET_$(UCLIBC_TARGET_ARCH).*,TARGET_$(UCLIBC_TARGET_ARCH)=y,g' \
 		$(UCLIBC_DIR)/.config
@@ -126,7 +124,7 @@
 
 uclibc-configured: $(UCLIBC_DIR)/.configured
 
-uclibc: $(STAGING_DIR)/bin/$(REAL_GNU_TARGET_NAME)-gcc $(STAGING_DIR)/lib/libc.a \
+uclibc: $(STAGING_DIR)/lib/libc.a \
 	$(UCLIBC_TARGETS)
 
 uclibc-source: $(DL_DIR)/$(UCLIBC_SOURCE)

--- /dev/null
+++ b/toolchain/utils/Makefile
@@ -1,1 +1,22 @@
+include $(TOPDIR)/rules.mk
 
+TARGETS:=sstrip
+UTILS_BUILD_DIR:=$(TOOL_BUILD_DIR)/utils
+
+prepare: $(UTILS_BUILD_DIR)
+compile: prepare $(patsubst %,$(UTILS_BUILD_DIR)/%,$(TARGETS))
+install: compile
+	mkdir -p $(STAGING_DIR)/bin
+	cp -a $(UTILS_BUILD_DIR)/* $(STAGING_DIR)/bin/
+package:
+clean:
+	rm -rf $(UTILS_BUILD_DIR)
+
+$(UTILS_BUILD_DIR):
+	mkdir -p $(UTILS_BUILD_DIR)
+	
+$(UTILS_BUILD_DIR)/%: src/%.c
+	$(CC) -o $@ $(patsubst $(UTILS_BUILD_DIR)/%,src/%.c,$@)
+	chmod 755 $@
+
+

--- /dev/null
+++ b/toolchain/utils/src/sstrip.c
@@ -1,1 +1,484 @@
-
+/* http://www.muppetlabs.com/~breadbox/software/elfkickers.html */
+
+/* sstrip: Copyright (C) 1999-2001 by Brian Raiter, under the GNU
+ * General Public License. No warranty. See COPYING for details.
+ *
+ * Aug 23, 2004 Hacked by Manuel Novoa III <mjn3@codepoet.org> to
+ * handle targets of different endianness and/or elf class, making
+ * it more useful in a cross-devel environment.
+ */
+
+/* ============== original README ===================
+ *
+ * sstrip is a small utility that removes the contents at the end of an
+ * ELF file that are not part of the program's memory image.
+ * 
+ * Most ELF executables are built with both a program header table and a
+ * section header table. However, only the former is required in order
+ * for the OS to load, link and execute a program. sstrip attempts to
+ * extract the ELF header, the program header table, and its contents,
+ * leaving everything else in the bit bucket. It can only remove parts of
+ * the file that occur at the end, after the parts to be saved. However,
+ * this almost always includes the section header table, and occasionally
+ * a few random sections that are not used when running a program.
+ * 
+ * It should be noted that the GNU bfd library is (understandably)
+ * dependent on the section header table as an index to the file's
+ * contents. Thus, an executable file that has no section header table
+ * cannot be used with gdb, objdump, or any other program based upon the
+ * bfd library, at all. In fact, the program will not even recognize the
+ * file as a valid executable. (This limitation is noted in the source
+ * code comments for bfd, and is marked "FIXME", so this may change at
+ * some future date. However, I would imagine that it is a pretty
+ * low-priority item, as executables without a section header table are
+ * rare in the extreme.) This probably also explains why strip doesn't
+ * offer the option to do this.
+ * 
+ * Shared library files may also have their section header table removed.
+ * Such a library will still function; however, it will no longer be
+ * possible for a compiler to link a new program against it.
+ * 
+ * As an added bonus, sstrip also tries to removes trailing zero bytes
+ * from the end of the file. (This normally cannot be done with an
+ * executable that has a section header table.)
+ * 
+ * sstrip is a very simplistic program. It depends upon the common
+ * practice of putting the parts of the file that contribute to the
+ * memory image at the front, and the remaining material at the end. This
+ * permits it to discard the latter material without affecting file
+ * offsets and memory addresses in what remains. Of course, the ELF
+ * standard permits files to be organized in almost any order, so if a
+ * pathological linker decided to put its section headers at the top,
+ * sstrip would be useless on such executables.
+ */
+
+#include	<stdio.h>
+#include	<stdlib.h>
+#include	<string.h>
+#include	<errno.h>
+#include	<unistd.h>
+#include	<fcntl.h>
+#include	<elf.h>
+#ifdef __FreeBSD__
+/**
+ * This seems to work on FreeBSD 5.3, should
+ * work on all newer versions as well. I have
+ * no idea if it will work on versions < 5.3
+ *
+ * Joe Estock (guru) <jestock at nutextonline.com>
+ */
+#include <sys/endian.h>
+#define bswap_64 __bswap64
+#define bswap_32 __bswap32
+#define bswap_16 __bswap16
+#else
+#include	<endian.h>
+#include	<byteswap.h>
+#endif /* defined(__FreeBSD__) */
+
+
+#ifndef TRUE
+#define	TRUE		1
+#define	FALSE		0
+#endif
+
+/* The name of the program.
+ */
+static char const	*progname;
+
+/* The name of the current file.
+ */
+static char const	*filename;
+
+
+/* A simple error-handling function. FALSE is always returned for the
+ * convenience of the caller.
+ */
+static int err(char const *errmsg)
+{
+	fprintf(stderr, "%s: %s: %s\n", progname, filename, errmsg);
+	return FALSE;
+}
+
+/* A flag to signal the need for endian reversal.
+ */
+static int do_reverse_endian;
+
+/* Get a value from the elf header, compensating for endianness.
+ */
+#define EGET(X) \
+	(__extension__ ({ \
+		uint64_t __res; \
+		if (!do_reverse_endian) { \
+			__res = (X); \
+		} else if (sizeof(X) == 1) { \
+			__res = (X); \
+		} else if (sizeof(X) == 2) { \
+			__res = bswap_16((X)); \
+		} else if (sizeof(X) == 4) { \
+			__res = bswap_32((X)); \
+		} else if (sizeof(X) == 8) { \
+			__res = bswap_64((X)); \
+		} else { \
+			fprintf(stderr, "%s: %s: EGET failed for size %d\n", \
+					progname, filename, sizeof(X)); \
+			exit(EXIT_FAILURE); \
+		} \
+		__res; \
+	}))
+
+/* Set a value 'Y' in the elf header to 'X', compensating for endianness.
+ */
+#define ESET(Y,X) \
+		do if (!do_reverse_endian) { \
+			Y = (X); \
+		} else if (sizeof(Y) == 1) { \
+			Y = (X); \
+		} else if (sizeof(Y) == 2) { \
+			Y = bswap_16((uint16_t)(X)); \
+		} else if (sizeof(Y) == 4) { \
+			Y = bswap_32((uint32_t)(X)); \
+		} else if (sizeof(Y) == 8) { \
+			Y = bswap_64((uint64_t)(X)); \
+		} else { \
+			fprintf(stderr, "%s: %s: ESET failed for size %d\n", \
+					progname, filename, sizeof(Y)); \
+			exit(EXIT_FAILURE); \
+		} while (0)
+
+
+/* A macro for I/O errors: The given error message is used only when
+ * errno is not set.
+ */
+#define	ferr(msg)	(err(errno ? strerror(errno) : (msg)))
+
+
+
+#define HEADER_FUNCTIONS(CLASS) \
+ \
+/* readelfheader() reads the ELF header into our global variable, and \
+ * checks to make sure that this is in fact a file that we should be \
+ * munging. \
+ */ \
+static int readelfheader ## CLASS (int fd, Elf ## CLASS ## _Ehdr *ehdr) \
+{ \
+	 if (read(fd, ((char *)ehdr)+EI_NIDENT, sizeof(*ehdr) - EI_NIDENT) \
+		!= sizeof(*ehdr) - EI_NIDENT) \
+		return ferr("missing or incomplete ELF header."); \
+ \
+	/* Verify the sizes of the ELF header and the program segment \
+	 * header table entries. \
+	 */ \
+	if (EGET(ehdr->e_ehsize) != sizeof(Elf ## CLASS ## _Ehdr)) \
+		return err("unrecognized ELF header size."); \
+	if (EGET(ehdr->e_phentsize) != sizeof(Elf ## CLASS ## _Phdr)) \
+		return err("unrecognized program segment header size."); \
+ \
+	/* Finally, check the file type. \
+	 */ \
+	if (EGET(ehdr->e_type) != ET_EXEC && EGET(ehdr->e_type) != ET_DYN) \
+		return err("not an executable or shared-object library."); \
+ \
+	return TRUE; \
+} \
+ \
+/* readphdrtable() loads the program segment header table into memory. \
+ */ \
+static int readphdrtable ## CLASS (int fd, Elf ## CLASS ## _Ehdr const *ehdr, \
+								   Elf ## CLASS ## _Phdr **phdrs) \
+{ \
+	size_t	size; \
+ \
+	if (!EGET(ehdr->e_phoff) || !EGET(ehdr->e_phnum) \
+)		return err("ELF file has no program header table."); \
+ \
+	size = EGET(ehdr->e_phnum) * sizeof **phdrs; \
+	if (!(*phdrs = malloc(size))) \
+		return err("Out of memory!"); \
+ \
+	errno = 0; \
+	if (read(fd, *phdrs, size) != (ssize_t)size) \
+		return ferr("missing or incomplete program segment header table."); \
+ \
+	return TRUE; \
+} \
+ \
+/* getmemorysize() determines the offset of the last byte of the file \
+ * that is referenced by an entry in the program segment header table. \
+ * (Anything in the file after that point is not used when the program \
+ * is executing, and thus can be safely discarded.) \
+ */ \
+static int getmemorysize ## CLASS (Elf ## CLASS ## _Ehdr const *ehdr, \
+								   Elf ## CLASS ## _Phdr const *phdrs, \
+						 unsigned long *newsize) \
+{ \
+	Elf ## CLASS ## _Phdr const   *phdr; \
+	unsigned long	size, n; \
+	int			i; \
+ \
+	/* Start by setting the size to include the ELF header and the \
+	 * complete program segment header table. \
+	 */ \
+	size = EGET(ehdr->e_phoff) + EGET(ehdr->e_phnum) * sizeof *phdrs; \
+	if (size < sizeof *ehdr) \
+		size = sizeof *ehdr; \
+ \
+	/* Then keep extending the size to include whatever data the \
+	 * program segment header table references. \
+	 */ \
+	for (i = 0, phdr = phdrs ; i < EGET(ehdr->e_phnum) ; ++i, ++phdr) { \
+		if (EGET(phdr->p_type) != PT_NULL) { \
+			n = EGET(phdr->p_offset) + EGET(phdr->p_filesz); \
+			if (n > size) \
+				size = n; \
+		} \
+	} \
+ \
+	*newsize = size; \
+	return TRUE; \
+} \
+ \
+/* modifyheaders() removes references to the section header table if \
+ * it was stripped, and reduces program header table entries that \
+ * included truncated bytes at the end of the file. \
+ */ \
+static int modifyheaders ## CLASS (Elf ## CLASS ## _Ehdr *ehdr, \
+								   Elf ## CLASS ## _Phdr *phdrs, \
+								   unsigned long newsize) \
+{ \
+	Elf ## CLASS ## _Phdr *phdr; \
+	int		i; \
+ \
+	/* If the section header table is gone, then remove all references \
+	 * to it in the ELF header. \
+	 */ \
+	if (EGET(ehdr->e_shoff) >= newsize) { \
+		ESET(ehdr->e_shoff,0); \
+		ESET(ehdr->e_shnum,0); \
+		ESET(ehdr->e_shentsize,0); \
+		ESET(ehdr->e_shstrndx,0); \
+	} \
+ \
+	/* The program adjusts the file size of any segment that was \
+	 * truncated. The case of a segment being completely stripped out \
+	 * is handled separately. \
+	 */ \
+	for (i = 0, phdr = phdrs ; i < EGET(ehdr->e_phnum) ; ++i, ++phdr) { \
+		if (EGET(phdr->p_offset) >= newsize) { \
+			ESET(phdr->p_offset,newsize); \
+			ESET(phdr->p_filesz,0); \
+		} else if (EGET(phdr->p_offset) + EGET(phdr->p_filesz) > newsize) { \
+			newsize -= EGET(phdr->p_offset); \
+			ESET(phdr->p_filesz, newsize); \
+		} \
+	} \
+ \
+	return TRUE; \
+} \
+ \
+/* commitchanges() writes the new headers back to the original file \
+ * and sets the file to its new size. \
+ */ \
+static int commitchanges ## CLASS (int fd, Elf ## CLASS ## _Ehdr const *ehdr, \
+								   Elf ## CLASS ## _Phdr *phdrs, \
+								   unsigned long newsize) \
+{ \
+	size_t	n; \
+ \
+	/* Save the changes to the ELF header, if any. \
+	 */ \
+	if (lseek(fd, 0, SEEK_SET)) \
+		return ferr("could not rewind file"); \
+	errno = 0; \
+	if (write(fd, ehdr, sizeof *ehdr) != sizeof *ehdr) \
+		return err("could not modify file"); \
+ \
+	/* Save the changes to the program segment header table, if any. \
+	 */ \
+	if (lseek(fd, EGET(ehdr->e_phoff), SEEK_SET) == (off_t)-1) { \
+		err("could not seek in file."); \
+		goto warning; \
+	} \
+	n = EGET(ehdr->e_phnum) * sizeof *phdrs; \
+	if (write(fd, phdrs, n) != (ssize_t)n) { \
+		err("could not write to file"); \
+		goto warning; \
+	} \
+ \
+	/* Eleventh-hour sanity check: don't truncate before the end of \
+	 * the program segment header table. \
+	 */ \
+	if (newsize < EGET(ehdr->e_phoff) + n) \
+		newsize = EGET(ehdr->e_phoff) + n; \
+ \
+	/* Chop off the end of the file. \
+	 */ \
+	if (ftruncate(fd, newsize)) { \
+		err("could not resize file"); \
+		goto warning; \
+	} \
+ \
+	return TRUE; \
+ \
+ warning: \
+	return err("ELF file may have been corrupted!"); \
+}
+
+
+/* First elements of Elf32_Ehdr and Elf64_Ehdr are common.
+ */
+static int readelfheaderident(int fd, Elf32_Ehdr *ehdr)
+{
+	errno = 0;
+	if (read(fd, ehdr, EI_NIDENT) != EI_NIDENT)
+		return ferr("missing or incomplete ELF header.");
+
+	/* Check the ELF signature.
+	 */
+	if (!(ehdr->e_ident[EI_MAG0] == ELFMAG0 &&
+		  ehdr->e_ident[EI_MAG1] == ELFMAG1 &&
+		  ehdr->e_ident[EI_MAG2] == ELFMAG2 &&
+		  ehdr->e_ident[EI_MAG3] == ELFMAG3))
+	{
+		err("missing ELF signature.");
+		return -1;
+	}
+
+	/* Compare the file's class and endianness with the program's.
+	 */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+	if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
+		do_reverse_endian = 0;
+	} else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
+/* 		fprintf(stderr, "ELF file has different endianness.\n"); */
+		do_reverse_endian = 1;
+	}
+#elif __BYTE_ORDER == __BIG_ENDIAN
+	if (ehdr->e_ident[EI_DATA] == ELFDATA2LSB) {
+/* 		fprintf(stderr, "ELF file has different endianness.\n"); */
+		do_reverse_endian = 1;
+	} else if (ehdr->e_ident[EI_DATA] == ELFDATA2MSB) {
+		do_reverse_endian = 0;
+	}
+#else
+#error unkown endianness
+#endif
+	else {
+		err("Unsupported endianness");
+		return -1;
+	}
+
+	/* Check the target architecture.
+	 */
+/*	 if (EGET(ehdr->e_machine) != ELF_ARCH) { */
+/* 		/\* return err("ELF file created for different architecture."); *\/ */
+/* 		fprintf(stderr, "ELF file created for different architecture.\n"); */
+/* 	} */
+	return ehdr->e_ident[EI_CLASS];
+}
+
+
+HEADER_FUNCTIONS(32)
+
+HEADER_FUNCTIONS(64)
+
+/* truncatezeros() examines the bytes at the end of the file's
+ * size-to-be, and reduces the size to exclude any trailing zero
+ * bytes.
+ */
+static int truncatezeros(int fd, unsigned long *newsize)
+{
+	unsigned char	contents[1024];
+	unsigned long	size, n;
+
+	size = *newsize;
+	do {
+		n = sizeof contents;
+		if (n > size)
+			n = size;
+		if (lseek(fd, size - n, SEEK_SET) == (off_t)-1)
+			return ferr("cannot seek in file.");
+		if (read(fd, contents, n) != (ssize_t)n)
+			return ferr("cannot read file contents");
+		while (n && !contents[--n])
+			--size;
+	} while (size && !n);
+
+	/* Sanity check.
+	 */
+	if (!size)
+		return err("ELF file is completely blank!");
+
+	*newsize = size;
+	return TRUE;
+}
+
+/* main() loops over the cmdline arguments, leaving all the real work
+ * to the other functions.
+ */
+int main(int argc, char *argv[])
+{
+	int				fd;
+	union {
+		Elf32_Ehdr	ehdr32;
+		Elf64_Ehdr	ehdr64;
+	} e;
+	union {
+		Elf32_Phdr	*phdrs32;
+		Elf64_Phdr	*phdrs64;
+	} p;
+	unsigned long	newsize;
+	char			**arg;
+	int				failures = 0;
+
+	if (argc < 2 || argv[1][0] == '-') {
+		printf("Usage: sstrip FILE...\n"
+			   "sstrip discards all nonessential bytes from an executable.\n\n"
+			   "Version 2.0-X Copyright (C) 2000,2001 Brian Raiter.\n"
+			   "Cross-devel hacks Copyright (C) 2004 Manuel Novoa III.\n"
+			   "This program is free software, licensed under the GNU\n"
+			   "General Public License. There is absolutely no warranty.\n");
+		return EXIT_SUCCESS;
+	}
+
+	progname = argv[0];
+
+	for (arg = argv + 1 ; *arg != NULL ; ++arg) {
+		filename = *arg;
+
+		fd = open(*arg, O_RDWR);
+		if (fd < 0) {
+			ferr("can't open");
+			++failures;
+			continue;
+		}
+
+		switch (readelfheaderident(fd, &e.ehdr32)) {
+			case ELFCLASS32:
+				if (!(readelfheader32(fd, &e.ehdr32)					&&
+					  readphdrtable32(fd, &e.ehdr32, &p.phdrs32)		&&
+					  getmemorysize32(&e.ehdr32, p.phdrs32, &newsize)	&&
+					  truncatezeros(fd, &newsize)						&&
+					  modifyheaders32(&e.ehdr32, p.phdrs32, newsize)	&&
+					  commitchanges32(fd, &e.ehdr32, p.phdrs32, newsize)))
+					++failures;
+				break;
+			case ELFCLASS64:
+				if (!(readelfheader64(fd, &e.ehdr64)					&&
+					  readphdrtable64(fd, &e.ehdr64, &p.phdrs64)		&&
+					  getmemorysize64(&e.ehdr64, p.phdrs64, &newsize)	&&
+					  truncatezeros(fd, &newsize)						&&
+					  modifyheaders64(&e.ehdr64, p.phdrs64, newsize)	&&
+					  commitchanges64(fd, &e.ehdr64, p.phdrs64, newsize)))
+					++failures;
+				break;
+			default:
+				++failures;
+				break;
+		}
+		close(fd);
+	}
+
+	return failures ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+

comments