summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-12-28 13:38:23 +0100
committerTom Gundersen <teg@jklm.no>2014-12-28 15:58:27 +0100
commite95e909d820429ba34fa6f6f1b0109ac22743b47 (patch)
tree1f757656ddccf47aa467ab33958ad92ef155003e
parent94b5088c8d961078d73a2f8659c0ea21f9ebc500 (diff)
core: loopback - simplify check_loopback()
We no longer configure the addresses on the loopback interface, but simply bring it up and let the kernel do the rest. Also change the check to only check if the interface is up, rather than checking for the IPv4 loopback address.
-rw-r--r--src/core/loopback-setup.c42
1 files changed, 18 insertions, 24 deletions
diff --git a/src/core/loopback-setup.c b/src/core/loopback-setup.c
index ab6335c0ce..0d7d00cfc0 100644
--- a/src/core/loopback-setup.c
+++ b/src/core/loopback-setup.c
@@ -56,30 +56,24 @@ static int start_loopback(sd_rtnl *rtnl) {
return 0;
}
-static int check_loopback(void) {
+static bool check_loopback(sd_rtnl *rtnl) {
+ _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL, *reply = NULL;
+ unsigned flags;
int r;
- _cleanup_close_ int fd = -1;
- union {
- struct sockaddr sa;
- struct sockaddr_in in;
- } sa = {
- .in.sin_family = AF_INET,
- .in.sin_addr.s_addr = htonl(INADDR_LOOPBACK),
- };
-
- /* If we failed to set up the loop back device, check whether
- * it might already be set up */
-
- fd = socket(AF_INET, SOCK_DGRAM|SOCK_NONBLOCK|SOCK_CLOEXEC, 0);
- if (fd < 0)
- return -errno;
-
- if (bind(fd, &sa.sa, sizeof(sa.in)) >= 0)
- r = 1;
- else
- r = errno == EADDRNOTAVAIL ? 0 : -errno;
-
- return r;
+
+ r = sd_rtnl_message_new_link(rtnl, &req, RTM_GETLINK, LOOPBACK_IFINDEX);
+ if (r < 0)
+ return r;
+
+ r = sd_rtnl_call(rtnl, req, 0, &reply);
+ if (r < 0)
+ return r;
+
+ r = sd_rtnl_message_link_get_flags(reply, &flags);
+ if (r < 0)
+ return r;
+
+ return flags & IFF_UP;
}
int loopback_setup(void) {
@@ -92,7 +86,7 @@ int loopback_setup(void) {
r = start_loopback(rtnl);
if (r == -EPERM) {
- if (check_loopback() < 0)
+ if (!check_loopback(rtnl))
return log_warning_errno(EPERM, "Failed to configure loopback device: %m");
} else if (r < 0)
return log_warning_errno(r, "Failed to configure loopback device: %m");