From 79a97131bc3a1de8c7134e325127618b2b72b6aa Mon Sep 17 00:00:00 2001
From: "Nicholas J. Kain" <nicholas@kain.us>
Date: Fri, 13 Feb 2015 17:50:24 -0500
Subject: [PATCH] Handle the case where the rfkill is set when ndhc is
 initializing.

---
 src/ifset.c | 22 ++++++++++++++++------
 src/ndhc.c  |  1 +
 2 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/src/ifset.c b/src/ifset.c
index fc98f87..12a3c58 100644
--- a/src/ifset.c
+++ b/src/ifset.c
@@ -128,12 +128,17 @@ static ssize_t rtnl_do_send(int fd, const uint8_t *sbuf, size_t slen,
     }
     const struct nlmsghdr *nlh = (const struct nlmsghdr *)response;
     if (nlh->nlmsg_type == NLMSG_ERROR) {
-        if (nlmsg_get_error(nlh) == 0)
+        int nlerr = nlmsg_get_error(nlh);
+        if (nlerr == 0)
             return 0;
         else {
+            if (nlerr == 132) {
+                log_line("%s: (%s) RF-kill is set (%d).  Cannot change interface.",
+                         client_config.interface, fnname, nlerr);
+                return -3;
+            }
             log_error("%s: (%s) netlink sendto returned NLMSG_ERROR: %s",
-                      client_config.interface, fnname,
-                      strerror(nlmsg_get_error(nlh)));
+                      client_config.interface, fnname, strerror(nlerr));
             return -1;
         }
     }
@@ -475,9 +480,14 @@ int perform_ifup(void)
     }
 
     int r = link_set_flags(fd, IFF_UP);
-    if (r < 0)
-        log_error("%s: (%s) Failed to set link to be up.",
-                  client_config.interface, __func__);
+    if (r < 0) {
+        if (r != -3)
+            log_error("%s: (%s) Failed to set link to be up.",
+                      client_config.interface, __func__);
+        else
+            log_line("%s: (%s) rfkill is set; waiting until it is unset",
+                     client_config.interface, __func__);
+    }
     close(fd);
     return r;
 }
diff --git a/src/ndhc.c b/src/ndhc.c
index 28e9431..9f0f5fd 100644
--- a/src/ndhc.c
+++ b/src/ndhc.c
@@ -493,6 +493,7 @@ int main(int argc, char *argv[])
     switch (perform_ifup()) {
     case 1: cs.ifsPrevState = IFS_UP;
     case 0: break;
+    case -3: cs.rfkill_set = 1; cs.ifsPrevState = IFS_DOWN; break;
     default: suicide("failed to set the interface to up state");
     }