Просмотр исходного кода

busybox: update to 1.31.0

* Update busybox to version 1.31.0.
    New applets: ts, i2ctransfer
    New (restored) feature: error/info levels in syslog messages.
    Leave new features disabled by default.
* Refresh patches
* Remove patch that was backported from upstream

Config refreshed with commands below, after which the OpenWrt specific
config defaults (ipv6, login session child) were corrected:

  make package/busybox/compile   (to populate the build_dir)

  cd package/utils/busybox/config/
  ../convert_menuconfig.pl ../../../../build_dir/target-mips_24kc_musl/busybox-1.31.0

  cd package/utils/busybox
  ./convert_defaults.pl < ../../../build_dir/target-mips_24kc_musl/busybox-1.31.0/.config > Config-defaults.in

Signed-off-by: Hannu Nyman <[email protected]>
Hannu Nyman 6 лет назад
Родитель
Сommit
696c511fb4

+ 21 - 3
package/utils/busybox/Config-defaults.in

@@ -79,6 +79,9 @@ config BUSYBOX_DEFAULT_SELINUX
 config BUSYBOX_DEFAULT_FEATURE_CLEAN_UP
 config BUSYBOX_DEFAULT_FEATURE_CLEAN_UP
 	bool
 	bool
 	default n
 	default n
+config BUSYBOX_DEFAULT_FEATURE_SYSLOG_INFO
+	bool
+	default n
 config BUSYBOX_DEFAULT_FEATURE_SYSLOG
 config BUSYBOX_DEFAULT_FEATURE_SYSLOG
 	bool
 	bool
 	default y
 	default y
@@ -601,9 +604,6 @@ config BUSYBOX_DEFAULT_FALSE
 config BUSYBOX_DEFAULT_FOLD
 config BUSYBOX_DEFAULT_FOLD
 	bool
 	bool
 	default n
 	default n
-config BUSYBOX_DEFAULT_FSYNC
-	bool
-	default y
 config BUSYBOX_DEFAULT_HEAD
 config BUSYBOX_DEFAULT_HEAD
 	bool
 	bool
 	default y
 	default y
@@ -790,6 +790,9 @@ config BUSYBOX_DEFAULT_SYNC
 config BUSYBOX_DEFAULT_FEATURE_SYNC_FANCY
 config BUSYBOX_DEFAULT_FEATURE_SYNC_FANCY
 	bool
 	bool
 	default n
 	default n
+config BUSYBOX_DEFAULT_FSYNC
+	bool
+	default y
 config BUSYBOX_DEFAULT_TAC
 config BUSYBOX_DEFAULT_TAC
 	bool
 	bool
 	default n
 	default n
@@ -1618,6 +1621,9 @@ config BUSYBOX_DEFAULT_FEATURE_MDEV_EXEC
 config BUSYBOX_DEFAULT_FEATURE_MDEV_LOAD_FIRMWARE
 config BUSYBOX_DEFAULT_FEATURE_MDEV_LOAD_FIRMWARE
 	bool
 	bool
 	default n
 	default n
+config BUSYBOX_DEFAULT_FEATURE_MDEV_DAEMON
+	bool
+	default n
 config BUSYBOX_DEFAULT_MESG
 config BUSYBOX_DEFAULT_MESG
 	bool
 	bool
 	default n
 	default n
@@ -2023,6 +2029,9 @@ config BUSYBOX_DEFAULT_I2CDUMP
 config BUSYBOX_DEFAULT_I2CDETECT
 config BUSYBOX_DEFAULT_I2CDETECT
 	bool
 	bool
 	default n
 	default n
+config BUSYBOX_DEFAULT_I2CTRANSFER
+	bool
+	default n
 config BUSYBOX_DEFAULT_INOTIFYD
 config BUSYBOX_DEFAULT_INOTIFYD
 	bool
 	bool
 	default n
 	default n
@@ -2125,6 +2134,9 @@ config BUSYBOX_DEFAULT_STRINGS
 config BUSYBOX_DEFAULT_TIME
 config BUSYBOX_DEFAULT_TIME
 	bool
 	bool
 	default y
 	default y
