[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