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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
525
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
1 /*********************************************************************************************************
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
4 * *
1554
566bb46cc73f Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents: 1546
diff changeset
5 * Copyright (c) 2020, WIDE Project and NICT *
525
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
6 * All rights reserved. *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
7 * *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
8 * Redistribution and use of this software in source and binary forms, with or without modification, are *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
9 * permitted provided that the following conditions are met: *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
10 * *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
11 * * Redistributions of source code must retain the above *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
12 * copyright notice, this list of conditions and the *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
13 * following disclaimer. *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
14 * *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
15 * * Redistributions in binary form must reproduce the above *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
16 * copyright notice, this list of conditions and the *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
17 * following disclaimer in the documentation and/or other *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
18 * materials provided with the distribution. *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
19 * *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
20 * * Neither the name of the WIDE Project or NICT nor the *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
21 * names of its contributors may be used to endorse or *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
22 * promote products derived from this software without *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
23 * specific prior written permission of WIDE Project and *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
24 * NICT. *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
25 * *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
27 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
28 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
30 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
32 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
34 *********************************************************************************************************/
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
37 * This extension allows to perform some pattern-matching on an AVP
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
38 * and send the message to a server accordingly.
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
39 * See rt_ereg.conf.sample file for the format of the configuration file.
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
40 */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
45 #include "rtereg.h"
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
56
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
57 #ifndef HAVE_REG_STARTEND
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
58 static char * buf = NULL;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
59 static size_t bufsz;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
60 static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
61 #endif /* HAVE_REG_STARTEND */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
87 {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
93 int err = 0;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
98 #ifdef HAVE_REG_STARTEND
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
99 {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
100 regmatch_t pmatch[1];
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
101 memset(pmatch, 0, sizeof(pmatch));
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
102 pmatch[0].rm_so = 0;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
103 pmatch[0].rm_eo = len;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
104 err = regexec(&r->preg, value, 0, pmatch, REG_STARTEND);
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
105 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
106 #else /* HAVE_REG_STARTEND */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
107 {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
108 /* We have a 0-terminated string */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
109 err = regexec(&r->preg, value, 0, NULL, 0);
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
110 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
113 if (err == REG_NOMATCH)
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
116 if (err != 0) {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
117 char * errstr;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
118 size_t bl;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
119
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
122
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
123 /* Get the error message size */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
124 bl = regerror(err, &r->preg, NULL, 0);
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
125
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
126 /* Alloc the buffer for error message */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
127 CHECK_MALLOC( errstr = malloc(bl) );
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
128
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
129 /* Get the error message content */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
132
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
133 /* Free the buffer, return the error */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
136 return (err == REG_ESPACE) ? ENOMEM : EINVAL;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
142 for (c = candidates->next; c != candidates; c = c->next) {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
143 struct rtd_candidate * cand = (struct rtd_candidate *)c;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
144
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
145 if (strcmp(r->server, cand->diamid) == 0) {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
146 cand->score += r->score;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
147 break;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
148 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
149 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
220 return 0;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
221 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
222
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
235 return 0;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
247 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
248 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
256 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
257
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
258 /* handler */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
259 static struct fd_rt_out_hdl * rtereg_hdl = NULL;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
304 /* entry point */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
305 static int rtereg_entry(char * conffile)
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
361 /* Register the callback */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
364 /* We're done */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
365 return 0;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
366 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
367
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
370 {
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
371 /* Unregister the cb */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
394 /* Done */
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
395 return ;
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
396 }
ecfa089bd29a Forgot new files
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
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);
"Welcome to our mercurial repository"