s/qmail 4.2.29a
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
15#define WHO "qmail-newu"
16
17int rename(const char *,const char *); // stdio.h
18
20{
21 logmsg(WHO,110,ERROR,"unable to chdir");
22}
24{
25 logmsg(WHO,111,FATAL,"fatal: out of memory");
26}
28{
29 logmsg(WHO,112,ERROR,"unable to open users/assign");
30}
32{
33 logmsg(WHO,110,ERROR,"unable to read users/assign");
34}
36{
37 logmsg(WHO,112,ERROR,"bad format in users/assign");
38}
40{
41 logmsg(WHO,112,ERROR,"unable to open users/assign.cdb.tmp");
42}
44{
45 logmsg(WHO,112,ERROR,"unable to write users/assign.cdb.tmp");
46}
48{
49 logmsg(WHO,112,ERROR,"unable to move users/cdb.tmp to users/assign.cdb");
50}
51
52struct cdb_make cdb;
53stralloc key = {0};
54stralloc data = {0};
55
56char inbuf[1024];
57buffer bi;
58
59int fd;
61
62stralloc line = {0};
64
65stralloc wildchars = {0};
66
67int 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
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}
char auto_qmail[]
int stralloc_copys(stralloc *, char const *)
void _exit()
stralloc key
Definition: qmail-newu.c:53
struct cdb_make cdb
Definition: qmail-newu.c:52
stralloc wildchars
Definition: qmail-newu.c:65
void die_nomem()
Definition: qmail-newu.c:23
void die_format()
Definition: qmail-newu.c:35
char inbuf[1024]
Definition: qmail-newu.c:56
int rename(const char *, const char *)
int fd
Definition: qmail-newu.c:59
void die_writet()
Definition: qmail-newu.c:43
void die_opena()
Definition: qmail-newu.c:27
stralloc data
Definition: qmail-newu.c:54
void die_rename()
Definition: qmail-newu.c:47
void die_opent()
Definition: qmail-newu.c:39
stralloc line
Definition: qmail-newu.c:62
buffer bi
Definition: qmail-newu.c:57
void die_reada()
Definition: qmail-newu.c:31
void die_chdir()
Definition: qmail-newu.c:19
int match
Definition: qmail-newu.c:63
#define WHO
Definition: qmail-newu.c:15
int fdtemp
Definition: qmail-newu.c:60
int main()
Definition: qmail-newu.c:67