diff options
author | Jan Engelhardt <jengelh@medozas.de> | 2011-02-07 03:05:49 +0100 |
---|---|---|
committer | Jan Engelhardt <jengelh@medozas.de> | 2011-02-07 03:05:49 +0100 |
commit | f6992cbb211a42f776333fe65dfad49f17455a3f (patch) | |
tree | 92f7775b3b8b8d8b7fda61cddb5e4974d4221773 /xshared.c | |
parent | 7a548b32d9ad8d6e4a8398573d4fa8c4e4a1f9e0 (diff) |
src: deduplicate find_proto function
Signed-off-by: Jan Engelhardt <jengelh@medozas.de>
Diffstat (limited to 'xshared.c')
-rw-r--r-- | xshared.c | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -1,3 +1,5 @@ +#include <netdb.h> +#include <stdint.h> #include <stdio.h> #include <xtables.h> #include "xshared.h" @@ -29,3 +31,38 @@ void print_extension_helps(const struct xtables_target *t, m->match->help(); } } + +const char * +proto_to_name(uint8_t proto, int nolookup) +{ + unsigned int i; + + if (proto && !nolookup) { + struct protoent *pent = getprotobynumber(proto); + if (pent) + return pent->p_name; + } + + for (i = 0; xtables_chain_protos[i].name != NULL; ++i) + if (xtables_chain_protos[i].num == proto) + return xtables_chain_protos[i].name; + + return NULL; +} + +struct xtables_match * +find_proto(const char *pname, enum xtables_tryload tryload, + int nolookup, struct xtables_rule_match **matches) +{ + unsigned int proto; + + if (xtables_strtoui(pname, NULL, &proto, 0, UINT8_MAX)) { + const char *protoname = proto_to_name(proto, nolookup); + + if (protoname) + return xtables_find_match(protoname, tryload, matches); + } else + return xtables_find_match(pname, tryload, matches); + + return NULL; +} |