bb_info_msg: make it do atomic, unbuffered writes
udhcpc: fix a problem where we don't open listening socket fast enough

function                                             old     new   delta
bb_info_msg                                           70     126     +56
change_listen_mode                                    37      78     +41
udhcp_listen_socket                                  151     124     -27
udhcpc_main                                         2344    2285     -59

diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index e2e5b0a..115cddb 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -43,11 +43,17 @@
 {
 	DEBUG("entering %s listen mode",
 		new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
+
+	listen_mode = new_mode;
 	if (sockfd >= 0) {
 		close(sockfd);
 		sockfd = -1;
 	}
-	listen_mode = new_mode;
+	if (new_mode == LISTEN_KERNEL)
+		sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
+	else if (new_mode != LISTEN_NONE)
+		sockfd = udhcp_raw_socket(client_config.ifindex);
+	/* else LISTEN_NONE: sockfd stay closed */
 }
 
 
@@ -320,12 +326,15 @@
 	for (;;) {
 		unsigned timestamp_before_wait;
 
-		if (listen_mode != LISTEN_NONE && sockfd < 0) {
-			if (listen_mode == LISTEN_KERNEL)
-				sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
-			else
-				sockfd = udhcp_raw_socket(client_config.ifindex);
-		}
+		//bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
+
+		/* Was opening raw or udp socket here
+		 * if (listen_mode != LISTEN_NONE && sockfd < 0),
+		 * but on fast network renew responses return faster
+		 * than we open sockets. Thus this code is moved
+		 * to change_listen_mode(). Thus we open listen socket
+		 * BEFORE we send renew request (see "case BOUND:"). */
+
 		max_fd = udhcp_sp_fd_set(&rfds, sockfd);
 
 		tv.tv_sec = timeout - already_waited_sec;