Apply post-1.10.2 fixes, bump version to 1.10.3

diff --git a/Makefile b/Makefile
index 4feab0e..be843fc 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 1
 PATCHLEVEL = 10
-SUBLEVEL = 2
+SUBLEVEL = 3
 EXTRAVERSION =
 NAME = Unnamed
 
diff --git a/libbb/udp_io.c b/libbb/udp_io.c
index e968ecb..bde4d77 100644
--- a/libbb/udp_io.c
+++ b/libbb/udp_io.c
@@ -36,11 +36,12 @@
 #else
 	struct iovec iov[1];
 	struct msghdr msg;
-	char cbuf[sizeof(struct in_pktinfo)
+	union {
+		char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))];
 #if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
-		| sizeof(struct in6_pktinfo) /* (a|b) is poor man's max(a,b) */
+		char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
 #endif
-	];
+	} u;
 	struct cmsghdr* cmsgptr;
 
 	if (from->sa_family != AF_INET
@@ -57,15 +58,15 @@
 	iov[0].iov_base = buf;
 	iov[0].iov_len = len;
 
-	memset(cbuf, 0, sizeof(cbuf));
+	memset(&u, 0, sizeof(u));
 
 	memset(&msg, 0, sizeof(msg));
 	msg.msg_name = (void *)(struct sockaddr *)to; /* or compiler will annoy us */
 	msg.msg_namelen = tolen;
 	msg.msg_iov = iov;
 	msg.msg_iovlen = 1;
-	msg.msg_control = cbuf;
-	msg.msg_controllen = sizeof(cbuf);
+	msg.msg_control = &u;
+	msg.msg_controllen = sizeof(u);
 	msg.msg_flags = flags;
 
 	cmsgptr = CMSG_FIRSTHDR(&msg);
@@ -89,6 +90,8 @@
 		pktptr->ipi6_addr = ((struct sockaddr_in6*)from)->sin6_addr;
 	}
 #endif
+	msg.msg_controllen = cmsgptr->cmsg_len;
+
 	return sendmsg(fd, &msg, flags);
 #endif
 }
@@ -109,7 +112,9 @@
 	struct iovec iov[1];
 	union {
 		char cmsg[CMSG_SPACE(sizeof(struct in_pktinfo))];
+#if ENABLE_FEATURE_IPV6 && defined(IPV6_PKTINFO)
 		char cmsg6[CMSG_SPACE(sizeof(struct in6_pktinfo))];
+#endif
 	} u;
 	struct cmsghdr *cmsgptr;
 	struct msghdr msg;
diff --git a/networking/dnsd.c b/networking/dnsd.c
index cb62d20..97ba2dc 100644
--- a/networking/dnsd.c
+++ b/networking/dnsd.c
@@ -194,7 +194,8 @@
 			for (i = 1; i <= (int)(d->name[0]); i++)
 				if (tolower(qs[i]) != d->name[i])
 					break;
-			if (i > (int)(d->name[0])) {
+			if (i > (int)(d->name[0]) ||
+			    (d->name[0] == 1 && d->name[1] == '*')) {
 				strcpy((char *)as, d->ip);
 #if DEBUG
 				fprintf(stderr, " OK as:%s\n", as);
@@ -202,7 +203,8 @@
 				return 0;
 			}
 		} else if (type == REQ_PTR) { /* search by IP-address */
-			if (!strncmp((char*)&d->rip[1], (char*)&qs[1], strlen(d->rip)-1)) {
+			if ((d->name[0] != 1 || d->name[1] != '*') &&
+			    !strncmp((char*)&d->rip[1], (char*)&qs[1], strlen(d->rip)-1)) {
 				strcpy((char *)as, d->name);
 				return 0;
 			}
@@ -401,7 +403,7 @@
 		r = process_packet(buf);
 		if (r <= 0)
 			continue;
-		send_to_from(udps, buf, r, 0, &to->u.sa, &from->u.sa, lsa->len);
+		send_to_from(udps, buf, r, 0, &from->u.sa, &to->u.sa, lsa->len);
 	}
 	return 0;
 }
diff --git a/networking/interface.c b/networking/interface.c
index 44bd8d3..cdd31da 100644
--- a/networking/interface.c
+++ b/networking/interface.c
@@ -223,7 +223,7 @@
 	char *pos;
 	unsigned int i;
 
