zcip: open ARP socket before openlog

(else we can thrash syslog socket)
This commit is contained in:
Denis Vlasenko 2008-02-04 09:42:05 +00:00
parent f8157cafcb
commit f3f33ebb0b

View File

@ -178,7 +178,7 @@ int zcip_main(int argc, char **argv)
char *r_opt; char *r_opt;
unsigned opts; unsigned opts;
/* Ugly trick, but I want these zeroed in one go */ // ugly trick, but I want these zeroed in one go
struct { struct {
const struct in_addr null_ip; const struct in_addr null_ip;
const struct ether_addr null_addr; 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 // exactly 2 args; -v accumulates and implies -f
opt_complementary = "=2:vv:vf"; opt_complementary = "=2:vv:vf";
opts = getopt32(argv, "fqr:v", &r_opt, &verbose); 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) { 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); openlog(applet_name, 0, LOG_DAEMON);
logmode |= LOGMODE_SYSLOG; logmode |= LOGMODE_SYSLOG;
} }
@ -224,11 +233,6 @@ int zcip_main(int argc, char **argv)
bb_error_msg_and_die("invalid link address"); 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; argc -= optind;
argv += optind; argv += optind;
@ -247,8 +251,6 @@ int zcip_main(int argc, char **argv)
//TODO: are we leaving sa_family == 0 (AF_UNSPEC)?! //TODO: are we leaving sa_family == 0 (AF_UNSPEC)?!
safe_strncpy(saddr.sa_data, intf, sizeof(saddr.sa_data)); 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 // bind to the interface's ARP socket
xbind(sock_fd, &saddr, sizeof(saddr)); xbind(sock_fd, &saddr, sizeof(saddr));
@ -288,7 +290,7 @@ int zcip_main(int argc, char **argv)
// restarting after address conflicts: // restarting after address conflicts:
// - start with some address we want to try // - start with some address we want to try
// - short random delay // - 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 // - arp announcements that we're claiming it
// - use it // - use it
// - defend it, within limits // - defend it, within limits
@ -319,7 +321,7 @@ int zcip_main(int argc, char **argv)
switch (safe_poll(fds, 1, timeout_ms)) { switch (safe_poll(fds, 1, timeout_ms)) {
default: default:
/*bb_perror_msg("poll"); - done in safe_poll */ //bb_perror_msg("poll"); - done in safe_poll
return EXIT_FAILURE; return EXIT_FAILURE;
// timeout // timeout