s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
maildirwatch.c
Go to the documentation of this file.
1#include <unistd.h>
2#include "getln.h"
3#include "buffer.h"
4#include "prioq.h"
5#include "stralloc.h"
6#include "str.h"
7#include "exit.h"
8#include "hfield.h"
9#include "logmsg.h"
10#include "open.h"
11#include "headerbody.h"
12#include "maildir.h"
13
14#define WHO "maildirwatch"
15
16void die_nomem() { logmsg(WHO,111,FATAL,"out of memory"); }
17
18stralloc recipient = {0};
19stralloc sender = {0};
20stralloc fromline = {0};
21stralloc text = {0};
22
23void addtext(char *s, int n)
24{
25 if (!stralloc_catb(&text,s,n)) die_nomem();
26 if (text.len > 158) text.len = 158;
27}
28
29void dobody(stralloc *h) { addtext(h->s,h->len); }
30
31void doheader(stralloc *h)
32{
33 int i;
34 switch (hfield_known(h->s,h->len)) {
35 case H_SUBJECT:
36 i = hfield_skipname(h->s,h->len);
37 addtext(h->s + i,h->len - i);
38 break;
39 case H_DELIVEREDTO:
40 i = hfield_skipname(h->s,h->len);
41 if (i < h->len)
42 if (!stralloc_copyb(&recipient,h->s + i,h->len - i - 1)) die_nomem();
43 break;
44 case H_RETURNPATH:
45 i = hfield_skipname(h->s,h->len);
46 if (i < h->len)
47 if (!stralloc_copyb(&sender,h->s + i,h->len - i - 1)) die_nomem();
48 break;
49 case H_FROM:
50 if (!stralloc_copyb(&fromline,h->s,h->len - 1)) die_nomem();
51 break;
52 }
53}
54void finishheader() { ; }
55
56stralloc filenames = {0};
57prioq pq = {0};
58
59char inbuf[BUFFER_INSIZE];
60buffer bi;
61
62int main()
63{
64 struct prioq_elt pe;
65 int fd;
66 int i;
67
68 if (maildir_chdir() == -1)
69 logmsg(WHO,111,FATAL,"Can't change to maildir");
70
71 for (;;) {
73 if (maildir_scan(&pq,&filenames,1,0) == -1)
74 logmsg(WHO,111,FATAL,"Can't read maildir");
75
76 buffer_putsflush(buffer_1,"\033[;H\033[;J");
77
78 while (prioq_min(&pq,&pe)) {
80
81 fd = open_read(filenames.s + pe.id);
82 if (fd == -1) continue;
83 buffer_init(&bi,read,fd,inbuf,sizeof(inbuf));
84
85 if (!stralloc_copys(&sender,"?")) die_nomem();
88 if (!stralloc_copys(&text,"")) die_nomem();
90 logmsg(WHO,111,FATAL,"trouble reading new message");
91
92 for (i = 0; i < fromline.len; ++i)
93 if ((fromline.s[i] < 32) || (fromline.s[i] > 126))
94 fromline.s[i] = '/';
95 for (i = 0; i < sender.len; ++i)
96 if ((sender.s[i] < 32) || (sender.s[i] > 126))
97 sender.s[i] = '?';
98 for (i = 0; i < recipient.len; ++i)
99 if ((recipient.s[i] < 32) || (recipient.s[i] > 126))
100 recipient.s[i] = '?';
101 for (i = 0; i < text.len; ++i)
102 if ((text.s[i] < 32) || (text.s[i] > 126))
103 text.s[i] = '/';
104 buffer_puts(buffer_1,"FROM ");
105 buffer_put(buffer_1,sender.s,sender.len);
106 buffer_puts(buffer_1," TO <");
107 buffer_put(buffer_1,recipient.s,recipient.len);
108 buffer_puts(buffer_1,">\n");
109 if (fromline.len) {
110 buffer_puts(buffer_1,"\033[1m");
111 buffer_put(buffer_1,fromline.s,fromline.len);
112 buffer_puts(buffer_1,"\033[0m\n");
113 }
114 buffer_put(buffer_1,text.s,text.len);
115 buffer_puts(buffer_1,"\n\n");
116
117 close(fd);
118 }
119
120 buffer_flush(buffer_1);
121 sleep(30);
122 }
123}
int stralloc_copys(stralloc *, char const *)
int headerbody()
int hfield_known()
#define H_RETURNPATH
Definition: hfield.h:29
#define H_SUBJECT
Definition: hfield.h:16
unsigned int hfield_skipname()
#define H_DELIVEREDTO
Definition: hfield.h:30
#define H_FROM
Definition: hfield.h:9
void h(char *, int, int, int)
Definition: install.c:15
int maildir_chdir(void)
Definition: maildir.c:16
int maildir_scan(prioq *, stralloc *, int, int)
Definition: maildir.c:83
void maildir_clean(stralloc *)
Definition: maildir.c:27
stralloc filenames
Definition: maildirwatch.c:56
void die_nomem()
Definition: maildirwatch.c:16
char inbuf[BUFFER_INSIZE]
Definition: maildirwatch.c:59
void dobody(stralloc *h)
Definition: maildirwatch.c:29
stralloc sender
Definition: maildirwatch.c:19
stralloc recipient
Definition: maildirwatch.c:18
stralloc text
Definition: maildirwatch.c:21
prioq pq
Definition: maildirwatch.c:57
buffer bi
Definition: maildirwatch.c:60
stralloc fromline
Definition: maildirwatch.c:20
#define WHO
Definition: maildirwatch.c:14
int main()
Definition: maildirwatch.c:62
void addtext(char *s, int n)
Definition: maildirwatch.c:23
void doheader(stralloc *h)
Definition: maildirwatch.c:31
void finishheader()
Definition: maildirwatch.c:54
void prioq_delmin()
int prioq_min()
int fd
Definition: prioq.h:7
unsigned long id
Definition: prioq.h:7