[systemd-devel] [systemd-commits] 8 commits - src/core src/libsystemd src/test

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Tue Dec 30 08:17:08 PST 2014


> commit e95e909d820429ba34fa6f6f1b0109ac22743b47
> Author: Tom Gundersen <teg at 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


More information about the systemd-devel mailing list