+config BUSYBOX_DEFAULT_TS
+	bool
+	default n
 config BUSYBOX_DEFAULT_TTYSIZE
 config BUSYBOX_DEFAULT_TTYSIZE
 	bool
 	bool
 	default n
 	default n
@@ -2504,6 +2516,9 @@ config BUSYBOX_DEFAULT_TFTP
 config BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR
 config BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR
 	bool
 	bool
 	default n
 	default n
+config BUSYBOX_DEFAULT_FEATURE_TFTP_HPA_COMPAT
+	bool
+	default n
 config BUSYBOX_DEFAULT_TFTPD
 config BUSYBOX_DEFAULT_TFTPD
 	bool
 	bool
 	default n
 	default n
@@ -3047,6 +3062,9 @@ config BUSYBOX_DEFAULT_FEATURE_SH_MATH
 config BUSYBOX_DEFAULT_FEATURE_SH_MATH_64
 config BUSYBOX_DEFAULT_FEATURE_SH_MATH_64
 	bool
 	bool
 	default y
 	default y
+config BUSYBOX_DEFAULT_FEATURE_SH_MATH_BASE
+	bool
+	default n
 config BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET
 config BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET
 	bool
 	bool
 	default n
 	default n

+ 3 - 3
package/utils/busybox/Makefile

@@ -8,14 +8,14 @@
 include $(TOPDIR)/rules.mk
 include $(TOPDIR)/rules.mk
 
 
 PKG_NAME:=busybox
 PKG_NAME:=busybox
-PKG_VERSION:=1.30.1
-PKG_RELEASE:=5
+PKG_VERSION:=1.31.0
+PKG_RELEASE:=1
 PKG_FLAGS:=essential
 PKG_FLAGS:=essential
 
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=https://www.busybox.net/downloads \
 PKG_SOURCE_URL:=https://www.busybox.net/downloads \
 		http://sources.buildroot.net
 		http://sources.buildroot.net
-PKG_HASH:=3d1d04a4dbd34048f4794815a5c48ebb9eb53c5277e09ffffc060323b95dfbdc
+PKG_HASH:=0e4925392fd9f3743cc517e031b68b012b24a63b0cf6c1ff03cce7bb3846cc99
 
 
 PKG_BUILD_DEPENDS:=BUSYBOX_CONFIG_PAM:libpam
 PKG_BUILD_DEPENDS:=BUSYBOX_CONFIG_PAM:libpam
 PKG_BUILD_PARALLEL:=1
 PKG_BUILD_PARALLEL:=1

+ 10 - 1
package/utils/busybox/config/Config.in

@@ -11,7 +11,7 @@ config BUSYBOX_CONFIG_HAVE_DOT_CONFIG
 menu "Settings"
 menu "Settings"
 
 
 config BUSYBOX_CONFIG_DESKTOP
 config BUSYBOX_CONFIG_DESKTOP
-	bool "Enable compatibility for full-blown desktop systems"
+	bool "Enable compatibility for full-blown desktop systems (8kb)"
 	default BUSYBOX_DEFAULT_DESKTOP
 	default BUSYBOX_DEFAULT_DESKTOP
 	help
 	help
 	Enable applet options and features which are not essential.
 	Enable applet options and features which are not essential.
@@ -338,6 +338,15 @@ config BUSYBOX_CONFIG_FEATURE_CLEAN_UP
 	Don't enable this unless you have a really good reason to clean
 	Don't enable this unless you have a really good reason to clean
 	things up manually.
 	things up manually.
 
 
+config BUSYBOX_CONFIG_FEATURE_SYSLOG_INFO
+	bool "Support LOG_INFO level syslog messages"
+	default BUSYBOX_DEFAULT_FEATURE_SYSLOG_INFO
+	depends on BUSYBOX_CONFIG_FEATURE_SYSLOG
+	help
+	Applets which send their output to syslog use either LOG_INFO or
+	LOG_ERR log levels, but by disabling this option all messages will
+	be logged at the LOG_ERR level, saving just under 200 bytes.
+
 # These are auto-selected by other options
 # These are auto-selected by other options
 
 
 config BUSYBOX_CONFIG_FEATURE_SYSLOG
 config BUSYBOX_CONFIG_FEATURE_SYSLOG

