Mercurial > hg > freeDiameter
annotate extensions/rt_ereg/rtereg_conf.y @ 1554:566bb46cc73f
Updated copyright information
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Tue, 06 Oct 2020 21:34:53 +0800 |
parents | d70f5f6cb306 |
children |
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 * * |
1554
566bb46cc73f
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1387
diff
changeset
|
5 * Copyright (c) 2019, 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 |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
64 LOG_D("[rt_ereg] 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
|
65 |
525 | 66 rtereg_confin = fopen(conffile, "r"); |
67 if (rtereg_confin == NULL) { | |
68 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
|
69 fd_log_debug("Unable to open extension configuration file %s for reading: %s", conffile, strerror(ret)); |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
70 LOG_E("[rt_ereg] error occurred, message logged -- configuration file."); |
525 | 71 return ret; |
72 } | |
73 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
74 rtereg_confrestart(rtereg_confin); |
525 | 75 ret = yyparse(conffile); |
76 | |
77 fclose(rtereg_confin); | |
78 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
79 if (rtereg_conf[rtereg_conf_size-1].finished == 0) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
80 LOG_E("[rt_ereg] configuration invalid, AVP ended without OCTETSTRING AVP"); |
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 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
|
82 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
83 |
525 | 84 if (ret != 0) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
85 LOG_E("[rt_ereg] unable to parse the configuration file."); |
525 | 86 return EINVAL; |
87 } 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
|
88 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
|
89 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
|
90 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
|
91 } |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
92 LOG_D("[rt-ereg] Added %d rules successfully.", sum); |
1338
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 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
95 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
|
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 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
98 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
|
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 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
|
101 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
|
102 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
103 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
|
104 if ((ret = realloc(rtereg_conf, sizeof(*rtereg_conf)*(rtereg_conf_size+1))) == NULL) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
105 LOG_E("[rt_ereg] realloc failed"); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
106 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
|
107 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
108 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
|
109 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
|
110 memset(&rtereg_conf[rtereg_conf_size-1], 0, sizeof(*rtereg_conf)); |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
111 LOG_D("[rt_ereg] New AVP group found starting with %s", name); |
525 | 112 } |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
113 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
|
114 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
115 if ((ret = realloc(rtereg_conf[rtereg_conf_size-1].avps, sizeof(*rtereg_conf[rtereg_conf_size-1].avps)*level)) == NULL) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
116 LOG_E("[rt_ereg] realloc failed"); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
117 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
|
118 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
119 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
|
120 |
1342
fedc9eea70bc
rt_ereg: allow AVPs from all vendors
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
121 CHECK_FCT_DO( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &rtereg_conf[rtereg_conf_size-1].avps[level-1], ENOENT ), |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
122 { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
123 LOG_E("[rt_ereg] Unable to find '%s' AVP in the loaded dictionaries.", name); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
124 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
|
125 } ); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
126 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
127 /* 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
|
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 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
|
130 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
|
131 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
|
132 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
|
133 } else if (data.avp_basetype != AVP_TYPE_GROUPED) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
134 LOG_E("[rt_ereg] '%s' AVP is not an OCTETSTRING nor GROUPED AVP (%d).", name, data.avp_basetype); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
135 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
|
136 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
137 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
138 rtereg_conf[rtereg_conf_size-1].level = level; |
525 | 139 return 0; |
140 } | |
141 | |
142 /* The Lex parser prototype */ | |
143 int rtereg_conflex(YYSTYPE *lvalp, YYLTYPE *llocp); | |
144 | |
145 /* Function to report the errors */ | |
146 void yyerror (YYLTYPE *ploc, char * conffile, char const *s) | |
147 { | |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
148 LOG_E("[rt_ereg] error in configuration parsing"); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
149 |
525 | 150 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
|
151 fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s); |
525 | 152 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
|
153 fd_log_debug("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s); |
525 | 154 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
|
155 fd_log_debug("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s); |
525 | 156 } |
157 | |
158 %} | |
159 | |
160 /* Values returned by lex for token */ | |
161 %union { | |
162 char *string; /* The string is allocated by strdup in lex.*/ | |
163 int integer; | |
164 } | |
165 | |
166 /* In case of error in the lexical analysis */ | |
167 %token LEX_ERROR | |
168 | |
169 /* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */ | |
170 %token <string> QSTRING | |
171 %token <integer> INTEGER | |
172 | |
173 /* Tokens */ | |
174 %token AVP | |
175 | |
176 | |
177 /* -------------------------------------- */ | |
178 %% | |
179 | |
180 /* 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
|
181 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
|
182 | conffile avp rules |
525 | 183 ; |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
184 |
525 | 185 /* 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
|
186 avp: AVP '=' avp_part ';' |
525 | 187 ; |
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 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
189 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
|
190 | 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
|
191 ; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
192 |
525 | 193 rules: /* empty OK */ |
194 | rules rule | |
195 ; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
196 |
525 | 197 rule: QSTRING ':' QSTRING '+' '=' INTEGER ';' |
198 { | |
199 struct rtereg_rule * new; | |
200 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
|
201 |
525 | 202 /* 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
|
203 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
|
204 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 | 205 { |
206 yyerror (&yylloc, conffile, "Not enough memory to store the configuration..."); | |
207 YYERROR; | |
208 } ); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
209 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1127
diff
changeset
|
210 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
|
211 |
525 | 212 new->pattern = $1; |
213 new->server = $3; | |
214 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
|
215 |
525 | 216 /* Attempt to compile the regex */ |
217 CHECK_FCT_DO( err=regcomp(&new->preg, new->pattern, REG_EXTENDED | REG_NOSUB), | |
218 { | |
219 char * buf; | |
220 size_t bl; | |
221 | |
222 /* Error while compiling the regex */ | |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
223 LOG_E("[rt_ereg] error while compiling the regular expression '%s':", new->pattern); |
525 | 224 |
225 /* Get the error message size */ | |
226 bl = regerror(err, &new->preg, NULL, 0); | |
227 | |
228 /* Alloc the buffer for error message */ | |
229 CHECK_MALLOC( buf = malloc(bl) ); | |
230 | |
231 /* Get the error message content */ | |
232 regerror(err, &new->preg, buf, bl); | |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1342
diff
changeset
|
233 LOG_E("\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
|
234 |
525 | 235 /* Free the buffer, return the error */ |
236 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
|
237 |
525 | 238 yyerror (&yylloc, conffile, "Invalid regular expression."); |
239 YYERROR; | |
240 } ); | |
241 } | |
242 ; |