summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2019-08-04 05:16:43 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2019-08-16 22:02:17 +0900
commit01fc8e4f4337752558a53d22303177dc1d966e4f (patch)
tree630505b9cf0a61188454ade71f2e1901a9470306
parent2d79289525ce2a85c22c6be6290f876b96b1bc0a (diff)
downloadsystemd-01fc8e4f4337752558a53d22303177dc1d966e4f.tar.gz
network: split out copying logic from routing_policy_rule_add_internal()
-rw-r--r--src/network/networkd-routing-policy-rule.c71
1 files changed, 42 insertions, 29 deletions
diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c
index f6859f886f..1494727ead 100644
--- a/src/network/networkd-routing-policy-rule.c
+++ b/src/network/networkd-routing-policy-rule.c
@@ -58,6 +58,44 @@ void routing_policy_rule_free(RoutingPolicyRule *rule) {
free(rule);
}
+static int routing_policy_rule_copy(RoutingPolicyRule *dest, RoutingPolicyRule *src) {
+ _cleanup_free_ char *iif = NULL, *oif = NULL;
+
+ assert(dest);
+ assert(src);
+
+ if (src->iif) {
+ iif = strdup(src->iif);
+ if (!iif)
+ return -ENOMEM;
+ }
+
+ if (src->oif) {
+ oif = strdup(src->oif);
+ if (!oif)
+ return -ENOMEM;
+ }
+
+ dest->family = src->family;
+ dest->from = src->from;
+ dest->from_prefixlen = src->from_prefixlen;
+ dest->to = src->to;
+ dest->to_prefixlen = src->to_prefixlen;
+ dest->invert_rule = src->invert_rule;
+ dest->tos = src->tos;
+ dest->fwmark = src->fwmark;
+ dest->fwmask = src->fwmask;
+ dest->priority = src->priority;
+ dest->table = src->table;
+ dest->iif = TAKE_PTR(iif);
+ dest->oif = TAKE_PTR(oif);
+ dest->protocol = src->protocol;
+ dest->sport = src->sport;
+ dest->dport = src->dport;
+
+ return 0;
+}
+
static void routing_policy_rule_hash_func(const RoutingPolicyRule *rule, struct siphash *state) {
assert(rule);
@@ -221,46 +259,21 @@ int routing_policy_rule_make_local(Manager *m, RoutingPolicyRule *rule) {
static int routing_policy_rule_add_internal(Manager *m, Set **rules, RoutingPolicyRule *in, RoutingPolicyRule **ret) {
_cleanup_(routing_policy_rule_freep) RoutingPolicyRule *rule = NULL;
- _cleanup_free_ char *iif = NULL, *oif = NULL;
int r;
assert(m);
assert(rules);
assert(in);
- if (in->iif) {
- iif = strdup(in->iif);
- if (!iif)
- return -ENOMEM;
- }
-
- if (in->oif) {
- oif = strdup(in->oif);
- if (!oif)
- return -ENOMEM;
- }
-
r = routing_policy_rule_new(&rule);
if (r < 0)
return r;
rule->manager = m;
- rule->family = in->family;
- rule->from = in->from;
- rule->from_prefixlen = in->from_prefixlen;
- rule->to = in->to;
- rule->to_prefixlen = in->to_prefixlen;
- rule->invert_rule = in->invert_rule;
- rule->tos = in->tos;
- rule->fwmark = in->fwmark;
- rule->fwmask = in->fwmask;
- rule->priority = in->priority;
- rule->table = in->table;
- rule->iif = TAKE_PTR(iif);
- rule->oif = TAKE_PTR(oif);
- rule->protocol = in->protocol;
- rule->sport = in->sport;
- rule->dport = in->dport;
+
+ r = routing_policy_rule_copy(rule, in);
+ if (r < 0)
+ return r;
r = set_ensure_allocated(rules, &routing_policy_rule_hash_ops);
if (r < 0)