+ 6 - 6
package/utils/busybox/config/coreutils/Config.in

@@ -131,7 +131,7 @@ config BUSYBOX_CONFIG_FEATURE_DATE_COMPAT
 	date -s (and other commands like touch -d) use more sensible
 	date -s (and other commands like touch -d) use more sensible
 	formats (for one, ISO format YYYY-MM-DD hh:mm:ss.ssssss).
 	formats (for one, ISO format YYYY-MM-DD hh:mm:ss.ssssss).
 
 
-	With this option off, 'date DATE' is 'date -s DATE' support
+	With this option off, 'date DATE' and 'date -s DATE' support
 	the same format. With it on, 'date DATE' additionally supports
 	the same format. With it on, 'date DATE' additionally supports
 	MMDDhhmm[[YY]YY][.ss] format.
 	MMDDhhmm[[YY]YY][.ss] format.
 config BUSYBOX_CONFIG_DD
 config BUSYBOX_CONFIG_DD
@@ -282,11 +282,6 @@ config BUSYBOX_CONFIG_FOLD
 	default BUSYBOX_DEFAULT_FOLD
 	default BUSYBOX_DEFAULT_FOLD
 	help
 	help
 	Wrap text to fit a specific width.
 	Wrap text to fit a specific width.
-config BUSYBOX_CONFIG_FSYNC
-	bool "fsync (3.6 kb)"
-	default BUSYBOX_DEFAULT_FSYNC
-	help
-	fsync is used to flush file-related cached blocks to disk.
 config BUSYBOX_CONFIG_HEAD
 config BUSYBOX_CONFIG_HEAD
 	bool "head (3.8 kb)"
 	bool "head (3.8 kb)"
 	default BUSYBOX_DEFAULT_HEAD
 	default BUSYBOX_DEFAULT_HEAD
@@ -667,6 +662,11 @@ config BUSYBOX_CONFIG_FEATURE_SYNC_FANCY
 	help
 	help
 	sync -d FILE... executes fdatasync() on each FILE.
 	sync -d FILE... executes fdatasync() on each FILE.
 	sync -f FILE... executes syncfs() on each FILE.
 	sync -f FILE... executes syncfs() on each FILE.
+config BUSYBOX_CONFIG_FSYNC
+	bool "fsync (3.6 kb)"
+	default BUSYBOX_DEFAULT_FSYNC
+	help
+	fsync is used to flush file-related cached blocks to disk.
 config BUSYBOX_CONFIG_TAC
 config BUSYBOX_CONFIG_TAC
 	bool "tac (3.9 kb)"
 	bool "tac (3.9 kb)"
 	default BUSYBOX_DEFAULT_TAC
 	default BUSYBOX_DEFAULT_TAC

+ 10 - 0
package/utils/busybox/config/miscutils/Config.in

@@ -470,6 +470,13 @@ config BUSYBOX_CONFIG_I2CDETECT
 	help
 	help
 	Detect I2C chips.
 	Detect I2C chips.
 
 
+config BUSYBOX_CONFIG_I2CTRANSFER
+	bool "i2ctransfer (4.0 kb)"
+	default BUSYBOX_DEFAULT_I2CTRANSFER
+	select BUSYBOX_CONFIG_PLATFORM_LINUX
+	help
+	Send user-defined I2C messages in one transfer.
+
 config BUSYBOX_CONFIG_INOTIFYD
 config BUSYBOX_CONFIG_INOTIFYD
 	bool "inotifyd (3.6 kb)"
 	bool "inotifyd (3.6 kb)"
 	default BUSYBOX_DEFAULT_INOTIFYD  # doesn't build on Knoppix 5
 	default BUSYBOX_DEFAULT_INOTIFYD  # doesn't build on Knoppix 5
