]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysctl-util: support AF_MPLS
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 6 Dec 2024 20:03:56 +0000 (05:03 +0900)
committerLuca Boccassi <bluca@debian.org>
Fri, 13 Dec 2024 15:36:45 +0000 (15:36 +0000)
To support writing/reading e.g. /proc/sys/net/mpls/conf/eth0/input .

src/basic/sysctl-util.c

index 2feb4917d738ac2145238a1d6a25ae2d04a42ff7..da6e4c58d431daaeb1af0fae5db8e211f6c88f1b 100644 (file)
@@ -115,22 +115,29 @@ int sysctl_writef(const char *property, const char *format, ...) {
         return sysctl_write(property, v);
 }
 
+static const char* af_to_sysctl_dir(int af) {
+        if (af == AF_MPLS)
+                return "mpls";
+
+        return af_to_ipv4_ipv6(af);
+}
+
 int sysctl_write_ip_property(int af, const char *ifname, const char *property, const char *value, Hashmap **shadow) {
         const char *p;
 
         assert(property);
         assert(value);
 
-        if (!IN_SET(af, AF_INET, AF_INET6))
+        if (!IN_SET(af, AF_INET, AF_INET6, AF_MPLS))
                 return -EAFNOSUPPORT;
 
         if (ifname) {
                 if (!ifname_valid_full(ifname, IFNAME_VALID_SPECIAL))
                         return -EINVAL;
 
-                p = strjoina("net/", af_to_ipv4_ipv6(af), "/conf/", ifname, "/", property);
+                p = strjoina("net/", af_to_sysctl_dir(af), "/conf/", ifname, "/", property);
         } else
-                p = strjoina("net/", af_to_ipv4_ipv6(af), "/", property);
+                p = strjoina("net/", af_to_sysctl_dir(af), "/", property);
 
         return sysctl_write_full(p, value, shadow);
 }
@@ -181,16 +188,16 @@ int sysctl_read_ip_property(int af, const char *ifname, const char *property, ch
 
         assert(property);
 
-        if (!IN_SET(af, AF_INET, AF_INET6))
+        if (!IN_SET(af, AF_INET, AF_INET6, AF_MPLS))
                 return -EAFNOSUPPORT;
 
         if (ifname) {
                 if (!ifname_valid_full(ifname, IFNAME_VALID_SPECIAL))
                         return -EINVAL;
 
-                p = strjoina("net/", af_to_ipv4_ipv6(af), "/conf/", ifname, "/", property);
+                p = strjoina("net/", af_to_sysctl_dir(af), "/conf/", ifname, "/", property);
         } else
-                p = strjoina("net/", af_to_ipv4_ipv6(af), "/", property);
+                p = strjoina("net/", af_to_sysctl_dir(af), "/", property);
 
         return sysctl_read(p, ret);
 }