util: introduce parse_ip_protocol()

Not only protocol name in lower case, but it optionally accepts
IP protocol name in upper case and IP protocol number.
This commit is contained in:
Yu Watanabe 2018-11-29 16:09:30 +01:00
parent cedfe0b02b
commit 0667a0c497
2 changed files with 33 additions and 1 deletions

View File

@ -2,9 +2,11 @@
#include <errno.h>
#include <netinet/in.h>
#include <string.h>
#include "alloc-util.h"
#include "ip-protocol-list.h"
#include "parse-util.h"
#include "string-util.h"
#include "macro.h"
static const struct ip_protocol_name* lookup_ip_protocol(register const char *str, register GPERF_LEN_TYPE len);
@ -34,3 +36,32 @@ int ip_protocol_from_name(const char *name) {
return sc->id;
}
int parse_ip_protocol(const char *s) {
_cleanup_free_ char *str = NULL;
int i, r;
assert(s);
if (isempty(s))
return IPPROTO_IP;
/* Do not use strdupa() here, as the input string may come from *
* command line or config files. */
str = strdup(s);
if (!str)
return -ENOMEM;
i = ip_protocol_from_name(ascii_strlower(str));
if (i >= 0)
return i;
r = safe_atoi(str, &i);
if (r < 0)
return r;
if (!ip_protocol_to_name(i))
return -EINVAL;
return i;
}

View File

@ -3,3 +3,4 @@
const char *ip_protocol_to_name(int id);
int ip_protocol_from_name(const char *name);
int parse_ip_protocol(const char *s);