annotate extensions/rt_default/rtd_rules.c @ 168:6db078b955e3

Completed rt_default extension
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 02 Feb 2010 10:15:05 +0900
parents 967e579beb64
children 5df55136361b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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) *
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
3 * Author: Sebastien Decugis <sdecugis@nict.go.jp> *
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
4 * *
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
5 * Copyright (c) 2009, WIDE Project and NICT *
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 *
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
49 * Note: Except during configuration parsing and module termination, the lists are only ever accessed read-only, so we do not need a lock.
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 {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
160 fd_log_debug("%*s%s%s%s += %d\n",
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;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
170 fd_log_debug("%*s%s%s%s :\n",
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;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
178 fd_log_debug("%*s rules[%d]:\n",
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;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
264 CHECK_MALLOC( mystrcpy = malloc(len + 1) );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
265 memcpy(mystrcpy, str, len);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
266 mystrcpy[len] = '\0';
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
267 err = regexec(&md->preg, mystrcpy, 0, NULL, 0);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
268 free(mystrcpy);
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 #endif /* HAVE_REG_STARTEND */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
271
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
272 /* Now check the result */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
273 if (err == 0) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
274 /* We have a match */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
275 *res = 0;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
276 return 0;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
277 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
278
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
279 if (err == REG_NOMATCH) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
280 *res = 1;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
281 return 0;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
282 }
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 /* In other cases, we have an error */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
285 {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
286 char * buf;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
287 size_t bl;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
288
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
289 /* Error while compiling the regex */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
290 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
291
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
292 /* Get the error message size */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
293 bl = regerror(err, &md->preg, NULL, 0);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
294
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
295 /* Alloc the buffer for error message */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
296 CHECK_MALLOC( buf = malloc(bl) );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
297
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
298 /* Get the error message content */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
299 regerror(err, &md->preg, buf, bl);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
300 TRACE_DEBUG(INFO, "\t%s", buf);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
301
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
302 /* Free the buffer, return the error */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
303 free(buf);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
304 }
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 return (err == REG_ESPACE) ? ENOMEM : EINVAL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
307 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
308
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
309 /* Search in list (targets or rules) the next matching item for 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. */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
310 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
311 {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
312 struct fd_list * li;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
313
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
314 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
315 CHECK_PARAMS(list && str && len && next_match);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
316
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
317 if (*next_match)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
318 li = (*next_match)->next;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
319 else
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
320 li = list->next;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
321
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
322 /* Initialize the return value */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
323 *next_match = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
324
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
325 for ( ; li != list; li = li->next) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
326 int cmp;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
327 struct {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
328 struct fd_list chain;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
329 struct match_data md;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
330 } * next_item = (void *)li;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
331
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
332 /* Check if the string matches this next item */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
333 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
334
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
335 if (cmp == 0) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
336 /* matched! */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
337 *next_match = li;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
338 return 0;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
339 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
340
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
341 if (cmp < 0) /* we can stop searching */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
342 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
343 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
344
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
345 /* We're done with the list */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
346 return 0;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
347 }
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 static struct dict_object * AVP_MODELS[RTD_CRI_MAX];
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 /*********************************************************************/
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
352
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
353 /* Prepare the module */
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
354 int rtd_init(void)
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
355 {
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
356 int i;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
357
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
358 TRACE_ENTRY();
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
359
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
360 for (i = 0; i < RTD_TAR_MAX; i++) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
361 fd_list_init(&TARGETS[i], NULL);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
362 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
363
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
364 for (i = 1; i < RTD_CRI_MAX; i++) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
365 switch (i) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
366 case RTD_CRI_OH:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
367 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
368 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
369 case RTD_CRI_OR:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
370 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
371 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
372 case RTD_CRI_DH:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
373 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
374 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
375 case RTD_CRI_DR:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
376 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
377 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
378 case RTD_CRI_UN:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
379 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
380 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
381 case RTD_CRI_SI:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
382 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
383 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
384 default:
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
385 TRACE_DEBUG(INFO, "Missing definition in extension initializer");
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
386 ASSERT( 0 );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
387 return EINVAL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
388 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
389 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
390
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
391 return 0;
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
392 }
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 /* Destroy the module's data */
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
395 void rtd_fini(void)
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
396 {
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
397 int i;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
398
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
399 TRACE_ENTRY();
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
400
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
401 for (i = 0; i < RTD_TAR_MAX; i++) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
402 while (!FD_IS_LIST_EMPTY(&TARGETS[i])) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
403 del_target((struct target *) TARGETS[i].next);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
404 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
405 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
406
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
407 }
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
408
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
409 /* 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
410 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
411 {
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
412 struct fd_list * target_suiv = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
413 struct fd_list * rule_suiv = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
414 struct target * trg = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
415 struct rule * rul = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
416
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
417 TRACE_ENTRY("%d %p %d %p %d %x", ct, criteria, tt, target, score, flags);
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
418 CHECK_PARAMS((ct < RTD_CRI_MAX) && ((ct == 0) || criteria) && (tt < RTD_TAR_MAX) && target);
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
419
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
420 /* 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
421 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
422 int cmp;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
423 struct target * cur = (struct target *)target_suiv;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
424
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
425 if (flags & RTD_TARG_REG) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
426 /* 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
427 if (cur->md.is_regex == 0)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
428 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
429 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
430 /* 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
431 if (cur->md.is_regex != 0)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
432 continue;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
433 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
434
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
435 /* 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
436 cmp = strcmp(cur->md.plain, target);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
437 if (cmp < 0)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
438 continue;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
439
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
440 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
441 trg = cur;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
442
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
443 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
444 }
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
445
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
446 if (trg) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
447 /* 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
448 free(target);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
449 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
450 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
451 fd_list_insert_before( target_suiv, &trg->chain );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
452 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
453
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
454 /* Now, search for the rule position in this target's list */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
455 if (ct == 0) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
456 /* 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
457 CHECK_MALLOC( rul = new_rule(NULL, 0, score) );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
458 fd_list_insert_before( &trg->rules[0], &rul->chain );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
459 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
460 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
461 int cmp;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
462 struct rule * cur = (struct rule *)rule_suiv;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
463
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
464 if (flags & RTD_CRIT_REG) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
465 /* 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
466 if (cur->md.is_regex == 0)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
467 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
468 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
469 /* 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
470 if (cur->md.is_regex != 0)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
471 continue;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
472 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
473
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
474 /* 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
475 cmp = strcmp(cur->md.plain, criteria);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
476 if (cmp < 0)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
477 continue;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
478
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
479 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
480 rul = cur;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
481
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
482 break;
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
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
485 if (rul) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
486 /* 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
487 free(criteria);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
488 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
489 rul->score += score;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
490 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
491 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
492 fd_list_insert_before( rule_suiv, &rul->chain );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
493 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
494 }
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
495
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
496 return 0;
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
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
499 /* 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
500 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
501 {
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
502 struct fd_list * li;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
503 struct {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
504 enum { NOT_RESOLVED_YET = 0, NOT_FOUND, FOUND } status;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
505 union avp_value * avp;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
506 } parsed_msg_avp[RTD_CRI_MAX];
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
507
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
508 TRACE_ENTRY("%p %p", msg, candidates);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
509 CHECK_PARAMS(msg && candidates);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
510
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
511 /* 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
512 memset(parsed_msg_avp, 0, sizeof(parsed_msg_avp));
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
513
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
514 /* For each candidate in the list */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
515 for (li = candidates->next; li != candidates; li = li->next) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
516 struct rtd_candidate * cand = (struct rtd_candidate *)li;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
517 int i;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
518 struct {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
519 char * str;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
520 size_t len;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
521 } cand_data[RTD_TAR_MAX] = {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
522 { cand->diamid, strlen(cand->diamid) },
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
523 { cand->realm, strlen(cand->realm) }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
524 };
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
525
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
526 for (i = 0; i < RTD_TAR_MAX; i++) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
527 /* 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
528 struct target * target = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
529
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
530 do {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
531 int j;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
532 struct fd_list * l;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
533 struct rule * r;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
534
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
535 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
536 if (!target)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
537 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
538
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
539 /* First, apply all rules of criteria RTD_CRI_ALL */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
540 for ( l = target->rules[0].next; l != &target->rules[0]; l = l->next ) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
541 r = (struct rule *)l;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
542 cand->score += r->score;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
543 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
544 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
545
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
546 /* 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
547 for ( j = 1; j < RTD_CRI_MAX; j++ ) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
548 if ( ! FD_IS_LIST_EMPTY(&target->rules[j]) ) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
549 /* if needed, find the required data in the message */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
550 if (parsed_msg_avp[j].status == NOT_RESOLVED_YET) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
551 struct avp * avp = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
552 /* Search for the AVP in the message */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
553 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
554 if (avp == NULL) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
555 parsed_msg_avp[j].status = NOT_FOUND;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
556 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
557 struct avp_hdr * ahdr = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
558 CHECK_FCT( fd_msg_avp_hdr ( avp, &ahdr ) );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
559 if (ahdr->avp_value == NULL) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
560 /* 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
561 parsed_msg_avp[j].status = NOT_FOUND;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
562 } else {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
563 /* OK, we got the AVP */
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
564 parsed_msg_avp[j].status = FOUND;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
565 parsed_msg_avp[j].avp = ahdr->avp_value;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
566 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
567 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
568 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
569
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
570 /* 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
571 if (parsed_msg_avp[j].status == NOT_FOUND) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
572 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
573 continue;
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
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
576 /* 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
577 r = NULL;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
578 do {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
579 CHECK_FCT ( get_next_match( &target->rules[j], parsed_msg_avp[j].avp->os.data, parsed_msg_avp[j].avp->os.len, (void *)&r) );
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
580 if (!r)
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
581 break;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
582
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
583 cand->score += r->score;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
584 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
585 } while (1);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
586 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
587 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
588 } while (1);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
589 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
590 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
591
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
592 return 0;
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
593 }
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
594
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
595 void rtd_dump(void)
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
596 {
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
597 int i;
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
598 fd_log_debug("[rt_default] Dumping rules repository...\n");
168
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
599 for (i = 0; i < RTD_TAR_MAX; i++) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
600 if (!FD_IS_LIST_EMPTY( &TARGETS[i] )) {
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
601 struct fd_list * li;
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
602 fd_log_debug(" Targets list %d:\n", i);
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
603 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
604 dump_target(4, (struct target *)li);
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 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
607 }
6db078b955e3 Completed rt_default extension
Sebastien Decugis <sdecugis@nict.go.jp>
parents: 167
diff changeset
608
167
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
609 fd_log_debug("[rt_default] End of dump\n");
967e579beb64 Backup work in progress on rt_default
Sebastien Decugis <sdecugis@nict.go.jp>
parents:
diff changeset
610 }
"Welcome to our mercurial repository"