@@ -728,6 +735,9 @@ config BUSYBOX_CONFIG_TIME
 	The time command runs the specified program with the given arguments.
 	The time command runs the specified program with the given arguments.
 	When the command finishes, time writes a message to standard output
 	When the command finishes, time writes a message to standard output
 	giving timing statistics about this program run.
 	giving timing statistics about this program run.
+config BUSYBOX_CONFIG_TS
+	bool "ts (450 bytes)"
+	default BUSYBOX_DEFAULT_TS
 config BUSYBOX_CONFIG_TTYSIZE
 config BUSYBOX_CONFIG_TTYSIZE
 	bool "ttysize (432 bytes)"
 	bool "ttysize (432 bytes)"
 	default BUSYBOX_DEFAULT_TTYSIZE
 	default BUSYBOX_DEFAULT_TTYSIZE

+ 5 - 0
package/utils/busybox/config/networking/Config.in

@@ -972,6 +972,11 @@ config BUSYBOX_CONFIG_FEATURE_TFTP_PROGRESS_BAR
 	default BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR
 	default BUSYBOX_DEFAULT_FEATURE_TFTP_PROGRESS_BAR
 	depends on BUSYBOX_CONFIG_TFTP
 	depends on BUSYBOX_CONFIG_TFTP
 
 
+config BUSYBOX_CONFIG_FEATURE_TFTP_HPA_COMPAT
+	bool "tftp-hpa compat (support -c get/put FILE)"
+	default BUSYBOX_DEFAULT_FEATURE_TFTP_HPA_COMPAT
+	depends on BUSYBOX_CONFIG_TFTP
+
 config BUSYBOX_CONFIG_TFTPD
 config BUSYBOX_CONFIG_TFTPD
 	bool "tftpd (10 kb)"
 	bool "tftpd (10 kb)"
 	default BUSYBOX_DEFAULT_TFTPD
 	default BUSYBOX_DEFAULT_TFTPD

+ 1 - 1
package/utils/busybox/config/networking/udhcp/Config.in

@@ -104,7 +104,7 @@ config BUSYBOX_CONFIG_UDHCPC_DEFAULT_SCRIPT
 # udhcpc6 config is inserted here:
 # udhcpc6 config is inserted here:
 config BUSYBOX_CONFIG_UDHCPC6
 config BUSYBOX_CONFIG_UDHCPC6
 	bool "udhcpc6 (21 kb)"
 	bool "udhcpc6 (21 kb)"
-	default BUSYBOX_DEFAULT_UDHCPC6  # not yet ready
+	default BUSYBOX_DEFAULT_UDHCPC6
 	depends on BUSYBOX_CONFIG_FEATURE_IPV6
 	depends on BUSYBOX_CONFIG_FEATURE_IPV6
 	help
 	help
 	udhcpc6 is a DHCPv6 client
 	udhcpc6 is a DHCPv6 client

+ 5 - 0
package/utils/busybox/config/shell/Config.in

@@ -497,6 +497,11 @@ config BUSYBOX_CONFIG_FEATURE_SH_MATH_64
 	slightly larger, but will allow computation with very large numbers.
 	slightly larger, but will allow computation with very large numbers.
 	This is not in POSIX, so do not rely on this in portable code.
 	This is not in POSIX, so do not rely on this in portable code.
 
 
+config BUSYBOX_CONFIG_FEATURE_SH_MATH_BASE
+	bool "Support BASE#nnnn literals"
+	default BUSYBOX_DEFAULT_FEATURE_SH_MATH_BASE
+	depends on BUSYBOX_CONFIG_FEATURE_SH_MATH
+
 config BUSYBOX_CONFIG_FEATURE_SH_EXTRA_QUIET
 config BUSYBOX_CONFIG_FEATURE_SH_EXTRA_QUIET
 	bool "Hide message on interactive shell startup"
 	bool "Hide message on interactive shell startup"
 	default BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET
 	default BUSYBOX_DEFAULT_FEATURE_SH_EXTRA_QUIET

