26 #ifdef HAVE_INTTYPES_H
33 # ifdef HAVE_STRINGS_H
44 SPF_record_stringify_data(SPF_data_t *data, SPF_data_t *data_end,
45 char **p_p,
char *p_end,
46 int is_mod,
int cidr_ok,
int debug )
52 SPF_data_t *cidr_data;
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",
77 data->ds.parm_type, data);
80 char *s = SPF_data_str( data );
81 char *s_end = s + data->ds.len;
83 SPF_debugf(
" string data: String is [%d] '%*.*s'",
84 data->ds.len, data->ds.len, data->ds.len, s);
86 if (p_end - (p + data->ds.len) <= 0)
98 if (s[0] ==
'2' && s[1] ==
'0') {
115 else if (data->dc.parm_type ==
PARM_CIDR) {
120 len = snprintf( p, p_end - p,
"%%{" );
126 switch( data->dv.parm_type )
178 if ( data->dv.url_encode )
184 if ( data->dv.num_rhs )
186 len = snprintf( p, p_end - p,
"%d", data->dv.num_rhs );
196 if ( data->dv.delim_dot
197 && ( data->dv.delim_dash
198 || data->dv.delim_plus
199 || data->dv.delim_equal
200 || data->dv.delim_bar
201 || data->dv.delim_under
205 if ( data->dv.delim_dash )
207 if ( data->dv.delim_plus )
209 if ( data->dv.delim_equal )
211 if ( data->dv.delim_bar )
213 if ( data->dv.delim_under )
224 if ( cidr_data->dc.ipv4 )
226 len = snprintf( p, p_end - p,
"/%d", cidr_data->dc.ipv4 );
231 if ( cidr_data->dc.ipv6 )
233 len = snprintf( p, p_end - p,
"//%d", cidr_data->dc.ipv6 );
251 SPF_data_t *data, *data_end;
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);
320 switch( mech->prefix_type )
348 SPF_debugf(
"Mechanism type is %d", mech->mech_type);
350 switch( mech->mech_type )
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 ) );
373 if ( mech->mech_len )
374 len = snprintf( p, p_end - p,
"ip4:%s/%d",
375 ip4_buf, mech->mech_len );
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 ) );
385 if ( mech->mech_len )
386 len = snprintf( p, p_end - p,
"ip6:%s/%d",
387 ip6_buf, mech->mech_len );
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)
428 cidr_ok = mech->mech_type ==
MECH_A || mech->mech_type ==
MECH_MX;
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 );