ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libspf/docs/API/doxygen/html/util_8c-source.html
Revision: 1.1
Committed: Tue Nov 13 00:51:30 2007 UTC (18 years, 10 months ago) by root
Content type: text/html
Branch: MAIN
CVS Tags: HEAD
Log Message:
initial import of libspf-1.0.0-p5 from freebsd ports

File Contents

# Content
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
3 <title>libSPF v1.0: util.c Source File</title>
4 <link href="doxygen.css" rel="stylesheet" type="text/css">
5 </head><body>
6 <!-- Generated by Doxygen 1.3.8 -->
7 <div class="qindex"> <form class="search" action="search.php" method="get">
8 <a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <span class="search"><u>S</u>earch&nbsp;for&nbsp;<input class="search" type="text" name="query" value="" size="20" accesskey="s"/></span></form></div>
9 <h1>util.c</h1><a href="util_8c.html">Go to the documentation of this file.</a><pre class="fragment"><div>00001 <span class="comment">/* libspf - Sender Policy Framework library</span>
10 00002 <span class="comment">*</span>
11 00003 <span class="comment">* ANSI C implementation of spf-draft-200405.txt</span>
12 00004 <span class="comment">*</span>
13 00005 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
14 00006 <span class="comment">* Author: Sean Comeau &lt;scomeau@obscurity.org&gt;</span>
15 00007 <span class="comment">*</span>
16 00008 <span class="comment">* File: util.c</span>
17 00009 <span class="comment">* Desc: Utility functions</span>
18 00010 <span class="comment">*</span>
19 00011 <span class="comment">* License:</span>
20 00012 <span class="comment">*</span>
21 00013 <span class="comment">* The libspf Software License, Version 1.0</span>
22 00014 <span class="comment">*</span>
23 00015 <span class="comment">* Copyright (c) 2004 James Couzens &amp; Sean Comeau All rights</span>
24 00016 <span class="comment">* reserved.</span>
25 00017 <span class="comment">*</span>
26 00018 <span class="comment">* Redistribution and use in source and binary forms, with or without</span>
27 00019 <span class="comment">* modification, are permitted provided that the following conditions</span>
28 00020 <span class="comment">* are met:</span>
29 00021 <span class="comment">*</span>
30 00022 <span class="comment">* 1. Redistributions of source code must retain the above copyright</span>
31 00023 <span class="comment">* notice, this list of conditions and the following disclaimer.</span>
32 00024 <span class="comment">*</span>
33 00025 <span class="comment">* 2. Redistributions in binary form must reproduce the above copyright</span>
34 00026 <span class="comment">* notice, this list of conditions and the following disclaimer in</span>
35 00027 <span class="comment">* the documentation and/or other materials provided with the</span>
36 00028 <span class="comment">* distribution.</span>
37 00029 <span class="comment">*</span>
38 00030 <span class="comment">* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED</span>
39 00031 <span class="comment">* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES</span>
40 00032 <span class="comment">* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE</span>
41 00033 <span class="comment">* DISCLAIMED. IN NO EVENT SHALL THE AUTHORS MAKING USE OF THIS LICESEN</span>
42 00034 <span class="comment">* OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
43 00035 <span class="comment">* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
44 00036 <span class="comment">* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF</span>
45 00037 <span class="comment">* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND</span>
46 00038 <span class="comment">* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,</span>
47 00039 <span class="comment">* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT</span>
48 00040 <span class="comment">* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</span>
49 00041 <span class="comment">* SUCH DAMAGE.</span>
50 00042 <span class="comment">*</span>
51 00043 <span class="comment">*/</span>
52 00044
53 00045 <span class="preprocessor">#ifdef _WITH_PTHREADS</span>
54 00046 <span class="preprocessor"></span><span class="preprocessor">#include &lt;pthread.h&gt;</span> <span class="comment">/* pthread_mutex_t */</span>
55 00047 <span class="preprocessor">#endif </span><span class="comment">/* _WITH_PTHREADS */</span>
56 00048
57 00049 <span class="preprocessor">#include "<a class="code" href="util_8h.html">util.h</a>"</span> <span class="comment">/* Utility functions */</span>
58 00050 <span class="preprocessor">#include "<a class="code" href="dns_8h.html">dns.h</a>"</span> <span class="comment">/* DNS Functions */</span>
59 00051
60 00052 <span class="preprocessor">#undef VERSION </span><span class="comment">/* autoconf */</span>
61 00053
62 00054
63 00055 <span class="preprocessor">#ifdef _WITH_PTHREADS</span>
64 00056 <span class="preprocessor"></span> <span class="comment">/*</span>
65 00057 <span class="comment"> * pthread mutex used to facilitate reentrant competence within the</span>
66 00058 <span class="comment"> * utility functions (generally the debugging functionality, you</span>
67 00059 <span class="comment"> * could (after some poking around) probably safely remove this if</span>
68 00060 <span class="comment"> * debugging was disabled)</span>
69 00061 <span class="comment">*/</span>
70 00062 pthread_mutex_t <a class="code" href="util_8c.html#a0">util_mutex</a>;
71 00063
72 00064 <span class="preprocessor">#else</span>
73 00065 <span class="preprocessor"></span><span class="comment">/* utility functions dummy pthread mutex wrapper */</span>
74 <a name="l00066"></a><a class="code" href="util_8h.html#a23">00066</a> <span class="keywordtype">void</span> *<a class="code" href="util_8c.html#a0">util_mutex</a>;
75 00067
76 00068 <span class="preprocessor">#endif </span><span class="comment">/* _WITH_PTHREADS */</span>
77 00069
78 00070
79 00071
80 00072 <span class="comment">/*</span>
81 00073 <span class="comment"> * globals</span>
82 00074 <span class="comment"> *</span>
83 00075 <span class="comment">*/</span>
84 00076
85 00077 <span class="keyword">extern</span> <span class="keywordtype">int</span> <a class="code" href="util_8c.html#a1">errno</a>;
86 00078
87 00079
88 00080
89 00081 <span class="comment">/* _pprintf_dbg</span>
90 00082 <span class="comment">*</span>
91 00083 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
92 00084 <span class="comment">*</span>
93 00085 <span class="comment">* Date: 09/08/04</span>
94 00086 <span class="comment">*</span>
95 00087 <span class="comment">* Desc:</span>
96 00088 <span class="comment">* Handles debugging output when no variadic macro's are desired</span>
97 00089 <span class="comment">* and the caller simply wishes to send a single string to output but</span>
98 00090 <span class="comment">* wishes to have the appropriate function and other identifiers</span>
99 00091 <span class="comment">* prepended.</span>
100 00092 <span class="comment">*</span>
101 00093 <span class="comment">* Referenced by xpprintf (formerly used for profile output)</span>
102 00094 <span class="comment">* and xepprintf.</span>
103 00095 <span class="comment">*</span>
104 00096 <span class="comment">*/</span>
105 <a name="l00097"></a><a class="code" href="util_8h.html#a25">00097</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a25">_pprintf_dbg</a>(u_int8_t level, <span class="keyword">const</span> <span class="keywordtype">char</span> *func, <span class="keyword">const</span> <span class="keywordtype">char</span> * file,
106 00098 <span class="keyword">const</span> size_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> *s)
107 00099 {
108 00100 <span class="keywordtype">char</span> *buf; <span class="comment">/* working buffer */</span>
109 00101
110 00102
111 00103 <span class="keywordflow">if</span> (!s)
112 00104 {
113 00105 fprintf(stderr, <span class="stringliteral">"_eprintf_dbg passed a NULL string\n"</span>);
114 00106 fflush(stderr);
115 00107
116 00108 <span class="keywordflow">return</span>;
117 00109 }
118 00110
119 00111 buf = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a> + 1);
120 00112 snprintf(buf, <a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a>, <span class="stringliteral">"[%s :: %s-&gt;%i]; %s"</span>, func, file, line, s);
121 00113
122 00114 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a16">f_bit_set</a>(<a class="code" href="main_8c.html#a0">confg</a>.<a class="code" href="structspf__config__s.html#o0">level</a>, level))
123 00115 {
124 00116 <span class="keywordflow">if</span> (level == <a class="code" href="main_8h.html#a4">FL_D</a>) <span class="comment">/* xpprintf */</span>
125 00117 {
126 00118 fprintf(stdout, buf);
127 00119 fflush(stdout);
128 00120 }
129 00121 }
130 00122
131 00123 <span class="keywordflow">if</span> (level == <a class="code" href="main_8h.html#a6">FL_F</a>) <span class="comment">/* xepprintf */</span>
132 00124 {
133 00125 fprintf(stderr, buf);
134 00126 fflush(stderr);
135 00127 }
136 00128
137 00129 <a class="code" href="util_8h.html#a6">xfree</a>(buf);
138 00130
139 00131 <span class="keywordflow">return</span>;
140 00132 }
141 00133
142 00134
143 00135 <span class="comment">/* _printf_dbg</span>
144 00136 <span class="comment">*</span>
145 00137 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
146 00138 <span class="comment">*</span>
147 00139 <span class="comment">* Date: 12/25/03</span>
148 00140 <span class="comment">* Date: 02/18/04 (updated)</span>
149 00141 <span class="comment">*</span>
150 00142 <span class="comment">* Desc:</span>
151 00143 <span class="comment">* Tied to a compile time switch this can instantly and at little</span>
152 00144 <span class="comment">* to no real expense enable a discreet debugging with out hoards of</span>
153 00145 <span class="comment">* #ifdefs all over the place.</span>
154 00146 <span class="comment">*</span>
155 00147 <span class="comment">* Date: 09/08/04 - James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
156 00148 <span class="comment">*</span>
157 00149 <span class="comment">* Desc:</span>
158 00150 <span class="comment">* Modified to handle output for xeprintf (behaviour adjusted to call</span>
159 00151 <span class="comment">* here instead) so that its actually clear where errors are being raised from.</span>
160 00152 <span class="comment">*</span>
161 00153 <span class="comment">*/</span>
162 <a name="l00154"></a><a class="code" href="util_8h.html#a24">00154</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a24">_printf_dbg</a>(u_int8_t level, <span class="keyword">const</span> <span class="keywordtype">char</span> *func, <span class="keyword">const</span> <span class="keywordtype">char</span> *file,
163 00155 <span class="keyword">const</span> size_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> *format,...)
164 00156 {
165 00157 <span class="preprocessor">#ifdef _SPF_DEBUG_LOGFILE</span>
166 00158 <span class="preprocessor"></span> FILE *fp = NULL; <span class="comment">/* file pointer */</span>
167 00159 <span class="preprocessor">#endif </span><span class="comment">/* _SPF_DEBUG_LOGFILE */</span>
168 00160
169 00161 <span class="keywordtype">char</span> *buf; <span class="comment">/* working buffer */</span>
170 00162 <span class="keywordtype">char</span> *tbuf; <span class="comment">/* working buffer for eprintf */</span>
171 00163
172 00164 va_list argptr; <span class="comment">/* pointer to current argument from array */</span>
173 00165
174 00166
175 00167 <a class="code" href="util_8h.html#a14">xpthread_mutex_lock</a>(&amp;<a class="code" href="util_8c.html#a0">util_mutex</a>);
176 00168
177 00169 <span class="keywordflow">if</span> (!format || *format == <span class="charliteral">'\0'</span>)
178 00170 {
179 00171 fprintf(stderr, <span class="stringliteral">"_printf_dbg passed null format array\n"</span>);
180 00172 fflush(stderr);
181 00173
182 00174 <span class="keywordflow">return</span>;
183 00175 }
184 00176
185 00177 buf = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a> + 1);
186 00178 tbuf = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a> + 1);
187 00179
188 00180 va_start(argptr, format);
189 00181 vsnprintf(buf, <a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a>, format, argptr);
190 00182 va_end(argptr);
191 00183
192 00184 snprintf(tbuf, <a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a>, <span class="stringliteral">"[%s :: %s-&gt;%i]; %s"</span>, func, file, line, buf);
193 00185
194 00186 <span class="comment">/* xepprintf */</span>
195 00187 <span class="keywordflow">if</span> (level == <a class="code" href="main_8h.html#a5">FL_E</a>)
196 00188 {
197 00189 fprintf(stderr, tbuf);
198 00190 fflush(stderr);
199 00191 }
200 00192 <span class="keywordflow">else</span>
201 00193 {
202 00194 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a16">f_bit_set</a>(<a class="code" href="main_8c.html#a0">confg</a>.<a class="code" href="structspf__config__s.html#o0">level</a>, level))
203 00195 {
204 00196 <span class="preprocessor">#ifndef _SPF_DEBUG_LOGFILE</span>
205 00197 <span class="preprocessor"></span> fprintf(stdout, tbuf);
206 00198 fflush(stdout);
207 00199 <span class="preprocessor">#else</span>
208 00200 <span class="preprocessor"></span> <span class="keywordflow">if</span> ((fp = fopen(<a class="code" href="util_8h.html#a18">DEBUG_LOG_FILE</a>, <span class="stringliteral">"a"</span>)) != NULL)
209 00201 {
210 00202 fprintf(fp, <span class="stringliteral">"[%s :: %s-&gt;%i]; %s"</span>, func, file, line, buf);
211 00203 fclose(fp);
212 00204 }
213 00205 <span class="keywordflow">else</span>
214 00206 {
215 00207 fprintf(stderr, <span class="stringliteral">"libSPF can't open file (%s) for writing!\n"</span>,
216 00208 <a class="code" href="util_8h.html#a18">DEBUG_LOG_FILE</a>);
217 00209 fflush(stderr);
218 00210 perror(func);
219 00211 }
220 00212 <span class="preprocessor">#endif </span><span class="comment">/* _SPF_DEBUG_LOGFILE */</span>
221 00213 }
222 00214 } <span class="comment">/* else */</span>
223 00215
224 00216 free(buf);
225 00217 free(tbuf);
226 00218
227 00219 <a class="code" href="util_8h.html#a15">xpthread_mutex_unlock</a>(&amp;<a class="code" href="util_8c.html#a0">util_mutex</a>);
228 00220
229 00221 <span class="keywordflow">return</span>;
230 00222 }
231 00223
232 00224
233 00225 <span class="preprocessor">#ifndef _SPF_DEBUG_LOGFILE</span>
234 00226 <span class="preprocessor"></span><span class="comment">/* dummy_debug</span>
235 00227 <span class="comment">*</span>
236 00228 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
237 00229 <span class="comment">*</span>
238 00230 <span class="comment">* Date: 12/25/03</span>
239 00231 <span class="comment">*</span>
240 00232 <span class="comment">* Desc:</span>
241 00233 <span class="comment">* dummy function thats used instead of the _printf_dbg function</span>
242 00234 <span class="comment">* when compiling without debugging</span>
243 00235 <span class="comment">*</span>
244 00236 <span class="comment">*/</span>
245 <a name="l00237"></a><a class="code" href="util_8h.html#a26">00237</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a26">_dummy_debug</a>(<span class="keyword">const</span> u_int8_t level, <span class="keyword">const</span> <span class="keywordtype">char</span> *func, <span class="keyword">const</span> <span class="keywordtype">char</span> *file,
246 00238 <span class="keyword">const</span> size_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> *format,...)
247 00239 {
248 00240 <span class="keywordflow">return</span>;
249 00241 }
250 00242
251 00243
252 00244 <span class="comment">/* dummy_debug</span>
253 00245 <span class="comment">*</span>
254 00246 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
255 00247 <span class="comment">* </span>
256 00248 <span class="comment">* Date: 12/25/03</span>
257 00249 <span class="comment">* </span>
258 00250 <span class="comment">* Desc:</span>
259 00251 <span class="comment">* dummy function thats used instead of the _printf_dbg function</span>
260 00252 <span class="comment">* when compiling without debugging</span>
261 00253 <span class="comment">* </span>
262 00254 <span class="comment">*/</span>
263 <a name="l00255"></a><a class="code" href="util_8h.html#a27">00255</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a27">_dummy_pdebug</a>(<span class="keyword">const</span> u_int8_t level, <span class="keyword">const</span> <span class="keywordtype">char</span> *func, <span class="keyword">const</span> <span class="keywordtype">char</span> *file,
264 00256 <span class="keyword">const</span> size_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> *s)
265 00257 {
266 00258 <span class="keywordflow">return</span>;
267 00259 }
268 00260
269 00261 <span class="preprocessor">#endif</span>
270 00262 <span class="preprocessor"></span>
271 00263
272 00264 <span class="comment">/* UTIL_get_date</span>
273 00265 <span class="comment">*</span>
274 00266 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
275 00267 <span class="comment">* Date: Sun Jan 18 06:02:13 PST 2004</span>
276 00268 <span class="comment">*</span>
277 00269 <span class="comment">* Desc:</span>
278 00270 <span class="comment">* Returns in a buffer that must be freed by the caller, the date</span>
279 00271 <span class="comment">* in the format YY-MM-DD HH:MM:SS and is derived from UTC time.</span>
280 00272 <span class="comment">*</span>
281 00273 <span class="comment">* Date: 09/08/04 - James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
282 00274 <span class="comment">*</span>
283 00275 <span class="comment">* Desc:</span>
284 00276 <span class="comment">* Added pthread mutex lock during body of this function because it</span>
285 00277 <span class="comment">* appears as those inspite of the use of localtime_r there is some un-safe</span>
286 00278 <span class="comment">* behaviour that goes on here so for now the mutex here appears to solve</span>
287 00279 <span class="comment">* the problem.</span>
288 00280 <span class="comment">*</span>
289 00281 <span class="comment">*/</span>
290 <a name="l00282"></a><a class="code" href="util_8h.html#a32">00282</a> <span class="keywordtype">char</span> *<a class="code" href="util_8c.html#a6">UTIL_get_date</a>(<span class="keywordtype">void</span>)
291 00283 {
292 00284 <span class="keyword">struct </span>tm *now; <span class="comment">/* time in tm struct format */</span>
293 00285 <span class="keyword">struct </span>tm tmbuf; <span class="comment">/* reentrant buffer for localtime_r */</span>
294 00286
295 00287 time_t curtime; <span class="comment">/* current time time_t struct format */</span>
296 00288
297 00289 <span class="keywordtype">char</span> *my_time; <span class="comment">/* time in human readable format */</span>
298 00290
299 00291
300 00292 <a class="code" href="util_8h.html#a14">xpthread_mutex_lock</a>(&amp;<a class="code" href="util_8c.html#a0">util_mutex</a>);
301 00293
302 00294 curtime = time(NULL);
303 00295 now = localtime_r(&amp;curtime, &amp;tmbuf);
304 00296 my_time = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a1">SPF_MAX_DATETIME</a>);
305 00297
306 00298 strftime(my_time, <a class="code" href="util_8h.html#a1">SPF_MAX_DATETIME</a>, <span class="stringliteral">"%Y-%m-%d %H:%M:%S "</span>, now);
307 00299 my_time[(<a class="code" href="util_8h.html#a1">SPF_MAX_DATETIME</a> - 1)] = <span class="charliteral">'\0'</span>;
308 00300
309 00301 <a class="code" href="util_8h.html#a15">xpthread_mutex_unlock</a>(&amp;<a class="code" href="util_8c.html#a0">util_mutex</a>);
310 00302
311 00303 <span class="keywordflow">return</span>(my_time);
312 00304 }
313 00305
314 00306
315 00307 <span class="comment">/* UTIL_log_result</span>
316 00308 <span class="comment">*</span>
317 00309 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
318 00310 <span class="comment">*</span>
319 00311 <span class="comment">* Date: 02/04/04</span>
320 00312 <span class="comment">*</span>
321 00313 <span class="comment">* Desc:</span>
322 00314 <span class="comment">* Tied to a compile time switch this can instantly and at little</span>
323 00315 <span class="comment">* to no real expense enable a discreet debugging with out hoards of</span>
324 00316 <span class="comment">* #ifdefs all over the place.</span>
325 00317 <span class="comment">*</span>
326 00318 <span class="comment">* Date: 09/08/04 - James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
327 00319 <span class="comment">*</span>
328 00320 <span class="comment">* Desc:</span>
329 00321 <span class="comment">* Added pthread mutex lock during body of this function because it</span>
330 00322 <span class="comment">* is to the detriment of stability to have multiple threads attempting to</span>
331 00323 <span class="comment">* open/write/close the same file at the same time! :-)</span>
332 00324 <span class="comment">*</span>
333 00325 <span class="comment">*/</span>
334 <a name="l00326"></a><a class="code" href="util_8h.html#a31">00326</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a31">UTIL_log_result</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p)
335 00327 {
336 00328 FILE *fp = NULL; <span class="comment">/* file pointer */</span>
337 00329
338 00330 <span class="keywordtype">char</span> *buf; <span class="comment">/* working buffer */</span>
339 00331 <span class="keywordtype">char</span> *date; <span class="comment">/* date/time stamp */</span>
340 00332
341 00333
342 00334 date = <a class="code" href="util_8c.html#a6">UTIL_get_date</a>();
343 00335 buf = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a>);
344 00336 *(date + (strlen(date) - 1)) = <span class="charliteral">'\0'</span>;
345 00337
346 00338 <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structpeer__info__s.html#o5">spf_ver</a> == 0)
347 00339 {
348 00340 p-&gt;<a class="code" href="structpeer__info__s.html#o5">spf_ver</a> = <a class="code" href="spf_8h.html#a1">SPF_VERSION</a>;
349 00341 }
350 00342
351 00343 <a class="code" href="util_8h.html#a14">xpthread_mutex_lock</a>(&amp;<a class="code" href="util_8c.html#a0">util_mutex</a>);
352 00344
353 00345 snprintf(buf, <a class="code" href="spf_8h.html#a3">SPF_MAX_DEBUG</a>,
354 00346 <span class="stringliteral">"[%s] result: %s :: %s [%s], ver: %i, depth: %i, error: (%s)\n"</span>,
355 00347 date, p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a>].s, p-&gt;<a class="code" href="structpeer__info__s.html#o10">from</a>,
356 00348 p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o27">spf_rlevel</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o5">spf_ver</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>);
357 00349
358 00350 <span class="keywordflow">if</span> ((fp = fopen(<a class="code" href="util_8h.html#a19">OUTPUT_LOG_FILE</a>, <span class="stringliteral">"a"</span>)) != NULL)
359 00351 {
360 00352 fprintf(fp, <span class="stringliteral">"%s"</span>, buf);
361 00353 fclose(fp);
362 00354 }
363 00355
364 00356 <a class="code" href="util_8h.html#a15">xpthread_mutex_unlock</a>(&amp;<a class="code" href="util_8c.html#a0">util_mutex</a>);
365 00357
366 00358 <a class="code" href="util_8h.html#a6">xfree</a>(date);
367 00359 <a class="code" href="util_8h.html#a6">xfree</a>(buf);
368 00360
369 00361 <span class="keywordflow">return</span>;
370 00362 }
371 00363
372 00364
373 00365 <span class="comment">/* xstrndup</span>
374 00366 <span class="comment">*</span>
375 00367 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
376 00368 <span class="comment">*</span>
377 00369 <span class="comment">* Date: 12/25/03</span>
378 00370 <span class="comment">*</span>
379 00371 <span class="comment">* Desc:</span>
380 00372 <span class="comment">* n bytes are allocated and then filled with \0 chars. Char s</span>
381 00373 <span class="comment">* is copied over to the allocated memory writing n -1 bytes leaving the</span>
382 00374 <span class="comment">* new string NULL terminated. This new string is returned upon success</span>
383 00375 <span class="comment">* and NULL upon failure.</span>
384 00376 <span class="comment">*</span>
385 00377 <span class="comment">*/</span>
386 <a name="l00378"></a><a class="code" href="util_8h.html#a33">00378</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a33">UTIL_strndup</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> size_t n)
387 00379 {
388 00380 <span class="keywordtype">char</span> *ret_ptr = NULL; <span class="comment">/* return buffer */</span>
389 00381
390 00382
391 00383 <span class="keywordflow">if</span> ((s == NULL) || (n &lt;= 0))
392 00384 {
393 00385 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed string is NULL. Abort!.\n"</span>);
394 00386
395 00387 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
396 00388 }
397 00389
398 00390 ret_ptr = <a class="code" href="util_8h.html#a4">xmalloc</a>(n + 1);
399 00391 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Allocated %u bytes of memory.\n"</span>, n);
400 00392 snprintf(ret_ptr, n, s);
401 00393 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning string: (%s)\n"</span>, ret_ptr);
402 00394
403 00395 <span class="keywordflow">return</span>(ret_ptr);
404 00396 }
405 00397
406 00398
407 00399 <span class="comment">/* xstrdup</span>
408 00400 <span class="comment">*</span>
409 00401 <span class="comment">* Author: Patrick Earl (http://patearl.net/)</span>
410 00402 <span class="comment">* Adapted from xstrndup()</span>
411 00403 <span class="comment">*</span>
412 00404 <span class="comment">* Date: 02/04/04</span>
413 00405 <span class="comment">*</span>
414 00406 <span class="comment">* Desc:</span>
415 00407 <span class="comment">* strlen(s)+1 bytes are allocated and s is copied into the</span>
416 00408 <span class="comment">* freshly allocated memory. If the allocation or copy fails, NULL</span>
417 00409 <span class="comment">* NULL will be returned.</span>
418 00410 <span class="comment">*</span>
419 00411 <span class="comment">*/</span>
420 <a name="l00412"></a><a class="code" href="util_8h.html#a34">00412</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a34">UTIL_strdup</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
421 00413 {
422 00414 <span class="keywordtype">char</span> *ret_ptr = NULL; <span class="comment">/* return buffer */</span>
423 00415
424 00416
425 00417 <span class="keywordflow">if</span> (s == NULL)
426 00418 {
427 00419 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed string is NULL. Abort!.\n"</span>);
428 00420
429 00421 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
430 00422 }
431 00423
432 00424 <span class="keywordflow">if</span> ((ret_ptr = strdup(s)) == NULL)
433 00425 {
434 00426 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Unable to allocate memory\n"</span>);
435 00427 }
436 00428
437 00429 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning string: (%s)\n"</span>, ret_ptr);
438 00430
439 00431 <span class="keywordflow">return</span>(ret_ptr);
440 00432 }
441 00433
442 00434
443 00435 <span class="comment">/* UTIL_malloc</span>
444 00436 <span class="comment">*</span>
445 00437 <span class="comment">* Author: Travis Anderson &lt;travis@anthrax.ca&gt;</span>
446 00438 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
447 00439 <span class="comment">*</span>
448 00440 <span class="comment">* Date: 02/17/04</span>
449 00441 <span class="comment">*</span>
450 00442 <span class="comment">* Desc:</span>
451 00443 <span class="comment">* Wrapper for malloc. Upon success, behaves as malloc does.</span>
452 00444 <span class="comment">* Wrapper functionality is to print an error message and exit upon failure.</span>
453 00445 <span class="comment">*</span>
454 00446 <span class="comment">*/</span>
455 <a name="l00447"></a><a class="code" href="util_8h.html#a28">00447</a> <span class="keywordtype">void</span> *<a class="code" href="util_8h.html#a28">UTIL_malloc</a>(<span class="keyword">const</span> int32_t n, <span class="keyword">const</span> <span class="keywordtype">char</span> *file, int32_t line,
456 00448 <span class="keyword">const</span> <span class="keywordtype">char</span> *func)
457 00449 {
458 00450 <span class="keywordtype">void</span> *x = malloc(n);
459 00451
460 00452 <span class="keywordflow">if</span> (x == NULL)
461 00453 {
462 00454 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to allocate %i bytes at %s:%i in %s\n"</span>,
463 00455 n, file, line, func);
464 00456
465 00457 <span class="comment">/*</span>
466 00458 <span class="comment"> * Be advised this is the only place I do this, because quite</span>
467 00459 <span class="comment"> * honestly, if this library can't get a few bytes of memory,</span>
468 00460 <span class="comment"> * your mailserver segfaulting as a result of this exit, or </span>
469 00461 <span class="comment"> * quitting or whatever is the LEAST of your problems!</span>
470 00462 <span class="comment"> */</span>
471 00463 exit(0);
472 00464 }
473 00465
474 00466 memset(x, <span class="charliteral">'\0'</span>, n);
475 00467
476 00468 <span class="keywordflow">return</span>(x);
477 00469 }
478 00470
479 00471
480 00472 <span class="comment">/* UTIL_realloc</span>
481 00473 <span class="comment">*</span>
482 00474 <span class="comment">* Author: Travis Anderson &lt;travis@anthrax.ca&gt;</span>
483 00475 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
484 00476 <span class="comment">*</span>
485 00477 <span class="comment">* Date: 02/17/04</span>
486 00478 <span class="comment">*</span>
487 00479 <span class="comment">* Desc:</span>
488 00480 <span class="comment">* Wrapper for realloc. If 'p' is NULL, allocates memory via a call to</span>
489 00481 <span class="comment">* UTIL_malloc, otherwise if 'x' is assigned successfully, the behaviour is</span>
490 00482 <span class="comment">* identical to realloc. Wrapper functionality is to print an error message</span>
491 00483 <span class="comment">* and exit upon failure.</span>
492 00484 <span class="comment">*</span>
493 00485 <span class="comment">*/</span>
494 <a name="l00486"></a><a class="code" href="util_8h.html#a29">00486</a> <span class="keywordtype">void</span> *<a class="code" href="util_8h.html#a29">UTIL_realloc</a>(<span class="keywordtype">void</span> *p, <span class="keyword">const</span> int32_t n, <span class="keyword">const</span> <span class="keywordtype">char</span> *file,
495 00487 <span class="keyword">const</span> int32_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> *func)
496 00488 {
497 00489 <span class="keywordtype">void</span> *x = NULL;
498 00490
499 00491 <span class="keywordflow">if</span> (p == NULL)
500 00492 {
501 00493 <span class="keywordflow">return</span>(<a class="code" href="util_8h.html#a28">UTIL_malloc</a>(n, file, line, func));
502 00494 }
503 00495
504 00496 x = realloc(p, n);
505 00497 <span class="keywordflow">if</span> (x == NULL)
506 00498 {
507 00499 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to reallocate %i bytes at %s:%i in %s; "</span> \
508 00500 <span class="stringliteral">"original address 0x%x\n"</span>, n, file, line, func, (uintptr_t)p);
509 00501
510 00502 exit(0);
511 00503 }
512 00504
513 00505 <span class="keywordflow">return</span>(x);
514 00506 }
515 00507
516 00508
517 00509 <span class="comment">/* UTIL_free</span>
518 00510 <span class="comment">*</span>
519 00511 <span class="comment">* Author: Travis Anderson &lt;travis@anthrax.ca&gt;</span>
520 00512 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
521 00513 <span class="comment">*</span>
522 00514 <span class="comment">* Date: 02/17/04</span>
523 00515 <span class="comment">*</span>
524 00516 <span class="comment">* Desc:</span>
525 00517 <span class="comment">* Wrapper for free. Upon success, behaves as free does.</span>
526 00518 <span class="comment">* Wrapper functionality is to print an error message and exit upon</span>
527 00519 <span class="comment">* failure.</span>
528 00520 <span class="comment">*</span>
529 00521 <span class="comment">*/</span>
530 <a name="l00522"></a><a class="code" href="util_8h.html#a30">00522</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a30">UTIL_free</a>(<span class="keywordtype">void</span> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *file, <span class="keyword">const</span> int32_t line, <span class="keyword">const</span> <span class="keywordtype">char</span> *func)
531 00523 {
532 00524 <span class="keywordflow">if</span> (p == NULL)
533 00525 {
534 00526 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to free() on NULL pointer at %s:%i in %s; "</span> \
535 00527 <span class="stringliteral">"address 0x%x.\n"</span>, file, line, func, (uintptr_t)p);
536 00528
537 00529 <span class="keywordflow">return</span>;
538 00530 }
539 00531
540 00532 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Free address 0x%x by %s on line %i (%s)\n"</span>,
541 00533 (uintptr_t)p, func, line, file);
542 00534
543 00535 free(p);
544 00536
545 00537 <span class="keywordflow">return</span>;
546 00538 }
547 00539
548 00540
549 00541 <span class="comment">/* UTIL_index</span>
550 00542 <span class="comment">*</span>
551 00543 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
552 00544 <span class="comment">*</span>
553 00545 <span class="comment">* Date: 12/19/03</span>
554 00546 <span class="comment">*</span>
555 00547 <span class="comment">* Desc:</span>
556 00548 <span class="comment">* s is walked until c is found, at which time i is returned</span>
557 00549 <span class="comment">* which is the number of bytes from the left it walked until c was</span>
558 00550 <span class="comment">* found (not including c its self);</span>
559 00551 <span class="comment">*</span>
560 00552 <span class="comment">* Date: 09/01/04 - Roger Moser</span>
561 00553 <span class="comment">*</span>
562 00554 <span class="comment">* Desc:</span>
563 00555 <span class="comment">* The return upon an error (s being NULL for exmaple) is now</span>
564 00556 <span class="comment">* -1 because returning 0 was really ambiguous.</span>
565 00557 <span class="comment">*</span>
566 00558 <span class="comment">* Returns: -1 upon error</span>
567 00559 <span class="comment">* Returns: 0 upon no match</span>
568 00560 <span class="comment">* Returns: &gt; 0 upon success which is the number of bytes from the left</span>
569 00561 <span class="comment">* the string was walked until 'c' was found.</span>
570 00562 <span class="comment">*</span>
571 00563 <span class="comment">*/</span>
572 <a name="l00564"></a><a class="code" href="util_8h.html#a35">00564</a> int16_t <a class="code" href="util_8h.html#a35">UTIL_index</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> <span class="keywordtype">char</span> c)
573 00565 {
574 00566 int16_t i; <span class="comment">/* utility */</span>
575 00567
576 00568
577 00569 <span class="keywordflow">if</span> (s == NULL)
578 00570 {
579 00571 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
580 00572
581 00573 <span class="keywordflow">return</span>(-1);
582 00574 }
583 00575
584 00576 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with string: (%s); char: %c\n"</span>, s, c);
585 00577
586 00578 i = 0;
587 00579 <span class="keywordflow">while</span> (*s)
588 00580 {
589 00581 <span class="keywordflow">if</span> (*s == c)
590 00582 {
591 00583 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Found search char: (%c); Returning: (%i)\n"</span>, *s, i);
592 00584
593 00585 <span class="keywordflow">return</span>(i);
594 00586 }
595 00587 i++;
596 00588 s++;
597 00589 }
598 00590
599 00591 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function\n"</span>);
600 00592
601 00593 <span class="keywordflow">return</span>(0);
602 00594 }
603 00595
604 00596
605 00597 <span class="comment">/* UTIL_split_str</span>
606 00598 <span class="comment">*</span>
607 00599 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
608 00600 <span class="comment">*</span>
609 00601 <span class="comment">* Date: 01/21/04</span>
610 00602 <span class="comment">*</span>
611 00603 <span class="comment">* Desc:</span>
612 00604 <span class="comment">* s is walked through to find 'delim' until it finds 'delim'</span>
613 00605 <span class="comment">* num times. Upon final match it returns the remainder of the string</span>
614 00606 <span class="comment">* in a newly allocated buffer. Upon failure returns NULL.</span>
615 00607 <span class="comment">*</span>
616 00608 <span class="comment">* Date: 09/01/04 - Roger Moser</span>
617 00609 <span class="comment">* </span>
618 00610 <span class="comment">* Desc:</span>
619 00611 <span class="comment">* 'cp' was not being freed upon exiting the function when 'c'</span>
620 00612 <span class="comment">* was not found within the string.</span>
621 00613 <span class="comment">*</span>
622 00614 <span class="comment">*/</span>
623 <a name="l00615"></a><a class="code" href="util_8h.html#a36">00615</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a36">UTIL_split_str</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> <span class="keywordtype">char</span> c, <span class="keyword">const</span> u_int8_t num)
624 00616 {
625 00617 u_int8_t i; <span class="comment">/* utility */</span>
626 00618
627 00619 <span class="keywordtype">char</span> *cp; <span class="comment">/* copy buffer of s */</span>
628 00620 <span class="keywordtype">char</span> *p; <span class="comment">/* pointer to copy */</span>
629 00621 <span class="keywordtype">char</span> *ret; <span class="comment">/* return buffer */</span>
630 00622
631 00623
632 00624 <span class="keywordflow">if</span> (s == NULL)
633 00625 {
634 00626 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
635 00627
636 00628 <span class="keywordflow">return</span>(NULL);
637 00629 }
638 00630
639 00631 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with string: (%s); char (%c); int: (%i)\n"</span>,
640 00632 s, c, num);
641 00633
642 00634 p = cp = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>);
643 00635
644 00636 i = 0;
645 00637 <span class="keywordflow">while</span>(*p)
646 00638 {
647 00639 <span class="keywordflow">if</span> (*p == c)
648 00640 {
649 00641 i++;
650 00642 <span class="keywordflow">if</span> (i == num)
651 00643 {
652 00644 p++;
653 00645 ret = <a class="code" href="util_8h.html#a8">xstrndup</a>(p, <a class="code" href="spf_8h.html#a5">SPF_MAX_STR</a>);
654 00646
655 00647 <a class="code" href="util_8h.html#a6">xfree</a>(cp);
656 00648
657 00649 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"returning: %s\n"</span>, ret);
658 00650
659 00651 <span class="keywordflow">return</span>(ret);
660 00652 }
661 00653 }
662 00654 p++;
663 00655 }
664 00656
665 00657 <a class="code" href="util_8h.html#a6">xfree</a>(cp);
666 00658 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"[%i] returning NULL\n"</span>, i);
667 00659
668 00660 <span class="keywordflow">return</span>(NULL);
669 00661 }
670 00662
671 00663
672 00664 <span class="comment">/* UTIL_split_strr</span>
673 00665 <span class="comment">*</span>
674 00666 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
675 00667 <span class="comment">*</span>
676 00668 <span class="comment">* Date: 01/30/04</span>
677 00669 <span class="comment">*</span>
678 00670 <span class="comment">* Desc:</span>
679 00671 <span class="comment">* s is walked to the end of its self, and then is walked back</span>
680 00672 <span class="comment">* towards the beginning of the string until it has found 'c' the</span>
681 00673 <span class="comment">* delimiter, 'num' times. Upon success memory is allocated and the</span>
682 00674 <span class="comment">* remainder of s is returned. Upon failure NULL is returned.</span>
683 00675 <span class="comment">*</span>
684 00676 <span class="comment">* Date: 09/01/04 - Roger Moser</span>
685 00677 <span class="comment">*</span>
686 00678 <span class="comment">* Desc:</span>
687 00679 <span class="comment">* Replaced 'p = (char *)&amp;(s[strlen(s) - 1]);' with a more</span>
688 00680 <span class="comment">* optimized 'p = strchr(s, '\0') - 1;'. Also applied a fix so that</span>
689 00681 <span class="comment">* the function properly returns NULL when 's' is an empty string.</span>
690 00682 <span class="comment">*</span>
691 00683 <span class="comment">*/</span>
692 <a name="l00684"></a><a class="code" href="util_8h.html#a37">00684</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a37">UTIL_split_strr</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> <span class="keywordtype">char</span> c, <span class="keyword">const</span> u_int8_t num)
693 00685 {
694 00686 u_int8_t i; <span class="comment">/* number of times delim (c) is found */</span>
695 00687
696 00688 <span class="keywordtype">char</span> *p; <span class="comment">/* pointer to the last character of s before the \0 */</span>
697 00689 <span class="keywordtype">char</span> *ret; <span class="comment">/* return buffer */</span>
698 00690
699 00691
700 00692 <span class="keywordflow">if</span> ((s == NULL) || (*s == <span class="charliteral">'\0'</span>))
701 00693 {
702 00694 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
703 00695
704 00696 <span class="keywordflow">return</span>(NULL);
705 00697 }
706 00698
707 00699 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with (%s)\n"</span>, s);
708 00700
709 00701
710 00702 <span class="comment">/* assign 'p' to the last char before the null termination of 's'*/</span>
711 00703 <span class="comment">/*p = (char *)&amp;(s[strlen(s) - 1]);*/</span>
712 00704 p = (strchr(s, <span class="charliteral">'\0'</span>) - 1);
713 00705
714 00706 i = 0;
715 00707 <span class="keywordflow">while</span>(p != s)
716 00708 {
717 00709 <span class="keywordflow">if</span> (*p == c)
718 00710 {
719 00711 i++;
720 00712 <span class="keywordflow">if</span> (i == num)
721 00713 {
722 00714 <span class="keywordflow">if</span> (*p == <span class="charliteral">'.'</span>)
723 00715 {
724 00716 p++; <span class="comment">/* don't want that period */</span>
725 00717 }
726 00718
727 00719 ret = <a class="code" href="util_8h.html#a7">xstrdup</a>(p);
728 00720
729 00721 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"delimiter found (%i) times; returning (%s).\n"</span>, i, ret);
730 00722
731 00723 <span class="keywordflow">return</span>(ret);
732 00724 }
733 00725 }
734 00726 p--;
735 00727 }
736 00728
737 00729 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"delimiter (%c) found (%u) times; returing NULL\n"</span>, c, i);
738 00730
739 00731 <span class="keywordflow">return</span>(NULL);
740 00732 }
741 00733
742 00734
743 00735 <span class="comment">/* UTIL_count_delim</span>
744 00736 <span class="comment">*</span>
745 00737 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
746 00738 <span class="comment">*</span>
747 00739 <span class="comment">* Date: 01/21/04</span>
748 00740 <span class="comment">*</span>
749 00741 <span class="comment">* Desc:</span>
750 00742 <span class="comment">* s is walked through and each time 'delim' is found a counter is </span>
751 00743 <span class="comment">* incremented and once complete, that integer is returned to the calling </span>
752 00744 <span class="comment">* function. Specifically for the purposes of this project i is limited by its</span>
753 00745 <span class="comment">* type to 255.</span>
754 00746 <span class="comment">*</span>
755 00747 <span class="comment">* Returns: &gt; 0 &amp;&amp; &lt;= 255 upon success</span>
756 00748 <span class="comment">* Returns: 0 upon failure</span>
757 00749 <span class="comment">*</span>
758 00750 <span class="comment">*/</span>
759 <a name="l00751"></a><a class="code" href="util_8h.html#a38">00751</a> u_int8_t <a class="code" href="util_8h.html#a38">UTIL_count_delim</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> <span class="keywordtype">char</span> c)
760 00752 {
761 00753 u_int8_t i = 0; <span class="comment">/* utility */</span>
762 00754
763 00755
764 00756 <span class="keywordflow">if</span> (s == NULL)
765 00757 {
766 00758 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
767 00759
768 00760 <span class="keywordflow">return</span>(0);
769 00761 }
770 00762
771 00763 <span class="keywordflow">while</span> (*s &amp;&amp; i &lt; <a class="code" href="spf_8h.html#a6">SPF_MAX_DELIM</a>)
772 00764 {
773 00765 <span class="keywordflow">if</span> (*s == c)
774 00766 {
775 00767 i++;
776 00768 }
777 00769 s++;
778 00770 }
779 00771
780 00772 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"found (%i) number of delimiters; returning.\n"</span>, i);
781 00773
782 00774 <span class="keywordflow">return</span>(i);
783 00775 }
784 00776
785 00777
786 00778 <span class="comment">/* UTIL_is_spf_delim</span>
787 00779 <span class="comment">*</span>
788 00780 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
789 00781 <span class="comment">*</span>
790 00782 <span class="comment">* Date: 01/21/04</span>
791 00783 <span class="comment">*</span>
792 00784 <span class="comment">* Desc:</span>
793 00785 <span class="comment">* c is compared against all the valid spf delimiters and</span>
794 00786 <span class="comment">* in the case of a SPF_PASS, the function returns true, otherwise it will</span>
795 00787 <span class="comment">* return false.</span>
796 00788 <span class="comment">*</span>
797 00789 <span class="comment">*/</span>
798 <a name="l00790"></a><a class="code" href="util_8h.html#a39">00790</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a39">UTIL_is_spf_delim</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> c)
799 00791 {
800 00792
801 00793 <span class="keywordflow">if</span> (!c)
802 00794 {
803 00795 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"called with a NULL char! Aborting check.\n"</span>);
804 00796
805 00797 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
806 00798 }
807 00799
808 00800 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with char (%c)\n"</span>, c);
809 00801
810 00802 <span class="keywordflow">if</span> (c == <span class="charliteral">'.'</span> ||
811 00803 c == <span class="charliteral">'-'</span> ||
812 00804 c == <span class="charliteral">'+'</span> ||
813 00805 c == <span class="charliteral">','</span> ||
814 00806 c == <span class="charliteral">'|'</span> ||
815 00807 c == <span class="charliteral">'_'</span>)
816 00808 {
817 00809 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE\n"</span>);
818 00810
819 00811 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
820 00812 }
821 00813
822 00814 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE\n"</span>);
823 00815
824 00816 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
825 00817 }
826 00818
827 00819
828 00820 <span class="comment">/* UTIL_is_spf_result</span>
829 00821 <span class="comment">*</span>
830 00822 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
831 00823 <span class="comment">*</span>
832 00824 <span class="comment">* Date: 01/27/04</span>
833 00825 <span class="comment">*</span>
834 00826 <span class="comment">* Desc:</span>
835 00827 <span class="comment">* c is compared against all the valid spf prefixes and</span>
836 00828 <span class="comment">* in the case of a SPF_PASS, the function returns true, otherwise it will</span>
837 00829 <span class="comment">* return false.</span>
838 00830 <span class="comment">*</span>
839 00831 <span class="comment">*/</span>
840 <a name="l00832"></a><a class="code" href="util_8h.html#a40">00832</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a40">UTIL_is_spf_result</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> c)
841 00833 {
842 00834 <span class="keywordflow">if</span> (!c)
843 00835 {
844 00836 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"passed a NULL or empty char!\n"</span>);
845 00837
846 00838 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
847 00839 }
848 00840
849 00841 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with char (%c)\n"</span>, c);
850 00842
851 00843 <span class="keywordflow">if</span> (c == <span class="charliteral">'+'</span> || c == <span class="charliteral">'-'</span> || c == <span class="charliteral">'~'</span> || c == <span class="charliteral">'?'</span>)
852 00844 {
853 00845 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_TRUE\n"</span>);
854 00846
855 00847 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
856 00848 }
857 00849
858 00850 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE\n"</span>);
859 00851
860 00852 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
861 00853 }
862 00854
863 00855
864 00856 <span class="comment">/* UTIL_is_macro</span>
865 00857 <span class="comment">*</span>
866 00858 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
867 00859 <span class="comment">*</span>
868 00860 <span class="comment">* Date: 01/30/04</span>
869 00861 <span class="comment">*</span>
870 00862 <span class="comment">* Desc:</span>
871 00863 <span class="comment">* s is walked through in search of a macro which consist of</span>
872 00864 <span class="comment">* %{?}, ? being an SPF_UNKNOWN number of chars in between. An instance of</span>
873 00865 <span class="comment">* a macro is searched for. Upon success SPF_TRUE is returned. Upon failure</span>
874 00866 <span class="comment">* to find a macro, SPF_FALSE is returned.</span>
875 00867 <span class="comment">*</span>
876 00868 <span class="comment">*/</span>
877 <a name="l00869"></a><a class="code" href="util_8h.html#a41">00869</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a41">UTIL_is_macro</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
878 00870 {
879 00871 <span class="keywordflow">if</span> (s == NULL)
880 00872 {
881 00873 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
882 00874
883 00875 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
884 00876 }
885 00877
886 00878 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with string (%s)\n"</span>, s);
887 00879
888 00880 <span class="keywordflow">while</span> (*s++)
889 00881 {
890 00882 <span class="keywordflow">if</span> ((*s == <span class="charliteral">'%'</span>) &amp;&amp; (*(s + 1) == <span class="charliteral">'{'</span>))
891 00883 {
892 00884 <span class="keywordflow">if</span> (strstr(s, <span class="stringliteral">"}"</span>))
893 00885 {
894 00886 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_TRUE\n"</span>);
895 00887
896 00888 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
897 00889 }
898 00890 }
899 00891 }
900 00892
901 00893 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE\n"</span>);
902 00894
903 00895 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
904 00896 }
905 00897
906 00898
907 00899 <span class="comment">/* UTIL_mx_cmp</span>
908 00900 <span class="comment">*</span>
909 00901 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
910 00902 <span class="comment">*</span>
911 00903 <span class="comment">* Date: 01/02/04</span>
912 00904 <span class="comment">*</span>
913 00905 <span class="comment">* Desc:</span>
914 00906 <span class="comment">* Using the domain name found in the passed peer_info</span>
915 00907 <span class="comment">* structure, the associated T_MX records are looked up and then their</span>
916 00908 <span class="comment">* respective hostnames resolved (if they happen to be IP addresses the</span>
917 00909 <span class="comment">* resolver library takes care of this. &lt;3). Each IP is compared</span>
918 00910 <span class="comment">* against the remote peer's IP (from peer_info). Upon success returns</span>
919 00911 <span class="comment">* SPF_TRUE, upon failure returns SPF_FALSE.</span>
920 00912 <span class="comment">*</span>
921 00913 <span class="comment">*/</span>
922 <a name="l00914"></a><a class="code" href="util_8h.html#a42">00914</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a42">UTIL_mx_cmp</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> int8_t cidr)
923 00915 {
924 00916 <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> MX_SPF_MATCH; <span class="comment">/* true / false */</span>
925 00917
926 00918 <span class="keywordtype">char</span> *rr_data = NULL; <span class="comment">/* record */</span>
927 00919 <span class="keywordtype">char</span> *token; <span class="comment">/* token for splitting records */</span>
928 00920 <span class="keywordtype">char</span> *token_ptr; <span class="comment">/* working pointer when tokenizing */</span>
929 00921 <span class="keywordtype">char</span> *peer_ip; <span class="comment">/* remote host converted to string */</span>
930 00922
931 00923
932 00924 MX_SPF_MATCH = <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>;
933 00925 token_ptr = rr_data;
934 00926
935 00927 <span class="keywordflow">if</span> ((rr_data = <a class="code" href="dns_8h.html#a8">DNS_query</a>(p, s, T_MX, NULL)) == NULL)
936 00928 {
937 00929 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"SPF_ERROR parsing DNS Query\n"</span>);
938 00930
939 00931 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
940 00932 }
941 00933
942 00934 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"rr_data is: (%s)\n"</span>, rr_data);
943 00935
944 00936 peer_ip = <a class="code" href="util_8h.html#a8">xstrndup</a>(inet_ntoa(p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>), 16);
945 00937 token = strtok_r(rr_data, <span class="stringliteral">" "</span>, &amp;token_ptr);
946 00938
947 00939 <span class="keywordflow">while</span> (token != NULL)
948 00940 {
949 00941 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"TOKEN: (%s)\n"</span>, token);
950 00942
951 00943 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a54">UTIL_validate_hostname</a>(p, token, cidr) == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
952 00944 {
953 00945 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"%s validated via (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o10">from</a>, token);
954 00946
955 00947 MX_SPF_MATCH = <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>;
956 00948 <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(p, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>, NULL);
957 00949 token = NULL;
958 00950 }
959 00951 <span class="keywordflow">else</span>
960 00952 {
961 00953 token = strtok_r(NULL, <span class="stringliteral">" "</span>, &amp;token_ptr);
962 00954 }
963 00955 }
964 00956
965 00957 <a class="code" href="util_8h.html#a6">xfree</a>(peer_ip);
966 00958 <a class="code" href="util_8h.html#a6">xfree</a>(rr_data);
967 00959
968 00960 <span class="keywordflow">return</span>(MX_SPF_MATCH);
969 00961 }
970 00962
971 00963
972 00964 <span class="comment">/* UTIL_a_cmp</span>
973 00965 <span class="comment">*</span>
974 00966 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
975 00967 <span class="comment">*</span>
976 00968 <span class="comment">* Date: 01/02/04</span>
977 00969 <span class="comment">*</span>
978 00970 <span class="comment">* Desc:</span>
979 00971 <span class="comment">* Calls gethostbyname to grab all records associated with a the</span>
980 00972 <span class="comment">* hostname contained within s. On success returns SPF_TRUE, on SPF_ERROR</span>
981 00973 <span class="comment">* returns SPF_FALSE.</span>
982 00974 <span class="comment">*</span>
983 00975 <span class="comment">* Note:</span>
984 00976 <span class="comment">* We need to define and set a limit on the number of recursive</span>
985 00977 <span class="comment">* lookups. I recall seeing this in the RFC, we should discuss this.</span>
986 00978 <span class="comment">*</span>
987 00979 <span class="comment">*/</span>
988 <a name="l00980"></a><a class="code" href="util_8h.html#a43">00980</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a43">UTIL_a_cmp</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> int8_t cidr)
989 00981 {
990 00982 int16_t pos; <span class="comment">/* position in DNS packet */</span>
991 00983
992 00984 <span class="keywordtype">int</span> tmp_errno = 0; <span class="comment">/* temporary errno placeholder */</span>
993 00985
994 00986 size_t s_len; <span class="comment">/* length of s (hostname) */</span>
995 00987
996 00988 <span class="keywordtype">char</span> *rr_data = NULL; <span class="comment">/* data storage for DNS query */</span>
997 00989 <span class="keywordtype">char</span> *token_ptr = NULL; <span class="comment">/* token pointer */</span>
998 00990 <span class="keywordtype">char</span> *gbuf = NULL; <span class="comment">/* buf for reentrant gethostbyname call */</span>
999 00991 <span class="keywordtype">char</span> *copy = NULL; <span class="comment">/* copy of s */</span>
1000 00992 <span class="keywordtype">char</span> *cp = NULL; <span class="comment">/* pointer to copy of s */</span>
1001 00993
1002 00994 <span class="keywordtype">char</span> **a;
1003 00995
1004 00996 <span class="keyword">struct </span>hostent *hp = NULL; <span class="comment">/* hostent structure */</span>
1005 00997 <span class="keyword">struct </span>hostent tmp_hp; <span class="comment">/* temporary hostent (xgethostbyname) */</span>
1006 00998
1007 00999 <a class="code" href="structpolicy__addr__s.html">policy_addr_t</a> policy_addr; <span class="comment">/* used during CIDR comparisons */</span>
1008 01000
1009 01001
1010 01002 <span class="keywordflow">if</span> (s == NULL)
1011 01003 {
1012 01004 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed string is NULL. Abort!.\n"</span>);
1013 01005
1014 01006 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1015 01007 }
1016 01008
1017 01009 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with (%s) and cidr: %i\n"</span>, s, cidr);
1018 01010
1019 01011 gbuf = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a2">SPF_MAX_GHBNR_DBUF</a>);
1020 01012 s_len = strlen(s);
1021 01013 token_ptr = rr_data;
1022 01014
1023 01015 <span class="comment">/* we're dealing with a:some.hostname/cidr */</span>
1024 01016 <span class="keywordflow">if</span> ((s_len &gt; 1) &amp;&amp; (*(s + 1) == <span class="charliteral">':'</span>))
1025 01017 {
1026 01018 cp = copy = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, (s_len + 1));
1027 01019
1028 01020 <span class="keywordflow">if</span> (cidr != 32)
1029 01021 {
1030 01022 <span class="comment">/* We don't want a netmask, so lets remove it */</span>
1031 01023 cp[s_len - 3] = <span class="charliteral">'\0'</span>;
1032 01024 }
1033 01025
1034 01026 <span class="keywordflow">if</span> ((pos = <a class="code" href="util_8h.html#a35">UTIL_index</a>(cp, <span class="charliteral">':'</span>)) &lt;= 0)
1035 01027 {
1036 01028 <a class="code" href="util_8h.html#a12">xeprintf</a>(<span class="stringliteral">"ERROR parsing passed mechanism token (%s)\n"</span>, cp);
1037 01029
1038 01030 <a class="code" href="util_8h.html#a6">xfree</a>(copy);
1039 01031 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
1040 01032
1041 01033 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1042 01034 }
1043 01035
1044 01036 <span class="comment">/* move passed the mechanism text */</span>
1045 01037 cp += (pos + 1);
1046 01038 }
1047 01039 <span class="keywordflow">else</span>
1048 01040 {
1049 01041 cp = copy = <a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>, <a class="code" href="spf_8h.html#a14">SPF_MAX_HNAME</a>);
1050 01042 }
1051 01043
1052 01044 <span class="keywordflow">if</span> ((hp = <a class="code" href="dns_8h.html#a4">xgethostbyname</a>(cp, &amp;tmp_hp, gbuf, <a class="code" href="util_8h.html#a2">SPF_MAX_GHBNR_DBUF</a>,
1053 01045 &amp;tmp_errno)) != NULL)
1054 01046 {
1055 01047 <span class="keywordflow">for</span> (a = hp-&gt;h_addr_list; *a; a++)
1056 01048 {
1057 01049 memcpy(&amp;policy_addr.addr.s_addr, *a, <a class="code" href="util_8h.html#a3">SIZEOF</a>(<span class="keyword">struct</span> in_addr));
1058 01050
1059 01051 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"IN ADDR; Checking: %lu\n"</span>, policy_addr.addr.s_addr);
1060 01052
1061 01053 <span class="comment">/* cidr is assumed checked by the calling function! */</span>
1062 01054 policy_addr.cidr = cidr;
1063 01055
1064 01056 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a52">UTIL_cidr_cmp</a>(&amp;policy_addr, &amp;p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>) == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
1065 01057 {
1066 01058 *a = NULL;
1067 01059
1068 01060 <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(p, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>, NULL);
1069 01061
1070 01062 <a class="code" href="util_8h.html#a6">xfree</a>(copy);
1071 01063 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
1072 01064
1073 01065 <a class="code" href="dns_8h.html#a5">xgethostbyname_free</a>(); <span class="comment">/* unlock mutex */</span>
1074 01066
1075 01067 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1076 01068 }
1077 01069 } <span class="comment">/* for */</span>
1078 01070
1079 01071 <span class="keywordflow">for</span> (a = hp-&gt;h_aliases; *a; a++)
1080 01072 {
1081 01073 memcpy(&amp;policy_addr.addr.s_addr, *a, <a class="code" href="util_8h.html#a3">SIZEOF</a>(<span class="keyword">struct</span> in_addr));
1082 01074
1083 01075 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"IN CNAME; Checking: %lu\n"</span>, policy_addr.addr.s_addr);
1084 01076
1085 01077 <span class="comment">/* cidr is assumed checked by the calling function! */</span>
1086 01078 policy_addr.cidr = cidr;
1087 01079
1088 01080 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a52">UTIL_cidr_cmp</a>(&amp;policy_addr, &amp;p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>) == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
1089 01081 {
1090 01082 *a = NULL;
1091 01083
1092 01084 <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(p, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>, NULL);
1093 01085
1094 01086 <a class="code" href="util_8h.html#a6">xfree</a>(copy);
1095 01087 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
1096 01088
1097 01089 <a class="code" href="dns_8h.html#a5">xgethostbyname_free</a>(); <span class="comment">/* unlock mutex */</span>
1098 01090
1099 01091 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1100 01092 }
1101 01093 } <span class="comment">/* for */</span>
1102 01094 } <span class="comment">/* if .. xgethostbyname */</span>
1103 01095 <span class="keywordflow">else</span>
1104 01096 {
1105 01097 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"No address associated with hostname (%s); Reason: %s\n"</span>,
1106 01098 s, hstrerror(tmp_errno));
1107 01099 }
1108 01100
1109 01101 <a class="code" href="util_8h.html#a6">xfree</a>(copy);
1110 01102 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
1111 01103
1112 01104 <a class="code" href="dns_8h.html#a5">xgethostbyname_free</a>();
1113 01105
1114 01106 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1115 01107 }
1116 01108
1117 01109
1118 01110 <span class="comment">/* UTIL_ptr_cmp</span>
1119 01111 <span class="comment">*</span>
1120 01112 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1121 01113 <span class="comment">*</span>
1122 01114 <span class="comment">* Date: 01/08/04</span>
1123 01115 <span class="comment">*</span>
1124 01116 <span class="comment">* Desc:</span>
1125 01117 <span class="comment">* gethostbyaddr is broken in linux. ?-&gt;h_aliases is not NULL,</span>
1126 01118 <span class="comment">* however, it doesn't contain any valid pointers either. It grabs the</span>
1127 01119 <span class="comment">* first (and of course this is random) hostname it gets and thats all.</span>
1128 01120 <span class="comment">* As tested in FreeBSD however this call works. At any rate, I've</span>
1129 01121 <span class="comment">* written a function to deal with this called DNS_ptr_answer. From here</span>
1130 01122 <span class="comment">* that function is called which handles the reverse lookups and then</span>
1131 01123 <span class="comment">* attempts to "validate" each returned hostname by in turn looking it up</span>
1132 01124 <span class="comment">* to confirm if the ip address SPF_MATCHes. Returns SPF_TRUE on succes, and SPF_FALSE</span>
1133 01125 <span class="comment">* on failure.</span>
1134 01126 <span class="comment">*</span>
1135 01127 <span class="comment">* When passed SPF_TRUE copies into p-&gt;ptr_mhost, when SPF_FALSE copies</span>
1136 01128 <span class="comment">* into p-&gt;r_vhname</span>
1137 01129 <span class="comment">*</span>
1138 01130 <span class="comment">* Note:</span>
1139 01131 <span class="comment">* We need to define and set a limit on the number of recursive</span>
1140 01132 <span class="comment">* lookups. I recall seeing this in the RFC, we should discuss this.</span>
1141 01133 <span class="comment">*</span>
1142 01134 <span class="comment">*/</span>
1143 <a name="l01135"></a><a class="code" href="util_8h.html#a44">01135</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a44">UTIL_ptr_cmp</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1144 01136 {
1145 01137 <span class="keywordtype">char</span> *ptr_addr; <span class="comment">/* reversed address into PTR format */</span>
1146 01138 <span class="keywordtype">char</span> *tmp_ptr; <span class="comment">/* utility pointer */</span>
1147 01139
1148 01140
1149 01141 <span class="keywordflow">if</span> (s == NULL)
1150 01142 {
1151 01143 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed string is NULL. Abort!\n"</span>);
1152 01144
1153 01145 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1154 01146 }
1155 01147
1156 01148 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with (%s)\n"</span>, s);
1157 01149
1158 01150 <span class="comment">/* reverse of rpeer */</span>
1159 01151 ptr_addr = <a class="code" href="util_8h.html#a50">UTIL_rev_addr</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>);
1160 01152
1161 01153 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"address: %s\n"</span>, ptr_addr);
1162 01154
1163 01155 <span class="keywordflow">if</span> ((s = strstr(s, <span class="stringliteral">":"</span>)) != NULL)
1164 01156 {
1165 01157 s++;
1166 01158 tmp_ptr = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, (strlen(s) + 1));
1167 01159 }
1168 01160 <span class="keywordflow">else</span>
1169 01161 {
1170 01162 tmp_ptr = <a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>, <a class="code" href="spf_8h.html#a14">SPF_MAX_HNAME</a>);
1171 01163 }
1172 01164
1173 01165 <span class="keywordflow">if</span> (<a class="code" href="dns_8h.html#a8">DNS_query</a>(p, ptr_addr, T_PTR, tmp_ptr) != (<span class="keywordtype">char</span> *)<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
1174 01166 {
1175 01167 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Failed to pass SPF PTR mechanism check:%s\n"</span>, <span class="stringliteral">""</span>);
1176 01168 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"the domain pointed to by %s is not a valid subdomain of %s\n"</span>,
1177 01169 ptr_addr, tmp_ptr);
1178 01170
1179 01171 <a class="code" href="util_8h.html#a6">xfree</a>(ptr_addr);
1180 01172 <a class="code" href="util_8h.html#a6">xfree</a>(tmp_ptr);
1181 01173
1182 01174 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1183 01175 }
1184 01176
1185 01177 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"PTR lookup succeeded: (%s):(%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>,
1186 01178 p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>);
1187 01179
1188 01180 <a class="code" href="util_8h.html#a6">xfree</a>(ptr_addr);
1189 01181 <a class="code" href="util_8h.html#a6">xfree</a>(tmp_ptr);
1190 01182
1191 01183 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1192 01184 }
1193 01185
1194 01186
1195 01187 <span class="comment">/* UTIL_get_policy_mech</span>
1196 01188 <span class="comment">*</span>
1197 01189 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1198 01190 <span class="comment">*</span>
1199 01191 <span class="comment">* Date: 12/19/03</span>
1200 01192 <span class="comment">*</span>
1201 01193 <span class="comment">* Desc:</span>
1202 01194 <span class="comment">* Examins s and attempts to determine which SPF_MECHANISM</span>
1203 01195 <span class="comment">* enumeration the string SPF_MATCHes based on its conent.</span>
1204 01196 <span class="comment">*</span>
1205 01197 <span class="comment">*/</span>
1206 <a name="l01198"></a><a class="code" href="util_8h.html#a45">01198</a> <a class="code" href="spf_8h.html#a38">SPF_MECHANISM</a> <a class="code" href="util_8h.html#a45">UTIL_get_policy_mech</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1207 01199 {
1208 01200 <span class="keywordflow">if</span> (s == NULL || !s)
1209 01201 {
1210 01202 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
1211 01203
1212 01204 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a63">NO_POLICY</a>);
1213 01205 }
1214 01206
1215 01207 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with: (%s)\n"</span>, s);
1216 01208
1217 01209 <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"v="</span>, 2) == 0)
1218 01210 {
1219 01211 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (VERSION)\n"</span>, <a class="code" href="spf_8h.html#a90a64">VERSION</a>);
1220 01212
1221 01213 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a64">VERSION</a>);
1222 01214 }
1223 01215 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"ip4:"</span>, 4) == 0 )
1224 01216 {
1225 01217 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (IP4)\n"</span>, <a class="code" href="spf_8h.html#a90a70">IP4</a>);
1226 01218
1227 01219 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a70">IP4</a>);
1228 01220 }
1229 01221 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"ip6:"</span>, 4) == 0)
1230 01222 {
1231 01223 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (IP6)\n"</span>, <a class="code" href="spf_8h.html#a90a71">IP6</a>);
1232 01224
1233 01225 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a71">IP6</a>);
1234 01226 }
1235 01227 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"all"</span>, 3) == 0)
1236 01228 {
1237 01229 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (ALL)\n"</span>, <a class="code" href="spf_8h.html#a90a65">ALL</a>);
1238 01230
1239 01231 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a65">ALL</a>);
1240 01232 }
1241 01233 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"mx"</span>, 2) == 0)
1242 01234 {
1243 01235 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (MX)\n"</span>, <a class="code" href="spf_8h.html#a90a68">MX</a>);
1244 01236
1245 01237 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a68">MX</a>);
1246 01238 }
1247 01239 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"a:"</span>, 2) == 0 || (*s == <span class="charliteral">'a'</span> &amp;&amp; *(s + 1) == <span class="charliteral">'/'</span>)
1248 01240 || ((*s == <span class="charliteral">'a'</span>) &amp;&amp; !*(s + 1)))
1249 01241 {
1250 01242 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (A)\n"</span>, <a class="code" href="spf_8h.html#a90a67">A</a>);
1251 01243
1252 01244 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a67">A</a>);
1253 01245 }
1254 01246 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"ptr"</span>, 3) == 0)
1255 01247 {
1256 01248 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (PTR)\n"</span>, <a class="code" href="spf_8h.html#a90a69">PTR</a>);
1257 01249
1258 01250 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a69">PTR</a>);
1259 01251 }
1260 01252 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"include:"</span>, 7) == 0)
1261 01253 {
1262 01254 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (INCLUDE)\n"</span>, <a class="code" href="spf_8h.html#a90a66">INCLUDE</a>);
1263 01255
1264 01256 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a66">INCLUDE</a>);
1265 01257 }
1266 01258 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"exists:"</span>, 6) == 0)
1267 01259 {
1268 01260 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (EXISTS)\n"</span>, <a class="code" href="spf_8h.html#a90a72">EXISTS</a>);
1269 01261
1270 01262 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a72">EXISTS</a>);
1271 01263 }
1272 01264 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"redirect="</span>, 9) == 0)
1273 01265 {
1274 01266 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (REDIRECT)\n"</span>, <a class="code" href="spf_8h.html#a90a73">REDIRECT</a>);
1275 01267
1276 01268 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a73">REDIRECT</a>);
1277 01269 }
1278 01270 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"exp="</span>, 3) == 0)
1279 01271 {
1280 01272 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (EXPLAIN)\n"</span>, <a class="code" href="spf_8h.html#a90a74">EXPLAIN</a>);
1281 01273
1282 01274 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a74">EXPLAIN</a>);
1283 01275 }
1284 01276 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"default"</span>, 7) == 0)
1285 01277 {
1286 01278 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (DEFAULT)\n"</span>, <a class="code" href="spf_8h.html#a90a75">DEFAULT</a>);
1287 01279
1288 01280 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a75">DEFAULT</a>);
1289 01281 }
1290 01282 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strstr(s, <span class="stringliteral">":"</span>))
1291 01283 {
1292 01284 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning %i (UNMECH)\n"</span>, <a class="code" href="spf_8h.html#a90a76">UNMECH</a>);
1293 01285
1294 01286 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a76">UNMECH</a>);
1295 01287 }
1296 01288
1297 01289 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning NO_POLICY\n"</span>);
1298 01290 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a90a63">NO_POLICY</a>);
1299 01291 }
1300 01292
1301 01293
1302 01294 <span class="comment">/* UTIL_assoc_prefix</span>
1303 01295 <span class="comment">*</span>
1304 01296 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1305 01297 <span class="comment">*</span>
1306 01298 <span class="comment">* Date: 01/28/04</span>
1307 01299 <span class="comment">*</span>
1308 01300 <span class="comment">* Desc:</span>
1309 01301 <span class="comment">* Examins s and attempts to determine which SPF_MECHANISM_PREFIX</span>
1310 01302 <span class="comment">* enumeration the string SPF_MATCHes based on the its contents (which is a</span>
1311 01303 <span class="comment">* single char. Upon a SPF_PASS it stores the appropriate value inside of</span>
1312 01304 <span class="comment">* the passed peer_info structure. SPF_TRUE upon success, SPF_FALSE upon failure.</span>
1313 01305 <span class="comment">* Also upon failure SPF_ERROR (SPF_RESULT_TYPE) is stored in peer_info.</span>
1314 01306 <span class="comment">*</span>
1315 01307 <span class="comment">*</span>
1316 01308 <span class="comment">*/</span>
1317 <a name="l01309"></a><a class="code" href="util_8h.html#a47">01309</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <a class="code" href="spf_8h.html#a36">SPF_RESULT</a> res, <span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1318 01310 {
1319 01311 int16_t pos; <span class="comment">/* position in s string */</span>
1320 01312
1321 01313
1322 01314 <span class="comment">/* </span>
1323 01315 <span class="comment"> * for whatever result happens to match the case, a debug string is </span>
1324 01316 <span class="comment"> * printed (if compiled with), the level of recursion is made known through</span>
1325 01317 <span class="comment"> * this. An appropriate SPF_RESULT is assigned to the passed peer_info_t </span>
1326 01318 <span class="comment"> * structure's 'p-&gt;RES' variable. In addition a short SPF_RESULT string</span>
1327 01319 <span class="comment"> * (here is an example use of the spf_result_t structure spoke of in SPF_init)</span>
1328 01320 <span class="comment"> * is stored in 'p-&gt;rs', and finally an error string is stored in </span>
1329 01321 <span class="comment"> * 'p-&gt;error'. This string encompasses all SPF query return types though,</span>
1330 01322 <span class="comment"> * it is not only populated upon a parse error, so don't hesitate to reference</span>
1331 01323 <span class="comment"> * it when looking for a verbose explanation as to the result of an SPF parse.</span>
1332 01324 <span class="comment"> */</span>
1333 01325
1334 01326 <span class="keywordflow">if</span> (s != NULL)
1335 01327 {
1336 01328 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Entering function (%i) (%s)\n"</span>, res, s);
1337 01329
1338 01330 <span class="comment">/* support for old school deprecated mechanism "default" */</span>
1339 01331 <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"default"</span>, 7) == 0 &amp;&amp; (pos = <a class="code" href="util_8h.html#a35">UTIL_index</a>(s, <span class="charliteral">'='</span>)) &gt; 0)
1340 01332 {
1341 01333 s += (pos + 1); <span class="comment">/* move past default= */</span>
1342 01334 <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"deny"</span>, 4) == 0)
1343 01335 {
1344 01336 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_H_FAIL (%i) (%i)\n"</span>,
1345 01337 res, <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>);
1346 01338
1347 01339 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>;
1348 01340 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1349 01341
1350 01342 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1351 01343 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1352 01344
1353 01345 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1354 01346 }
1355 01347 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"pass"</span>, 4) == 0)
1356 01348 {
1357 01349 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_PASS (%i) (%i)\n"</span>,
1358 01350 res, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1359 01351
1360 01352 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>;
1361 01353 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1362 01354
1363 01355 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1364 01356 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1365 01357
1366 01358 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1367 01359 }
1368 01360 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"softdeny"</span>, 8) == 0)
1369 01361 {
1370 01362 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_S_FAIL (%i) (%i)\n"</span>,
1371 01363 res, <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>);
1372 01364
1373 01365 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>;
1374 01366 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1375 01367
1376 01368 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1377 01369 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1378 01370
1379 01371 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1380 01372 }
1381 01373 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"unknown"</span>, 7) == 0)
1382 01374 {
1383 01375 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_NEUTRAL (%i) (%i)\n"</span>,
1384 01376 res, <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1385 01377
1386 01378 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>;
1387 01379 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1388 01380
1389 01381 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1390 01382 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1391 01383
1392 01384 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1393 01385 }
1394 01386 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"include"</span>, 7) == 0)
1395 01387 {
1396 01388 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_UNKNOWN (%i) (%i)\n"</span>,
1397 01389 res, <a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>);
1398 01390
1399 01391 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>;
1400 01392 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1401 01393
1402 01394 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1403 01395 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1404 01396
1405 01397 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1406 01398 }
1407 01399 <span class="keywordflow">else</span>
1408 01400 {
1409 01401 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_ERROR (%i) (%i)\n"</span>,
1410 01402 res, <a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>);
1411 01403
1412 01404 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>;
1413 01405 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1414 01406
1415 01407 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1416 01408 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1417 01409
1418 01410 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1419 01411 }
1420 01412 }
1421 01413 }
1422 01414
1423 01415 <span class="keywordflow">switch</span> (res)
1424 01416 {
1425 01417
1426 01418 <span class="comment">/* */</span>
1427 01419 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>:
1428 01420 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_PASS (%i) (%i)\n"</span>,
1429 01421 res, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1430 01422
1431 01423 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>;
1432 01424 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1433 01425
1434 01426 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1435 01427 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1436 01428
1437 01429 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1438 01430
1439 01431 <span class="comment">/* */</span>
1440 01432 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a52">SPF_NONE</a>:
1441 01433 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_NONE (%i) (%i)\n"</span>,
1442 01434 res, <a class="code" href="spf_8h.html#a88a52">SPF_NONE</a>);
1443 01435
1444 01436 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a52">SPF_NONE</a>;
1445 01437 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a52">SPF_NONE</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1446 01438
1447 01439 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1448 01440 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1449 01441
1450 01442 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1451 01443
1452 01444 <span class="comment">/* */</span>
1453 01445 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>:
1454 01446 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_S_FAIL (%i) (%i)\n"</span>,
1455 01447 res, <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>);
1456 01448
1457 01449 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>;
1458 01450 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1459 01451
1460 01452 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1461 01453 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1462 01454
1463 01455 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1464 01456
1465 01457 <span class="comment">/* */</span>
1466 01458 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>:
1467 01459 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_H_FAIL (%i) (%i)\n"</span>,
1468 01460 res, <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>);
1469 01461
1470 01462 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>;
1471 01463 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1472 01464
1473 01465 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1474 01466 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1475 01467
1476 01468 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1477 01469
1478 01470 <span class="comment">/* */</span>
1479 01471 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>:
1480 01472 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_NEUTRAL (%i) (%i)\n"</span>,
1481 01473 res, <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1482 01474
1483 01475 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>;
1484 01476 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1485 01477
1486 01478 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1487 01479 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1488 01480
1489 01481 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1490 01482
1491 01483 <span class="comment">/* */</span>
1492 01484 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>:
1493 01485 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_UNKNOWN (%i) (%i)\n"</span>,
1494 01486 res, <a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>);
1495 01487
1496 01488 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>;
1497 01489 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a57">SPF_UNKNOWN</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1498 01490
1499 01491 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1500 01492 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1501 01493
1502 01494 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1503 01495
1504 01496 <span class="comment">/* */</span>
1505 01497 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>:
1506 01498 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_ERROR (%i) (%i)\n"</span>,
1507 01499 p, <a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>);
1508 01500
1509 01501 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>;
1510 01502 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1511 01503
1512 01504 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1513 01505 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1514 01506
1515 01507 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1516 01508
1517 01509 <span class="comment">/* */</span>
1518 01510 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a88a58">SPF_UNMECH</a>:
1519 01511 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_UNMECH (%i) (%i)\n"</span>,
1520 01512 res, <a class="code" href="spf_8h.html#a88a58">SPF_UNMECH</a>);
1521 01513
1522 01514 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a58">SPF_UNMECH</a>;
1523 01515 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a58">SPF_UNMECH</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1524 01516
1525 01517 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1526 01518 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1527 01519
1528 01520 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1529 01521
1530 01522 <span class="comment">/* */</span>
1531 01523 <span class="keywordflow">default</span>:
1532 01524 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Stored SPF_PASS (%i) (%i)\n"</span>,
1533 01525 res, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1534 01526
1535 01527 p-&gt;<a class="code" href="structpeer__info__s.html#o1">RES</a> = <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>;
1536 01528 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a> = p-&gt;<a class="code" href="structpeer__info__s.html#o25">spf_result</a>[<a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>].<a class="code" href="structspf__result__t.html#o1">s</a>;
1537 01529
1538 01530 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>, <a class="code" href="spf_8h.html#a16">SPF_MAX_ERROR</a>, <span class="stringliteral">"policy result: (%s) from rule (%s)"</span>,
1539 01531 p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>);
1540 01532
1541 01533 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1542 01534 }
1543 01535
1544 01536 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE.\n"</span>);
1545 01537
1546 01538 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1547 01539 }
1548 01540
1549 01541
1550 01542 <span class="comment">/* UTIL_get_mech_prefix</span>
1551 01543 <span class="comment">*</span>
1552 01544 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1553 01545 <span class="comment">*</span>
1554 01546 <span class="comment">* Date: 12/31/03</span>
1555 01547 <span class="comment">*</span>
1556 01548 <span class="comment">* Desc:</span>
1557 01549 <span class="comment">* Examins s and attempts to determine which SPF_RESULT_P</span>
1558 01550 <span class="comment">* enumeration the string SPF_MATCHes based on the its contents (which is a</span>
1559 01551 <span class="comment">* single char. Returns SPF_PASS if a valid prefix is not specified.</span>
1560 01552 <span class="comment">* Valid prefixes are: + (permit), - (deny), ~ (softfail) and ? (SPF_NEUTRAL).</span>
1561 01553 <span class="comment">*</span>
1562 01554 <span class="comment">*/</span>
1563 <a name="l01555"></a><a class="code" href="util_8h.html#a46">01555</a> <a class="code" href="spf_8h.html#a36">SPF_RESULT</a> <a class="code" href="util_8h.html#a46">UTIL_get_mech_prefix</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1564 01556 {
1565 01557 int16_t pos; <span class="comment">/* position in s */</span>
1566 01558
1567 01559
1568 01560 <span class="keywordflow">if</span> (s == NULL)
1569 01561 {
1570 01562 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
1571 01563
1572 01564 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>);
1573 01565 }
1574 01566
1575 01567 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"called with char: (%s)\n"</span>, s);
1576 01568 snprintf(p-&gt;<a class="code" href="structpeer__info__s.html#o23">last_m</a>, <a class="code" href="spf_8h.html#a14">SPF_MAX_HNAME</a>, <span class="stringliteral">"%s"</span>, s);
1577 01569
1578 01570 <span class="keywordflow">switch</span> (*s)
1579 01571 {
1580 01572
1581 01573 <span class="comment">/* */</span>
1582 01574 <span class="keywordflow">case</span> <span class="charliteral">'+'</span>:
1583 01575 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>;
1584 01576 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_PASS (%s) %i\n"</span>,
1585 01577 s, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1586 01578
1587 01579 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1588 01580
1589 01581
1590 01582 <span class="comment">/* */</span>
1591 01583 <span class="keywordflow">case</span> <span class="charliteral">'-'</span>:
1592 01584 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>;
1593 01585 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_H_FAIL (%s) %i\n"</span>,
1594 01586 s, <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>);
1595 01587
1596 01588 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>);
1597 01589
1598 01590 <span class="comment">/* */</span>
1599 01591 <span class="keywordflow">case</span> <span class="charliteral">'?'</span>:
1600 01592 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>;
1601 01593 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_NEUTRAL (%s) %i\n"</span>,
1602 01594 s, <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1603 01595
1604 01596 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1605 01597
1606 01598 <span class="comment">/* */</span>
1607 01599 <span class="keywordflow">case</span> <span class="charliteral">'~'</span>:
1608 01600 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>;
1609 01601 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_S_FAIL (%s) %i\n"</span>,
1610 01602 s, <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>);
1611 01603
1612 01604 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>);
1613 01605
1614 01606 <span class="comment">/* */</span>
1615 01607 <span class="keywordflow">default</span>:
1616 01608 <span class="keywordflow">if</span> (p-&gt;<a class="code" href="structpeer__info__s.html#o0">ALL</a> == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
1617 01609 {
1618 01610 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>;
1619 01611 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning (def) SPF_NEUTRAL (%s) %i\n"</span>,
1620 01612 s, <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1621 01613 }
1622 01614 <span class="keywordflow">else</span>
1623 01615 {
1624 01616 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>;
1625 01617 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning (def) SPF_PASS (%s) %i\n"</span>,
1626 01618 s, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1627 01619 }
1628 01620
1629 01621 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning (%i)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a>);
1630 01622
1631 01623 <span class="keywordflow">return</span>(p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a>);
1632 01624 } <span class="comment">/* switch */</span>
1633 01625
1634 01626 <span class="comment">/*</span>
1635 01627 <span class="comment"> * The code in the following statement is for the</span>
1636 01628 <span class="comment"> * deprecated mechanism "default" and is only here to attempt</span>
1637 01629 <span class="comment"> * to support exceptionally tardy early adopters whom likely</span>
1638 01630 <span class="comment"> * at this time no longer exist. As such this code is not</span>
1639 01631 <span class="comment"> * present in the current development versions of this library</span>
1640 01632 <span class="comment"> */</span>
1641 01633 <span class="keywordflow">if</span> ((pos = <a class="code" href="util_8h.html#a35">UTIL_index</a>(s, <span class="charliteral">'='</span>)) &gt; 0)
1642 01634 {
1643 01635 s += (pos + 1); <span class="comment">/* move past default= */</span>
1644 01636
1645 01637 <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"deny"</span>, 4) == 0)
1646 01638 {
1647 01639 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>;
1648 01640 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_H_FAIL on (%s)\n"</span>, s);
1649 01641
1650 01642 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a54">SPF_H_FAIL</a>);
1651 01643 }
1652 01644 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"pass"</span>, 4) == 0)
1653 01645 {
1654 01646 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>;
1655 01647 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_PASS on (%s)\n"</span>, s);
1656 01648
1657 01649 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>);
1658 01650 }
1659 01651 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"softdeny"</span>, 8) == 0)
1660 01652 {
1661 01653 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>;
1662 01654 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_S_FAIL on (%s)\n"</span>, s);
1663 01655
1664 01656 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a53">SPF_S_FAIL</a>);
1665 01657 }
1666 01658 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (strncmp(s, <span class="stringliteral">"unknown"</span>, 7) == 0)
1667 01659 {
1668 01660 p-&gt;<a class="code" href="structpeer__info__s.html#o2">RES_P</a> = <a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>;
1669 01661 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_NEUTRAL on (%s)\n"</span>, s);
1670 01662
1671 01663 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1672 01664 }
1673 01665 <span class="keywordflow">else</span>
1674 01666 {
1675 01667 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_NEUTRAL on (%s)\n"</span>, s);
1676 01668
1677 01669 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a56">SPF_NEUTRAL</a>);
1678 01670 }
1679 01671 }
1680 01672
1681 01673 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning SPF_ERROR on (%s)\n"</span>, s);
1682 01674
1683 01675 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a88a55">SPF_ERROR</a>);
1684 01676 }
1685 01677
1686 01678
1687 01679 <span class="comment">/* UTIL_expand_ip</span>
1688 01680 <span class="comment">*</span>
1689 01681 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1690 01682 <span class="comment">*</span>
1691 01683 <span class="comment">* Date: 12/26/03</span>
1692 01684 <span class="comment">*</span>
1693 01685 <span class="comment">* Desc:</span>
1694 01686 <span class="comment">* Expands an ip4 policy mechanism string into a policy_addr_t</span>
1695 01687 <span class="comment">* structure which it allocates memory for and then returns. The RFC</span>
1696 01688 <span class="comment">* specifies that if a cidr block is not specified then /32 isused.</span>
1697 01689 <span class="comment">*</span>
1698 01690 <span class="comment">* On success returns a pointer to a policy_addr_t structure, on</span>
1699 01691 <span class="comment">* SPF_ERROR returns NULL.</span>
1700 01692 <span class="comment">*</span>
1701 01693 <span class="comment">*/</span>
1702 <a name="l01694"></a><a class="code" href="util_8h.html#a48">01694</a> <a class="code" href="structpolicy__addr__s.html">policy_addr_t</a> *<a class="code" href="util_8h.html#a48">UTIL_expand_ip</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1703 01695 {
1704 01696 int8_t cidr = 0; <span class="comment">/* temporary storage for netmask */</span>
1705 01697
1706 01698 size_t len; <span class="comment">/* length of string passed */</span>
1707 01699 size_t pos; <span class="comment">/* position of break points in string */</span>
1708 01700
1709 01701 <span class="keywordtype">char</span> *ip; <span class="comment">/* temporary storage for ip address */</span>
1710 01702
1711 01703 <span class="keyword">const</span> <span class="keywordtype">char</span> *token_ptr; <span class="comment">/* our position in the token */</span>
1712 01704
1713 01705 <a class="code" href="structpolicy__addr__s.html">policy_addr_t</a> *policy_addr; <span class="comment">/* ip/mask return structure */</span>
1714 01706
1715 01707
1716 01708 <span class="keywordflow">if</span> (s == NULL)
1717 01709 {
1718 01710 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
1719 01711
1720 01712 <span class="keywordflow">return</span>(NULL);
1721 01713 }
1722 01714
1723 01715 len = strlen(s);
1724 01716 token_ptr = s;
1725 01717
1726 01718 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with string: (%s)\n"</span>, token_ptr);
1727 01719
1728 01720 <span class="keywordflow">if</span> ((pos = <a class="code" href="util_8h.html#a35">UTIL_index</a>(token_ptr, <span class="charliteral">':'</span>)) == 0)
1729 01721 {
1730 01722 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"SPF_ERROR: Unable to get position on token (%s)\n"</span>,
1731 01723 token_ptr);
1732 01724
1733 01725 <span class="keywordflow">return</span>(NULL);
1734 01726 }
1735 01727
1736 01728 <span class="comment">/* jump past the ip4: portion */</span>
1737 01729 token_ptr += pos + 1;
1738 01730
1739 01731 policy_addr = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a3">SIZEOF</a>(<a class="code" href="structpolicy__addr__s.html">policy_addr_t</a>));
1740 01732
1741 01733 <span class="comment">/* jump past the ip4: portion (to get length of ip) */</span>
1742 01734 <span class="keywordflow">if</span> ((pos = <a class="code" href="util_8h.html#a35">UTIL_index</a>(token_ptr, <span class="charliteral">'/'</span>)) == 0)
1743 01735 {
1744 01736 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Unable to get position on token (%s), assuming /32 cidr "</span> \
1745 01737 <span class="stringliteral">"block\n"</span>, token_ptr);
1746 01738
1747 01739 pos = strlen(token_ptr);
1748 01740 cidr = 32;
1749 01741 }
1750 01742
1751 01743 <span class="comment">/* allocate space and dump the ip address there */</span>
1752 01744 ip = <a class="code" href="util_8h.html#a8">xstrndup</a>(token_ptr, (pos + 1));
1753 01745
1754 01746 <span class="comment">/* copy it over to the policy_addr structure */</span>
1755 01747 <span class="keywordflow">if</span> ((inet_pton(AF_INET, ip, &amp;policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>)) == 0)
1756 01748 {
1757 01749 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"SPF_ERROR: inet_pton unable to convert ip to binary "</span> \
1758 01750 <span class="stringliteral">"(%s)\n"</span>, ip);
1759 01751
1760 01752 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
1761 01753 <span class="keywordflow">return</span>(NULL);
1762 01754 }
1763 01755
1764 01756 <span class="keywordflow">if</span> (cidr != 32)
1765 01757 {
1766 01758 token_ptr += (pos + 1); <span class="comment">/* skip over the forward slash */</span>
1767 01759 cidr = atoi(token_ptr); <span class="comment">/* convert the string to an integer */</span>
1768 01760 }
1769 01761
1770 01762 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
1771 01763
1772 01764 <span class="keywordflow">if</span> ((cidr &lt; 0) || (cidr &gt; 32))
1773 01765 {
1774 01766 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"ERROR: cidr violation (%u)\n"</span>, cidr);
1775 01767
1776 01768 <span class="keywordflow">return</span>(NULL);
1777 01769 }
1778 01770
1779 01771 policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a> = cidr; <span class="comment">/* copy it over to the policy_addr structure */</span>
1780 01772
1781 01773 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"CIDR: (%i) IP: (%s)\n"</span>,
1782 01774 policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a>, inet_ntoa(policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>));
1783 01775
1784 01776 <span class="keywordflow">return</span>(policy_addr);
1785 01777 }
1786 01778
1787 01779
1788 01780 <span class="comment">/* UTIL_is_ip</span>
1789 01781 <span class="comment">*</span>
1790 01782 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1791 01783 <span class="comment">*</span>
1792 01784 <span class="comment">* Date: 01/18/04</span>
1793 01785 <span class="comment">*</span>
1794 01786 <span class="comment">* Desc:</span>
1795 01787 <span class="comment">* Is the passed string (limited to between 0 - 255 by type)</span>
1796 01788 <span class="comment">* contains a valid ip address or not. I'm not sure if this is useful</span>
1797 01789 <span class="comment">* anymore but at one point I was using it to tell if the passed macro</span>
1798 01790 <span class="comment">* contained an ip address or not when passed as a string.</span>
1799 01791 <span class="comment">*</span>
1800 01792 <span class="comment">*/</span>
1801 <a name="l01793"></a><a class="code" href="util_8h.html#a49">01793</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a49">UTIL_is_ip</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *<span class="keywordtype">id</span>)
1802 01794 {
1803 01795 u_int8_t i = 0; <span class="comment">/* utility */</span>
1804 01796
1805 01797 <span class="keywordflow">if</span> (!<span class="keywordtype">id</span>)
1806 01798 {
1807 01799 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"called without an IP address!\n"</span>);
1808 01800
1809 01801 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1810 01802 }
1811 01803
1812 01804 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with address: (%s)\n"</span>, <span class="keywordtype">id</span>);
1813 01805
1814 01806 <span class="keywordflow">while</span> (*id)
1815 01807 {
1816 01808 <span class="keywordflow">if</span> (*<span class="keywordtype">id</span> == <span class="charliteral">'.'</span>)
1817 01809 {
1818 01810 i++;
1819 01811 }
1820 01812 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isdigit(*<span class="keywordtype">id</span>) == 0)
1821 01813 {
1822 01814 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1823 01815 }
1824 01816 <span class="keywordtype">id</span>++;
1825 01817 }
1826 01818
1827 01819 <span class="keywordflow">if</span> (i == 3)
1828 01820 {
1829 01821 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
1830 01822 }
1831 01823
1832 01824 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE\n"</span>);
1833 01825
1834 01826 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1835 01827 }
1836 01828
1837 01829
1838 01830 <span class="comment">/* UTIL_rev_addr</span>
1839 01831 <span class="comment">*</span>
1840 01832 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1841 01833 <span class="comment">*</span>
1842 01834 <span class="comment">* Date: 01/04/04</span>
1843 01835 <span class="comment">*</span>
1844 01836 <span class="comment">* Desc:</span>
1845 01837 <span class="comment">* Using a passed ip address it will reverse it and slap</span>
1846 01838 <span class="comment">* .in-addr.arpa on the end of it making it ready for a proper PTR query</span>
1847 01839 <span class="comment">*</span>
1848 01840 <span class="comment">* Notes: Write additional code to handle IP6 addresses</span>
1849 01841 <span class="comment">*</span>
1850 01842 <span class="comment">*/</span>
1851 <a name="l01843"></a><a class="code" href="util_8h.html#a50">01843</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a50">UTIL_rev_addr</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1852 01844 {
1853 01845 u_int8_t i = 0; <span class="comment">/* utility */</span>
1854 01846 u_int8_t tmp[4][1]; <span class="comment">/* temporary storage for ip integers */</span>
1855 01847
1856 01848 u_int16_t len = 0; <span class="comment">/* length of to be allocated string */</span>
1857 01849
1858 01850 <span class="keywordtype">char</span> *cp; <span class="comment">/* copy of passed string */</span>
1859 01851 <span class="keywordtype">char</span> *token; <span class="comment">/* token for splitting apart ip address */</span>
1860 01852 <span class="keywordtype">char</span> *new_addr; <span class="comment">/* allocate string for reversed address */</span>
1861 01853
1862 01854
1863 01855 <span class="keywordflow">if</span> (s == NULL)
1864 01856 {
1865 01857 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a null string. Abort!\n"</span>);
1866 01858
1867 01859 <span class="keywordflow">return</span>(NULL);
1868 01860 }
1869 01861
1870 01862 len = (strlen(s) + 1);
1871 01863
1872 01864 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"called with: (%s) len: (%i)\n"</span>, s, (len - 1));
1873 01865
1874 01866 cp = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, len);
1875 01867 token = strtok(cp, <span class="stringliteral">"."</span>);
1876 01868
1877 01869 <span class="keywordflow">while</span> ((token != NULL) &amp;&amp; (i &lt;= 3))
1878 01870 {
1879 01871 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"token : (%s)\n"</span>, token);
1880 01872
1881 01873 tmp[i][0] = atoi(token);
1882 01874 token = strtok(NULL, <span class="stringliteral">"."</span>);
1883 01875 i++;
1884 01876 }
1885 01877
1886 01878 <a class="code" href="util_8h.html#a6">xfree</a>(cp);
1887 01879
1888 01880 <span class="comment">/* + .in-addr.arpa\0 */</span>
1889 01881 new_addr = <a class="code" href="util_8h.html#a4">xmalloc</a>(len + 13);
1890 01882
1891 01883 snprintf(new_addr, (len + 13), <span class="stringliteral">"%u.%u.%u.%u.in-addr.arpa"</span>,
1892 01884 tmp[3][0], tmp[2][0], tmp[1][0], tmp[0][0]);
1893 01885
1894 01886 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning reversed ip: %s\n"</span>, new_addr);
1895 01887
1896 01888 <span class="keywordflow">return</span>(new_addr);
1897 01889 }
1898 01890
1899 01891
1900 01892 <span class="comment">/* UTIL_get_dname</span>
1901 01893 <span class="comment">*</span>
1902 01894 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1903 01895 <span class="comment">*</span>
1904 01896 <span class="comment">* Date: 01/27/04</span>
1905 01897 <span class="comment">*</span>
1906 01898 <span class="comment">* Desc:</span>
1907 01899 <span class="comment">* s contains a hostname which is then looked through and split</span>
1908 01900 <span class="comment">* apart, always leaving one '.' delimiter left so you are left with</span>
1909 01901 <span class="comment">* domain.tld. domain.tld is then put into newly allocated memory and</span>
1910 01902 <span class="comment">* returned to the calling function. Upon failure, returns NULL.</span>
1911 01903 <span class="comment">* Calling function is required to free the memory.</span>
1912 01904 <span class="comment">*</span>
1913 01905 <span class="comment">*/</span>
1914 <a name="l01906"></a><a class="code" href="util_8h.html#a51">01906</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a51">UTIL_get_dname</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
1915 01907 {
1916 01908 u_int8_t i = 0; <span class="comment">/* how many delimiters in s */</span>
1917 01909
1918 01910 <span class="keywordtype">char</span> *buf = NULL; <span class="comment">/* return string to be allocated */</span>
1919 01911
1920 01912
1921 01913 <span class="keywordflow">if</span> (s == NULL)
1922 01914 {
1923 01915 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"called with NULL. Abort!\n"</span>);
1924 01916
1925 01917 <span class="keywordflow">return</span>(NULL);
1926 01918 }
1927 01919
1928 01920 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with (%s)\n"</span>, s);
1929 01921
1930 01922 i = <a class="code" href="util_8h.html#a38">UTIL_count_delim</a>(s, <span class="charliteral">'.'</span>);
1931 01923
1932 01924 <span class="keywordflow">switch</span> (i)
1933 01925 {
1934 01926 <span class="keywordflow">case</span> 0:
1935 01927 <span class="keywordflow">break</span>;
1936 01928 <span class="keywordflow">case</span> 1:
1937 01929 buf = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, (strlen(s) + 1));
1938 01930 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"leaving function; returning buffer: (%s)\n"</span>, buf);
1939 01931
1940 01932 <span class="keywordflow">return</span>(buf);
1941 01933 <span class="keywordflow">default</span>:
1942 01934 buf = <a class="code" href="util_8h.html#a36">UTIL_split_str</a>(s, <span class="charliteral">'.'</span>, (i - 1));
1943 01935 <a class="code" href="util_8h.html#a9">xprintf</a>(<span class="stringliteral">"leaving function; returning buffer: (%s)\n"</span>, buf);
1944 01936
1945 01937 <span class="keywordflow">return</span>(buf);
1946 01938 }
1947 01939
1948 01940 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"leaving function; returning NULL\n"</span>);
1949 01941
1950 01942 <span class="keywordflow">return</span>(NULL);
1951 01943 }
1952 01944
1953 01945
1954 01946 <span class="comment">/* UTIL_cidr_cmp</span>
1955 01947 <span class="comment">*</span>
1956 01948 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
1957 01949 <span class="comment">*</span>
1958 01950 <span class="comment">* Date: 12/26/03</span>
1959 01951 <span class="comment">*</span>
1960 01952 <span class="comment">* Desc:</span>
1961 01953 <span class="comment">* Compares an IP address (connected peer) against another IP</span>
1962 01954 <span class="comment">* address (found in a policy lookup) using a netmask (also found from</span>
1963 01955 <span class="comment">* a policy lookup) to see if the peer address is legal within that</span>
1964 01956 <span class="comment">* netmask. Returns SPF_TRUE if its valid, SPF_FALSE if not.</span>
1965 01957 <span class="comment">*</span>
1966 01958 <span class="comment">* Notes: Write additional comparisons to handle IP6 addresses</span>
1967 01959 <span class="comment">*</span>
1968 01960 <span class="comment">*/</span>
1969 <a name="l01961"></a><a class="code" href="util_8h.html#a52">01961</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a52">UTIL_cidr_cmp</a>(<span class="keyword">const</span> <a class="code" href="structpolicy__addr__s.html">policy_addr_t</a> *policy_addr, <span class="keyword">const</span> <span class="keyword">struct</span> in_addr
1970 01962 *peer_addr)
1971 01963 {
1972 01964 u_int32_t a; <span class="comment">/* working buf */</span>
1973 01965 u_int32_t b; <span class="comment">/* working buf */</span>
1974 01966
1975 01967 <span class="keywordtype">char</span> *peer_ip = NULL; <span class="comment">/* ip address of connected peer */</span>
1976 01968 <span class="keywordtype">char</span> *policy_ip = NULL; <span class="comment">/* ip address of current SPF policy */</span>
1977 01969
1978 01970
1979 01971 <span class="keywordflow">if</span> ((policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>.s_addr &lt;= 0) &amp;&amp; (peer_addr-&gt;s_addr &lt;= 0))
1980 01972 {
1981 01973 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Passed with NULL chars. Aborting.\n"</span>);
1982 01974
1983 01975 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
1984 01976 }
1985 01977
1986 01978 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"POL: %lu PEER: %lu CIDR: %i\n"</span>, policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>.s_addr,
1987 01979 peer_addr-&gt;s_addr, policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a>);
1988 01980
1989 01981 <span class="comment">/*</span>
1990 01982 <span class="comment"> * Packets come in off the wire in whats called "network byte order"</span>
1991 01983 <span class="comment"> * which does't work very well when trying to compute if one address</span>
1992 01984 <span class="comment"> * is masked by another using a CIDR calculation so the 'ntohl' is </span>
1993 01985 <span class="comment"> * issued on them to change their byte order</span>
1994 01986 <span class="comment"> */</span>
1995 01987 a = ntohl(peer_addr-&gt;s_addr);
1996 01988 b = ntohl(policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>.s_addr);
1997 01989
1998 01990 <span class="keywordflow">if</span> (policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a> != 32)
1999 01991 {
2000 01992 <span class="keywordflow">if</span> ((a&amp;(~0U&lt;&lt;(32-policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a>))) != (b&amp;(~0U&lt;&lt;(32-policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a>))))
2001 01993 {
2002 01994 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2003 01995 }
2004 01996 }
2005 01997 <span class="keywordflow">else</span>
2006 01998 {
2007 01999 <span class="keywordflow">if</span> (peer_addr-&gt;s_addr != policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>.s_addr)
2008 02000 {
2009 02001 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"%lu and %lu using 32 cidr do not match\n"</span>,
2010 02002 peer_addr-&gt;s_addr, policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>.s_addr);
2011 02003
2012 02004 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2013 02005 }
2014 02006 }
2015 02007
2016 02008 <span class="comment">/* these are done here just for debugger remove later */</span>
2017 02009 peer_ip = <a class="code" href="util_8h.html#a8">xstrndup</a>(inet_ntoa(*peer_addr), <a class="code" href="spf_8h.html#a11">SPF_MAX_IP_ADDR</a>);
2018 02010 policy_ip = <a class="code" href="util_8h.html#a8">xstrndup</a>(inet_ntoa(policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o2">addr</a>), <a class="code" href="spf_8h.html#a11">SPF_MAX_IP_ADDR</a>);
2019 02011
2020 02012 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Peer: (%s) matches address %s with network %i\n"</span>,
2021 02013 peer_ip, policy_ip, policy_addr-&gt;<a class="code" href="structpolicy__addr__s.html#o1">cidr</a>);
2022 02014
2023 02015 <a class="code" href="util_8h.html#a6">xfree</a>(peer_ip);
2024 02016 <a class="code" href="util_8h.html#a6">xfree</a>(policy_ip);
2025 02017
2026 02018 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2027 02019 }
2028 02020
2029 02021
2030 02022 <span class="comment">/* UTIL_validate_ptr</span>
2031 02023 <span class="comment">*</span>
2032 02024 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2033 02025 <span class="comment">*</span>
2034 02026 <span class="comment">* Date: 12/26/03</span>
2035 02027 <span class="comment">*</span>
2036 02028 <span class="comment">* Desc:</span>
2037 02029 <span class="comment">* Using the ip address found in the passed peer_info structure,</span>
2038 02030 <span class="comment">* a PTR lookup is made and if a record exists then this is record is compared</span>
2039 02031 <span class="comment">* against the hostname the client wishes to send mail from. If the tld matches</span>
2040 02032 <span class="comment">* the tld found during this query, this would be a 'valdiated' PTR. If a match</span>
2041 02033 <span class="comment">* can not be found we return SPF_FALSE. If a match is made we return SPF_TRUE.</span>
2042 02034 <span class="comment">*</span>
2043 02035 <span class="comment">* Notes: Write additional comparisons to handle IP6 addresses</span>
2044 02036 <span class="comment">*</span>
2045 02037 <span class="comment">*/</span>
2046 <a name="l02038"></a><a class="code" href="util_8h.html#a53">02038</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a53">UTIL_validate_ptr</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p)
2047 02039 {
2048 02040 <span class="keywordtype">char</span> *ptr_addr; <span class="comment">/* reversed address into PTR format */</span>
2049 02041 <span class="keywordtype">char</span> *tmp_ptr; <span class="comment">/* utility pointer */</span>
2050 02042
2051 02043
2052 02044 <span class="keywordflow">if</span> (!p)
2053 02045 {
2054 02046 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"called with an invalid peer info structure!\n"</span>);
2055 02047
2056 02048 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2057 02049 }
2058 02050
2059 02051 <span class="comment">/* reverse of the address in peer_info */</span>
2060 02052 ptr_addr = <a class="code" href="util_8h.html#a50">UTIL_rev_addr</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>);
2061 02053 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"[address: %s]\n"</span>, ptr_addr);
2062 02054
2063 02055 tmp_ptr = <a class="code" href="util_8h.html#a8">xstrndup</a>(p-&gt;<a class="code" href="structpeer__info__s.html#o15">current_domain</a>, <a class="code" href="spf_8h.html#a14">SPF_MAX_HNAME</a>);
2064 02056
2065 02057 <span class="keywordflow">if</span> (<a class="code" href="dns_8h.html#a8">DNS_query</a>(p, ptr_addr, T_PTR, tmp_ptr) != (<span class="keywordtype">char</span> *)<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
2066 02058 {
2067 02059 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"PTR lookup failed: (%s) (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o7">rs</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o24">error</a>);
2068 02060
2069 02061 <a class="code" href="util_8h.html#a6">xfree</a>(ptr_addr);
2070 02062 <a class="code" href="util_8h.html#a6">xfree</a>(tmp_ptr);
2071 02063
2072 02064 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2073 02065 }
2074 02066
2075 02067 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Peer (%s) successfully validated hostname (%s)\n"</span>,
2076 02068 p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o18">r_vhname</a>);
2077 02069
2078 02070 <a class="code" href="util_8h.html#a6">xfree</a>(ptr_addr);
2079 02071 <a class="code" href="util_8h.html#a6">xfree</a>(tmp_ptr);
2080 02072
2081 02073 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2082 02074 }
2083 02075
2084 02076
2085 02077 <span class="comment">/* UTIL_validate_hostname</span>
2086 02078 <span class="comment">*</span>
2087 02079 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2088 02080 <span class="comment">*</span>
2089 02081 <span class="comment">* Date: 01/08/04</span>
2090 02082 <span class="comment">*</span>
2091 02083 <span class="comment">* Desc:</span>
2092 02084 <span class="comment">* s contains a hostname which is then looked up to find any</span>
2093 02085 <span class="comment">* of the returned ip addresses SPF_PASS the remote peers. On a successful</span>
2094 02086 <span class="comment">* SPF_PASS returns SPF_TRUE. When no SPF_PASS is made, returns SPF_FALSE.</span>
2095 02087 <span class="comment">*</span>
2096 02088 <span class="comment">* Note:</span>
2097 02089 <span class="comment">* We need to define and set a limit on the number of recursive</span>
2098 02090 <span class="comment">* lookups. I recall seeing this in the RFC, we should discuss this.</span>
2099 02091 <span class="comment">*</span>
2100 02092 <span class="comment">* Date: 08/28/04 by James</span>
2101 02093 <span class="comment">*</span>
2102 02094 <span class="comment">* Desc:</span>
2103 02095 <span class="comment">* Added buffer for reentrant gethostbyname wrapper</span>
2104 02096 <span class="comment">* and change gethostbyname calls to use the MACRO wrapper</span>
2105 02097 <span class="comment">* xgethostbyname()</span>
2106 02098 <span class="comment">*</span>
2107 02099 <span class="comment">*/</span>
2108 <a name="l02100"></a><a class="code" href="util_8h.html#a54">02100</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a54">UTIL_validate_hostname</a>(<a class="code" href="structpeer__info__s.html">peer_info_t</a> *p, <span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> int8_t cidr)
2109 02101 {
2110 02102 <span class="keywordtype">int</span> tmp_errno = 0; <span class="comment">/* temporary errno placeholder */</span>
2111 02103
2112 02104 <span class="keywordtype">char</span> **a = NULL; <span class="comment">/* work ptr for list recursion */</span>
2113 02105
2114 02106 <span class="keywordtype">char</span> *ip = NULL; <span class="comment">/* ip address */</span>
2115 02107 <span class="keywordtype">char</span> *gbuf = NULL; <span class="comment">/* reentrant buffer for gethostbyname_r */</span>
2116 02108
2117 02109 <span class="keyword">struct </span>in_addr addr; <span class="comment">/* connected peer's address */</span>
2118 02110 <span class="keyword">struct </span>hostent *hp = NULL; <span class="comment">/* hostent structure */</span>
2119 02111 <span class="keyword">struct </span>hostent tmp_hp; <span class="comment">/* temporary hostent structure */</span>
2120 02112
2121 02113 <a class="code" href="structpolicy__addr__s.html">policy_addr_t</a> policy_addr; <span class="comment">/* used for cidr calculations */</span>
2122 02114
2123 02115
2124 02116 <span class="keywordflow">if</span> (s == NULL)
2125 02117 {
2126 02118 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string.\n"</span>);
2127 02119
2128 02120 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2129 02121 }
2130 02122
2131 02123 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with: (%lu) and (%s)\n"</span>, p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, s);
2132 02124
2133 02125 gbuf = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a2">SPF_MAX_GHBNR_DBUF</a>);
2134 02126
2135 02127 <span class="keywordflow">if</span> ((hp = <a class="code" href="dns_8h.html#a4">xgethostbyname</a>(s, &amp;tmp_hp, gbuf, <a class="code" href="util_8h.html#a2">SPF_MAX_GHBNR_DBUF</a>,
2136 02128 &amp;tmp_errno)) != NULL)
2137 02129 {
2138 02130 <span class="comment">/* for each hostname in the list, perform CIDR checks */</span>
2139 02131 <span class="keywordflow">for</span> (a = hp-&gt;h_addr_list; *a; a++)
2140 02132 {
2141 02133 memcpy(&amp;addr.s_addr, *a, <a class="code" href="util_8h.html#a3">SIZEOF</a>(<span class="keyword">struct</span> in_addr));
2142 02134 ip = <a class="code" href="util_8h.html#a8">xstrndup</a>(inet_ntoa(addr), <a class="code" href="spf_8h.html#a11">SPF_MAX_IP_ADDR</a>);
2143 02135
2144 02136 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"CLI: %s (%lu) SRV: %s (%lu)\n"</span>, ip, addr.s_addr,
2145 02137 p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr);
2146 02138
2147 02139 <span class="keywordflow">if</span> (cidr == 32)
2148 02140 {
2149 02141 <span class="keywordflow">if</span> (((<span class="keyword">struct </span>in_addr *)(*a))-&gt;s_addr == p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr)
2150 02142 {
2151 02143 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"%s (%lu) matches %s (%lu)\n"</span>, ip,
2152 02144 ((<span class="keyword">struct</span> in_addr *)(*a))-&gt;s_addr, p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr);
2153 02145
2154 02146 <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(p, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>, NULL);
2155 02147
2156 02148 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
2157 02149 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
2158 02150
2159 02151 <a class="code" href="dns_8h.html#a5">xgethostbyname_free</a>(); <span class="comment">/* unlock mutex */</span>
2160 02152
2161 02153 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2162 02154 }
2163 02155 }
2164 02156 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((cidr &lt; 32) &amp;&amp; (cidr &gt;= 8))
2165 02157 {
2166 02158 <span class="comment">/* convert from character string to dotted quad notation */</span>
2167 02159 <span class="keywordflow">if</span> ((inet_pton(AF_INET, ip, &amp;policy_addr.addr)) == 0)
2168 02160 {
2169 02161 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Unable to execute inet_pton()\n"</span>);
2170 02162 }
2171 02163
2172 02164 policy_addr.cidr = cidr;
2173 02165
2174 02166 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"Address: %lu with CIDR %i\n"</span>,
2175 02167 policy_addr.addr.s_addr, policy_addr.cidr);
2176 02168
2177 02169 <span class="comment">/* perform CIDR comparison of 'policy_addr' vs 'p-&gt;addr' */</span>
2178 02170 <span class="keywordflow">if</span> ((<a class="code" href="util_8h.html#a52">UTIL_cidr_cmp</a>(&amp;policy_addr, &amp;p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>)) == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
2179 02171 {
2180 02172 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"(%lu) matches (%lu) with CIDR %u\n"</span>,
2181 02173 policy_addr.addr.s_addr, p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr, cidr);
2182 02174
2183 02175 <span class="comment">/* associate an SPF prefix (-,+,~,?) with this check */</span>
2184 02176 <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(p, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>, NULL);
2185 02177
2186 02178 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
2187 02179 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
2188 02180
2189 02181 <a class="code" href="dns_8h.html#a5">xgethostbyname_free</a>();
2190 02182
2191 02183 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2192 02184 }
2193 02185 } <span class="comment">/* else if */</span>
2194 02186
2195 02187 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
2196 02188
2197 02189 } <span class="comment">/* for */</span>
2198 02190
2199 02191 <span class="comment">/* for each alias (CNAME) perform a CIDR check */</span>
2200 02192 <span class="keywordflow">for</span> (a = hp-&gt;h_aliases; *a; a++)
2201 02193 {
2202 02194 memcpy(&amp;addr.s_addr, *a, <a class="code" href="util_8h.html#a3">SIZEOF</a>(<span class="keyword">struct</span> in_addr));
2203 02195 ip = <a class="code" href="util_8h.html#a8">xstrndup</a>(inet_ntoa(addr), <a class="code" href="spf_8h.html#a11">SPF_MAX_IP_ADDR</a>);
2204 02196
2205 02197 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"client: %s (%lu); policy: %s (%lu)\n"</span>,
2206 02198 ip, addr.s_addr, p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr);
2207 02199
2208 02200 <span class="keywordflow">if</span> (cidr == 32)
2209 02201 {
2210 02202 <span class="keywordflow">if</span> (((<span class="keyword">struct </span>in_addr *)(*a))-&gt;s_addr == p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr)
2211 02203 {
2212 02204 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"IN A: client: %s (%lu) matches policy: %s (%lu)\n"</span>,
2213 02205 ip, ((<span class="keyword">struct</span> in_addr *)(*a))-&gt;s_addr, p-&gt;<a class="code" href="structpeer__info__s.html#o17">r_ip</a>, p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr);
2214 02206
2215 02207 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
2216 02208 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
2217 02209
2218 02210 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2219 02211 }
2220 02212 }
2221 02213 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((cidr &lt; 32) &amp;&amp; (cidr &gt;= 8))
2222 02214 {
2223 02215 <span class="keywordflow">if</span> (inet_pton(AF_INET, ip, &amp;policy_addr.addr) == 0)
2224 02216 {
2225 02217 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"Unable to execute inet_pton()\n"</span>);
2226 02218 }
2227 02219
2228 02220 policy_addr.cidr = cidr;
2229 02221
2230 02222 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a52">UTIL_cidr_cmp</a>(&amp;policy_addr, &amp;p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>) == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
2231 02223 {
2232 02224 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"client: (%lu) matches policy (%lu) with CIDR %u\n"</span>,
2233 02225 policy_addr.addr.s_addr, p-&gt;<a class="code" href="structpeer__info__s.html#o26">addr</a>.s_addr, cidr);
2234 02226
2235 02227 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
2236 02228 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
2237 02229
2238 02230 <span class="comment">/* associate an SPF prefix (-,+,~,?) with this check */</span>
2239 02231 <a class="code" href="util_8h.html#a47">UTIL_assoc_prefix</a>(p, <a class="code" href="spf_8h.html#a88a51">SPF_PASS</a>, NULL);
2240 02232
2241 02233 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2242 02234 }
2243 02235 } <span class="comment">/* else */</span>
2244 02236
2245 02237 <a class="code" href="util_8h.html#a6">xfree</a>(ip);
2246 02238
2247 02239 } <span class="comment">/* for */</span>
2248 02240 } <span class="comment">/* if .. xgethostbyname() */</span>
2249 02241 <span class="keywordflow">else</span>
2250 02242 {
2251 02243 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"No address associated with hostname (%s); Reason: %s\n"</span>,
2252 02244 s, hstrerror(tmp_errno));
2253 02245 }
2254 02246
2255 02247 <a class="code" href="util_8h.html#a6">xfree</a>(gbuf);
2256 02248
2257 02249 <a class="code" href="dns_8h.html#a5">xgethostbyname_free</a>();
2258 02250
2259 02251 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_FALSE\n"</span>);
2260 02252
2261 02253 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2262 02254 }
2263 02255
2264 02256
2265 02257 <span class="comment">/* UTIL_url_encode</span>
2266 02258 <span class="comment">*</span>
2267 02259 <span class="comment">* Author: Sean Comeau &lt;scomeau@obscurity.org&gt;</span>
2268 02260 <span class="comment">*</span>
2269 02261 <span class="comment">* Date: 01/06/04</span>
2270 02262 <span class="comment">*</span>
2271 02263 <span class="comment">* Desc:</span>
2272 02264 <span class="comment">* "URL-Encode" characters that are "unsafe" or "prohibited" from a URL.</span>
2273 02265 <span class="comment">* Upon success returns a pointer to a newly allocated memory containing the</span>
2274 02266 <span class="comment">* encoded string. Upon failure returns a NULL pointer. Failure</span>
2275 02267 <span class="comment">* indicates either a failure to allocate new memory, or the passed string</span>
2276 02268 <span class="comment">* did not contain any questionable characters and hence did not require</span>
2277 02269 <span class="comment">* encoding.</span>
2278 02270 <span class="comment">*</span>
2279 02271 <span class="comment">*/</span>
2280 <a name="l02272"></a><a class="code" href="util_8h.html#a55">02272</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a55">UTIL_url_encode</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s)
2281 02273 {
2282 02274 <span class="keywordtype">int</span> len; <span class="comment">/* length of passed string * 3*/</span>
2283 02275
2284 02276 <span class="keywordtype">char</span> *<span class="keyword">new</span>; <span class="comment">/* newly allocated memory */</span>
2285 02277 <span class="keywordtype">char</span> *encoded; <span class="comment">/* encoded return string */</span>
2286 02278
2287 02279
2288 02280 <span class="keywordflow">if</span> (s != NULL)
2289 02281 {
2290 02282 <span class="comment">/*</span>
2291 02283 <span class="comment"> * length of the string times 3 is the maximum possible size a</span>
2292 02284 <span class="comment"> * URL encoded string should ever be able to expand to.</span>
2293 02285 <span class="comment"> */</span>
2294 02286 len = (strlen(s) * 3);
2295 02287 }
2296 02288 <span class="keywordflow">else</span>
2297 02289 {
2298 02290 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
2299 02291
2300 02292 <span class="keywordflow">return</span>(NULL);
2301 02293 }
2302 02294
2303 02295 encoded = <span class="keyword">new</span> = <a class="code" href="util_8h.html#a4">xmalloc</a>(len);
2304 02296
2305 02297 <span class="keywordflow">while</span> (*s != <span class="charliteral">'\0'</span>)
2306 02298 {
2307 02299 <span class="keywordflow">if</span> (<a class="code" href="util_8h.html#a17">urlchr_test</a>(*s) == 0)
2308 02300 {
2309 02301 *<span class="keyword">new</span>++ = *s++;
2310 02302 }
2311 02303 <span class="keywordflow">else</span>
2312 02304 {
2313 02305 <span class="comment">/* this obviously NULL terminates, do we want this? */</span>
2314 02306 snprintf(<span class="keyword">new</span>, 4, <span class="stringliteral">"%%%x"</span>, *s);
2315 02307 <span class="keyword">new</span> += 3;
2316 02308 s++;
2317 02309 }
2318 02310 }
2319 02311
2320 02312 *<span class="keyword">new</span>++ = <span class="charliteral">'\0'</span>;
2321 02313 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning (%s)\n"</span>, encoded);
2322 02314
2323 02315 <span class="keywordflow">return</span>(encoded);
2324 02316 }
2325 02317
2326 02318
2327 02319 <span class="comment">/* UTIL_reverse</span>
2328 02320 <span class="comment">*</span>
2329 02321 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2330 02322 <span class="comment">*</span>
2331 02323 <span class="comment">* Date: 01/06/04</span>
2332 02324 <span class="comment">*</span>
2333 02325 <span class="comment">* Desc:</span>
2334 02326 <span class="comment">* Takes a string and rebuilds it in reverse order using the</span>
2335 02327 <span class="comment">* supplied delimiter. The string will always be rebuilt using a</span>
2336 02328 <span class="comment">* '.' char as per the RFC.</span>
2337 02329 <span class="comment">*</span>
2338 02330 <span class="comment">*/</span>
2339 <a name="l02331"></a><a class="code" href="util_8h.html#a56">02331</a> <span class="keywordtype">char</span> *<a class="code" href="util_8h.html#a56">UTIL_reverse</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, <span class="keyword">const</span> <span class="keywordtype">char</span> delim)
2340 02332 {
2341 02333 size_t len; <span class="comment">/* length of s */</span>
2342 02334
2343 02335 <span class="keywordtype">char</span> *buf; <span class="comment">/* return buffer */</span>
2344 02336 <span class="keywordtype">char</span> *p; <span class="comment">/* working pointer */</span>
2345 02337 <span class="keywordtype">char</span> *cp; <span class="comment">/* working pointer */</span>
2346 02338 <span class="keywordtype">char</span> *c; <span class="comment">/* working pointer */</span>
2347 02339
2348 02340 <a class="code" href="structsplit__str__s.html">split_str_t</a> *master; <span class="comment">/* list pointers */</span>
2349 02341
2350 02342 <a class="code" href="structsplit__str__node__s.html">split_str_node_t</a> *c_node; <span class="comment">/* c_node node */</span>
2351 02343 <a class="code" href="structsplit__str__node__s.html">split_str_node_t</a> *kill_node; <span class="comment">/* temp node used in destruction */</span>
2352 02344
2353 02345
2354 02346 <span class="keywordflow">if</span> (s == NULL)
2355 02347 {
2356 02348 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
2357 02349
2358 02350 <span class="keywordflow">return</span>(NULL);
2359 02351 }
2360 02352
2361 02353 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with (%s) and delim (%c)\n"</span>, s, delim);
2362 02354
2363 02355 len = strlen(s);
2364 02356 cp = c = <a class="code" href="util_8h.html#a8">xstrndup</a>(s, (len + 1));
2365 02357
2366 02358 master = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a3">SIZEOF</a>(<a class="code" href="structsplit__str__s.html">split_str_t</a>));
2367 02359 master-&gt;<a class="code" href="structsplit__str__s.html#o0">head</a> = NULL;
2368 02360 master-&gt;<a class="code" href="structsplit__str__s.html#o1">tail</a> = NULL;
2369 02361 master-&gt;<a class="code" href="structsplit__str__s.html#o2">elements</a> = 0;
2370 02362
2371 02363 <span class="comment">/* </span>
2372 02364 <span class="comment"> * Comment: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2373 02365 <span class="comment"> *</span>
2374 02366 <span class="comment"> * Date: 01/22/04</span>
2375 02367 <span class="comment"> *</span>
2376 02368 <span class="comment"> * we do not want the trailing delim so the first iteration of this</span>
2377 02369 <span class="comment"> * loop we call UTIL_addnode with 0, which tells it not to allocate</span>
2378 02370 <span class="comment"> * the extra byte for the trailing delimiter. This is done only</span>
2379 02371 <span class="comment"> * when passed an IP address, and this is because when reversing we</span>
2380 02372 <span class="comment"> * want: 1.0.168.192. and not .1.0.168.192</span>
2381 02373 <span class="comment"> *</span>
2382 02374 <span class="comment"> */</span>
2383 02375
2384 02376 len++;
2385 02377 buf = <a class="code" href="util_8h.html#a4">xmalloc</a>(len);
2386 02378 <span class="keywordflow">while</span> ((p = strrchr(cp, delim)) != NULL)
2387 02379 {
2388 02380 p++; <span class="comment">/* remove period */</span>
2389 02381 <a class="code" href="util_8h.html#a57">UTIL_addnode</a>(master, p, <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2390 02382 p--; <span class="comment">/* bring it back */</span>
2391 02383 *p = <span class="charliteral">'\0'</span>;
2392 02384 }
2393 02385
2394 02386 <a class="code" href="util_8h.html#a57">UTIL_addnode</a>(master, cp, <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2395 02387
2396 02388 c_node = master-&gt;<a class="code" href="structsplit__str__s.html#o0">head</a>;
2397 02389 <span class="keywordflow">while</span> ((kill_node = c_node) != NULL)
2398 02390 {
2399 02391 strncat(buf, kill_node-&gt;<a class="code" href="structsplit__str__node__s.html#o1">s</a>, kill_node-&gt;<a class="code" href="structsplit__str__node__s.html#o0">len</a>);
2400 02392 <a class="code" href="util_8h.html#a6">xfree</a>(kill_node-&gt;<a class="code" href="structsplit__str__node__s.html#o1">s</a>);
2401 02393 c_node = c_node-&gt;<a class="code" href="structsplit__str__node__s.html#o2">next</a>;
2402 02394 <a class="code" href="util_8h.html#a6">xfree</a>(kill_node);
2403 02395 }
2404 02396
2405 02397 <a class="code" href="util_8h.html#a6">xfree</a>(cp);
2406 02398 <a class="code" href="util_8h.html#a6">xfree</a>(master);
2407 02399
2408 02400 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"leaving function; returning (%s)\n"</span>, buf);
2409 02401
2410 02402 <span class="keywordflow">return</span>(buf);
2411 02403 }
2412 02404
2413 02405
2414 02406 <span class="comment">/* UTIL_addnode</span>
2415 02407 <span class="comment">*</span>
2416 02408 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2417 02409 <span class="comment">*</span>
2418 02410 <span class="comment">* Date: 01/18/04</span>
2419 02411 <span class="comment">*</span>
2420 02412 <span class="comment">* Desc:</span>
2421 02413 <span class="comment">* Allocates memory for a new node and slaps it on the end of</span>
2422 02414 <span class="comment">* of the passed list. In the process of doing so, when it comes to</span>
2423 02415 <span class="comment">* the last element in the list, which is indicated by the SPF_BOOL</span>
2424 02416 <span class="comment">* that is passed, a final '.' is either appended (SPF_TRUE) or not</span>
2425 02417 <span class="comment">* (SPF_FALSE). Function returns SPF_TRUE upon success, and SPF_FALSE upon</span>
2426 02418 <span class="comment">* failure.</span>
2427 02419 <span class="comment">*</span>
2428 02420 <span class="comment">*/</span>
2429 <a name="l02421"></a><a class="code" href="util_8h.html#a57">02421</a> <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> <a class="code" href="util_8h.html#a57">UTIL_addnode</a>(<a class="code" href="structsplit__str__s.html">split_str_t</a> *master, <span class="keyword">const</span> <span class="keywordtype">char</span> *s, <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> last)
2430 02422 {
2431 02423 size_t len; <span class="comment">/* length of s */</span>
2432 02424
2433 02425 <a class="code" href="structsplit__str__node__s.html">split_str_node_t</a> *c_node; <span class="comment">/* c_node working node */</span>
2434 02426 <a class="code" href="structsplit__str__node__s.html">split_str_node_t</a> *new_node; <span class="comment">/* newly allocated node */</span>
2435 02427 <a class="code" href="structsplit__str__node__s.html">split_str_node_t</a> *prev_node; <span class="comment">/* previous working node */</span>
2436 02428
2437 02429
2438 02430 <span class="keywordflow">if</span> (!s || (s == NULL))
2439 02431 {
2440 02432 <a class="code" href="util_8h.html#a13">xepprintf</a>(<span class="stringliteral">"passed a NULL string. Abort!\n"</span>);
2441 02433
2442 02434 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>);
2443 02435 }
2444 02436
2445 02437 <a class="code" href="util_8h.html#a10">xvprintf</a>(<span class="stringliteral">"called with string: (%s); boolean: (%s)\n"</span>, s,
2446 02438 last ? <span class="stringliteral">"FALSE"</span> : <span class="stringliteral">"TRUE"</span>);
2447 02439
2448 02440 len = strlen(s);
2449 02441
2450 02442 <span class="keywordflow">if</span> (last == <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>)
2451 02443 {
2452 02444 len += 2;
2453 02445 }
2454 02446 <span class="keywordflow">else</span>
2455 02447 {
2456 02448 len++;
2457 02449 }
2458 02450
2459 02451 <span class="comment">/* create new node */</span>
2460 02452 new_node = <a class="code" href="util_8h.html#a4">xmalloc</a>(<a class="code" href="util_8h.html#a3">SIZEOF</a>(<a class="code" href="structsplit__str__node__s.html">split_str_node_t</a>));
2461 02453
2462 02454 <span class="comment">/* set the new nodes next value NULL, and store s */</span>
2463 02455 new_node-&gt;<a class="code" href="structsplit__str__node__s.html#o2">next</a> = NULL;
2464 02456
2465 02457 new_node-&gt;<a class="code" href="structsplit__str__node__s.html#o1">s</a> = <a class="code" href="util_8h.html#a4">xmalloc</a>(len);
2466 02458
2467 02459 <span class="comment">/*</span>
2468 02460 <span class="comment"> * Comment: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2469 02461 <span class="comment"> *</span>
2470 02462 <span class="comment"> * Date: 01/22/04</span>
2471 02463 <span class="comment"> *</span>
2472 02464 <span class="comment"> * section 7.1 (Macro definitions) of the RFC v02.9.5 indicates that we must</span>
2473 02465 <span class="comment"> * always rebuild the macro using the delimiter '.' and not the passed</span>
2474 02466 <span class="comment"> * delimiting character.</span>
2475 02467 <span class="comment"> *</span>
2476 02468 <span class="comment"> */</span>
2477 02469 snprintf(new_node-&gt;<a class="code" href="structsplit__str__node__s.html#o1">s</a>, len, <span class="stringliteral">"%s%c"</span>, s, last ? <span class="charliteral">'.'</span> : <span class="charliteral">'\0'</span>);
2478 02470 new_node-&gt;<a class="code" href="structsplit__str__node__s.html#o0">len</a> = (len - 1); <span class="comment">/* don't count \0 */</span>
2479 02471
2480 02472 prev_node = NULL;
2481 02473 c_node = master-&gt;<a class="code" href="structsplit__str__s.html#o0">head</a>;
2482 02474
2483 02475 <span class="comment">/* reorder the list with the NEW element on the end */</span>
2484 02476 <span class="keywordflow">while</span> (c_node != NULL)
2485 02477 {
2486 02478 prev_node = c_node;
2487 02479 c_node = c_node-&gt;<a class="code" href="structsplit__str__node__s.html#o2">next</a>;
2488 02480 }
2489 02481
2490 02482 <span class="keywordflow">if</span> (prev_node != NULL)
2491 02483 {
2492 02484 new_node-&gt;<a class="code" href="structsplit__str__node__s.html#o2">next</a> = prev_node-&gt;<a class="code" href="structsplit__str__node__s.html#o2">next</a>;
2493 02485 prev_node-&gt;<a class="code" href="structsplit__str__node__s.html#o2">next</a> = new_node;
2494 02486 }
2495 02487 <span class="keywordflow">else</span>
2496 02488 {
2497 02489 master-&gt;<a class="code" href="structsplit__str__s.html#o0">head</a> = new_node;
2498 02490 }
2499 02491
2500 02492 master-&gt;<a class="code" href="structsplit__str__s.html#o1">tail</a> = new_node;
2501 02493 master-&gt;<a class="code" href="structsplit__str__s.html#o2">elements</a>++;
2502 02494
2503 02495 <a class="code" href="util_8h.html#a11">xpprintf</a>(<span class="stringliteral">"leaving function; returning SPF_TRUE\n"</span>);
2504 02496
2505 02497 <span class="keywordflow">return</span>(<a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>);
2506 02498 }
2507 02499
2508 02500
2509 02501 <span class="comment">/* _UTIL_pthread_mutex</span>
2510 02502 <span class="comment">*</span>
2511 02503 <span class="comment">* Author: James Couzens &lt;jcouzens@codeshare.ca&gt;</span>
2512 02504 <span class="comment">*</span>
2513 02505 <span class="comment">* Date: 09/08/04</span>
2514 02506 <span class="comment">*</span>
2515 02507 <span class="comment">* Desc:</span>
2516 02508 <span class="comment">* Locks or unlocks the passed mutex based on the additional value</span>
2517 02509 <span class="comment">* which is and enumerattion (SPF_BOOL)</span>
2518 02510 <span class="comment">*</span>
2519 02511 <span class="comment">*/</span>
2520 <a name="l02512"></a><a class="code" href="util_8h.html#a58">02512</a> <span class="keywordtype">void</span> <a class="code" href="util_8h.html#a58">_UTIL_pthread_mutex</a>(<span class="keywordtype">void</span> *mutex, <a class="code" href="spf_8h.html#a35">SPF_BOOL</a> action)
2521 02513 {
2522 02514
2523 02515 <span class="preprocessor">#ifdef _WITH_PTHREADS</span>
2524 02516 <span class="preprocessor"></span>
2525 02517 <span class="keywordflow">switch</span> (action)
2526 02518 {
2527 02519 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a87a50">SPF_TRUE</a>:
2528 02520 pthread_mutex_lock((pthread_mutex_t *)mutex);
2529 02521 <span class="keywordflow">return</span>;
2530 02522
2531 02523 <span class="keywordflow">case</span> <a class="code" href="spf_8h.html#a87a49">SPF_FALSE</a>:
2532 02524 pthread_mutex_unlock((pthread_mutex_t *)mutex);
2533 02525 <span class="keywordflow">return</span>;
2534 02526 }
2535 02527
2536 02528 <span class="preprocessor">#endif </span><span class="comment">/* _WITH_PTHREADS */</span>
2537 02529
2538 02530 <span class="keywordflow">return</span>;
2539 02531 }
2540 02532
2541 02533
2542 02534 <span class="comment">/* end of util.c */</span>
2543 </div></pre><hr size="1"><address style="align: right;"><small>Generated on Thu Sep 16 18:10:47 2004 for libSPF v1.0 by
2544 <a href="http://www.doxygen.org/index.html">
2545 <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.8 </small></address>
2546 </body>
2547 </html>