s/qmail
4.3.20
Next generation secure email transport
Loading...
Searching...
No Matches
4.3
sqmail-4.3.20
src
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_queue.h
"
18
19
#define OSSIFIED 129600
/* see qmail-send.c */
20
21
stralloc
line
= {0};
22
23
static
void
cleanuppid()
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
47
char
fnbuf
[
FMTQFN
];
48
49
static
void
respond(
char
*s)
50
{
51
if
(buffer_putflush(buffer_1small,s,1) == -1)
_exit
(100);
52
}
53
54
int
main
()
55
{
56
int
i;
57
int
match
;
58
int
cleanuploop;
59
unsigned
long
id
;
60
61
if
(chdir(
auto_queue
) == -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
}
auto_queue.h
auto_queue
char auto_queue[]
datetime_sec
long datetime_sec
Definition:
datetime.h:15
stralloc_copys
int stralloc_copys(stralloc *, char const *)
exit.h
_exit
void _exit(int)
fmtqfn.h
FMTQFN
#define FMTQFN
Definition:
fmtqfn.h:6
match
int match
Definition:
matchup.c:196
now.h
now
datetime_sec now()
Definition:
now.c:5
U
#define U(prefix, flag)
fnbuf
char fnbuf[FMTQFN]
Definition:
qmail-clean.c:47
OSSIFIED
#define OSSIFIED
Definition:
qmail-clean.c:19
line
stralloc line
Definition:
qmail-clean.c:21
main
int main()
Definition:
qmail-clean.c:54
id
unsigned long id
Definition:
qmail-qread.c:53
d
struct del * d[CHANNELS]
Definition:
qmail-send.c:726
Generated on Thu Jan 16 2025 17:42:04 for s/qmail by
1.9.6