aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2008-02-04 09:42:05 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2008-02-04 09:42:05 +0000
commitf3f33ebb0b325a0a5710cb39530449dd09c5ab70 (patch)
tree68438ccc64f1d0649ef323937036fa9f307738b8
parentf8157cafcb04a2c37b33bb68272cce1367a14777 (diff)
downloadbusybox-f3f33ebb0b325a0a5710cb39530449dd09c5ab70.tar.gz
zcip: open ARP socket before openlog
(else we can thrash syslog socket)
-rw-r--r--networking/zcip.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/networking/zcip.c b/networking/zcip.c
index 6e1c0d148..d8d9a2de1 100644
--- a/networking/zcip.c
+++ b/networking/zcip.c
@@ -178,7 +178,7 @@ int zcip_main(int argc, char **argv)
char *r_opt;
unsigned opts;
- /* Ugly trick, but I want these zeroed in one go */
+ // ugly trick, but I want these zeroed in one go
struct {
const struct in_addr null_ip;
const struct ether_addr null_addr;
@@ -212,8 +212,17 @@ int zcip_main(int argc, char **argv)
// exactly 2 args; -v accumulates and implies -f
opt_complementary = "=2:vv:vf";
opts = getopt32(argv, "fqr:v", &r_opt, &verbose);
+#if !BB_MMU
+ // on NOMMU reexec early (or else we will rerun things twice)
+ if (!FOREGROUND)
+ bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
+#endif
+ // open an ARP socket
+ // (need to do it before openlog to prevent openlog from taking
+ // fd 3 (sock_fd==3))
+ xmove_fd(xsocket(AF_PACKET, SOCK_PACKET, htons(ETH_P_ARP)), sock_fd);
if (!FOREGROUND) {
- /* Do it early, before all bb_xx_msg calls */
+ // do it before all bb_xx_msg calls
openlog(applet_name, 0, LOG_DAEMON);
logmode |= LOGMODE_SYSLOG;
}
@@ -224,11 +233,6 @@ int zcip_main(int argc, char **argv)
bb_error_msg_and_die("invalid link address");
}
}
- // On NOMMU reexec early (or else we will rerun things twice)
-#if !BB_MMU
- if (!FOREGROUND)
- bb_daemonize_or_rexec(DAEMON_CHDIR_ROOT, argv);
-#endif
argc -= optind;
argv += optind;
@@ -247,8 +251,6 @@ int zcip_main(int argc, char **argv)
//TODO: are we leaving sa_family == 0 (AF_UNSPEC)?!
safe_strncpy(saddr.sa_data, intf, sizeof(saddr.sa_data));
- // open an ARP socket
- xmove_fd(xsocket(AF_PACKET, SOCK_PACKET, htons(ETH_P_ARP)), sock_fd);
// bind to the interface's ARP socket
xbind(sock_fd, &saddr, sizeof(saddr));
@@ -288,7 +290,7 @@ int zcip_main(int argc, char **argv)
// restarting after address conflicts:
// - start with some address we want to try
// - short random delay
- // - arp probes to see if another host else uses it
+ // - arp probes to see if another host uses it
// - arp announcements that we're claiming it
// - use it
// - defend it, within limits
@@ -319,7 +321,7 @@ int zcip_main(int argc, char **argv)
switch (safe_poll(fds, 1, timeout_ms)) {
default:
- /*bb_perror_msg("poll"); - done in safe_poll */
+ //bb_perror_msg("poll"); - done in safe_poll
return EXIT_FAILURE;
// timeout