mess822x 1.23
mess822x
Loading...
Searching...
No Matches
ifvalidto.c
Go to the documentation of this file.
1#include "buffer.h"
2#include "getln.h"
3#include "mess822.h"
4#include "case.h"
5#include "env.h"
6#include "exit.h"
7#include "logmsg.h"
8
9#define WHO "ifvalidto"
10
11static void nomem()
12{
13 logmsg(WHO,111,FATAL,"out of memory");
14}
15
16stralloc addrlist = {0};
17
20 { "to", 0, 0, 0, &addrlist, 0, 0 }
21, { "cc", 0, 0, 0, &addrlist, 0, 0 }
22, { 0, 0, 0, 0, 0, 0, 0 }
23} ;
24
25stralloc line = {0};
27
28char *recipient = 0;
29char **recips = {0};
30
31static void check(char *addr)
32{
33 if (recipient) {
34 if (case_equals(addr,recipient)) _exit(0);
35 } else
36 for (int i = 0; recips[i]; ++i) {
37 recipient = recips[i];
38 if (case_equals(addr,recipient)) _exit(0);
39 }
40}
41
42int main(int argc,char **argv)
43{
44 int i;
45 int j;
46
47 if (argc) recips = argv + 1;
48 else recipient = env_get("RECIPIENT");
49
50 if (!mess822_begin(&h,a)) nomem();
51
52 for (;;) {
53 if (getln(buffer_0,&line,&match,'\n') == -1)
54 logmsg(WHO,111,FATAL,"unable to read input: ");
55
56 if (!mess822_ok(&line)) break;
57 if (!mess822_line(&h,&line)) nomem();
58 if (!match) break;
59 }
60
61 if (!mess822_end(&h)) nomem();
62
63 for (j = i = 0; j < addrlist.len; ++j)
64 if (!addrlist.s[j]) {
65 if (addrlist.s[i] == '+')
66 check(addrlist.s + i + 1);
67 i = j + 1;
68 }
69
70 logmsg(WHO,100,WARN,B("mail to local: <",recipient,"> discarded for delivery"));
71 _exit(100);
72}
int main()
Definition: 822print.c:351
char ** recips
Definition: ifvalidto.c:29
mess822_action a[]
Definition: ifvalidto.c:19
mess822_header h
Definition: ifvalidto.c:18
stralloc line
Definition: ifvalidto.c:25
int match
Definition: ifvalidto.c:26
stralloc addrlist
Definition: ifvalidto.c:16
#define WHO
Definition: ifvalidto.c:9
char * recipient
Definition: ifvalidto.c:28
int mess822_line(mess822_header *, stralloc *)
Definition: mess822_line.c:107
int mess822_end(mess822_header *)
Definition: mess822_line.c:26
int mess822_ok(stralloc *)
Definition: mess822_ok.c:4
#define MESS822_HEADER
Definition: mess822.h:48
int mess822_begin(mess822_header *, mess822_action *)
Definition: mess822_line.c:5