]>
git.proxmox.com Git - mirror_frr.git/blob - lib/command_match.c
3 #include "command_match.h"
6 match_command (struct graph_node
*start
, enum filter_type filter
, const char *input
)
13 #define IPV4_ADDR_STR "0123456789."
14 #define IPV4_PREFIX_STR "0123456789./"
17 cmd_ipv4_match (const char *str
)
19 struct sockaddr_in sin_dummy
;
24 if (strspn (str
, IPV4_ADDR_STR
) != strlen (str
))
27 if (inet_pton(AF_INET
, str
, &sin_dummy
.sin_addr
) != 1)
34 cmd_ipv4_prefix_match (const char *str
)
36 struct sockaddr_in sin_dummy
;
37 const char *delim
= "/\0";
38 char *dupe
, *prefix
, *mask
, *context
, *endptr
;
44 if (strspn (str
, IPV4_PREFIX_STR
) != strlen (str
))
47 /* tokenize to address + mask */
48 dupe
= XMALLOC(MTYPE_TMP
, strlen(str
)+1);
49 strncpy(dupe
, str
, strlen(str
)+1);
50 prefix
= strtok_r(dupe
, delim
, &context
);
51 mask
= strtok_r(NULL
, delim
, &context
);
57 if (inet_pton(AF_INET
, prefix
, &sin_dummy
.sin_addr
) != 1)
61 nmask
= strtol (mask
, &endptr
, 10);
62 if (*endptr
!= '\0' || nmask
< 0 || nmask
> 32)
65 XFREE(MTYPE_TMP
, dupe
);
70 #define IPV6_ADDR_STR "0123456789abcdefABCDEF:."
71 #define IPV6_PREFIX_STR "0123456789abcdefABCDEF:./"
75 cmd_ipv6_match (const char *str
)
77 struct sockaddr_in6 sin6_dummy
;
83 if (strspn (str
, IPV6_ADDR_STR
) != strlen (str
))
86 ret
= inet_pton(AF_INET6
, str
, &sin6_dummy
.sin6_addr
);
95 cmd_ipv6_prefix_match (const char *str
)
97 struct sockaddr_in6 sin6_dummy
;
98 const char *delim
= "/\0";
99 char *dupe
, *prefix
, *mask
, *context
, *endptr
;
105 if (strspn (str
, IPV6_PREFIX_STR
) != strlen (str
))
108 /* tokenize to address + mask */
109 dupe
= XMALLOC(MTYPE_TMP
, strlen(str
)+1);
110 strncpy(dupe
, str
, strlen(str
)+1);
111 prefix
= strtok_r(dupe
, delim
, &context
);
112 mask
= strtok_r(NULL
, delim
, &context
);
117 /* validate prefix */
118 if (inet_pton(AF_INET6
, prefix
, &sin6_dummy
.sin6_addr
) != 1)
122 nmask
= strtol (mask
, &endptr
, 10);
123 if (*endptr
!= '\0' || nmask
< 0 || nmask
> 128)
126 XFREE(MTYPE_TMP
, dupe
);
133 cmd_range_match (struct graph_node
*rangenode
, const char *str
)
136 signed long long val
;
141 val
= strtoll (str
, &endptr
, 10);
146 if (val
< rangenode
->min
|| val
> rangenode
->max
)
153 cmd_word_match(struct graph_node
*wordnode
,
154 enum filter_type filter
,
157 if (filter
== FILTER_RELAXED
)
158 if (!word
|| !strlen(word
))
164 if (filter
== FILTER_RELAXED
&& !strncmp(wordnode
->text
, word
, strlen(word
)))
166 if (!strcmp(wordnode
->text
, word
))
170 if (filter
== FILTER_STRICT
&& !strcmp(wordnode
->text
, word
))