libspf2  1.2.10
spftest.c
Go to the documentation of this file.
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 /*
20  * NOTE:
21  *
22  * This is just a test bed that can be used while developing the
23  * library. It is not intended to make sense or to be useful.
24  */
25 
26 #define SPF_TEST_VERSION "3.0"
27 
28 
29 /* we include spf_internal.h so us internal config.h */
30 #include "spf_sys_config.h"
31 
32 
33 #ifdef STDC_HEADERS
34 # include <stdio.h>
35 # include <stdlib.h> /* malloc / free */
36 #endif
37 
38 #ifdef HAVE_SYS_TYPES_H
39 #include <sys/types.h> /* types (u_char .. etc..) */
40 #endif
41 
42 #ifdef HAVE_INTTYPES_H
43 #include <inttypes.h>
44 
45 #endif
46 #ifdef HAVE_STRING_H
47 # include <string.h> /* strstr / strdup */
48 #else
49 # ifdef HAVE_STRINGS_H
50 # include <strings.h> /* strstr / strdup */
51 # endif
52 #endif
53 
54 #ifdef HAVE_ARPA_INET_H
55 # include <arpa/inet.h> /* in_addr struct */
56 #endif
57 
58 #ifdef HAVE_NETDB_H
59 # include <netdb.h> /* in_addr struct */
60 #endif
61 
62 
63 
64 #include "spf.h"
65 #include "spf_dns.h"
66 #include "spf_dns_test.h"
67 
68 #include "spf_dns_internal.h" /* we test the lookup functions */
69 
70 
71 #define TRUE 1
72 #define FALSE 0
73 
74 
75 
76 static void usage()
77 {
78  printf( "Usage: spftest [spf \"<spf record>\" | domain <domain name>\n" );
79  printf( " | ip <ip address> | exp \"<explanation string>\"\n" );
80  printf( " | version ]\n" );
81 }
82 
83 
84 int
85 main( int argc, char *argv[] )
86 {
87  SPF_server_t *spf_server = NULL;
88  SPF_request_t *spf_request = NULL;
89  SPF_response_t *spf_response = NULL;
90  SPF_record_t *spf_record = NULL;
91  SPF_error_t *spf_error = NULL;
92 
93  char *spf_rec;
94  SPF_dns_rr_t *dns_rr = NULL;
95 
96  SPF_errcode_t err;
97  int major, minor, patch;
98  int i;
99 
100  spf_server = SPF_server_new(SPF_DNS_CACHE, 2);
101 
102  if ( argc <= 1 ) {
103  usage();
104  err = 1;
105  goto error;
106  }
107 
108  if ( strcmp( argv[1], "version" ) == 0 ) {
109  fprintf( stderr, "spftest version information:\n" );
110  fprintf( stderr, "SPF test system version: %s\n",
112  fprintf( stderr, "Compiled with SPF library version: %d.%d.%d\n",
115  SPF_get_lib_version( &major, &minor, &patch );
116  fprintf( stderr, "Running with SPF library version: %d.%d.%d\n",
117  major, minor, patch );
118  fprintf( stderr, "\n" );
119  err = 0;
120  goto error;
121  }
122 
123  if ( argc <= 2 ) {
124  usage();
125  err = 1;
126  goto error;
127  }
128  else if ( strcmp( argv[1], "spf" ) == 0 )
129  spf_rec = argv[2];
130  else if ( strcmp( argv[1], "domain" ) == 0 )
131  {
132  dns_rr = SPF_dns_lookup( spf_server->resolver, argv[2], ns_t_txt, TRUE );
133 
134  if ( dns_rr->herrno != NETDB_SUCCESS )
135  {
136  printf( "DNS lookup for \"%s\" failed: %d\n",
137  argv[1], dns_rr->herrno );
138  err = 1;
139  goto error;
140  }
141  spf_rec = dns_rr->rr[0]->txt;
142  }
143  else if ( strcmp( argv[1], "ip" ) == 0 )
144  {
145  struct in_addr ipv4;
146  ipv4.s_addr = 0x04030201;
147 
148  dns_rr = SPF_dns_rlookup( spf_server->resolver, ipv4, ns_t_ptr, TRUE );
149 
150  if ( dns_rr->herrno != NETDB_SUCCESS )
151  {
152  printf( "DNS lookup for \"%s\" failed: %d\n",
153  argv[1], dns_rr->herrno );
154  err = 1;
155  goto error;
156  }
157  spf_rec = dns_rr->rr[0]->txt;
158 
159  /* FIXME: do something with the rlookup */
160  err = 1;
161  goto error;
162  }
163  else if ( strcmp( argv[1], "exp" ) == 0 ) {
164  int len;
165  char *p, *s;
166 
167  len = strlen( argv[2] );
168  spf_rec = malloc( len * 2 + sizeof( "v=spf1 exp-text=" ) );
169 
170  strcpy( spf_rec, "v=spf1 exp-text=" );
171 
172  p = spf_rec + sizeof( "v=spf1 exp-text=" ) - 1;
173  s = argv[2];
174 
175  while( *s != '\0' ) {
176  if ( *s == ' ' ) {
177  *p++ = '%';
178  *p++ = '_';
179  }
180  else {
181  *p++ = *s;
182  }
183  s++;
184  }
185  *p = *s;
186 
187  }
188  else {
189  usage();
190  err = 1;
191  goto error;
192  }
193 
194  spf_request = SPF_request_new(spf_server);
195  spf_response = SPF_response_new(spf_request);
196 
197 
198  printf( "SPF record in: %s\n", spf_rec );
199  err = SPF_record_compile(spf_server, spf_response,
200  &spf_record, spf_rec);
201 #if 0
202  printf("Code is %d with %d messages, %d errors\n",
203  err,
204  SPF_response_messages(spf_response),
205  SPF_response_errors(spf_response));
206 #endif
207  if (SPF_response_messages(spf_response) > 0) {
208  for (i = 0; i < SPF_response_messages(spf_response); i++) {
209  spf_error = SPF_response_message(spf_response, i);
210  printf( "%s: %s%s\n",
211  SPF_error_errorp(spf_error) ? "Error" : "Warning",
212  // SPF_error_code(spf_error),
213  // SPF_strerror(SPF_error_code(spf_error)),
214  ((SPF_error_errorp(spf_error) && (!err))
215  ? "[UNRETURNED "
216  : ""),
217  SPF_error_message(spf_error) );
218  }
219  if (SPF_response_errors(spf_response) > 0) {
220  if (spf_record) {
221  SPF_record_free(spf_record);
222  spf_record = NULL;
223  }
224  }
225  }
226  else if ( err ) {
227  printf( "Error: %s (null err_msg)\n", SPF_strerror( err ) );
228  if (spf_record) {
229  SPF_record_free(spf_record);
230  spf_record = NULL;
231  }
232  }
233  else {
234  printf( "no errors\n" );
235  }
236 
237  SPF_record_print( spf_record );
238 
239 #if 0
240  if ( strcmp( argv[1], "exp" ) == 0 )
241  {
242  char *buf = NULL;
243  int buf_len = 0;
244  int err;
245 
246  SPF_set_rec_dom( spfcid, "midwestcs.com" );
247 
248  SPF_set_helo_dom( spfcid, "example.com" );
249  SPF_set_ipv4_str( spfcid, "192.0.2.3" );
250  SPF_set_env_from( spfcid, "strong-bad@email.example.com" );
251 
252  err = SPF_find_mod_value( spfcid, c_results.spfid, spfdcid, "exp-text", &buf, &buf_len );
253  if ( err )
254  printf( "%s\n", SPF_strerror( err ) );
255  else
256  printf( "err=%d buf_len = %d buf=\"%s\"\n", err, buf_len, buf );
257 
258  free( spf_rec );
259  if ( buf ) free( buf );
260  }
261 #endif
262 
263  error:
264  if (spf_response)
265  SPF_response_free(spf_response);
266  if (spf_record)
267  SPF_record_free(spf_record);
268  if (spf_request)
269  SPF_request_free(spf_request);
270  if (dns_rr)
271  SPF_dns_rr_free(dns_rr);
272  if (spf_server)
273  SPF_server_free(spf_server);
274 
275  return err;
276 }
void SPF_get_lib_version(int *major, int *minor, int *patch)
Definition: spf_utils.c:38
SPF_response_t * SPF_response_new(SPF_request_t *spf_request)
Definition: spf_response.c:37
void usage(void)
Definition: spfd.c:445
SPF_errcode_t SPF_record_compile(SPF_server_t *spf_server, SPF_response_t *spf_response, SPF_record_t **spf_recordp, const char *record)
Definition: spf_compile.c:1180
#define SPF_LIB_VERSION_PATCH
char SPF_error_errorp(SPF_error_t *err)
Definition: spf_response.c:326
A testing layer for DNS.
#define SPF_TEST_VERSION
Definition: spftest.c:26
SPF_errcode_t SPF_record_print(SPF_record_t *spf_record)
Definition: spf_print.c:45
size_t len
Definition: memcmp.c:10
int main(int argc, char *argv[])
Definition: spf_example.c:114
SPF_dns_stat_t herrno
Definition: spf_dns_rr.h:66
SPF_errcode_t
Definition: spf_response.h:118
void SPF_server_free(SPF_server_t *sp)
Definition: spf_server.c:200
SPF_dns_rr_data_t ** rr
Definition: spf_dns_rr.h:60
void SPF_response_free(SPF_response_t *rp)
Definition: spf_response.c:53
void SPF_record_free(SPF_record_t *rp)
Definition: spf_record.c:63
#define TRUE
Definition: spftest.c:71
#define NULL
Definition: spf_internal.h:28
SPF_dns_rr_t * SPF_dns_lookup(SPF_dns_server_t *spf_dns_server, const char *domain, ns_type rr_type, int should_cache)
Definition: spf_dns.c:133
SPF_server_t * SPF_server_new(SPF_server_dnstype_t dnstype, int debug)
Definition: spf_server.c:132
const char * SPF_strerror(SPF_errcode_t spf_err)
Definition: spf_strerror.c:33
#define NETDB_SUCCESS
Definition: spf_dns.h:102
SPF_error_t * SPF_response_message(SPF_response_t *rp, int idx)
Definition: spf_response.c:308
#define SPF_LIB_VERSION_MAJOR
void SPF_request_free(SPF_request_t *sr)
Definition: spf_request.c:61
void SPF_dns_rr_free(SPF_dns_rr_t *spfrr)
Definition: spf_dns_rr.c:114
const char * SPF_error_message(SPF_error_t *err)
Definition: spf_response.c:320
SPF_request_t * SPF_request_new(SPF_server_t *spf_server)
Definition: spf_request.c:43
int SPF_response_messages(SPF_response_t *rp)
Definition: spf_response.c:290
SPF_dns_rr_t * SPF_dns_rlookup(SPF_dns_server_t *spf_dns_server, struct in_addr ipv4, ns_type rr_type, int should_cache)
Definition: spf_dns.c:150
#define SPF_LIB_VERSION_MINOR
int SPF_response_errors(SPF_response_t *rp)
Definition: spf_response.c:296