45 char **p_p,
char *p_end,
46 int is_mod,
int cidr_ok,
int debug )
61 if ( data < data_end && data->dc.parm_type ==
PARM_CIDR )
64 SPF_debugf(
" string data: Found a CIDR at %p", data);
69 data = SPF_data_next( data );
73 for( ; data < data_end; data = SPF_data_next( data ) )
76 SPF_debugf(
" string data: Handling data type %d at %p",
80 char *s = SPF_data_str( data );
81 char *s_end = s + data->
ds.
len;
83 SPF_debugf(
" string data: String is [%d] '%*.*s'",
86 if (p_end - (p + data->
ds.
len) <= 0)
98 if (s[0] ==
'2' && s[1] ==
'0') {
120 len = snprintf( p, p_end - p,
"%%{" );
186 len = snprintf( p, p_end - p,
"%d", data->
dv.
num_rhs );
226 len = snprintf( p, p_end - p,
"/%d", cidr_data->
dc.
ipv4 );
233 len = snprintf( p, p_end - p,
"//%d", cidr_data->
dc.
ipv6 );
257 char ip4_buf[ INET_ADDRSTRLEN ];
258 char ip6_buf[ INET6_ADDRSTRLEN ];
263#define debug spf_record->spf_server->debug
283 + spf_record->mech_len * 4 + spf_record->mod_len * 4
291 p_end = *bufp + *buflenp;
294 SPF_debugf(
"stringify: Buffer length is %lu\n", (
unsigned long)*buflenp);
300 len = snprintf(p, p_end - p,
"v=spf%d", spf_record->version);
310 mech = spf_record->mech_first;
311 for (i = 0; i < spf_record->num_mech; i++) {
313 SPF_debugf(
"stringify: Handling mechanism %d/%d at %p",
314 i, spf_record->num_mech, mech);
353 len = snprintf( p, p_end - p,
"a" );
357 len = snprintf( p, p_end - p,
"mx" );
361 len = snprintf( p, p_end - p,
"ptr" );
365 len = snprintf( p, p_end - p,
"include" );
369 p_err = inet_ntop( AF_INET, SPF_mech_ip4_data( mech ),
370 ip4_buf,
sizeof( ip4_buf ) );
374 len = snprintf( p, p_end - p,
"ip4:%s/%d",
377 len = snprintf( p, p_end - p,
"ip4:%s", ip4_buf );
381 p_err = inet_ntop( AF_INET6, SPF_mech_ip6_data( mech ),
382 ip6_buf,
sizeof( ip6_buf ) );
386 len = snprintf( p, p_end - p,
"ip6:%s/%d",
389 len = snprintf( p, p_end - p,
"ip6:%s", ip6_buf );
393 len = snprintf( p, p_end - p,
"exists" );
397 len = snprintf( p, p_end - p,
"all" );
401 len = snprintf( p, p_end - p,
"redirect" );
412 SPF_debugf(
"stringify: Buffer so far is %s", p);
416 data = SPF_mech_data( mech );
417 data_end = SPF_mech_end_data( mech );
419 if (SPF_mech_data_len(mech) > 0
423 || SPF_data_next( data ) < data_end)
429 err = SPF_record_stringify_data(
438 mech = SPF_mech_next( mech );
446 mod = spf_record->mod_first;
447 for( i = 0; i < spf_record->num_mod; i++ )
450 SPF_debugf(
"stringify: Handling modifier %d/%d at %p",
451 i, spf_record->num_mod, mod);
455 len = snprintf( p, p_end - p,
"%.*s=",
456 mod->
name_len, SPF_mod_name( mod ) );
460 data = SPF_mod_data( mod );
461 data_end = SPF_mod_end_data( mod );
463 err = SPF_record_stringify_data(
472 mod = SPF_mod_next( mod );
#define SPF_ASSERT_NOTNULL(x)
SPF_errcode_t SPF_recalloc(char **bufp, size_t *buflenp, size_t buflen) __attribute__((warn_unused_result))
SPF_errcode_t SPF_record_stringify(SPF_record_t *spf_record, 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
unsigned char prefix_type