Mercurial > hg > freeDiameter
annotate extensions/rt_ereg/rtereg_conf.y @ 1338:f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Written for Effortel Technologies SA, published with their consent.
author | Thomas Klausner <tk@giga.or.at> |
---|---|
date | Tue, 09 Apr 2019 15:48:45 +0200 |
parents | 1af09cc156d6 |
children | fedc9eea70bc |
rev | line source |
---|---|
525 | 1 /********************************************************************************************************* |
2 * Software License Agreement (BSD License) * | |
740
4a9f08d6b6ba
Updated my mail address
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
525
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
525 | 4 * * |
1127
1af09cc156d6
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
974
diff
changeset
|
5 * Copyright (c) 2013, WIDE Project and NICT * |
525 | 6 * All rights reserved. * |
7 * * | |
8 * Redistribution and use of this software in source and binary forms, with or without modification, are * | |
9 * permitted provided that the following conditions are met: * | |
10 * * | |
11 * * Redistributions of source code must retain the above * | |
12 * copyright notice, this list of conditions and the * | |
13 * following disclaimer. * | |
14 * * | |
15 * * Redistributions in binary form must reproduce the above * | |
16 * copyright notice, this list of conditions and the * | |
17 * following disclaimer in the documentation and/or other * | |
18 * materials provided with the distribution. * | |
19 * * | |
20 * * Neither the name of the WIDE Project or NICT nor the * | |
21 * names of its contributors may be used to endorse or * | |
22 * promote products derived from this software without * | |
23 * specific prior written permission of WIDE Project and * | |
24 * NICT. * | |
25 * * | |
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * | |
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * | |
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * | |
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * | |
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * | |
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * | |
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * | |
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * | |
34 *********************************************************************************************************/ | |
35 | |
36 /* Yacc extension's configuration parser. | |
37 */ | |
38 | |
39 /* For development only : */ | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
40 %debug |
525 | 41 %error-verbose |
42 | |
43 /* The parser receives the configuration file filename as parameter */ | |
44 %parse-param {char * conffile} | |
45 | |
46 /* Keep track of location */ | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
47 %locations |
525 | 48 %pure-parser |
49 | |
50 %{ | |
51 #include "rtereg.h" | |
52 #include "rtereg_conf.tab.h" /* bison is not smart enough to define the YYLTYPE before including this code, so... */ | |
53 | |
54 /* Forward declaration */ | |
55 int yyparse(char * conffile); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
56 void rtereg_confrestart(FILE *input_file); |
525 | 57 |
58 /* Parse the configuration file */ | |
59 int rtereg_conf_handle(char * conffile) | |
60 { | |
61 extern FILE * rtereg_confin; | |
62 int ret; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
63 |
525 | 64 TRACE_ENTRY("%p", conffile); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
65 |
525 | 66 TRACE_DEBUG (FULL, "Parsing configuration file: %s...", conffile); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
67 |
525 | 68 rtereg_confin = fopen(conffile, "r"); |
69 if (rtereg_confin == NULL) { | |
70 ret = errno; | |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
71 fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret)); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
72 TRACE_DEBUG (INFO, "rt_ereg: error occurred, message logged -- configuration file."); |
525 | 73 return ret; |
74 } | |
75 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
76 rtereg_confrestart(rtereg_confin); |
525 | 77 ret = yyparse(conffile); |
78 | |
79 fclose(rtereg_confin); | |
80 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
81 if (rtereg_conf[rtereg_conf_size-1].finished == 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
82 TRACE_DEBUG(INFO, "rt_ereg: configuration invalid, AVP ended without OCTETSTRING AVP"); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
83 return EINVAL; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
84 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
85 |
525 | 86 if (ret != 0) { |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
87 TRACE_DEBUG(INFO, "rt_ereg: unable to parse the configuration file."); |
525 | 88 return EINVAL; |
89 } else { | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
90 int i, sum = 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
91 for (i=0; i<rtereg_conf_size; i++) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
92 sum += rtereg_conf[i].rules_nb; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
93 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
94 TRACE_DEBUG(FULL, "[rt-ereg] Added %d rules successfully.", sum); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
95 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
96 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
97 return 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
98 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
99 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
100 int avp_add(const char *name) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
101 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
102 void *ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
103 int level; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
104 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
105 if (rtereg_conf[rtereg_conf_size-1].finished) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
106 if ((ret = realloc(rtereg_conf, sizeof(*rtereg_conf)*(rtereg_conf_size+1))) == NULL) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
107 TRACE_DEBUG(INFO, "rt_ereg: realloc failed"); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
108 return -1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
109 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
110 rtereg_conf_size++; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
111 rtereg_conf = ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
112 memset(&rtereg_conf[rtereg_conf_size-1], 0, sizeof(*rtereg_conf)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
113 TRACE_DEBUG(INFO, "rt_ereg: New AVP group found starting with %s", name); |
525 | 114 } |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
115 level = rtereg_conf[rtereg_conf_size-1].level + 1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
116 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
117 if ((ret = realloc(rtereg_conf[rtereg_conf_size-1].avps, sizeof(*rtereg_conf[rtereg_conf_size-1].avps)*level)) == NULL) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
118 TRACE_DEBUG(INFO, "rt_ereg: realloc failed"); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
119 return -1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
120 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
121 rtereg_conf[rtereg_conf_size-1].avps = ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
122 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
123 CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, name, &rtereg_conf[rtereg_conf_size-1].avps[level-1], ENOENT ), |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
124 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
125 TRACE_DEBUG(INFO, "rt_ereg: Unable to find '%s' AVP in the loaded dictionaries.", name); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
126 return -1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
127 } ); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
128 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
129 /* Now check the type */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
130 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
131 struct dict_avp_data data; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
132 CHECK_FCT( fd_dict_getval( rtereg_conf[rtereg_conf_size-1].avps[level-1], &data) ); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
133 if (data.avp_basetype == AVP_TYPE_OCTETSTRING) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
134 rtereg_conf[rtereg_conf_size-1].finished = 1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
135 } else if (data.avp_basetype != AVP_TYPE_GROUPED) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
136 TRACE_DEBUG(INFO, "rt_ereg: '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
137 return -1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
138 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
139 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
140 rtereg_conf[rtereg_conf_size-1].level = level; |
525 | 141 return 0; |
142 } | |
143 | |
144 /* The Lex parser prototype */ | |
145 int rtereg_conflex(YYSTYPE *lvalp, YYLTYPE *llocp); | |
146 | |
147 /* Function to report the errors */ | |
148 void yyerror (YYLTYPE *ploc, char * conffile, char const *s) | |
149 { | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
150 TRACE_DEBUG(INFO, "rt_ereg: error in configuration parsing"); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
151 |
525 | 152 if (ploc->first_line != ploc->last_line) |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
153 fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); |
525 | 154 else if (ploc->first_column != ploc->last_column) |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
155 fd_log_debug("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); |
525 | 156 else |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
157 fd_log_debug("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s); |
525 | 158 } |
159 | |
160 %} | |
161 | |
162 /* Values returned by lex for token */ | |
163 %union { | |
164 char *string; /* The string is allocated by strdup in lex.*/ | |
165 int integer; | |
166 } | |
167 | |
168 /* In case of error in the lexical analysis */ | |
169 %token LEX_ERROR | |
170 | |
171 /* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ | |
172 %token <string> QSTRING | |
173 %token <integer> INTEGER | |
174 | |
175 /* Tokens */ | |
176 %token AVP | |
177 | |
178 | |
179 /* -------------------------------------- */ | |
180 %% | |
181 | |
182 /* The grammar definition */ | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
183 conffile: avp rules |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
184 | conffile avp rules |
525 | 185 ; |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
186 |
525 | 187 /* a server entry */ |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
188 avp: AVP '=' avp_part ';' |
525 | 189 ; |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
190 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
191 avp_part: avp_part ':' QSTRING { if (avp_add($3) < 0) { YYERROR; } } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
192 | QSTRING { if (avp_add($1) < 0) { YYERROR; } } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
193 ; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
194 |
525 | 195 rules: /* empty OK */ |
196 | rules rule | |
197 ; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
198 |
525 | 199 rule: QSTRING ':' QSTRING '+' '=' INTEGER ';' |
200 { | |
201 struct rtereg_rule * new; | |
202 int err; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
203 |
525 | 204 /* Add new rule in the array */ |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
205 rtereg_conf[rtereg_conf_size-1].rules_nb += 1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
206 CHECK_MALLOC_DO(rtereg_conf[rtereg_conf_size-1].rules = realloc(rtereg_conf[rtereg_conf_size-1].rules, rtereg_conf[rtereg_conf_size-1].rules_nb * sizeof(struct rtereg_rule)), |
525 | 207 { |
208 yyerror (&yylloc, conffile, "Not enough memory to store the configuration..."); | |
209 YYERROR; | |
210 } ); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
211 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
212 new = &rtereg_conf[rtereg_conf_size-1].rules[rtereg_conf[rtereg_conf_size-1].rules_nb - 1]; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
213 |
525 | 214 new->pattern = $1; |
215 new->server = $3; | |
216 new->score = $6; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
217 |
525 | 218 /* Attempt to compile the regex */ |
219 CHECK_FCT_DO( err=regcomp(&new->preg, new->pattern, REG_EXTENDED | REG_NOSUB), | |
220 { | |
221 char * buf; | |
222 size_t bl; | |
223 | |
224 /* Error while compiling the regex */ | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
225 TRACE_DEBUG(INFO, "rt_ereg: error while compiling the regular expression '%s':", new->pattern); |
525 | 226 |
227 /* Get the error message size */ | |
228 bl = regerror(err, &new->preg, NULL, 0); | |
229 | |
230 /* Alloc the buffer for error message */ | |
231 CHECK_MALLOC( buf = malloc(bl) ); | |
232 | |
233 /* Get the error message content */ | |
234 regerror(err, &new->preg, buf, bl); | |
235 TRACE_DEBUG(INFO, "\t%s", buf); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
236 |
525 | 237 /* Free the buffer, return the error */ |
238 free(buf); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
239 |
525 | 240 yyerror (&yylloc, conffile, "Invalid regular expression."); |
241 YYERROR; | |
242 } ); | |
243 } | |
244 ; |