+ 11 - 0
package/utils/busybox/config/util-linux/Config.in

@@ -473,6 +473,17 @@ config BUSYBOX_CONFIG_FEATURE_MDEV_LOAD_FIRMWARE
 	These devices will request userspace look up the files in
 	These devices will request userspace look up the files in
 	/lib/firmware/ and if it exists, send it to the kernel for
 	/lib/firmware/ and if it exists, send it to the kernel for
 	loading into the hardware.
 	loading into the hardware.
+
+config BUSYBOX_CONFIG_FEATURE_MDEV_DAEMON
+	bool "Support daemon mode"
+	default BUSYBOX_DEFAULT_FEATURE_MDEV_DAEMON
+	depends on BUSYBOX_CONFIG_MDEV
+	help
+	Adds the -d option to run mdev in daemon mode handling hotplug
+	events from the kernel like udev. If the system generates many
+	hotplug events this mode of operation will consume less
+	resources than registering mdev as hotplug helper or using the
+	uevent applet.
 config BUSYBOX_CONFIG_MESG
 config BUSYBOX_CONFIG_MESG
 	bool "mesg (1.4 kb)"
 	bool "mesg (1.4 kb)"
 	default BUSYBOX_DEFAULT_MESG
 	default BUSYBOX_DEFAULT_MESG

+ 2 - 2
package/utils/busybox/patches/200-udhcpc_reduce_msgs.patch

@@ -13,6 +13,6 @@
  	add_client_options(&packet);
  	add_client_options(&packet);
  
  
 +	if (msgs++ < 3)
 +	if (msgs++ < 3)
- 	bb_error_msg("sending %s", "discover");
- 	return raw_bcast_from_client_config_ifindex(&packet, INADDR_ANY);
+ 	bb_info_msg("sending %s", "discover");
+ 	return raw_bcast_from_client_data_ifindex(&packet, INADDR_ANY);
  }
  }

+ 3 - 3
package/utils/busybox/patches/201-udhcpc_changed_ifindex.patch

@@ -1,6 +1,6 @@
 --- a/networking/udhcp/dhcpc.c
 --- a/networking/udhcp/dhcpc.c
 +++ b/networking/udhcp/dhcpc.c
 +++ b/networking/udhcp/dhcpc.c
-@@ -1417,6 +1417,12 @@ int udhcpc_main(int argc UNUSED_PARAM, c
+@@ -1416,6 +1416,12 @@ int udhcpc_main(int argc UNUSED_PARAM, c
  		/* silence "uninitialized!" warning */
  		/* silence "uninitialized!" warning */
  		unsigned timestamp_before_wait = timestamp_before_wait;
  		unsigned timestamp_before_wait = timestamp_before_wait;
  
  
@@ -8,8 +8,8 @@
 +		 * member interfaces were added/removed or if the status of the
 +		 * member interfaces were added/removed or if the status of the
 +		 * bridge changed).
 +		 * bridge changed).
 +		 * Workaround: refresh it here before processing the next packet */
 +		 * Workaround: refresh it here before processing the next packet */
-+		udhcp_read_interface(client_config.interface, &client_config.ifindex, NULL, client_config.client_mac);
++		udhcp_read_interface(client_data.interface, &client_data.ifindex, NULL, client_data.client_mac);
 +
 +
