> commit e95e909d820429ba34fa6f6f1b0109ac22743b47 > Author: Tom Gundersen <t...@jklm.no> > Date: Sun Dec 28 13:38:23 2014 +0100 > > 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. > > diff --git a/src/core/loopback-setup.c b/src/core/loopback-setup.c > index ab6335c..0d7d00c 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) { This does not look right. First of all, "check" is misleading, because a return value of false means that the check passed. Second, negative values are implicitly converted to bool.
> + _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"); Zbyszek _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel