60static const char client_ver_ipv4[] =
"in-addr";
61static const char client_ver_ipv6[] =
"ip6";
82 SPF_request_t *spf_request,
83 SPF_response_t *spf_response,
85 char **bufp,
size_t *buflenp)
89 size_t len, label_len;
93 const char *p_read_end;
99 char *munged_var =
NULL;
100 char *url_var =
NULL;
103 char ip4_buf[ INET_ADDRSTRLEN ];
104 char ip6_buf[ INET6_ADDRSTRLEN ];
106 char ip6_rbuf[
sizeof(
struct in6_addr ) * 4 + 1 ];
108 char time_buf[
sizeof(
"4294967296" ) ];
131 data_end = (
SPF_data_t *)((
char *)data + data_len);
135 fprintf(stderr,
"Pass start compute_length=%d\n", compute_length);
140 for (d = data; d < data_end; d = SPF_data_next(d)) {
142 fprintf(stderr,
" Item type=%d at %p\n", d->
dc.
parm_type, d);
148 if (compute_length) {
153 if (p_end - (p + d->
ds.
len) <= 0)
154 SPF_error(
"Failed to allocate enough memory "
155 "to expand string.");
156 memcpy(p, SPF_data_str(d), d->
ds.
len);
166 var = spf_request->env_from_lp;
170 var = spf_request->env_from;
174 var = spf_request->env_from_dp;
178 var = spf_request->cur_dom;
182 if (compute_length) {
183 len =
sizeof(ip6_rbuf);
189 if (spf_request->client_ver == AF_INET) {
190 p_err = inet_ntop(AF_INET, &spf_request->ipv4,
191 ip4_buf,
sizeof(ip4_buf));
194 else if (spf_request->client_ver == AF_INET6) {
196 p2_end = p2 +
sizeof(ip6_rbuf);
198 for (i = 0; i <
array_elem(spf_request->ipv6.s6_addr); i++) {
199 p2 += snprintf(p2, p2_end - p2,
"%.1x.%.1x.",
200 spf_request->ipv6.s6_addr[i] >> 4,
201 spf_request->ipv6.s6_addr[i] & 0xf);
205 ip6_rbuf[
sizeof(
struct in6_addr) * 4 - 1] =
'\0';
212 if (compute_length) {
213 len =
sizeof(ip6_rbuf);
219 if (spf_request->client_ver == AF_INET) {
220 p_err = inet_ntop(AF_INET, &spf_request->ipv4,
221 ip4_buf,
sizeof(ip4_buf));
224 else if (spf_request->client_ver == AF_INET6) {
225 p_err = inet_ntop(AF_INET6, &spf_request->ipv6,
226 ip6_buf,
sizeof(ip6_buf));
232 if (compute_length) {
233 len =
sizeof(time_buf);
238 snprintf(time_buf,
sizeof(time_buf),
"%ld",
250 if (spf_request->client_ver == AF_INET)
251 var = client_ver_ipv4;
252 else if (spf_request->client_ver == AF_INET6)
253 var = client_ver_ipv6;
257 var = spf_request->helo_dom;
266 fprintf(stderr,
"Invalid variable %d\n", d->
dv.
parm_type);
276 if (compute_length) {
284 munged_var = (
char *)malloc(len + 1);
285 if (munged_var ==
NULL)
287 memset(munged_var, 0, len + 1);
289 p_read_end = var + len;
290 p_write = munged_var;
297 p_read = p_read_end - 1;
299 while ( p_read >= var ) {
300 if ( SPF_delim_valid(d, *p_read) ) {
303 label_len = p_read_end - p_read - 1;
304 memcpy( p_write, p_read + 1, label_len );
305 p_write += label_len;
316 if (p_read_end >= p_read) {
317 label_len = p_read_end - p_read - 1;
318 memcpy( p_write, p_read + 1, label_len );
319 p_write += label_len;
330 while (p_read < p_read_end) {
331 if (SPF_delim_valid(d, *p_read))
334 *p_write++ = *p_read;
347 p_read_end = munged_var + len;
348 p_write = munged_var + len - 1;
350 while (p_write > munged_var) {
359 len = p_read_end - p_write;
360 memmove(munged_var, p_write, len + 1);
369 url_var = malloc(len * 3 + 1);
370 if (url_var ==
NULL) {
380 while ( *p_read !=
'\0' )
382 if ( isalnum( (
unsigned char)( *p_read ) ) )
383 *p_write++ = *p_read++;
397 *p_write++ = *p_read++;
401 snprintf( p_write, 4,
"%%%02x", (
unsigned char) *p_read );
411 len = p_write - url_var;
416 len = snprintf(p, p_end - p,
"%s", var);
418 if (p_end - p <= 0) {
434 fprintf(stderr,
"Pass end compute_length=%d\n", compute_length);
437 if (compute_length) {
444 p_end = *bufp + *buflenp;
#define SPF_ASSERT_NOTNULL(x)
#define SPF_error(errmsg)
SPF_errcode_t SPF_recalloc(char **bufp, size_t *buflenp, size_t buflen) __attribute__((warn_unused_result))
const char * SPF_request_get_client_dom(SPF_request_t *sr)
const char * SPF_request_get_rec_dom(SPF_request_t *sr)
SPF_errcode_t SPF_record_expand_data(SPF_server_t *spf_server, SPF_request_t *spf_request, SPF_response_t *spf_response, SPF_data_t *data, size_t data_len, char **bufp, size_t *buflenp)
unsigned short delim_under
unsigned short delim_dash
unsigned short delim_plus
unsigned short delim_equal
unsigned short url_encode