diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-10 11:16:47 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2008-12-10 11:16:47 +0000 |
commit | 517413f9affae582f5e824ef45805662d676be6a (patch) | |
tree | 624ef48c2de51f7c458b3c2c0b9f17fff0af8da5 | |
parent | e53738558f2f1aa8cd536545479ab98b0df808c5 (diff) | |
download | busybox-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.c | 26 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 23 |
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 | ||
13 | void FAST_FUNC bb_info_msg(const char *s, ...) | 13 | void 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; |