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