s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
qmail-clean.c
Go to the documentation of this file.
1#include <unistd.h>
2#include <sys/types.h>
3#include <sys/stat.h>
4#include "sig.h"
5#include "now.h"
6#include "str.h"
7#include "direntry.h"
8#include "getln.h"
9#include "stralloc.h"
10#include "buffer.h"
11#include "byte.h"
12#include "scan.h"
13#include "fmt.h"
14#include "exit.h"
15#include "error.h"
16#include "fmtqfn.h"
17#include "auto_qmail.h"
18
19#define OSSIFIED 129600 /* see qmail-send.c */
20
21stralloc line = {0};
22
24{
25 DIR *dir;
26 direntry *d;
27 struct stat st;
28 datetime_sec time;
29
30 time = now();
31 dir = opendir("pid");
32 if (!dir) return;
33
34 while ((d = readdir(dir))) {
35 if (str_equal(d->d_name,".")) continue;
36 if (str_equal(d->d_name,"..")) continue;
37 if (!stralloc_copys(&line,"pid/")) continue;
38 if (!stralloc_cats(&line,d->d_name)) continue;
39 if (!stralloc_0(&line)) continue;
40 if (stat(line.s,&st) == -1) continue;
41 if (time < st.st_atime + OSSIFIED) continue;
42 unlink(line.s);
43 }
44 closedir(dir);
45}
46
48
49void respond(char *s)
50{
51 if (buffer_putflush(buffer_1small,s,1) == -1) _exit(100);
52}
53
54int main()
55{
56 int i;
57 int match;
58 int cleanuploop;
59 unsigned long id;
60
61 if (chdir(auto_qmail) == -1) _exit(110);
62 if (chdir("queue") == -1) _exit(110);
63
64 sig_pipeignore();
65
66 if (!stralloc_ready(&line,200)) _exit(111);
67
68 cleanuploop = 0;
69
70 for (;;) {
71 if (cleanuploop) --cleanuploop; else { cleanuppid(); cleanuploop = 30; }
72 if (getln(buffer_0small,&line,&match,'\0') == -1) break;
73 if (!match) break;
74 if (line.len < 7) { respond("x"); continue; }
75 if (line.len > 100) { respond("x"); continue; }
76 if (line.s[line.len - 1]) { respond("x"); continue; } /* impossible */
77
78 for (i = line.len - 2; i > 4; --i) {
79 if (line.s[i] == '/') break;
80 if ((unsigned char) (line.s[i] - '0') > 9)
81 { respond("x"); continue; }
82 }
83 if (line.s[i] == '/')
84 if (!scan_ulong(line.s + i + 1,&id)) { respond("x"); continue; }
85 if (byte_equal(line.s,5,"foop/")) {
86#define U(prefix,flag) fmtqfn(fnbuf,prefix,id,flag); \
87 if (unlink(fnbuf) == -1) if (errno != ENOENT) { respond("!"); continue; }
88 U("intd/",1)
89 U("mess/",1)
90 respond("+");
91 } else if (byte_equal(line.s,4,"todo/")) {
92 U("intd/",1)
93 U("todo/",1)
94 respond("+");
95 }
96 else
97 respond("x");
98 }
99 _exit(0);
100}
char auto_qmail[]
long datetime_sec
Definition: datetime.h:15
int stralloc_copys(stralloc *, char const *)
void _exit()
#define FMTQFN
Definition: fmtqfn.h:6
int match
Definition: matchup.c:195
datetime_sec now()
Definition: now.c:5
void respond(char *s)
Definition: qmail-clean.c:49
#define U(prefix, flag)
char fnbuf[FMTQFN]
Definition: qmail-clean.c:47
#define OSSIFIED
Definition: qmail-clean.c:19
stralloc line
Definition: qmail-clean.c:21
void cleanuppid()
Definition: qmail-clean.c:23
int main()
Definition: qmail-clean.c:54
unsigned long id
Definition: qmail-qread.c:52
struct del * d[CHANNELS]
Definition: qmail-send.c:720