-	if (!buff);
+	if (!buff)
 		buff = xmalloc(sizeof(struct sockaddr) * 3 + 1);
 	pos = buff;
 	for (i = 0; i < sizeof(struct sockaddr); i++) {
diff --git a/networking/isrv_identd.c b/networking/isrv_identd.c
index d60c9fb..a96ac60 100644
--- a/networking/isrv_identd.c
+++ b/networking/isrv_identd.c
@@ -113,7 +113,7 @@
 		strncpy(bogouser, argv[optind], sizeof(bogouser));
 
 	/* Daemonize if no -f and no -i and no -w */
-	if (!(opt & OPT_fiw));
+	if (!(opt & OPT_fiw))
 		bb_daemonize_or_rexec(0, argv);
 
 	/* Where to log in inetd modes? "Classic" inetd
diff --git a/networking/libiproute/ip_parse_common_args.c b/networking/libiproute/ip_parse_common_args.c
index 294bde5..5e4012b 100644
--- a/networking/libiproute/ip_parse_common_args.c
+++ b/networking/libiproute/ip_parse_common_args.c
@@ -54,7 +54,7 @@
 				break;
 			}
 		}
-		arg = index_in_strings(ip_common_commands, opt);
+		arg = index_in_substrings(ip_common_commands, opt);
 		if (arg < 0)
 			bb_show_usage();
 		if (arg == ARG_oneline) {
diff --git a/procps/fuser.c b/procps/fuser.c
index fd876d5..55f7917 100644
--- a/procps/fuser.c
+++ b/procps/fuser.c
@@ -208,6 +208,7 @@
 	return plist;
 }
 
+/* NB: does chdir internally */
 static pid_list *scan_proc_pids(inode_list *ilist)
 {
 	DIR *d;
@@ -215,7 +216,8 @@
 	pid_t pid;
 	pid_list *plist;
 
-	d = opendir(".");
+	xchdir("/proc");
+	d = opendir("/proc");
 	if (!d)
 		return NULL;
 
@@ -329,7 +331,7 @@
 		pp++;
 	}
 
-	plist = scan_proc_pids(ilist);
+	plist = scan_proc_pids(ilist); /* changes dir to "/proc" */
 
 	if (!plist)
 		return EXIT_FAILURE;
diff --git a/shell/hush.c b/shell/hush.c
index 4e6d500..dcaeed0 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -699,9 +699,18 @@
 	BLTIN(NULL, NULL, NULL)
 };
 
+/* Signals are grouped, we handle them in batches */
+static void set_misc_sighandler(void (*handler)(int))
+{
+	bb_signals(0
+		+ (1 << SIGINT)
+		+ (1 << SIGQUIT)
+		+ (1 << SIGTERM)
+		, handler);
+}
+
 #if ENABLE_HUSH_JOB
 
-/* Signals are grouped, we handle them in batches */
 static void set_fatal_sighandler(void (*handler)(int))
 {
 	bb_signals(0
@@ -725,14 +734,6 @@
 		+ (1 << SIGTTOU)
 		, handler);
 }
-static void set_misc_sighandler(void (*handler)(int))
-{
-	bb_signals(0
-		+ (1 << SIGINT)
-		+ (1 << SIGQUIT)
-		+ (1 << SIGTERM)
-		, handler);
-}
 /* SIGCHLD is special and handled separately */
 
 static void set_every_sighandler(void (*handler)(int))
@@ -815,7 +816,6 @@
 
 #define set_fatal_sighandler(handler)   ((void)0)
 #define set_jobctrl_sighandler(handler) ((void)0)
-#define set_misc_sighandler(handler)    ((void)0)
 #define hush_exit(e)                    exit(e)
 
 #endif /* JOB */
@@ -3907,8 +3907,10 @@
 				/* give up */
 				interactive_fd = 0;
 		}
-		if (interactive_fd)
+		if (interactive_fd) {
 			fcntl(interactive_fd, F_SETFD, FD_CLOEXEC);
+			set_misc_sighandler(SIG_IGN);
+		}
 	}
 #endif
 
diff --git a/sysklogd/syslogd.c b/sysklogd/syslogd.c
index 371b558..5f3ac2c 100644
--- a/sysklogd/syslogd.c
+++ b/sysklogd/syslogd.c
@@ -347,10 +347,11 @@
 				sprintf(newFile, "%s.%d", G.logFilePath, i);
 				if (i == 0) break;
 				sprintf(oldFile, "%s.%d", G.logFilePath, --i);
-				xrename(oldFile, newFile);
+				/* ignore errors - file might be missing */
+				rename(oldFile, newFile);
 			}
 			/* newFile == "f.0" now */
-			xrename(G.logFilePath, newFile);
+			rename(G.logFilePath, newFile);
 			fl.l_type = F_UNLCK;
 			fcntl(G.logFD, F_SETLKW, &fl);
 			close(G.logFD);
diff --git a/util-linux/mdev.c b/util-linux/mdev.c
index f0a8854..2341a5a 100644
--- a/util-linux/mdev.c
+++ b/util-linux/mdev.c
@@ -72,8 +72,14 @@
 	/* Determine device name, type, major and minor */
 	device_name = bb_basename(path);
 	/* http://kernel.org/doc/pending/hotplug.txt says that only
-	 * "/sys/block/..." is for block devices. "sys/bus" etc is not! */
-	type = (strncmp(&path[5], "block/", 6) == 0 ? S_IFBLK : S_IFCHR);
+	 * "/sys/block/..." is for block devices. "/sys/bus" etc is not!
+	 * Since kernel 2.6.25 block devices are also in /sys/class/block. */
+	/* TODO: would it be acceptable to just use strstr(path, "/block/")? */
+	if (strncmp(&path[5], "class/block/"+6, 6) != 0
+	 && strncmp(&path[5], "class/block/", 12) != 0)
+	        type = S_IFCHR;
+	else
+	        type = S_IFBLK;
 
 	if (ENABLE_FEATURE_MDEV_CONF) {
 		FILE *fp;
@@ -172,8 +178,9 @@
 					/* substitute %1..9 with off[1..9], if any */
 					n = 0;
 					s = val;
-					while (*s && *s++ == '%')
-						n++;
+					while (*s)
+						if (*s++ == '%')
+							n++;
 
 					p = alias = xzalloc(strlen(val) + n * strlen(device_name));
 					s = val + 1;