libspf2 1.2.11
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
76static 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
84int
85main( 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}
SPF_server_t * SPF_server_new(SPF_server_dnstype_t dnstype, int debug)
Definition spf_server.c:132
@ SPF_DNS_CACHE
Definition spf_server.h:73
void SPF_server_free(SPF_server_t *sp)
Definition spf_server.c:200
#define SPF_LIB_VERSION_PATCH
#define SPF_LIB_VERSION_MINOR
#define SPF_LIB_VERSION_MAJOR
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 ns_t_ptr
Definition spf_dns.h:78
#define NETDB_SUCCESS
Definition spf_dns.h:102
#define ns_t_txt
Definition spf_dns.h:80
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_response_t * SPF_response_new(SPF_request_t *spf_request)
void SPF_response_free(SPF_response_t *rp)
const char * SPF_error_message(SPF_error_t *err)
SPF_error_t * SPF_response_message(SPF_response_t *rp, int idx)
int SPF_response_messages(SPF_response_t *rp)
char SPF_error_errorp(SPF_error_t *err)
SPF_errcode_t
int SPF_response_errors(SPF_response_t *rp)
SPF_errcode_t SPF_record_print(SPF_record_t *spf_record)
Definition spf_print.c:45
SPF_errcode_t SPF_record_compile(SPF_server_t *spf_server, SPF_response_t *spf_response, SPF_record_t **spf_recordp, const char *record)
void SPF_record_free(SPF_record_t *rp)
Definition spf_record.c:63
const char * SPF_strerror(SPF_errcode_t spf_err)
void SPF_get_lib_version(int *major, int *minor, int *patch)
Definition spf_utils.c:41
A testing layer for DNS.
void SPF_dns_rr_free(SPF_dns_rr_t *spfrr)
Definition spf_dns_rr.c:114
#define NULL
SPF_request_t * SPF_request_new(SPF_server_t *spf_server)
Definition spf_request.c:41
void SPF_request_free(SPF_request_t *sr)
Definition spf_request.c:59
void usage(void)
Definition spfd.c:446
int main(int argc, char *argv[])
Definition spftest.c:85
#define TRUE
Definition spftest.c:71
#define SPF_TEST_VERSION
Definition spftest.c:26
SPF_dns_rr_data_t ** rr
Definition spf_dns_rr.h:60
SPF_dns_stat_t herrno
Definition spf_dns_rr.h:66