[systemd-commits] 9 commits - TODO man/systemd-nspawn.xml man/systemd.network.xml network/80-container-host0.network network/80-container-ve.network src/journal src/network src/nspawn src/shared src/udev

Lennart Poettering lennart at kemper.freedesktop.org
Tue Jan 13 11:55:33 PST 2015


 TODO                                     |    6 +-
 man/systemd-nspawn.xml                   |    1 
 man/systemd.network.xml                  |   15 ++++--
 network/80-container-host0.network       |    2 
 network/80-container-ve.network          |    1 
 src/journal/journald-server.c            |    4 -
 src/network/networkd-address.c           |    8 +--
 src/network/networkd-dhcp4.c             |    2 
 src/network/networkd-link.c              |   70 +++++++++++++++++++++++++++----
 src/network/networkd-manager.c           |   34 +++++++++++++++
 src/network/networkd-network-gperf.gperf |    2 
 src/network/networkd-network.c           |   53 ++++++++++-------------
 src/network/networkd.h                   |   31 +++++++------
 src/network/test-network-tables.c        |    2 
 src/nspawn/nspawn.c                      |    9 +--
 src/shared/conf-parser.c                 |    6 --
 src/shared/util.h                        |    4 +
 src/udev/udev-builtin-btrfs.c            |    2 
 18 files changed, 170 insertions(+), 82 deletions(-)

New commits:
commit 02c74033ed65e7825d1b87ee051820c9fbfa0f50
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 20:07:54 2015 +0100

    update TODO

diff --git a/TODO b/TODO
index 0660279..d59c5a2 100644
--- a/TODO
+++ b/TODO
@@ -47,6 +47,10 @@ Release 219 preparations:
 
 Features:
 
+* machine: we should fake a read-only flag for simple directory images via a flag file
+
+* import: support import from local files, and export to local files
+
 * import: add "pull-tar" support, for downloading/verifying tarballs
 
 * import: support compressed raw images
@@ -59,8 +63,6 @@ Features:
 
 * the dbus1 connection user id is actually the euid, not the uid, and creds should return that
 
-* add minimal NAT logic to networkd and nspawn. The former should be a simple NAT=yes|no|ipv4|ipv6 and expose a network on all other interfaces as NAT. The latter should get a "--port=" switch or so, which forwards one host port onto the container
-
 * introduce systemd-nspawn-ephemeral at .service, and hook it into "machinectl start" with a new --ephemeral switch
 
 * nspawn should lock container images while running off them

commit 43c6d5abacaebf813845934ec8d5e5ee3c431854
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 20:50:46 2015 +0100

    networkd: propagate IPFoward= per-interface setting also to /proc/sys/net/ipv4/ip_forward
    
    We need to turn on /proc/sys/net/ipv4/ip_forward before the
    per-interface forwarding setting is useful, hence let's propagate the
    per-interface setting once to the system-wide setting.
    
    Due to the unclear ownership rules of that flag, and the fact that
    turning it on also has effects on other sysctl flags we try to minimize
    changes to the flag, and only turn it on once. There's no logic to
    turning it off again, but this should be fairly unproblematic as the
    per-interface setting defaults to off anyway.

diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index e4800a1..bc363f9 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -1237,12 +1237,38 @@ static int link_enter_join_netdev(Link *link) {
 
 static int link_set_ipv4_forward(Link *link) {
         const char *p = NULL;
+        bool b;
         int r;
 
+        b = link_ipv4_forward_enabled(link);
+
         p = strappenda("/proc/sys/net/ipv4/conf/", link->ifname, "/forwarding");
-        r = write_string_file_no_create(p, one_zero(link_ipv4_forward_enabled(link)));
+        r = write_string_file_no_create(p, one_zero(b));
         if (r < 0)
-                log_link_warning_errno(link, r, "Cannot configure IPv4 forwarding for interface: %m");
+                log_link_warning_errno(link, r, "Cannot configure IPv4 forwarding for interface %s: %m", link->ifname);
+
+        if (b) {
+                _cleanup_free_ char *buf = NULL;
+
+                /* If IP forwarding is turned on for this interface,
+                 * then propagate this to the global setting. Given
+                 * that turning this on has side-effects on other
+                 * fields, we'll try to avoid doing this unless
+                 * necessary, hence check the previous value
+                 * first. Note that we never turn this option off
+                 * again, since all interfaces we manage do not do
+                 * forwarding anyway by default, and ownership rules
+                 * of this control are so unclear. */
+
+                r = read_one_line_file("/proc/sys/net/ipv4/ip_forward", &buf);
+                if (r < 0)
+                        log_link_warning_errno(link, r, "Cannot read /proc/sys/net/ipv4/ip_forward: %m");
+                else if (!streq(buf, "1")) {
+                        r = write_string_file_no_create("/proc/sys/net/ipv4/ip_forward", "1");
+                        if (r < 0)
+                                log_link_warning_errno(link, r, "Cannot write /proc/sys/net/ipv4/ip_forward: %m");
+                }
+        }
 
         return 0;
 }

commit cd1ddd542136c49831fa34de49321153dcc291e2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 20:16:39 2015 +0100

    udev: make use of new one_zero() helper where appropriate

diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c
index 74b2209..3643596 100644
--- a/src/udev/udev-builtin-btrfs.c
+++ b/src/udev/udev-builtin-btrfs.c
@@ -49,7 +49,7 @@ static int builtin_btrfs(struct udev_device *dev, int argc, char *argv[], bool t
         if (err < 0)
                 return EXIT_FAILURE;
 
-        udev_builtin_add_property(dev, test, "ID_BTRFS_READY", err == 0 ? "1" : "0");
+        udev_builtin_add_property(dev, test, "ID_BTRFS_READY", one_zero(err == 0));
         return EXIT_SUCCESS;
 }
 

commit 769d324c99aab129148bd25f5f663ef441287d86
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 20:07:13 2015 +0100

    networkd: make IP forwarding for IPv4 and IPv6 individually configurable

diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 484d6f3..c072f08 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -352,9 +352,14 @@
                                         packets on the network
                                         interface will be forwarded to
                                         other interfaces according to
-                                        the routing table. Takes a
-                                        boolean
-                                        argument.</para></listitem>
+                                        the routing table. Takes
+                                        either a boolean argument, or
+                                        the values
+                                        <literal>ipv4</literal> or
+                                        <literal>ipv6</literal>, which
+                                        only enables IP forwarding for
+                                        the specified address
+                                        family.</para></listitem>
                                 </varlistentry>
                                 <varlistentry>
                                         <term><varname>IPMasquerade=</varname></term>
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 1e25967..e4800a1 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -88,14 +88,24 @@ static bool link_lldp_enabled(Link *link) {
         return link->network->lldp;
 }
 
-static bool link_ip_forward_enabled(Link *link) {
+static bool link_ipv4_forward_enabled(Link *link) {
         if (link->flags & IFF_LOOPBACK)
                 return false;
 
         if (!link->network)
                 return false;
 
-        return link->network->ip_forward;
+        return IN_SET(link->network->ip_forward, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_YES);
+}
+
+static bool link_ipv6_forward_enabled(Link *link) {
+        if (link->flags & IFF_LOOPBACK)
+                return false;
+
+        if (!link->network)
+                return false;
+
+        return IN_SET(link->network->ip_forward, ADDRESS_FAMILY_IPV6, ADDRESS_FAMILY_YES);
 }
 
 #define FLAG_STRING(string, flag, old, new) \
@@ -1225,14 +1235,26 @@ static int link_enter_join_netdev(Link *link) {
         return 0;
 }
 
-static int link_set_ip_forward(Link *link) {
+static int link_set_ipv4_forward(Link *link) {
         const char *p = NULL;
         int r;
 
         p = strappenda("/proc/sys/net/ipv4/conf/", link->ifname, "/forwarding");
-        r = write_string_file_no_create(p, link_ip_forward_enabled(link) ? "1" : "0");
+        r = write_string_file_no_create(p, one_zero(link_ipv4_forward_enabled(link)));
         if (r < 0)
-                log_link_warning_errno(link, r, "Cannot configure IP forwarding for interface: %m");
+                log_link_warning_errno(link, r, "Cannot configure IPv4 forwarding for interface: %m");
+
+        return 0;
+}
+
+static int link_set_ipv6_forward(Link *link) {
+        const char *p = NULL;
+        int r;
+
+        p = strappenda("/proc/sys/net/ipv6/conf/", link->ifname, "/forwarding");
+        r = write_string_file_no_create(p, one_zero(link_ipv6_forward_enabled(link)));
+        if (r < 0)
+                log_link_warning_errno(link, r, "Cannot configure IPv6 forwarding for interface: %m");
 
         return 0;
 }
@@ -1248,7 +1270,11 @@ static int link_configure(Link *link) {
         if (r < 0)
                 return r;
 
-        r = link_set_ip_forward(link);
+        r = link_set_ipv4_forward(link);
+        if (r < 0)
+                return r;
+
+        r = link_set_ipv6_forward(link);
         if (r < 0)
                 return r;
 
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 42b5113..4c90434 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -686,3 +686,5 @@ AddressFamilyBoolean address_family_boolean_from_string(const char *s) {
 
         return _ADDRESS_FAMILY_BOOLEAN_INVALID;
 }
+
+DEFINE_CONFIG_PARSE_ENUM(config_parse_address_family_boolean, address_family_boolean, AddressFamilyBoolean, "Failed to parse option");
diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf
index 3eb37b4..5f2f741 100644
--- a/src/network/networkd-network-gperf.gperf
+++ b/src/network/networkd-network-gperf.gperf
@@ -44,7 +44,7 @@ Network.Domains,             config_parse_domains,               0,
 Network.DNS,                 config_parse_strv,                  0,                             offsetof(Network, dns)
 Network.LLMNR,               config_parse_llmnr,                 0,                             offsetof(Network, llmnr)
 Network.NTP,                 config_parse_strv,                  0,                             offsetof(Network, ntp)
-Network.IPForward,           config_parse_bool,                  0,                             offsetof(Network, ip_forward)
+Network.IPForward,           config_parse_address_family_boolean,0,                             offsetof(Network, ip_forward)
 Network.IPMasquerade,        config_parse_bool,                  0,                             offsetof(Network, ip_masquerade)
 Address.Address,             config_parse_address,               0,                             0
 Address.Peer,                config_parse_address,               0,                             0
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index 98f199a..34a06d3 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -111,7 +111,7 @@ static int network_load_one(Manager *manager, const char *filename) {
 
         /* IPMasquerade=yes implies IPForward=yes */
         if (network->ip_masquerade)
-                network->ip_forward = true;
+                network->ip_forward |= ADDRESS_FAMILY_IPV4;
 
         LIST_PREPEND(networks, manager->networks, network);
 
@@ -489,6 +489,10 @@ int config_parse_dhcp(
         assert(rvalue);
         assert(data);
 
+        /* Note that this is mostly like
+         * config_parse_address_family_boolean(), except that it
+         * understands some old names for the enum values */
+
         s = address_family_boolean_from_string(rvalue);
         if (s < 0) {
 
diff --git a/src/network/networkd.h b/src/network/networkd.h
index ea4547b..719a75b 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -55,10 +55,11 @@ typedef struct AddressPool AddressPool;
 typedef struct FdbEntry FdbEntry;
 
 typedef enum AddressFamilyBoolean {
-        ADDRESS_FAMILY_NO,
-        ADDRESS_FAMILY_YES,
-        ADDRESS_FAMILY_IPV4,
-        ADDRESS_FAMILY_IPV6,
+        /* This is a bitmask, though it usually doesn't feel that way! */
+        ADDRESS_FAMILY_NO = 0,
+        ADDRESS_FAMILY_IPV4 = 1,
+        ADDRESS_FAMILY_IPV6 = 2,
+        ADDRESS_FAMILY_YES = 3,
         _ADDRESS_FAMILY_BOOLEAN_MAX,
         _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
 } AddressFamilyBoolean;
@@ -120,8 +121,8 @@ struct Network {
 
         unsigned cost;
 
+        AddressFamilyBoolean ip_forward;
         bool ip_masquerade;
-        bool ip_forward;
 
         struct ether_addr *mac;
         unsigned mtu;
@@ -391,3 +392,5 @@ int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union
 
 const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
 AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
+
+int config_parse_address_family_boolean(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c
index a1a94da..0b1af6c 100644
--- a/src/shared/conf-parser.c
+++ b/src/shared/conf-parser.c
@@ -823,8 +823,7 @@ int config_parse_log_facility(
 
         x = log_facility_unshifted_from_string(rvalue);
         if (x < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, EINVAL,
-                           "Failed to parse log facility, ignoring: %s", rvalue);
+                log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Failed to parse log facility, ignoring: %s", rvalue);
                 return 0;
         }
 
@@ -855,8 +854,7 @@ int config_parse_log_level(
 
         x = log_level_from_string(rvalue);
         if (x < 0) {
-                log_syntax(unit, LOG_ERR, filename, line, EINVAL,
-                           "Failed to parse log level, ignoring: %s", rvalue);
+                log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Failed to parse log level, ignoring: %s", rvalue);
                 return 0;
         }
 
diff --git a/src/shared/util.h b/src/shared/util.h
index b337249..850019a 100644
--- a/src/shared/util.h
+++ b/src/shared/util.h
@@ -143,6 +143,10 @@ static inline const char* true_false(bool b) {
         return b ? "true" : "false";
 }
 
+static inline const char* one_zero(bool b) {
+        return b ? "1" : "0";
+}
+
 static inline const char* strempty(const char *s) {
         return s ? s : "";
 }

commit db9fd84944807ebea04363dada761613360fa6f9
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 20:03:44 2015 +0100

    network: IPMasquerade= implies IPForward=, hence remove it

diff --git a/network/80-container-ve.network b/network/80-container-ve.network
index 7fb09cc..7bde1d4 100644
--- a/network/80-container-ve.network
+++ b/network/80-container-ve.network
@@ -14,5 +14,4 @@ Driver=veth
 Address=0.0.0.0/28
 IPv4LL=yes
 DHCPServer=yes
-IPForward=yes
 IPMasquerade=yes

commit fd6d906cf46ecef45ebbb5a361e1dc436f031d7a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 19:56:13 2015 +0100

    networkd: rename misnamed boolean

diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index b4eb91e..ce0e923 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -116,7 +116,7 @@ int address_establish(Address *address, Link *link) {
                 address->scope < RT_SCOPE_LINK;
 
         /* Add firewall entry if this is requested */
-        if (address->ip_forward_done != masq) {
+        if (address->ip_masquerade_done != masq) {
                 union in_addr_union masked = address->in_addr;
                 in_addr_mask(address->family, &masked, address->prefixlen);
 
@@ -124,7 +124,7 @@ int address_establish(Address *address, Link *link) {
                 if (r < 0)
                         log_link_warning_errno(link, r, "Could not enable IP masquerading: %m");
 
-                address->ip_forward_done = masq;
+                address->ip_masquerade_done = masq;
         }
 
         return 0;
@@ -137,7 +137,7 @@ int address_release(Address *address, Link *link) {
         assert(link);
 
         /* Remove masquerading firewall entry if it was added */
-        if (address->ip_forward_done) {
+        if (address->ip_masquerade_done) {
                 union in_addr_union masked = address->in_addr;
                 in_addr_mask(address->family, &masked, address->prefixlen);
 
@@ -145,7 +145,7 @@ int address_release(Address *address, Link *link) {
                 if (r < 0)
                         log_link_warning_errno(link, r, "Failed to disable IP masquerading: %m");
 
-                address->ip_forward_done = false;
+                address->ip_masquerade_done = false;
         }
 
         return 0;
diff --git a/src/network/networkd.h b/src/network/networkd.h
index b36590e..ea4547b 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -160,7 +160,7 @@ struct Address {
         union in_addr_union in_addr;
         union in_addr_union in_addr_peer;
 
-        bool ip_forward_done;
+        bool ip_masquerade_done;
 
         LIST_FIELDS(Address, addresses);
 };

commit cb9fc36a1211967e8c58b0502a26c42552ac8060
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 19:48:19 2015 +0100

    networkd: introduce an AddressFamilyBoolean enum type
    
    This introduces am AddressFamilyBoolean type that works more or less
    like a booleaan, but can optionally turn on/off things for ipv4 and ipv6
    independently. THis also ports the DHCP field over to it.

diff --git a/man/systemd.network.xml b/man/systemd.network.xml
index 9392089..484d6f3 100644
--- a/man/systemd.network.xml
+++ b/man/systemd.network.xml
@@ -220,8 +220,8 @@
                                         <term><varname>DHCP=</varname></term>
                                         <listitem>
                                                 <para>Enables DHCPv4 and/or DHCPv6 support. Accepts
-                                                <literal>both</literal>, <literal>none</literal>,
-                                                <literal>v4</literal> or <literal>v6</literal>.</para>
+                                                <literal>yes</literal>, <literal>no</literal>,
+                                                <literal>ipv4</literal> or <literal>ipv6</literal>.</para>
                                         </listitem>
                                 </varlistentry>
                                 <varlistentry>
diff --git a/network/80-container-host0.network b/network/80-container-host0.network
index 6863ca9..8d9293f 100644
--- a/network/80-container-host0.network
+++ b/network/80-container-host0.network
@@ -10,5 +10,5 @@ Virtualization=container
 Name=host0
 
 [Network]
-DHCP=both
+DHCP=yes
 IPv4LL=yes
diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c
index 1c2edc5..c3d0e3d 100644
--- a/src/network/networkd-dhcp4.c
+++ b/src/network/networkd-dhcp4.c
@@ -586,7 +586,7 @@ int dhcp4_configure(Link *link) {
 
         assert(link);
         assert(link->network);
-        assert(IN_SET(link->network->dhcp, DHCP_SUPPORT_BOTH, DHCP_SUPPORT_V4));
+        assert(IN_SET(link->network->dhcp, ADDRESS_FAMILY_YES, ADDRESS_FAMILY_IPV4));
 
         r = sd_dhcp_client_new(&link->dhcp_client);
         if (r < 0)
diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c
index 12944a0..1e25967 100644
--- a/src/network/networkd-link.c
+++ b/src/network/networkd-link.c
@@ -42,7 +42,7 @@ static bool link_dhcp6_enabled(Link *link) {
         if (!link->network)
                 return false;
 
-        return IN_SET(link->network->dhcp, DHCP_SUPPORT_V6, DHCP_SUPPORT_BOTH);
+        return IN_SET(link->network->dhcp, ADDRESS_FAMILY_IPV6, ADDRESS_FAMILY_YES);
 }
 
 static bool link_dhcp4_enabled(Link *link) {
@@ -52,7 +52,7 @@ static bool link_dhcp4_enabled(Link *link) {
         if (!link->network)
                 return false;
 
-        return IN_SET(link->network->dhcp, DHCP_SUPPORT_V4, DHCP_SUPPORT_BOTH);
+        return IN_SET(link->network->dhcp, ADDRESS_FAMILY_IPV4, ADDRESS_FAMILY_YES);
 }
 
 static bool link_dhcp4_server_enabled(Link *link) {
@@ -1331,7 +1331,7 @@ static int link_initialized_and_synced(sd_rtnl *rtnl, sd_rtnl_message *m,
                 if (network->ipv4ll)
                         log_link_debug(link, "ignoring IPv4LL for loopback link");
 
-                if (network->dhcp != DHCP_SUPPORT_NONE)
+                if (network->dhcp != ADDRESS_FAMILY_NO)
                         log_link_debug(link, "ignoring DHCP clients for loopback link");
 
                 if (network->dhcp_server)
diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c
index 6aab427..42b5113 100644
--- a/src/network/networkd-manager.c
+++ b/src/network/networkd-manager.c
@@ -654,3 +654,35 @@ int manager_address_pool_acquire(Manager *m, int family, unsigned prefixlen, uni
 
         return 0;
 }
+
+const char *address_family_boolean_to_string(AddressFamilyBoolean b) {
+        if (b == ADDRESS_FAMILY_YES ||
+            b == ADDRESS_FAMILY_NO)
+                return yes_no(b == ADDRESS_FAMILY_YES);
+
+        if (b == ADDRESS_FAMILY_IPV4)
+                return "ipv4";
+        if (b == ADDRESS_FAMILY_IPV6)
+                return "ipv6";
+
+        return NULL;
+}
+
+AddressFamilyBoolean address_family_boolean_from_string(const char *s) {
+        int r;
+
+        /* Make this a true superset of a boolean */
+
+        r = parse_boolean(s);
+        if (r > 0)
+                return ADDRESS_FAMILY_YES;
+        if (r == 0)
+                return ADDRESS_FAMILY_NO;
+
+        if (streq(s, "ipv4"))
+                return ADDRESS_FAMILY_IPV4;
+        if (streq(s, "ipv6"))
+                return ADDRESS_FAMILY_IPV6;
+
+        return _ADDRESS_FAMILY_BOOLEAN_INVALID;
+}
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
index d6504cc..98f199a 100644
--- a/src/network/networkd-network.c
+++ b/src/network/networkd-network.c
@@ -84,7 +84,7 @@ static int network_load_one(Manager *manager, const char *filename) {
         if (!network->filename)
                 return log_oom();
 
-        network->dhcp = DHCP_SUPPORT_NONE;
+        network->dhcp = ADDRESS_FAMILY_NO;
         network->dhcp_ntp = true;
         network->dhcp_dns = true;
         network->dhcp_hostname = true;
@@ -470,15 +470,6 @@ int config_parse_tunnel(const char *unit,
         return 0;
 }
 
-static const char* const dhcp_support_table[_DHCP_SUPPORT_MAX] = {
-        [DHCP_SUPPORT_NONE] = "none",
-        [DHCP_SUPPORT_BOTH] = "both",
-        [DHCP_SUPPORT_V4] = "v4",
-        [DHCP_SUPPORT_V6] = "v6",
-};
-
-DEFINE_STRING_TABLE_LOOKUP(dhcp_support, DHCPSupport);
-
 int config_parse_dhcp(
                 const char* unit,
                 const char *filename,
@@ -491,34 +482,34 @@ int config_parse_dhcp(
                 void *data,
                 void *userdata) {
 
-        DHCPSupport *dhcp = data;
-        int k;
+        AddressFamilyBoolean *dhcp = data, s;
 
         assert(filename);
         assert(lvalue);
         assert(rvalue);
         assert(data);
 
-        /* Our enum shall be a superset of booleans, hence first try
-         * to parse as boolean, and then as enum */
-
-        k = parse_boolean(rvalue);
-        if (k > 0)
-                *dhcp = DHCP_SUPPORT_BOTH;
-        else if (k == 0)
-                *dhcp = DHCP_SUPPORT_NONE;
-        else {
-                DHCPSupport s;
-
-                s = dhcp_support_from_string(rvalue);
-                if (s < 0){
-                        log_syntax(unit, LOG_ERR, filename, line, -s, "Failed to parse DHCP option, ignoring: %s", rvalue);
+        s = address_family_boolean_from_string(rvalue);
+        if (s < 0) {
+
+                /* Previously, we had a slightly different enum here,
+                 * support its values for compatbility. */
+
+                if (streq(rvalue, "none"))
+                        s = ADDRESS_FAMILY_NO;
+                else if (streq(rvalue, "v4"))
+                        s = ADDRESS_FAMILY_IPV4;
+                else if (streq(rvalue, "v6"))
+                        s = ADDRESS_FAMILY_IPV6;
+                else if (streq(rvalue, "both"))
+                        s = ADDRESS_FAMILY_YES;
+                else {
+                        log_syntax(unit, LOG_ERR, filename, line, s, "Failed to parse DHCP option, ignoring: %s", rvalue);
                         return 0;
                 }
-
-                *dhcp = s;
         }
 
+        *dhcp = s;
         return 0;
 }
 
diff --git a/src/network/networkd.h b/src/network/networkd.h
index 39b2d2b..b36590e 100644
--- a/src/network/networkd.h
+++ b/src/network/networkd.h
@@ -54,14 +54,14 @@ typedef struct Manager Manager;
 typedef struct AddressPool AddressPool;
 typedef struct FdbEntry FdbEntry;
 
-typedef enum DHCPSupport {
-        DHCP_SUPPORT_NONE,
-        DHCP_SUPPORT_BOTH,
-        DHCP_SUPPORT_V4,
-        DHCP_SUPPORT_V6,
-        _DHCP_SUPPORT_MAX,
-        _DHCP_SUPPORT_INVALID = -1,
-} DHCPSupport;
+typedef enum AddressFamilyBoolean {
+        ADDRESS_FAMILY_NO,
+        ADDRESS_FAMILY_YES,
+        ADDRESS_FAMILY_IPV4,
+        ADDRESS_FAMILY_IPV6,
+        _ADDRESS_FAMILY_BOOLEAN_MAX,
+        _ADDRESS_FAMILY_BOOLEAN_INVALID = -1,
+} AddressFamilyBoolean;
 
 typedef enum LLMNRSupport {
         LLMNR_SUPPORT_NO,
@@ -102,7 +102,7 @@ struct Network {
         NetDev *bridge;
         NetDev *bond;
         Hashmap *stacked_netdevs;
-        DHCPSupport dhcp;
+        AddressFamilyBoolean dhcp;
         bool dhcp_dns;
         bool dhcp_ntp;
         bool dhcp_mtu;
@@ -368,9 +368,6 @@ int config_parse_fdb_vlan_id(const char *unit, const char *filename, unsigned li
 
 /* DHCP support */
 
-const char* dhcp_support_to_string(DHCPSupport i) _const_;
-DHCPSupport dhcp_support_from_string(const char *s) _pure_;
-
 int config_parse_dhcp(const char *unit, const char *filename, unsigned line,
                       const char *section, unsigned section_line, const char *lvalue,
                       int ltype, const char *rvalue, void *data, void *userdata);
@@ -391,3 +388,6 @@ int address_pool_new_from_string(Manager *m, AddressPool **ret, int family, cons
 void address_pool_free(AddressPool *p);
 
 int address_pool_acquire(AddressPool *p, unsigned prefixlen, union in_addr_union *found);
+
+const char *address_family_boolean_to_string(AddressFamilyBoolean b) _const_;
+AddressFamilyBoolean address_family_boolean_from_string(const char *s) _const_;
diff --git a/src/network/test-network-tables.c b/src/network/test-network-tables.c
index 4d55434..d1e475a 100644
--- a/src/network/test-network-tables.c
+++ b/src/network/test-network-tables.c
@@ -13,7 +13,7 @@ int main(int argc, char **argv) {
         test_table(bond_mode, NETDEV_BOND_MODE);
         /* test_table(link_state, LINK_STATE);  -- not a reversible mapping */
         test_table(link_operstate, LINK_OPERSTATE);
-        test_table(dhcp_support, DHCP_SUPPORT);
+        test_table(address_family_boolean, ADDRESS_FAMILY_BOOLEAN);
         test_table(netdev_kind, NETDEV_KIND);
         test_table(dhcp6_message_status, DHCP6_STATUS);
         test_table(duplex, DUP);

commit 66518acd40fbd99a87e553b2d0904c37c8929fb2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 19:43:16 2015 +0100

    journald: allow zero length datagrams again
    
    This undoes a small part of 13790add4bf648fed816361794d8277a75253410
    which was erroneously added, given that zero length datagrams are OK,
    and hence zero length reads on a SOCK_DGRAM be no means mean EOF.

diff --git a/src/journal/journald-server.c b/src/journal/journald-server.c
index e0a078e..5999724 100644
--- a/src/journal/journald-server.c
+++ b/src/journal/journald-server.c
@@ -1182,10 +1182,6 @@ int server_process_datagram(sd_event_source *es, int fd, uint32_t revents, void
                         log_error_errno(errno, "recvmsg() failed: %m");
                         return -errno;
                 }
-                if (n == 0) {
-                        log_error("Got EOF on socket.");
-                        return -ECONNRESET;
-                }
 
                 for (cmsg = CMSG_FIRSTHDR(&msghdr); cmsg; cmsg = CMSG_NXTHDR(&msghdr, cmsg)) {
 

commit 0dfaa0060711a8332c8eb9f1e10f48fe182d3650
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 13 19:42:02 2015 +0100

    nspawn: add "-n" shortcut for "--network-veth"
    
    Now that networkd's IP masquerading support means that running
    containers with "--network-veth" will provide network access out of the
    box for the container, let's add a shortcut "-n" for it, to make it
    easily accessible.

diff --git a/man/systemd-nspawn.xml b/man/systemd-nspawn.xml
index 7d67472..e67aeec 100644
--- a/man/systemd-nspawn.xml
+++ b/man/systemd-nspawn.xml
@@ -407,6 +407,7 @@
                         </varlistentry>
 
                         <varlistentry>
+                                <term><option>-n</option></term>
                                 <term><option>--network-veth</option></term>
 
                                 <listitem><para>Create a virtual
diff --git a/src/nspawn/nspawn.c b/src/nspawn/nspawn.c
index 2b1feb6..ce9a9e8 100644
--- a/src/nspawn/nspawn.c
+++ b/src/nspawn/nspawn.c
@@ -209,7 +209,7 @@ static void help(void) {
                "     --network-macvlan=INTERFACE\n"
                "                            Create a macvlan network interface based on an\n"
                "                            existing network interface to the container\n"
-               "     --network-veth         Add a virtual ethernet connection between host\n"
+               "  -n --network-veth         Add a virtual ethernet connection between host\n"
                "                            and container\n"
                "     --network-bridge=INTERFACE\n"
                "                            Add a virtual ethernet connection between host\n"
@@ -283,7 +283,6 @@ static int parse_argv(int argc, char *argv[]) {
                 ARG_KEEP_UNIT,
                 ARG_NETWORK_INTERFACE,
                 ARG_NETWORK_MACVLAN,
-                ARG_NETWORK_VETH,
                 ARG_NETWORK_BRIDGE,
                 ARG_PERSONALITY,
                 ARG_VOLATILE,
@@ -318,7 +317,7 @@ static int parse_argv(int argc, char *argv[]) {
                 { "keep-unit",             no_argument,       NULL, ARG_KEEP_UNIT         },
                 { "network-interface",     required_argument, NULL, ARG_NETWORK_INTERFACE },
                 { "network-macvlan",       required_argument, NULL, ARG_NETWORK_MACVLAN   },
-                { "network-veth",          no_argument,       NULL, ARG_NETWORK_VETH      },
+                { "network-veth",          no_argument,       NULL, 'n'                   },
                 { "network-bridge",        required_argument, NULL, ARG_NETWORK_BRIDGE    },
                 { "personality",           required_argument, NULL, ARG_PERSONALITY       },
                 { "image",                 required_argument, NULL, 'i'                   },
@@ -333,7 +332,7 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "+hD:u:bL:M:jS:Z:qi:xp:", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "+hD:u:bL:M:jS:Z:qi:xp:n", options, NULL)) >= 0)
 
                 switch (c) {
 
@@ -384,7 +383,7 @@ static int parse_argv(int argc, char *argv[]) {
 
                         /* fall through */
 
-                case ARG_NETWORK_VETH:
+                case 'n':
                         arg_network_veth = true;
                         arg_private_network = true;
                         break;



More information about the systemd-commits mailing list