From 480761a3bdaa55bf8c966e4dab950ebf84775863 Mon Sep 17 00:00:00 2001 From: Quentin Armitage Date: Fri, 9 Aug 2013 12:26:33 +0100 Subject: Add specifying protocol for bitmap:port Signed-off-by: Jozsef Kadlecsik --- lib/parse.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'lib/parse.c') diff --git a/lib/parse.c b/lib/parse.c index ce3548d..112b273 100644 --- a/lib/parse.c +++ b/lib/parse.c @@ -636,6 +636,44 @@ error: return err; } +/** + * ipset_parse_tcp_udp_port - parse (optional) protocol and a single port + * @session: session structure + * @opt: option kind of the data + * @str: string to parse + * + * Parse string as a protocol and port, separated by a colon. + * The protocol part is optional, but may only be "tcp" or "udp". + * The parsed port numbers are stored in the data + * blob of the session. + * + * Returns 0 on success or a negative error code. + */ +int +ipset_parse_tcp_udp_port(struct ipset_session *session, + enum ipset_opt opt, const char *str) +{ + struct ipset_data *data; + int err = 0; + uint8_t p = 0; + + err = ipset_parse_proto_port(session, opt, str); + + if (!err) { + data = ipset_session_data(session); + + p = *(const uint8_t *) ipset_data_get(data, IPSET_OPT_PROTO); + if (p != IPPROTO_TCP && p != IPPROTO_UDP) { + syntax_err("Only protocols TCP and UDP are valid"); + err = -1 ; + } else { + /* Reset the protocol to none */ + ipset_data_flags_unset(data, IPSET_FLAG(IPSET_OPT_PROTO)); + } + } + return err; +} + /** * ipset_parse_family - parse INET|INET6 family names * @session: session structure -- cgit v1.2.3