77 const char *event,
int flagmysql,
int forcehash,
const char *tab)
83 unsigned char ch,lcch;
99 case_lowerb(
addr.s + j + 1,
addr.len - j - 1);
101 case_lowerb(lcaddr.s + 1,j - 1);
103 if (forcehash >= 0 && forcehash <= 52) {
104 ch = lcch = (
unsigned char) forcehash;
108 for (j = 0;j <
addr.len;++j) {
109 h = (h + (h << 5)) ^ (uint32) (
unsigned char)
addr.s[j];
110 lch = (lch + (lch << 5)) ^ (uint32) (
unsigned char) lcaddr.s[j];
112 lcch = 64 + (lch % 53);
119 if (!stralloc_copys(&fnlock,dbname))
die_nomem();
121 if (!stralloc_cats(&
fn,
"/subscribers/"))
die_nomem();
126 if (!stralloc_cats(&fnlock,
"/lock"))
die_nomem();
135 fdnew = open_trunc(
fnnew.s);
141 fd = open_read(
fn.s);
143 if (errno != ENOENT) { close(fdnew);
die_read(); }
149 if (getln(&
bi,&line,&
match,
'\0') == -1) {
153 if (line.len ==
addr.len)
154 if (!case_diffb(line.s,line.len,
addr.s)) {
156 if (!flagadd)
continue;
158 if (buffer_put(&
bo,line.s,line.len) == -1) {
166 if (flagadd && !flagwasthere)
171 if (buffer_flush(&
bo) == -1) { close(fdnew);
die_write(); }
172 if (fsync(fdnew) == -1) { close(fdnew);
die_write(); }
178 if ((ch == lcch) || flagwasthere) {
180 if (flagadd ^ flagwasthere) {
192 fn.s[
fn.len - 2] = ch;
194 fdnew = open_trunc(
fnnew.s);
198 fd = open_read(
fn.s);
200 if (errno != ENOENT) { close(fdnew);
die_read(); }
205 if (getln(&
bi,&line,&
match,
'\0') == -1)
208 if (line.len ==
addr.len)
209 if (!case_diffb(line.s,line.len,
addr.s)) {
213 if (buffer_put(&
bo,line.s,line.len) == -1)
220 if (buffer_flush(&
bo) == -1) { close(fdnew);
die_write(); }
221 if (fsync(fdnew) == -1) { close(fdnew);
die_write(); }
228 if (flagadd ^ flagwasthere) {
const char * logmsg(const char *dir, unsigned long num, unsigned long listno, unsigned long subs, int done)
int subscribe(const char *dbname, const char *userhost, int flagadd, const char *comment, const char *event, int flagmysql, int forcehash, const char *tab)