spftest.c

Go to the documentation of this file.
00001 /* 
00002  * This program is free software; you can redistribute it and/or modify
00003  * it under the terms of either:
00004  * 
00005  *   a) The GNU Lesser General Public License as published by the Free
00006  *        Software Foundation; either version 2.1, or (at your option) any
00007  *        later version,
00008  * 
00009  *   OR
00010  * 
00011  *   b) The two-clause BSD license.
00012  *
00013  * These licenses can be found with the distribution in the file LICENSES
00014  */
00015 
00016 
00017 
00018 
00019 /*
00020  * NOTE:
00021  *
00022  * This is just a test bed that can be used while developing the
00023  * library.  It is not intended to make sense or to be useful.
00024  */
00025 
00026 #define SPF_TEST_VERSION  "3.0"
00027 
00028 
00029 /* we include spf_internal.h so us internal config.h */
00030 #include "spf_sys_config.h"
00031 
00032 
00033 #ifdef STDC_HEADERS
00034 # include <stdio.h>
00035 # include <stdlib.h>       /* malloc / free */
00036 #endif
00037 
00038 #ifdef HAVE_SYS_TYPES_H
00039 #include <sys/types.h>  /* types (u_char .. etc..) */
00040 #endif
00041 
00042 #ifdef HAVE_INTTYPES_H
00043 #include <inttypes.h>
00044 
00045 #endif
00046 #ifdef HAVE_STRING_H
00047 # include <string.h>       /* strstr / strdup */
00048 #else
00049 # ifdef HAVE_STRINGS_H
00050 #  include <strings.h>     /* strstr / strdup */
00051 # endif
00052 #endif
00053 
00054 #ifdef HAVE_ARPA_INET_H
00055 # include <arpa/inet.h> /* in_addr struct */
00056 #endif
00057 
00058 #ifdef HAVE_NETDB_H
00059 # include <netdb.h>     /* in_addr struct */
00060 #endif
00061 
00062 
00063 
00064 #include "spf.h"
00065 #include "spf_dns.h"
00066 #include "spf_dns_test.h"
00067 
00068 #include "spf_dns_internal.h"           /* we test the lookup functions         */
00069 
00070 
00071 #define TRUE 1
00072 #define FALSE 0
00073 
00074 
00075 
00076 static void usage()
00077 {
00078         printf( "Usage: spftest [spf \"<spf record>\" | domain <domain name>\n" );
00079         printf( "                | ip <ip address> | exp \"<explanation string>\"\n" );
00080         printf( "                | version ]\n" );
00081 }
00082 
00083 
00084 int
00085 main( int argc, char *argv[] )
00086 {
00087         SPF_server_t            *spf_server = NULL;
00088         SPF_request_t           *spf_request = NULL;
00089         SPF_response_t          *spf_response = NULL;
00090         SPF_record_t            *spf_record = NULL;
00091         SPF_error_t                     *spf_error = NULL;
00092 
00093         char                            *spf_rec;
00094         SPF_dns_rr_t            *dns_rr = NULL;
00095         
00096         SPF_errcode_t            err;
00097         int                                      major, minor, patch;
00098         int                                      i;
00099 
00100         spf_server = SPF_server_new(SPF_DNS_CACHE, 2);
00101 
00102         if ( argc <= 1 ) {
00103                 usage();
00104                 err = 1;
00105                 goto error;
00106         }
00107 
00108         if ( strcmp( argv[1], "version" ) == 0 ) {
00109                 fprintf( stderr, "spftest version information:\n" );
00110                 fprintf( stderr, "SPF test system version: %s\n",
00111                                  SPF_TEST_VERSION );
00112                 fprintf( stderr, "Compiled with SPF library version: %d.%d.%d\n",
00113                                  SPF_LIB_VERSION_MAJOR, SPF_LIB_VERSION_MINOR,
00114                                  SPF_LIB_VERSION_PATCH );
00115                 SPF_get_lib_version( &major, &minor, &patch );
00116                 fprintf( stderr, "Running with SPF library version: %d.%d.%d\n",
00117                                  major, minor, patch );
00118                 fprintf( stderr, "\n" );
00119                 err = 0;
00120                 goto error;
00121         }
00122         
00123         if ( argc <= 2 ) {
00124                 usage();
00125                 err = 1;
00126                 goto error;
00127         }
00128         else if ( strcmp( argv[1], "spf" ) == 0 )
00129                 spf_rec = argv[2];
00130         else if ( strcmp( argv[1], "domain" ) == 0 )
00131         {
00132                 dns_rr = SPF_dns_lookup( spf_server->resolver, argv[2], ns_t_txt, TRUE );
00133         
00134                 if ( dns_rr->herrno != NETDB_SUCCESS )
00135                 {
00136                         printf( "DNS lookup for \"%s\" failed:  %d\n",
00137                                         argv[1], dns_rr->herrno );
00138                         err = 1;
00139                         goto error;
00140                 }
00141                 spf_rec = dns_rr->rr[0]->txt;
00142         }
00143         else if ( strcmp( argv[1], "ip" ) == 0 )
00144         {
00145                 struct in_addr ipv4;
00146                 ipv4.s_addr = 0x04030201;
00147                 
00148                 dns_rr = SPF_dns_rlookup( spf_server->resolver, ipv4, ns_t_ptr, TRUE );
00149         
00150                 if ( dns_rr->herrno != NETDB_SUCCESS )
00151                 {
00152                         printf( "DNS lookup for \"%s\" failed:  %d\n",
00153                                         argv[1], dns_rr->herrno );
00154                         err = 1;
00155                         goto error;
00156                 }
00157                 spf_rec = dns_rr->rr[0]->txt;
00158 
00159                 /* FIXME: do something with the rlookup */
00160                 err = 1;
00161                 goto error;
00162         }
00163         else if ( strcmp( argv[1], "exp" ) == 0 ) {
00164                 int             len;
00165                 char            *p, *s;
00166                 
00167                 len = strlen( argv[2] );
00168                 spf_rec = malloc( len * 2 + sizeof( "v=spf1 exp-text=" ) );
00169                 
00170                 strcpy( spf_rec, "v=spf1 exp-text=" );
00171                 
00172                 p = spf_rec + sizeof( "v=spf1 exp-text=" ) - 1;
00173                 s = argv[2];
00174 
00175                 while( *s != '\0' ) {
00176                         if ( *s == ' ' ) {
00177                                 *p++ = '%';
00178                                 *p++ = '_';
00179                         }
00180                         else {
00181                                 *p++ = *s;
00182                         }
00183                         s++;
00184                 }
00185                 *p = *s;
00186                 
00187         }
00188         else {
00189                 usage();
00190                 err = 1;
00191                 goto error;
00192         }
00193         
00194         spf_request = SPF_request_new(spf_server);
00195         spf_response = SPF_response_new(spf_request);
00196 
00197 
00198         printf( "SPF record in:  %s\n", spf_rec );
00199         err = SPF_record_compile(spf_server, spf_response,
00200                                         &spf_record, spf_rec);
00201 #if 0
00202         printf("Code is %d with %d messages, %d errors\n",
00203                                         err,
00204                                         SPF_response_messages(spf_response),
00205                                         SPF_response_errors(spf_response));
00206 #endif
00207         if (SPF_response_messages(spf_response) > 0) {
00208                 for (i = 0; i < SPF_response_messages(spf_response); i++) {
00209                         spf_error = SPF_response_message(spf_response, i);
00210                         printf( "%s: %s%s\n",
00211                                         SPF_error_errorp(spf_error) ? "Error" : "Warning",
00212                                         // SPF_error_code(spf_error),
00213                                         // SPF_strerror(SPF_error_code(spf_error)),
00214                                         ((SPF_error_errorp(spf_error) && (!err))
00215                                                         ? "[UNRETURNED "
00216                                                         : ""),
00217                                         SPF_error_message(spf_error) );
00218                 }
00219                 if (SPF_response_errors(spf_response) > 0) {
00220                         if (spf_record) {
00221                                 SPF_record_free(spf_record);
00222                                 spf_record = NULL;
00223                         }
00224                 }
00225         }
00226         else if ( err ) {
00227                 printf( "Error: %s (null err_msg)\n", SPF_strerror( err ) );
00228                 if (spf_record) {
00229                         SPF_record_free(spf_record);
00230                         spf_record = NULL;
00231                 }
00232         }
00233         else {
00234                 printf( "no errors\n" );
00235         }
00236 
00237         SPF_record_print( spf_record );
00238 
00239 #if 0
00240         if ( strcmp( argv[1], "exp" ) == 0 )
00241         {
00242                 char            *buf = NULL;
00243                 int             buf_len = 0;
00244                 int             err;
00245                 
00246                 SPF_set_rec_dom( spfcid, "midwestcs.com" );
00247 
00248                 SPF_set_helo_dom( spfcid, "example.com" );
00249                 SPF_set_ipv4_str( spfcid, "192.0.2.3" );
00250                 SPF_set_env_from( spfcid, "strong-bad@email.example.com" );
00251 
00252                 err = SPF_find_mod_value( spfcid, c_results.spfid, spfdcid, "exp-text", &buf, &buf_len );
00253                 if ( err )
00254                         printf( "%s\n", SPF_strerror( err ) );
00255                 else
00256                         printf( "err=%d  buf_len = %d  buf=\"%s\"\n", err, buf_len, buf );
00257 
00258                 free( spf_rec );
00259                 if ( buf ) free( buf );
00260         }
00261 #endif
00262 
00263   error:
00264         if (spf_response)
00265                 SPF_response_free(spf_response);
00266         if (spf_record)
00267                 SPF_record_free(spf_record);
00268         if (spf_request)
00269                 SPF_request_free(spf_request);
00270         if (dns_rr)
00271                 SPF_dns_rr_free(dns_rr);
00272         if (spf_server)
00273                 SPF_server_free(spf_server);
00274 
00275         return err;
00276 }

Generated on Tue Nov 4 13:27:39 2008 for libspf2 by  doxygen 1.5.4