diff --git a/src/shared/sysctl-util.c b/src/shared/sysctl-util.c index 82f557eb31..9be4055b37 100644 --- a/src/shared/sysctl-util.c +++ b/src/shared/sysctl-util.c @@ -85,3 +85,25 @@ int sysctl_read(const char *property, char **content) { p = strjoina("/proc/sys/", property); return read_full_file(p, content, NULL); } + +int sysctl_read_ip_property(int af, const char *ifname, const char *property, char **ret) { + _cleanup_free_ char *value = NULL; + const char *p; + int r; + + assert(IN_SET(af, AF_INET, AF_INET6)); + assert(property); + + p = strjoina("/proc/sys/net/ipv", af == AF_INET ? "4" : "6", + ifname ? "/conf/" : "", strempty(ifname), + property[0] == '/' ? "" : "/", property); + + r = read_one_line_file(p, &value); + if (r < 0) + return r; + + if (ret) + *ret = TAKE_PTR(value); + + return r; +} diff --git a/src/shared/sysctl-util.h b/src/shared/sysctl-util.h index 940118c258..d50c6e4381 100644 --- a/src/shared/sysctl-util.h +++ b/src/shared/sysctl-util.h @@ -12,6 +12,7 @@ char *sysctl_normalize(char *s); int sysctl_read(const char *property, char **value); int sysctl_write(const char *property, const char *value); +int sysctl_read_ip_property(int af, const char *ifname, const char *property, char **ret); int sysctl_write_ip_property(int af, const char *ifname, const char *property, const char *value); static inline int sysctl_write_ip_property_boolean(int af, const char *ifname, const char *property, bool value) { return sysctl_write_ip_property(af, ifname, property, one_zero(value));