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:
parent
cedfe0b02b
commit
0667a0c497
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user