/* 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of either:
 * 
 *   a) The GNU Lesser General Public License as published by the Free
 *      Software Foundation; either version 2.1, or (at your option) any
 *      later version, 
 * 
 *   OR
 * 
 *   b) The two-clause BSD license.
 *
 * These licenses can be found with the distribution in the file LICENSES
 */

#include "spf_alt/spf_sys_config.h"

#ifdef HAVE_STRING_H
# include <string.h>       /* strstr / strdup */
#else
# ifdef HAVE_STRINGS_H
#  include <strings.h>       /* strstr / strdup */
# endif
#endif


#include "spf_alt/spf.h"
#include "spf_alt/spf_internal.h"




SPF_err_t SPF_find_mod_data( SPF_config_t spfcid, SPF_id_t spfid, const char *mod_name,
		       SPF_data_t **data, size_t *data_len )
{
    SPF_internal_t *spfi = SPF_id2spfi(spfid);
    int		i;
    SPF_mod_t	*mod;
    size_t	name_len = strlen( mod_name );

    /*
     * make sure we were passed valid data to work with
     */
    if ( spfcid == NULL )
	SPF_error( "spfcid is NULL" );

    if ( spfid == NULL )
	SPF_error( "spfid is NULL" );
    

    /*
     * find modifier
     */

    mod = spfi->mod_first;
    for( i = 0; i < spfi->header.num_mod; i++ )
    {
	if ( name_len == mod->name_len
	     && strncmp( SPF_mod_name( mod ), mod_name, mod->name_len ) == 0 )
	{
	    *data = SPF_mod_data( mod );
	    *data_len = mod->data_len;

	    return 0;
	}
    
	mod = SPF_next_mod( mod );
    }
    
    return 1;
}


SPF_err_t SPF_find_mod_value( SPF_config_t spfcid, SPF_id_t spfid,
			SPF_dns_config_t spfdc, const char *mod_name,
			char **buf, size_t *buf_len )
{
    SPF_data_t	*data;
    size_t	data_len;
    SPF_err_t	err;

    /*
     * make sure we were passed valid data to work with
     */
    if ( spfcid == NULL )
	SPF_error( "spfcid is NULL" );

    if ( spfid == NULL )
	SPF_error( "spfid is NULL" );
    
    if ( spfdc == NULL )
	SPF_error( "spfdc is NULL" );


    err = SPF_find_mod_data( spfcid, spfid, mod_name, &data, &data_len );

    if ( err )
	return SPF_E_MOD_NOT_FOUND;

    return SPF_expand( spfcid, spfdc, data, data_len, buf, buf_len );
}


SPF_err_t SPF_find_mod_cidr( SPF_config_t spfcid, SPF_id_t spfid,
			     SPF_dns_config_t spfdc, const char *mod_name,
			     int *ipv4_cidr, int *ipv6_cidr )
{
    SPF_data_t	*data;
    size_t	data_len;
    SPF_err_t	err;

    /*
     * make sure we were passed valid data to work with
     */
    if ( spfcid == NULL )
	SPF_error( "spfcid is NULL" );

    if ( spfid == NULL )
	SPF_error( "spfid is NULL" );
    
    if ( spfdc == NULL )
	SPF_error( "spfdc is NULL" );


    err = SPF_find_mod_data( spfcid, spfid, mod_name, &data, &data_len );

    if ( err )
	return SPF_E_MOD_NOT_FOUND;

    if ( data->dc.parm_type == PARM_CIDR )
    {
	*ipv4_cidr = data->dc.ipv4;
	*ipv6_cidr = data->dc.ipv6;
    } else {
	*ipv4_cidr = 0;
	*ipv6_cidr = 0;
    }
    
    return SPF_E_SUCCESS;
}




syntax highlighted by Code2HTML, v. 0.9.1