Mercurial > hg > freeDiameter
annotate extensions/rt_ereg/rtereg.c @ 1554:566bb46cc73f
Updated copyright information
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Tue, 06 Oct 2020 21:34:53 +0800 |
parents | c48725959e63 |
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:
584
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
525 | 4 * * |
1554
566bb46cc73f
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1546
diff
changeset
|
5 * Copyright (c) 2020, 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 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
36 /* |
525 | 37 * This extension allows to perform some pattern-matching on an AVP |
38 * and send the message to a server accordingly. | |
39 * See rt_ereg.conf.sample file for the format of the configuration file. | |
40 */ | |
41 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
42 #include <pthread.h> |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
43 #include <signal.h> |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
44 |
525 | 45 #include "rtereg.h" |
46 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
47 static pthread_rwlock_t rte_lock; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
48 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
49 #define MODULE_NAME "rt_ereg" |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
50 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
51 static char *rt_ereg_config_file; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
52 |
525 | 53 /* The configuration structure */ |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
54 struct rtereg_conf *rtereg_conf; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
55 int rtereg_conf_size; |
525 | 56 |
57 #ifndef HAVE_REG_STARTEND | |
58 static char * buf = NULL; | |
59 static size_t bufsz; | |
60 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; | |
61 #endif /* HAVE_REG_STARTEND */ | |
62 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
63 static int rtereg_init(void); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
64 static int rtereg_init_config(void); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
65 static void rtereg_fini(void); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
66 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
67 void rtereg_conf_free(struct rtereg_conf *config_struct, int config_size) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
68 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
69 int i, j; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
70 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
71 /* Destroy the data */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
72 for (j=0; j<config_size; j++) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
73 if (config_struct[j].rules) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
74 for (i = 0; i < config_struct[j].rules_nb; i++) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
75 free(config_struct[j].rules[i].pattern); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
76 free(config_struct[j].rules[i].server); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
77 regfree(&config_struct[j].rules[i].preg); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
78 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
79 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
80 free(config_struct[j].avps); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
81 free(config_struct[j].rules); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
82 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
83 free(config_struct); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
84 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
85 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
86 static int proceed(char * value, size_t len, struct fd_list * candidates, int conf) |
525 | 87 { |
88 int i; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
89 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
90 for (i = 0; i < rtereg_conf[conf].rules_nb; i++) { |
525 | 91 /* Does this pattern match the value? */ |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
92 struct rtereg_rule * r = &rtereg_conf[conf].rules[i]; |
525 | 93 int err = 0; |
94 struct fd_list * c; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
95 |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
96 LOG_D("[rt_ereg] attempting pattern matching of '%.*s' with rule '%s'", (int)len, value, r->pattern); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
97 |
525 | 98 #ifdef HAVE_REG_STARTEND |
99 { | |
100 regmatch_t pmatch[1]; | |
101 memset(pmatch, 0, sizeof(pmatch)); | |
102 pmatch[0].rm_so = 0; | |
103 pmatch[0].rm_eo = len; | |
104 err = regexec(&r->preg, value, 0, pmatch, REG_STARTEND); | |
105 } | |
106 #else /* HAVE_REG_STARTEND */ | |
107 { | |
108 /* We have a 0-terminated string */ | |
109 err = regexec(&r->preg, value, 0, NULL, 0); | |
110 } | |
111 #endif /* HAVE_REG_STARTEND */ | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
112 |
525 | 113 if (err == REG_NOMATCH) |
114 continue; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
115 |
525 | 116 if (err != 0) { |
117 char * errstr; | |
118 size_t bl; | |
119 | |
120 /* Error while compiling the regex */ | |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
121 LOG_E("[rt_ereg] error while executing the regular expression '%s':", r->pattern); |
525 | 122 |
123 /* Get the error message size */ | |
124 bl = regerror(err, &r->preg, NULL, 0); | |
125 | |
126 /* Alloc the buffer for error message */ | |
127 CHECK_MALLOC( errstr = malloc(bl) ); | |
128 | |
129 /* Get the error message content */ | |
130 regerror(err, &r->preg, errstr, bl); | |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
131 LOG_E("\t%s", errstr); |
525 | 132 |
133 /* Free the buffer, return the error */ | |
134 free(errstr); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
135 |
525 | 136 return (err == REG_ESPACE) ? ENOMEM : EINVAL; |
137 } | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
138 |
525 | 139 /* From this point, the expression matched the AVP value */ |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
140 LOG_D("[rt_ereg] Match: '%s' to value '%.*s' => '%s' += %d", r->pattern, (int)len, value, r->server, r->score); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
141 |
525 | 142 for (c = candidates->next; c != candidates; c = c->next) { |
143 struct rtd_candidate * cand = (struct rtd_candidate *)c; | |
144 | |
145 if (strcmp(r->server, cand->diamid) == 0) { | |
146 cand->score += r->score; | |
147 break; | |
148 } | |
149 } | |
150 }; | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
151 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
152 return 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
153 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
154 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
155 static int find_avp(msg_or_avp *where, int conf_index, int level, struct fd_list * candidates) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
156 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
157 struct dict_object *what; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
158 struct dict_avp_data dictdata; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
159 struct avp *nextavp = NULL; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
160 struct avp_hdr *avp_hdr = NULL; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
161 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
162 /* iterate over all AVPs and try to find a match */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
163 // for (i = 0; i<rtereg_conf[j].level; i++) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
164 if (level > rtereg_conf[conf_index].level) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
165 LOG_E("internal error, dug too deep"); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
166 return 1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
167 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
168 what = rtereg_conf[conf_index].avps[level]; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
169 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
170 CHECK_FCT(fd_dict_getval(what, &dictdata)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
171 CHECK_FCT(fd_msg_browse(where, MSG_BRW_FIRST_CHILD, (void *)&nextavp, NULL)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
172 while (nextavp) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
173 CHECK_FCT(fd_msg_avp_hdr(nextavp, &avp_hdr)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
174 if ((avp_hdr->avp_code == dictdata.avp_code) && (avp_hdr->avp_vendor == dictdata.avp_vendor)) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
175 if (level != rtereg_conf[conf_index].level - 1) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
176 LOG_D("[rt_ereg] found grouped AVP %d (vendor %d), digging deeper", avp_hdr->avp_code, avp_hdr->avp_vendor); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
177 CHECK_FCT(find_avp(nextavp, conf_index, level+1, candidates)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
178 } else { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
179 struct dictionary * dict; |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
180 LOG_D("[rt_ereg] found AVP %d (vendor %d)", avp_hdr->avp_code, avp_hdr->avp_vendor); |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
181 CHECK_FCT(fd_dict_getdict(what, &dict)); |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
182 CHECK_FCT_DO(fd_msg_parse_dict(nextavp, dict, NULL), /* nothing */); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
183 if (avp_hdr->avp_value != NULL) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
184 LOG_A("avp_hdr->avp_value NOT NULL, matching"); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
185 #ifndef HAVE_REG_STARTEND |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
186 int ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
187 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
188 /* Lock the buffer */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
189 CHECK_POSIX( pthread_mutex_lock(&mtx) ); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
190 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
191 /* Augment the buffer if needed */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
192 if (avp_hdr->avp_value->os.len >= bufsz) { |
1546
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
193 char *newbuf; |
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
194 CHECK_MALLOC_DO( newbuf = realloc(buf, avp_hdr->avp_value->os.len + 1), |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
195 { pthread_mutex_unlock(&mtx); return ENOMEM; } ); |
1546
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
196 /* Update buffer and buffer size */ |
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
197 buf = newbuf; |
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
198 bufsz = avp_hdr->avp_value->os.len + 1; |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
199 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
200 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
201 /* Copy the AVP value */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
202 memcpy(buf, avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
203 buf[avp_hdr->avp_value->os.len] = '\0'; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
204 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
205 /* Now apply the rules */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
206 ret = proceed(buf, avp_hdr->avp_value->os.len, candidates, conf_index); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
207 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
208 CHECK_POSIX(pthread_mutex_unlock(&mtx)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
209 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
210 CHECK_FCT(ret); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
211 #else /* HAVE_REG_STARTEND */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
212 CHECK_FCT( proceed((char *) avp_hdr->avp_value->os.data, avp_hdr->avp_value->os.len, candidates, conf_index) ); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
213 #endif /* HAVE_REG_STARTEND */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
214 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
215 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
216 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
217 CHECK_FCT(fd_msg_browse(nextavp, MSG_BRW_NEXT, (void *)&nextavp, NULL)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
218 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
219 |
525 | 220 return 0; |
221 } | |
222 | |
223 /* The callback called on new messages */ | |
1216
581bbd48524a
Change prototype of rt_out callbacks to allow disposal of messages
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
224 static int rtereg_out(void * cbdata, struct msg ** pmsg, struct fd_list * candidates) |
525 | 225 { |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
226 msg_or_avp *where; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
227 int j, ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
228 |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
229 LOG_A("[rt_ereg] rtereg_out arguments: %p %p %p", cbdata, *pmsg, candidates); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
230 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
231 CHECK_PARAMS(pmsg && *pmsg && candidates); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
232 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
233 if (pthread_rwlock_rdlock(&rte_lock) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
234 fd_log_notice("%s: read-lock failed, skipping handler", MODULE_NAME); |
525 | 235 return 0; |
236 } | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
237 ret = 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
238 /* Check if it is worth processing the message */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
239 if (!FD_IS_LIST_EMPTY(candidates)) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
240 /* Now search the AVPs in the message */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
241 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
242 for (j=0; j<rtereg_conf_size; j++) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
243 where = *pmsg; |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
244 LOG_D("[rt_ereg] iterating over AVP group %d", j); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
245 if ((ret=find_avp(where, j, 0, candidates)) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
246 break; |
525 | 247 } |
248 } | |
249 } | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
250 if (pthread_rwlock_unlock(&rte_lock) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
251 fd_log_notice("%s: read-unlock failed after rtereg_out, exiting", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
252 exit(1); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
253 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
254 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
255 return ret; |
525 | 256 } |
257 | |
258 /* handler */ | |
259 static struct fd_rt_out_hdl * rtereg_hdl = NULL; | |
260 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
261 static volatile int in_signal_handler = 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
262 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
263 /* signal handler */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
264 static void sig_hdlr(void) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
265 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
266 struct rtereg_conf *old_config; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
267 int old_config_size; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
268 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
269 if (in_signal_handler) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
270 fd_log_error("%s: already handling a signal, ignoring new one", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
271 return; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
272 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
273 in_signal_handler = 1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
274 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
275 if (pthread_rwlock_wrlock(&rte_lock) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
276 fd_log_error("%s: locking failed, aborting config reload", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
277 return; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
278 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
279 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
280 /* save old config in case reload goes wrong */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
281 old_config = rtereg_conf; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
282 old_config_size = rtereg_conf_size; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
283 rtereg_conf = NULL; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
284 rtereg_conf_size = 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
285 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
286 if (rtereg_init_config() != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
287 fd_log_notice("%s: error reloading configuration, restoring previous configuration", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
288 rtereg_conf = old_config; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
289 rtereg_conf_size = old_config_size; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
290 } else { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
291 rtereg_conf_free(old_config, old_config_size); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
292 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
293 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
294 if (pthread_rwlock_unlock(&rte_lock) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
295 fd_log_error("%s: unlocking failed after config reload, exiting", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
296 exit(1); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
297 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
298 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
299 fd_log_notice("%s: reloaded configuration, %d AVP group%s defined", MODULE_NAME, rtereg_conf_size, rtereg_conf_size != 1 ? "s" : ""); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
300 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
301 in_signal_handler = 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
302 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
303 |
525 | 304 /* entry point */ |
305 static int rtereg_entry(char * conffile) | |
306 { | |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
307 LOG_A("[rt_ereg] started with conffile '%p'", conffile); |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
308 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
309 rt_ereg_config_file = conffile; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
310 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
311 if (rtereg_init() != 0) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
312 return 1; |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
313 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
314 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
315 /* Register reload callback */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
316 CHECK_FCT(fd_event_trig_regcb(SIGUSR1, MODULE_NAME, sig_hdlr)); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
317 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
318 fd_log_notice("%s: configured, %d AVP group%s defined", MODULE_NAME, rtereg_conf_size, rtereg_conf_size != 1 ? "s" : ""); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
319 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
320 return 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
321 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
322 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
323 static int rtereg_init_config(void) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
324 { |
525 | 325 /* Initialize the configuration */ |
1546
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
326 if ((rtereg_conf=calloc(sizeof(*rtereg_conf), 1)) == NULL) { |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
327 LOG_E("[rt_ereg] malloc failured"); |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
328 return 1; |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
329 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
330 rtereg_conf_size = 1; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
331 |
525 | 332 /* Parse the configuration file */ |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
333 CHECK_FCT( rtereg_conf_handle(rt_ereg_config_file) ); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
334 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
335 return 0; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
336 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
337 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
338 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
339 /* Load */ |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
340 static int rtereg_init(void) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
341 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
342 int ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
343 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
344 pthread_rwlock_init(&rte_lock, NULL); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
345 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
346 if (pthread_rwlock_wrlock(&rte_lock) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
347 fd_log_notice("%s: write-lock failed, aborting", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
348 return EDEADLK; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
349 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
350 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
351 if ((ret=rtereg_init_config()) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
352 pthread_rwlock_unlock(&rte_lock); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
353 return ret; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
354 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
355 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
356 if (pthread_rwlock_unlock(&rte_lock) != 0) { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
357 fd_log_notice("%s: write-unlock failed, aborting", MODULE_NAME); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
358 return EDEADLK; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
359 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
360 |
525 | 361 /* Register the callback */ |
362 CHECK_FCT( fd_rt_out_register( rtereg_out, NULL, 1, &rtereg_hdl ) ); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
363 |
525 | 364 /* We're done */ |
365 return 0; | |
366 } | |
367 | |
368 /* Unload */ | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
369 static void rtereg_fini(void) |
525 | 370 { |
371 /* Unregister the cb */ | |
372 CHECK_FCT_DO( fd_rt_out_unregister ( rtereg_hdl, NULL ), /* continue */ ); | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
373 |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
374 #ifndef HAVE_REG_STARTEND |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
375 free(buf); |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
376 buf = NULL; |
1546
c48725959e63
rt_ereg: improve memory handling
Thomas Klausner <tk@giga.or.at>
parents:
1387
diff
changeset
|
377 bufsz = 0; |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
378 #endif /* HAVE_REG_STARTEND */ |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
379 |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
380 if (pthread_rwlock_wrlock(&rte_lock) != 0) { |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
381 fd_log_error("%s: write-locking failed in fini, giving up", MODULE_NAME); |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
382 return; |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
383 } |
525 | 384 /* Destroy the data */ |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
385 rtereg_conf_free(rtereg_conf, rtereg_conf_size); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
386 rtereg_conf = NULL; |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
387 rtereg_conf_size = 0; |
1387
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
388 |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
389 if (pthread_rwlock_unlock(&rte_lock) != 0) { |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
390 fd_log_error("%s: write-unlocking failed in fini", MODULE_NAME); |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
391 return; |
d70f5f6cb306
rt_ereg: improve logging and locking
Thomas Klausner <tk@giga.or.at>
parents:
1338
diff
changeset
|
392 } |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
393 |
525 | 394 /* Done */ |
395 return ; | |
396 } | |
397 | |
1338
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
398 void fd_ext_fini(void) |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
399 { |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
400 rtereg_fini(); |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
401 } |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
402 |
f1b65381c1e7
rt_ereg: Support config reload. Support grouped AVPs. Support multiple separate AVPs.
Thomas Klausner <tk@giga.or.at>
parents:
1216
diff
changeset
|
403 EXTENSION_ENTRY(MODULE_NAME, rtereg_entry); |