aboutsummaryrefslogtreecommitdiffstats
path: root/package/utils/busybox/patches
diff options
context:
space:
mode:
Diffstat (limited to 'package/utils/busybox/patches')
-rw-r--r--package/utils/busybox/patches/001-resource_h_include.patch10
-rw-r--r--package/utils/busybox/patches/100-trylink_bash.patch8
-rw-r--r--package/utils/busybox/patches/101-gen_build_files_bash.patch8
-rw-r--r--package/utils/busybox/patches/102-trylink_mktemp_fix.patch20
-rw-r--r--package/utils/busybox/patches/110-no_static_libgcc.patch11
-rw-r--r--package/utils/busybox/patches/120-remove_uclibc_rpc_check.patch12
-rw-r--r--package/utils/busybox/patches/130-mconf_missing_sigwinch.patch13
-rw-r--r--package/utils/busybox/patches/200-udhcpc_reduce_msgs.patch18
-rw-r--r--package/utils/busybox/patches/201-udhcpc_changed_ifindex.patch15
-rw-r--r--package/utils/busybox/patches/203-udhcpc_renew_no_deconfig.patch10
-rw-r--r--package/utils/busybox/patches/204-udhcpc_src_ip_rebind.patch51
-rw-r--r--package/utils/busybox/patches/210-add_netmsg_util.patch103
-rw-r--r--package/utils/busybox/patches/220-add_lock_util.patch182
-rw-r--r--package/utils/busybox/patches/230-ntpd_delayed_resolve.patch48
-rw-r--r--package/utils/busybox/patches/240-telnetd_intr.patch10
-rw-r--r--package/utils/busybox/patches/250-date-k-flag.patch87
-rw-r--r--package/utils/busybox/patches/260-arping_missing_includes.patch11
-rw-r--r--package/utils/busybox/patches/270-libbb_make_unicode_printable.patch20
-rw-r--r--package/utils/busybox/patches/301-ip-link-fix-netlink-msg-size.patch11
19 files changed, 648 insertions, 0 deletions
diff --git a/package/utils/busybox/patches/001-resource_h_include.patch b/package/utils/busybox/patches/001-resource_h_include.patch
new file mode 100644
index 0000000..5e2f172
--- /dev/null
+++ b/package/utils/busybox/patches/001-resource_h_include.patch
@@ -0,0 +1,10 @@
+--- a/include/libbb.h
++++ b/include/libbb.h
+@@ -40,6 +40,7 @@
+ #include <poll.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
++#include <sys/resource.h>
+ #include <sys/socket.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
diff --git a/package/utils/busybox/patches/100-trylink_bash.patch b/package/utils/busybox/patches/100-trylink_bash.patch
new file mode 100644
index 0000000..f9571fc
--- /dev/null
+++ b/package/utils/busybox/patches/100-trylink_bash.patch
@@ -0,0 +1,8 @@
+--- a/scripts/trylink
++++ b/scripts/trylink
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/usr/bin/env bash
+
+ debug=false
+
diff --git a/package/utils/busybox/patches/101-gen_build_files_bash.patch b/package/utils/busybox/patches/101-gen_build_files_bash.patch
new file mode 100644
index 0000000..d258fb8
--- /dev/null
+++ b/package/utils/busybox/patches/101-gen_build_files_bash.patch
@@ -0,0 +1,8 @@
+--- a/scripts/gen_build_files.sh
++++ b/scripts/gen_build_files.sh
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/usr/bin/env bash
+
+ # Note: was using sed OPTS CMD -- FILES
+ # but users complain that many sed implementations
diff --git a/package/utils/busybox/patches/102-trylink_mktemp_fix.patch b/package/utils/busybox/patches/102-trylink_mktemp_fix.patch
new file mode 100644
index 0000000..ed1dcbb
--- /dev/null
+++ b/package/utils/busybox/patches/102-trylink_mktemp_fix.patch
@@ -0,0 +1,20 @@
+--- a/scripts/trylink
++++ b/scripts/trylink
+@@ -46,7 +46,7 @@ try() {
+ }
+
+ check_cc() {
+- local tempname="$(mktemp)"
++ local tempname="$(mktemp /tmp/tmp.XXXXXXXXXX)"
+ local r
+ echo "int main(int argc,char**argv){return argv?argc:0;}" >"$tempname".c
+ # Can use "-o /dev/null", but older gcc tend to *unlink it* on failure! :(
+@@ -61,7 +61,7 @@ check_cc() {
+ }
+
+ check_libc_is_glibc() {
+- local tempname="$(mktemp)"
++ local tempname="$(mktemp /tmp/tmp.XXXXXXXXXX)"
+ local r
+ echo "\
+ #include <stdlib.h>
diff --git a/package/utils/busybox/patches/110-no_static_libgcc.patch b/package/utils/busybox/patches/110-no_static_libgcc.patch
new file mode 100644
index 0000000..2148a09
--- /dev/null
+++ b/package/utils/busybox/patches/110-no_static_libgcc.patch
@@ -0,0 +1,11 @@
+--- a/Makefile.flags
++++ b/Makefile.flags
+@@ -51,7 +51,7 @@ CFLAGS += $(call cc-option,-fno-builtin-
+ # -fno-guess-branch-probability: prohibit pseudo-random guessing
+ # of branch probabilities (hopefully makes bloatcheck more stable):
+ CFLAGS += $(call cc-option,-fno-guess-branch-probability,)
+-CFLAGS += $(call cc-option,-funsigned-char -static-libgcc,)
++CFLAGS += $(call cc-option,-funsigned-char,)
+ CFLAGS += $(call cc-option,-falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1,)
+ # Defeat .eh_frame bloat (gcc 4.6.3 x86-32 defconfig: 20% smaller busybox binary):
+ CFLAGS += $(call cc-option,-fno-unwind-tables,)
diff --git a/package/utils/busybox/patches/120-remove_uclibc_rpc_check.patch b/package/utils/busybox/patches/120-remove_uclibc_rpc_check.patch
new file mode 100644
index 0000000..5499efd
--- /dev/null
+++ b/package/utils/busybox/patches/120-remove_uclibc_rpc_check.patch
@@ -0,0 +1,12 @@
+--- a/util-linux/mount.c
++++ b/util-linux/mount.c
+@@ -236,9 +236,6 @@
+ #if ENABLE_FEATURE_MOUNT_NFS
+ /* This is just a warning of a common mistake. Possibly this should be a
+ * uclibc faq entry rather than in busybox... */
+-# if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_RPC__)
+-# error "You need to build uClibc with UCLIBC_HAS_RPC for NFS support"
+-# endif
+ # include <rpc/rpc.h>
+ # include <rpc/pmap_prot.h>
+ # include <rpc/pmap_clnt.h>
diff --git a/package/utils/busybox/patches/130-mconf_missing_sigwinch.patch b/package/utils/busybox/patches/130-mconf_missing_sigwinch.patch
new file mode 100644
index 0000000..54f878a
--- /dev/null
+++ b/package/utils/busybox/patches/130-mconf_missing_sigwinch.patch
@@ -0,0 +1,13 @@
+--- a/scripts/kconfig/mconf.c
++++ b/scripts/kconfig/mconf.c
+@@ -27,6 +27,10 @@
+ #include <unistd.h>
+ #include <locale.h>
+
++#ifndef SIGWINCH
++#define SIGWINCH 28
++#endif
++
+ #define LKC_DIRECT_LINK
+ #include "lkc.h"
+
diff --git a/package/utils/busybox/patches/200-udhcpc_reduce_msgs.patch b/package/utils/busybox/patches/200-udhcpc_reduce_msgs.patch
new file mode 100644
index 0000000..1083675
--- /dev/null
+++ b/package/utils/busybox/patches/200-udhcpc_reduce_msgs.patch
@@ -0,0 +1,18 @@
+--- a/networking/udhcp/dhcpc.c
++++ b/networking/udhcp/dhcpc.c
+@@ -695,6 +695,7 @@ static int bcast_or_ucast(struct dhcp_pa
+ static NOINLINE int send_discover(uint32_t xid, uint32_t requested)
+ {
+ struct dhcp_packet packet;
++ static int msgs = 0;
+
+ /* Fill in: op, htype, hlen, cookie, chaddr fields,
+ * random xid field (we override it below),
+@@ -712,6 +713,7 @@ static NOINLINE int send_discover(uint32
+ */
+ add_client_options(&packet);
+
++ if (msgs++ < 3)
+ bb_info_msg("Sending discover...");
+ return raw_bcast_from_client_config_ifindex(&packet);
+ }
diff --git a/package/utils/busybox/patches/201-udhcpc_changed_ifindex.patch b/package/utils/busybox/patches/201-udhcpc_changed_ifindex.patch
new file mode 100644
index 0000000..f32cea2
--- /dev/null
+++ b/package/utils/busybox/patches/201-udhcpc_changed_ifindex.patch
@@ -0,0 +1,15 @@
+--- a/networking/udhcp/dhcpc.c
++++ b/networking/udhcp/dhcpc.c
+@@ -1418,6 +1418,12 @@ int udhcpc_main(int argc UNUSED_PARAM, c
+ /* silence "uninitialized!" warning */
+ unsigned timestamp_before_wait = timestamp_before_wait;
+
++ /* When running on a bridge, the ifindex may have changed (e.g. if
++ * member interfaces were added/removed or if the status of the
++ * bridge changed).
++ * Workaround: refresh it here before processing the next packet */
++ udhcp_read_interface(client_config.interface, &client_config.ifindex, NULL, client_config.client_mac);
++
+ //bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
+
+ /* Was opening raw or udp socket here
diff --git a/package/utils/busybox/patches/203-udhcpc_renew_no_deconfig.patch b/package/utils/busybox/patches/203-udhcpc_renew_no_deconfig.patch
new file mode 100644
index 0000000..f38b128
--- /dev/null
+++ b/package/utils/busybox/patches/203-udhcpc_renew_no_deconfig.patch
@@ -0,0 +1,10 @@
+--- a/networking/udhcp/dhcpc.c
++++ b/networking/udhcp/dhcpc.c
+@@ -1101,7 +1101,6 @@ static void perform_renew(void)
+ state = RENEW_REQUESTED;
+ break;
+ case RENEW_REQUESTED: /* impatient are we? fine, square 1 */
+- udhcp_run_script(NULL, "deconfig");
+ case REQUESTING:
+ case RELEASED:
+ change_listen_mode(LISTEN_RAW);
diff --git a/package/utils/busybox/patches/204-udhcpc_src_ip_rebind.patch b/package/utils/busybox/patches/204-udhcpc_src_ip_rebind.patch
new file mode 100644
index 0000000..21fec51
--- /dev/null
+++ b/package/utils/busybox/patches/204-udhcpc_src_ip_rebind.patch
@@ -0,0 +1,51 @@
+--- a/networking/udhcp/dhcpc.c
++++ b/networking/udhcp/dhcpc.c
+@@ -673,10 +673,10 @@ static void add_client_options(struct dh
+ * client reverts to using the IP broadcast address.
+ */
+
+-static int raw_bcast_from_client_config_ifindex(struct dhcp_packet *packet)
++static int raw_bcast_from_client_config_ifindex(struct dhcp_packet *packet, uint32_t src_nip)
+ {
+ return udhcp_send_raw_packet(packet,
+- /*src*/ INADDR_ANY, CLIENT_PORT,
++ /*src*/ src_nip, CLIENT_PORT,
+ /*dst*/ INADDR_BROADCAST, SERVER_PORT, MAC_BCAST_ADDR,
+ client_config.ifindex);
+ }
+@@ -687,7 +687,7 @@ static int bcast_or_ucast(struct dhcp_pa
+ return udhcp_send_kernel_packet(packet,
+ ciaddr, CLIENT_PORT,
+ server, SERVER_PORT);
+- return raw_bcast_from_client_config_ifindex(packet);
++ return raw_bcast_from_client_config_ifindex(packet, ciaddr);
+ }
+
+ /* Broadcast a DHCP discover packet to the network, with an optionally requested IP */
+@@ -715,7 +715,7 @@ static NOINLINE int send_discover(uint32
+
+ if (msgs++ < 3)
+ bb_info_msg("Sending discover...");
+- return raw_bcast_from_client_config_ifindex(&packet);
++ return raw_bcast_from_client_config_ifindex(&packet, INADDR_ANY);
+ }
+
+ /* Broadcast a DHCP request message */
+@@ -759,7 +759,7 @@ static NOINLINE int send_select(uint32_t
+
+ addr.s_addr = requested;
+ bb_info_msg("Sending select for %s...", inet_ntoa(addr));
+- return raw_bcast_from_client_config_ifindex(&packet);
++ return raw_bcast_from_client_config_ifindex(&packet, INADDR_ANY);
+ }
+
+ /* Unicast or broadcast a DHCP renew message */
+@@ -827,7 +827,7 @@ static NOINLINE int send_decline(/*uint3
+ udhcp_add_simple_option(&packet, DHCP_SERVER_ID, server);
+
+ bb_info_msg("Sending decline...");
+- return raw_bcast_from_client_config_ifindex(&packet);
++ return raw_bcast_from_client_config_ifindex(&packet, INADDR_ANY);
+ }
+ #endif
+
diff --git a/package/utils/busybox/patches/210-add_netmsg_util.patch b/package/utils/busybox/patches/210-add_netmsg_util.patch
new file mode 100644
index 0000000..8162e3b
--- /dev/null
+++ b/package/utils/busybox/patches/210-add_netmsg_util.patch
@@ -0,0 +1,103 @@
+--- a/include/applets.src.h
++++ b/include/applets.src.h
+@@ -254,6 +254,7 @@ IF_MT(APPLET(mt, BB_DIR_BIN, BB_SUID_DRO
+ IF_MV(APPLET(mv, BB_DIR_BIN, BB_SUID_DROP))
+ IF_NAMEIF(APPLET(nameif, BB_DIR_SBIN, BB_SUID_DROP))
+ IF_NC(APPLET(nc, BB_DIR_USR_BIN, BB_SUID_DROP))
++IF_NETMSG(APPLET(netmsg, BB_DIR_BIN, BB_SUID_REQUIRE))
+ IF_NETSTAT(APPLET(netstat, BB_DIR_BIN, BB_SUID_DROP))
+ IF_NICE(APPLET(nice, BB_DIR_BIN, BB_SUID_DROP))
+ IF_NOHUP(APPLET(nohup, BB_DIR_USR_BIN, BB_SUID_DROP))
+--- a/networking/Config.src
++++ b/networking/Config.src
+@@ -626,6 +626,12 @@ config FEATURE_IPCALC_LONG_OPTIONS
+ help
+ Support long options for the ipcalc applet.
+
++config NETMSG
++ bool "netmsg"
++ default n
++ help
++ simple program for sending udp broadcast messages
++
+ config NETSTAT
+ bool "netstat"
+ default y
+--- a/networking/Kbuild.src
++++ b/networking/Kbuild.src
+@@ -27,6 +27,7 @@ lib-$(CONFIG_IP) += ip.o
+ lib-$(CONFIG_IPCALC) += ipcalc.o
+ lib-$(CONFIG_NAMEIF) += nameif.o
+ lib-$(CONFIG_NC) += nc.o
++lib-$(CONFIG_NETMSG) += netmsg.o
+ lib-$(CONFIG_NETSTAT) += netstat.o
+ lib-$(CONFIG_NSLOOKUP) += nslookup.o
+ lib-$(CONFIG_NTPD) += ntpd.o
+--- /dev/null
++++ b/networking/netmsg.c
+@@ -0,0 +1,65 @@
++/*
++ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
++ *
++ * This is free software, licensed under the GNU General Public License v2.
++ */
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <netdb.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include "busybox.h"
++
++//usage:#define netmsg_trivial_usage NOUSAGE_STR
++//usage:#define netmsg_full_usage ""
++
++#ifndef CONFIG_NETMSG
++int main(int argc, char **argv)
++#else
++int netmsg_main(int argc, char **argv)
++#endif
++{
++ int s;
++ struct sockaddr_in addr;
++ int optval = 1;
++ unsigned char buf[1001];
++
++ if (argc != 3) {
++ fprintf(stderr, "usage: %s <ip> \"<message>\"\n", argv[0]);
++ exit(1);
++ }
++
++ if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
++ perror("Opening socket");
++ exit(1);
++ }
++
++ memset(&addr, 0, sizeof(addr));
++ addr.sin_family = AF_INET;
++ addr.sin_addr.s_addr = inet_addr(argv[1]);
++ addr.sin_port = htons(0x1337);
++
++ memset(buf, 0, 1001);
++ buf[0] = 0xde;
++ buf[1] = 0xad;
++
++ strncpy(buf + 2, argv[2], 998);
++
++ if (setsockopt (s, SOL_SOCKET, SO_BROADCAST, (caddr_t) &optval, sizeof (optval)) < 0) {
++ perror("setsockopt()");
++ goto fail;
++ }
++
++ if (sendto(s, buf, 1001, 0, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
++ perror("sendto()");
++ goto fail;
++ }
++
++ return 0;
++
++fail:
++ close(s);
++ exit(1);
++}
diff --git a/package/utils/busybox/patches/220-add_lock_util.patch b/package/utils/busybox/patches/220-add_lock_util.patch
new file mode 100644
index 0000000..9cac9e6
--- /dev/null
+++ b/package/utils/busybox/patches/220-add_lock_util.patch
@@ -0,0 +1,182 @@
+--- a/include/applets.src.h
++++ b/include/applets.src.h
+@@ -211,6 +211,7 @@ IF_LN(APPLET_NOEXEC(ln, ln, BB_DIR_BIN,
+ IF_LOAD_POLICY(APPLET(load_policy, BB_DIR_USR_SBIN, BB_SUID_DROP))
+ IF_LOADFONT(APPLET(loadfont, BB_DIR_USR_SBIN, BB_SUID_DROP))
+ IF_LOADKMAP(APPLET(loadkmap, BB_DIR_SBIN, BB_SUID_DROP))
++IF_LOCK(APPLET(lock, BB_DIR_BIN, BB_SUID_DROP))
+ IF_LOGGER(APPLET(logger, BB_DIR_USR_BIN, BB_SUID_DROP))
+ /* Needs to be run by root or be suid root - needs to change uid and gid: */
+ IF_LOGIN(APPLET(login, BB_DIR_BIN, BB_SUID_REQUIRE))
+--- a/miscutils/Config.src
++++ b/miscutils/Config.src
+@@ -385,6 +385,12 @@ config FEATURE_HDPARM_HDIO_GETSET_DMA
+ help
+ Enables the 'hdparm -d' option to get/set using_dma flag.
+
++config LOCK
++ bool "lock"
++ default n
++ help
++ Small utility for using locks in scripts
++
+ config MAKEDEVS
+ bool "makedevs"
+ default y
+--- a/miscutils/Kbuild.src
++++ b/miscutils/Kbuild.src
+@@ -28,6 +28,7 @@ lib-$(CONFIG_INOTIFYD) += inotifyd.o
+ lib-$(CONFIG_FEATURE_LAST_SMALL)+= last.o
+ lib-$(CONFIG_FEATURE_LAST_FANCY)+= last_fancy.o
+ lib-$(CONFIG_LESS) += less.o
++lib-$(CONFIG_LOCK) += lock.o
+ lib-$(CONFIG_MAKEDEVS) += makedevs.o
+ lib-$(CONFIG_MAN) += man.o
+ lib-$(CONFIG_MICROCOM) += microcom.o
+--- /dev/null
++++ b/miscutils/lock.c
+@@ -0,0 +1,144 @@
++/*
++ * Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
++ *
++ * This is free software, licensed under the GNU General Public License v2.
++ */
++#include <sys/types.h>
++#include <sys/file.h>
++#include <sys/stat.h>
++#include <signal.h>
++#include <fcntl.h>
++#include <unistd.h>
++#include <stdio.h>
++#include "busybox.h"
++
++//usage:#define lock_trivial_usage NOUSAGE_STR
++//usage:#define lock_full_usage ""
++
++static int unlock = 0;
++static int shared = 0;
++static int waitonly = 0;
++static int try_lock = 0;
++static int fd;
++static char *file;
++
++static void usage(char *name)
++{
++ fprintf(stderr, "Usage: %s [-suw] <filename>\n"
++ " -s Use shared locking\n"
++ " -u Unlock\n"
++ " -w Wait for the lock to become free, don't acquire lock\n"
++ " -n Don't wait for the lock to become free. Fail with exit code\n"
++ "\n", name);
++ exit(1);
++}
++
++static void exit_unlock(int sig)
++{
++ flock(fd, LOCK_UN);
++ exit(0);
++}
++
++static int do_unlock(void)
++{
++ FILE *f;
++ int i;
++
++ if ((f = fopen(file, "r")) == NULL)
++ return 0;
++
++ fscanf(f, "%d", &i);
++ if (i > 0)
++ kill(i, SIGTERM);
++
++ fclose(f);
++
++ return 0;
++}
++
++static int do_lock(void)
++{
++ int pid;
++ int flags;
++ char pidstr[8];
++
++ if ((fd = open(file, O_RDWR | O_CREAT | O_EXCL, 0700)) < 0) {
++ if ((fd = open(file, O_RDWR)) < 0) {
++ fprintf(stderr, "Can't open %s\n", file);
++ return 1;
++ }
++ }
++
++ flags = shared ? LOCK_SH : LOCK_EX;
++ flags |= try_lock ? LOCK_NB : 0;
++
++ if (flock(fd, flags) < 0) {
++ fprintf(stderr, "Can't lock %s\n", file);
++ return 1;
++ }
++
++ pid = fork();
++
++ if (pid < 0)
++ return -1;
++
++ if (pid == 0) {
++ signal(SIGKILL, exit_unlock);
++ signal(SIGTERM, exit_unlock);
++ signal(SIGINT, exit_unlock);
++ if (waitonly)
++ exit_unlock(0);
++ else
++ while (1)
++ sleep(1);
++ } else {
++ if (!waitonly) {
++ lseek(fd, 0, SEEK_SET);
++ ftruncate(fd, 0);
++ sprintf(pidstr, "%d\n", pid);
++ write(fd, pidstr, strlen(pidstr));
++ close(fd);
++ }
++
++ return 0;
++ }
++ return 0;
++}
++
++int lock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
++int lock_main(int argc, char **argv)
++{
++ char **args = &argv[1];
++ int c = argc - 1;
++
++ while ((*args != NULL) && (*args)[0] == '-') {
++ char *ch = *args;
++ while (*(++ch) > 0) {
++ switch(*ch) {
++ case 'w':
++ waitonly = 1;
++ break;
++ case 's':
++ shared = 1;
++ break;
++ case 'u':
++ unlock = 1;
++ break;
++ case 'n':
++ try_lock = 1;
++ break;
++ }
++ }
++ c--;
++ args++;
++ }
++
++ if (c != 1)
++ usage(argv[0]);
++
++ file = *args;
++ if (unlock)
++ return do_unlock();
++ else
++ return do_lock();
++}
diff --git a/package/utils/busybox/patches/230-ntpd_delayed_resolve.patch b/package/utils/busybox/patches/230-ntpd_delayed_resolve.patch
new file mode 100644
index 0000000..b0af08e
--- /dev/null
+++ b/package/utils/busybox/patches/230-ntpd_delayed_resolve.patch
@@ -0,0 +1,48 @@
+--- a/networking/ntpd.c
++++ b/networking/ntpd.c
+@@ -265,6 +265,7 @@ typedef struct {
+ typedef struct {
+ len_and_sockaddr *p_lsa;
+ char *p_dotted;
++ char *p_hostname;
+ int p_fd;
+ int datapoint_idx;
+ uint32_t lastpkt_refid;
+@@ -766,8 +767,9 @@ add_peers(const char *s)
+ peer_t *p;
+
+ p = xzalloc(sizeof(*p));
+- p->p_lsa = xhost2sockaddr(s, 123);
+- p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
++ p->p_hostname = s;
++ p->p_lsa = NULL;
++ p->p_dotted = NULL;
+ p->p_fd = -1;
+ p->p_xmt_msg.m_status = MODE_CLIENT | (NTP_VERSION << 3);
+ p->next_action_time = G.cur_time; /* = set_next(p, 0); */
+@@ -816,6 +818,25 @@ send_query_to_peer(peer_t *p)
+ *
+ * Uncomment this and use strace to see it in action:
+ */
++
++ /* See if the peer hostname already resolved yet, if not, retry to resolv and return on failure */
++ if (!p->p_lsa)
++ {
++ p->p_lsa = host2sockaddr(p->p_hostname, 123);
++
++ if (p->p_lsa)
++ {
++ p->p_dotted = xmalloc_sockaddr2dotted_noport(&p->p_lsa->u.sa);
++ VERB1 bb_error_msg("resolved peer %s to %s", p->p_hostname, p->p_dotted);
++ }
++ else
++ {
++ set_next(p, RETRY_INTERVAL);
++ VERB1 bb_error_msg("could not resolve peer %s, skipping", p->p_hostname);
++ return;
++ }
++ }
++
+ #define PROBE_LOCAL_ADDR /* { len_and_sockaddr lsa; lsa.len = LSA_SIZEOF_SA; getsockname(p->query.fd, &lsa.u.sa, &lsa.len); } */
+
+ if (p->p_fd == -1) {
diff --git a/package/utils/busybox/patches/240-telnetd_intr.patch b/package/utils/busybox/patches/240-telnetd_intr.patch
new file mode 100644
index 0000000..ccb4ea4
--- /dev/null
+++ b/package/utils/busybox/patches/240-telnetd_intr.patch
@@ -0,0 +1,10 @@
+--- a/networking/telnetd.c
++++ b/networking/telnetd.c
+@@ -331,6 +331,7 @@ make_new_session(
+
+ /* Restore default signal handling ASAP */
+ bb_signals((1 << SIGCHLD) + (1 << SIGPIPE), SIG_DFL);
++ signal(SIGINT, SIG_DFL);
+
+ pid = getpid();
+
diff --git a/package/utils/busybox/patches/250-date-k-flag.patch b/package/utils/busybox/patches/250-date-k-flag.patch
new file mode 100644
index 0000000..f0dab26
--- /dev/null
+++ b/package/utils/busybox/patches/250-date-k-flag.patch
@@ -0,0 +1,87 @@
+--- a/coreutils/date.c
++++ b/coreutils/date.c
+@@ -123,6 +123,7 @@
+ //usage: IF_FEATURE_DATE_ISOFMT(
+ //usage: "\n -D FMT Use FMT for -d TIME conversion"
+ //usage: )
++//usage: "\n -k Set Kernel timezone from localtime and exit"
+ //usage: "\n"
+ //usage: "\nRecognized TIME formats:"
+ //usage: "\n hh:mm[:ss]"
+@@ -138,6 +139,7 @@
+ //usage: "Wed Apr 12 18:52:41 MDT 2000\n"
+
+ #include "libbb.h"
++#include <sys/time.h>
+ #if ENABLE_FEATURE_DATE_NANO
+ # include <sys/syscall.h>
+ #endif
+@@ -148,8 +150,9 @@ enum {
+ OPT_UTC = (1 << 2), /* u */
+ OPT_DATE = (1 << 3), /* d */
+ OPT_REFERENCE = (1 << 4), /* r */
+- OPT_TIMESPEC = (1 << 5) * ENABLE_FEATURE_DATE_ISOFMT, /* I */
+- OPT_HINT = (1 << 6) * ENABLE_FEATURE_DATE_ISOFMT, /* D */
++ OPT_KERNELTZ = (1 << 5), /* k */
++ OPT_TIMESPEC = (1 << 6) * ENABLE_FEATURE_DATE_ISOFMT, /* I */
++ OPT_HINT = (1 << 7) * ENABLE_FEATURE_DATE_ISOFMT, /* D */
+ };
+
+ static void maybe_set_utc(int opt)
+@@ -167,12 +170,15 @@ static const char date_longopts[] ALIGN1
+ /* "universal\0" No_argument "u" */
+ "date\0" Required_argument "d"
+ "reference\0" Required_argument "r"
++ "set-kernel-tz\0" No_argument "k"
+ ;
+ #endif
+
+ int date_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int date_main(int argc UNUSED_PARAM, char **argv)
+ {
++ time_t tt;
++ struct timezone tz;
+ struct timespec ts;
+ struct tm tm_time;
+ char buf_fmt_dt2str[64];
+@@ -187,7 +193,7 @@ int date_main(int argc UNUSED_PARAM, cha
+ opt_complementary = "d--s:s--d"
+ IF_FEATURE_DATE_ISOFMT(":R--I:I--R");
+ IF_LONG_OPTS(applet_long_options = date_longopts;)
+- opt = getopt32(argv, "Rs:ud:r:"
++ opt = getopt32(argv, "Rs:ud:r:k"
+ IF_FEATURE_DATE_ISOFMT("I::D:"),
+ &date_str, &date_str, &filename
+ IF_FEATURE_DATE_ISOFMT(, &isofmt_arg, &fmt_str2dt));
+@@ -244,6 +250,31 @@ int date_main(int argc UNUSED_PARAM, cha
+ if (*argv)
+ bb_show_usage();
+
++ /* Setting of kernel timezone was requested */
++ if (opt & OPT_KERNELTZ) {
++ tt = time(NULL);
++ localtime_r(&tt, &tm_time);
++
++ /* workaround warp_clock() on first invocation */
++ memset(&tz, 0, sizeof(tz));
++ settimeofday(NULL, &tz);
++
++ memset(&tz, 0, sizeof(tz));
++#ifdef __USE_MISC
++ tz.tz_minuteswest = -(tm_time.tm_gmtoff / 60);
++#else
++ tz.tz_minuteswest = -(tm_time.__tm_gmtoff / 60);
++#endif
++
++ if (settimeofday(NULL, &tz))
++ {
++ bb_perror_msg("can't set kernel time zone");
++ return EXIT_FAILURE;
++ }
++
++ return EXIT_SUCCESS;
++ }
++
+ /* Now we have parsed all the information except the date format
+ * which depends on whether the clock is being set or read */
+
diff --git a/package/utils/busybox/patches/260-arping_missing_includes.patch b/package/utils/busybox/patches/260-arping_missing_includes.patch
new file mode 100644
index 0000000..a9d4a62
--- /dev/null
+++ b/package/utils/busybox/patches/260-arping_missing_includes.patch
@@ -0,0 +1,11 @@
+--- a/networking/arping.c
++++ b/networking/arping.c
+@@ -24,6 +24,8 @@
+
+ #include <arpa/inet.h>
+ #include <net/if.h>
++#include <net/if_arp.h>
++#include <netinet/if_ether.h>
+ #include <netinet/ether.h>
+ #include <netpacket/packet.h>
+
diff --git a/package/utils/busybox/patches/270-libbb_make_unicode_printable.patch b/package/utils/busybox/patches/270-libbb_make_unicode_printable.patch
new file mode 100644
index 0000000..0ae8340
--- /dev/null
+++ b/package/utils/busybox/patches/270-libbb_make_unicode_printable.patch
@@ -0,0 +1,20 @@
+--- a/libbb/printable_string.c
++++ b/libbb/printable_string.c
+@@ -28,8 +28,6 @@ const char* FAST_FUNC printable_string(u
+ }
+ if (c < ' ')
+ break;
+- if (c >= 0x7f)
+- break;
+ s++;
+ }
+
+@@ -42,7 +40,7 @@ const char* FAST_FUNC printable_string(u
+ unsigned char c = *d;
+ if (c == '\0')
+ break;
+- if (c < ' ' || c >= 0x7f)
++ if (c < ' ')
+ *d = '?';
+ d++;
+ }
diff --git a/package/utils/busybox/patches/301-ip-link-fix-netlink-msg-size.patch b/package/utils/busybox/patches/301-ip-link-fix-netlink-msg-size.patch
new file mode 100644
index 0000000..360324b
--- /dev/null
+++ b/package/utils/busybox/patches/301-ip-link-fix-netlink-msg-size.patch
@@ -0,0 +1,11 @@
+--- a/networking/libiproute/iplink.c
++++ b/networking/libiproute/iplink.c
+@@ -470,7 +470,7 @@ static int do_add_or_delete(char **argv,
+ }
+ xrtnl_open(&rth);
+ ll_init_map(&rth);
+- if (type_str) {
++ if (type_str && rtm == RTM_NEWLINK) {
+ struct rtattr *linkinfo = NLMSG_TAIL(&req.n);
+
+ addattr_l(&req.n, sizeof(req), IFLA_LINKINFO, NULL, 0);