zcip: open ARP socket before openlog
(else we can thrash syslog socket)
This commit is contained in:
		@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user