11 #include "auto_qmail.h"
13 void die_temp() { _exit(111); }
17 substdio_putsflush(subfderr
,"qmail-newu: fatal: unable to chdir\n");
22 substdio_putsflush(subfderr
,"qmail-newu: fatal: out of memory\n");
27 substdio_putsflush(subfderr
,"qmail-newu: fatal: unable to open users/assign\n");
32 substdio_putsflush(subfderr
,"qmail-newu: fatal: unable to read users/assign\n");
37 substdio_putsflush(subfderr
,"qmail-newu: fatal: bad format in users/assign\n");
42 substdio_putsflush(subfderr
,"qmail-newu: fatal: unable to open users/cdb.tmp\n");
47 substdio_putsflush(subfderr
,"qmail-newu: fatal: unable to write users/cdb.tmp\n");
52 substdio_putsflush(subfderr
,"qmail-newu: fatal: unable to move users/cdb.tmp to users/cdb\n");
69 stralloc wildchars
= {0};
77 if (chdir(auto_qmail
) == -1) die_chdir();
79 fd
= open_read("users/assign");
80 if (fd
== -1) die_opena();
82 substdio_fdbuf(&ssin
,read
,fd
,inbuf
,sizeof(inbuf
));
84 fdtemp
= open_trunc("users/cdb.tmp");
85 if (fdtemp
== -1) die_opent();
87 if (cdbmss_start(&cdbmss
,fdtemp
) == -1) die_writet();
89 if (!stralloc_copys(&wildchars
,"")) die_nomem();
92 if (getln(&ssin
,&line
,&match
,'\n') != 0) die_reada();
93 if (line
.len
&& (line
.s
[0] == '.')) break;
94 if (!match
) die_format();
96 if (byte_chr(line
.s
,line
.len
,'\0') < line
.len
) die_format();
97 i
= byte_chr(line
.s
,line
.len
,':');
98 if (i
== line
.len
) die_format();
99 if (i
== 0) die_format();
100 if (!stralloc_copys(&key
,"!")) die_nomem();
101 if (line
.s
[0] == '+') {
102 if (!stralloc_catb(&key
,line
.s
+ 1,i
- 1)) die_nomem();
103 case_lowerb(key
.s
,key
.len
);
105 if (byte_chr(wildchars
.s
,wildchars
.len
,line
.s
[i
- 1]) == wildchars
.len
)
106 if (!stralloc_append(&wildchars
,line
.s
+ i
- 1)) die_nomem();
109 if (!stralloc_catb(&key
,line
.s
+ 1,i
- 1)) die_nomem();
110 if (!stralloc_0(&key
)) die_nomem();
111 case_lowerb(key
.s
,key
.len
);
114 if (!stralloc_copyb(&data
,line
.s
+ i
+ 1,line
.len
- i
- 1)) die_nomem();
117 for (i
= 0;i
< data
.len
;++i
)
118 if (data
.s
[i
] == ':') {
120 if (++numcolons
== 6)
123 if (numcolons
< 6) die_format();
126 if (cdbmss_add(&cdbmss
,key
.s
,key
.len
,data
.s
,data
.len
) == -1) die_writet();
129 if (cdbmss_add(&cdbmss
,"",0,wildchars
.s
,wildchars
.len
) == -1) die_writet();
131 if (cdbmss_finish(&cdbmss
) == -1) die_writet();
132 if (fsync(fdtemp
) == -1) die_writet();
133 if (close(fdtemp
) == -1) die_writet(); /* NFS stupidity */
134 if (rename("users/cdb.tmp","users/cdb") == -1) die_rename();