aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-12-10 11:16:47 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-12-10 11:16:47 +0000
commit517413f9affae582f5e824ef45805662d676be6a (patch)
tree624ef48c2de51f7c458b3c2c0b9f17fff0af8da5
parente53738558f2f1aa8cd536545479ab98b0df808c5 (diff)
downloadbusybox-w32-517413f9affae582f5e824ef45805662d676be6a.tar.gz
busybox-w32-517413f9affae582f5e824ef45805662d676be6a.tar.bz2
busybox-w32-517413f9affae582f5e824ef45805662d676be6a.zip
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
-rw-r--r--libbb/info_msg.c26
-rw-r--r--networking/udhcp/dhcpc.c23
2 files changed, 42 insertions, 7 deletions
diff --git a/libbb/info_msg.c b/libbb/info_msg.c
index ffef05e54..8b8a1fcca 100644
--- a/libbb/info_msg.c
+++ b/libbb/info_msg.c
@@ -12,6 +12,7 @@
12 12
13void FAST_FUNC bb_info_msg(const char *s, ...) 13void FAST_FUNC bb_info_msg(const char *s, ...)
14{ 14{
15#ifdef THIS_ONE_DOESNT_DO_SINGLE_WRITE
15 va_list p; 16 va_list p;
16 /* va_copy is used because it is not portable 17 /* va_copy is used because it is not portable
17 * to use va_list p twice */ 18 * to use va_list p twice */
@@ -27,4 +28,29 @@ void FAST_FUNC bb_info_msg(const char *s, ...)
27 vsyslog(LOG_INFO, s, p2); 28 vsyslog(LOG_INFO, s, p2);
28 va_end(p2); 29 va_end(p2);
29 va_end(p); 30 va_end(p);
31#else
32 int used;
33 char *msg;
34 va_list p;
35
36 if (logmode == 0)
37 return;
38
39 va_start(p, s);
40 used = vasprintf(&msg, s, p);
41 if (used < 0)
42 return;
43
44 if (ENABLE_FEATURE_SYSLOG && (logmode & LOGMODE_SYSLOG))
45 syslog(LOG_INFO, "%s", msg);
46 if (logmode & LOGMODE_STDIO) {
47 fflush(stdout);
48 /* used = strlen(msg); - must be true already */
49 msg[used++] = '\n';
50 full_write(STDOUT_FILENO, msg, used);
51 }
52
53 free(msg);
54 va_end(p);
55#endif
30} 56}
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index e2e5b0a82..115cddbf0 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -43,11 +43,17 @@ static void change_listen_mode(int new_mode)
43{ 43{
44 DEBUG("entering %s listen mode", 44 DEBUG("entering %s listen mode",
45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none"); 45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none");
46
47 listen_mode = new_mode;
46 if (sockfd >= 0) { 48 if (sockfd >= 0) {
47 close(sockfd); 49 close(sockfd);
48 sockfd = -1; 50 sockfd = -1;
49 } 51 }
50 listen_mode = new_mode; 52 if (new_mode == LISTEN_KERNEL)
53 sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface);
54 else if (new_mode != LISTEN_NONE)
55 sockfd = udhcp_raw_socket(client_config.ifindex);
56 /* else LISTEN_NONE: sockfd stay closed */
51} 57}
52 58
53 59
@@ -320,12 +326,15 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
320 for (;;) { 326 for (;;) {
321 unsigned timestamp_before_wait; 327 unsigned timestamp_before_wait;
322 328
323 if (listen_mode != LISTEN_NONE && sockfd < 0) { 329 //bb_error_msg("sockfd:%d, listen_mode:%d", sockfd, listen_mode);
324 if (listen_mode == LISTEN_KERNEL) 330
325 sockfd = udhcp_listen_socket(/*INADDR_ANY,*/ CLIENT_PORT, client_config.interface); 331 /* Was opening raw or udp socket here
326 else 332 * if (listen_mode != LISTEN_NONE && sockfd < 0),
327 sockfd = udhcp_raw_socket(client_config.ifindex); 333 * but on fast network renew responses return faster
328 } 334 * than we open sockets. Thus this code is moved
335 * to change_listen_mode(). Thus we open listen socket
336 * BEFORE we send renew request (see "case BOUND:"). */
337
329 max_fd = udhcp_sp_fd_set(&rfds, sockfd); 338 max_fd = udhcp_sp_fd_set(&rfds, sockfd);
330 339
331 tv.tv_sec = timeout - already_waited_sec; 340 tv.tv_sec = timeout - already_waited_sec;