Mercurial > hg > freeDiameter
annotate extensions/rt_default/rtd_rules.c @ 1554:566bb46cc73f
Updated copyright information
author | Sebastien Decugis <sdecugis@freediameter.net> |
---|---|
date | Tue, 06 Oct 2020 21:34:53 +0800 |
parents | cec0812038bb |
children |
rev | line source |
---|---|
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
1 /********************************************************************************************************* |
967e579beb64
Backup work in progress on rt_default
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:
721
diff
changeset
|
3 * Author: Sebastien Decugis <sdecugis@freediameter.net> * |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
4 * * |
1554
566bb46cc73f
Updated copyright information
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1336
diff
changeset
|
5 * Copyright (c) 2019, WIDE Project and NICT * |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
6 * All rights reserved. * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
7 * * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
9 * permitted provided that the following conditions are met: * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
10 * * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
11 * * Redistributions of source code must retain the above * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
12 * copyright notice, this list of conditions and the * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
13 * following disclaimer. * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
14 * * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
15 * * Redistributions in binary form must reproduce the above * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
16 * copyright notice, this list of conditions and the * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
17 * following disclaimer in the documentation and/or other * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
18 * materials provided with the distribution. * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
19 * * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
20 * * Neither the name of the WIDE Project or NICT nor the * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
21 * names of its contributors may be used to endorse or * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
22 * promote products derived from this software without * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
23 * specific prior written permission of WIDE Project and * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
24 * NICT. * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
25 * * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
29 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
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 * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
34 *********************************************************************************************************/ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
35 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
36 #include "rt_default.h" |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
37 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
38 /* The regular expressions header */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
39 #include <regex.h> |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
40 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
41 /* We will search for each candidate peer all the rules that are defined, and check which one applies to the message |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
42 * Therefore our repository is organized hierarchicaly. |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
43 * At the top level, we have two lists of TARGETS (one for IDENTITY, one for REALM), ordered as follow: |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
44 * - first, the TARGETS defined with a regular expression. We will try matching all regexp to all candidates in the list. |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
45 * - then, the TARGETS defined by a plain text. We don't have to compare the whole list to each candidate since the list is ordered. |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
46 * |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
47 * Under each TARGET element, we have the list of RULES that are defined for this target, ordered by CRITERIA type, then is_regex, then string value. |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
48 * |
1336
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
49 * Note: Access these only when holding rtd_lock; config reload may change the underlying data. |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
50 */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
51 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
52 /* Structure to hold the data that is used for matching. */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
53 struct match_data { |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
54 int is_regex; /* determines how the string is matched */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
55 char *plain; /* match this value with strcasecmp if is_regex is false. The string is allocated by the lex tokenizer, must be freed at the end. */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
56 regex_t preg; /* match with regexec if is_regex is true. regfree must be called at the end. A copy of the original string is anyway saved in plain. */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
57 }; |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
58 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
59 /* The sentinels for the TARGET lists */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
60 static struct fd_list TARGETS[RTD_TAR_MAX]; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
61 |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
62 /* Structure of a TARGET element */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
63 struct target { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
64 struct fd_list chain; /* link in the top-level list */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
65 struct match_data md; /* the data to determine if the current candidate matches this element */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
66 struct fd_list rules[RTD_CRI_MAX]; /* Sentinels for the lists of rules applying to this target. One list per rtd_crit_type */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
67 /* note : we do not need the rtd_targ_type here, it is implied by the root of the list this target element is attached to */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
68 }; |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
69 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
70 /* Structure of a RULE element */ |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
71 struct rule { |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
72 struct fd_list chain; /* link in the parent target list */ |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
73 struct match_data md; /* the data that the criteria must match, -- ignored for RTD_CRI_ALL */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
74 int score; /* The score added to the candidate, if the message matches this criteria */ |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
75 /* The type of rule depends on the sentinel */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
76 }; |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
77 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
78 /*********************************************************************/ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
79 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
80 /* Compile a regular expression pattern */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
81 static int compile_regex( regex_t * preg, char * str ) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
82 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
83 int err; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
84 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
85 /* Compile the regular expression */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
86 err = regcomp(preg, str, REG_EXTENDED | REG_NOSUB); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
87 if (err != 0) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
88 char * buf; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
89 size_t bl; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
90 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
91 /* Error while compiling the regex */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
92 TRACE_DEBUG(INFO, "Error while compiling the regular expression '%s':", str); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
93 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
94 /* Get the error message size */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
95 bl = regerror(err, preg, NULL, 0); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
96 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
97 /* Alloc the buffer for error message */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
98 CHECK_MALLOC( buf = malloc(bl) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
99 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
100 /* Get the error message content */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
101 regerror(err, preg, buf, bl); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
102 TRACE_DEBUG(INFO, "\t%s", buf); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
103 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
104 /* Free the buffer, return the error */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
105 free(buf); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
106 return EINVAL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
107 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
108 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
109 return 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
110 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
111 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
112 /* Create a target item and initialize its content */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
113 static struct target * new_target(char * str, int regex) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
114 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
115 int i; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
116 struct target *new = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
117 CHECK_MALLOC_DO( new = malloc(sizeof(struct target)), return NULL ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
118 memset(new, 0, sizeof(struct target)); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
119 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
120 fd_list_init(&new->chain, new); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
121 new->md.plain = str; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
122 new->md.is_regex = regex; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
123 if (regex) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
124 CHECK_FCT_DO( compile_regex(&new->md.preg, str), |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
125 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
126 free(new); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
127 return NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
128 } ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
129 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
130 for (i = 0; i < RTD_CRI_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
131 fd_list_init(&new->rules[i], new); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
132 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
133 return new; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
134 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
135 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
136 /* Create a rule item and initialize its content; return NULL in case of error */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
137 static struct rule * new_rule(char * str, int regex, int score) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
138 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
139 struct rule *new = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
140 CHECK_MALLOC_DO( new = malloc(sizeof(struct rule)), return NULL ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
141 memset(new, 0, sizeof(struct rule)); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
142 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
143 fd_list_init(&new->chain, new); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
144 new->md.plain = str; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
145 new->md.is_regex = regex; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
146 if (regex) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
147 CHECK_FCT_DO( compile_regex(&new->md.preg, str), |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
148 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
149 free(new); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
150 return NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
151 } ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
152 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
153 new->score = score; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
154 return new; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
155 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
156 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
157 /* Debug functions */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
158 static void dump_rule(int indent, struct rule * rule) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
159 { |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
160 fd_log_debug("%*s%s%s%s += %d", |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
161 indent, "", |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
162 rule->md.is_regex ? "[" : "'", |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
163 rule->md.plain, |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
164 rule->md.is_regex ? "]" : "'", |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
165 rule->score); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
166 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
167 static void dump_target(int indent, struct target * target) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
168 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
169 int i; |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
170 fd_log_debug("%*s%s%s%s :", |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
171 indent, "", |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
172 target->md.is_regex ? "[" : "'", |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
173 target->md.plain ?: "(empty)", |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
174 target->md.is_regex ? "]" : "'"); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
175 for (i = 0; i < RTD_CRI_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
176 if (! FD_IS_LIST_EMPTY(&target->rules[i])) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
177 struct fd_list * li; |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
178 fd_log_debug("%*s rules[%d]:", |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
179 indent, "", i); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
180 for (li = target->rules[i].next; li != &target->rules[i]; li = li->next) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
181 dump_rule(indent + 3, (struct rule *)li); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
182 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
183 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
184 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
185 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
186 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
187 static void clear_md(struct match_data * md) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
188 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
189 /* delete the string */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
190 if (md->plain) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
191 free(md->plain); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
192 md->plain = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
193 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
194 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
195 /* delete the preg if needed */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
196 if (md->is_regex) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
197 regfree(&md->preg); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
198 md->is_regex = 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
199 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
200 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
201 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
202 /* Destroy a rule item */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
203 static void del_rule(struct rule * del) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
204 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
205 /* Unlink this rule */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
206 fd_list_unlink(&del->chain); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
207 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
208 /* Delete the match data */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
209 clear_md(&del->md); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
210 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
211 free(del); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
212 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
213 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
214 /* Destroy a target item, and all its rules */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
215 static void del_target(struct target * del) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
216 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
217 int i; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
218 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
219 /* Unlink this target */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
220 fd_list_unlink(&del->chain); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
221 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
222 /* Delete the match data */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
223 clear_md(&del->md); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
224 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
225 /* Delete the children rules */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
226 for (i = 0; i < RTD_CRI_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
227 while (! FD_IS_LIST_EMPTY(&del->rules[i]) ) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
228 del_rule((struct rule *)(del->rules[i].next)); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
229 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
230 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
231 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
232 free(del); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
233 } |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
234 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
235 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
236 /* Compare a string with a match_data value. *res contains the result of the comparison (always >0 for regex non-match situations) */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
237 static int compare_match(char * str, size_t len, struct match_data * md, int * res) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
238 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
239 int err; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
240 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
241 CHECK_PARAMS( str && md && res ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
242 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
243 /* Plain strings: we compare with strncasecmp */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
244 if (md->is_regex == 0) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
245 *res = strncasecmp(str, md->plain, len); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
246 return 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
247 } |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
248 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
249 /* Regexp */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
250 *res = 1; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
251 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
252 #ifdef HAVE_REG_STARTEND |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
253 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
254 regmatch_t pmatch[1]; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
255 memset(pmatch, 0, sizeof(pmatch)); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
256 pmatch[0].rm_so = 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
257 pmatch[0].rm_eo = len; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
258 err = regexec(&md->preg, str, 0, pmatch, REG_STARTEND); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
259 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
260 #else /* HAVE_REG_STARTEND */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
261 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
262 /* We have to create a copy of the string in this case */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
263 char *mystrcpy; |
721
01f796160f7f
Small optimization: use os0dup
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
403
diff
changeset
|
264 CHECK_MALLOC( mystrcpy = os0dup(str, len) ); |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
265 err = regexec(&md->preg, mystrcpy, 0, NULL, 0); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
266 free(mystrcpy); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
267 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
268 #endif /* HAVE_REG_STARTEND */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
269 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
270 /* Now check the result */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
271 if (err == 0) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
272 /* We have a match */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
273 *res = 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
274 return 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
275 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
276 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
277 if (err == REG_NOMATCH) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
278 *res = 1; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
279 return 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
280 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
281 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
282 /* In other cases, we have an error */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
283 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
284 char * buf; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
285 size_t bl; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
286 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
287 /* Error while compiling the regex */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
288 TRACE_DEBUG(INFO, "Error while executing the regular expression '%s':", md->plain); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
289 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
290 /* Get the error message size */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
291 bl = regerror(err, &md->preg, NULL, 0); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
292 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
293 /* Alloc the buffer for error message */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
294 CHECK_MALLOC( buf = malloc(bl) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
295 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
296 /* Get the error message content */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
297 regerror(err, &md->preg, buf, bl); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
298 TRACE_DEBUG(INFO, "\t%s", buf); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
299 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
300 /* Free the buffer, return the error */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
301 free(buf); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
302 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
303 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
304 return (err == REG_ESPACE) ? ENOMEM : EINVAL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
305 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
306 |
403
26aafbbc1640
Cleanup all compilation warnings in base code for 32 bit arch
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
307 /* Search in list (targets or rules) the next matching item for octet string str(len). Returned in next_match, or *next_match == NULL if no more match. Re-enter with same next_match for the next one. */ |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
308 static int get_next_match(struct fd_list * list, char * str, size_t len, struct fd_list ** next_match) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
309 { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
310 struct fd_list * li; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
311 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
312 TRACE_ENTRY("%p %p %zd %p", list, str, len, next_match); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
313 CHECK_PARAMS(list && str && len && next_match); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
314 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
315 if (*next_match) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
316 li = (*next_match)->next; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
317 else |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
318 li = list->next; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
319 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
320 /* Initialize the return value */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
321 *next_match = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
322 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
323 for ( ; li != list; li = li->next) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
324 int cmp; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
325 struct { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
326 struct fd_list chain; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
327 struct match_data md; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
328 } * next_item = (void *)li; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
329 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
330 /* Check if the string matches this next item */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
331 CHECK_FCT( compare_match(str, len, &next_item->md, &cmp) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
332 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
333 if (cmp == 0) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
334 /* matched! */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
335 *next_match = li; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
336 return 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
337 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
338 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
339 if (cmp < 0) /* we can stop searching */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
340 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
341 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
342 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
343 /* We're done with the list */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
344 return 0; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
345 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
346 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
347 static struct dict_object * AVP_MODELS[RTD_CRI_MAX]; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
348 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
349 /*********************************************************************/ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
350 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
351 /* Prepare the module */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
352 int rtd_init(void) |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
353 { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
354 int i; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
355 |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
356 TRACE_ENTRY(); |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
357 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
358 for (i = 0; i < RTD_TAR_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
359 fd_list_init(&TARGETS[i], NULL); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
360 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
361 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
362 for (i = 1; i < RTD_CRI_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
363 switch (i) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
364 case RTD_CRI_OH: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
365 CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-Host", &AVP_MODELS[i], ENOENT )); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
366 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
367 case RTD_CRI_OR: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
368 CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Origin-Realm", &AVP_MODELS[i], ENOENT )); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
369 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
370 case RTD_CRI_DH: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
371 CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Host", &AVP_MODELS[i], ENOENT )); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
372 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
373 case RTD_CRI_DR: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
374 CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Destination-Realm", &AVP_MODELS[i], ENOENT )); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
375 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
376 case RTD_CRI_UN: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
377 CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "User-Name", &AVP_MODELS[i], ENOENT )); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
378 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
379 case RTD_CRI_SI: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
380 CHECK_FCT( fd_dict_search ( fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME, "Session-Id", &AVP_MODELS[i], ENOENT )); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
381 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
382 default: |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
383 TRACE_DEBUG(INFO, "Missing definition in extension initializer"); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
384 ASSERT( 0 ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
385 return EINVAL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
386 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
387 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
388 |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
389 return 0; |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
390 } |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
391 |
1336
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
392 static void free_targets(void) |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
393 { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
394 int i; |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
395 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
396 for (i = 0; i < RTD_TAR_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
397 while (!FD_IS_LIST_EMPTY(&TARGETS[i])) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
398 del_target((struct target *) TARGETS[i].next); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
399 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
400 } |
1336
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
401 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
402 |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
403 /* Destroy the module's data */ |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
404 void rtd_fini(void) |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
405 { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
406 TRACE_ENTRY(); |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
407 |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
408 free_targets(); |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
409 } |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
410 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
411 /* Add a new rule in the repository. this is called when the configuration file is being parsed */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
412 int rtd_add(enum rtd_crit_type ct, char * criteria, enum rtd_targ_type tt, char * target, int score, int flags) |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
413 { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
414 struct fd_list * target_suiv = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
415 struct fd_list * rule_suiv = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
416 struct target * trg = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
417 struct rule * rul = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
418 |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
419 TRACE_ENTRY("%d %p %d %p %d %x", ct, criteria, tt, target, score, flags); |
1179
f5e9b53d6f86
Fix invalid NULL pointer indirection in log
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
420 CHECK_PARAMS((ct < RTD_CRI_MAX) && ((ct == RTD_CRI_ALL) || criteria) && (tt < RTD_TAR_MAX) && target); |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
421 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
422 /* First, search in the TARGET list if we already have this target */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
423 for (target_suiv = TARGETS[tt].next; target_suiv != &TARGETS[tt]; target_suiv = target_suiv->next) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
424 int cmp; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
425 struct target * cur = (struct target *)target_suiv; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
426 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
427 if (flags & RTD_TARG_REG) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
428 /* We are adding a regexp, it is saved in the list before the plain expressions */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
429 if (cur->md.is_regex == 0) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
430 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
431 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
432 /* We are adding a plain expression, save it after all regexps */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
433 if (cur->md.is_regex != 0) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
434 continue; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
435 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
436 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
437 /* At this point, the type is the same, so compare the plain string value */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
438 cmp = strcmp(cur->md.plain, target); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
439 if (cmp < 0) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
440 continue; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
441 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
442 if (cmp == 0) /* We already have a target with the same string */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
443 trg = cur; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
444 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
445 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
446 } |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
447 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
448 if (trg) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
449 /* Ok, we can free the target string, we will use the previously allocated one */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
450 free(target); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
451 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
452 CHECK_MALLOC( trg = new_target(target, flags & RTD_TARG_REG) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
453 fd_list_insert_before( target_suiv, &trg->chain ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
454 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
455 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
456 /* Now, search for the rule position in this target's list */ |
1179
f5e9b53d6f86
Fix invalid NULL pointer indirection in log
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
457 if (ct == RTD_CRI_ALL) { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
458 /* Special case: we don't have a criteria -- always create a rule element */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
459 CHECK_MALLOC( rul = new_rule(NULL, 0, score) ); |
1179
f5e9b53d6f86
Fix invalid NULL pointer indirection in log
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
460 fd_list_insert_before( &trg->rules[RTD_CRI_ALL], &rul->chain ); |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
461 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
462 for (rule_suiv = trg->rules[ct].next; rule_suiv != &trg->rules[ct]; rule_suiv = rule_suiv->next) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
463 int cmp; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
464 struct rule * cur = (struct rule *)rule_suiv; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
465 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
466 if (flags & RTD_CRIT_REG) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
467 /* We are adding a regexp, it is saved in the list before the plain expressions */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
468 if (cur->md.is_regex == 0) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
469 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
470 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
471 /* We are adding a plain expression, save it after all regexps */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
472 if (cur->md.is_regex != 0) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
473 continue; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
474 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
475 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
476 /* At this point, the type is the same, so compare the plain string value */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
477 cmp = strcmp(cur->md.plain, criteria); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
478 if (cmp < 0) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
479 continue; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
480 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
481 if (cmp == 0) /* We already have a target with the same string */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
482 rul = cur; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
483 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
484 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
485 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
486 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
487 if (rul) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
488 /* Ok, we can free the target string, we will use the previously allocated one */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
489 free(criteria); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
490 TRACE_DEBUG(INFO, "Warning: duplicate rule (%s : %s) found, merging score...", rul->md.plain, trg->md.plain); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
491 rul->score += score; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
492 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
493 CHECK_MALLOC( rul = new_rule(criteria, flags & RTD_CRIT_REG, score) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
494 fd_list_insert_before( rule_suiv, &rul->chain ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
495 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
496 } |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
497 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
498 return 0; |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
499 } |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
500 |
1336
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
501 void rtd_conf_reload(char *config_file) |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
502 { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
503 /* save old config in case reload goes wrong */ |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
504 struct fd_list old_config[RTD_TAR_MAX]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
505 int i; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
506 |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
507 for (i = 0; i < RTD_TAR_MAX; i++) { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
508 old_config[i] = TARGETS[i]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
509 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
510 memset(TARGETS, 0, sizeof(*TARGETS) * RTD_TAR_MAX); |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
511 for (i = 0; i < RTD_TAR_MAX; i++) { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
512 fd_list_init(&TARGETS[i], NULL); |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
513 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
514 |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
515 if (rtd_conf_handle(config_file) != 0) { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
516 fd_log_notice("rt_default: error reloading configuration, restoring previous configuration"); |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
517 free_targets(); |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
518 for (i = 0; i < RTD_TAR_MAX; i++) { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
519 TARGETS[i] = old_config[i]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
520 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
521 } else { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
522 /* this has to be done in this weird way because the items contain back pointers referencing TARGETS */ |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
523 struct fd_list save_config[RTD_TAR_MAX]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
524 for (i = 0; i < RTD_TAR_MAX; i++) { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
525 save_config[i] = TARGETS[i]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
526 TARGETS[i] = old_config[i]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
527 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
528 free_targets(); |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
529 for (i = 0; i < RTD_TAR_MAX; i++) { |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
530 TARGETS[i] = save_config[i]; |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
531 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
532 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
533 } |
cec0812038bb
rt_default: add reload support.
Thomas Klausner <tk@giga.or.at>
parents:
1179
diff
changeset
|
534 |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
535 /* Check if a message and list of eligible candidate match any of our rules, and update its score according to it. */ |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
536 int rtd_process( struct msg * msg, struct fd_list * candidates ) |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
537 { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
538 struct fd_list * li; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
539 struct { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
540 enum { NOT_RESOLVED_YET = 0, NOT_FOUND, FOUND } status; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
541 union avp_value * avp; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
542 } parsed_msg_avp[RTD_CRI_MAX]; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
543 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
544 TRACE_ENTRY("%p %p", msg, candidates); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
545 CHECK_PARAMS(msg && candidates); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
546 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
547 /* We delay looking for the AVPs in the message until we really need them. Another approach would be to parse the message once and save all needed AVPs. */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
548 memset(parsed_msg_avp, 0, sizeof(parsed_msg_avp)); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
549 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
550 /* For each candidate in the list */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
551 for (li = candidates->next; li != candidates; li = li->next) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
552 struct rtd_candidate * cand = (struct rtd_candidate *)li; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
553 int i; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
554 struct { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
555 char * str; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
556 size_t len; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
557 } cand_data[RTD_TAR_MAX] = { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
558 { cand->diamid, strlen(cand->diamid) }, |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
559 { cand->realm, strlen(cand->realm) } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
560 }; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
561 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
562 for (i = 0; i < RTD_TAR_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
563 /* Search the next rule matching this candidate in the i-th target list */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
564 struct target * target = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
565 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
566 do { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
567 int j; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
568 struct fd_list * l; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
569 struct rule * r; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
570 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
571 CHECK_FCT ( get_next_match( &TARGETS[i], cand_data[i].str, cand_data[i].len, (void *)&target) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
572 if (!target) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
573 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
574 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
575 /* First, apply all rules of criteria RTD_CRI_ALL */ |
1179
f5e9b53d6f86
Fix invalid NULL pointer indirection in log
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
576 for ( l = target->rules[RTD_CRI_ALL].next; l != &target->rules[RTD_CRI_ALL]; l = l->next ) { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
577 r = (struct rule *)l; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
578 cand->score += r->score; |
1179
f5e9b53d6f86
Fix invalid NULL pointer indirection in log
Sebastien Decugis <sdecugis@freediameter.net>
parents:
1127
diff
changeset
|
579 TRACE_DEBUG(ANNOYING, "Applied rule {'*' : '%s' += %d} to candidate '%s'", target->md.plain, r->score, cand->diamid); |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
580 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
581 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
582 /* The target is matching this candidate, check if there are additional rules criteria matching this message. */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
583 for ( j = 1; j < RTD_CRI_MAX; j++ ) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
584 if ( ! FD_IS_LIST_EMPTY(&target->rules[j]) ) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
585 /* if needed, find the required data in the message */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
586 if (parsed_msg_avp[j].status == NOT_RESOLVED_YET) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
587 struct avp * avp = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
588 /* Search for the AVP in the message */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
589 CHECK_FCT( fd_msg_search_avp ( msg, AVP_MODELS[j], &avp ) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
590 if (avp == NULL) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
591 parsed_msg_avp[j].status = NOT_FOUND; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
592 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
593 struct avp_hdr * ahdr = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
594 CHECK_FCT( fd_msg_avp_hdr ( avp, &ahdr ) ); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
595 if (ahdr->avp_value == NULL) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
596 /* This should not happen, but anyway let's just ignore it */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
597 parsed_msg_avp[j].status = NOT_FOUND; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
598 } else { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
599 /* OK, we got the AVP */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
600 parsed_msg_avp[j].status = FOUND; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
601 parsed_msg_avp[j].avp = ahdr->avp_value; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
602 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
603 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
604 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
605 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
606 /* If we did not find the data for these rules in the message, just skip the series */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
607 if (parsed_msg_avp[j].status == NOT_FOUND) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
608 TRACE_DEBUG(ANNOYING, "Skipping series of rules %d of target '%s', criteria absent from the message", j, target->md.plain); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
609 continue; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
610 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
611 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
612 /* OK, we can now check if one of our rule's criteria match the message content */ |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
613 r = NULL; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
614 do { |
403
26aafbbc1640
Cleanup all compilation warnings in base code for 32 bit arch
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
258
diff
changeset
|
615 CHECK_FCT ( get_next_match( &target->rules[j], (char *) /* is this cast safe? */ parsed_msg_avp[j].avp->os.data, parsed_msg_avp[j].avp->os.len, (void *)&r) ); |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
616 if (!r) |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
617 break; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
618 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
619 cand->score += r->score; |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
620 TRACE_DEBUG(ANNOYING, "Applied rule {'%s' : '%s' += %d} to candidate '%s'", r->md.plain, target->md.plain, r->score, cand->diamid); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
621 } while (1); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
622 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
623 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
624 } while (1); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
625 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
626 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
627 |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
628 return 0; |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
629 } |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
630 |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
631 void rtd_dump(void) |
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
632 { |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
633 int i; |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
634 fd_log_debug("[rt_default] Dumping rules repository..."); |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
635 for (i = 0; i < RTD_TAR_MAX; i++) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
636 if (!FD_IS_LIST_EMPTY( &TARGETS[i] )) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
637 struct fd_list * li; |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
638 fd_log_debug(" Targets list %d:", i); |
168
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
639 for (li = TARGETS[i].next; li != &TARGETS[i]; li = li->next) { |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
640 dump_target(4, (struct target *)li); |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
641 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
642 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
643 } |
6db078b955e3
Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
167
diff
changeset
|
644 |
974
2091bf698fb1
Remove newlines from fd_log_debug, TRACE_DEBUG, TRACE_ERROR, and TRACE_DEBUG_ERROR
Thomas Klausner <tk@giga.or.at>
parents:
741
diff
changeset
|
645 fd_log_debug("[rt_default] End of dump"); |
167
967e579beb64
Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff
changeset
|
646 } |