comparison src/context.cpp @ 0:616666e2f34c

initial version
author carl
date Fri, 10 Mar 2006 10:30:08 -0800
parents
children 01268466f0dc
comparison
equal deleted inserted replaced
-1:000000000000 0:616666e2f34c
1 /*
2
3 Copyright (c) 2004 Carl Byington - 510 Software Group, released under
4 the GPL version 2 or any later version at your choice available at
5 http://www.fsf.org/licenses/gpl.txt
6
7 */
8
9 #include "includes.h"
10
11 // needed for socket io
12 #include <unistd.h>
13 #include <sys/ioctl.h>
14 #include <net/if.h>
15 #include <arpa/inet.h>
16 #include <netinet/in.h>
17 #include <netinet/tcp.h>
18 #include <netdb.h>
19 #include <sys/socket.h>
20 #include <sys/un.h>
21
22 static char* context_version="$Id$";
23
24 char *token_envfrom;
25 char *token_lbrace;
26 char *token_rbrace;
27 char *token_rcptto;
28 char *token_semi;
29
30 string_set all_strings; // owns all the strings, only modified by the config loader thread
31 const int maxlen = 1000; // used for snprintf buffers
32
33 CONFIG::CONFIG() {
34 reference_count = 0;
35 generation = 0;
36 load_time = 0;
37 }
38
39
40 CONFIG::~CONFIG() {
41 }
42
43
44 char *CONFIG::find(char *needle, &string_map haystack) {
45 string_map::iterator i = haystack.find(needle);
46 if (i != haystack.end()) return (*i).second; // found user@domain.tld key
47 char *x = strchr(needle, '@');
48 if (x) {
49 x++;
50 i = haystack.find(x);
51 if (i != haystack.end()) return (*i).second; // found domain.tld key
52 char y = *x;
53 *x = '\0';
54 i = haystack.find(needle);
55 *x = y;
56 if (i != haystack.end()) return (*i).second; // found user@ key
57 }
58 return NULL;
59 }
60
61
62 void CONFIG::dump() {
63 printf("rcpt_to {\n");
64 for (string_map::iterator i=rcpt_to.begin(); i!=rcpt_to.end(); i++) {
65 char *to = (*i).first;
66 char *target = (*i).second;
67 printf(" %s \t %s\n", to, target);
68 }
69 printf("};\n");
70 printf("env_from {\n");
71 for (string_map::iterator i=env_from.begin(); i!=env_from.end(); i++) {
72 char *from = (*i).first;
73 char *target = (*i).second;
74 printf(" %s \t %s\n", from, target);
75 }
76 printf("};\n");
77 }
78
79
80 ////////////////////////////////////////////////
81 // helper to discard the strings held by a string_set
82 //
83 void discard(string_set &s) {
84 for (string_set::iterator i=s.begin(); i!=s.end(); i++) {
85 free(*i);
86 }
87 s.clear();
88 }
89
90
91 ////////////////////////////////////////////////
92 // helper to register a string in a string set
93 //
94 char* register_string(string_set &s, char *name) {
95 string_set::iterator i = s.find(name);
96 if (i != s.end()) return *i;
97 char *x = strdup(name);
98 s.insert(x);
99 return x;
100 }
101
102
103 ////////////////////////////////////////////////
104 // register a global string
105 //
106 char* register_string(char *name) {
107 return register_string(all_strings, name);
108 }
109
110
111 ////////////////////////////////////////////////
112 //
113 bool tsa(TOKEN &tok, char *token);
114 bool tsa(TOKEN &tok, char *token) {
115 char *have = tok.next();
116 if (have == token) return true;
117 tok.token_error(token, have);
118 return false;
119 }
120
121
122 ////////////////////////////////////////////////
123 //
124 bool parse_rcpt_to(TOKEN &tok, CONFIG &dc);
125 bool parse_rcpt_to(TOKEN &tok, CONFIG &dc) {
126 if (!tsa(tok, token_lbrace)) return false;
127 while (true) {
128 char *have = tok.next();
129 if (!have) break;
130 if (have == token_rbrace) break;
131 if (have == token_semi) {
132 // optional separators
133 }
134 else {
135 char *target = tok.next();
136 dc.add_to(have, target);
137 }
138 }
139 return tsa(tok, token_semi);
140 }
141
142
143 ////////////////////////////////////////////////
144 //
145 bool parse_env_from(TOKEN &tok, CONFIG &dc);
146 bool parse_env_from(TOKEN &tok, CONFIG &dc) {
147 if (!tsa(tok, token_lbrace)) return false;
148 while (true) {
149 char *have = tok.next();
150 if (!have) break;
151 if (have == token_rbrace) break;
152 if (have == token_semi) {
153 // optional separators
154 }
155 else {
156 char *target = tok.next();
157 dc.add_from(have, target);
158 }
159 }
160 return tsa(tok, token_semi);
161 }
162
163
164 ////////////////////////////////////////////////
165 // parse a config file
166 //
167 bool load_conf(CONFIG &dc, char *fn) {
168 TOKEN tok(fn, &dc.config_files);
169 while (true) {
170 char *have = tok.next();
171 if (!have) break;
172 if (have == token_envfrom) {
173 if (!parse_env_from(tok, dc)) {
174 tok.token_error("load_conf() failed to parse env_from");
175 return false;
176 }
177 }
178 else if (have == token_rcptto) {
179 if (!parse_rcpt_to(tok, dc)) {
180 tok.token_error("load_conf() failed to parse rcpt_to");
181 return false;
182 }
183 }
184 else {
185 tok.token_error(token_context, have);
186 return false;
187 }
188 }
189 return true;
190 }
191
192
193 ////////////////////////////////////////////////
194 // init the tokens
195 //
196 void token_init() {
197 token_envfrom = register_string("env_from");
198 token_lbrace = register_string("{");
199 token_rbrace = register_string("}");
200 token_rcptto = register_string("rcpt_to");
201 token_semi = register_string(";");
202 }