s/qmail
4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
sqmail-4.2.29a
src
qmail-newu.c
Go to the documentation of this file.
1
#include <unistd.h>
2
#include <sys/stat.h>
3
#include <stdio.h>
// rename
4
#include "stralloc.h"
5
#include "getln.h"
6
#include "buffer.h"
7
#include "cdbmake.h"
8
#include "
exit.h
"
9
#include "open.h"
10
#include "logmsg.h"
11
#include "case.h"
12
#include "byte.h"
13
#include "
auto_qmail.h
"
14
15
#define WHO "qmail-newu"
16
17
int
rename
(
const
char
*,
const
char
*);
// stdio.h
18
19
void
die_chdir
()
20
{
21
logmsg(
WHO
,110,ERROR,
"unable to chdir"
);
22
}
23
void
die_nomem
()
24
{
25
logmsg(
WHO
,111,FATAL,
"fatal: out of memory"
);
26
}
27
void
die_opena
()
28
{
29
logmsg(
WHO
,112,ERROR,
"unable to open users/assign"
);
30
}
31
void
die_reada
()
32
{
33
logmsg(
WHO
,110,ERROR,
"unable to read users/assign"
);
34
}
35
void
die_format
()
36
{
37
logmsg(
WHO
,112,ERROR,
"bad format in users/assign"
);
38
}
39
void
die_opent
()
40
{
41
logmsg(
WHO
,112,ERROR,
"unable to open users/assign.cdb.tmp"
);
42
}
43
void
die_writet
()
44
{
45
logmsg(
WHO
,112,ERROR,
"unable to write users/assign.cdb.tmp"
);
46
}
47
void
die_rename
()
48
{
49
logmsg(
WHO
,112,ERROR,
"unable to move users/cdb.tmp to users/assign.cdb"
);
50
}
51
52
struct
cdb_make
cdb
;
53
stralloc
key
= {0};
54
stralloc
data
= {0};
55
56
char
inbuf
[1024];
57
buffer
bi
;
58
59
int
fd
;
60
int
fdtemp
;
61
62
stralloc
line
= {0};
63
int
match
;
64
65
stralloc
wildchars
= {0};
66
67
int
main
()
68
{
69
int
i;
70
int
numcolons;
71
72
umask(033);
73
if
(chdir(
auto_qmail
) == -1)
die_chdir
();
74
75
fd
= open_read(
"users/assign"
);
76
if
(
fd
== -1)
die_opena
();
77
78
buffer_init(&
bi
,read,
fd
,
inbuf
,
sizeof
(
inbuf
));
79
80
fdtemp
= open_trunc(
"users/assign.cdb.tmp"
);
81
if
(
fdtemp
== -1)
die_opent
();
82
83
if
(cdb_make_start(&
cdb
,
fdtemp
) == -1)
die_writet
();
84
85
if
(!
stralloc_copys
(&
wildchars
,
""
))
die_nomem
();
86
87
for
(;;) {
88
if
(getln(&
bi
,&
line
,&
match
,
'\n'
) != 0)
die_reada
();
89
if
(
line
.len && (
line
.s[0] ==
'.'
))
break
;
90
if
(!
match
)
die_format
();
91
92
if
(byte_chr(
line
.s,
line
.len,
'\0'
) <
line
.len)
die_format
();
93
i = byte_chr(
line
.s,
line
.len,
':'
);
94
if
(i ==
line
.len)
die_format
();
95
if
(i == 0)
die_format
();
96
if
(!
stralloc_copys
(&
key
,
"!"
))
die_nomem
();
97
if
(
line
.s[0] ==
'+'
) {
98
if
(!stralloc_catb(&
key
,
line
.s + 1,i - 1))
die_nomem
();
99
case_lowerb(
key
.s,
key
.len);
100
if
(i >= 2)
101
if
(byte_chr(
wildchars
.s,
wildchars
.len,
line
.s[i - 1]) ==
wildchars
.len)
102
if
(!stralloc_append(&
wildchars
,
line
.s + i - 1))
die_nomem
();
103
}
104
else
{
105
if
(!stralloc_catb(&
key
,
line
.s + 1,i - 1))
die_nomem
();
106
if
(!stralloc_0(&
key
))
die_nomem
();
107
case_lowerb(
key
.s,
key
.len);
108
}
109
110
if
(!stralloc_copyb(&
data
,
line
.s + i + 1,
line
.len - i - 1))
die_nomem
();
111
112
numcolons = 0;
113
for
(i = 0; i <
data
.len; ++i)
114
if
(
data
.s[i] ==
':'
) {
115
data
.s[i] = 0;
116
if
(++numcolons == 6)
break
;
117
}
118
if
(numcolons < 6)
die_format
();
119
data
.len = i;
120
121
if
(cdb_make_add(&
cdb
,
key
.s,
key
.len,
data
.s,
data
.len) == -1)
die_writet
();
122
}
123
124
if
(cdb_make_add(&
cdb
,
""
,0,
wildchars
.s,
wildchars
.len) == -1)
die_writet
();
125
126
if
(cdb_make_finish(&
cdb
) == -1)
die_writet
();
127
if
(fsync(
fdtemp
) == -1)
die_writet
();
128
if
(close(
fdtemp
) == -1)
die_writet
();
/* NFS stupidity */
129
if
(
rename
(
"users/assign.cdb.tmp"
,
"users/assign.cdb"
) == -1)
die_rename
();
130
131
_exit
(0);
132
}
auto_qmail.h
auto_qmail
char auto_qmail[]
stralloc_copys
int stralloc_copys(stralloc *, char const *)
exit.h
_exit
void _exit()
key
stralloc key
Definition:
qmail-newu.c:53
cdb
struct cdb_make cdb
Definition:
qmail-newu.c:52
wildchars
stralloc wildchars
Definition:
qmail-newu.c:65
die_nomem
void die_nomem()
Definition:
qmail-newu.c:23
die_format
void die_format()
Definition:
qmail-newu.c:35
inbuf
char inbuf[1024]
Definition:
qmail-newu.c:56
rename
int rename(const char *, const char *)
fd
int fd
Definition:
qmail-newu.c:59
die_writet
void die_writet()
Definition:
qmail-newu.c:43
die_opena
void die_opena()
Definition:
qmail-newu.c:27
data
stralloc data
Definition:
qmail-newu.c:54
die_rename
void die_rename()
Definition:
qmail-newu.c:47
die_opent
void die_opent()
Definition:
qmail-newu.c:39
line
stralloc line
Definition:
qmail-newu.c:62
bi
buffer bi
Definition:
qmail-newu.c:57
die_reada
void die_reada()
Definition:
qmail-newu.c:31
die_chdir
void die_chdir()
Definition:
qmail-newu.c:19
match
int match
Definition:
qmail-newu.c:63
WHO
#define WHO
Definition:
qmail-newu.c:15
fdtemp
int fdtemp
Definition:
qmail-newu.c:60
main
int main()
Definition:
qmail-newu.c:67
Generated on Thu Feb 29 2024 20:44:53 for s/qmail by
1.9.6