diff -Naur busybox-1.31.1-orig/coreutils/date.c busybox-1.31.1/coreutils/date.c
--- busybox-1.31.1-orig/coreutils/date.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/coreutils/date.c	2020-04-29 20:17:14.678630100 +0300
@@ -139,7 +139,7 @@
 
 #include "libbb.h"
 #include "common_bufsiz.h"
-#if ENABLE_FEATURE_DATE_NANO
+#if ENABLE_FEATURE_DATE_NANO && defined(HAVE_SYS_SYSCALL_H)
 # include <sys/syscall.h>
 #endif
 
@@ -272,10 +272,13 @@
 #endif
 	} else {
 #if ENABLE_FEATURE_DATE_NANO
+# ifdef HAVE_SYS_SYSCALL_H
 		/* libc has incredibly messy way of doing this,
 		 * typically requiring -lrt. We just skip all this mess */
 		syscall(__NR_clock_gettime, CLOCK_REALTIME, &ts);
-#else
+# else
+		clock_gettime(CLOCK_REALTIME, &ts);
+# endif
 		time(&ts.tv_sec);
 #endif
 	}
diff -Naur busybox-1.31.1-orig/coreutils/du.c busybox-1.31.1/coreutils/du.c
--- busybox-1.31.1-orig/coreutils/du.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/coreutils/du.c	2020-04-29 20:15:37.413377400 +0300
@@ -172,6 +172,10 @@
 		}
 	}
 
