s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
spfquery.c
Go to the documentation of this file.
1#include <string.h>
2#include <unistd.h>
3#include "buffer.h"
4#include "stralloc.h"
5#include "alloc.h"
6#include "spf.h"
7#include "exit.h"
8#include "dns.h"
9#include "str.h"
10#include "byte.h"
11#include "logmsg.h"
12
13#define WHO "spfquery"
14
15void die(int e,char *s) { buffer_putsflush(buffer_2,s); _exit(e); }
16void die_nomem() { die(111,"fatal: out of memory\n"); }
17
18static stralloc heloin = {0};
19static stralloc mfin = {0};
20static stralloc spflocal = {0};
21static stralloc spfbounce = {0};
22
23int main(int argc,char **argv)
24{
25 stralloc spfip = {0};
26 int flag = 0;
27 int r;
28 int verbose = 0;
29 flagip6 = 1;
30
31 if (argc < 4)
32 logmsg(WHO,100,USAGE,"spfquery <sender-ip> <sender-helo/ehlo> <envelope-from> [<local rules>] [-v(erbose) ]\n");
33
34 if (!stralloc_copys(&spfip,argv[1])) die_nomem();
35 if (!stralloc_0(&spfip)) die_nomem();
36 r = byte_chr(spfip.s,spfip.len,':');
37 if (r < spfip.len) flag = 1;
38
39 if (!stralloc_copys(&heloin,argv[2])) die_nomem();
40 if (!stralloc_0(&heloin)) die_nomem();
41
42 if (!stralloc_copys(&mfin,argv[3])) die_nomem();
43 if (!stralloc_0(&mfin)) die_nomem();
44
45 if (argc > 4) {
46 if (!byte_diff(argv[4],2,"-v")) verbose = 1;
47 else {
48 if (!stralloc_copys(&spflocal,argv[4])) die_nomem();
49 if (spflocal.len && !stralloc_0(&spflocal)) die_nomem();
50 }
51 }
52
53 if (argc > 5) {
54 if (!byte_diff(argv[5],2,"-v")) verbose = 1;
55 }
56
58 if (!stralloc_0(&spfexplain)) die_nomem();
59
61 r = spf_query(spfip.s,heloin.s,mfin.s,"localhost",flag);
62 if (r == SPF_NOMEM) die_nomem();
63
64 buffer_puts(buffer_1,"result=");
65 switch (r) {
66 case SPF_ME: buffer_puts(buffer_1,"loopback"); break;
67 case SPF_OK: buffer_puts(buffer_1,"pass"); break;
68 case SPF_NONE: buffer_puts(buffer_1,"none"); break;
69 case SPF_UNKNOWN: buffer_puts(buffer_1,"unknown"); break;
70 case SPF_NEUTRAL: buffer_puts(buffer_1,"neutral"); break;
71 case SPF_SOFTFAIL: buffer_puts(buffer_1,"softfail"); break;
72 case SPF_FAIL: buffer_puts(buffer_1,"fail"); break;
73 case SPF_ERROR: buffer_puts(buffer_1,"error"); break;
74 case SPF_SYNTAX: buffer_puts(buffer_1,"IP address syntax error"); break;
75 default: buffer_puts(buffer_1,"undefined"); break;
76 }
77
78 buffer_putsflush(buffer_1,"\n");
79 if (r == SPF_SYNTAX) _exit(1);
80
81 if (verbose) {
82 buffer_puts(buffer_1,"SPF records read: \n");
83 buffer_put(buffer_1,spfrecord.s,spfrecord.len);
84 }
85
86 buffer_puts(buffer_1,"SPF information evaluated: ");
87 buffer_put(buffer_1,spfinfo.s,spfinfo.len);
88 buffer_putsflush(buffer_1,"\n");
89
90 if (r == SPF_FAIL) {
91 buffer_puts(buffer_1,"SPF results returned: ");
92 if (!spf_parse(&spfbounce,spfexpmsg.s,expdomain.s)) die_nomem();
93 buffer_put(buffer_1,spfbounce.s,spfbounce.len);
94 buffer_putsflush(buffer_1,"\n");
95 }
96
97 _exit(0);
98}
int main()
Definition: chkshsgr.c:6
int stralloc_copys(stralloc *, char const *)
#define DNS_INIT
Definition: dns.h:12
void _exit()
void die()
Definition: qmail-pop3d.c:24
stralloc spflocal
Definition: spf.c:28
stralloc spfexpmsg
Definition: spf.c:30
stralloc expdomain
Definition: spf.c:31
#define SPF_ME
Definition: spf.h:11
#define SPF_ERROR
Definition: spf.h:16
#define SPF_NEUTRAL
Definition: spf.h:25
#define SPF_OK
Definition: spf.h:22
stralloc spfexplain
Definition: spf.c:23
#define SPF_FAIL
Definition: spf.h:27
#define SPF_DEFEXP
Definition: spf.h:34
#define SPF_SOFTFAIL
Definition: spf.h:26
stralloc spfinfo
Definition: spf.c:17
int spf_parse(stralloc *, char *, char *)
spf_parse parses the substructure of the SPF record and calls spf_macros
Definition: spf.c:461
#define SPF_NOMEM
Definition: spf.h:17
#define SPF_SYNTAX
Definition: spf.h:18
#define SPF_UNKNOWN
Definition: spf.h:24
int spf_query(const char *, const char *, const char *, const char *, const int)
spf_query prepares the SPF TXT record query
Definition: spf.c:58
stralloc spfrecord
Definition: spf.c:18
int flagip6
Definition: spf.c:32
#define SPF_NONE
Definition: spf.h:23
void die_nomem()
Definition: spfquery.c:16
#define WHO
Definition: spfquery.c:13