- 		//bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
+ 		//bb_error_msg("sockfd:%d, listen_mode:%d", client_data.sockfd, client_data.listen_mode);
  
  
  		/* Was opening raw or udp socket here
  		/* Was opening raw or udp socket here

+ 2 - 2
package/utils/busybox/patches/203-udhcpc_renew_no_deconfig.patch

@@ -1,7 +1,7 @@
 --- a/networking/udhcp/dhcpc.c
 --- a/networking/udhcp/dhcpc.c
 +++ b/networking/udhcp/dhcpc.c
 +++ b/networking/udhcp/dhcpc.c
-@@ -1128,7 +1128,6 @@ static void perform_renew(void)
- 		state = RENEW_REQUESTED;
+@@ -1126,7 +1126,6 @@ static void perform_renew(void)
+ 		client_data.state = RENEW_REQUESTED;
  		break;
  		break;
  	case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
  	case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
 -		udhcp_run_script(NULL, "deconfig");
 -		udhcp_run_script(NULL, "deconfig");

+ 1 - 1
package/utils/busybox/patches/240-telnetd_intr.patch

@@ -1,6 +1,6 @@
 --- a/networking/telnetd.c
 --- a/networking/telnetd.c
 +++ b/networking/telnetd.c
 +++ b/networking/telnetd.c
-@@ -497,6 +497,7 @@ make_new_session(
+@@ -509,6 +509,7 @@ make_new_session(
  
  
  	/* Restore default signal handling ASAP */
  	/* Restore default signal handling ASAP */
  	bb_signals((1 << SIGCHLD) + (1 << SIGPIPE), SIG_DFL);
  	bb_signals((1 << SIGCHLD) + (1 << SIGPIPE), SIG_DFL);

+ 1 - 1
package/utils/busybox/patches/250-date-k-flag.patch

@@ -2,7 +2,7 @@
 +++ b/coreutils/date.c
 +++ b/coreutils/date.c
 @@ -123,6 +123,7 @@
 @@ -123,6 +123,7 @@
  //usage:	IF_FEATURE_DATE_ISOFMT(
  //usage:	IF_FEATURE_DATE_ISOFMT(
- //usage:     "\n	-D FMT		Use FMT for -d TIME conversion"
+ //usage:     "\n	-D FMT		Use FMT (strptime format) for -d TIME conversion"
  //usage:	)
  //usage:	)
 +//usage:     "\n	-k		Set Kernel timezone from localtime and exit"
 +//usage:     "\n	-k		Set Kernel timezone from localtime and exit"
  //usage:     "\n"
  //usage:     "\n"

+ 0 - 214
package/utils/busybox/patches/530-ip-use-rtnl_send_check-on-flush-commands.patch