+	if (DEV_BSIZE > 512) {
+		sum *= DEV_BSIZE / 512;
+	}
+
 	if (!(option_mask32 & OPT_l_hardlinks)
 	 && statbuf.st_nlink > 1
 	) {
diff -Naur busybox-1.31.1-orig/coreutils/ls.c busybox-1.31.1/coreutils/ls.c
--- busybox-1.31.1-orig/coreutils/ls.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/coreutils/ls.c	2020-04-29 20:15:37.980872400 +0300
@@ -742,6 +742,9 @@
 #endif
 	cur->dn_ino    = statbuf.st_ino   ;
 	cur->dn_blocks = statbuf.st_blocks;
+	if (DEV_BSIZE > 512) {
+		cur->dn_blocks *= DEV_BSIZE / 512;
+	}
 	cur->dn_nlink  = statbuf.st_nlink ;
 	cur->dn_uid    = statbuf.st_uid   ;
 	cur->dn_gid    = statbuf.st_gid   ;
diff -Naur busybox-1.31.1-orig/coreutils/stat.c busybox-1.31.1/coreutils/stat.c
--- busybox-1.31.1-orig/coreutils/stat.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/coreutils/stat.c	2020-04-29 20:15:38.559936200 +0300
@@ -376,7 +376,7 @@
 		printf(pformat, (unsigned long long) statbuf->st_size);
 	} else if (m == 'B') {
 		strcat(pformat, "lu");
-		printf(pformat, (unsigned long) 512); //ST_NBLOCKSIZE
+		printf(pformat, (unsigned long) DEV_BSIZE);
 	} else if (m == 'b') {
 		strcat(pformat, "llu");
 		printf(pformat, (unsigned long long) statbuf->st_blocks);
diff -Naur busybox-1.31.1-orig/include/libbb.h busybox-1.31.1/include/libbb.h
--- busybox-1.31.1-orig/include/libbb.h	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/include/libbb.h	2020-04-29 20:15:39.688914800 +0300
@@ -12,6 +12,20 @@
 
 #include "platform.h"
 
+#ifdef HAVE_INCOMPATIBLE_ITOA
+/* Hide itoa(int, char *, int) */
+# define itoa do_not_use_itoa
+/* Hide utoa(unsigned, char *, int) */
+# define utoa do_not_use_utoa
+#endif
+#include <stdlib.h>
+#ifdef HAVE_INCOMPATIBLE_ITOA
+# undef itoa
+# undef utoa
+# define itoa bb_itoa
+# define utoa bb_utoa
+#endif
+
 #include <ctype.h>
 #include <dirent.h>
 #include <errno.h>
@@ -27,9 +41,11 @@
 # define sigemptyset(s)   __sigemptyset(s)
 # define sigisemptyset(s) __sigisemptyset(s)
 #endif
+#ifdef __CYGWIN__
+# define sigisemptyset(s)  (!*(s))
+#endif
 #include <stdint.h>
 #include <stdio.h>
-#include <stdlib.h>
 #include <stdarg.h>
 #include <stddef.h>
 #include <string.h>
@@ -53,6 +69,13 @@
 #include <termios.h>
 #include <time.h>
 #include <sys/param.h>
+#ifndef DEV_BSIZE
+# ifdef S_BLKSIZE
+#  define DEV_BSIZE S_BLKSIZE
+# else
+#  define DEV_BSIZE 512
+# endif
+#endif
 #include <pwd.h>
 #include <grp.h>
 #if ENABLE_FEATURE_SHADOWPASSWDS
@@ -79,6 +102,9 @@
  * of struct sysinfo (only in some toolchanins), which breaks build.
  * Include sys/sysinfo.h only in those files which need it.
  */
+#ifdef __CYGWIN__
+#include <sys/sysinfo.h>
+#endif
 #if ENABLE_SELINUX
 # include <selinux/selinux.h>
 # include <selinux/context.h>
@@ -134,7 +160,7 @@
 #ifndef _PATH_GSHADOW
 #define _PATH_GSHADOW "/etc/gshadow"
 #endif
-#if defined __FreeBSD__ || defined __OpenBSD__
+#if defined __FreeBSD__ || defined __OpenBSD__ || defined __CYGWIN__
 # include <netinet/in.h>
 # include <arpa/inet.h>
 #elif defined __APPLE__
diff -Naur busybox-1.31.1-orig/include/platform.h busybox-1.31.1/include/platform.h
--- busybox-1.31.1-orig/include/platform.h	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/include/platform.h	2020-04-29 20:31:57.357589600 +0300
@@ -376,7 +390,15 @@
 #endif
 
 #if defined(__CYGWIN__)
+# define GETADDRINFO_IGNORES_RESOLV_SERVER
+# define HAVE_INCOMPATIBLE_ITOA 1
+# define KERNEL_HZ_EQUAL_SC_CLK_TCK
+# define KEYBOARD_ESC_POLL_TIMEOUT 600  /* Windows console requires longer timeout. */
+# define MAN_FORMATTING_COMMAND "tbl | nroff -Tascii -mandoc 2>&1"
 # define MAXSYMLINKS SYMLOOP_MAX
+# define NO_ROOT_UID_CHECK
+# define NO_SOCKOPT_IP_MULTICAST_IF
+# define TRACEROUTE_ONE_SOCKET_ONLY
 #endif
 
 #if defined(ANDROID) || defined(__ANDROID__)
@@ -394,11 +416,14 @@
 #define HAVE_CLEARENV 1
 #define HAVE_FDATASYNC 1
 #define HAVE_DPRINTF 1
+#define HAVE_IN_PKTINFO_IPI_SPEC_DST 1 /* struct in_pktinfo.ipi_spec_dst */
 #define HAVE_MEMRCHR 1
 #define HAVE_MKDTEMP 1
 #define HAVE_TTYNAME_R 1
 #define HAVE_PTSNAME_R 1
+#define HAVE_RES_STATE_U_EXT_NSADDRS 1 /* resolv.h: _res._u._ext.nsaddrs */
 #define HAVE_SETBIT 1
+#define HAVE_SETHOSTNAME 1
 #define HAVE_SIGHANDLER_T 1
 #define HAVE_STPCPY 1
 #define HAVE_MEMPCPY 1
@@ -407,6 +432,7 @@
 #define HAVE_STRSEP 1
 #define HAVE_STRSIGNAL 1
 #define HAVE_STRVERSCMP 1
+#define HAVE_SYS_SYSCALL_H 1
 #define HAVE_VASPRINTF 1
 #define HAVE_USLEEP 1
 #define HAVE_UNLOCKED_STDIO 1
@@ -415,6 +441,9 @@
 #define HAVE_XTABS 1
 #define HAVE_MNTENT_H 1
 #define HAVE_NET_ETHERNET_H 1
+#define HAVE_STRUCT_ICMP
+#define HAVE_NETINET_ICMP6_H
+#define HAVE_STRUCT_IPHDR
 #define HAVE_SYS_STATFS_H 1
 #define HAVE_PRINTF_PERCENTM 1
 
@@ -450,9 +479,14 @@
 #if defined(__CYGWIN__)
 # undef HAVE_CLEARENV
 # undef HAVE_FDPRINTF
-# undef HAVE_MEMRCHR
-# undef HAVE_PTSNAME_R
+# undef HAVE_IN_PKTINFO_IPI_SPEC_DST
+# undef HAVE_SETHOSTNAME
 # undef HAVE_STRVERSCMP
+# undef HAVE_RES_STATE_U_EXT_NSADDRS
+# undef HAVE_STRUCT_ICMP
+# undef HAVE_NETINET_ICMP6_H
+# undef HAVE_STRUCT_IPHDR
+# undef HAVE_SYS_SYSCALL_H
 # undef HAVE_UNLOCKED_LINE_OPS
 #endif
 
diff -Naur busybox-1.31.1-orig/libbb/in_ether.c busybox-1.31.1/libbb/in_ether.c
--- busybox-1.31.1-orig/libbb/in_ether.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/libbb/in_ether.c	2020-04-29 19:28:33.325849100 +0300
@@ -10,6 +10,11 @@
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 
+/* Octets in one Ethernet addr, from <linux/if_ether.h> */
+#ifndef ETH_ALEN
+#define ETH_ALEN     6
+#endif
+
 /* Convert Ethernet address from "XX[:]XX[:]XX[:]XX[:]XX[:]XX" to sockaddr.
  * Return nonzero on error.
  */
diff -Naur busybox-1.31.1-orig/libbb/read_key.c busybox-1.31.1/libbb/read_key.c
--- busybox-1.31.1-orig/libbb/read_key.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/libbb/read_key.c	2020-04-29 20:15:41.665639600 +0300
@@ -9,6 +9,10 @@
  */
 #include "libbb.h"
 
+#ifndef KEYBOARD_ESC_POLL_TIMEOUT
+# define KEYBOARD_ESC_POLL_TIMEOUT 50
+#endif
+
 int64_t FAST_FUNC read_key(int fd, char *buffer, int timeout)
 {
 	struct pollfd pfd;
@@ -170,7 +174,7 @@
 				 * so if we block for long it's not really an escape sequence.
 				 * Timeout is needed to reconnect escape sequences
 				 * split up by transmission over a serial console. */
-				if (safe_poll(&pfd, 1, 50) == 0) {
+				if (safe_poll(&pfd, 1, KEYBOARD_ESC_POLL_TIMEOUT) == 0) {
 					/* No more data!
 					 * Array is sorted from shortest to longest,
 					 * we can't match anything later in array -
diff -Naur busybox-1.31.1-orig/libbb/udp_io.c busybox-1.31.1/libbb/udp_io.c
--- busybox-1.31.1-orig/libbb/udp_io.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/libbb/udp_io.c	2020-04-29 20:15:42.227240900 +0300
@@ -8,10 +8,20 @@
  */
 #include "libbb.h"
 
+#ifndef HAVE_IN_PKTINFO_IPI_SPEC_DST
+# undef IP_PKTINFO
+# undef IP6_PKTINFO
+#endif
+
 #if defined(IPV6_PKTINFO) && !defined(IPV6_RECVPKTINFO)
 # define IPV6_RECVPKTINFO IPV6_PKTINFO
 #endif
 
+#ifndef HAVE_IN_PKTINFO_IPI_SPEC_DST
+# undef IP_PKTINFO
+# undef IP6_PKTINFO
+#endif
+
 /*
  * This asks kernel to let us know dst addr/port of incoming packets
  * We don't check for errors here. Not supported == won't be used
diff -Naur busybox-1.31.1-orig/networking/hostname.c busybox-1.31.1/networking/hostname.c
--- busybox-1.31.1-orig/networking/hostname.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/networking/hostname.c	2020-04-29 20:15:43.648288100 +0300
@@ -49,6 +49,7 @@
 
 static void do_sethostname(char *s, int isfile)
 {
+#ifdef HAVE_SETHOSTNAME
 //	if (!s)
 //		return;
 	if (isfile) {
@@ -63,6 +64,11 @@
 //			bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
 		bb_perror_msg_and_die("sethostname");
 	}
+#else
+	(void)s; (void)isfile;
+	errno = ENOSYS;
+	bb_perror_msg_and_die("sethostname");
+#endif
 }
 
 /* Manpage circa 2009:
diff -Naur busybox-1.31.1-orig/networking/ip_icmp_missing.h busybox-1.31.1/networking/ip_icmp_missing.h
--- busybox-1.31.1-orig/networking/ip_icmp_missing.h	1970-01-01 03:00:00.000000000 +0300
+++ busybox-1.31.1/networking/ip_icmp_missing.h	2020-04-29 20:15:44.220769300 +0300
@@ -0,0 +1,162 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Declarations from <netinet/ip.h>, <netinet/ip_icmp.h>, <netinet/ip_icmp6.h>
+ * missing on some platforms (Bionic, Cygwin)
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ */
+
+#ifndef IP_ICMP_MISSING_H
+#define IP_ICMP_MISSING_H
+#ifndef LIBBB_H
+# error libbbb.h must be included first
+#endif
+
+
+// <netinet/ip.h>
+
+#ifndef HAVE_STRUCT_IPHDR
+
+struct iphdr {
+	unsigned ihl:4;
+	unsigned version:4;
+	uint8_t  tos;
+	uint16_t tot_len;
+	uint16_t id;
+	uint16_t frag_off;
+	uint8_t  ttl;
+	uint8_t  protocol;
+	uint16_t check;
+	uint32_t saddr;
+	uint32_t daddr;
+};
+
+#endif // HAVE_STRUCT_IPHDR
+
+#ifndef MAX_IPOPTLEN
+# define MAX_IPOPTLEN   40
+#endif
+
+// <netinet/ip_icmp.h>
+
+#ifndef ICMP_ECHOREPLY     // __CYGWIN__
+# define ICMP_ECHOREPLY       0
+#endif
+#ifndef ICMP_DEST_UNREACH  // __BIONIC__ || __CYGWIN
+# define ICMP_DEST_UNREACH    3
+# define ICMP_SOURCE_QUENCH   4
+# define ICMP_REDIRECT        5
+# define ICMP_ECHO            8
+# define ICMP_TIME_EXCEEDED  11
+# define ICMP_PARAMETERPROB  12
+# define ICMP_TIMESTAMP      13
+# define ICMP_TIMESTAMPREPLY 14
+# define ICMP_INFO_REQUEST   15
+# define ICMP_INFO_REPLY     16
+# define ICMP_ADDRESS        17
+# define ICMP_ADDRESSREPLY   18
+#endif
+
+#ifndef ICMP_MINLEN
+# define ICMP_MINLEN          8
+#endif
+
+#ifndef ICMP_UNREACH
+# define ICMP_UNREACH         3
+# define ICMP_TIMXCEED       11
+
+# define ICMP_UNREACH_NET                0
+# define ICMP_UNREACH_HOST               1
+# define ICMP_UNREACH_PROTOCOL           2
+# define ICMP_UNREACH_PORT               3
+# define ICMP_UNREACH_NEEDFRAG           4
+# define ICMP_UNREACH_SRCFAIL            5
+# define ICMP_UNREACH_NET_UNKNOWN        6
+# define ICMP_UNREACH_HOST_UNKNOWN       7
+# define ICMP_UNREACH_ISOLATED           8
+# define ICMP_UNREACH_NET_PROHIB         9
+# define ICMP_UNREACH_HOST_PROHIB        10
+# define ICMP_UNREACH_TOSNET             11
+# define ICMP_UNREACH_TOSHOST            12
+# define ICMP_UNREACH_FILTER_PROHIB      13
+# define ICMP_UNREACH_HOST_PRECEDENCE    14
+# define ICMP_UNREACH_PRECEDENCE_CUTOFF  15
+
+# define ICMP_TIMXCEED_INTRANS  0
+# define ICMP_TIMXCEED_REASS    1
+#endif
+
+#ifndef HAVE_STRUCT_ICMP
+
+struct icmp {
+	uint8_t  icmp_type;
+	uint8_t  icmp_code;
+	uint16_t icmp_cksum;
+	union {
+		struct ih_idseq {
+			uint16_t icd_id;
+			uint16_t icd_seq;
+		} ih_idseq;
+		struct ih_pmtu {
+			uint16_t ipm_void;
+			uint16_t ipm_nextmtu;
+		} ih_pmtu;
+	} icmp_hun;
+# define icmp_id      icmp_hun.ih_idseq.icd_id
+# define icmp_seq     icmp_hun.ih_idseq.icd_seq
+# define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
+	union {
+		uint32_t _unused[3];
+		struct id_ip {
+			struct ip idi_ip;
+		} id_ip;
+		uint8_t id_data[1];
+	} icmp_dun;
+# define icmp_ip   icmp_dun.id_ip.idi_ip
+# define icmp_data icmp_dun.id_data
+};
+
+#endif // HAVE_STRUCT_ICMP
+
+// <netinet/ip_icmp6.h>
+
+#ifndef HAVE_NETINET_ICMP6_H
+
+struct icmp6_hdr {
+	uint8_t  icmp6_type;
+	uint8_t  icmp6_code;
+	uint16_t icmp6_cksum;
+	union {
+		uint32_t icmp6_un_data32[1];
+		uint16_t icmp6_un_data16[2];
+		uint8_t  icmp6_un_data8[4];
+	} icmp6_dataun;
+};
+
+#define icmp6_data16    icmp6_dataun.icmp6_un_data16
+#define icmp6_data8     icmp6_dataun.icmp6_un_data8
+#define icmp6_id        icmp6_data16[0]
+#define icmp6_seq       icmp6_data16[1]
+
+#define ICMP6_DST_UNREACH           1
+#define ICMP6_PACKET_TOO_BIG        2
+#define ICMP6_TIME_EXCEEDED         3
+#define ICMP6_PARAM_PROB            4
+
+#define ICMP6_ECHO_REQUEST        128
+#define ICMP6_ECHO_REPLY          129
+#define MLD_LISTENER_QUERY        130
+#define MLD_LISTENER_REPORT       131
+#define MLD_LISTENER_REDUCTION    132
+
+#define ICMP6_DST_UNREACH_NOROUTE   0
+#define ICMP6_DST_UNREACH_ADMIN     1
+#define ICMP6_DST_UNREACH_ADDR      3
+#define ICMP6_DST_UNREACH_NOPORT    4
+#define ICMP6_TIME_EXCEED_TRANSIT   0
+
+#define ND_REDIRECT               137
+
+#endif // HAVE_NETINET_ICMP6_H
+
+#endif // IP_ICMP_MISSING_H
diff -Naur busybox-1.31.1-orig/networking/nslookup.c busybox-1.31.1/networking/nslookup.c
--- busybox-1.31.1-orig/networking/nslookup.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/networking/nslookup.c	2020-04-29 20:15:44.514947800 +0300
@@ -147,16 +147,27 @@
 	char *server;
 	struct sockaddr *sa;
 
-#if ENABLE_FEATURE_IPV6
+#if ENABLE_FEATURE_IPV6 && defined(HAVE_RES_STATE_U_EXT_NSADDRS)
 	sa = (struct sockaddr*)_res._u._ext.nsaddrs[0];
 	if (!sa)
 #endif
-		sa = (struct sockaddr*)&_res.nsaddr_list[0];
+		sa = (_res.nscount > 0 ? (struct sockaddr*)&_res.nsaddr_list[0] : NULL);
+
+	if (!sa) {
+		printf("Server: [unknown]\n\n");
+		return;
+	}
+
 	server = xmalloc_sockaddr2dotted_noport(sa);
 
 	print_host(server, "Server:");
 	if (ENABLE_FEATURE_CLEAN_UP)
 		free(server);
+
+#ifdef GETADDRINFO_IGNORES_RESOLV_SERVER
+	bb_error_msg("warning: this server config is possibly ignored");
+#endif
+
 	bb_putchar('\n');
 }
 
@@ -177,7 +188,7 @@
 		/* struct copy */
 		_res.nsaddr_list[0] = lsa->u.sin;
 	}
-#if ENABLE_FEATURE_IPV6
+#if ENABLE_FEATURE_IPV6 && defined(HAVE_RES_STATE_U_EXT_NSADDRS)
 	/* Hoped libc can cope with IPv4 address there too.
 	 * No such luck, glibc 2.4 segfaults even with IPv6,
 	 * maybe I misunderstand how to make glibc use IPv6 addr?
diff -Naur busybox-1.31.1-orig/networking/ping.c busybox-1.31.1/networking/ping.c
--- busybox-1.31.1-orig/networking/ping.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/networking/ping.c	2020-04-29 20:25:06.178811400 +0300
@@ -119,25 +119,11 @@
 //usage:       "round-trip min/avg/max = 20.1/20.1/20.1 ms\n"
 
 #include <net/if.h>
+#include <netinet/ip.h>
 #include <netinet/ip_icmp.h>
 #include "libbb.h"
 #include "common_bufsiz.h"
-
-#ifdef __BIONIC__
-/* should be in netinet/ip_icmp.h */
-# define ICMP_DEST_UNREACH    3  /* Destination Unreachable  */
-# define ICMP_SOURCE_QUENCH   4  /* Source Quench    */
-# define ICMP_REDIRECT        5  /* Redirect (change route)  */
-# define ICMP_ECHO            8  /* Echo Request      */
-# define ICMP_TIME_EXCEEDED  11  /* Time Exceeded    */
-# define ICMP_PARAMETERPROB  12  /* Parameter Problem    */
-# define ICMP_TIMESTAMP      13  /* Timestamp Request    */
-# define ICMP_TIMESTAMPREPLY 14  /* Timestamp Reply    */
-# define ICMP_INFO_REQUEST   15  /* Information Request    */
-# define ICMP_INFO_REPLY     16  /* Information Reply    */
-# define ICMP_ADDRESS        17  /* Address Mask Request    */
-# define ICMP_ADDRESSREPLY   18  /* Address Mask Reply    */
-#endif
+#include "ip_icmp_missing.h"
 
 /* Some operating systems, like GNU/Hurd, don't define SOL_RAW, but do have
  * IPPROTO_RAW. Since the IPPROTO definitions are also valid to use for
@@ -148,6 +134,7 @@
 #endif
 
 #if ENABLE_PING6
+#ifdef HAVE_NETINET_ICMP6_H
 # include <netinet/icmp6.h>
 /* I see RENUMBERED constants in bits/in.h - !!?
  * What a fuck is going on with libc? Is it a glibc joke? */
@@ -156,6 +143,7 @@
 #  define IPV6_HOPLIMIT IPV6_2292HOPLIMIT
 # endif
 #endif
+#endif
 
 enum {
 	DEFDATALEN = 56,
@@ -721,9 +709,11 @@
 
 	pingaddr.sin = lsa->u.sin;
 	if (source_lsa) {
+#ifndef NO_SOCKOPT_IP_MULTICAST_IF
 		if (setsockopt(pingsock, IPPROTO_IP, IP_MULTICAST_IF,
 				&source_lsa->u.sa, source_lsa->len))
 			bb_error_msg_and_die("can't set multicast source interface");
+#endif
 		xbind(pingsock, &source_lsa->u.sa, source_lsa->len);
 	}
 
diff -Naur busybox-1.31.1-orig/networking/traceroute.c busybox-1.31.1/networking/traceroute.c
--- busybox-1.31.1-orig/networking/traceroute.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/networking/traceroute.c	2020-04-29 20:22:25.481038700 +0300
@@ -305,7 +305,7 @@
 #include <netinet/udp.h>
 #include <netinet/ip.h>
 #include <netinet/ip_icmp.h>
-#if ENABLE_FEATURE_IPV6
+#if ENABLE_TRACEROUTE6
 # include <netinet/ip6.h>
 # include <netinet/icmp6.h>
 # ifndef SOL_IPV6
@@ -317,6 +317,7 @@
 #endif
 
 #include "libbb.h"
+#include "ip_icmp_missing.h"
 #include "inet_common.h"
 
 #ifndef IPPROTO_ICMP
@@ -334,6 +335,11 @@
 # define SOL_RAW IPPROTO_RAW
 #endif
 
+#ifdef TRACEROUTE_ONE_SOCKET_ONLY
+# if !(ENABLE_FEATURE_TRACEROUTE_USE_ICMP && !ENABLE_TRACEROUTE6)
+#  error (FEATURE_TRACEROUTE_USE_ICMP && !TRACEROUTE6) is required on this platform
+# endif
+#endif
 
 #define OPT_STRING \
 	"FIlnrdvxt:i:m:p:q:s:w:z:f:" \
@@ -364,7 +370,11 @@
 enum {
 	SIZEOF_ICMP_HDR = 8,
 	rcvsock = 3, /* receive (icmp) socket file descriptor */
+#ifndef TRACEROUTE_ONE_SOCKET_ONLY
 	sndsock = 4, /* send (udp/icmp) socket file descriptor */
+#else
+	sndsock = rcvsock, /* use one (icmp) socket file descriptor */
+#endif
 };
 
 /* Data section of the probe packet */
@@ -604,7 +614,6 @@
 	 || type == ICMP_ECHOREPLY
 	) {
 		const struct ip *hip;
-		const struct udphdr *up;
 
 		hip = &icp->icmp_ip;
 		hlen = hip->ip_hl << 2;
@@ -627,7 +636,11 @@
 			) {
 				return (type == ICMP_TIMXCEED ? -1 : code + 1);
 			}
-		} else {
+		}
+#ifndef TRACEROUTE_ONE_SOCKET_ONLY
+		else {
+			const struct udphdr *up;
+
 			up = (struct udphdr *)((char *)hip + hlen);
 			if (hlen + 12 <= read_len
 			 && hip->ip_p == IPPROTO_UDP
@@ -640,6 +653,7 @@
 				return (type == ICMP_TIMXCEED ? -1 : code + 1);
 			}
 		}
+#endif
 	}
 #if ENABLE_FEATURE_TRACEROUTE_VERBOSE
 	if (verbose) {
@@ -855,6 +869,12 @@
 	);
 	argv += optind;
 
