Blob Blame History Raw
From f8ef650e9d7b633c67509666599c15f205fa5baf Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 12 Dec 2008 21:26:27 +0100
Subject: [PATCH] Fix --force-bind logic

Quoting Cocagne:

	"line 1280 of autoipd's main.c: "else if (event ==
	EVENT_ROUTABLE_ADDR_CONFIGURED)" is missing '&& !force_bind' in
	the conditional. The lack of this condition causes the local
	link IP to be released even if the --force-bind arugment is
	passed.

	The problem was noticed when attempting to use avahi-autoipd
	acquire a link-local address during the early-userspace in a
	Linux initramfs. Immediately after the call-out script assinged
	the ll-address to the device, the daemon released the address
	via this conditional. It's suspicious that the daemon would
	consider this address "routable" but, even if it were,
	--force-bind should prevent the address from being released.

	After adding the && !force_bind to the conditional the daemon
	appeard to behave as expected."

Closes #209.
---
 avahi-autoipd/main.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/avahi-autoipd/main.c b/avahi-autoipd/main.c
index ef529b9..eb71c3b 100644
--- a/avahi-autoipd/main.c
+++ b/avahi-autoipd/main.c
@@ -1281,7 +1281,7 @@ static int loop(int iface, uint32_t addr) {
                     DEBUG(daemon_log(LOG_DEBUG, "Ignoring irrelevant ARP packet."));
             }
 
-        } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED) {
+        } else if (event == EVENT_ROUTABLE_ADDR_CONFIGURED && !force_bind) {
 
             daemon_log(LOG_INFO, "A routable address has been configured.");
 
@@ -1306,7 +1306,7 @@ static int loop(int iface, uint32_t addr) {
             elapse_time(&next_wakeup, 0, PROBE_WAIT*1000);
             next_wakeup_valid = 1;
 
-        } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING && !force_bind) {
+        } else if (event == EVENT_REFRESH_REQUEST && state == STATE_RUNNING) {
 
             /* The user requested a reannouncing of the address by a SIGHUP */
             daemon_log(LOG_INFO, "Reannouncing address.");
-- 
1.6.0.5