]>
Commit | Line | Data |
---|---|---|
718e3744 | 1 | /* AS regular expression routine |
896014f4 DL |
2 | * Copyright (C) 1999 Kunihiro Ishiguro |
3 | * | |
4 | * This file is part of GNU Zebra. | |
5 | * | |
6 | * GNU Zebra is free software; you can redistribute it and/or modify it | |
7 | * under the terms of the GNU General Public License as published by the | |
8 | * Free Software Foundation; either version 2, or (at your option) any | |
9 | * later version. | |
10 | * | |
11 | * GNU Zebra is distributed in the hope that it will be useful, but | |
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | * General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License along | |
17 | * with this program; see the file COPYING; if not, write to the Free Software | |
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
19 | */ | |
718e3744 | 20 | |
21 | #include <zebra.h> | |
22 | ||
23 | #include "log.h" | |
24 | #include "command.h" | |
25 | #include "memory.h" | |
3f9c7369 | 26 | #include "queue.h" |
039f3a34 | 27 | #include "filter.h" |
718e3744 | 28 | |
29 | #include "bgpd.h" | |
30 | #include "bgp_aspath.h" | |
31 | #include "bgp_regex.h" | |
32 | ||
33 | /* Character `_' has special mean. It represents [,{}() ] and the | |
d62a17ae | 34 | beginning of the line(^) and the end of the line ($). |
718e3744 | 35 | |
36 | (^|[,{}() ]|$) */ | |
37 | ||
d62a17ae | 38 | regex_t *bgp_regcomp(const char *regstr) |
718e3744 | 39 | { |
d62a17ae | 40 | /* Convert _ character to generic regular expression. */ |
41 | int i, j; | |
42 | int len; | |
43 | int magic = 0; | |
44 | char *magic_str; | |
45 | char magic_regexp[] = "(^|[,{}() ]|$)"; | |
46 | int ret; | |
47 | regex_t *regex; | |
48 | ||
49 | len = strlen(regstr); | |
50 | for (i = 0; i < len; i++) | |
51 | if (regstr[i] == '_') | |
52 | magic++; | |
53 | ||
54 | magic_str = XMALLOC(MTYPE_TMP, len + (14 * magic) + 1); | |
55 | ||
56 | for (i = 0, j = 0; i < len; i++) { | |
57 | if (regstr[i] == '_') { | |
58 | memcpy(magic_str + j, magic_regexp, | |
59 | strlen(magic_regexp)); | |
60 | j += strlen(magic_regexp); | |
61 | } else | |
62 | magic_str[j++] = regstr[i]; | |
718e3744 | 63 | } |
d62a17ae | 64 | magic_str[j] = '\0'; |
718e3744 | 65 | |
d62a17ae | 66 | regex = XMALLOC(MTYPE_BGP_REGEXP, sizeof(regex_t)); |
718e3744 | 67 | |
d62a17ae | 68 | ret = regcomp(regex, magic_str, REG_EXTENDED | REG_NOSUB); |
718e3744 | 69 | |
d62a17ae | 70 | XFREE(MTYPE_TMP, magic_str); |
718e3744 | 71 | |
d62a17ae | 72 | if (ret != 0) { |
73 | XFREE(MTYPE_BGP_REGEXP, regex); | |
74 | return NULL; | |
75 | } | |
718e3744 | 76 | |
d62a17ae | 77 | return regex; |
718e3744 | 78 | } |
79 | ||
d62a17ae | 80 | int bgp_regexec(regex_t *regex, struct aspath *aspath) |
718e3744 | 81 | { |
d62a17ae | 82 | return regexec(regex, aspath->str, 0, NULL, 0); |
718e3744 | 83 | } |
84 | ||
d62a17ae | 85 | void bgp_regex_free(regex_t *regex) |
718e3744 | 86 | { |
d62a17ae | 87 | regfree(regex); |
88 | XFREE(MTYPE_BGP_REGEXP, regex); | |
718e3744 | 89 | } |