+#ifdef TRACEROUTE_ONE_SOCKET_ONLY
+	if (op & (OPT_USE_ICMP|OPT_PORT))
+		bb_error_msg("warning: -I and -p have no effect (ICMP is always used instead of UDP)");
+	op |= OPT_USE_ICMP;
+	option_mask32 |= OPT_USE_ICMP;
+#endif
 #if 0 /* IGNORED */
 	if (op & OPT_IP_CHKSUM)
 		bb_error_msg("warning: ip checksums disabled");
@@ -869,6 +889,7 @@
 		port = xatou16(port_str);
 	if (op & OPT_NPROBES)
 		nprobes = xatou_range(nprobes_str, 1, INT_MAX);
+#ifndef NO_ROOT_UID_CHECK
 	if (op & OPT_SOURCE) {
 		/*
 		 * set the ip source address of the outbound
@@ -877,6 +898,7 @@
 		if (getuid() != 0)
 			bb_error_msg_and_die(bb_msg_you_must_be_root);
 	}
+#endif
 	if (op & OPT_WAITTIME)
 		waittime = xatou_range(waittime_str, 1, 24 * 60 * 60);
 	if (op & OPT_PAUSE_MS)
@@ -939,10 +961,12 @@
 	} else
 #endif
 	{
+#ifndef TRACEROUTE_ONE_SOCKET_ONLY
 		if (op & OPT_USE_ICMP)
 			xmove_fd(xsocket(AF_INET, SOCK_RAW, IPPROTO_ICMP), sndsock);
 		else
 			xmove_fd(xsocket(AF_INET, SOCK_DGRAM, 0), sndsock);
+#endif
 	}
 
 #ifdef SO_SNDBUF
@@ -1000,10 +1024,12 @@
 		len_and_sockaddr *source_lsa = xdotted2sockaddr(source, 0);
 #endif
 		/* Ping4 does this (why?) */
+#ifndef NO_SOCKOPT_IP_MULTICAST_IF
 		if (af == AF_INET)
 			if (setsockopt(sndsock, IPPROTO_IP, IP_MULTICAST_IF,
 					&source_lsa->u.sa, source_lsa->len))
 				bb_error_msg_and_die("can't set multicast source interface");
+#endif
 //TODO: we can query source port we bound to,
 // and check it in replies... if we care enough
 
diff -Naur busybox-1.31.1-orig/procps/top.c busybox-1.31.1/procps/top.c
--- busybox-1.31.1-orig/procps/top.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/procps/top.c	2020-04-29 20:15:47.071108500 +0300
@@ -324,7 +324,7 @@
 		 */
 		while (1) {
 			cpu_jif = xrealloc_vector(cpu_jif, 1, num_cpus);
-			if (read_cpu_jiffy(fp, &cpu_jif[num_cpus]) <= 4)
+			if (read_cpu_jiffy(fp, &cpu_jif[num_cpus]) < 4)
 				break;
 			num_cpus++;
 		}
diff -Naur busybox-1.31.1-orig/shell/ash.c busybox-1.31.1/shell/ash.c
--- busybox-1.31.1-orig/shell/ash.c	2019-10-21 17:54:40.000000000 +0300
+++ busybox-1.31.1/shell/ash.c	2020-04-29 20:18:17.969474000 +0300
@@ -181,6 +181,9 @@
 #include <sys/times.h>
 #include <sys/utsname.h> /* for setting $HOSTNAME */
 #include "busybox.h" /* for applet_names */
+#ifdef __CYGWIN__
+#include <sys/cygwin.h>
+#endif
 #if ENABLE_FEATURE_SH_EMBEDDED_SCRIPTS
 # include "embedded_scripts.h"
 #else
@@ -2840,9 +2843,23 @@
 	char c;
 	struct stat statb;
 	int flags;
+#ifdef __CYGWIN__
+	char posixpath[PATH_MAX];
+#endif
 
 	flags = cdopt();
 	dest = *argptr;
+
+#ifdef __CYGWIN__
+	if (dest && *dest && dest[1]) {
+		// Convert X:\SOME\DIR -> /cygdrive/x/SOME/DIR
+		if (cygwin_conv_path(CCP_WIN_A_TO_POSIX | CCP_RELATIVE, dest,
+				posixpath, sizeof(posixpath)) < 0)
+			ash_msg_and_raise_error("can't normalize %s", dest);
+		dest = posixpath;
+	}
+#endif
+
 	if (!dest)
 		dest = bltinlookup("HOME");
 	else if (LONE_DASH(dest)) {
diff -Naur busybox-1.31.1-orig/shell/shell_common.c busybox-1.31.1/shell/shell_common.c
--- busybox-1.31.1-orig/shell/shell_common.c	2019-06-10 13:50:53.000000000 +0300
+++ busybox-1.31.1/shell/shell_common.c	2020-04-29 19:28:33.325849100 +0300
@@ -328,6 +328,9 @@
 static const struct limits limits_tbl[] = {
 	{ RLIMIT_CORE,		9,	"core file size (blocks)" }, // -c
 	{ RLIMIT_DATA,		10,	"data seg size (kb)" },      // -d
+#ifndef RLIMIT_NICE
+#define RLIMIT_NICE 13
+#endif
 	{ RLIMIT_NICE,		0,	"scheduling priority" },     // -e
 	{ RLIMIT_FSIZE,		9,	"file size (blocks)" },      // -f
 #define LIMIT_F_IDX     3
