annotate extensions/rt_rewrite/rt_rewrite_conf.y @ 1548:edfb2b662b91

rt_rewrite: octetstring object cannot be mapped to any other type
author Thomas Klausner <tk@giga.or.at>
date Mon, 15 Jun 2020 20:33:58 +0200
parents b0401251d8c0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1341
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
1 /*********************************************************************************************************
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
2 * Software License Agreement (BSD License) *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
3 * Author: Thomas Klausner <tk@giga.or.at> *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
4 * *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
5 * Copyright (c) 2018, Thomas Klausner *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
6 * All rights reserved. *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
7 * *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
8 * Written under contract by Effortel Technologies SA, http://effortel.com/ *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
9 * *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
10 * Redistribution and use of this software in source and binary forms, with or without modification, are *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
11 * permitted provided that the following conditions are met: *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
12 * *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
13 * * Redistributions of source code must retain the above *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
14 * copyright notice, this list of conditions and the *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
15 * following disclaimer. *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
16 * *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
17 * * Redistributions in binary form must reproduce the above *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
18 * copyright notice, this list of conditions and the *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
19 * following disclaimer in the documentation and/or other *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
20 * materials provided with the distribution. *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
21 * *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
24 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
25 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
28 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
30 *********************************************************************************************************/
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
31
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
32 /* Yacc extension's configuration parser.
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
33 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
34
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
35 /* For development only : */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
36 %debug
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
37 %error-verbose
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
38
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
39 /* The parser receives the configuration file filename as parameter */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
40 %parse-param {char * conffile}
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
41
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
42 /* Keep track of location */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
43 %locations
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
44 %pure-parser
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
45
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
46 %{
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
47 #include "rt_rewrite.h"
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
48 #include "rt_rewrite_conf.tab.h" /* bison is not smart enough to define the YYLTYPE before including this code, so... */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
49
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
50 /* Forward declaration */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
51 int yyparse(char * conffile);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
52 void rt_rewrite_confrestart(FILE *input_file);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
53
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
54 /* copied from libfdproto/dictionary.c because the symbol is not public */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
55 static const char * type_base_name[] = { /* must keep in sync with dict_avp_basetype */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
56 "Grouped", /* AVP_TYPE_GROUPED */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
57 "Octetstring", /* AVP_TYPE_OCTETSTRING */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
58 "Integer32", /* AVP_TYPE_INTEGER32 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
59 "Integer64", /* AVP_TYPE_INTEGER64 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
60 "Unsigned32", /* AVP_TYPE_UNSIGNED32 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
61 "Unsigned64", /* AVP_TYPE_UNSIGNED64 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
62 "Float32", /* AVP_TYPE_FLOAT32 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
63 "Float64" /* AVP_TYPE_FLOAT64 */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
64 };
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
65
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
66 static struct avp_match *avp_match_new(char *name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
67
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
68 static struct avp_match *source_target = NULL, *drop_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
69 static struct avp_target *dest_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
70
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
71 static void print_target(struct avp_target *target, char *prefix)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
72 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
73 char *output = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
74 if (asprintf(&output, "%s -> /TOP/%s", prefix, target->name) == -1) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
75 fd_log_error("rt_rewrite: print_target: setup: asprintf failed: %s", strerror(errno));
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
76 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
77 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
78 for (target=target->child; target != NULL; target=target->child) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
79 char *new_output = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
80 if (asprintf(&new_output, "%s/%s", output, target->name) == -1) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
81 fd_log_error("rt_rewrite: print_target: asprintf failed: %s", strerror(errno));
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
82 free(output);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
83 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
84 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
85 free(output);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
86 output = new_output;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
87 new_output = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
88 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
89 fd_log_debug(output);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
90 free(output);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
91 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
92 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
93
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
94 static void compare_avp_type(const char *source, const char *dest)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
95 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
96 struct dict_object *model_source, *model_dest;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
97 struct dict_avp_data dictdata_source, dictdata_dest;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
98
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
99 if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, source, &model_source, ENOENT) != 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
100 fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", source);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
101 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
102 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
103 if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, dest, &model_dest, ENOENT) != 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
104 fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", dest);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
105 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
106 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
107 fd_dict_getval(model_source, &dictdata_source);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
108 fd_dict_getval(model_dest, &dictdata_dest);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
109 if (dictdata_source.avp_basetype != dictdata_dest.avp_basetype) {
1548
edfb2b662b91 rt_rewrite: octetstring object cannot be mapped to any other type
Thomas Klausner <tk@giga.or.at>
parents: 1341
diff changeset
110 if (dictdata_source.avp_basetype == AVP_TYPE_OCTETSTRING) {
edfb2b662b91 rt_rewrite: octetstring object cannot be mapped to any other type
Thomas Klausner <tk@giga.or.at>
parents: 1341
diff changeset
111 fd_log_error("rt_rewrite: type mismatch: %s (type %s) mapped to %s (type %s): OctetString cannot be mapped to non-OctetString type", source, type_base_name[dictdata_source.avp_basetype], dest, type_base_name[dictdata_dest.avp_basetype]);
edfb2b662b91 rt_rewrite: octetstring object cannot be mapped to any other type
Thomas Klausner <tk@giga.or.at>
parents: 1341
diff changeset
112 return;
edfb2b662b91 rt_rewrite: octetstring object cannot be mapped to any other type
Thomas Klausner <tk@giga.or.at>
parents: 1341
diff changeset
113 }
edfb2b662b91 rt_rewrite: octetstring object cannot be mapped to any other type
Thomas Klausner <tk@giga.or.at>
parents: 1341
diff changeset
114 fd_log_error("rt_rewrite: type mismatch: %s (type %s) mapped to %s (type %s) (continuing anyway)", source, type_base_name[dictdata_source.avp_basetype], dest, type_base_name[dictdata_dest.avp_basetype]);
1341
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
115 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
116 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
117 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
118
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
119 static void compare_avp_types(struct avp_match *start)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
120 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
121 struct avp_match *iter;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
122 for (iter=start; iter != NULL; iter=iter->next) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
123 compare_avp_types(iter->children);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
124 if (iter->target) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
125 struct avp_target *final;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
126 final = iter->target;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
127 while (final->child) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
128 final = final->child;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
129 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
130 compare_avp_type(iter->name, final->name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
131 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
132 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
133 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
134 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
135
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
136 static void dump_config(struct avp_match *start, char *prefix)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
137 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
138 char *new_prefix = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
139 struct avp_match *iter;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
140 for (iter=start; iter != NULL; iter=iter->next) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
141 if (asprintf(&new_prefix, "%s/%s", prefix, iter->name) == -1) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
142 fd_log_error("rt_rewrite: dump_config: asprintf failed: %s", strerror(errno));
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
143 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
144 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
145 dump_config(iter->children, new_prefix);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
146 if (iter->target) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
147 print_target(iter->target, new_prefix);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
148 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
149 if (iter->drop) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
150 fd_log_debug("%s -> DROP", new_prefix);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
151 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
152 free(new_prefix);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
153 new_prefix = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
154 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
155 return;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
156 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
157
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
158 /* Parse the configuration file */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
159 int rt_rewrite_conf_handle(char * conffile)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
160 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
161 extern FILE * rt_rewrite_confin;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
162 int ret;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
163 char *top;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
164
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
165 TRACE_ENTRY("%p", conffile);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
166
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
167 TRACE_DEBUG (FULL, "Parsing configuration file: '%s'", conffile);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
168
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
169 /* to match other entries */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
170 if ((top=strdup("TOP")) == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
171 fd_log_error("strdup error: %s", strerror(errno));
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
172 return EINVAL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
173 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
174 if ((avp_match_start=avp_match_new(top)) == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
175 fd_log_error("malloc error: %s", strerror(errno));
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
176 free(top);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
177 return EINVAL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
178 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
179 rt_rewrite_confin = fopen(conffile, "r");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
180 if (rt_rewrite_confin == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
181 ret = errno;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
182 fd_log_debug("Unable to open extension configuration file '%s' for reading: %s", conffile, strerror(ret));
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
183 TRACE_DEBUG (INFO, "rt_rewrite: error occurred, message logged -- configuration file.");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
184 avp_match_free(avp_match_start);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
185 avp_match_start = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
186 return ret;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
187 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
188
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
189 rt_rewrite_confrestart(rt_rewrite_confin);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
190 ret = yyparse(conffile);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
191
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
192 fclose(rt_rewrite_confin);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
193
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
194 if (ret != 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
195 TRACE_DEBUG(INFO, "rt_rewrite: unable to parse the configuration file.");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
196 avp_match_free(avp_match_start);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
197 avp_match_start = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
198 return EINVAL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
199 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
200
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
201 compare_avp_types(avp_match_start);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
202 dump_config(avp_match_start, "");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
203
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
204 return 0;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
205 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
206
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
207 static int verify_avp(const char *name)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
208 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
209 struct dict_object *model;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
210 struct dict_avp_data dictdata;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
211
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
212 if (fd_dict_search(fd_g_config->cnf_dict, DICT_AVP, AVP_BY_NAME_ALL_VENDORS, name, &model, ENOENT) != 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
213 fd_log_error("Unable to find '%s' AVP in the loaded dictionaries", name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
214 return -1;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
215 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
216 fd_dict_getval(model, &dictdata);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
217 if (dictdata.avp_basetype == AVP_TYPE_GROUPED) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
218 return 1;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
219 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
220 return 0;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
221 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
222
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
223 static struct avp_match *avp_match_new(char *name) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
224 struct avp_match *ret;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
225
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
226 if ((ret=malloc(sizeof(*ret))) == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
227 fd_log_error("malloc error");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
228 return NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
229 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
230 ret->name = name;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
231 ret->next = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
232 ret->children = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
233 ret->target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
234 ret->drop = 0;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
235 return ret;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
236 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
237
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
238 static void avp_target_free(struct avp_target *target) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
239 struct avp_target *iter;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
240
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
241 for (iter=target; iter != NULL; ) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
242 struct avp_target *next;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
243 free(iter->name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
244 next = iter->child;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
245 free(iter);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
246 iter = next;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
247 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
248 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
249
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
250 void avp_match_free(struct avp_match *match) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
251 struct avp_match *iter;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
252
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
253 for (iter=match; iter != NULL; ) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
254 struct avp_match *next;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
255 free(iter->name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
256 next = iter->next;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
257 avp_match_free(iter->children);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
258 avp_target_free(iter->target);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
259 free(iter);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
260 iter = next;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
261 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
262 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
263
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
264 static struct avp_target *target_new(char *name) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
265 struct avp_target *ret;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
266
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
267 if ((ret=malloc(sizeof(*ret))) == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
268 fd_log_error("malloc error");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
269 return NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
270 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
271 ret->name = name;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
272 ret->child = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
273 return ret;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
274 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
275
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
276 static struct avp_match *add_avp_next_to(char *name, struct avp_match *target)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
277 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
278 struct avp_match *iter, *prev;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
279
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
280 if (target == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
281 return avp_match_new(name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
282 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
283
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
284 for (prev=iter=target; iter != NULL; iter=iter->next) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
285 if (strcmp(iter->name, name) == 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
286 return iter;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
287 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
288 prev = iter;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
289 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
290 prev->next = avp_match_new(name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
291 return prev->next;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
292 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
293
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
294 static int add(struct avp_match **target, char *name)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
295 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
296 struct avp_match *temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
297 if (verify_avp(name) < 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
298 return -1;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
299 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
300 temp = add_avp_next_to(name, (*target)->children);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
301 if ((*target)->children == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
302 (*target)->children = temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
303 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
304 *target = temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
305 return 0;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
306 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
307
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
308 /* build tree for source */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
309 static int source_add(char *name)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
310 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
311 if (source_target == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
312 source_target = avp_match_start;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
313 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
314 return add(&source_target, name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
315 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
316
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
317 /* build tree for destination */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
318 static int dest_add(char *name)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
319 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
320 struct avp_target *temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
321
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
322 if (verify_avp(name) < 0) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
323 return -1;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
324 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
325 if ((temp=target_new(name)) == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
326 dest_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
327 source_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
328 return -1;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
329 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
330 if (dest_target == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
331 dest_target = temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
332 source_target->target = dest_target;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
333 source_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
334 return 0;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
335 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
336 dest_target->child = temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
337 dest_target = temp;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
338 return 0;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
339 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
340
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
341 static void dest_finish(void)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
342 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
343 dest_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
344 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
345
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
346 /* same as source_add, but for drop */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
347 static int drop_add(char *name)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
348 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
349 if (drop_target == NULL) {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
350 drop_target = avp_match_start;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
351 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
352 return add(&drop_target, name);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
353 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
354
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
355 /* mark as to-drop */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
356 static void drop_finish(void)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
357 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
358 drop_target->drop = 1;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
359 drop_target = NULL;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
360 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
361
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
362 /* The Lex parser prototype */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
363 int rt_rewrite_conflex(YYSTYPE *lvalp, YYLTYPE *llocp);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
364
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
365 /* Function to report the errors */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
366 void yyerror (YYLTYPE *ploc, char * conffile, char const *s)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
367 {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
368 TRACE_DEBUG(INFO, "rt_rewrite: error in configuration parsing");
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
369
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
370 if (ploc->first_line != ploc->last_line)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
371 fd_log_debug("%s:%d.%d-%d.%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_line, ploc->last_column, s);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
372 else if (ploc->first_column != ploc->last_column)
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
373 fd_log_debug("%s:%d.%d-%d : %s", conffile, ploc->first_line, ploc->first_column, ploc->last_column, s);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
374 else
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
375 fd_log_debug("%s:%d.%d : %s", conffile, ploc->first_line, ploc->first_column, s);
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
376 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
377
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
378 %}
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
379
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
380 /* Values returned by lex for token */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
381 %union {
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
382 char *string; /* The string is allocated by strdup in lex.*/
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
383 }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
384
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
385 /* In case of error in the lexical analysis */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
386 %token LEX_ERROR
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
387
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
388 /* A (de)quoted string (malloc'd in lex parser; it must be freed after use) */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
389 %token <string> QSTRING
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
390
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
391 /* Tokens */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
392 %token MAP
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
393 %token DROP
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
394
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
395
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
396 /* -------------------------------------- */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
397 %%
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
398
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
399 /* The grammar definition */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
400 rules: /* empty ok */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
401 | rules map
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
402 | rules drop
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
403 ;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
404
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
405 /* source -> destination mapping */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
406 map: MAP '=' source_part '>' dest_part { dest_finish(); }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
407 ';'
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
408 ;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
409
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
410 source_part: source_part ':' QSTRING { if (source_add($3) < 0) { YYERROR; } }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
411 | QSTRING { if (source_add($1) < 0) { YYERROR; } }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
412 ;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
413
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
414 dest_part: dest_part ':' QSTRING { if (dest_add($3) < 0) { YYERROR; } }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
415 | QSTRING { if (dest_add($1) < 0) { YYERROR; } }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
416 ;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
417
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
418 /* for dropping an AVP */
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
419 drop: DROP '=' drop_part { drop_finish(); }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
420 ';'
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
421 ;
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
422
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
423 drop_part: drop_part ':' QSTRING { if (drop_add($3) < 0) { YYERROR; } }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
424 | QSTRING { if (drop_add($1) < 0) { YYERROR; } }
b0401251d8c0 rt_rewrite: new extension
Thomas Klausner <tk@giga.or.at>
parents:
diff changeset
425 ;
"Welcome to our mercurial repository"