accumulated post-1.4.0 fixes
diff --git a/applets/applets.c b/applets/applets.c
index ebd1ff3..a974743 100644
--- a/applets/applets.c
+++ b/applets/applets.c
@@ -320,7 +320,7 @@
 }
 
 #else
-#define parse_config_file()
+#define parse_config_file() ((void)0)
 #endif /* CONFIG_FEATURE_SUID_CONFIG */
 
 #ifdef CONFIG_FEATURE_SUID
@@ -340,20 +340,26 @@
 		if (sct) {
 			mode_t m = sct->m_mode;
 
-			if (sct->m_uid == ruid)       /* same uid */
+			if (sct->m_uid == ruid)
+				/* same uid */
 				m >>= 6;
-			else if ((sct->m_gid == rgid) || ingroup(ruid, sct->m_gid))  /* same group / in group */
+			else if ((sct->m_gid == rgid) || ingroup(ruid, sct->m_gid))
+				/* same group / in group */
 				m >>= 3;
 
 			if (!(m & S_IXOTH))           /* is x bit not set ? */
 				bb_error_msg_and_die("you have no permission to run this applet!");
 
-			if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {     /* *both* have to be set for sgid */
-				xsetgid(sct->m_gid);
-			} else xsetgid(rgid);                /* no sgid -> drop */
-
-			if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
-			else xsetuid(ruid);                  /* no suid -> drop */
+			if (sct->m_gid != 0) {
+				/* _both_ have to be set for sgid */
+				if ((sct->m_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
+					xsetgid(sct->m_gid);
+				} else xsetgid(rgid); /* no sgid -> drop */
+			}
+			if (sct->m_uid != 0) {
+				if (sct->m_mode & S_ISUID) xsetuid(sct->m_uid);
+				else xsetuid(ruid); /* no suid -> drop */
+			}
 		} else {
 			/* default: drop all privileges */
 			xsetgid(rgid);
diff --git a/archival/tar.c b/archival/tar.c
index 2ba51ad..ca59643 100644
--- a/archival/tar.c
+++ b/archival/tar.c
@@ -23,10 +23,10 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include "busybox.h"
-#include "unarchive.h"
 #include <fnmatch.h>
 #include <getopt.h>
+#include "busybox.h"
+#include "unarchive.h"
 
 #if ENABLE_FEATURE_TAR_CREATE
 
@@ -37,6 +37,7 @@
 /* POSIX tar Header Block, from POSIX 1003.1-1990  */
 #define NAME_SIZE      100
 #define NAME_SIZE_STR "100"
+typedef struct TarHeader TarHeader;
 struct TarHeader {		  /* byte offset */
 	char name[NAME_SIZE];     /*   0-99 */
 	char mode[8];             /* 100-107 */
@@ -56,7 +57,6 @@
 	char prefix[155];         /* 345-499 */
 	char padding[12];         /* 500-512 (pad to exactly the TAR_BLOCK_SIZE) */
 };
-typedef struct TarHeader TarHeader;
 
 /*
 ** writeTarFile(), writeFileToTarball(), and writeTarHeader() are
@@ -73,6 +73,7 @@
 };
 
 /* Some info to be carried along when creating a new tarball */
+typedef struct TarBallInfo TarBallInfo;
 struct TarBallInfo {
 	int tarFd;				/* Open-for-write file descriptor
 							   for the tarball */
@@ -85,7 +86,6 @@
 	HardLinkInfo *hlInfoHead;	/* Hard Link Tracking Information */
 	HardLinkInfo *hlInfo;	/* Hard Link Info for the current file */
 };
-typedef struct TarBallInfo TarBallInfo;
 
 /* A nice enum with all the possible tar file content types */
 enum TarFileType {
@@ -348,7 +348,7 @@
 	return TRUE;
 }
 
-# if ENABLE_FEATURE_TAR_FROM
+#if ENABLE_FEATURE_TAR_FROM
 static int exclude_file(const llist_t *excluded_files, const char *file)
 {
 	while (excluded_files) {
@@ -371,12 +371,12 @@
 
 	return 0;
 }
-# else
+#else
 #define exclude_file(excluded_files, file) 0
-# endif
+#endif
 
 static int writeFileToTarball(const char *fileName, struct stat *statbuf,
-			void *userData, int depth)
+			void *userData, int depth ATTRIBUTE_UNUSED)
 {
 	struct TarBallInfo *tbInfo = (struct TarBallInfo *) userData;
 	const char *header_name;
@@ -509,14 +509,14 @@
 		if (pipe(gzipDataPipe) < 0 || pipe(gzipStatusPipe) < 0)
 			bb_perror_msg_and_die("pipe");
 
-		signal(SIGPIPE, SIG_IGN);	/* we only want EPIPE on errors */
+		signal(SIGPIPE, SIG_IGN); /* we only want EPIPE on errors */
 
-# if __GNUC__
+#if defined(__GNUC__) && __GNUC__
 		/* Avoid vfork clobbering */
 		(void) &include;
 		(void) &errorFlag;
 		(void) &zip_exec;
-# endif
+#endif
 
 		gzipPid = vfork();
 
@@ -600,7 +600,7 @@
 int writeTarFile(const int tar_fd, const int verboseFlag,
 	const unsigned long dereferenceFlag, const llist_t *include,
 	const llist_t *exclude, const int gzip);
-#endif	/* tar_create */
+#endif /* FEATURE_TAR_CREATE */
 
 #if ENABLE_FEATURE_TAR_FROM
 static llist_t *append_file_list_to_list(llist_t *list)
@@ -628,7 +628,7 @@
 	return newlist;
 }
 #else
-#define append_file_list_to_list(x)	0
+#define append_file_list_to_list(x) 0
 #endif
 
 #if ENABLE_FEATURE_TAR_COMPRESS
@@ -653,7 +653,7 @@
 	return EXIT_FAILURE;
 }
 #else
-#define get_header_tar_Z	0
+#define get_header_tar_Z NULL
 #endif
 
 #ifdef CHECK_FOR_CHILD_EXITCODE
diff --git a/libbb/vdprintf.c b/libbb/vdprintf.c
index ea2a9d4..d16c519 100644
--- a/libbb/vdprintf.c
+++ b/libbb/vdprintf.c
@@ -7,12 +7,8 @@
  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
  */
 
-#include <stdio.h>
-#include <unistd.h>
 #include "libbb.h"
 
-
-
 #if defined(__GLIBC__) && __GLIBC__ < 2
 int vdprintf(int d, const char *format, va_list ap)
 {
diff --git a/libbb/xfuncs.c b/libbb/xfuncs.c
index 4252e76..f6b904f 100644
--- a/libbb/xfuncs.c
+++ b/libbb/xfuncs.c
@@ -81,13 +81,14 @@
 	t = (char*) s;
 	while (m) {
 		if (!*t) break;
-		m--; t++;
+		m--;
+		t++;
 	}
-	n = n - m;
+	n -= m;
 	t = xmalloc(n + 1);
 	t[n] = '\0';
 
-	return memcpy(t,s,n);
+	return memcpy(t, s, n);
 }
 
 // Die if we can't open a file and return a FILE * to it.
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c
index 76f52ca..fb67cde 100644
--- a/libbb/xreadlink.c
+++ b/libbb/xreadlink.c
@@ -36,7 +36,7 @@
 
 char *xmalloc_realpath(const char *path)
 {
-#ifdef __GLIBC__
+#if defined(__GLIBC__) && !defined(__UCLIBC__)
 	/* glibc provides a non-standard extension */
 	return realpath(path, NULL);
 #else
diff --git a/networking/libiproute/libnetlink.h b/networking/libiproute/libnetlink.h
index 6dd242d..9a5a9d3 100644
--- a/networking/libiproute/libnetlink.h
+++ b/networking/libiproute/libnetlink.h
@@ -2,6 +2,9 @@
 #ifndef __LIBNETLINK_H__
 #define __LIBNETLINK_H__ 1
 
+#include <linux/types.h>
+/* We need linux/types.h because older kernels use __u32 etc
+ * in linux/[rt]netlink.h. 2.6.19 seems to be ok, though */
 #include <linux/netlink.h>
 #include <linux/rtnetlink.h>
 
@@ -37,6 +40,4 @@
 
 extern int parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
 
-
 #endif /* __LIBNETLINK_H__ */
-
diff --git a/networking/ping6.c b/networking/ping6.c
index b95e098..c691fa7 100644
--- a/networking/ping6.c
+++ b/networking/ping6.c
@@ -42,6 +42,8 @@
 	PINGINTERVAL = 1		/* second */
 };
 
+static const char *hostname;
+
 static void ping(const char *host);
 
 #ifndef CONFIG_FEATURE_FANCY_PING6
@@ -50,7 +52,7 @@
 
 static void noresp(int ign)
 {
-	printf("No response from %s\n", h->h_name);
+	printf("No response from %s\n", hostname);
 	exit(EXIT_FAILURE);
 }
 
@@ -63,6 +65,8 @@
 	int sockopt;
 	char packet[DEFDATALEN + MAXIPLEN + MAXICMPLEN];
 
+	hostname = host;
+
 	pingsock = create_icmp6_socket();
 
 	lsa = host_and_af2sockaddr(host, 0, AF_INET6);
@@ -105,7 +109,7 @@
 	}
 	if (ENABLE_FEATURE_CLEAN_UP)
 		close(pingsock);
-	printf("%s is alive!\n", h->h_name);
+	printf("%s is alive!\n", hostname);
 }
 
 int ping6_main(int argc, char **argv)
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 716e41f..dca488e 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -569,7 +569,7 @@
 	//if (option_mask32 & OPT_locallog) // -L
 #endif
 #if ENABLE_FEATURE_IPC_SYSLOG
-	if ((option_mask32 & OPT_circularlog) && opt_C) // -C
+	if (opt_C) // -Cn
 		shm_size = xatoul_range(opt_C, 4, INT_MAX/1024) * 1024;
 #endif
 
@@ -588,7 +588,7 @@
 #ifdef BB_NOMMU
 		vfork_daemon_rexec(0, 1, argc, argv, "-n");
 #else
-		xdaemon(0, 1);
+		bb_daemonize();
 #endif
 	}
 	umask(0);