"Fossies" - the Fresh Open Source Software Archive

Member "libspf2-1.2.10/src/include/spf_record.h" (28 Jan 2012, 7502 Bytes) of package /linux/privat/libspf2-1.2.10.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "spf_record.h" see the Fossies "Dox" file reference documentation.

    1 /* 
    2  * This program is free software; you can redistribute it and/or modify
    3  * it under the terms of either:
    4  * 
    5  *   a) The GNU Lesser General Public License as published by the Free
    6  *      Software Foundation; either version 2.1, or (at your option) any
    7  *      later version,
    8  * 
    9  *   OR
   10  * 
   11  *   b) The two-clause BSD license.
   12  *
   13  * These licenses can be found with the distribution in the file LICENSES
   14  */
   15 
   16 
   17 
   18 
   19 #ifndef INC_SPF_RECORD
   20 #define INC_SPF_RECORD
   21 
   22 typedef struct SPF_record_struct SPF_record_t;
   23 typedef struct SPF_macro_struct SPF_macro_t;
   24 
   25 #include "spf_response.h"
   26 #include "spf_request.h"
   27 #include "spf_server.h"
   28 
   29 /**
   30  * @file
   31  *
   32  * Compiled SPF record
   33  *
   34  * The compiled form of the SPF record is as follows:
   35  *
   36  * * A four byte header which contains the version, and information
   37  *   about the mechanisms and modifiers
   38  *
   39  * * Mechanism information, repeated once for each mechanism
   40  *
   41  *   * A two byte header describing the mechanism
   42  *
   43  *   * Data associated with the mechanism.  This can be of several forms
   44  *
   45  *     * ip4/ip6 have a fixed format data field, cidr length is in
   46  *       the mechanism's parm_len field
   47  *
   48  *     * Mechanisms that allow a macro-string 
   49  *
   50  *       * Optional two byte CIDR length structure.  (Yes, this is at
   51  *         the beginning, rather than at the end.)
   52  *
   53  *       * tokenized data description blocks that can be either:
   54  *
   55  *         * two byte macro variable description
   56  *
   57  *         * two byte string description, followed by the string
   58  *
   59  *   * Modifier information, repeated once for each modifier
   60  *
   61  *     * two byte header describing the modifier
   62  *
   63  *     * name of the modifier
   64  *
   65  *     * tokenized data description blocks that can be either:
   66  *
   67  *         * two byte macro variable description
   68  *
   69  *         * two byte string description, followed by the string
   70  */
   71 
   72 
   73 #define SPF_MAX_STR_LEN     255 /* limits on SPF_data_str_t.len, */
   74                     /* SPF_mod_t.name_len and   */
   75                         /* SPF_mod_t.data_len       */
   76 
   77 #define SPF_MAX_MECH_LEN    511
   78 #define SPF_MAX_MOD_LEN     511
   79 
   80 
   81 
   82 
   83 
   84 
   85 /**
   86  * Tokens and macros to be expanded in SPF_data_str_t in mech/mod
   87  */
   88 #define PARM_LP_FROM     0  /**< l = local-part of envelope-sender */
   89 #define PARM_ENV_FROM    1  /**< s = envelope-sender        */
   90 #define PARM_DP_FROM     2  /**< o = envelope-domain        */
   91 #define PARM_CUR_DOM     3  /**< d = current-domain     */
   92 #define PARM_CLIENT_IP   4  /**< i = SMTP client IP     */
   93 #define PARM_CLIENT_IP_P 5  /**< c = SMTP client IP (pretty)    */
   94 #define PARM_TIME        6  /**< t = time in UTC epoch secs */
   95 #define PARM_CLIENT_DOM  7  /**< p = SMTP client domain name    */
   96 #define PARM_CLIENT_VER  8  /**< v = IP ver str - in-addr/ip6   */
   97 #define PARM_HELO_DOM    9  /**< h = HELO/EHLO domain       */
   98 #define PARM_REC_DOM    10  /**< r = receiving domain       */
   99 #define PARM_CIDR       11  /**< CIDR lengths (IPv4 and v6) */
  100 #define PARM_STRING     12  /**< literal string     */
  101 
  102 
  103 typedef
  104 struct SPF_data_str_struct
  105 {
  106     unsigned char   parm_type;
  107     unsigned char   len;    /* XXX Does this need to be size_t? */
  108     unsigned char   __unused0;
  109     unsigned char   __unused1;
  110     /* text: (char[len]) follows */
  111 } SPF_data_str_t;
  112 
  113 
  114 typedef
  115 struct SPF_data_var_struct
  116 {
  117     unsigned char   parm_type;
  118     unsigned char   num_rhs;        /**< chop subdomain name        */
  119     unsigned short  rev:         1; /**< reverse            */
  120     unsigned short  url_encode:  1; /**< do URL encoding        */
  121     unsigned short  delim_dot:   1; /**< delimiter char: .      */
  122     unsigned short  delim_dash:  1; /**< delimiter char: -      */
  123     unsigned short  delim_plus:  1; /**< delimiter char: +      */
  124     unsigned short  delim_equal: 1; /**< delimiter char: =      */
  125     unsigned short  delim_bar:   1; /**< delimiter char: |      */
  126     unsigned short  delim_under: 1; /**< delimiter char: _      */
  127 } SPF_data_var_t;
  128 
  129 typedef
  130 struct SPF_data_cidr_struct
  131 {
  132     unsigned char   parm_type;
  133     unsigned char   ipv4;
  134     unsigned char   ipv6;
  135     unsigned char   __unused0;
  136     /** If we are the first operand in an IP4 or IP6 instruction then
  137      * addr: (struct in[6]_addr) follows */
  138 } SPF_data_cidr_t;
  139 
  140 typedef
  141 union SPF_data_union
  142 {
  143     SPF_data_var_t  dv;
  144     SPF_data_str_t  ds;
  145     SPF_data_cidr_t dc;
  146 } SPF_data_t;
  147 
  148 
  149 
  150 /**
  151  * Prefixes
  152  */
  153 #define PREFIX_PASS     SPF_RESULT_PASS
  154 #define PREFIX_FAIL     SPF_RESULT_FAIL
  155 #define PREFIX_SOFTFAIL SPF_RESULT_SOFTFAIL
  156 #define PREFIX_NEUTRAL  SPF_RESULT_NEUTRAL
  157 #define PREFIX_UNKNOWN  SPF_RESULT_PERMERROR
  158 
  159 /**
  160  * Mechanisms
  161  */
  162 #define MECH_UNKNOWN    0   /**< Return PERMERROR */
  163 #define MECH_A          1
  164 #define MECH_MX         2
  165 #define MECH_PTR        3
  166 #define MECH_INCLUDE    4
  167 #define MECH_IP4        5
  168 #define MECH_IP6        6
  169 #define MECH_EXISTS     7
  170 #define MECH_ALL        8  
  171 #define MECH_REDIRECT   9
  172 
  173 typedef
  174 struct SPF_mech_struct
  175 {
  176     unsigned char   prefix_type;    /**< PASS/FAIL/... */
  177     unsigned char   mech_type;  /**< A/MX/PTR/... */
  178     unsigned short  mech_len;   /**< bytes of data or cidr len */
  179     /** data: (SPF_data_t[] = char[mech_len]) follows */
  180 } SPF_mech_t;
  181 
  182 
  183 /*
  184  * Modifiers
  185  */
  186 typedef
  187 struct SPF_mod_struct
  188 {
  189     unsigned short  name_len;
  190     unsigned short  data_len;
  191     /** name: (char[name_len]) follows */
  192     /** data: (SPF_data_t[] = char[data_len]) follows */
  193 } SPF_mod_t;
  194 
  195 
  196 
  197 /**
  198  * Compiled SPF records as used internally by libspf2
  199  */
  200 struct SPF_record_struct
  201 {
  202     SPF_server_t    *spf_server;
  203 
  204     /* Header */
  205     unsigned char    version;       /**< SPF spec version number.   */
  206     unsigned char    num_mech;      /**< Number of mechanisms.  */
  207     unsigned char    num_mod;       /**< Number of modifiers.       */
  208     unsigned char    num_dns_mech;  /**< Number of DNS mechanisms.  */
  209 
  210     /* Data */
  211     SPF_mech_t      *mech_first;    /**< Buffer for mechanisms. */
  212     size_t           mech_size;     /**< Malloc'ed size.            */
  213     size_t           mech_len;      /**< Used size (non-network format). */
  214 
  215     SPF_mod_t       *mod_first;     /**< Buffer for modifiers.      */
  216     size_t           mod_size;      /**< Malloc'ed size.            */
  217     size_t           mod_len;       /**< Used size (non-network format). */
  218 };
  219 
  220 struct SPF_macro_struct
  221 {
  222     size_t           macro_len; /**< bytes of data */
  223     /** data: (SPF_data_t[] = char[macro_len]) follows */
  224 };
  225 
  226 
  227 /** In spf_record.c */
  228 SPF_record_t    *SPF_record_new(SPF_server_t *spf_server,
  229             const char *text);
  230 void             SPF_record_free(SPF_record_t *rp);
  231 void             SPF_macro_free(SPF_macro_t *mac);
  232 #if 0   /* static */
  233 SPF_errcode_t    SPF_record_find_mod_data(SPF_server_t *spf_server,
  234             SPF_record_t *spf_record,
  235             const char *mod_name,
  236             SPF_data_t **datap, size_t *datalenp);
  237 #endif
  238 SPF_errcode_t    SPF_record_find_mod_value(SPF_server_t *spf_server,
  239             SPF_request_t *spf_request,
  240             SPF_response_t *spf_response,
  241             SPF_record_t *spf_record,
  242             const char *mod_name,
  243             char **bufp, size_t *buflenp);
  244 
  245 /** In spf_compile.c */
  246 SPF_errcode_t    SPF_record_compile(SPF_server_t *spf_server,
  247             SPF_response_t *spf_response,
  248             SPF_record_t **spf_recordp,
  249             const char *record);
  250 SPF_errcode_t    SPF_record_compile_macro(SPF_server_t *spf_server,
  251             SPF_response_t *spf_response,
  252             SPF_macro_t **spf_macrop,
  253             const char *record);
  254 /** In spf_interpret.c */
  255 SPF_errcode_t    SPF_record_interpret(
  256             SPF_record_t *spf_record,
  257             SPF_request_t *spf_request,
  258             SPF_response_t *spf_response,
  259             int depth);
  260 /** In spf_expand.c */
  261 SPF_errcode_t    SPF_record_expand_data(SPF_server_t *spf_server,
  262             SPF_request_t *spf_request,
  263             SPF_response_t *spf_response,
  264             SPF_data_t *data, size_t data_len,
  265             char **bufp, size_t *buflenp);
  266 /** In spf_print.c */
  267 SPF_errcode_t    SPF_record_print(SPF_record_t *spf_record);
  268 SPF_errcode_t    SPF_record_stringify(SPF_record_t *spf_record,
  269             char **bufp, size_t *buflenp);
  270 
  271 #endif