diff options
author | Jan Engelhardt <jengelh@medozas.de> | 2008-02-14 04:23:04 +0100 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2008-04-14 08:56:58 +0200 |
commit | 23545c2a7a31c68c1e49c7c901b632c2f1c59968 (patch) | |
tree | f8573e27cc0839f96f38c7c6572fce57aa20b2c9 /xtables.c | |
parent | bce1c2159f8d24479e994a22561c0f97df4aec4d (diff) |
Implement AF_UNSPEC as a wildcard for extensions
Diffstat (limited to 'xtables.c')
-rw-r--r-- | xtables.c | 22 |
1 files changed, 16 insertions, 6 deletions
@@ -557,12 +557,13 @@ void xtables_register_match(struct xtables_match *me) } /* ignore not interested match */ - if (me->family != afinfo.family) + if (me->family != afinfo.family && me->family != AF_UNSPEC) return; old = find_match(me->name, DURING_LOAD, NULL); if (old) { - if (old->revision == me->revision) { + if (old->revision == me->revision && + old->family == me->family) { fprintf(stderr, "%s: match `%s' already registered.\n", program_name, me->name); @@ -574,10 +575,14 @@ void xtables_register_match(struct xtables_match *me) && old->revision > me->revision) return; - /* Replace if compatible. */ + /* See if new match can be used. */ if (!compatible_match_revision(me->name, me->revision)) return; + /* Prefer !AF_UNSPEC over AF_UNSPEC for same revision. */ + if (old->revision == me->revision && me->family == AF_UNSPEC) + return; + /* Delete old one. */ for (i = &xtables_matches; *i!=old; i = &(*i)->next); *i = old->next; @@ -623,14 +628,15 @@ void xtables_register_target(struct xtables_target *me) } /* ignore not interested target */ - if (me->family != afinfo.family) + if (me->family != afinfo.family && me->family != AF_UNSPEC) return; old = find_target(me->name, DURING_LOAD); if (old) { struct xtables_target **i; - if (old->revision == me->revision) { + if (old->revision == me->revision && + old->family == me->family) { fprintf(stderr, "%s: target `%s' already registered.\n", program_name, me->name); @@ -642,10 +648,14 @@ void xtables_register_target(struct xtables_target *me) && old->revision > me->revision) return; - /* Replace if compatible. */ + /* See if new target can be used. */ if (!compatible_target_revision(me->name, me->revision)) return; + /* Prefer !AF_UNSPEC over AF_UNSPEC for same revision. */ + if (old->revision == me->revision && me->family == AF_UNSPEC) + return; + /* Delete old one. */ for (i = &xtables_targets; *i!=old; i = &(*i)->next); *i = old->next; |