@@ -1,214 +0,0 @@
-From 028c5aa18b5273c029f0278232d922ee1a164de6 Mon Sep 17 00:00:00 2001
-From: Denys Vlasenko <[email protected]>
-Date: Wed, 22 May 2019 13:54:46 +0200
-Subject: ip: use rtnl_send_check() on flush commands, closes 6962
-
-function                                             old     new   delta
-rtnl_send_check                                        -     160    +160
-xrtnl_wilddump_request                                64      66      +2
-ipneigh_list_or_flush                                714     706      -8
-rtnl_send                                             69       -     -69
-------------------------------------------------------------------------------
-(add/remove: 1/1 grow/shrink: 1/1 up/down: 162/-77)            Total: 85 bytes
-
-Signed-off-by: Denys Vlasenko <[email protected]>
----
- networking/libiproute/ipaddress.c  |  6 ++++--
- networking/libiproute/ipneigh.c    |  9 ++++----
- networking/libiproute/iproute.c    |  5 ++++-
- networking/libiproute/libnetlink.c | 43 +++++++++++++++++++++++++++++++-------
- networking/libiproute/libnetlink.h | 19 +++++++++++++++--
- 5 files changed, 65 insertions(+), 17 deletions(-)
-
---- a/networking/libiproute/ipaddress.c
-+++ b/networking/libiproute/ipaddress.c
-@@ -23,6 +23,7 @@
- 
- struct filter_t {
- 	char *label;
-+	/* Flush cmd buf. If !NULL, print_addrinfo() constructs flush commands in it */
- 	char *flushb;
- 	struct rtnl_handle *rth;
- 	int scope, scopemask;
-@@ -34,6 +35,8 @@ struct filter_t {
- 	smallint showqueue;
- 	smallint oneline;
- 	smallint up;
-+	/* Misnomer. Does not mean "flushed something" */
-+	/* More like "flush commands were constructed by print_addrinfo()" */
- 	smallint flushed;
- 	inet_prefix pfx;
- } FIX_ALIASING;
-@@ -201,7 +204,7 @@ static NOINLINE int print_linkinfo(const
- 
- static int flush_update(void)
- {
--	if (rtnl_send(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
-+	if (rtnl_send_check(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
- 		bb_perror_msg("can't send flush request");
- 		return -1;
- 	}
-@@ -507,7 +510,6 @@ int FAST_FUNC ipaddr_list_or_flush(char
- 		xrtnl_dump_filter(&rth, store_nlmsg, &ainfo);
- 	}
- 
--
- 	if (G_filter.family && G_filter.family != AF_PACKET) {
- 		struct nlmsg_list **lp;
- 		lp = &linfo;
---- a/networking/libiproute/ipneigh.c
-+++ b/networking/libiproute/ipneigh.c
-@@ -32,7 +32,10 @@ struct filter_t {
- 	int state;
- 	int unused_only;
- 	inet_prefix pfx;
-+	/* Misnomer. Does not mean "flushed N something" */
-+	/* More like "no_of_flush_commands_constructed_by_print_neigh()" */
- 	int flushed;
-+	/* Flush cmd buf. If !NULL, print_neigh() constructs flush commands in it */
- 	char *flushb;
- 	int flushp;
- 	int flushe;
-@@ -45,7 +48,7 @@ typedef struct filter_t filter_t;
- 
- static int flush_update(void)
- {
--	if (rtnl_send(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
-+	if (rtnl_send_check(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
- 		bb_perror_msg("can't send flush request");
- 		return -1;
- 	}
-@@ -299,9 +302,7 @@ static int FAST_FUNC ipneigh_list_or_flu
- 		G_filter.rth = &rth;
- 
- 		while (round < MAX_ROUNDS) {
--			if (xrtnl_wilddump_request(&rth, G_filter.family, RTM_GETNEIGH) < 0) {
--				bb_perror_msg_and_die("can't send dump request");
--			}
-+			xrtnl_wilddump_request(&rth, G_filter.family, RTM_GETNEIGH);
- 			G_filter.flushed = 0;
- 			if (xrtnl_dump_filter(&rth, print_neigh, NULL) < 0) {
- 				bb_perror_msg_and_die("flush terminated");
---- a/networking/libiproute/iproute.c
-+++ b/networking/libiproute/iproute.c
-@@ -26,7 +26,10 @@
- 
- struct filter_t {
- 	int tb;
-+	/* Misnomer. Does not mean "flushed something" */
-+	/* More like "flush commands were constructed by print_route()" */
- 	smallint flushed;
-+	/* Flush cmd buf. If !NULL, print_route() constructs flush commands in it */
- 	char *flushb;
- 	int flushp;
- 	int flushe;
-@@ -53,7 +56,7 @@ typedef struct filter_t filter_t;
- 
- static int flush_update(void)
- {
--	if (rtnl_send(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
-+	if (rtnl_send_check(G_filter.rth, G_filter.flushb, G_filter.flushp) < 0) {
- 		bb_perror_msg("can't send flush request");
- 		return -1;
- 	}
---- a/networking/libiproute/libnetlink.c
-+++ b/networking/libiproute/libnetlink.c
-@@ -34,7 +34,7 @@ void FAST_FUNC xrtnl_open(struct rtnl_ha
- 	rth->seq = time(NULL);
- }
- 
--int FAST_FUNC xrtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
-+void FAST_FUNC xrtnl_wilddump_request(struct rtnl_handle *rth, int family, int type)
- {
- 	struct {
- 		struct nlmsghdr nlh;
-@@ -48,18 +48,45 @@ int FAST_FUNC xrtnl_wilddump_request(str
- 	req.nlh.nlmsg_seq = rth->dump = ++rth->seq;
- 	req.g.rtgen_family = family;
- 
--	return rtnl_send(rth, (void*)&req, sizeof(req));
-+	rtnl_send(rth, (void*)&req, sizeof(req));
- }
- 
--//TODO: pass rth->fd instead of full rth?
--int FAST_FUNC rtnl_send(struct rtnl_handle *rth, char *buf, int len)
-+/* A version which checks for e.g. EPERM errors.
-+ * Try: setuidgid 1:1 ip addr flush dev eth0
-+ */
-+int FAST_FUNC rtnl_send_check(struct rtnl_handle *rth, const void *buf, int len)
- {
--	struct sockaddr_nl nladdr;
-+	struct nlmsghdr *h;
-+	int status;
-+	char resp[1024];
-+
-+	status = write(rth->fd, buf, len);
-+	if (status < 0)
-+		return status;
-+
-+	/* Check for immediate errors */
-+	status = recv(rth->fd, resp, sizeof(resp), MSG_DONTWAIT|MSG_PEEK);
-+	if (status < 0) {
-+		if (errno == EAGAIN) /* if no error, this happens */
-+			return 0;
-+		return -1;
-+	}
-+
-+	for (h = (struct nlmsghdr *)resp;
-+	    NLMSG_OK(h, status);
-+	    h = NLMSG_NEXT(h, status)
-+	) {
-+		if (h->nlmsg_type == NLMSG_ERROR) {
-+			struct nlmsgerr *err = (struct nlmsgerr*)NLMSG_DATA(h);
-+			if (h->nlmsg_len < NLMSG_LENGTH(sizeof(struct nlmsgerr)))
-+				bb_error_msg("ERROR truncated");
-+			else
-+				errno = -err->error;
-+			return -1;
-+		}
-+	}
- 
--	memset(&nladdr, 0, sizeof(nladdr));
--	nladdr.nl_family = AF_NETLINK;
--
--	return xsendto(rth->fd, buf, len, (struct sockaddr*)&nladdr, sizeof(nladdr));
-+	return 0;
- }
- 
- int FAST_FUNC rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len)
---- a/networking/libiproute/libnetlink.h
-+++ b/networking/libiproute/libnetlink.h
-@@ -20,7 +20,7 @@ struct rtnl_handle {
- 
- extern void xrtnl_open(struct rtnl_handle *rth) FAST_FUNC;
- #define rtnl_close(rth) (close((rth)->fd))
--extern int xrtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type) FAST_FUNC;
-+extern void xrtnl_wilddump_request(struct rtnl_handle *rth, int fam, int type) FAST_FUNC;
- extern int rtnl_dump_request(struct rtnl_handle *rth, int type, void *req, int len) FAST_FUNC;
- extern int xrtnl_dump_filter(struct rtnl_handle *rth,
- 		int (*filter)(const struct sockaddr_nl*, struct nlmsghdr *n, void*) FAST_FUNC,
-@@ -34,8 +34,23 @@ extern int rtnl_talk(struct rtnl_handle
- 		int (*junk)(struct sockaddr_nl *,struct nlmsghdr *n, void *),
- 		void *jarg) FAST_FUNC;
- 
--extern int rtnl_send(struct rtnl_handle *rth, char *buf, int) FAST_FUNC;
-+int rtnl_send_check(struct rtnl_handle *rth, const void *buf, int len) FAST_FUNC;
-+//TODO: pass rth->fd instead of full rth?
-+static ALWAYS_INLINE void rtnl_send(struct rtnl_handle *rth, const void *buf, int len)
-+{
-+	// Used to be:
-+	//struct sockaddr_nl nladdr;
-+	//memset(&nladdr, 0, sizeof(nladdr));
-+	//nladdr.nl_family = AF_NETLINK;
-+	//return xsendto(rth->fd, buf, len, (struct sockaddr*)&nladdr, sizeof(nladdr));
- 
-+	// iproute2-4.2.0 simplified the above to:
-+	//return send(rth->fd, buf, len, 0);
-+
-+	// We are using even shorter:
-+	xwrite(rth->fd, buf, len);
-+	// and convert to void, inline.
-+}
- 
- extern int addattr32(struct nlmsghdr *n, int maxlen, int type, uint32_t data) FAST_FUNC;
- extern int addattr_l(struct nlmsghdr *n, int maxlen, int type, void *data, int alen) FAST_FUNC;